//===--- 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<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;
  }
}

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::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::visitLValueToPointerExpr(
    LValueToPointerExpr *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::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::visitObjCKeyPathExpr(ObjCKeyPathExpr *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();
    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);
}
