//===--- 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/AST/AST.h" #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, AbsolutePosition> &TokAndPos) { auto Start = TokAndPos.second.getOffset(); auto End = Start + TokAndPos.first->getText().size(); return Offset >= Start && Offset < End; } std::vector> 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> TokensInRange; while(Start < End.base()) { TokensInRange.push_back(Start->first); ++Start; } return TokensInRange; } } Optional syntax::transformAST(ASTNode Node, sema::Semantics &Sema, SourceManager &SourceMgr, const unsigned BufferID, const TokenPositionList &Tokens) { LegacyASTTransformer Transformer { Sema, SourceMgr, BufferID, Tokens }; if (Node.is()) { auto E = Node.get(); 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()) { auto D = Node.get(); if (auto VD = dyn_cast(D)) { if (VD->getParentPattern()) { return None; } } else if (auto FD = dyn_cast(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()) { auto S = Node.get(); 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 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 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 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 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 LegacyASTTransformer::visitImportDecl(ImportDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC LegacyASTTransformer::visitExtensionDecl(ExtensionDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC 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 LegacyASTTransformer::visitEnumCaseDecl(EnumCaseDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC LegacyASTTransformer::visitTopLevelCodeDecl(TopLevelCodeDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return visitBraceStmt(D->getBody(), Parent, IndexInParent); } RC LegacyASTTransformer::visitIfConfigDecl(IfConfigDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC LegacyASTTransformer::visitPrecedenceGroupDecl( PrecedenceGroupDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC LegacyASTTransformer::visitInfixOperatorDecl(InfixOperatorDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC LegacyASTTransformer::visitPrefixOperatorDecl(PrefixOperatorDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC LegacyASTTransformer::visitPostfixOperatorDecl( PostfixOperatorDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC LegacyASTTransformer::visitGenericTypeParamDecl( GenericTypeParamDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC LegacyASTTransformer::visitAssociatedTypeDecl(AssociatedTypeDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC LegacyASTTransformer::visitTypeAliasDecl(TypeAliasDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC LegacyASTTransformer::visitEnumDecl(EnumDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC 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()) { MemberBuilder.addMember(MD.getValue()); } else { continue; return getUnknownDecl(D); } } else { continue; return getUnknownDecl(D); } } StructBuilder.useMembers(MemberBuilder.build()); return StructBuilder.build().Root; #endif } RC LegacyASTTransformer::visitClassDecl(ClassDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC LegacyASTTransformer::visitProtocolDecl(ProtocolDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC LegacyASTTransformer::visitModuleDecl(ModuleDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC LegacyASTTransformer::visitVarDecl(VarDecl *VD, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(VD); } RC LegacyASTTransformer::visitParamDecl(ParamDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC LegacyASTTransformer::visitSubscriptDecl(SubscriptDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC LegacyASTTransformer::visitConstructorDecl(ConstructorDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC LegacyASTTransformer::visitDestructorDecl(DestructorDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } RC LegacyASTTransformer::visitFuncDecl(FuncDecl *FD, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(FD); } RC LegacyASTTransformer::visitEnumElementDecl(EnumElementDecl *D, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownDecl(D); } #pragma mark - Statements RC 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 Stmts; for (auto Node : S->getElements()) { auto Transformed = transformAST(Node, Sema, SourceMgr, BufferID, Tokens); if (Transformed.hasValue()) { Stmts.push_back(Transformed.getValue().castTo()); } } 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 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()).Root; } RC LegacyASTTransformer::visitDeferStmt(DeferStmt *S, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownStmt(S); } RC LegacyASTTransformer::visitIfStmt(IfStmt *S, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownStmt(S); } RC LegacyASTTransformer::visitGuardStmt(GuardStmt *S, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownStmt(S); } RC LegacyASTTransformer::visitWhileStmt(WhileStmt *S, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownStmt(S); } RC LegacyASTTransformer::visitDoStmt(DoStmt *S, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownStmt(S); } RC LegacyASTTransformer::visitDoCatchStmt(DoCatchStmt *S, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownStmt(S); } RC LegacyASTTransformer::visitRepeatWhileStmt(RepeatWhileStmt *S, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownStmt(S); } RC LegacyASTTransformer::visitForStmt(ForStmt *S, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownStmt(S); } RC LegacyASTTransformer::visitForEachStmt(ForEachStmt *S, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownStmt(S); } RC LegacyASTTransformer::visitSwitchStmt(SwitchStmt *S, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownStmt(S); } RC LegacyASTTransformer::visitCaseStmt(CaseStmt *S, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownStmt(S); } RC LegacyASTTransformer::visitCatchStmt(CatchStmt *S, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownStmt(S); } RC LegacyASTTransformer::visitBreakStmt(BreakStmt *S, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownStmt(S); } RC LegacyASTTransformer::visitContinueStmt(ContinueStmt *S, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownStmt(S); } RC 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 LegacyASTTransformer::visitIfConfigStmt(IfConfigStmt *S, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownStmt(S); } RC LegacyASTTransformer::visitFailStmt(FailStmt *S, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownStmt(S); } RC LegacyASTTransformer::visitThrowStmt(ThrowStmt *S, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownStmt(S); } #pragma mark - Expressions RC LegacyASTTransformer::visitErrorExpr(ErrorExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitNilLiteralExpr(NilLiteralExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC 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 LegacyASTTransformer::visitFloatLiteralExpr(FloatLiteralExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitBooleanLiteralExpr(BooleanLiteralExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitStringLiteralExpr(StringLiteralExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitInterpolatedStringLiteralExpr( InterpolatedStringLiteralExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitObjectLiteralExpr(ObjectLiteralExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitMagicIdentifierLiteralExpr( MagicIdentifierLiteralExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitDiscardAssignmentExpr( DiscardAssignmentExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitDeclRefExpr(DeclRefExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitSuperRefExpr(SuperRefExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitTypeExpr(TypeExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitOtherConstructorDeclRefExpr( OtherConstructorDeclRefExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitDotSyntaxBaseIgnoredExpr( DotSyntaxBaseIgnoredExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitOverloadedDeclRefExpr( OverloadedDeclRefExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitUnresolvedDeclRefExpr( UnresolvedDeclRefExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitMemberRefExpr(MemberRefExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitDynamicMemberRefExpr( DynamicMemberRefExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitDynamicSubscriptExpr( DynamicSubscriptExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitUnresolvedSpecializeExpr( UnresolvedSpecializeExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitUnresolvedMemberExpr( UnresolvedMemberExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitUnresolvedDotExpr(UnresolvedDotExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitSequenceExpr(SequenceExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitParenExpr(ParenExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitDotSelfExpr(DotSelfExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitTryExpr(TryExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitForceTryExpr(ForceTryExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitOptionalTryExpr(OptionalTryExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitTupleExpr(TupleExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitArrayExpr(ArrayExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitDictionaryExpr(DictionaryExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitSubscriptExpr(SubscriptExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitTupleElementExpr(TupleElementExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitCaptureListExpr(CaptureListExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitClosureExpr(ClosureExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitAutoClosureExpr(AutoClosureExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitInOutExpr(InOutExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitDynamicTypeExpr(DynamicTypeExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitRebindSelfInConstructorExpr( RebindSelfInConstructorExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitOpaqueValueExpr(OpaqueValueExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitBindOptionalExpr(BindOptionalExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitOptionalEvaluationExpr( OptionalEvaluationExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitForceValueExpr(ForceValueExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitOpenExistentialExpr( OpenExistentialExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitMakeTemporarilyEscapableExpr( MakeTemporarilyEscapableExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitCallExpr(CallExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitPrefixUnaryExpr(PrefixUnaryExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitPostfixUnaryExpr(PostfixUnaryExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitBinaryExpr(BinaryExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitDotSyntaxCallExpr(DotSyntaxCallExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitConstructorRefCallExpr( ConstructorRefCallExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitLoadExpr(LoadExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitTupleShuffleExpr(TupleShuffleExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitUnresolvedTypeConversionExpr( UnresolvedTypeConversionExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitFunctionConversionExpr( FunctionConversionExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitCovariantFunctionConversionExpr( CovariantFunctionConversionExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitCovariantReturnConversionExpr( CovariantReturnConversionExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitMetatypeConversionExpr( MetatypeConversionExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitCollectionUpcastConversionExpr( CollectionUpcastConversionExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitErasureExpr(ErasureExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitAnyHashableErasureExpr( AnyHashableErasureExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitDerivedToBaseExpr(DerivedToBaseExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitArchetypeToSuperExpr( ArchetypeToSuperExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitInjectIntoOptionalExpr( InjectIntoOptionalExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitClassMetatypeToObjectExpr( ClassMetatypeToObjectExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitExistentialMetatypeToObjectExpr( ExistentialMetatypeToObjectExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitProtocolMetatypeToObjectExpr( ProtocolMetatypeToObjectExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitInOutToPointerExpr(InOutToPointerExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitArrayToPointerExpr(ArrayToPointerExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitStringToPointerExpr( StringToPointerExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitPointerToPointerExpr( PointerToPointerExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitLValueToPointerExpr( LValueToPointerExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitForeignObjectConversionExpr( ForeignObjectConversionExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitUnevaluatedInstanceExpr( UnevaluatedInstanceExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitForcedCheckedCastExpr( ForcedCheckedCastExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitConditionalCheckedCastExpr( ConditionalCheckedCastExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitIsExpr(IsExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitCoerceExpr(CoerceExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitArrowExpr(ArrowExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitIfExpr(IfExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitEnumIsCaseExpr(EnumIsCaseExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitAssignExpr(AssignExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitCodeCompletionExpr(CodeCompletionExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitUnresolvedPatternExpr( UnresolvedPatternExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitEditorPlaceholderExpr( EditorPlaceholderExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitObjCSelectorExpr(ObjCSelectorExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC LegacyASTTransformer::visitObjCKeyPathExpr(ObjCKeyPathExpr *E, const SyntaxData *Parent, const CursorIndex IndexInParent) { return getUnknownExpr(E); } RC 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(); auto TokEnd = TokStart + Tok->getText().size(); 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); }