Skip to content

Commit a5be820

Browse files
committed
Revert "Revert "Merge pull request swiftlang#27565 from rintaro/syntaxparse-exprcollection""
This reverts commit 2f40f24.
1 parent 81a8ab3 commit a5be820

17 files changed

+736
-555
lines changed

include/swift/AST/TypeRepr.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,7 @@ struct TupleTypeReprElement {
653653
TypeRepr *Type;
654654
SourceLoc TrailingCommaLoc;
655655

656-
TupleTypeReprElement() {}
656+
TupleTypeReprElement(): Type(nullptr) {}
657657
TupleTypeReprElement(TypeRepr *Type): Type(Type) {}
658658
};
659659

include/swift/Parse/ASTGen.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ class ASTGen {
3737

3838
// FIXME: remove when Syntax can represent all types and ASTGen can handle
3939
// them
40+
/// Exprs that cannot be represented by Syntax or generated by ASTGen.
41+
llvm::DenseMap<SourceLoc, Expr *> Exprs;
42+
4043
/// Decl attributes that cannot be represented by Syntax or generated by
4144
/// ASTGen.
4245
llvm::DenseMap<SourceLoc, DeclAttributes> ParsedDeclAttrs;
@@ -81,6 +84,9 @@ class ASTGen {
8184

8285
Expr *generate(const syntax::ExprSyntax &Expr, const SourceLoc Loc);
8386
Expr *generate(const syntax::IdentifierExprSyntax &Expr, const SourceLoc Loc);
87+
Expr *generate(const syntax::SuperRefExprSyntax &Expr, const SourceLoc Loc);
88+
Expr *generate(const syntax::ArrayExprSyntax &Expr, const SourceLoc Loc);
89+
Expr *generate(const syntax::DictionaryExprSyntax &Expr, const SourceLoc Loc);
8490
Expr *generate(const syntax::EditorPlaceholderExprSyntax &Expr,
8591
const SourceLoc Loc);
8692
Expr *generate(const syntax::SpecializeExprSyntax &Expr, const SourceLoc Loc);
@@ -107,6 +113,7 @@ class ASTGen {
107113
const SourceLoc Loc);
108114

109115
private:
116+
void validateCollectionElement(Expr *elementExpr);
110117

111118
Expr *generateMagicIdentifierLiteralExpression(
112119
const syntax::TokenSyntax &PoundToken, const SourceLoc Loc);
@@ -210,6 +217,13 @@ class ASTGen {
210217
static SourceLoc advanceLocBegin(const SourceLoc &Loc,
211218
const syntax::Syntax &Node);
212219

220+
/// Advance \p Loc to the last non-missing token of the \p Node or, if it
221+
/// doesn't contain any, the last non-missing token preceding it in the tree.
222+
/// \p Loc must be the leading trivia of the first token in the tree in which
223+
/// \p Node resides
224+
static SourceLoc advanceLocEnd(const SourceLoc &Loc,
225+
const syntax::Syntax &Node);
226+
213227
ValueDecl *lookupInScope(DeclName Name);
214228

215229
void addToScope(ValueDecl *D, bool diagnoseRedefinitions = true);
@@ -219,9 +233,13 @@ class ASTGen {
219233
TypeRepr *lookupType(syntax::TypeSyntax Type);
220234

221235
public:
236+
void addExpr(Expr *Expr, const SourceLoc Loc);
237+
bool hasExpr(const SourceLoc Loc) const;
238+
Expr *takeExpr(const SourceLoc Loc);
239+
222240
void addDeclAttributes(DeclAttributes attrs, const SourceLoc Loc);
223241
bool hasDeclAttributes(SourceLoc Loc) const;
224-
DeclAttributes getDeclAttributes(const SourceLoc Loc) const;
242+
DeclAttributes takeDeclAttributes(const SourceLoc Loc);
225243
};
226244
} // namespace swift
227245

include/swift/Parse/ParsedRawSyntaxNode.h

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class ParsedRawSyntaxNode {
5252
};
5353
struct DeferredLayoutNode {
5454
MutableArrayRef<ParsedRawSyntaxNode> Children;
55+
CharSourceRange Range;
5556
};
5657
struct DeferredTokenNode {
5758
const ParsedTriviaPiece *TriviaPieces;
@@ -72,9 +73,9 @@ class ParsedRawSyntaxNode {
7273
/// Primary used for capturing a deferred missing token.
7374
bool IsMissing = false;
7475

75-
ParsedRawSyntaxNode(syntax::SyntaxKind k,
76+
ParsedRawSyntaxNode(syntax::SyntaxKind k, CharSourceRange r,
7677
MutableArrayRef<ParsedRawSyntaxNode> deferredNodes)
77-
: DeferredLayout({deferredNodes}),
78+
: DeferredLayout({deferredNodes, r}),
7879
SynKind(uint16_t(k)), TokKind(uint16_t(tok::unknown)),
7980
DK(DataKind::DeferredLayout) {
8081
assert(getKind() == k && "Syntax kind with too large value!");
@@ -211,14 +212,12 @@ class ParsedRawSyntaxNode {
211212
return copy;
212213
}
213214

214-
CharSourceRange getDeferredRange(bool includeTrivia) const {
215+
CharSourceRange getDeferredRange() const {
215216
switch (DK) {
216217
case DataKind::DeferredLayout:
217-
return getDeferredLayoutRange(includeTrivia);
218+
return getDeferredLayoutRange();
218219
case DataKind::DeferredToken:
219-
return includeTrivia
220-
? getDeferredTokenRangeWithTrivia()
221-
: getDeferredTokenRange();
220+
return getDeferredTokenRangeWithTrivia();
222221
default:
223222
llvm_unreachable("node not deferred");
224223
}
@@ -243,20 +242,9 @@ class ParsedRawSyntaxNode {
243242

244243
// Deferred Layout Data ====================================================//
245244

246-
CharSourceRange getDeferredLayoutRange(bool includeTrivia) const {
245+
CharSourceRange getDeferredLayoutRange() const {
247246
assert(DK == DataKind::DeferredLayout);
248-
auto HasValidRange = [includeTrivia](const ParsedRawSyntaxNode &Child) {
249-
return !Child.isNull() && !Child.isMissing() &&
250-
Child.getDeferredRange(includeTrivia).isValid();
251-
};
252-
auto first = llvm::find_if(getDeferredChildren(), HasValidRange);
253-
if (first == getDeferredChildren().end())
254-
return CharSourceRange();
255-
auto last = llvm::find_if(llvm::reverse(getDeferredChildren()),
256-
HasValidRange);
257-
auto firstRange = first->getDeferredRange(includeTrivia);
258-
firstRange.widen(last->getDeferredRange(includeTrivia));
259-
return firstRange;
247+
return DeferredLayout.Range;
260248
}
261249
ArrayRef<ParsedRawSyntaxNode> getDeferredChildren() const {
262250
assert(DK == DataKind::DeferredLayout);

include/swift/Parse/ParsedSyntaxNodes.h.gyb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ namespace swift {
3232
% if not node.is_syntax_collection():
3333
class Parsed${node.name};
3434
% end
35+
% if node.is_buildable():
36+
class Parsed${node.name}Builder;
37+
% end
3538
% end
3639

3740
% for node in SYNTAX_NODES + PARSEONLY_NODES:
@@ -79,6 +82,10 @@ public:
7982
static bool classof(const ParsedSyntax *S) {
8083
return kindof(S->getKind());
8184
}
85+
86+
% if node.is_buildable():
87+
using Builder = Parsed${node.name}Builder;
88+
% end
8289
};
8390

8491
% end

include/swift/Parse/Parser.h

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -917,12 +917,12 @@ class Parser {
917917
bool AllowSepAfterLast, Diag<> ErrorDiag,
918918
syntax::SyntaxKind Kind,
919919
llvm::function_ref<ParserStatus()> callback);
920-
ParserStatus parseListSyntax(tok RightK, SourceLoc LeftLoc,
921-
llvm::Optional<ParsedTokenSyntax> &LastComma,
922-
llvm::Optional<ParsedTokenSyntax> &Right,
923-
llvm::SmallVectorImpl<ParsedSyntax>& Junk,
924-
bool AllowSepAfterLast, Diag<> ErrorDiag,
925-
llvm::function_ref<ParserStatus()> callback);
920+
template <typename ParsedNode>
921+
ParserStatus parseListSyntax(
922+
SmallVectorImpl<ParsedNode> &elements, bool AllowEmpty,
923+
bool AllowSepAfterLast, llvm::function_ref<bool()> isAtCloseTok,
924+
llvm::function_ref<ParserStatus(typename ParsedNode::Builder &)>
925+
callback);
926926

927927
void consumeTopLevelDecl(ParserPosition BeginParserPosition,
928928
TopLevelCodeDecl *TLCD);
@@ -1428,6 +1428,7 @@ class Parser {
14281428

14291429
//===--------------------------------------------------------------------===//
14301430
// Expression Parsing
1431+
ParsedSyntaxResult<ParsedExprSyntax> parseExpressionSyntax(Diag<> ID);
14311432
ParserResult<Expr> parseExpr(Diag<> ID) {
14321433
return parseExprImpl(ID, /*isExprBasic=*/false);
14331434
}
@@ -1454,6 +1455,7 @@ class Parser {
14541455
ParserResult<Expr> parseExprKeyPath();
14551456
ParserResult<Expr> parseExprSelector();
14561457
ParserResult<Expr> parseExprSuper();
1458+
ParsedSyntaxResult<ParsedExprSyntax> parseExprSuperSyntax();
14571459
ParserResult<Expr> parseExprStringLiteral();
14581460

14591461
// todo [gsoc]: create new result type for ParsedSyntax
@@ -1581,15 +1583,23 @@ class Parser {
15811583
ParserResult<Expr> parseExprCallSuffix(ParserResult<Expr> fn,
15821584
bool isExprBasic);
15831585
ParserResult<Expr> parseExprCollection();
1584-
ParserResult<Expr> parseExprCollectionElement(Optional<bool> &isDictionary);
1586+
ParsedSyntaxResult<ParsedExprSyntax> parseExprCollectionSyntax();
1587+
ParsedSyntaxResult<ParsedExprSyntax>
1588+
parseExprArraySyntax(ParsedTokenSyntax &&LSquare, SourceLoc LSquareLoc,
1589+
ParsedSyntaxResult<ParsedExprSyntax> &&firstExpr);
1590+
ParsedSyntaxResult<ParsedExprSyntax>
1591+
parseExprDictionarySyntax(ParsedTokenSyntax &&LSquare, SourceLoc LSquareLoc,
1592+
ParsedSyntaxResult<ParsedExprSyntax> &&firstExpr);
1593+
15851594
ParserResult<Expr> parseExprPoundUnknown(SourceLoc LSquareLoc);
1595+
ParsedSyntaxResult<ParsedExprSyntax>
1596+
parseExprPoundUnknownSyntax(Optional<ParsedTokenSyntax> &&LSquare,
1597+
SourceLoc LSquareLoc);
15861598
ParserResult<Expr>
15871599
parseExprPoundCodeCompletion(Optional<StmtKind> ParentKind);
15881600

15891601
UnresolvedDeclRefExpr *parseExprOperator();
15901602

1591-
void validateCollectionElement(ParserResult<Expr> element);
1592-
15931603
//===--------------------------------------------------------------------===//
15941604
// Statement Parsing
15951605

include/swift/Syntax/Syntax.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ class Syntax {
169169
/// Returns true if the node is "present" in the source.
170170
bool isPresent() const;
171171

172+
/// Get the node immediately before this current node that does contain a
173+
/// non-missing token. Return nullptr if we cannot find such node.
174+
Optional<Syntax> getPreviousNode() const;
172175

173176
/// Returns the first non-missing token in this syntax. Returns None if there
174177
/// is no non-missing token.

0 commit comments

Comments
 (0)