Skip to content

Commit 631c7d8

Browse files
[Syntax] Refactor Tuple Type Syntax (#8254)
* Refactor Tuple Type Syntax This patch: - Refactors TypeArgumentListSyntax and TypeArgumentListSyntaxData to use the SyntaxCollection and SyntaxCollectionData APIs. - Refactors TupleTypeElementSyntax to own its trailing comma, and updates the tests accordingly. - Provides an infrastructure for promoting types to use the SyntaxCollection APIs * Addressed comments. * Renamed makeBlankTypeArgumentList() * Update makeTupleType * Changed makeTupleType to take an element list. * Updated comment. * Improved API for creating TupleTypeElementListSyntax'es * Added round-trip test * Removed last TypeArgumentList holdovers. * Fixed round-trip test invocation
1 parent f0feadb commit 631c7d8

File tree

14 files changed

+255
-195
lines changed

14 files changed

+255
-195
lines changed

include/swift/Syntax/RawSyntax.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ class AbsolutePosition {
150150
enum class SyntaxKind {
151151
Token,
152152
#define SYNTAX(Id, Parent) Id,
153+
#define SYNTAX_COLLECTION(Id, Element) Id,
153154
#define MISSING_SYNTAX(Id, Parent) Id,
154155
#define SYNTAX_RANGE(Id, First, Last) First_##Id = First, Last_##Id = Last,
155156
#include "swift/Syntax/SyntaxKinds.def"

include/swift/Syntax/Rewriter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ struct SyntaxRewriter {
4040
virtual Id##Syntax rewrite##Id(Id##Syntax Node) { \
4141
return Node; \
4242
}
43+
#define SYNTAX_COLLECTION(Id, Element) SYNTAX(Id, {})
4344
#include "swift/Syntax/SyntaxKinds.def"
4445
virtual ~SyntaxRewriter() = default;
4546
};

include/swift/Syntax/SyntaxCollection.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,18 @@ class SyntaxCollection : public Syntax {
5454
friend class Syntax;
5555
using DataType = SyntaxCollectionData<CollectionKind, Element>;
5656

57+
private:
58+
static RC<DataType>
59+
makeData(std::vector<Element> &Elements) {
60+
RawSyntax::LayoutList List;
61+
for (auto &Elt : Elements) {
62+
List.push_back(Elt.getRaw());
63+
}
64+
auto Raw = RawSyntax::make(CollectionKind, List,
65+
SourcePresence::Present);
66+
return DataType::make(Raw);
67+
}
68+
5769
protected:
5870
SyntaxCollection(const RC<SyntaxData> Root, const DataType *Data)
5971
: Syntax(Root, Data) {}
@@ -189,6 +201,12 @@ class SyntaxCollection : public Syntax {
189201
}
190202
};
191203

204+
#define SYNTAX(Id, Parent)
205+
#define SYNTAX_COLLECTION(Id, Element) \
206+
class Element; \
207+
using Id##Syntax = SyntaxCollection<SyntaxKind::Id, Element>;
208+
#include "swift/Syntax/SyntaxKinds.def"
209+
192210
} // end namespace syntax
193211
} // end namespace swift
194212

include/swift/Syntax/SyntaxCollectionData.h

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,6 @@ class SyntaxCollectionData : public SyntaxData {
3030
friend class SyntaxData;
3131
friend class FunctionCallExprSyntaxBuilder;
3232

33-
SyntaxCollectionData(RC<RawSyntax> Raw, const SyntaxData *Parent = nullptr,
34-
CursorIndex IndexInParent = 0)
35-
: SyntaxData(Raw, Parent, IndexInParent),
36-
CachedElements(Raw->Layout.size(), nullptr) {
37-
assert(Raw->Kind == CollectionKind);
38-
}
3933

4034
static RC<SyntaxCollectionData<CollectionKind, ElementType>>
4135
make(RC<RawSyntax> Raw, const SyntaxData *Parent = nullptr,
@@ -53,12 +47,26 @@ class SyntaxCollectionData : public SyntaxData {
5347
return make(Raw);
5448
}
5549

50+
protected:
51+
SyntaxCollectionData(RC<RawSyntax> Raw, const SyntaxData *Parent = nullptr,
52+
CursorIndex IndexInParent = 0)
53+
: SyntaxData(Raw, Parent, IndexInParent),
54+
CachedElements(Raw->Layout.size(), nullptr) {
55+
assert(Raw->Kind == CollectionKind);
56+
}
57+
5658
public:
5759
static bool classof(const SyntaxData *SD) {
5860
return SD->getKind() == CollectionKind;
5961
}
6062
};
6163

64+
#define SYNTAX(Id, Parent)
65+
#define SYNTAX_COLLECTION(Id, Element) \
66+
class Element; \
67+
using Id##SyntaxData = SyntaxCollectionData<SyntaxKind::Id, Element>;
68+
#include "swift/Syntax/SyntaxKinds.def"
69+
6270
} // end namespace syntax
6371
} // end namespace swift
6472

