mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 18:01:07 +01:00
Only export each class or namespace to C++ once. (#7042)
Instead of exporting a class or namespace each time a new C++ name lookup discovers it, track that we have exported the entity on its name scope, and if a new name lookup finds the same entity, produce the same clang declaration.
This commit is contained in:
@@ -11,11 +11,29 @@
|
||||
|
||||
namespace Carbon::Check {
|
||||
|
||||
// Exports a Carbon name scope into C++ as a namespace or class, or returns the
|
||||
// C++ namespace or class declaration that it was imported from.
|
||||
//
|
||||
// If the name scope has already been exported, returns the existing context.
|
||||
// Otherwise, creates a new C++ declaration context and returns it. Returns
|
||||
// nullptr if the name scope could not be exported and an error was diagnosed.
|
||||
auto ExportNameScopeToCpp(Context& context, SemIR::LocId loc_id,
|
||||
SemIR::NameScopeId name_scope_id)
|
||||
-> clang::DeclContext*;
|
||||
|
||||
// Exports a Carbon class into C++ as a class, or returns the C++ tag type that
|
||||
// the class was imported from.
|
||||
//
|
||||
// If the class has already been exported, returns the existing C++ class.
|
||||
// Otherwise, creates a new C++ class and returns it. Returns nullptr if the
|
||||
// class could not be exported and an error was diagnosed.
|
||||
auto ExportClassToCpp(Context& context, SemIR::LocId loc_id,
|
||||
SemIR::InstId class_inst_id, SemIR::ClassType class_type)
|
||||
-> clang::TagDecl*;
|
||||
|
||||
// Get a `clang::FunctionDecl` that can be used to call a Carbon function.
|
||||
auto GetReverseInteropFunctionDecl(Context& context, SemIR::LocId loc_id,
|
||||
clang::DeclContext& decl_context,
|
||||
SemIR::FunctionId function_id)
|
||||
-> clang::FunctionDecl*;
|
||||
auto ExportFunctionToCpp(Context& context, SemIR::LocId loc_id,
|
||||
SemIR::FunctionId function_id) -> clang::FunctionDecl*;
|
||||
|
||||
} // namespace Carbon::Check
|
||||
|
||||
|
||||
Reference in New Issue
Block a user