diff --git a/include/swift/APIDigester/ModuleAnalyzerNodes.h b/include/swift/APIDigester/ModuleAnalyzerNodes.h index d1a6ff350cd5a..ea957f660643b 100644 --- a/include/swift/APIDigester/ModuleAnalyzerNodes.h +++ b/include/swift/APIDigester/ModuleAnalyzerNodes.h @@ -438,7 +438,7 @@ class SDKNodeRoot: public SDKNode { uint8_t JsonFormatVer; public: SDKNodeRoot(SDKNodeInitInfo Info); - static SDKNode *getInstance(SDKContext &Ctx); + static SDKNode *getInstance(SDKContext &Ctx, ArrayRef modules); static bool classof(const SDKNode *N); void registerDescendant(SDKNode *D); virtual void jsonize(json::Output &Out) override; @@ -777,8 +777,7 @@ class SwiftDeclCollector: public VisibleDeclConsumer { void visitAllRoots(SDKNodeVisitor &Visitor) { SDKNode::preorderVisit(RootNode, Visitor); } - SwiftDeclCollector(SDKContext &Ctx) : Ctx(Ctx), - RootNode(SDKNodeRoot::getInstance(Ctx)) {} + SwiftDeclCollector(SDKContext &Ctx, ArrayRef modules = {}); // Construct all roots vector from a given file where a forest was // previously dumped. @@ -818,8 +817,6 @@ class SwiftDeclCollector: public VisibleDeclConsumer { void foundDecl(ValueDecl *VD, DeclVisibilityKind Reason, DynamicLookupInfo dynamicLookupInfo = {}) override; void processDecl(Decl *D); -public: - void lookupVisibleDecls(ArrayRef Modules); }; void detectRename(SDKNode *L, SDKNode *R); diff --git a/lib/APIDigester/ModuleAnalyzerNodes.cpp b/lib/APIDigester/ModuleAnalyzerNodes.cpp index a8dd28705026e..d41031ff6727d 100644 --- a/lib/APIDigester/ModuleAnalyzerNodes.cpp +++ b/lib/APIDigester/ModuleAnalyzerNodes.cpp @@ -428,10 +428,17 @@ StringRef SDKNodeType::getTypeRoleDescription() const { llvm_unreachable("Unhandled SDKNodeKind in switch"); } -SDKNode *SDKNodeRoot::getInstance(SDKContext &Ctx) { +SDKNode *SDKNodeRoot::getInstance(SDKContext &Ctx, ArrayRef modules) { SDKNodeInitInfo Info(Ctx); - Info.Name = Ctx.buffer("TopLevel"); - Info.PrintedName = Ctx.buffer("TopLevel"); + StringRef name = Ctx.buffer("NO_MODULE"); + if (modules.size() == 1) { + // use the module name + name = Ctx.buffer(modules[0]->getName().str()); + } else if (!modules.empty()) { + name = Ctx.buffer("MULTI_MODULES"); + } + Info.Name = name; + Info.PrintedName = name; llvm::transform(Ctx.getOpts().ToolArgs, std::back_inserter(Info.ToolArgs), [&](std::string s) { return Ctx.buffer(s); }); Info.JsonFormatVer = DIGESTER_JSON_VERSION; @@ -1976,8 +1983,13 @@ void SwiftDeclCollector::printTopLevelNames() { llvm::outs() << Node->getKind() << ": " << Node->getName() << '\n'; } } - -void SwiftDeclCollector::lookupVisibleDecls(ArrayRef Modules) { +SwiftDeclCollector::SwiftDeclCollector(SDKContext &Ctx, + ArrayRef Modules) : Ctx(Ctx), + RootNode(SDKNodeRoot::getInstance(Ctx, Modules)) { + if (Modules.empty()) { + return; + } + assert(!Modules.empty()); for (auto M: Modules) { llvm::SmallVector Decls; swift::getTopLevelDeclsForDisplay(M, Decls); @@ -2544,8 +2556,7 @@ swift::ide::api::getSDKNodeRoot(SDKContext &SDKCtx, if (Opts.Verbose) llvm::errs() << "Scanning symbols...\n"; - SwiftDeclCollector Collector(SDKCtx); - Collector.lookupVisibleDecls(Modules); + SwiftDeclCollector Collector(SDKCtx, Modules); return Collector.getSDKRoot(); } @@ -2603,7 +2614,11 @@ void swift::ide::api::dumpModuleContent(ModuleDecl *MD, llvm::raw_ostream &os, opts.SkipRemoveDeprecatedCheck = false; opts.Verbose = false; SDKContext ctx(opts); - SwiftDeclCollector collector(ctx); + llvm::SmallVector modules; + if (!Empty) { + modules.push_back(MD); + } + SwiftDeclCollector collector(ctx, modules); ConstExtractor extractor(ctx, MD->getASTContext()); PayLoad payload; SWIFT_DEFER { @@ -2613,7 +2628,6 @@ void swift::ide::api::dumpModuleContent(ModuleDecl *MD, llvm::raw_ostream &os, if (Empty) { return; } - collector.lookupVisibleDecls({MD}); extractor.extract(MD); } diff --git a/test/ModuleInterface/emit-abi-descriptor.swift b/test/ModuleInterface/emit-abi-descriptor.swift index e0ae9234afad2..ee95863e8e173 100644 --- a/test/ModuleInterface/emit-abi-descriptor.swift +++ b/test/ModuleInterface/emit-abi-descriptor.swift @@ -26,6 +26,6 @@ // RUN: %FileCheck %s < %t/Foo-c.json // CHECK: "kind": "Root" -// CHECK-NEXT: "name": "TopLevel" -// CHECK-NEXT: "printedName": "TopLevel" +// CHECK-NEXT: "name": +// CHECK-NEXT: "printedName": // CHECK: "kind": "Function" diff --git a/test/api-digester/Outputs/cake-abi.json b/test/api-digester/Outputs/cake-abi.json index 0bd599f623556..a8f4abf93f488 100644 --- a/test/api-digester/Outputs/cake-abi.json +++ b/test/api-digester/Outputs/cake-abi.json @@ -1,8 +1,8 @@ { "ABIRoot": { "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", + "name": "cake", + "printedName": "cake", "children": [ { "kind": "Import", diff --git a/test/api-digester/Outputs/cake.json b/test/api-digester/Outputs/cake.json index f27215a8aa763..265edd8c196e8 100644 --- a/test/api-digester/Outputs/cake.json +++ b/test/api-digester/Outputs/cake.json @@ -1,8 +1,8 @@ { "ABIRoot": { "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", + "name": "cake", + "printedName": "cake", "children": [ { "kind": "Import", diff --git a/test/api-digester/Outputs/empty-baseline.json b/test/api-digester/Outputs/empty-baseline.json index d37540321c3bc..df9e2349886fe 100644 --- a/test/api-digester/Outputs/empty-baseline.json +++ b/test/api-digester/Outputs/empty-baseline.json @@ -1,8 +1,8 @@ { "ABIRoot": { "kind": "Root", - "name": "TopLevel", - "printedName": "TopLevel", + "name": "NO_MODULE", + "printedName": "NO_MODULE", "json_format_version": 8 } } \ No newline at end of file