include/swift/Syntax/SyntaxFactory.h

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -474,12 +474,27 @@ struct SyntaxFactory {
474474
/// Make a bare "()" void tuple type
475475
static TupleTypeSyntax makeVoidTupleType();
476476

477+
/// Make a tuple type from a type element list and the provided left/right
478+
/// paren tokens.
479+
static TupleTypeSyntax
480+
makeTupleType(RC<TokenSyntax> LParen,
481+
TupleTypeElementListSyntax Elements,
482+
RC<TokenSyntax> RParen);
483+
477484
/// Make a tuple type element of the form 'Name: ElementType'
478485
static TupleTypeElementSyntax
479-
makeTupleTypeElement(RC<TokenSyntax> Name, TypeSyntax ElementType);
486+
makeTupleTypeElement(RC<TokenSyntax> Name, RC<TokenSyntax> Colon,
487+
TypeSyntax ElementType,
488+
llvm::Optional<RC<TokenSyntax>> MaybeComma = llvm::None);
480489

481490
/// Make a tuple type element without a label.
482-
static TupleTypeElementSyntax makeTupleTypeElement(TypeSyntax ElementType);
491+
static TupleTypeElementSyntax
492+
makeTupleTypeElement(TypeSyntax ElementType,
493+
llvm::Optional<RC<TokenSyntax>> MaybeComma = llvm::None);
494+
495+
/// Make a tuple type element list.
496+
static TupleTypeElementListSyntax
497+
makeTupleTypeElementList(std::vector<TupleTypeElementSyntax> ElementTypes);
483498

484499
#pragma mark - optional-type
485500

@@ -564,17 +579,17 @@ struct SyntaxFactory {
564579
static FunctionTypeSyntax
565580
makeFunctionType(TypeAttributesSyntax TypeAttributes,
566581
RC<TokenSyntax> LeftParen,
567-
TypeArgumentListSyntax ArgumentList,
582+
TupleTypeElementListSyntax ArgumentList,
568583
RC<TokenSyntax> RightParen, RC<TokenSyntax> ThrowsOrRethrows,
569584
RC<TokenSyntax> Arrow, TypeSyntax ReturnType);
570585

571586
/// Make a function type with all elements marked as missing.
572587
static FunctionTypeSyntax makeBlankFunctionType();
573588

574-
#pragma mark - type-argument-list
589+
#pragma mark - tuple-type-element-list
575590

576591
/// Make a list of type arguments with all elements marked as missing.
577-
static TypeArgumentListSyntax makeBlankTypeArgumentList();
592+
static TupleTypeElementListSyntax makeBlankTupleTypeElementList();
578593

579594
#pragma mark - Generics
580595

include/swift/Syntax/SyntaxKinds.def

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@
3232
#define MISSING_SYNTAX(Id, Parent)
3333
#endif
3434

35+
#ifndef SYNTAX_COLLECTION
36+
#define SYNTAX_COLLECTION(Id, Element)
37+
#endif
38+
3539
SYNTAX(Unknown, Syntax)
3640

3741
// Decls
@@ -56,7 +60,6 @@ SYNTAX(GenericArgumentList, Syntax)
5660
ABSTRACT_SYNTAX(GenericRequirementSyntax, Syntax)
5761
SYNTAX(ConformanceRequirement, GenericRequirementSyntax)
5862
SYNTAX(SameTypeRequirement, GenericRequirementSyntax)
59-
SYNTAX(TypeArgumentList, Syntax)
6063

6164
// Types
6265
ABSTRACT_SYNTAX(TypeSyntax, Syntax)
@@ -106,6 +109,9 @@ SYNTAX(FunctionParameter, Syntax)
106109
SYNTAX(DeclModifier, Syntax)
107110
SYNTAX(DeclModifierList, Syntax)
108111

112+
SYNTAX_COLLECTION(TupleTypeElementList, TupleTypeElementSyntax)
113+
114+
#undef SYNTAX_COLLECTION
109115
#undef ABSTRACT_SYNTAX
110116
#undef DECL
111117
#undef STMT

include/swift/Syntax/TypeSyntax.h

Lines changed: 18 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -315,27 +315,6 @@ class TypeIdentifierSyntax final : public TypeSyntax {
315315
}
316316
};
317317

318-
#pragma mark - type-argument-list Data
319-
320-
class TypeArgumentListSyntaxData final : public SyntaxData {
321-
friend class SyntaxData;
322-
friend struct SyntaxFactory;
323-
324-
TypeArgumentListSyntaxData(RC<RawSyntax> Raw,
325-
const SyntaxData *Parent = nullptr,
326-
CursorIndex IndexInParent = 0);
327-
328-
static RC<TypeArgumentListSyntaxData> make(RC<RawSyntax> Raw,
329-
const SyntaxData *Parent = nullptr,
330-
CursorIndex IndexInParent = 0);
331-
static RC<TypeArgumentListSyntaxData> makeBlank();
332-
333-
public:
334-
static bool classof(const SyntaxData *S) {
335-
return S->getKind() == SyntaxKind::TypeArgumentList;
336-
}
337-
};
338-
339318
#pragma mark - tuple-type-element Data
340319

341320
class TupleTypeElementSyntaxData final : public SyntaxData {
@@ -366,19 +345,20 @@ class TupleTypeElementSyntax final : public Syntax {
366345
friend class TupleTypeElementSyntaxData;
367346
friend class SyntaxData;
368347

369-
using DataType = TupleTypeElementSyntaxData;
370-
371348
enum class Cursor : CursorIndex {
372349
Label,
373350
ColonToken,
374351
Attributes,
375352
InoutToken,
376353
Type,
354+
CommaToken,
377355
};
378356

379357
TupleTypeElementSyntax(RC<SyntaxData> Root,
380358
const TupleTypeElementSyntaxData *Data);
381359
public:
360+
using DataType = TupleTypeElementSyntaxData;
361+
382362
/// Return the label of the tuple type element.
383363
RC<TokenSyntax> getLabel() const;
384364

@@ -393,6 +373,14 @@ class TupleTypeElementSyntax final : public Syntax {
393373
TupleTypeElementSyntax
394374
withColonToken(RC<TokenSyntax> NewColonToken) const;
395375

376+
/// Return the comma token of the tuple type element.
377+
RC<TokenSyntax> getCommaToken() const;
378+
379+
/// Return a new named tuple type element with a comma token replacement
380+
/// using the specified leading and trailing trivia.
381+
TupleTypeElementSyntax
382+
withCommaToken(RC<TokenSyntax> NewCommaToken) const;
383+
396384
/// Return the type attributes for the tuple type element.
397385
TypeAttributesSyntax getTypeAttributes() const;
398386

@@ -415,33 +403,7 @@ class TupleTypeElementSyntax final : public Syntax {
415403
return S->getKind() == SyntaxKind::TupleTypeElement;
416404
}
417405
};
418-
419-
420-
#pragma mark - type-argument-list API
421-
422-
/// type-argument-list
423-
/// -> function-type-argument
424-
/// | function-type-argument ',' function-type-argument-list
425-
class TypeArgumentListSyntax final : public Syntax {
426-
friend struct SyntaxFactory;
427-
friend class SyntaxData;
428-
429-
using DataType = TypeArgumentListSyntaxData;
430-
431-
TypeArgumentListSyntax(RC<SyntaxData> Root,
432-
const TypeArgumentListSyntaxData *Data);
433-
434-
public:
435-
// TODO: TODO: getType
436-
TypeArgumentListSyntax
437-
addType(llvm::Optional<RC<TokenSyntax>> MaybeComma,
438-
TupleTypeElementSyntax NewTypeArgument) const;
439-
440-
static bool classof(const Syntax *S) {
441-
return S->getKind() == SyntaxKind::TypeArgumentList;
442-
}
443-
};
444-
406+
445407
#pragma mark - tuple-type Data
446408

447409
class TupleTypeSyntaxData final : public TypeSyntaxData {
@@ -476,7 +438,7 @@ class TupleTypeSyntax final : public TypeSyntax {
476438

477439
enum class Cursor : CursorIndex {
478440
LeftParenToken,
479-
TypeArgumentList,
441+
TypeElementList,
480442
RightParenToken,
481443
};
482444

@@ -488,11 +450,11 @@ class TupleTypeSyntax final : public TypeSyntax {
488450
TupleTypeSyntax withLeftParen(RC<TokenSyntax> NewLeftParen) const;
489451

490452
/// Get the type argument list inside the tuple type syntax.
491-
TypeArgumentListSyntax getTypeArgumentList() const;
453+
TupleTypeElementListSyntax getTypeElementList() const;
492454

493455
/// Return a new tuple type syntax with the given type argument list.
494456
TupleTypeSyntax
495-
withTypeArgumentList(TypeArgumentListSyntax NewTypeArgumentList) const;
457+
withTypeElementList(TupleTypeElementListSyntax NewTypeElementList) const;
496458

497459
/// Return the right paren ')' token surrounding the tuple type syntax.
498460
RC<TokenSyntax> getRightParen() const;
@@ -519,8 +481,7 @@ class TupleTypeSyntaxBuilder final {
519481

520482
/// Add an element type to the eventual tuple type syntax.
521483
TupleTypeSyntaxBuilder &
522-
addElementTypeSyntax(llvm::Optional<RC<TokenSyntax>> MaybeComma,
523-
TupleTypeElementSyntax ElementTypeSyntax);
484+
addElementTypeSyntax(TupleTypeElementSyntax ElementTypeSyntax);
524485

525486
/// Use the given left paren '(' token when building the tuple type syntax.
526487
TupleTypeSyntaxBuilder &useRightParen(RC<TokenSyntax> RightParen);
@@ -973,13 +934,13 @@ class FunctionTypeSyntax final : public TypeSyntax {
973934
FunctionTypeArgumentSyntax NewArgument) const;
974935

975936
/// Return the type arguments list for this function type syntax.
976-
TypeArgumentListSyntax getTypeArgumentList() const;
937+
TupleTypeElementListSyntax getTypeElementList() const;
977938

978939
/// Return a new function type with the given type argument list.
979940
///
980941
/// This replaces all of the argument types.
981942
FunctionTypeSyntax
982-
withTypeArgumentList(TypeArgumentListSyntax NewArgumentList) const;
943+
withTypeElementList(TupleTypeElementListSyntax NewArgumentList) const;
983944

984945
/// Return the right parenthesis ')' token surrounding the argument type.
985946
RC<TokenSyntax> getRightArgumentsParen() const;

lib/Syntax/GenericSyntax.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ GenericArgumentClauseSyntaxData::makeBlank() {
374374
auto Raw = RawSyntax::make(SyntaxKind::GenericArgumentClause,
375375
{
376376
TokenSyntax::missingToken(tok::l_angle, "<"),
377-
RawSyntax::missing(SyntaxKind::TypeArgumentList),
377+
RawSyntax::missing(SyntaxKind::GenericArgumentList),
378378
TokenSyntax::missingToken(tok::r_angle, ">"),
379379
},
380380
SourcePresence::Present);
@@ -439,7 +439,7 @@ useRightAngleBracket(RC<TokenSyntax> RightAngle) {
439439

440440

441441
GenericArgumentClauseSyntax GenericArgumentClauseBuilder::build() const {
442-
auto ArgListRaw = RawSyntax::make(SyntaxKind::TypeArgumentList,
442+
auto ArgListRaw = RawSyntax::make(SyntaxKind::GenericParameterList,
443443
ArgumentListLayout,
444444
SourcePresence::Present);
445445
auto Raw = RawSyntax::make(SyntaxKind::GenericArgumentClause,

lib/Syntax/RawSyntax.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ void dumpSyntaxKind(llvm::raw_ostream &OS, const SyntaxKind Kind) {
2828
OS << #Id; \
2929
break;
3030
#define MISSING_SYNTAX(Id, Parent) SYNTAX(Id, Parent)
31+
#define SYNTAX_COLLECTION(Id, Element) SYNTAX(Id, {})
3132
#include "swift/Syntax/SyntaxKinds.def"
3233
case SyntaxKind::Token: OS << "Token"; break;
3334
}

lib/Syntax/SyntaxData.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ RC<SyntaxData> SyntaxData::makeDataFromRaw(RC<RawSyntax> Raw,
4141
case SyntaxKind::Id: \
4242
return ParentType##Data::make(Raw, Parent, IndexInParent);
4343

44+
#define SYNTAX_COLLECTION(Id, Element) SYNTAX(Id, {})
45+
4446
#include "swift/Syntax/SyntaxKinds.def"
4547
case SyntaxKind::Token:
4648
llvm_unreachable("Can't make a SyntaxData from a Token!");

0 commit comments

Comments
 (0)