Skip to content

Commit 0d74959

Browse files
don't print macro definitions in symbol graphs (#64732)
rdar://106862694
1 parent e219699 commit 0d74959

File tree

5 files changed

+200
-24
lines changed

5 files changed

+200
-24
lines changed

include/swift/AST/PrintOptions.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,9 @@ struct PrintOptions {
484484
/// of the alias.
485485
bool PrintTypeAliasUnderlyingType = false;
486486

487+
/// Print the definition of a macro, e.g. `= #externalMacro(...)`.
488+
bool PrintMacroDefinitions = true;
489+
487490
/// Use aliases when printing references to modules to avoid ambiguities
488491
/// with types sharing a name with a module.
489492
bool AliasModuleNames = false;

lib/AST/ASTPrinter.cpp

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4742,34 +4742,36 @@ void PrintAST::visitMacroDecl(MacroDecl *decl) {
47424742
Printer.printStructurePost(PrintStructureKind::FunctionReturnType);
47434743
}
47444744

4745-
if (decl->definition) {
4746-
ASTContext &ctx = decl->getASTContext();
4747-
SmallString<64> scratch;
4748-
Printer << " = "
4749-
<< extractInlinableText(ctx.SourceMgr, decl->definition, scratch);
4750-
} else {
4751-
auto def = decl->getDefinition();
4752-
switch (def.kind) {
4753-
case MacroDefinition::Kind::Invalid:
4754-
case MacroDefinition::Kind::Undefined:
4755-
// Nothing to do.
4756-
break;
4745+
if (Options.PrintMacroDefinitions) {
4746+
if (decl->definition) {
4747+
ASTContext &ctx = decl->getASTContext();
4748+
SmallString<64> scratch;
4749+
Printer << " = "
4750+
<< extractInlinableText(ctx.SourceMgr, decl->definition, scratch);
4751+
} else {
4752+
auto def = decl->getDefinition();
4753+
switch (def.kind) {
4754+
case MacroDefinition::Kind::Invalid:
4755+
case MacroDefinition::Kind::Undefined:
4756+
// Nothing to do.
4757+
break;
47574758

4758-
case MacroDefinition::Kind::External: {
4759-
auto external = def.getExternalMacro();
4760-
Printer << " = #externalMacro(module: \"" << external.moduleName << "\", "
4761-
<< "type: \"" << external.macroTypeName << "\")";
4762-
break;
4763-
}
4759+
case MacroDefinition::Kind::External: {
4760+
auto external = def.getExternalMacro();
4761+
Printer << " = #externalMacro(module: \"" << external.moduleName << "\", "
4762+
<< "type: \"" << external.macroTypeName << "\")";
4763+
break;
4764+
}
47644765

4765-
case MacroDefinition::Kind::Builtin:
4766-
Printer << " = Builtin.";
4767-
switch (def.getBuiltinKind()) {
4768-
case BuiltinMacroKind::ExternalMacro:
4769-
Printer << "ExternalMacro";
4766+
case MacroDefinition::Kind::Builtin:
4767+
Printer << " = Builtin.";
4768+
switch (def.getBuiltinKind()) {
4769+
case BuiltinMacroKind::ExternalMacro:
4770+
Printer << "ExternalMacro";
4771+
break;
4772+
}
47704773
break;
47714774
}
4772-
break;
47734775
}
47744776
}
47754777

lib/SymbolGraphGen/SymbolGraph.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ PrintOptions SymbolGraph::getDeclarationFragmentsPrintOptions() const {
6969
Opts.PrintInherited = false;
7070
Opts.ExplodeEnumCaseDecls = true;
7171
Opts.PrintFactoryInitializerComment = false;
72+
Opts.PrintMacroDefinitions = false;
7273

7374
Opts.ExclusiveAttrList.clear();
7475

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import SwiftDiagnostics
2+
import SwiftOperators
3+
import SwiftSyntax
4+
import SwiftSyntaxBuilder
5+
import SwiftSyntaxMacros
6+
7+
public struct StringifyMacro: ExpressionMacro {
8+
public static func expansion(
9+
of macro: some FreestandingMacroExpansionSyntax,
10+
in context: some MacroExpansionContext
11+
) -> ExprSyntax {
12+
guard let argument = macro.argumentList.first?.expression else {
13+
fatalError("boom")
14+
}
15+
16+
return "(\(argument), \(StringLiteralExprSyntax(content: argument.description)))"
17+
}
18+
}
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-build-swift -swift-version 5 -I %swift-host-lib-dir -L %swift-host-lib-dir -emit-library -o %t/%target-library-name(MacroDefinition) -module-name=MacroDefinition %S/Inputs/stringify_macro.swift -g -no-toolchain-stdlib-rpath -swift-version 5
3+
// RUN: %target-swift-frontend -enable-experimental-feature FreestandingMacros -load-plugin-library %t/%target-library-name(MacroDefinition) -I %swift-host-lib-dir %s -module-name Macros -emit-module -emit-module-path %t/Macros.swiftmodule -emit-symbol-graph -emit-symbol-graph-dir %t/
4+
// RUN: %{python} -m json.tool %t/Macros.symbols.json %t/Macros.formatted.symbols.json
5+
6+
// Make sure that the `= #externalMacro(...)` doesn't show up in declaration fragments and in names fragments.
7+
8+
// RUN: %FileCheck %s --input-file %t/Macros.formatted.symbols.json
9+
// RUN: %FileCheck %s --input-file %t/Macros.formatted.symbols.json --check-prefix NAMES
10+
11+
// '-enable-experimental-feature Macros' requires an asserts build.
12+
// REQUIRES: asserts
13+
14+
// FIXME: Swift parser is not enabled on Linux CI yet.
15+
// REQUIRES: OS=macosx
16+
17+
@freestanding(expression) public macro stringify<T>(_ value: T) -> (T, String) = #externalMacro(module: "MacroDefinition", type: "StringifyMacro")
18+
19+
// CHECK: "declarationFragments": [
20+
// CHECK-NEXT: {
21+
// CHECK-NEXT: "kind": "attribute",
22+
// CHECK-NEXT: "spelling": "@freestanding"
23+
// CHECK-NEXT: },
24+
// CHECK-NEXT: {
25+
// CHECK-NEXT: "kind": "text",
26+
// CHECK-NEXT: "spelling": "(expression) "
27+
// CHECK-NEXT: },
28+
// CHECK-NEXT: {
29+
// CHECK-NEXT: "kind": "keyword",
30+
// CHECK-NEXT: "spelling": "macro"
31+
// CHECK-NEXT: },
32+
// CHECK-NEXT: {
33+
// CHECK-NEXT: "kind": "text",
34+
// CHECK-NEXT: "spelling": " "
35+
// CHECK-NEXT: },
36+
// CHECK-NEXT: {
37+
// CHECK-NEXT: "kind": "identifier",
38+
// CHECK-NEXT: "spelling": "stringify"
39+
// CHECK-NEXT: },
40+
// CHECK-NEXT: {
41+
// CHECK-NEXT: "kind": "text",
42+
// CHECK-NEXT: "spelling": "<"
43+
// CHECK-NEXT: },
44+
// CHECK-NEXT: {
45+
// CHECK-NEXT: "kind": "genericParameter",
46+
// CHECK-NEXT: "spelling": "T"
47+
// CHECK-NEXT: },
48+
// CHECK-NEXT: {
49+
// CHECK-NEXT: "kind": "text",
50+
// CHECK-NEXT: "spelling": ">("
51+
// CHECK-NEXT: },
52+
// CHECK-NEXT: {
53+
// CHECK-NEXT: "kind": "externalParam",
54+
// CHECK-NEXT: "spelling": "_"
55+
// CHECK-NEXT: },
56+
// CHECK-NEXT: {
57+
// CHECK-NEXT: "kind": "text",
58+
// CHECK-NEXT: "spelling": " "
59+
// CHECK-NEXT: },
60+
// CHECK-NEXT: {
61+
// CHECK-NEXT: "kind": "internalParam",
62+
// CHECK-NEXT: "spelling": "value"
63+
// CHECK-NEXT: },
64+
// CHECK-NEXT: {
65+
// CHECK-NEXT: "kind": "text",
66+
// CHECK-NEXT: "spelling": ": "
67+
// CHECK-NEXT: },
68+
// CHECK-NEXT: {
69+
// CHECK-NEXT: "kind": "typeIdentifier",
70+
// CHECK-NEXT: "spelling": "T",
71+
// CHECK-NEXT: "preciseIdentifier": "s:6Macros1TL_xmfp"
72+
// CHECK-NEXT: },
73+
// CHECK-NEXT: {
74+
// CHECK-NEXT: "kind": "text",
75+
// CHECK-NEXT: "spelling": ") -> ("
76+
// CHECK-NEXT: },
77+
// CHECK-NEXT: {
78+
// CHECK-NEXT: "kind": "typeIdentifier",
79+
// CHECK-NEXT: "spelling": "T",
80+
// CHECK-NEXT: "preciseIdentifier": "s:6Macros1TL_xmfp"
81+
// CHECK-NEXT: },
82+
// CHECK-NEXT: {
83+
// CHECK-NEXT: "kind": "text",
84+
// CHECK-NEXT: "spelling": ", "
85+
// CHECK-NEXT: },
86+
// CHECK-NEXT: {
87+
// CHECK-NEXT: "kind": "typeIdentifier",
88+
// CHECK-NEXT: "spelling": "String",
89+
// CHECK-NEXT: "preciseIdentifier": "s:SS"
90+
// CHECK-NEXT: },
91+
// CHECK-NEXT: {
92+
// CHECK-NEXT: "kind": "text",
93+
// CHECK-NEXT: "spelling": ")"
94+
// CHECK-NEXT: }
95+
// CHECK-NEXT: ],
96+
97+
// NAMES: "names": {
98+
// NAMES-NEXT: "title": "stringify(_:)",
99+
// NAMES-NEXT: "subHeading": [
100+
// NAMES-NEXT: {
101+
// NAMES-NEXT: "kind": "keyword",
102+
// NAMES-NEXT: "spelling": "macro"
103+
// NAMES-NEXT: },
104+
// NAMES-NEXT: {
105+
// NAMES-NEXT: "kind": "text",
106+
// NAMES-NEXT: "spelling": " "
107+
// NAMES-NEXT: },
108+
// NAMES-NEXT: {
109+
// NAMES-NEXT: "kind": "identifier",
110+
// NAMES-NEXT: "spelling": "stringify"
111+
// NAMES-NEXT: },
112+
// NAMES-NEXT: {
113+
// NAMES-NEXT: "kind": "text",
114+
// NAMES-NEXT: "spelling": "<"
115+
// NAMES-NEXT: },
116+
// NAMES-NEXT: {
117+
// NAMES-NEXT: "kind": "genericParameter",
118+
// NAMES-NEXT: "spelling": "T"
119+
// NAMES-NEXT: },
120+
// NAMES-NEXT: {
121+
// NAMES-NEXT: "kind": "text",
122+
// NAMES-NEXT: "spelling": ">("
123+
// NAMES-NEXT: },
124+
// NAMES-NEXT: {
125+
// NAMES-NEXT: "kind": "typeIdentifier",
126+
// NAMES-NEXT: "spelling": "T",
127+
// NAMES-NEXT: "preciseIdentifier": "s:6Macros1TL_xmfp"
128+
// NAMES-NEXT: },
129+
// NAMES-NEXT: {
130+
// NAMES-NEXT: "kind": "text",
131+
// NAMES-NEXT: "spelling": ") -> ("
132+
// NAMES-NEXT: },
133+
// NAMES-NEXT: {
134+
// NAMES-NEXT: "kind": "typeIdentifier",
135+
// NAMES-NEXT: "spelling": "T",
136+
// NAMES-NEXT: "preciseIdentifier": "s:6Macros1TL_xmfp"
137+
// NAMES-NEXT: },
138+
// NAMES-NEXT: {
139+
// NAMES-NEXT: "kind": "text",
140+
// NAMES-NEXT: "spelling": ", "
141+
// NAMES-NEXT: },
142+
// NAMES-NEXT: {
143+
// NAMES-NEXT: "kind": "typeIdentifier",
144+
// NAMES-NEXT: "spelling": "String",
145+
// NAMES-NEXT: "preciseIdentifier": "s:SS"
146+
// NAMES-NEXT: },
147+
// NAMES-NEXT: {
148+
// NAMES-NEXT: "kind": "text",
149+
// NAMES-NEXT: "spelling": ")"
150+
// NAMES-NEXT: }
151+
// NAMES-NEXT: ]
152+
// NAMES-NEXT: },

0 commit comments

Comments
 (0)