Skip to content

Commit f54e990

Browse files
authored
Merge pull request #60847 from ahoppen/ahoppen/node-name-for-diagnostics
[SwiftSyntax] Add a human readable name for diagnostics to all nodes
2 parents 44eae31 + a4bd91a commit f54e990

File tree

11 files changed

+342
-277
lines changed

11 files changed

+342
-277
lines changed

utils/gyb_syntax_support/AttributeNodes.py

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33

44
ATTRIBUTE_NODES = [
55
# token-list -> token? token-list?
6-
Node('TokenList', kind='SyntaxCollection',
6+
Node('TokenList', name_for_diagnostics='token list', kind='SyntaxCollection',
77
element='Token'),
88

99
# token-list -> token token-list?
10-
Node('NonEmptyTokenList', kind='SyntaxCollection',
11-
element='Token', omit_when_empty=True),
10+
Node('NonEmptyTokenList', name_for_diagnostics='token list',
11+
kind='SyntaxCollection', element='Token', omit_when_empty=True),
1212

13-
Node('CustomAttribute', kind='Syntax',
13+
Node('CustomAttribute', name_for_diagnostics='attribute', kind='Syntax',
1414
description='''
1515
A custom `@` attribute.
1616
''',
@@ -37,7 +37,7 @@
3737
# | named-attribute-string-argument
3838
# | back-deploy-attr-spec-list
3939
# )? ')'?
40-
Node('Attribute', kind='Syntax',
40+
Node('Attribute', name_for_diagnostics='attribute', kind='Syntax',
4141
description='''
4242
An `@` attribute.
4343
''',
@@ -89,7 +89,7 @@
8989
]),
9090

9191
# attribute-list -> attribute attribute-list?
92-
Node('AttributeList', kind='SyntaxCollection',
92+
Node('AttributeList', name_for_diagnostics='attributes', kind='SyntaxCollection',
9393
omit_when_empty=True,
9494
element='Syntax', element_name='Attribute',
9595
element_choices=[
@@ -102,7 +102,8 @@
102102
# specialize-spec-attr-list?
103103
# | generic-where-clause
104104
# specialize-spec-attr-list?
105-
Node('SpecializeAttributeSpecList', kind='SyntaxCollection',
105+
Node('SpecializeAttributeSpecList',
106+
name_for_diagnostics="argument to '@_specialize", kind='SyntaxCollection',
106107
description='''
107108
A collection of arguments for the `@_specialize` attribute
108109
''',
@@ -114,7 +115,7 @@
114115
'GenericWhereClause',
115116
]),
116117

117-
Node('AvailabilityEntry', kind='Syntax',
118+
Node('AvailabilityEntry', name_for_diagnostics='availability entry', kind='Syntax',
118119
description='''
119120
The availability argument for the _specialize attribute
120121
''',
@@ -131,6 +132,7 @@
131132
# Representation of e.g. 'exported: true,'
132133
# labeled-specialize-entry -> identifier ':' token ','?
133134
Node('LabeledSpecializeEntry', kind='Syntax',
135+
name_for_diagnostics='attribute argument',
134136
description='''
135137
A labeled argument for the `@_specialize` attribute like
136138
`exported: true`
@@ -151,6 +153,7 @@
151153
# Representation of e.g. 'exported: true,'
152154
# labeled-specialize-entry -> identifier ':' token ','?
153155
Node('TargetFunctionEntry', kind='Syntax',
156+
name_for_diagnostics='attribute argument',
154157
description='''
155158
A labeled argument for the `@_specialize` attribute with a function
156159
decl value like
@@ -173,6 +176,7 @@
173176
# The argument of '@_dynamic_replacement(for:)' or '@_private(sourceFile:)'
174177
# named-attribute-string-arg -> 'name': string-literal
175178
Node('NamedAttributeStringArgument', kind='Syntax',
179+
name_for_diagnostics='attribute argument',
176180
description='''
177181
The argument for the `@_dynamic_replacement` or `@_private`
178182
attribute of the form `for: "function()"` or `sourceFile:
@@ -188,7 +192,7 @@
188192
Child('Declname', kind='DeclName'),
189193
]),
190194
]),
191-
Node('DeclName', kind='Syntax', children=[
195+
Node('DeclName', name_for_diagnostics='declaration name', kind='Syntax', children=[
192196
Child('DeclBaseName', kind='Syntax', description='''
193197
The base name of the protocol\'s requirement.
194198
''',
@@ -205,7 +209,8 @@
205209
# The argument of '@_implements(...)'
206210
# implements-attr-arguments -> simple-type-identifier ','
207211
# (identifier | operator) decl-name-arguments
208-
Node('ImplementsAttributeArguments', kind='Syntax',
212+
Node('ImplementsAttributeArguments', name_for_diagnostics='@_implements arguemnts',
213+
kind='Syntax',
209214
description='''
210215
The arguments for the `@_implements` attribute of the form
211216
`Type, methodName(arg1Label:arg2Label:)`
@@ -234,7 +239,8 @@
234239
]),
235240

236241
# objc-selector-piece -> identifier? ':'?
237-
Node('ObjCSelectorPiece', kind='Syntax',
242+
Node('ObjCSelectorPiece', name_for_diagnostics='Objective-C selector piece',
243+
kind='Syntax',
238244
description='''
239245
A piece of an Objective-C selector. Either consisting of just an
240246
identifier for a nullary selector, an identifier and a colon for a
@@ -246,13 +252,15 @@
246252
]),
247253

248254
# objc-selector -> objc-selector-piece objc-selector?
249-
Node('ObjCSelector', kind='SyntaxCollection', element='ObjCSelectorPiece'),
255+
Node('ObjCSelector', name_for_diagnostics='Objective-C selector',
256+
kind='SyntaxCollection', element='ObjCSelectorPiece'),
250257

251258
# The argument of '@differentiable(...)'.
252259
# differentiable-attr-arguments ->
253260
# differentiability-kind? '.'? differentiability-params-clause? ','?
254261
# generic-where-clause?
255-
Node('DifferentiableAttributeArguments', kind='Syntax',
262+
Node('DifferentiableAttributeArguments',
263+
name_for_diagnostics="'@differentiable' arguments", kind='Syntax',
256264
description='''
257265
The arguments for the `@differentiable` attribute: an optional
258266
differentiability kind, an optional differentiability parameter clause,
@@ -276,7 +284,8 @@
276284

277285
# differentiability-params-clause ->
278286
# 'wrt' ':' (differentiability-param | differentiability-params)
279-
Node('DifferentiabilityParamsClause', kind='Syntax',
287+
Node('DifferentiabilityParamsClause',
288+
name_for_diagnostics="'@differentiable' argument", kind='Syntax',
280289
description='A clause containing differentiability parameters.',
281290
children=[
282291
Child('WrtLabel', kind='IdentifierToken',
@@ -292,7 +301,8 @@
292301
]),
293302

294303
# differentiability-params -> '(' differentiability-param-list ')'
295-
Node('DifferentiabilityParams', kind='Syntax',
304+
Node('DifferentiabilityParams', name_for_diagnostics='differentiability parameters',
305+
kind='Syntax',
296306
description='The differentiability parameters.',
297307
children=[
298308
Child('LeftParen', kind='LeftParenToken'),
@@ -304,11 +314,13 @@
304314

305315
# differentiability-param-list ->
306316
# differentiability-param differentiability-param-list?
307-
Node('DifferentiabilityParamList', kind='SyntaxCollection',
317+
Node('DifferentiabilityParamList',
318+
name_for_diagnostics='differentiability parameters', kind='SyntaxCollection',
308319
element='DifferentiabilityParam'),
309320

310321
# differentiability-param -> ('self' | identifier | integer-literal) ','?
311-
Node('DifferentiabilityParam', kind='Syntax',
322+
Node('DifferentiabilityParam', name_for_diagnostics='differentiability parameter',
323+
kind='Syntax',
312324
description='''
313325
A differentiability parameter: either the "self" identifier, a function
314326
parameter name, or a function parameter index.
@@ -330,7 +342,9 @@
330342
#
331343
# derivative-registration-attr-arguments ->
332344
# 'of' ':' func-decl-name ','? differentiability-params-clause?
333-
Node('DerivativeRegistrationAttributeArguments', kind='Syntax',
345+
Node('DerivativeRegistrationAttributeArguments',
346+
name_for_diagnostics='attribute arguments',
347+
kind='Syntax',
334348
description='''
335349
The arguments for the '@derivative(of:)' and '@transpose(of:)'
336350
attributes: the 'of:' label, the original declaration name, and an
@@ -369,6 +383,7 @@
369383
# base-type ->
370384
# member-type-identifier | base-type-identifier
371385
Node('QualifiedDeclName', kind='Syntax',
386+
name_for_diagnostics='declaration name',
372387
description='''
373388
An optionally qualified function declaration name (e.g. `+(_:_:)`,
374389
`A.B.C.foo(_:_:)`).
@@ -402,6 +417,7 @@
402417
# NOTE: This is duplicated with `DeclName` above. Change `DeclName`
403418
# description and use it if possible.
404419
Node('FunctionDeclName', kind='Syntax',
420+
name_for_diagnostics='function declaration name',
405421
description='A function declaration name (e.g. `foo(_:_:)`).',
406422
children=[
407423
Child('Name', kind='Syntax', description='''
@@ -423,6 +439,7 @@
423439
# The arguments of '@_backDeploy(...)'
424440
# back-deploy-attr-spec-list -> 'before' ':' back-deploy-version-list
425441
Node('BackDeployAttributeSpecList', kind='Syntax',
442+
name_for_diagnostics="'@_backDeploy' arguments",
426443
description='''
427444
A collection of arguments for the `@_backDeploy` attribute
428445
''',
@@ -441,11 +458,11 @@
441458

442459
# back-deploy-version-list ->
443460
# back-deploy-version-entry back-deploy-version-list?
444-
Node('BackDeployVersionList', kind='SyntaxCollection',
445-
element='BackDeployVersionArgument'),
461+
Node('BackDeployVersionList', name_for_diagnostics='version list',
462+
kind='SyntaxCollection', element='BackDeployVersionArgument'),
446463

447464
# back-deploy-version-entry -> availability-version-restriction ','?
448-
Node('BackDeployVersionArgument', kind='Syntax',
465+
Node('BackDeployVersionArgument', name_for_diagnostics='version', kind='Syntax',
449466
description='''
450467
A single platform/version pair in a `@_backDeploy` attribute,
451468
e.g. `iOS 10.1`.

utils/gyb_syntax_support/AvailabilityNodes.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@
33

44
AVAILABILITY_NODES = [
55
# availability-spec-list -> availability-entry availability-spec-list?
6-
Node('AvailabilitySpecList', kind='SyntaxCollection',
7-
element='AvailabilityArgument'),
6+
Node('AvailabilitySpecList', name_for_diagnostics="'@availability' arguments",
7+
kind='SyntaxCollection', element='AvailabilityArgument'),
88

99
# Wrapper for all the different entries that may occur inside @available
1010
# availability-entry -> '*' ','?
1111
# | identifier ','?
1212
# | availability-version-restriction ','?
1313
# | availability-versioned-argument ','?
14-
Node('AvailabilityArgument', kind='Syntax',
14+
Node('AvailabilityArgument', name_for_diagnostics="'@available' argument",
15+
kind='Syntax',
1516
description='''
1617
A single argument to an `@available` argument like `*`, `iOS 10.1`,
1718
or `message: "This has been deprecated"`.
@@ -38,7 +39,8 @@
3839

3940
# Representation of 'deprecated: 2.3', 'message: "Hello world"' etc.
4041
# availability-versioned-argument -> identifier ':' version-tuple
41-
Node('AvailabilityLabeledArgument', kind='Syntax',
42+
Node('AvailabilityLabeledArgument', name_for_diagnostics="'@available' argument",
43+
kind='Syntax',
4244
description='''
4345
A argument to an `@available` attribute that consists of a label and
4446
a value, e.g. `message: "This has been deprecated"`.
@@ -57,7 +59,8 @@
5759

5860
# Representation for 'iOS 10', 'swift 3.4' etc.
5961
# availability-version-restriction -> identifier version-tuple
60-
Node('AvailabilityVersionRestriction', kind='Syntax',
62+
Node('AvailabilityVersionRestriction', name_for_diagnostics="'@available' argument",
63+
kind='Syntax',
6164
description='''
6265
An argument to `@available` that restricts the availability on a
6366
certain platform to a version, e.g. `iOS 10` or `swift 3.4`.
@@ -76,7 +79,7 @@
7679
# version-tuple -> integer-literal
7780
# | float-literal
7881
# | float-literal '.' integer-literal
79-
Node('VersionTuple', kind='Syntax',
82+
Node('VersionTuple', name_for_diagnostics='version tuple', kind='Syntax',
8083
description='''
8184
A version number of the form major.minor.patch in which the minor
8285
and patch part may be omitted.

utils/gyb_syntax_support/Child.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ class Child(object):
1212
def __init__(self, name, kind, description=None, is_optional=False,
1313
token_choices=None, text_choices=None, node_choices=None,
1414
collection_element_name=None,
15-
classification=None, force_classification=False,
15+
classification=None, force_classification=False,
1616
is_indented=False, requires_leading_newline=False):
1717
"""
18-
If a classification is passed, it specifies the color identifiers in
19-
that subtree should inherit for syntax coloring. Must be a member of
18+
If a classification is passed, it specifies the color identifiers in
19+
that subtree should inherit for syntax coloring. Must be a member of
2020
SyntaxClassification in SyntaxClassifier.h.gyb
2121
If force_classification is also set to true, all child nodes (not only
2222
identifiers) inherit the syntax classification.

utils/gyb_syntax_support/CommonNodes.py

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,31 @@
22
from .Node import Node # noqa: I201
33

44
COMMON_NODES = [
5-
Node('Decl', kind='Syntax'),
6-
Node('Expr', kind='Syntax'),
7-
Node('Stmt', kind='Syntax'),
8-
Node('Type', kind='Syntax'),
9-
Node('Pattern', kind='Syntax'),
10-
Node('UnknownDecl', kind='Decl'),
11-
Node('UnknownExpr', kind='Expr'),
12-
Node('UnknownStmt', kind='Stmt'),
13-
Node('UnknownType', kind='Type'),
14-
Node('UnknownPattern', kind='Pattern'),
15-
Node('Missing', kind='Syntax'),
16-
Node('MissingDecl', kind='Decl', children=[
5+
Node('Decl', name_for_diagnostics='declaration', kind='Syntax'),
6+
Node('Expr', name_for_diagnostics='expression', kind='Syntax'),
7+
Node('Stmt', name_for_diagnostics='statement', kind='Syntax'),
8+
Node('Type', name_for_diagnostics='type', kind='Syntax'),
9+
Node('Pattern', name_for_diagnostics='pattern', kind='Syntax'),
10+
Node('UnknownDecl', name_for_diagnostics='declaration', kind='Decl'),
11+
Node('UnknownExpr', name_for_diagnostics='expression', kind='Expr'),
12+
Node('UnknownStmt', name_for_diagnostics='statement', kind='Stmt'),
13+
Node('UnknownType', name_for_diagnostics='type', kind='Type'),
14+
Node('UnknownPattern', name_for_diagnostics='pattern', kind='Pattern'),
15+
Node('Missing', name_for_diagnostics=None, kind='Syntax'),
16+
Node('MissingDecl', name_for_diagnostics='declaration', kind='Decl', children=[
1717
Child('Attributes', kind='AttributeList',
1818
collection_element_name='Attribute', is_optional=True),
1919
Child('Modifiers', kind='ModifierList',
2020
collection_element_name='Modifier', is_optional=True),
2121
]),
22-
Node('MissingExpr', kind='Expr'),
23-
Node('MissingStmt', kind='Stmt'),
24-
Node('MissingType', kind='Type'),
25-
Node('MissingPattern', kind='Pattern'),
22+
Node('MissingExpr', name_for_diagnostics='expression', kind='Expr'),
23+
Node('MissingStmt', name_for_diagnostics='statement', kind='Stmt'),
24+
Node('MissingType', name_for_diagnostics='type', kind='Type'),
25+
Node('MissingPattern', name_for_diagnostics='pattern', kind='Pattern'),
2626

2727
# code-block-item = (decl | stmt | expr) ';'?
28-
Node('CodeBlockItem', kind='Syntax', omit_when_empty=True,
28+
Node('CodeBlockItem', name_for_diagnostics=None, kind='Syntax',
29+
omit_when_empty=True,
2930
description="""
3031
A CodeBlockItem is any Syntax node that appears on its own line inside
3132
a CodeBlock.
@@ -49,11 +50,12 @@
4950
]),
5051

5152
# code-block-item-list -> code-block-item code-block-item-list?
52-
Node('CodeBlockItemList', kind='SyntaxCollection',
53-
element='CodeBlockItem', elements_separated_by_newline=True),
53+
Node('CodeBlockItemList', name_for_diagnostics=None,
54+
kind='SyntaxCollection', element='CodeBlockItem',
55+
elements_separated_by_newline=True),
5456

5557
# code-block -> '{' stmt-list '}'
56-
Node('CodeBlock', kind='Syntax',
58+
Node('CodeBlock', name_for_diagnostics=None, kind='Syntax',
5759
traits=['Braced', 'WithStatements'],
5860
children=[
5961
Child('LeftBrace', kind='LeftBraceToken'),
@@ -63,7 +65,8 @@
6365
requires_leading_newline=True),
6466
]),
6567

66-
Node('UnexpectedNodes', kind='SyntaxCollection', element='Syntax',
68+
Node('UnexpectedNodes', name_for_diagnostics=None, kind='SyntaxCollection',
69+
element='Syntax',
6770
description='''
6871
A collection of syntax nodes that occurred in the source code but
6972
could not be used to form a valid syntax tree.

0 commit comments

Comments
 (0)