blob: d139a6b135c283ec1678dfa3968fcdb65ab01278 [file] [log] [blame]
//===--- ASTGen.h ---------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2019 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_PARSE_ASTGEN_H
#define SWIFT_PARSE_ASTGEN_H
#include "swift/AST/ASTContext.h"
#include "swift/AST/Decl.h"
#include "swift/AST/Expr.h"
#include "swift/AST/TypeRepr.h"
#include "swift/Parse/PersistentParserState.h"
#include "swift/Syntax/SyntaxNodes.h"
#include "llvm/ADT/DenseMap.h"
namespace swift {
class ComponentIdentTypeRepr;
class TupleTypeRepr;
/// Generates AST nodes from Syntax nodes.
class Parser;
class ASTGen {
ASTContext &Context;
/// Type cache to prevent multiple transformations of the same syntax node.
llvm::DenseMap<syntax::SyntaxNodeId, TypeRepr *> TypeCache;
Parser &P;
// FIXME: remove when Syntax can represent all types and ASTGen can handle
// them
/// Decl attributes that cannot be represented by Syntax or generated by
/// ASTGen.
llvm::DenseMap<SourceLoc, DeclAttributes> ParsedDeclAttrs;
public:
ASTGen(ASTContext &Context, Parser &P) : Context(Context), P(P) {}
SourceLoc generate(const syntax::TokenSyntax &Tok, const SourceLoc Loc);
SourceLoc generateIdentifierDeclName(const syntax::TokenSyntax &Tok,
const SourceLoc, Identifier &Identifier);
public:
//===--------------------------------------------------------------------===//
// Decls.
Decl *generate(const syntax::DeclSyntax &Decl, const SourceLoc Loc);
TypeDecl *generate(const syntax::AssociatedtypeDeclSyntax &Decl,
const SourceLoc Loc);
TypeDecl *generate(const syntax::TypealiasDeclSyntax &Decl,
const SourceLoc Loc);
TrailingWhereClause *generate(const syntax::GenericWhereClauseSyntax &syntax,
const SourceLoc Loc);
MutableArrayRef<TypeLoc>
generate(const syntax::TypeInheritanceClauseSyntax &syntax,
const SourceLoc Loc, bool allowClassRequirement);
private:
DeclAttributes
generateDeclAttributes(const syntax::Syntax &D, SourceLoc Loc,
bool includeComments);
void generateFreeStandingGenericWhereClause(
const syntax::GenericWhereClauseSyntax &syntax,
const SourceLoc Loc,
GenericParamList *genericParams);
public:
//===--------------------------------------------------------------------===//
// Expressions.
Expr *generate(const syntax::ExprSyntax &Expr, const SourceLoc Loc);
Expr *generate(const syntax::IdentifierExprSyntax &Expr, const SourceLoc Loc);
Expr *generate(const syntax::EditorPlaceholderExprSyntax &Expr,
const SourceLoc Loc);
Expr *generate(const syntax::SpecializeExprSyntax &Expr, const SourceLoc Loc);
Expr *generate(const syntax::IntegerLiteralExprSyntax &Expr,
const SourceLoc Loc);
Expr *generate(const syntax::FloatLiteralExprSyntax &Expr,
const SourceLoc Loc);
Expr *generate(const syntax::NilLiteralExprSyntax &Expr, const SourceLoc Loc);
Expr *generate(const syntax::BooleanLiteralExprSyntax &Expr,
const SourceLoc Loc);
Expr *generate(const syntax::PoundFileExprSyntax &Expr, const SourceLoc Loc);
Expr *generate(const syntax::PoundLineExprSyntax &Expr, const SourceLoc Loc);
Expr *generate(const syntax::PoundColumnExprSyntax &Expr,
const SourceLoc Loc);
Expr *generate(const syntax::PoundFunctionExprSyntax &Expr,
const SourceLoc Loc);
Expr *generate(const syntax::PoundDsohandleExprSyntax &Expr,
const SourceLoc Loc);
Expr *generate(const syntax::UnknownExprSyntax &Expr, const SourceLoc Loc);
std::pair<DeclName, DeclNameLoc> generateUnqualifiedDeclName(
const syntax::TokenSyntax &idTok,
const Optional<syntax::DeclNameArgumentsSyntax> &args,
const SourceLoc Loc);
private:
Expr *generateMagicIdentifierLiteralExpression(
const syntax::TokenSyntax &PoundToken, const SourceLoc Loc);
static MagicIdentifierLiteralExpr::Kind
getMagicIdentifierLiteralKind(tok Kind);
public:
//===--------------------------------------------------------------------===//
// Types.
TypeRepr *generate(const syntax::TypeSyntax &Type, const SourceLoc Loc,
bool IsSILFuncDecl = false);
TypeRepr *generate(const syntax::SomeTypeSyntax &Type, const SourceLoc Loc);
TypeRepr *generate(const syntax::CompositionTypeSyntax &Type,
const SourceLoc Loc);
TypeRepr *generate(const syntax::SimpleTypeIdentifierSyntax &Type,
const SourceLoc Loc);
TypeRepr *generate(const syntax::MemberTypeIdentifierSyntax &Type,
const SourceLoc Loc);
TypeRepr *generate(const syntax::DictionaryTypeSyntax &Type,
const SourceLoc Loc);
TypeRepr *generate(const syntax::ArrayTypeSyntax &Type, const SourceLoc Loc);
TypeRepr *generate(const syntax::TupleTypeSyntax &Type, const SourceLoc Loc);
TypeRepr *generate(const syntax::AttributedTypeSyntax &Type,
const SourceLoc Loc);
TypeRepr *generate(const syntax::FunctionTypeSyntax &Type,
const SourceLoc Loc);
TypeRepr *generate(const syntax::MetatypeTypeSyntax &Type,
const SourceLoc Loc);
TypeRepr *generate(const syntax::OptionalTypeSyntax &Type,
const SourceLoc Loc);
TypeRepr *generate(const syntax::ImplicitlyUnwrappedOptionalTypeSyntax &Type,
const SourceLoc Loc);
TypeRepr *generate(const syntax::ClassRestrictionTypeSyntax &Type,
const SourceLoc Loc);
TypeRepr *generate(const syntax::SILBoxTypeSyntax &Type, const SourceLoc Loc,
bool IsSILFuncDecl);
TypeRepr *generate(const syntax::SILFunctionTypeSyntax &Type,
const SourceLoc Loc, bool IsSILFuncDecl);
TypeRepr *generate(const syntax::CodeCompletionTypeSyntax &Type,
const SourceLoc Loc);
TypeRepr *generate(const syntax::UnknownTypeSyntax &Type,
const SourceLoc Loc);
TypeAttributes
generateTypeAttributes(const syntax::AttributeListSyntax &syntax,
const SourceLoc Loc);
private:
TupleTypeRepr *
generateTuple(const syntax::TokenSyntax &LParen,
const syntax::TupleTypeElementListSyntax &Elements,
const syntax::TokenSyntax &RParen, const SourceLoc Loc,
bool IsFunction = false);
void gatherTypeIdentifierComponents(
const syntax::TypeSyntax &Component, const SourceLoc Loc,
llvm::SmallVectorImpl<ComponentIdentTypeRepr *> &Components);
template <typename T>
TypeRepr *generateSimpleOrMemberIdentifier(const T &Type,
const SourceLoc Loc);
template <typename T>
ComponentIdentTypeRepr *generateIdentifier(const T &Type,
const SourceLoc Loc);
public:
//===--------------------------------------------------------------------===//
// Generics.
void generate(const syntax::GenericArgumentClauseSyntax &Arg,
const SourceLoc Loc, SourceLoc &lAngleLoc, SourceLoc &rAngleLoc,
SmallVectorImpl<TypeRepr *> &args);
GenericParamList *
generate(const syntax::GenericParameterClauseListSyntax &clause,
const SourceLoc Loc);
GenericParamList *generate(const syntax::GenericParameterClauseSyntax &clause,
const SourceLoc Loc);
Optional<RequirementRepr>
generate(const syntax::GenericRequirementSyntax &req, const SourceLoc Loc);
LayoutConstraint generate(const syntax::LayoutConstraintSyntax &req,
const SourceLoc Loc);
public:
//===--------------------------------------------------------------------===//
// Utilities.
/// Copy a numeric literal value into AST-owned memory, stripping underscores
/// so the semantic part of the value can be parsed by APInt/APFloat parsers.
static StringRef copyAndStripUnderscores(StringRef Orig, ASTContext &Context);
private:
StringRef copyAndStripUnderscores(StringRef Orig);
/// Advance \p Loc to the first token of the \p Node.
/// \p Loc must be the leading trivia of the first token in the tree in which
/// \p Node resides.
static SourceLoc advanceLocBegin(const SourceLoc &Loc,
const syntax::Syntax &Node);
ValueDecl *lookupInScope(DeclName Name);
void addToScope(ValueDecl *D, bool diagnoseRedefinitions = true);
TypeRepr *cacheType(syntax::TypeSyntax Type, TypeRepr *TypeAST);
TypeRepr *lookupType(syntax::TypeSyntax Type);
public:
void addDeclAttributes(DeclAttributes attrs, const SourceLoc Loc);
bool hasDeclAttributes(SourceLoc Loc) const;
DeclAttributes getDeclAttributes(const SourceLoc Loc) const;
};
} // namespace swift
#endif // SWIFT_PARSE_ASTGEN_H