|
14 | 14 | #define SWIFT_PARSE_ASTGEN_H
|
15 | 15 |
|
16 | 16 | #include "swift/AST/ASTContext.h"
|
| 17 | +#include "swift/AST/Decl.h" |
17 | 18 | #include "swift/AST/Expr.h"
|
| 19 | +#include "swift/Parse/PersistentParserState.h" |
18 | 20 | #include "swift/Syntax/SyntaxNodes.h"
|
19 | 21 | #include "llvm/ADT/DenseMap.h"
|
20 | 22 |
|
21 | 23 | namespace swift {
|
22 | 24 | /// Generates AST nodes from Syntax nodes.
|
23 | 25 | class ASTGen {
|
24 | 26 | ASTContext &Context;
|
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; |
| 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; |
31 | 36 |
|
32 | 37 | public:
|
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); |
| 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); |
48 | 72 |
|
49 | 73 | /// Copy a numeric literal value into AST-owned memory, stripping underscores
|
50 | 74 | /// so the semantic part of the value can be parsed by APInt/APFloat parsers.
|
51 | 75 | static StringRef copyAndStripUnderscores(StringRef Orig, ASTContext &Context);
|
52 | 76 |
|
53 | 77 | 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 | + |
54 | 96 | StringRef copyAndStripUnderscores(StringRef Orig);
|
55 | 97 |
|
56 |
| - SourceLoc topLoc(); |
| 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); |
57 | 115 |
|
58 |
| - MagicIdentifierLiteralExpr * |
59 |
| - generateMagicIdentifierLiteralExpr(const syntax::TokenSyntax &PoundToken); |
| 116 | + bool hasType(const SourceLoc &Loc) const; |
60 | 117 |
|
61 |
| - /// Map magic literal tokens such as #file to their MagicIdentifierLiteralExpr |
62 |
| - /// kind. |
63 |
| - static MagicIdentifierLiteralExpr::Kind |
64 |
| - getMagicIdentifierLiteralKind(tok Kind); |
| 118 | + TypeRepr *getType(const SourceLoc &Loc) const; |
65 | 119 | };
|
66 | 120 | } // namespace swift
|
67 | 121 |
|
|
0 commit comments