|
14 | 14 | #define SWIFT_PARSE_ASTGEN_H
|
15 | 15 |
|
16 | 16 | #include "swift/AST/ASTContext.h"
|
17 |
| -#include "swift/AST/Decl.h" |
18 | 17 | #include "swift/AST/Expr.h"
|
19 |
| -#include "swift/Parse/PersistentParserState.h" |
20 | 18 | #include "swift/Syntax/SyntaxNodes.h"
|
21 | 19 | #include "llvm/ADT/DenseMap.h"
|
22 | 20 |
|
23 | 21 | namespace swift {
|
24 | 22 | /// Generates AST nodes from Syntax nodes.
|
25 | 23 | class ASTGen {
|
26 | 24 | ASTContext &Context;
|
27 |
| - |
28 |
| - /// Type cache to prevent multiple transformations of the same syntax node. |
29 |
| - llvm::DenseMap<syntax::SyntaxNodeId, TypeRepr *> TypeCache; |
30 |
| - |
31 |
| - PersistentParserState **ParserState; |
32 |
| - |
33 |
| - // FIXME: remove when Syntax can represent all types and ASTGen can handle them |
34 |
| - /// Types that cannot be represented by Syntax or generated by ASTGen. |
35 |
| - llvm::DenseMap<SourceLoc, TypeRepr *> Types; |
| 25 | + // A stack of source locations of syntax constructs. Allows us to get the |
| 26 | + // SourceLoc necessary to create AST nodes for nodes in not-yet-complete |
| 27 | + // Syntax tree. The topmost item should always correspond to the token/node |
| 28 | + // that has been parsed/transformed most recently. |
| 29 | + // todo [gsoc]: remove when possible |
| 30 | + llvm::SmallVector<SourceLoc, 16> LocStack; |
36 | 31 |
|
37 | 32 | public:
|
38 |
| - ASTGen(ASTContext &Context, PersistentParserState **ParserState) |
39 |
| - : Context(Context), ParserState(ParserState) {} |
40 |
| - |
41 |
| - SourceLoc generate(syntax::TokenSyntax Tok, SourceLoc &Loc); |
42 |
| - |
43 |
| - Expr *generate(syntax::IntegerLiteralExprSyntax &Expr, SourceLoc &Loc); |
44 |
| - Expr *generate(syntax::FloatLiteralExprSyntax &Expr, SourceLoc &Loc); |
45 |
| - Expr *generate(syntax::NilLiteralExprSyntax &Expr, SourceLoc &Loc); |
46 |
| - Expr *generate(syntax::BooleanLiteralExprSyntax &Expr, SourceLoc &Loc); |
47 |
| - Expr *generate(syntax::PoundFileExprSyntax &Expr, SourceLoc &Loc); |
48 |
| - Expr *generate(syntax::PoundLineExprSyntax &Expr, SourceLoc &Loc); |
49 |
| - Expr *generate(syntax::PoundColumnExprSyntax &Expr, SourceLoc &Loc); |
50 |
| - Expr *generate(syntax::PoundFunctionExprSyntax &Expr, SourceLoc &Loc); |
51 |
| - Expr *generate(syntax::PoundDsohandleExprSyntax &Expr, SourceLoc &Loc); |
52 |
| - Expr *generate(syntax::UnknownExprSyntax &Expr, SourceLoc &Loc); |
53 |
| - |
54 |
| - TypeRepr *generate(syntax::TypeSyntax Type, SourceLoc &Loc); |
55 |
| - TypeRepr *generate(syntax::SomeTypeSyntax Type, SourceLoc &Loc); |
56 |
| - TypeRepr *generate(syntax::CompositionTypeSyntax Type, SourceLoc &Loc); |
57 |
| - TypeRepr *generate(syntax::SimpleTypeIdentifierSyntax Type, SourceLoc &Loc); |
58 |
| - TypeRepr *generate(syntax::MemberTypeIdentifierSyntax Type, SourceLoc &Loc); |
59 |
| - TypeRepr *generate(syntax::DictionaryTypeSyntax Type, SourceLoc &Loc); |
60 |
| - TypeRepr *generate(syntax::ArrayTypeSyntax Type, SourceLoc &Loc); |
61 |
| - TypeRepr *generate(syntax::TupleTypeSyntax Type, SourceLoc &Loc); |
62 |
| - TypeRepr *generate(syntax::AttributedTypeSyntax Type, SourceLoc &Loc); |
63 |
| - TypeRepr *generate(syntax::FunctionTypeSyntax Type, SourceLoc &Loc); |
64 |
| - TypeRepr *generate(syntax::MetatypeTypeSyntax Type, SourceLoc &Loc); |
65 |
| - TypeRepr *generate(syntax::OptionalTypeSyntax Type, SourceLoc &Loc); |
66 |
| - TypeRepr *generate(syntax::ImplicitlyUnwrappedOptionalTypeSyntax Type, SourceLoc &Loc); |
67 |
| - TypeRepr *generate(syntax::UnknownTypeSyntax Type, SourceLoc &Loc); |
68 |
| - |
69 |
| - TypeRepr *generate(syntax::GenericArgumentSyntax Arg, SourceLoc &Loc); |
70 |
| - llvm::SmallVector<TypeRepr *, 4> |
71 |
| - generate(syntax::GenericArgumentListSyntax Args, SourceLoc &Loc); |
| 33 | + explicit ASTGen(ASTContext &Context) : Context(Context) {} |
| 34 | + |
| 35 | + IntegerLiteralExpr *generate(syntax::IntegerLiteralExprSyntax &Expr); |
| 36 | + FloatLiteralExpr *generate(syntax::FloatLiteralExprSyntax &Expr); |
| 37 | + NilLiteralExpr *generate(syntax::NilLiteralExprSyntax &Expr); |
| 38 | + BooleanLiteralExpr *generate(syntax::BooleanLiteralExprSyntax &Expr); |
| 39 | + MagicIdentifierLiteralExpr *generate(syntax::PoundFileExprSyntax &Expr); |
| 40 | + MagicIdentifierLiteralExpr *generate(syntax::PoundLineExprSyntax &Expr); |
| 41 | + MagicIdentifierLiteralExpr *generate(syntax::PoundColumnExprSyntax &Expr); |
| 42 | + MagicIdentifierLiteralExpr *generate(syntax::PoundFunctionExprSyntax &Expr); |
| 43 | + MagicIdentifierLiteralExpr *generate(syntax::PoundDsohandleExprSyntax &Expr); |
| 44 | + Expr *generate(syntax::UnknownExprSyntax &Expr); |
| 45 | + |
| 46 | + /// Stores source location necessary for AST creation. |
| 47 | + void pushLoc(SourceLoc Loc); |
72 | 48 |
|
73 | 49 | /// Copy a numeric literal value into AST-owned memory, stripping underscores
|
74 | 50 | /// so the semantic part of the value can be parsed by APInt/APFloat parsers.
|
75 | 51 | static StringRef copyAndStripUnderscores(StringRef Orig, ASTContext &Context);
|
76 | 52 |
|
77 | 53 | private:
|
78 |
| - Expr *generateMagicIdentifierLiteralExpression(syntax::TokenSyntax PoundToken, |
79 |
| - SourceLoc &Loc); |
80 |
| - |
81 |
| - TupleTypeRepr *generateTuple(syntax::TokenSyntax LParen, |
82 |
| - syntax::TupleTypeElementListSyntax Elements, |
83 |
| - syntax::TokenSyntax RParen, SourceLoc &Loc, |
84 |
| - bool IsFunction = false); |
85 |
| - |
86 |
| - void gatherTypeIdentifierComponents( |
87 |
| - syntax::TypeSyntax Component, SourceLoc &Loc, |
88 |
| - llvm::SmallVectorImpl<ComponentIdentTypeRepr *> &Components); |
89 |
| - |
90 |
| - template <typename T> |
91 |
| - TypeRepr *generateSimpleOrMemberIdentifier(T Type, SourceLoc &Loc); |
92 |
| - |
93 |
| - template <typename T> |
94 |
| - ComponentIdentTypeRepr *generateIdentifier(T Type, SourceLoc &Loc); |
95 |
| - |
96 | 54 | StringRef copyAndStripUnderscores(StringRef Orig);
|
97 | 55 |
|
98 |
| - static SourceLoc advanceLocBegin(const SourceLoc &Loc, |
99 |
| - const syntax::Syntax &Node); |
100 |
| - static SourceLoc advanceLocEnd(const SourceLoc &Loc, |
101 |
| - const syntax::TokenSyntax &Token); |
102 |
| - static SourceLoc advanceLocAfter(const SourceLoc &Loc, |
103 |
| - const syntax::Syntax &Node); |
104 |
| - |
105 |
| - static MagicIdentifierLiteralExpr::Kind getMagicIdentifierLiteralKind(tok Kind); |
106 |
| - |
107 |
| - ValueDecl *lookupInScope(DeclName Name); |
108 |
| - |
109 |
| - TypeRepr *cacheType(syntax::TypeSyntax Type, TypeRepr *TypeAST); |
110 |
| - |
111 |
| - TypeRepr *lookupType(syntax::TypeSyntax Type); |
112 |
| - |
113 |
| -public: |
114 |
| - TypeRepr *addType(TypeRepr *Type, const SourceLoc &Loc); |
| 56 | + SourceLoc topLoc(); |
115 | 57 |
|
116 |
| - bool hasType(const SourceLoc &Loc) const; |
| 58 | + MagicIdentifierLiteralExpr * |
| 59 | + generateMagicIdentifierLiteralExpr(const syntax::TokenSyntax &PoundToken); |
117 | 60 |
|
118 |
| - TypeRepr *getType(const SourceLoc &Loc) const; |
| 61 | + /// Map magic literal tokens such as #file to their MagicIdentifierLiteralExpr |
| 62 | + /// kind. |
| 63 | + static MagicIdentifierLiteralExpr::Kind |
| 64 | + getMagicIdentifierLiteralKind(tok Kind); |
119 | 65 | };
|
120 | 66 | } // namespace swift
|
121 | 67 |
|
|
0 commit comments