From 9c044fe1070447debb143bfa176af3ab1f1941f8 Mon Sep 17 00:00:00 2001 From: Rintaro Ishizaki Date: Thu, 27 Jun 2019 15:59:13 -0700 Subject: [PATCH] [Syntax] Fix tuple type element parsing * typo: `InoutToken` not `InOutToken` * Use `EllipsisToken` like function parameters. Otherwise `,` is stored at ellipsis position. rdar://problem/52291805 --- lib/Parse/ParseType.cpp | 1 + test/Syntax/serialize_tupletype.swift | 4 + test/Syntax/serialize_tupletype.swift.result | 281 +++++++++++++++++++ utils/gyb_syntax_support/TypeNodes.py | 4 +- 4 files changed, 288 insertions(+), 2 deletions(-) create mode 100644 test/Syntax/serialize_tupletype.swift create mode 100644 test/Syntax/serialize_tupletype.swift.result diff --git a/lib/Parse/ParseType.cpp b/lib/Parse/ParseType.cpp index 492dcab0985f8..845c68c230718 100644 --- a/lib/Parse/ParseType.cpp +++ b/lib/Parse/ParseType.cpp @@ -1021,6 +1021,7 @@ ParserResult Parser::parseTypeTupleBody() { // Parse optional '...'. if (Tok.isEllipsis()) { + Tok.setKind(tok::ellipsis); auto ElementEllipsisLoc = consumeToken(); if (EllipsisLoc.isInvalid()) { EllipsisLoc = ElementEllipsisLoc; diff --git a/test/Syntax/serialize_tupletype.swift b/test/Syntax/serialize_tupletype.swift new file mode 100644 index 0000000000000..20246475453e6 --- /dev/null +++ b/test/Syntax/serialize_tupletype.swift @@ -0,0 +1,4 @@ +// RUN: %swift-syntax-test -input-source-filename %s -serialize-raw-tree > %t.result +// RUN: diff %t.result %s.result + +typealias x = (_ b: Int, _: String) diff --git a/test/Syntax/serialize_tupletype.swift.result b/test/Syntax/serialize_tupletype.swift.result new file mode 100644 index 0000000000000..c39c59e238a9e --- /dev/null +++ b/test/Syntax/serialize_tupletype.swift.result @@ -0,0 +1,281 @@ +{ + "id": 24, + "kind": "SourceFile", + "layout": [ + { + "id": 23, + "kind": "CodeBlockItemList", + "layout": [ + { + "id": 21, + "kind": "CodeBlockItem", + "layout": [ + { + "id": 20, + "kind": "TypealiasDecl", + "layout": [ + null, + null, + { + "id": 1, + "tokenKind": { + "kind": "kw_typealias" + }, + "leadingTrivia": [ + { + "kind": "LineComment", + "value": "\/\/ RUN: %swift-syntax-test -input-source-filename %s -serialize-raw-tree > %t.result" + }, + { + "kind": "Newline", + "value": 1 + }, + { + "kind": "LineComment", + "value": "\/\/ RUN: diff %t.result %s.result" + }, + { + "kind": "Newline", + "value": 2 + } + ], + "trailingTrivia": [ + { + "kind": "Space", + "value": 1 + } + ], + "presence": "Present" + }, + { + "id": 2, + "tokenKind": { + "kind": "identifier", + "text": "x" + }, + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "Space", + "value": 1 + } + ], + "presence": "Present" + }, + null, + { + "id": 19, + "kind": "TypeInitializerClause", + "layout": [ + { + "id": 3, + "tokenKind": { + "kind": "equal" + }, + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "Space", + "value": 1 + } + ], + "presence": "Present" + }, + { + "id": 18, + "kind": "TupleType", + "layout": [ + { + "id": 4, + "tokenKind": { + "kind": "l_paren" + }, + "leadingTrivia": [], + "trailingTrivia": [], + "presence": "Present" + }, + { + "id": 16, + "kind": "TupleTypeElementList", + "layout": [ + { + "id": 11, + "kind": "TupleTypeElement", + "layout": [ + null, + { + "id": 5, + "tokenKind": { + "kind": "kw__" + }, + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "Space", + "value": 1 + } + ], + "presence": "Present" + }, + { + "id": 6, + "tokenKind": { + "kind": "identifier", + "text": "b" + }, + "leadingTrivia": [], + "trailingTrivia": [], + "presence": "Present" + }, + { + "id": 7, + "tokenKind": { + "kind": "colon" + }, + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "Space", + "value": 1 + } + ], + "presence": "Present" + }, + { + "id": 9, + "kind": "SimpleTypeIdentifier", + "layout": [ + { + "id": 8, + "tokenKind": { + "kind": "identifier", + "text": "Int" + }, + "leadingTrivia": [], + "trailingTrivia": [], + "presence": "Present" + }, + null + ], + "presence": "Present" + }, + null, + null, + { + "id": 10, + "tokenKind": { + "kind": "comma" + }, + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "Space", + "value": 1 + } + ], + "presence": "Present" + } + ], + "presence": "Present" + }, + { + "id": 15, + "kind": "TupleTypeElement", + "layout": [ + null, + { + "id": 12, + "tokenKind": { + "kind": "kw__" + }, + "leadingTrivia": [], + "trailingTrivia": [], + "presence": "Present" + }, + null, + { + "id": 7, + "tokenKind": { + "kind": "colon" + }, + "leadingTrivia": [], + "trailingTrivia": [ + { + "kind": "Space", + "value": 1 + } + ], + "presence": "Present" + }, + { + "id": 14, + "kind": "SimpleTypeIdentifier", + "layout": [ + { + "id": 13, + "tokenKind": { + "kind": "identifier", + "text": "String" + }, + "leadingTrivia": [], + "trailingTrivia": [], + "presence": "Present" + }, + null + ], + "presence": "Present" + }, + null, + null, + null + ], + "presence": "Present" + } + ], + "presence": "Present" + }, + { + "id": 17, + "tokenKind": { + "kind": "r_paren" + }, + "leadingTrivia": [], + "trailingTrivia": [], + "presence": "Present" + } + ], + "presence": "Present" + } + ], + "presence": "Present" + }, + null + ], + "presence": "Present" + }, + null, + null + ], + "presence": "Present" + } + ], + "presence": "Present" + }, + { + "id": 22, + "tokenKind": { + "kind": "eof", + "text": "" + }, + "leadingTrivia": [ + { + "kind": "Newline", + "value": 1 + } + ], + "trailingTrivia": [], + "presence": "Present" + } + ], + "presence": "Present" +} diff --git a/utils/gyb_syntax_support/TypeNodes.py b/utils/gyb_syntax_support/TypeNodes.py index 61f8fd84a72be..a9d8dfeabbb14 100644 --- a/utils/gyb_syntax_support/TypeNodes.py +++ b/utils/gyb_syntax_support/TypeNodes.py @@ -118,7 +118,7 @@ Node('TupleTypeElement', kind='Syntax', traits=['WithTrailingComma'], children=[ - Child('InOut', kind='InOutToken', + Child('InOut', kind='InoutToken', is_optional=True), Child('Name', kind='Token', is_optional=True, @@ -135,7 +135,7 @@ Child('Colon', kind='ColonToken', is_optional=True), Child('Type', kind='Type'), - Child('Ellipsis', kind='Token', + Child('Ellipsis', kind='EllipsisToken', is_optional=True), Child('Initializer', kind='InitializerClause', is_optional=True),