[libSyntax] Model parameter modifiers as a ModifierList

This fixes a libSyntax misparse where the first parameter name was parsed as the `isolated` token.
This commit is contained in:
Alex Hoppen
2022-09-30 14:05:15 +02:00
parent 8491f52d47
commit 14d0f41ca7
3 changed files with 865 additions and 58 deletions

View File

@@ -255,6 +255,9 @@ Parser::parseParameterClause(SourceLoc &leftParenLoc,
}
}
{
SyntaxParsingContext ModifiersContext(SyntaxContext, SyntaxKind::ModifierList);
// ('inout' | '__shared' | '__owned' | isolated)?
bool hasSpecifier = false;
while (Tok.is(tok::kw_inout) ||
@@ -262,6 +265,7 @@ Parser::parseParameterClause(SourceLoc &leftParenLoc,
Tok.isContextualKeyword("__owned") ||
Tok.isContextualKeyword("isolated") ||
Tok.isContextualKeyword("_const")) {
SyntaxParsingContext ModContext(SyntaxContext, SyntaxKind::DeclModifier);
if (Tok.isContextualKeyword("isolated")) {
// did we already find an 'isolated' type modifier?
@@ -320,6 +324,7 @@ Parser::parseParameterClause(SourceLoc &leftParenLoc,
consumeToken();
}
}
}
// If let or var is being used as an argument label, allow it but
// generate a warning.

View File

@@ -0,0 +1,795 @@
{
"kind": "SourceFile",
"layout": [
null,
{
"kind": "CodeBlockItemList",
"layout": [
{
"kind": "CodeBlockItem",
"layout": [
null,
{
"kind": "FunctionDecl",
"layout": [
null,
null,
null,
null,
null,
{
"tokenKind": {
"kind": "kw_func"
},
"leadingTrivia": "\/\/ RUN: %swift-syntax-test -input-source-filename %s -serialize-raw-tree > %t\n\/\/ RUN: diff %S\/Inputs\/serialize_functions.json %t -u\n\n",
"trailingTrivia": " ",
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "identifier",
"text": "oneName"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
null,
null,
{
"kind": "FunctionSignature",
"layout": [
null,
{
"kind": "ParameterClause",
"layout": [
null,
{
"tokenKind": {
"kind": "l_paren"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
{
"kind": "FunctionParameterList",
"layout": [
{
"kind": "FunctionParameter",
"layout": [
null,
null,
null,
null,
null,
{
"tokenKind": {
"kind": "identifier",
"text": "name"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
null,
null,
{
"tokenKind": {
"kind": "colon"
},
"leadingTrivia": "",
"trailingTrivia": " ",
"presence": "Present"
},
null,
{
"kind": "SimpleTypeIdentifier",
"layout": [
null,
{
"tokenKind": {
"kind": "identifier",
"text": "String"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
null
],
"presence": "Present"
},
null,
null,
null,
null,
null,
null
],
"presence": "Present"
}
],
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "r_paren"
},
"leadingTrivia": "",
"trailingTrivia": " ",
"presence": "Present"
}
],
"presence": "Present"
},
null,
null,
null,
null,
null,
null
],
"presence": "Present"
},
null,
null,
null,
{
"kind": "CodeBlock",
"layout": [
null,
{
"tokenKind": {
"kind": "l_brace"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
{
"kind": "CodeBlockItemList",
"layout": [],
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "r_brace"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
}
],
"presence": "Present"
}
],
"presence": "Present"
},
null,
null,
null,
null
],
"presence": "Present"
},
{
"kind": "CodeBlockItem",
"layout": [
null,
{
"kind": "FunctionDecl",
"layout": [
null,
null,
null,
null,
null,
{
"tokenKind": {
"kind": "kw_func"
},
"leadingTrivia": "\n",
"trailingTrivia": " ",
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "identifier",
"text": "oneName"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
null,
null,
{
"kind": "FunctionSignature",
"layout": [
null,
{
"kind": "ParameterClause",
"layout": [
null,
{
"tokenKind": {
"kind": "l_paren"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
{
"kind": "FunctionParameterList",
"layout": [
{
"kind": "FunctionParameter",
"layout": [
null,
null,
null,
null,
null,
{
"tokenKind": {
"kind": "identifier",
"text": "firstName"
},
"leadingTrivia": "",
"trailingTrivia": " ",
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "identifier",
"text": "secondName"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "colon"
},
"leadingTrivia": "",
"trailingTrivia": " ",
"presence": "Present"
},
null,
{
"kind": "SimpleTypeIdentifier",
"layout": [
null,
{
"tokenKind": {
"kind": "identifier",
"text": "String"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
null
],
"presence": "Present"
},
null,
null,
null,
null,
null,
null
],
"presence": "Present"
}
],
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "r_paren"
},
"leadingTrivia": "",
"trailingTrivia": " ",
"presence": "Present"
}
],
"presence": "Present"
},
null,
null,
null,
null,
null,
null
],
"presence": "Present"
},
null,
null,
null,
{
"kind": "CodeBlock",
"layout": [
null,
{
"tokenKind": {
"kind": "l_brace"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
{
"kind": "CodeBlockItemList",
"layout": [],
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "r_brace"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
}
],
"presence": "Present"
}
],
"presence": "Present"
},
null,
null,
null,
null
],
"presence": "Present"
},
{
"kind": "CodeBlockItem",
"layout": [
null,
{
"kind": "FunctionDecl",
"layout": [
null,
null,
null,
null,
null,
{
"tokenKind": {
"kind": "kw_func"
},
"leadingTrivia": "\n",
"trailingTrivia": " ",
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "identifier",
"text": "const"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
null,
null,
{
"kind": "FunctionSignature",
"layout": [
null,
{
"kind": "ParameterClause",
"layout": [
null,
{
"tokenKind": {
"kind": "l_paren"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
{
"kind": "FunctionParameterList",
"layout": [
{
"kind": "FunctionParameter",
"layout": [
null,
null,
null,
{
"kind": "ModifierList",
"layout": [
{
"kind": "DeclModifier",
"layout": [
null,
{
"tokenKind": {
"kind": "identifier",
"text": "_const"
},
"leadingTrivia": "",
"trailingTrivia": " ",
"presence": "Present"
},
null,
null
],
"presence": "Present"
}
],
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "kw__"
},
"leadingTrivia": "",
"trailingTrivia": " ",
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "identifier",
"text": "map"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "colon"
},
"leadingTrivia": "",
"trailingTrivia": " ",
"presence": "Present"
},
null,
{
"kind": "SimpleTypeIdentifier",
"layout": [
null,
{
"tokenKind": {
"kind": "identifier",
"text": "String"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
null
],
"presence": "Present"
},
null,
null,
null,
null,
null,
null
],
"presence": "Present"
}
],
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "r_paren"
},
"leadingTrivia": "",
"trailingTrivia": " ",
"presence": "Present"
}
],
"presence": "Present"
},
null,
null,
null,
null,
null,
null
],
"presence": "Present"
},
null,
null,
null,
{
"kind": "CodeBlock",
"layout": [
null,
{
"tokenKind": {
"kind": "l_brace"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
{
"kind": "CodeBlockItemList",
"layout": [],
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "r_brace"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
}
],
"presence": "Present"
}
],
"presence": "Present"
},
null,
null,
null,
null
],
"presence": "Present"
},
{
"kind": "CodeBlockItem",
"layout": [
null,
{
"kind": "FunctionDecl",
"layout": [
null,
null,
null,
null,
null,
{
"tokenKind": {
"kind": "kw_func"
},
"leadingTrivia": "\n",
"trailingTrivia": " ",
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "identifier",
"text": "isolated"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
null,
null,
{
"kind": "FunctionSignature",
"layout": [
null,
{
"kind": "ParameterClause",
"layout": [
null,
{
"tokenKind": {
"kind": "l_paren"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
{
"kind": "FunctionParameterList",
"layout": [
{
"kind": "FunctionParameter",
"layout": [
null,
null,
null,
{
"kind": "ModifierList",
"layout": [
{
"kind": "DeclModifier",
"layout": [
null,
{
"tokenKind": {
"kind": "identifier",
"text": "isolated"
},
"leadingTrivia": "",
"trailingTrivia": " ",
"presence": "Present"
},
null,
null
],
"presence": "Present"
}
],
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "kw__"
},
"leadingTrivia": "",
"trailingTrivia": " ",
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "identifier",
"text": "map"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "colon"
},
"leadingTrivia": "",
"trailingTrivia": " ",
"presence": "Present"
},
null,
{
"kind": "SimpleTypeIdentifier",
"layout": [
null,
{
"tokenKind": {
"kind": "identifier",
"text": "String"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
null
],
"presence": "Present"
},
null,
null,
null,
null,
null,
null
],
"presence": "Present"
}
],
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "r_paren"
},
"leadingTrivia": "",
"trailingTrivia": " ",
"presence": "Present"
}
],
"presence": "Present"
},
null,
null,
null,
null,
null,
null
],
"presence": "Present"
},
null,
null,
null,
{
"kind": "CodeBlock",
"layout": [
null,
{
"tokenKind": {
"kind": "l_brace"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
},
null,
{
"kind": "CodeBlockItemList",
"layout": [],
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "r_brace"
},
"leadingTrivia": "",
"trailingTrivia": "",
"presence": "Present"
}
],
"presence": "Present"
}
],
"presence": "Present"
},
null,
null,
null,
null
],
"presence": "Present"
}
],
"presence": "Present"
},
null,
{
"tokenKind": {
"kind": "eof",
"text": ""
},
"leadingTrivia": "\n",
"trailingTrivia": "",
"presence": "Present"
}
],
"presence": "Present"
}

View File

@@ -0,0 +1,7 @@
// RUN: %swift-syntax-test -input-source-filename %s -serialize-raw-tree > %t
// RUN: diff %S/Inputs/serialize_functions.json %t -u
func oneName(name: String) {}
func oneName(firstName secondName: String) {}
func const(_const _ map: String) {}
func isolated(isolated _ map: String) {}