Skip to content

Commit aef3464

Browse files
authored
Merge pull request swiftlang#32187 from bitjammer/acgarland/rdar-63338507-show-non-underscored-attrs
[SymbolGraph] Print non-underscored attributes in declarations
2 parents bcae501 + dd7a7f7 commit aef3464

File tree

7 files changed

+204
-68
lines changed

7 files changed

+204
-68
lines changed

lib/AST/ASTPrinter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2587,7 +2587,7 @@ static void printParameterFlags(ASTPrinter &printer, PrintOptions options,
25872587
}
25882588

25892589
if (!options.excludeAttrKind(TAK_escaping) && escaping)
2590-
printer << "@escaping ";
2590+
printer.printKeyword("@escaping", options, " ");
25912591
}
25922592

25932593
void PrintAST::visitVarDecl(VarDecl *decl) {

lib/SymbolGraphGen/SymbolGraph.cpp

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ PrintOptions SymbolGraph::getDeclarationFragmentsPrintOptions() const {
5252
Opts.PrintPropertyAccessors = true;
5353
Opts.PrintSubscriptAccessors = true;
5454
Opts.SkipUnderscoredKeywords = true;
55-
Opts.SkipAttributes = true;
55+
Opts.SkipAttributes = false;
5656
Opts.PrintOverrideKeyword = true;
5757
Opts.PrintImplicitAttrs = false;
5858
Opts.PrintFunctionRepresentationAttrs =
@@ -65,10 +65,35 @@ PrintOptions SymbolGraph::getDeclarationFragmentsPrintOptions() const {
6565

6666
Opts.ExclusiveAttrList.clear();
6767

68-
#define DECL_ATTR(SPELLING, CLASS, OPTIONS, CODE) Opts.ExcludeAttrList.push_back(DAK_##CLASS);
69-
#define TYPE_ATTR(X) Opts.ExcludeAttrList.push_back(TAK_##X);
68+
llvm::StringMap<AnyAttrKind> ExcludeAttrs;
69+
70+
#define DECL_ATTR(SPELLING, CLASS, OPTIONS, CODE) \
71+
if (StringRef(#SPELLING).startswith("_")) \
72+
ExcludeAttrs.insert(std::make_pair("DAK_" #CLASS, DAK_##CLASS));
73+
#define TYPE_ATTR(X) ExcludeAttrs.insert(std::make_pair("TAK_" #X, TAK_##X));
7074
#include "swift/AST/Attr.def"
7175

76+
// Allow the following type attributes:
77+
ExcludeAttrs.erase("TAK_autoclosure");
78+
ExcludeAttrs.erase("TAK_convention");
79+
ExcludeAttrs.erase("TAK_noescape");
80+
ExcludeAttrs.erase("TAK_escaping");
81+
ExcludeAttrs.erase("TAK_inout");
82+
83+
// Don't allow the following decl attributes:
84+
// These can be large and are already included elsewhere in
85+
// symbol graphs.
86+
ExcludeAttrs.insert(std::make_pair("DAK_Available", DAK_Available));
87+
ExcludeAttrs.insert(std::make_pair("DAK_Inline", DAK_Inline));
88+
ExcludeAttrs.insert(std::make_pair("DAK_Inlinable", DAK_Inlinable));
89+
ExcludeAttrs.insert(std::make_pair("DAK_Prefix", DAK_Prefix));
90+
ExcludeAttrs.insert(std::make_pair("DAK_Postfix", DAK_Postfix));
91+
ExcludeAttrs.insert(std::make_pair("DAK_Infix", DAK_Infix));
92+
93+
for (const auto &Entry : ExcludeAttrs) {
94+
Opts.ExcludeAttrList.push_back(Entry.getValue());
95+
}
96+
7297
return Opts;
7398
}
7499

@@ -87,11 +112,25 @@ SymbolGraph::getSubHeadingDeclarationFragmentsPrintOptions() const {
87112
Options.PrintSubscriptAccessors = false;
88113
//--------------------------------------------------------------------------//
89114

115+
Options.SkipAttributes = true;
90116
Options.VarInitializers = false;
91117
Options.PrintDefaultArgumentValue = false;
92118
Options.PrintEmptyArgumentNames = false;
93119
Options.PrintOverrideKeyword = false;
94120
Options.PrintGenericRequirements = false;
121+
122+
#define DECL_ATTR(SPELLING, CLASS, OPTIONS, CODE) \
123+
Options.ExcludeAttrList.push_back(DAK_##CLASS);
124+
#define TYPE_ATTR(X) \
125+
Options.ExcludeAttrList.push_back(TAK_##X);
126+
#include "swift/AST/Attr.def"
127+
128+
// Don't include these attributes in subheadings.
129+
Options.ExcludeAttrList.push_back(DAK_Final);
130+
Options.ExcludeAttrList.push_back(DAK_Mutating);
131+
Options.ExcludeAttrList.push_back(DAK_NonMutating);
132+
Options.ExcludeAttrList.push_back(TAK_escaping);
133+
95134
return Options;
96135
}
97136

test/SymbolGraph/Symbols/Mixins/DeclarationFragments/Full/Function.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
public func foo<S>(f: @escaping () -> (), ext int: Int = 2, s: S) where S: Sequence {}
77

88
// CHECK-LABEL:{{^ }}"declarationFragments": [
9-
// CHECK-NEXT: {
9+
// CHECK: {
1010
// CHECK-NEXT: "kind": "keyword",
1111
// CHECK-NEXT: "spelling": "func"
1212
// CHECK-NEXT: },
@@ -36,7 +36,15 @@ public func foo<S>(f: @escaping () -> (), ext int: Int = 2, s: S) where S: Seque
3636
// CHECK-NEXT: },
3737
// CHECK-NEXT: {
3838
// CHECK-NEXT: "kind": "text",
39-
// CHECK-NEXT: "spelling": ": () -> (), "
39+
// CHECK-NEXT: "spelling": ": "
40+
// CHECK-NEXT: },
41+
// CHECK-NEXT: {
42+
// CHECK-NEXT: "kind": "keyword",
43+
// CHECK-NEXT: "spelling": "@escaping"
44+
// CHECK-NEXT: },
45+
// CHECK-NEXT: {
46+
// CHECK-NEXT: "kind": "text",
47+
// CHECK-NEXT: "spelling": " () -> (), "
4048
// CHECK-NEXT: },
4149
// CHECK-NEXT: {
4250
// CHECK-NEXT: "kind": "externalParam",
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-build-swift %s -module-name MultipleAttributes -emit-module -emit-module-path %t/
3+
// RUN: %target-swift-symbolgraph-extract -module-name MultipleAttributes -I %t -pretty-print -output-dir %t
4+
// RUN: %FileCheck %s --input-file %t/MultipleAttributes.symbols.json
5+
6+
@frozen @propertyWrapper
7+
public struct S {
8+
public init() {}
9+
public var wrappedValue: Int {
10+
return 0
11+
}
12+
}
13+
14+
// CHECK-LABEL: "precise": "s:18MultipleAttributes1SV"
15+
// CHECK: "declarationFragments": [
16+
// CHECK-NEXT: {
17+
// CHECK-NEXT: "kind": "attribute",
18+
// CHECK-NEXT: "spelling": "@frozen"
19+
// CHECK-NEXT: },
20+
// CHECK-NEXT: {
21+
// CHECK-NEXT: "kind": "text",
22+
// CHECK-NEXT: "spelling": " "
23+
// CHECK-NEXT: },
24+
// CHECK-NEXT: {
25+
// CHECK-NEXT: "kind": "attribute",
26+
// CHECK-NEXT: "spelling": "@propertyWrapper"
27+
// CHECK-NEXT: },
28+
// CHECK-NEXT: {
29+
// CHECK-NEXT: "kind": "text",
30+
// CHECK-NEXT: "spelling": " "
31+
// CHECK-NEXT: },
32+
// CHECK-NEXT: {
33+
// CHECK-NEXT: "kind": "keyword",
34+
// CHECK-NEXT: "spelling": "struct"
35+
// CHECK-NEXT: },
36+
// CHECK-NEXT: {
37+
// CHECK-NEXT: "kind": "text",
38+
// CHECK-NEXT: "spelling": " "
39+
// CHECK-NEXT: },
40+
// CHECK-NEXT: {
41+
// CHECK-NEXT: "kind": "identifier",
42+
// CHECK-NEXT: "spelling": "S"
43+
// CHECK-NEXT: }
44+
// CHECK-NEXT: ]
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-build-swift %s -module-name Never -emit-module -emit-module-path %t/
3+
// RUN: %target-swift-symbolgraph-extract -module-name Never -I %t -pretty-print -output-dir %t
4+
// RUN: %FileCheck %s --input-file %t/Never.symbols.json --match-full-lines --strict-whitespace
5+
6+
// REQUIRES: OS=macosx
7+
8+
// Attributes that should never appear anywhere in the symbol graph.
9+
10+
@available(macOS, deprecated)
11+
public func deprecated() {}
12+
13+
@inlinable
14+
public func inlinable() {}
15+
16+
@inline(never)
17+
public func inline() {}
18+
19+
public struct S {
20+
public static prefix func ..<(s: S) -> S {
21+
return s
22+
}
23+
public static func +(a: S, b: S) -> S {
24+
return a
25+
}
26+
public static postfix func ++(s: S) -> S {
27+
return s
28+
}
29+
}
30+
31+
// CHECK-NOT: @available
32+
// CHECK-NOT: @inlinable
33+
// CHECK-NOT: @inline
34+
// CHECK-NOT: "spelling": "prefix"
35+
// CHECK-NOT: "spelling": "postfix"
36+
// CHECK-NOT: "spelling": "infix"
37+

test/SymbolGraph/Symbols/Mixins/DeclarationFragments/Full/NominalTypes.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,19 @@
88

99
public protocol P {}
1010

11-
public struct S<T> : P where T: Sequence {}
11+
@frozen public struct S<T> : P where T: Sequence {}
1212

1313
// STRUCT-LABEL: "precise": "s:12NominalTypes1SV",
1414
// STRUCT: "declarationFragments": [
1515
// STRUCT-NEXT: {
16+
// STRUCT-NEXT: "kind": "attribute",
17+
// STRUCT-NEXT: "spelling": "@frozen"
18+
// STRUCT-NEXT: },
19+
// STRUCT-NEXT: {
20+
// STRUCT-NEXT: "kind": "text",
21+
// STRUCT-NEXT: "spelling": " "
22+
// STRUCT-NEXT: },
23+
// STRUCT-NEXT: {
1624
// STRUCT-NEXT: "kind": "keyword",
1725
// STRUCT-NEXT: "spelling": "struct"
1826
// STRUCT-NEXT: },

test/SymbolGraph/Symbols/Mixins/DeclarationFragments/Subheading/Function.swift

Lines changed: 61 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -11,66 +11,66 @@ public func foo<S>(f: @escaping () -> (), ext int: Int = 2, s: S) where S: Seque
1111
// CHECK: names
1212
// CHECK-NEXT: "title": "foo(f:ext:s:)"
1313
// CHECK: "subHeading": [
14-
// CHECK-NEXT: {
15-
// CHECK-NEXT: "kind": "keyword",
16-
// CHECK-NEXT: "spelling": "func"
17-
// CHECK-NEXT: },
18-
// CHECK-NEXT: {
19-
// CHECK-NEXT: "kind": "text",
20-
// CHECK-NEXT: "spelling": " "
21-
// CHECK-NEXT: },
22-
// CHECK-NEXT: {
23-
// CHECK-NEXT: "kind": "identifier",
24-
// CHECK-NEXT: "spelling": "foo"
25-
// CHECK-NEXT: },
26-
// CHECK-NEXT: {
27-
// CHECK-NEXT: "kind": "text",
28-
// CHECK-NEXT: "spelling": "<"
29-
// CHECK-NEXT: },
30-
// CHECK-NEXT: {
31-
// CHECK-NEXT: "kind": "genericParameter",
32-
// CHECK-NEXT: "spelling": "S"
33-
// CHECK-NEXT: },
34-
// CHECK-NEXT: {
35-
// CHECK-NEXT: "kind": "text",
36-
// CHECK-NEXT: "spelling": ">("
37-
// CHECK-NEXT: },
38-
// CHECK-NEXT: {
39-
// CHECK-NEXT: "kind": "externalParam",
40-
// CHECK-NEXT: "spelling": "f"
41-
// CHECK-NEXT: },
42-
// CHECK-NEXT: {
43-
// CHECK-NEXT: "kind": "text",
44-
// CHECK-NEXT: "spelling": ": () -> (), "
45-
// CHECK-NEXT: },
46-
// CHECK-NEXT: {
47-
// CHECK-NEXT: "kind": "externalParam",
48-
// CHECK-NEXT: "spelling": "ext"
49-
// CHECK-NEXT: },
50-
// CHECK-NEXT: {
51-
// CHECK-NEXT: "kind": "text",
52-
// CHECK-NEXT: "spelling": ": "
53-
// CHECK-NEXT: },
54-
// CHECK-NEXT: {
55-
// CHECK-NEXT: "kind": "typeIdentifier",
56-
// CHECK-NEXT: "spelling": "Int",
57-
// CHECK-NEXT: "preciseIdentifier": "s:Si"
58-
// CHECK-NEXT: },
59-
// CHECK-NEXT: {
60-
// CHECK-NEXT: "kind": "text",
61-
// CHECK-NEXT: "spelling": ", "
62-
// CHECK-NEXT: },
63-
// CHECK-NEXT: {
64-
// CHECK-NEXT: "kind": "externalParam",
65-
// CHECK-NEXT: "spelling": "s"
66-
// CHECK-NEXT: },
67-
// CHECK-NEXT: {
68-
// CHECK-NEXT: "kind": "text",
69-
// CHECK-NEXT: "spelling": ": S"
70-
// CHECK-NEXT: },
71-
// CHECK-NEXT: {
72-
// CHECK-NEXT: "kind": "text",
73-
// CHECK-NEXT: "spelling": ")"
74-
// CHECK-NEXT: }
14+
// CHECK-NEXT: {
15+
// CHECK-NEXT: "kind": "keyword",
16+
// CHECK-NEXT: "spelling": "func"
17+
// CHECK-NEXT: },
18+
// CHECK-NEXT: {
19+
// CHECK-NEXT: "kind": "text",
20+
// CHECK-NEXT: "spelling": " "
21+
// CHECK-NEXT: },
22+
// CHECK-NEXT: {
23+
// CHECK-NEXT: "kind": "identifier",
24+
// CHECK-NEXT: "spelling": "foo"
25+
// CHECK-NEXT: },
26+
// CHECK-NEXT: {
27+
// CHECK-NEXT: "kind": "text",
28+
// CHECK-NEXT: "spelling": "<"
29+
// CHECK-NEXT: },
30+
// CHECK-NEXT: {
31+
// CHECK-NEXT: "kind": "genericParameter",
32+
// CHECK-NEXT: "spelling": "S"
33+
// CHECK-NEXT: },
34+
// CHECK-NEXT: {
35+
// CHECK-NEXT: "kind": "text",
36+
// CHECK-NEXT: "spelling": ">("
37+
// CHECK-NEXT: },
38+
// CHECK-NEXT: {
39+
// CHECK-NEXT: "kind": "externalParam",
40+
// CHECK-NEXT: "spelling": "f"
41+
// CHECK-NEXT: },
42+
// CHECK-NEXT: {
43+
// CHECK-NEXT: "kind": "text",
44+
// CHECK-NEXT: "spelling": ": () -> (), "
45+
// CHECK-NEXT: },
46+
// CHECK-NEXT: {
47+
// CHECK-NEXT: "kind": "externalParam",
48+
// CHECK-NEXT: "spelling": "ext"
49+
// CHECK-NEXT: },
50+
// CHECK-NEXT: {
51+
// CHECK-NEXT: "kind": "text",
52+
// CHECK-NEXT: "spelling": ": "
53+
// CHECK-NEXT: },
54+
// CHECK-NEXT: {
55+
// CHECK-NEXT: "kind": "typeIdentifier",
56+
// CHECK-NEXT: "spelling": "Int",
57+
// CHECK-NEXT: "preciseIdentifier": "s:Si"
58+
// CHECK-NEXT: },
59+
// CHECK-NEXT: {
60+
// CHECK-NEXT: "kind": "text",
61+
// CHECK-NEXT: "spelling": ", "
62+
// CHECK-NEXT: },
63+
// CHECK-NEXT: {
64+
// CHECK-NEXT: "kind": "externalParam",
65+
// CHECK-NEXT: "spelling": "s"
66+
// CHECK-NEXT: },
67+
// CHECK-NEXT: {
68+
// CHECK-NEXT: "kind": "text",
69+
// CHECK-NEXT: "spelling": ": S"
70+
// CHECK-NEXT: },
71+
// CHECK-NEXT: {
72+
// CHECK-NEXT: "kind": "text",
73+
// CHECK-NEXT: "spelling": ")"
74+
// CHECK-NEXT: }
7575
// CHECK-NEXT: ]
7676

0 commit comments

Comments
 (0)