Files
swift-mirror/lib/Syntax/LegacyASTTransformer.cpp
Jordan Rose 4cdb597b23 Rename VTablePlaceholderDecl to MissingMemberDecl.
As such, we no longer insert two placeholders for initializers that
need two vtable slots; instead we record that in the
MissingMemberDecl. I can see MissingMemberDecl growing to be something
we'd actually show to users, that can be used for other kinds of
declarations that don't have vtable entries, but for now I'm not going
to worry about any of that.
2017-05-10 11:55:55 -06:00

1320 lines
42 KiB
C++

//===--- LegacyASTTransformer.cpp - Swift lib/AST -> lib/Syntax -----------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 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
//
//===----------------------------------------------------------------------===//
#include "swift/Syntax/DeclSyntax.h"
#include "swift/Syntax/ExprSyntax.h"
#include "swift/Syntax/GenericSyntax.h"
#include "swift/Syntax/LegacyASTTransformer.h"
#include "swift/Syntax/References.h"
#include "swift/Syntax/StmtSyntax.h"
#include "swift/Syntax/SyntaxFactory.h"
#include "swift/Syntax/TokenSyntax.h"
#include "swift/Syntax/UnknownSyntax.h"
using namespace swift;
using namespace swift::syntax;
namespace {
bool
tokenContainsOffset(unsigned Offset,
const std::pair<RC<TokenSyntax>,
AbsolutePosition> &TokAndPos) {
auto Start = TokAndPos.second.getOffset();
auto End = Start + TokAndPos.first->getText().size();
return Offset >= Start && Offset < End;
}
std::vector<RC<TokenSyntax>>
getTokenSyntaxsInRange(SourceRange Range, SourceManager &SourceMgr,
unsigned BufferID,
const TokenPositionList &Tokens) {
auto StartOffset = SourceMgr.getLocOffsetInBuffer(Range.Start, BufferID);
auto EndOffset = SourceMgr.getLocOffsetInBuffer(Range.End, BufferID);
auto Start = Tokens.begin();
auto End = Tokens.rbegin();
while (Start != Tokens.end()) {
if (tokenContainsOffset(StartOffset, *Start)) {
break;
}
++Start;
}
while (End != Tokens.rend()) {
if (tokenContainsOffset(EndOffset, *End)) {
break;
}
++End;
}
assert(Start != Tokens.end());
assert(End.base() != Tokens.end());
assert(Start <= End.base());
std::vector<RC<TokenSyntax>> TokensInRange;
while (Start < End.base()) {
TokensInRange.push_back(Start->first);
++Start;
}
return TokensInRange;
}
} // anonymous namespace
Optional<Syntax>
syntax::transformAST(ASTNode Node,
sema::Semantics &Sema,
SourceManager &SourceMgr,
const unsigned BufferID,
const TokenPositionList &Tokens) {
LegacyASTTransformer Transformer { Sema, SourceMgr, BufferID, Tokens };
if (Node.is<Expr *>()) {
auto E = Node.get<Expr *>();
if (E->isImplicit() || E->getSourceRange().isInvalid()) {
return None;
}
auto Transformed = Transformer.visit(E);
Sema.recordSyntaxMapping(Transformed, Node);
return Syntax { Transformed, Transformed.get() };
} else if (Node.is<Decl *>()) {
auto D = Node.get<Decl *>();
if (auto VD = dyn_cast<VarDecl>(D)) {
if (VD->getParentPattern()) {
return None;
}
} else if (auto FD = dyn_cast<FuncDecl>(D)) {
if (FD->isGetterOrSetter()) {
return None;
}
}
if (D->isImplicit() || D->getSourceRange().isInvalid()) {
return None;
}
auto Transformed = Transformer.visit(D);
Sema.recordSyntaxMapping(Transformed, Node);
return Syntax { Transformed, Transformed.get() };
} else if (Node.is<Stmt *>()) {
auto S = Node.get<Stmt *>();
if (S->isImplicit() || S->getSourceRange().isInvalid()) {
return None;
}
auto Transformed = Transformer.visit(S);
Sema.recordSyntaxMapping(Transformed, Node);
return Syntax { Transformed, Transformed.get() };
}
return None;
}
SourceLoc LegacyASTTransformer::getStartLocForDecl(const Decl *D) const {
return D->getAttrs().isEmpty()
? D->getStartLoc()
: D->getAttrs().getStartLoc();
}
SourceLoc LegacyASTTransformer::getEndLocForDecl(const Decl *D) const {
return D->TrailingSemiLoc.isValid()
? D->TrailingSemiLoc
: D->getEndLoc();
}
SourceLoc LegacyASTTransformer::getEndLocForStmt(const Stmt *S) const {
return S->TrailingSemiLoc.isValid()
? S->TrailingSemiLoc
: S->getEndLoc();
}
SourceLoc LegacyASTTransformer::getEndLocForExpr(const Expr *E) const {
return E->TrailingSemiLoc.isValid()
? E->TrailingSemiLoc
: E->getEndLoc();
}
RC<SyntaxData> LegacyASTTransformer::getUnknownSyntax(SourceRange SR) {
auto ComprisingTokens = getTokenSyntaxsInRange(SR, SourceMgr,
BufferID, Tokens);
RawSyntax::LayoutList Layout;
std::copy(ComprisingTokens.begin(),
ComprisingTokens.end(),
std::back_inserter(Layout));
auto Raw = RawSyntax::make(SyntaxKind::Unknown,
Layout,
SourcePresence::Present);
return UnknownSyntaxData::make(Raw);
}
RC<SyntaxData> LegacyASTTransformer::getUnknownDecl(Decl *D) {
SourceRange SR {getStartLocForDecl(D),getEndLocForDecl(D)};
auto ComprisingTokens = getTokenSyntaxsInRange(SR, SourceMgr,
BufferID, Tokens);
RawSyntax::LayoutList Layout;
std::copy(ComprisingTokens.begin(),
ComprisingTokens.end(),
std::back_inserter(Layout));
auto Raw = RawSyntax::make(SyntaxKind::UnknownExpr,
Layout,
SourcePresence::Present);
return UnknownDeclSyntaxData::make(Raw);
}
RC<SyntaxData> LegacyASTTransformer::getUnknownStmt(Stmt *S) {
SourceRange SR { S->getStartLoc(), getEndLocForStmt(S) };
auto ComprisingTokens = getTokenSyntaxsInRange(SR, SourceMgr,
BufferID, Tokens);
RawSyntax::LayoutList Layout;
std::copy(ComprisingTokens.begin(),
ComprisingTokens.end(),
std::back_inserter(Layout));
auto Raw = RawSyntax::make(SyntaxKind::UnknownExpr,
Layout,
SourcePresence::Present);
return UnknownStmtSyntaxData::make(Raw);
}
RC<SyntaxData> LegacyASTTransformer::getUnknownExpr(Expr *E) {
SourceRange SR { E->getStartLoc(), getEndLocForExpr(E) };
auto ComprisingTokens = getTokenSyntaxsInRange(SR, SourceMgr,
BufferID, Tokens);
RawSyntax::LayoutList Layout;
std::copy(ComprisingTokens.begin(),
ComprisingTokens.end(),
std::back_inserter(Layout));
auto Raw = RawSyntax::make(SyntaxKind::UnknownExpr,
Layout,
SourcePresence::Present);
return UnknownExprSyntaxData::make(Raw);
}
#pragma mark - Declarations
RC<SyntaxData>
LegacyASTTransformer::visitImportDecl(ImportDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitExtensionDecl(ExtensionDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitPatternBindingDecl(PatternBindingDecl *PBD,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
auto StartLoc = getStartLocForDecl(PBD);
for (auto Entry : PBD->getPatternList()) {
auto Loc = getStartLocForDecl(Entry.getAnchoringVarDecl());
if (StartLoc.isInvalid() || SourceMgr.isBeforeInBuffer(Loc, StartLoc)) {
StartLoc = Loc;
}
}
auto EndLoc = getEndLocForDecl(PBD);
return getUnknownSyntax({StartLoc, EndLoc});
}
RC<SyntaxData>
LegacyASTTransformer::visitEnumCaseDecl(EnumCaseDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitTopLevelCodeDecl(TopLevelCodeDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return visitBraceStmt(D->getBody(), Parent, IndexInParent);
}
RC<SyntaxData>
LegacyASTTransformer::visitIfConfigDecl(IfConfigDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitPrecedenceGroupDecl(
PrecedenceGroupDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitInfixOperatorDecl(InfixOperatorDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitPrefixOperatorDecl(PrefixOperatorDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitPostfixOperatorDecl(
PostfixOperatorDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitMissingMemberDecl(
MissingMemberDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitGenericTypeParamDecl(
GenericTypeParamDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitAssociatedTypeDecl(AssociatedTypeDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitTypeAliasDecl(TypeAliasDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitEnumDecl(EnumDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitStructDecl(StructDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
// TODO
#if 0
StructDeclSyntaxBuilder StructBuilder;
if (D->getStartLoc().isValid()) {
auto StructKeyword = findTokenSyntax(tok::kw_struct, "struct", SourceMgr,
D->getStartLoc(), BufferID, Tokens);
StructBuilder.useStructKeyword(StructKeyword);
}
if (D->getNameLoc().isValid()) {
auto Identifier = findTokenSyntax(tok::identifier,
OwnedString(D->getName().str()),
SourceMgr, D->getNameLoc(), BufferID,
Tokens);
StructBuilder.useIdentifier(Identifier);
}
if (D->getBraces().isValid()) {
auto LeftBraceToken = findTokenSyntax(tok::l_brace, "{", SourceMgr,
D->getBraces().Start, BufferID, Tokens);
StructBuilder.useLeftBrace(LeftBraceToken);
auto RightBraceToken = findTokenSyntax(tok::r_brace, "}", SourceMgr,
D->getBraces().End, BufferID, Tokens);
StructBuilder.useRightBrace(RightBraceToken);
}
DeclMembersSyntaxBuilder MemberBuilder;
for (auto Member : D->getMembers()) {
auto TransformedMember = transformAST(Member, Sema,
SourceMgr, BufferID, Tokens);
if (TransformedMember.hasValue()) {
if (auto MD = TransformedMember.getValue().getAs<DeclSyntax>()) {
MemberBuilder.addMember(MD.getValue());
} else {
continue;
return getUnknownDecl(D);
}
} else {
continue;
return getUnknownDecl(D);
}
}
StructBuilder.useMembers(MemberBuilder.build());
return StructBuilder.build().Root;
#endif
}
RC<SyntaxData>
LegacyASTTransformer::visitClassDecl(ClassDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitProtocolDecl(ProtocolDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitModuleDecl(ModuleDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitVarDecl(VarDecl *VD,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(VD);
}
RC<SyntaxData>
LegacyASTTransformer::visitParamDecl(ParamDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitSubscriptDecl(SubscriptDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitConstructorDecl(ConstructorDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitDestructorDecl(DestructorDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
RC<SyntaxData>
LegacyASTTransformer::visitFuncDecl(FuncDecl *FD,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(FD);
}
RC<SyntaxData>
LegacyASTTransformer::visitEnumElementDecl(EnumElementDecl *D,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownDecl(D);
}
#pragma mark - Statements
RC<SyntaxData>
LegacyASTTransformer::visitBraceStmt(BraceStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
auto LeftBrace = S->getLBraceLoc().isValid()
? findTokenSyntax(tok::l_brace, "{", SourceMgr, S->getLBraceLoc(),
BufferID, Tokens)
: TokenSyntax::missingToken(tok::l_brace, "{");
std::vector<StmtSyntax> Stmts;
for (auto Node : S->getElements()) {
auto Transformed = transformAST(Node, Sema, SourceMgr, BufferID, Tokens);
if (Transformed.hasValue()) {
Stmts.push_back(Transformed.getValue().castTo<StmtSyntax>());
}
}
auto RightBrace = S->getLBraceLoc().isValid()
? findTokenSyntax(tok::r_brace, "}", SourceMgr, S->getLBraceLoc(),
BufferID, Tokens)
: TokenSyntax::missingToken(tok::r_brace, "}");
auto StmtList = SyntaxFactory::makeStmtList(Stmts);
return SyntaxFactory::makeCodeBlock(LeftBrace, StmtList, RightBrace).Root;
}
RC<SyntaxData>
LegacyASTTransformer::visitReturnStmt(ReturnStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
auto ReturnKW = findTokenSyntax(tok::kw_return, "return", SourceMgr,
S->getReturnLoc(), BufferID, Tokens);
auto Result = transformAST(S->getResult(), Sema, SourceMgr, BufferID,
Tokens);
if (!Result.hasValue()) {
return getUnknownStmt(S);
}
return SyntaxFactory::makeReturnStmt(ReturnKW,
Result.getValue().castTo<ExprSyntax>()).Root;
}
RC<SyntaxData>
LegacyASTTransformer::visitDeferStmt(DeferStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownStmt(S);
}
RC<SyntaxData>
LegacyASTTransformer::visitIfStmt(IfStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownStmt(S);
}
RC<SyntaxData>
LegacyASTTransformer::visitGuardStmt(GuardStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownStmt(S);
}
RC<SyntaxData>
LegacyASTTransformer::visitWhileStmt(WhileStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownStmt(S);
}
RC<SyntaxData>
LegacyASTTransformer::visitDoStmt(DoStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownStmt(S);
}
RC<SyntaxData>
LegacyASTTransformer::visitDoCatchStmt(DoCatchStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownStmt(S);
}
RC<SyntaxData>
LegacyASTTransformer::visitRepeatWhileStmt(RepeatWhileStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownStmt(S);
}
RC<SyntaxData>
LegacyASTTransformer::visitForStmt(ForStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownStmt(S);
}
RC<SyntaxData>
LegacyASTTransformer::visitForEachStmt(ForEachStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownStmt(S);
}
RC<SyntaxData>
LegacyASTTransformer::visitSwitchStmt(SwitchStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownStmt(S);
}
RC<SyntaxData>
LegacyASTTransformer::visitCaseStmt(CaseStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownStmt(S);
}
RC<SyntaxData>
LegacyASTTransformer::visitCatchStmt(CatchStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownStmt(S);
}
RC<SyntaxData>
LegacyASTTransformer::visitBreakStmt(BreakStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownStmt(S);
}
RC<SyntaxData>
LegacyASTTransformer::visitContinueStmt(ContinueStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownStmt(S);
}
RC<SyntaxData>
LegacyASTTransformer::visitFallthroughStmt(FallthroughStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
if (S->getLoc().isInvalid()) {
return SyntaxFactory::makeBlankFallthroughStmt().Root;
}
auto FallthroughToken = findTokenSyntax(tok::kw_fallthrough, "fallthrough",
SourceMgr, S->getLoc(),
BufferID, Tokens);
return SyntaxFactory::makeFallthroughStmt(FallthroughToken).Root;
}
RC<SyntaxData>
LegacyASTTransformer::visitIfConfigStmt(IfConfigStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownStmt(S);
}
RC<SyntaxData>
LegacyASTTransformer::visitFailStmt(FailStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownStmt(S);
}
RC<SyntaxData>
LegacyASTTransformer::visitThrowStmt(ThrowStmt *S,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownStmt(S);
}
#pragma mark - Expressions
RC<SyntaxData>
LegacyASTTransformer::visitErrorExpr(ErrorExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitNilLiteralExpr(NilLiteralExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitIntegerLiteralExpr(IntegerLiteralExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
auto Sign = E->getMinusLoc().isValid()
? findTokenSyntax(tok::oper_prefix, OwnedString(),
SourceMgr, E->getMinusLoc(),
BufferID, Tokens)
: TokenSyntax::missingToken(tok::oper_prefix, "");
auto Digits = findTokenSyntax(tok::integer_literal, OwnedString(),
SourceMgr, E->getDigitsLoc(),
BufferID, Tokens);
return SyntaxFactory::makeIntegerLiteralExpr(Sign, Digits).Root;
}
RC<SyntaxData>
LegacyASTTransformer::visitFloatLiteralExpr(FloatLiteralExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitBooleanLiteralExpr(BooleanLiteralExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitStringLiteralExpr(StringLiteralExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitInterpolatedStringLiteralExpr(
InterpolatedStringLiteralExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitObjectLiteralExpr(ObjectLiteralExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitMagicIdentifierLiteralExpr(
MagicIdentifierLiteralExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitDiscardAssignmentExpr(
DiscardAssignmentExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitDeclRefExpr(DeclRefExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitSuperRefExpr(SuperRefExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitTypeExpr(TypeExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitOtherConstructorDeclRefExpr(
OtherConstructorDeclRefExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData> LegacyASTTransformer::visitDotSyntaxBaseIgnoredExpr(
DotSyntaxBaseIgnoredExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitOverloadedDeclRefExpr(
OverloadedDeclRefExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitUnresolvedDeclRefExpr(
UnresolvedDeclRefExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitMemberRefExpr(MemberRefExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitDynamicMemberRefExpr(
DynamicMemberRefExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitDynamicSubscriptExpr(
DynamicSubscriptExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData> LegacyASTTransformer::visitUnresolvedSpecializeExpr(
UnresolvedSpecializeExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitUnresolvedMemberExpr(
UnresolvedMemberExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitUnresolvedDotExpr(UnresolvedDotExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitSequenceExpr(SequenceExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitParenExpr(ParenExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitDotSelfExpr(DotSelfExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitTryExpr(TryExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitForceTryExpr(ForceTryExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitOptionalTryExpr(OptionalTryExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitTupleExpr(TupleExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitArrayExpr(ArrayExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitDictionaryExpr(DictionaryExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitSubscriptExpr(SubscriptExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitTupleElementExpr(TupleElementExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitCaptureListExpr(CaptureListExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitClosureExpr(ClosureExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitAutoClosureExpr(AutoClosureExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitInOutExpr(InOutExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitDynamicTypeExpr(DynamicTypeExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitRebindSelfInConstructorExpr(
RebindSelfInConstructorExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitOpaqueValueExpr(OpaqueValueExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitBindOptionalExpr(BindOptionalExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitOptionalEvaluationExpr(
OptionalEvaluationExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitForceValueExpr(ForceValueExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitOpenExistentialExpr(
OpenExistentialExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData> LegacyASTTransformer::visitMakeTemporarilyEscapableExpr(
MakeTemporarilyEscapableExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitCallExpr(CallExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitPrefixUnaryExpr(PrefixUnaryExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitPostfixUnaryExpr(PostfixUnaryExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitBinaryExpr(BinaryExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitDotSyntaxCallExpr(DotSyntaxCallExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitConstructorRefCallExpr(
ConstructorRefCallExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitLoadExpr(LoadExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitTupleShuffleExpr(TupleShuffleExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitUnresolvedTypeConversionExpr(
UnresolvedTypeConversionExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitFunctionConversionExpr(
FunctionConversionExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData> LegacyASTTransformer::visitCovariantFunctionConversionExpr(
CovariantFunctionConversionExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData> LegacyASTTransformer::visitCovariantReturnConversionExpr(
CovariantReturnConversionExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitMetatypeConversionExpr(
MetatypeConversionExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitCollectionUpcastConversionExpr(
CollectionUpcastConversionExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitErasureExpr(ErasureExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitAnyHashableErasureExpr(
AnyHashableErasureExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitDerivedToBaseExpr(DerivedToBaseExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitArchetypeToSuperExpr(
ArchetypeToSuperExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitInjectIntoOptionalExpr(
InjectIntoOptionalExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitClassMetatypeToObjectExpr(
ClassMetatypeToObjectExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData> LegacyASTTransformer::visitExistentialMetatypeToObjectExpr(
ExistentialMetatypeToObjectExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData> LegacyASTTransformer::visitProtocolMetatypeToObjectExpr(
ProtocolMetatypeToObjectExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitInOutToPointerExpr(InOutToPointerExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitArrayToPointerExpr(ArrayToPointerExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitStringToPointerExpr(
StringToPointerExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitPointerToPointerExpr(
PointerToPointerExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData> LegacyASTTransformer::visitForeignObjectConversionExpr(
ForeignObjectConversionExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitUnevaluatedInstanceExpr(
UnevaluatedInstanceExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitForcedCheckedCastExpr(
ForcedCheckedCastExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData> LegacyASTTransformer::visitConditionalCheckedCastExpr(
ConditionalCheckedCastExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData> LegacyASTTransformer::visitKeyPathApplicationExpr(
KeyPathApplicationExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitIsExpr(IsExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitCoerceExpr(CoerceExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitArrowExpr(ArrowExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitIfExpr(IfExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitEnumIsCaseExpr(EnumIsCaseExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitAssignExpr(AssignExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitCodeCompletionExpr(CodeCompletionExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitUnresolvedPatternExpr(
UnresolvedPatternExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitEditorPlaceholderExpr(
EditorPlaceholderExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitObjCSelectorExpr(ObjCSelectorExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitKeyPathExpr(KeyPathExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<SyntaxData>
LegacyASTTransformer::visitKeyPathDotExpr(KeyPathDotExpr *E,
const SyntaxData *Parent,
const CursorIndex IndexInParent) {
return getUnknownExpr(E);
}
RC<TokenSyntax>
syntax::findTokenSyntax(tok ExpectedKind,
OwnedString ExpectedText,
SourceManager &SourceMgr,
SourceLoc Loc,
unsigned BufferID,
const TokenPositionList &Tokens) {
auto Offset = SourceMgr.getLocOffsetInBuffer(Loc, BufferID);
size_t Start = 0;
size_t End = Tokens.size() - 1;
while (Start <= End) {
auto Mid = (Start + End) / 2;
auto TokAndPos = Tokens[Mid];
auto Tok = TokAndPos.first;
auto Pos = TokAndPos.second;
auto TokStart = Pos.getOffset();
if (Offset == TokStart) {
if (Tok->getTokenKind() == ExpectedKind &&
(ExpectedText.empty() || Tok->getText() == ExpectedText.str())) {
return Tok;
} else {
return TokenSyntax::missingToken(ExpectedKind, ExpectedText);
}
}
if (TokStart < Offset) {
Start = Mid + 1;
} else {
End = Mid - 1;
}
}
return TokenSyntax::missingToken(ExpectedKind, ExpectedText);
}