Add support to syntax tree

This commit is contained in:
Arnold Schwaighofer
2021-10-04 14:38:06 -07:00
parent 8840ea6b5b
commit 71f46a4f25
4 changed files with 24 additions and 2 deletions

View File

@@ -595,8 +595,10 @@ bool Parser::parseSpecializeAttributeArguments(
auto ParamLabel = Tok.getText(); auto ParamLabel = Tok.getText();
SyntaxParsingContext ArgumentContext( SyntaxParsingContext ArgumentContext(
SyntaxContext, ParamLabel == "target" SyntaxContext, ParamLabel == "target"
? SyntaxKind::TargetFunctionEntry ? SyntaxKind::TargetFunctionEntry :
: SyntaxKind::LabeledSpecializeEntry); (ParamLabel == "availability" ?
SyntaxKind::AvailabilityEntry
: SyntaxKind::LabeledSpecializeEntry));
if (ParamLabel != "exported" && ParamLabel != "kind" && if (ParamLabel != "exported" && ParamLabel != "kind" &&
ParamLabel != "target" && ParamLabel != "spi" && ParamLabel != "target" && ParamLabel != "spi" &&
ParamLabel != "spiModule" && ParamLabel != "availability") { ParamLabel != "spiModule" && ParamLabel != "availability") {

View File

@@ -34,3 +34,7 @@ public struct AvailableStruct {
public func availableNestedMethod() {} public func availableNestedMethod() {}
} }
} }
@_specialize(exported: true, availability: macOS 11, iOS 13, *; where T == Int)
//@_specialize(exported: true, where T == Int)
public func testAvailability<T>(_ t: T) {}

View File

@@ -102,10 +102,25 @@ ATTRIBUTE_NODES = [
element='Syntax', element_name='SpecializeAttribute', element='Syntax', element_name='SpecializeAttribute',
element_choices=[ element_choices=[
'LabeledSpecializeEntry', 'LabeledSpecializeEntry',
'AvailabilityEntry',
'TargetFunctionEntry', 'TargetFunctionEntry',
'GenericWhereClause', 'GenericWhereClause',
]), ]),
Node('AvailabilityEntry', kind='Syntax',
description='''
The availability argument for the _specialize attribute
''',
children=[
Child('Label', kind='IdentifierToken',
description='The label of the argument'),
Child('Colon', kind='ColonToken',
description='The colon separating the label and the value'),
Child('AvailabilityList', kind='AvailabilitySpecList',
collection_element_name='Availability'),
Child('Semicolon', kind='SemicolonToken'),
]),
# Representation of e.g. 'exported: true,' # Representation of e.g. 'exported: true,'
# labeled-specialize-entry -> identifier ':' token ','? # labeled-specialize-entry -> identifier ':' token ','?
Node('LabeledSpecializeEntry', kind='Syntax', Node('LabeledSpecializeEntry', kind='Syntax',

View File

@@ -253,6 +253,7 @@ SYNTAX_NODE_SERIALIZATION_CODES = {
'TargetFunctionEntry': 248, 'TargetFunctionEntry': 248,
'PostfixIfConfigExpr': 250, 'PostfixIfConfigExpr': 250,
'UnavailabilityCondition': 251, 'UnavailabilityCondition': 251,
'AvailabilityEntry' : 252,
} }