Skip to content

Commit 61248de

Browse files
committed
[SourceKit] DocInfo: Fixing a paired-callback mismatch issue when merging nominals with extensions. rdar://25431244
1 parent 41a5800 commit 61248de

File tree

7 files changed

+282
-78
lines changed

7 files changed

+282
-78
lines changed

include/swift/AST/PrintOptions.h

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,29 @@ class SynthesizedExtensionAnalyzer {
8383
bool hasMergeGroup(MergeGroupKind Kind);
8484
};
8585

86-
struct BracketOptions {
87-
bool shouldOpenExtension = true;
88-
bool shouldCloseExtension = true;
89-
bool shouldCloseNominal = true;
90-
void reset() {
91-
shouldOpenExtension = true;
92-
shouldCloseExtension = true;
93-
shouldCloseNominal = true;
86+
class BracketOptions {
87+
Decl* Target;
88+
bool OpenExtension;
89+
bool CloseExtension;
90+
bool CloseNominal;
91+
92+
public:
93+
BracketOptions(Decl *Target = nullptr, bool OpenExtension = true,
94+
bool CloseExtension = true, bool CloseNominal = true) :
95+
Target(Target), OpenExtension(OpenExtension),
96+
CloseExtension(CloseExtension),
97+
CloseNominal(CloseNominal) {}
98+
99+
bool shouldOpenExtension(const Decl *D) {
100+
return D != Target || OpenExtension;
101+
}
102+
103+
bool shouldCloseExtension(const Decl *D) {
104+
return D != Target || CloseExtension;
105+
}
106+
107+
bool shouldCloseNominal(const Decl *D) {
108+
return D != Target || CloseNominal;
94109
}
95110
};
96111

lib/AST/ASTPrinter.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2155,7 +2155,7 @@ static void printExtendedTypeName(Type ExtendedType, ASTPrinter &Printer,
21552155

21562156
void PrintAST::
21572157
printSynthesizedExtension(NominalTypeDecl* Decl, ExtensionDecl *ExtDecl) {
2158-
if (Options.BracketOptions.shouldOpenExtension) {
2158+
if (Options.BracketOptions.shouldOpenExtension(ExtDecl)) {
21592159
printDocumentationComment(ExtDecl);
21602160
printAttributes(ExtDecl);
21612161
Printer << tok::kw_extension << " ";
@@ -2175,13 +2175,13 @@ printSynthesizedExtension(NominalTypeDecl* Decl, ExtensionDecl *ExtDecl) {
21752175
}
21762176
if (Options.TypeDefinitions) {
21772177
printMembersOfDecl(ExtDecl, false,
2178-
Options.BracketOptions.shouldOpenExtension,
2179-
Options.BracketOptions.shouldCloseExtension);
2178+
Options.BracketOptions.shouldOpenExtension(ExtDecl),
2179+
Options.BracketOptions.shouldCloseExtension(ExtDecl));
21802180
}
21812181
}
21822182

21832183
void PrintAST::printExtension(ExtensionDecl* decl) {
2184-
if (Options.BracketOptions.shouldOpenExtension) {
2184+
if (Options.BracketOptions.shouldOpenExtension(decl)) {
21852185
printDocumentationComment(decl);
21862186
printAttributes(decl);
21872187
Printer << "extension ";
@@ -2203,8 +2203,8 @@ void PrintAST::printExtension(ExtensionDecl* decl) {
22032203
}
22042204
if (Options.TypeDefinitions) {
22052205
printMembersOfDecl(decl, false,
2206-
Options.BracketOptions.shouldOpenExtension,
2207-
Options.BracketOptions.shouldCloseExtension);
2206+
Options.BracketOptions.shouldOpenExtension(decl),
2207+
Options.BracketOptions.shouldCloseExtension(decl));
22082208
}
22092209
}
22102210

@@ -2351,7 +2351,7 @@ void PrintAST::visitEnumDecl(EnumDecl *decl) {
23512351
}
23522352
if (Options.TypeDefinitions) {
23532353
printMembersOfDecl(decl, false, true,
2354-
Options.BracketOptions.shouldCloseNominal);
2354+
Options.BracketOptions.shouldCloseNominal(decl));
23552355
}
23562356
}
23572357

@@ -2377,7 +2377,7 @@ void PrintAST::visitStructDecl(StructDecl *decl) {
23772377
}
23782378
if (Options.TypeDefinitions) {
23792379
printMembersOfDecl(decl, false, true,
2380-
Options.BracketOptions.shouldCloseNominal);
2380+
Options.BracketOptions.shouldCloseNominal(decl));
23812381
}
23822382
}
23832383

@@ -2405,7 +2405,7 @@ void PrintAST::visitClassDecl(ClassDecl *decl) {
24052405

24062406
if (Options.TypeDefinitions) {
24072407
printMembersOfDecl(decl, false, true,
2408-
Options.BracketOptions.shouldCloseNominal);
2408+
Options.BracketOptions.shouldCloseNominal(decl));
24092409
}
24102410
}
24112411

@@ -2448,7 +2448,7 @@ void PrintAST::visitProtocolDecl(ProtocolDecl *decl) {
24482448
}
24492449
if (Options.TypeDefinitions) {
24502450
printMembersOfDecl(decl, false, true,
2451-
Options.BracketOptions.shouldCloseNominal);
2451+
Options.BracketOptions.shouldCloseNominal(decl));
24522452
}
24532453
}
24542454

