Skip to content

Commit 8cfefd3

Browse files
authored
[libide] Finish related lib-ide work on generating type-interface, rdar://27306890. (#3501)
1 parent 787b0dc commit 8cfefd3

File tree

8 files changed

+99
-30
lines changed

8 files changed

+99
-30
lines changed

include/swift/AST/PrintOptions.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,9 @@ struct PrintOptions {
263263
/// Whether to use an empty line to separate two members in a single decl.
264264
bool EmptyLineBetweenMembers = false;
265265

266+
/// Whether to print the extensions from conforming protocols.
267+
bool PrintExtensionFromConformingProtocols = false;
268+
266269
enum class ArgAndParamPrintingMode {
267270
ArgumentOnly,
268271
MatchSource,
@@ -352,9 +355,9 @@ struct PrintOptions {
352355
return result;
353356
}
354357

355-
static PrintOptions printTypeInterface(Type T, const DeclContext *DC);
358+
static PrintOptions printTypeInterface(Type T, DeclContext *DC);
356359

357-
void setArchetypeTransform(Type T, const DeclContext *DC);
360+
void setArchetypeTransform(Type T, DeclContext *DC);
358361

359362
void setArchetypeTransformForQuickHelp(Type T, DeclContext *DC);
360363

lib/AST/ASTPrinter.cpp

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -654,16 +654,18 @@ hasMergeGroup(MergeGroupKind Kind) {
654654
return false;
655655
}
656656
}
657-
PrintOptions PrintOptions::printTypeInterface(Type T, const DeclContext *DC) {
657+
658+
PrintOptions PrintOptions::printTypeInterface(Type T, DeclContext *DC) {
658659
PrintOptions result = printInterface();
660+
result.PrintExtensionFromConformingProtocols = true;
659661
result.TransformContext = std::make_shared<ArchetypeTransformContext>(
660-
new PrinterArchetypeNameTransformer(T, DC), T);
662+
new ArchetypeSelfTransformer(T, *DC), T);
661663
return result;
662664
}
663665

664-
void PrintOptions::setArchetypeTransform(Type T, const DeclContext *DC) {
666+
void PrintOptions::setArchetypeTransform(Type T, DeclContext *DC) {
665667
TransformContext = std::make_shared<ArchetypeTransformContext>(
666-
new PrinterArchetypeNameTransformer(T, DC));
668+
new ArchetypeSelfTransformer(T, *DC));
667669
}
668670

669671
void PrintOptions::setArchetypeTransformForQuickHelp(Type T, DeclContext *DC) {
@@ -802,12 +804,8 @@ bool ASTPrinter::printTypeInterface(Type Ty, DeclContext *DC,
802804
Ty = Ty->getRValueType();
803805
PrintOptions Options = PrintOptions::printTypeInterface(Ty.getPointer(), DC);
804806
if (auto ND = Ty->getNominalOrBoundGenericNominal()) {
805-
llvm::SmallPtrSet<const ExtensionDecl*, 4> AllExts;
806-
for (auto Ext : ND->getExtensions()) {
807-
AllExts.insert(Ext);
808-
}
809807
Options.printExtensionContentAsMembers = [&](const ExtensionDecl *ED) {
810-
return AllExts.count(ED) == 1 && isExtensionApplied(*ND->getDeclContext(), Ty, ED);
808+
return isExtensionApplied(*ND->getDeclContext(), Ty, ED);
811809
};
812810
ND->print(OS, Options);
813811
return true;
@@ -1904,6 +1902,14 @@ void PrintAST::printMembersOfDecl(Decl *D, bool needComma,
19041902
if (Options.printExtensionContentAsMembers(Ext))
19051903
AddDeclFunc(Ext->getMembers());
19061904
}
1905+
if (Options.PrintExtensionFromConformingProtocols) {
1906+
for (auto Conf : NTD->getAllConformances()) {
1907+
for (auto Ext : Conf->getProtocol()->getExtensions()) {
1908+
if (Options.printExtensionContentAsMembers(Ext))
1909+
AddDeclFunc(Ext->getMembers());
1910+
}
1911+
}
1912+
}
19071913
}
19081914
printMembers(Members, needComma, openBracket, closeBracket);
19091915
}

lib/AST/USRGeneration.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ static inline StringRef getUSRSpacePrefix() {
3232
bool ide::printTypeUSR(Type Ty, raw_ostream &OS) {
3333
using namespace Mangle;
3434
Mangler Mangler(true);
35-
Mangler.mangleType(Ty->getRValueType(), 0);
35+
Mangler.mangleTypeForDebugger(Ty->getRValueType(), nullptr);
3636
Mangler.finalize(OS);
3737
return false;
3838
}

lib/IDE/SwiftSourceDocInfo.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
using namespace swift;
2020
using namespace swift::ide;
2121

22-
Optional<std::pair<unsigned, unsigned>> swift::ide::parseLineCol(StringRef LineCol) {
22+
Optional<std::pair<unsigned, unsigned>>
23+
swift::ide::parseLineCol(StringRef LineCol) {
2324
unsigned Line, Col;
2425
size_t ColonIdx = LineCol.find(':');
2526
if (ColonIdx == StringRef::npos) {

test/IDE/print_type_interface.swift

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
2+
13
public struct A {
24
public func fa() {}
35
}
@@ -10,13 +12,14 @@ extension A {
1012
class C1 {
1113
func f1() {
1214
var abcd : A
13-
abcd.fa()
15+
abcd.fa()
1416
var intarr : [Int]
1517
intarr.append(1)
1618
}
1719
}
1820

19-
// RUN: %target-swift-ide-test -print-type-interface -pos=13:6 -source-filename %s | FileCheck %s -check-prefix=TYPE1
21+
// RUN: %target-swift-ide-test -print-type-interface -pos=15:6 -source-filename %s | FileCheck %s -check-prefix=TYPE1
22+
// RUN: %target-swift-ide-test -print-type-interface -usr=_TtV20print_type_interface1A -module-name print_type_interface -source-filename %s | FileCheck %s -check-prefix=TYPE1
2023
// TYPE1: public struct A {
2124
// TYPE1: public func fa()
2225
// TYPE1: public func fea1()
@@ -36,8 +39,10 @@ class C2 {
3639
}
3740
}
3841

39-
// RUN: %target-swift-ide-test -print-type-interface -pos=34:6 -source-filename %s | FileCheck %s -check-prefix=TYPE2
40-
// RUN: %target-swift-ide-test -print-type-interface -pos=35:6 -source-filename %s | FileCheck %s -check-prefix=TYPE3
42+
// RUN: %target-swift-ide-test -print-type-interface -pos=37:6 -source-filename %s | FileCheck %s -check-prefix=TYPE2
43+
// RUN: %target-swift-ide-test -print-type-interface -usr=_TtGC20print_type_interface1DCS_2T1_ -module-name print_type_interface -source-filename %s | FileCheck %s -check-prefix=TYPE2
44+
// RUN: %target-swift-ide-test -print-type-interface -pos=38:6 -source-filename %s | FileCheck %s -check-prefix=TYPE3
45+
// RUN: %target-swift-ide-test -print-type-interface -usr=_TtGC20print_type_interface1DSi_ -module-name print_type_interface -source-filename %s | FileCheck %s -check-prefix=TYPE3
4146

4247
extension D where T : P1 {
4348
public func conditionalFunc1() {}
@@ -62,3 +67,19 @@ extension D {
6267
// TYPE3: public func unconditionalFunc1()
6368
// TYPE3: public func unconditionalFunc2(t: Int) -> Int
6469
// TYPE3: }
70+
71+
// RUN: %target-swift-ide-test -print-type-interface -usr=_TtGSaSi_ -module-name print_type_interface -source-filename %s | FileCheck %s -check-prefix=TYPE4
72+
// TYPE4-DAG: public typealias Index = Int
73+
// TYPE4-DAG: public func min() -> Int?
74+
// TYPE4-DAG: public mutating func insert<Int>(contentsOf newElements: C, at i: Int)
75+
// TYPE4-DAG: public mutating func removeFirst(_ n: Int)
76+
// TYPE4-DAG: public mutating func replaceSubrange<Int>(_ subrange: CountableRange<Int>, with newElements: C)
77+
// TYPE4-NOT: public func joined
78+
79+
// RUN: %target-swift-ide-test -print-type-interface -usr=_TtGSaSS_ -module-name print_type_interface -source-filename %s | FileCheck %s -check-prefix=TYPE5
80+
// TYPE5-DAG: public func prefix(_ maxLength: Int) -> ArraySlice<String>
81+
// TYPE5-DAG: public func suffix(_ maxLength: Int) -> ArraySlice<String>
82+
// TYPE5-DAG: public func split(separator: String, maxSplits: Int = default, omittingEmptySubsequences: Bool = default) -> [ArraySlice<String>]
83+
// TYPE5-DAG: public func formIndex(_ i: inout Int, offsetBy n: Int)
84+
// TYPE5-DAG: public func distance(from start: Int, to end: Int) -> Int
85+
// TYPE5-DAG: public func joined(separator: String) -> String

test/SourceKit/CursorInfo/cursor_info.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ func rethrowingFunction1(_: (Int) throws -> Void) rethrows -> Void {}
272272
// CHECK8-NEXT: s:FC11cursor_info2CCcFT1xSi_S0_
273273
// CHECK8-NEXT: (CC.Type) -> (x: Int) -> CC
274274
// CHECK8-NEXT: _TtFT1xSi_C11cursor_info2CC
275-
// CHECK8-NEXT: <Container>C11cursor_info2CC</Container>
275+
// CHECK8-NEXT: <Container>_TtC11cursor_info2CC</Container>
276276
// CHECK8-NEXT: <Declaration>convenience init(x: <Type usr="s:Si">Int</Type>)</Declaration>
277277
// CHECK8-NEXT: <decl.function.constructor><syntaxtype.keyword>convenience</syntaxtype.keyword> <syntaxtype.keyword>init</syntaxtype.keyword>(<decl.var.parameter><decl.var.parameter.argument_label>x</decl.var.parameter.argument_label>: <decl.var.parameter.type><ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>)</decl.function.constructor>
278278

test/SourceKit/CursorInfo/cursor_info_container.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,27 +42,27 @@ func SArrayGen() -> [S] { return [] }
4242
// RUN: %sourcekitd-test -req=cursor -pos=24:12 %s -- %s | FileCheck -check-prefix=CHECK1 %s
4343
// RUN: %sourcekitd-test -req=cursor -pos=25:12 %s -- %s | FileCheck -check-prefix=CHECK1 %s
4444
// RUN: %sourcekitd-test -req=cursor -pos=34:19 %s -- %s | FileCheck -check-prefix=CHECK1 %s
45-
// CHECK1: <Container>V21cursor_info_container1S</Container>
45+
// CHECK1: <Container>_TtV21cursor_info_container1S</Container>
4646

4747
// RUN: %sourcekitd-test -req=cursor -pos=26:12 %s -- %s | FileCheck -check-prefix=CHECK2 %s
48-
// CHECK2: <Container>MV21cursor_info_container1S</Container>
48+
// CHECK2: <Container>_TtMV21cursor_info_container1S</Container>
4949

5050
// RUN: %sourcekitd-test -req=cursor -pos=27:12 %s -- %s | FileCheck -check-prefix=CHECK3 %s
5151
// RUN: %sourcekitd-test -req=cursor -pos=28:12 %s -- %s | FileCheck -check-prefix=CHECK3 %s
5252
// RUN: %sourcekitd-test -req=cursor -pos=35:19 %s -- %s | FileCheck -check-prefix=CHECK3 %s
53-
// CHECK3: <Container>C21cursor_info_container1C</Container>
53+
// CHECK3: <Container>_TtC21cursor_info_container1C</Container>
5454

5555
// RUN: %sourcekitd-test -req=cursor -pos=29:12 %s -- %s | FileCheck -check-prefix=CHECK4 %s
56-
// CHECK4: <Container>MC21cursor_info_container1C</Container>
56+
// CHECK4: <Container>_TtMC21cursor_info_container1C</Container>
5757

5858
// RUN: %sourcekitd-test -req=cursor -pos=30:12 %s -- %s | FileCheck -check-prefix=CHECK5 %s
5959
// RUN: %sourcekitd-test -req=cursor -pos=31:12 %s -- %s | FileCheck -check-prefix=CHECK5 %s
6060
// RUN: %sourcekitd-test -req=cursor -pos=36:19 %s -- %s | FileCheck -check-prefix=CHECK5 %s
61-
// CHECK5: <Container>O21cursor_info_container1E</Container>
61+
// CHECK5: <Container>_TtO21cursor_info_container1E</Container>
6262

6363
// RUN: %sourcekitd-test -req=cursor -pos=32:12 %s -- %s | FileCheck -check-prefix=CHECK6 %s
6464
// RUN: %sourcekitd-test -req=cursor -pos=33:12 %s -- %s | FileCheck -check-prefix=CHECK6 %s
65-
// CHECK6: <Container>MO21cursor_info_container1E</Container>
65+
// CHECK6: <Container>_TtMO21cursor_info_container1E</Container>
6666

6767
// RUN: %sourcekitd-test -req=cursor -pos=37:22 %s -- %s | FileCheck -check-prefix=CHECK7 %s
68-
// CHECK7: <Container>GSaV21cursor_info_container1S_</Container>
68+
// CHECK7: <Container>_TtGSaV21cursor_info_container1S_</Container>

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

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,13 @@ HeaderToPrint("header-to-print",
525525
static llvm::cl::opt<std::string>
526526
LineColumnPair("pos", llvm::cl::desc("Line:Column pair"));
527527

528+
static llvm::cl::opt<std::string>
529+
USR("usr", llvm::cl::desc("USR"));
530+
531+
static llvm::cl::opt<std::string>
532+
ModuleName("module-name", llvm::cl::desc("The module name of the given test."),
533+
llvm::cl::init("swift_ide_test"));
534+
528535
static llvm::cl::opt<bool>
529536
NoEmptyLineBetweenMembers("no-empty-line-between-members",
530537
llvm::cl::desc("Print no empty line between members."),
@@ -2362,6 +2369,33 @@ static int doPrintTypeInterface(const CompilerInvocation &InitInvok,
23622369
return 0;
23632370
}
23642371

2372+
static int doPrintTypeInterfaceForTypeUsr(const CompilerInvocation &InitInvok,
2373+
const StringRef FileName,
2374+
const StringRef Usr) {
2375+
CompilerInvocation Invocation(InitInvok);
2376+
Invocation.addInputFilename(FileName);
2377+
CompilerInstance CI;
2378+
if (CI.setup(Invocation))
2379+
return 1;
2380+
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?");
2388+
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;
2397+
}
2398+
23652399
//===----------------------------------------------------------------------===//
23662400
// Print USRs
23672401
//===----------------------------------------------------------------------===//
@@ -2665,8 +2699,7 @@ int main(int argc, char *argv[]) {
26652699
InitInvok.setMainExecutablePath(
26662700
llvm::sys::fs::getMainExecutable(argv[0],
26672701
reinterpret_cast<void *>(&anchorForGetMainExecutable)));
2668-
2669-
InitInvok.setModuleName("swift_ide_test");
2702+
InitInvok.setModuleName(options::ModuleName);
26702703

26712704
InitInvok.setSDKPath(options::SDK);
26722705
if (!options::Triple.empty())
@@ -2892,9 +2925,14 @@ int main(int argc, char *argv[]) {
28922925
ExitCode = doPrintUSRs(InitInvok, options::SourceFilename);
28932926
break;
28942927
case ActionType::PrintTypeInterface:
2895-
ExitCode = doPrintTypeInterface(InitInvok,
2896-
options::SourceFilename,
2897-
options::LineColumnPair);
2928+
if (options::LineColumnPair.getNumOccurrences() == 1)
2929+
ExitCode = doPrintTypeInterface(InitInvok,
2930+
options::SourceFilename,
2931+
options::LineColumnPair);
2932+
else
2933+
ExitCode = doPrintTypeInterfaceForTypeUsr(InitInvok,
2934+
options::SourceFilename,
2935+
options::USR);
28982936
break;
28992937
case ActionType::ReconstructType:
29002938
ExitCode = doReconstructType(InitInvok, options::SourceFilename);

0 commit comments

Comments
 (0)