Skip to content

Commit 17e4942

Browse files
authored
[libIDE] Refactor type-interface APIs. (#3537)
1 parent 1840690 commit 17e4942

File tree

5 files changed

+51
-46
lines changed

5 files changed

+51
-46
lines changed

include/swift/AST/ASTPrinter.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,8 +258,6 @@ class ASTPrinter {
258258
/// To sanitize a malformed utf8 string to a well-formed one.
259259
static std::string sanitizeUtf8(StringRef Text);
260260
static ValueDecl* findConformancesWithDocComment(ValueDecl *VD);
261-
static bool printTypeInterface(Type Ty, DeclContext *DC, std::string &Result);
262-
static bool printTypeInterface(Type Ty, DeclContext *DC, llvm::raw_ostream &Out);
263261

264262
private:
265263
virtual void anchor();

include/swift/IDE/ModuleInterfacePrinting.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class ASTContext;
2323
class ASTPrinter;
2424
class ModuleDecl;
2525
class SourceFile;
26+
class Type;
2627
struct PrintOptions;
2728

2829
namespace ide {
@@ -46,6 +47,12 @@ ArrayRef<StringRef> collectModuleGroups(ModuleDecl *M,
4647
Optional<StringRef>
4748
findGroupNameForUSR(ModuleDecl *M, StringRef USR);
4849

50+
bool printTypeInterface(ModuleDecl *M, Type Ty, ASTPrinter &Printer,
51+
std::string &Error);
52+
53+
bool printTypeInterface(ModuleDecl *M, StringRef TypeUSR, ASTPrinter &Printer,
54+
std::string &Error);
55+
4956
void printModuleInterface(ModuleDecl *M, Optional<StringRef> Group,
5057
ModuleTraversalOptions TraversalOptions,
5158
ASTPrinter &Printer, const PrintOptions &Options,

lib/AST/ASTPrinter.cpp

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ using namespace swift;
5353
namespace swift {
5454

5555
std::unique_ptr<llvm::DenseMap<StringRef, Type>>
56-
collectNameTypeMap(Type Ty, const DeclContext *DC) {
56+
collectNameTypeMap(Type Ty) {
5757
std::unique_ptr<llvm::DenseMap<StringRef, Type>> IdMap(
5858
new llvm::DenseMap<StringRef, Type>());
5959
Type BaseTy = Ty->getRValueType();
@@ -89,8 +89,8 @@ class PrinterArchetypeNameTransformer : public PrinterArchetypeTransformer{
8989
std::unique_ptr<llvm::DenseMap<StringRef, Type>> IdMap;
9090

9191
public:
92-
PrinterArchetypeNameTransformer(Type Ty, const DeclContext *DC) :
93-
BaseTy(Ty->getRValueType()), IdMap(collectNameTypeMap(Ty, DC)){}
92+
PrinterArchetypeNameTransformer(Type Ty) :
93+
BaseTy(Ty->getRValueType()), IdMap(collectNameTypeMap(Ty)){}
9494

9595
StringRef transform(StringRef TypeName) override {
9696
return TypeName;
@@ -174,7 +174,7 @@ class ArchetypeSelfTransformer : public PrinterArchetypeTransformer {
174174

175175
ArchetypeSelfTransformer(Type BaseTy, DeclContext &DC):
176176
BaseTy(BaseTy->getRValueType()), DC(DC), Ctx(DC.getASTContext()),
177-
NameTransformer(new PrinterArchetypeNameTransformer(BaseTy, &DC)){}
177+
NameTransformer(new PrinterArchetypeNameTransformer(BaseTy)){}
178178

179179
Type transform(Type Ty) override {
180180
return Ty.transform(F);
@@ -660,6 +660,10 @@ PrintOptions PrintOptions::printTypeInterface(Type T, DeclContext *DC) {
660660
result.PrintExtensionFromConformingProtocols = true;
661661
result.TransformContext = std::make_shared<ArchetypeTransformContext>(
662662
new ArchetypeSelfTransformer(T, *DC), T);
663+
result.printExtensionContentAsMembers = [T](const ExtensionDecl *ED) {
664+
return isExtensionApplied(*T->getNominalOrBoundGenericNominal()->
665+
getDeclContext(), T, ED);
666+
};
663667
return result;
664668
}
665669

@@ -797,29 +801,6 @@ ValueDecl* ASTPrinter::findConformancesWithDocComment(ValueDecl *VD) {
797801
return nullptr;
798802
}
799803

800-
bool ASTPrinter::printTypeInterface(Type Ty, DeclContext *DC,
801-
llvm::raw_ostream &OS) {
802-
if (!Ty)
803-
return false;
804-
Ty = Ty->getRValueType();
805-
PrintOptions Options = PrintOptions::printTypeInterface(Ty.getPointer(), DC);
806-
if (auto ND = Ty->getNominalOrBoundGenericNominal()) {
807-
Options.printExtensionContentAsMembers = [&](const ExtensionDecl *ED) {
808-
return isExtensionApplied(*ND->getDeclContext(), Ty, ED);
809-
};
810-
ND->print(OS, Options);
811-
return true;
812-
}
813-
return false;
814-
}
815-
816-
bool ASTPrinter::printTypeInterface(Type Ty, DeclContext *DC, std::string &Buffer) {
817-
llvm::raw_string_ostream OS(Buffer);
818-
auto Result = printTypeInterface(Ty, DC, OS);
819-
OS.str();
820-
return Result;
821-
}
822-
823804
void ASTPrinter::anchor() {}
824805

825806
void ASTPrinter::printIndent() {

lib/IDE/ModuleInterfacePrinting.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,29 @@ getUnderlyingClangModuleForImport(ImportDecl *Import) {
147147
return nullptr;
148148
}
149149

150+
bool swift::ide::
151+
printTypeInterface(ModuleDecl *M, Type Ty, ASTPrinter &Printer,
152+
std::string &Error) {
153+
if (!Ty)
154+
return false;
155+
Ty = Ty->getRValueType();
156+
if (auto ND = Ty->getNominalOrBoundGenericNominal()) {
157+
PrintOptions Options = PrintOptions::printTypeInterface(Ty.getPointer(), M);
158+
ND->print(Printer, Options);
159+
return true;
160+
}
161+
Error = "cannot find declaration of type.";
162+
return false;
163+
}
164+
165+
bool swift::ide::
166+
printTypeInterface(ModuleDecl *M, StringRef TypeUSR, ASTPrinter &Printer,
167+
std::string &Error) {
168+
return printTypeInterface(M, getTypeFromMangledSymbolname(M->getASTContext(),
169+
TypeUSR, Error),
170+
Printer, Error);
171+
}
172+
150173
void swift::ide::printModuleInterface(Module *M, Optional<StringRef> Group,
151174
ModuleTraversalOptions TraversalOptions,
152175
ASTPrinter &Printer,

tools/swift-ide-test/swift-ide-test.cpp

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2365,8 +2365,12 @@ static int doPrintTypeInterface(const CompilerInvocation &InitInvok,
23652365
llvm::errs() << "Cannot get type of the sema token.\n";
23662366
return 1;
23672367
}
2368-
ASTPrinter::printTypeInterface(SemaT.Ty, SemaT.DC, llvm::outs());
2369-
return 0;
2368+
StreamPrinter Printer(llvm::outs());
2369+
std::string Error;
2370+
if (printTypeInterface(SemaT.DC->getParentModule(), SemaT.Ty, Printer, Error))
2371+
return 0;
2372+
llvm::errs() << Error;
2373+
return 1;
23702374
}
23712375

23722376
static int doPrintTypeInterfaceForTypeUsr(const CompilerInvocation &InitInvok,
@@ -2378,22 +2382,14 @@ static int doPrintTypeInterfaceForTypeUsr(const CompilerInvocation &InitInvok,
23782382
if (CI.setup(Invocation))
23792383
return 1;
23802384
CI.performSema();
2381-
SourceFile *SF = nullptr;
2382-
for (auto Unit : CI.getMainModule()->getFiles()) {
2383-
SF = dyn_cast<SourceFile>(Unit);
2384-
if (SF)
2385-
break;
2386-
}
2387-
assert(SF && "no source file?");
2385+
DeclContext *DC = CI.getMainModule()->getModuleContext();
2386+
assert(DC && "no decl context?");
2387+
StreamPrinter Printer(llvm::outs());
23882388
std::string Error;
2389-
Type ReconstructedType = getTypeFromMangledSymbolname(SF->getASTContext(),
2390-
Usr, Error);
2391-
if (!Error.empty()) {
2392-
llvm::errs() << Error << '\n';
2393-
return 1;
2394-
}
2395-
ASTPrinter::printTypeInterface(ReconstructedType, SF, llvm::outs());
2396-
return 0;
2389+
if (printTypeInterface(DC->getParentModule(), Usr, Printer, Error))
2390+
return 0;
2391+
llvm::errs() << Error;
2392+
return 1;
23972393
}
23982394

23992395
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)