lib/IDE/ModuleInterfacePrinting.cpp

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -481,15 +481,15 @@ void swift::ide::printSubmoduleInterface(
481481
if (auto NTD = dyn_cast<NominalTypeDecl>(D)) {
482482
if (PrintSynthesizedExtensions) {
483483
pAnalyzer.reset(new SynthesizedExtensionAnalyzer(NTD, AdjustedOptions));
484-
AdjustedOptions.BracketOptions.shouldCloseNominal =
484+
AdjustedOptions.BracketOptions = {NTD, true, true,
485485
!pAnalyzer->hasMergeGroup(SynthesizedExtensionAnalyzer::
486-
MergeGroupKind::MergeableWithTypeDef);
486+
MergeGroupKind::MergeableWithTypeDef)};
487487
}
488488
}
489489
if (D->print(Printer, AdjustedOptions)) {
490-
if (AdjustedOptions.BracketOptions.shouldCloseNominal)
490+
if (AdjustedOptions.BracketOptions.shouldCloseNominal(D))
491491
Printer << "\n";
492-
AdjustedOptions.BracketOptions.shouldCloseNominal = true;
492+
AdjustedOptions.BracketOptions = BracketOptions();
493493
if (auto NTD = dyn_cast<NominalTypeDecl>(D)) {
494494
std::queue<NominalTypeDecl *> SubDecls{{NTD}};
495495

@@ -502,9 +502,9 @@ void swift::ide::printSubmoduleInterface(
502502
if (auto N = dyn_cast<NominalTypeDecl>(Sub))
503503
SubDecls.push(N);
504504

505-
if (!PrintSynthesizedExtensions) {
506-
// Print Ext and add sub-types of Ext.
507-
for (auto Ext : NTD->getExtensions()) {
505+
// Print Ext and add sub-types of Ext.
506+
for (auto Ext : NTD->getExtensions()) {
507+
if (!PrintSynthesizedExtensions) {
508508
if (!shouldPrint(Ext, AdjustedOptions)) {
509509
Printer.callAvoidPrintDeclPost(Ext);
510510
continue;
@@ -514,12 +514,13 @@ void swift::ide::printSubmoduleInterface(
514514
Printer << "\n";
515515
Ext->print(Printer, AdjustedOptions);
516516
Printer << "\n";
517-
for (auto Sub : Ext->getMembers())
518-
if (auto N = dyn_cast<NominalTypeDecl>(Sub))
519-
SubDecls.push(N);
520517
}
521-
continue;
518+
for (auto Sub : Ext->getMembers())
519+
if (auto N = dyn_cast<NominalTypeDecl>(Sub))
520+
SubDecls.push(N);
522521
}
522+
if (!PrintSynthesizedExtensions)
523+
continue;
523524

524525
bool IsTopLevelDecl = D == NTD;
525526

@@ -531,9 +532,8 @@ void swift::ide::printSubmoduleInterface(
531532
SynthesizedExtensionAnalyzer::MergeGroupKind::MergeableWithTypeDef,
532533
[&](ArrayRef<ExtensionAndIsSynthesized> Decls){
533534
for (auto ET : Decls) {
534-
AdjustedOptions.BracketOptions.shouldOpenExtension = false;
535-
AdjustedOptions.BracketOptions.shouldCloseExtension =
536-
Decls.back().first == ET.first;
535+
AdjustedOptions.BracketOptions = {ET.first, false,
536+
Decls.back().first == ET.first, true};
537537
if (ET.second)
538538
AdjustedOptions.
539539
initArchetypeTransformerForSynthesizedExtensions(NTD,
@@ -542,7 +542,7 @@ void swift::ide::printSubmoduleInterface(
542542
if (ET.second)
543543
AdjustedOptions.
544544
clearArchetypeTransformerForSynthesizedExtensions();
545-
if (AdjustedOptions.BracketOptions.shouldCloseExtension)
545+
if (AdjustedOptions.BracketOptions.shouldCloseExtension(ET.first))
546546
Printer << "\n";
547547
}
548548
});
@@ -562,11 +562,10 @@ void swift::ide::printSubmoduleInterface(
562562
SynthesizedExtensionAnalyzer::MergeGroupKind::All,
563563
[&](ArrayRef<ExtensionAndIsSynthesized> Decls){
564564
for (auto ET : Decls) {
565-
AdjustedOptions.BracketOptions.shouldOpenExtension =
566-
Decls.front().first == ET.first;
567-
AdjustedOptions.BracketOptions.shouldCloseExtension =
568-
Decls.back().first == ET.first;
569-
if (AdjustedOptions.BracketOptions.shouldOpenExtension)
565+
AdjustedOptions.BracketOptions = {ET.first,
566+
Decls.front().first == ET.first,
567+
Decls.back().first == ET.first, true};
568+
if (AdjustedOptions.BracketOptions.shouldOpenExtension(ET.first))
570569
Printer << "\n";
571570
if (ET.second)
572571
AdjustedOptions.
@@ -576,11 +575,11 @@ void swift::ide::printSubmoduleInterface(
576575
if (ET.second)
577576
AdjustedOptions.
578577
clearArchetypeTransformerForSynthesizedExtensions();
579-
if (AdjustedOptions.BracketOptions.shouldCloseExtension)
578+
if (AdjustedOptions.BracketOptions.shouldCloseExtension(ET.first))
580579
Printer << "\n";
581580
}
582581
});
583-
AdjustedOptions.BracketOptions.reset();
582+
AdjustedOptions.BracketOptions = BracketOptions();
584583
}
585584
}
586585
return true;

test/SourceKit/DocSupport/Inputs/cake.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,18 @@ extension C1Alias : Prot1 {}
3232

3333
public extension Prot {
3434
public func foo1() {}
35+
}
36+
37+
public struct S1 {
38+
public enum SE {
39+
case a
40+
case b
41+
case c
42+
}
43+
}
44+
public extension S1 {
45+
public func foo1() {}
46+
public struct S2 {
47+
public let b = 1
48+
}
3549
}

0 commit comments

Comments
 (0)