//===--- RawTokenSyntax.cpp - Swift Token Syntax Implementation -----------===//
//
// 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/TokenSyntax.h"

using namespace swift;
using namespace swift::syntax;

RawTokenSyntax::RawTokenSyntax()
  : RawSyntax(SyntaxKind::Token, {}, SourcePresence::Missing),
    TokenKind(tok::NUM_TOKENS), Text(OwnedString()),
    LeadingTrivia({}), TrailingTrivia({}) {}

RawTokenSyntax::RawTokenSyntax(tok TokenKind, OwnedString Text,
                               const SourcePresence Presence)
  : RawSyntax(SyntaxKind::Token, {}, Presence),
    TokenKind(TokenKind),
    Text(Text),
    LeadingTrivia({}), TrailingTrivia({}) {}

RawTokenSyntax::RawTokenSyntax(tok TokenKind, OwnedString Text,
                               const SourcePresence Presence,
                               const Trivia &LeadingTrivia,
                               const Trivia &TrailingTrivia)
    : RawSyntax(SyntaxKind::Token, {}, Presence),
                TokenKind(TokenKind), Text(Text),
                LeadingTrivia(LeadingTrivia), TrailingTrivia(TrailingTrivia) {}

AbsolutePosition
RawTokenSyntax::accumulateAbsolutePosition(AbsolutePosition &Pos) const {
  for (auto Leader : LeadingTrivia) {
    Leader.accumulateAbsolutePosition(Pos);
  }

  auto Start = Pos;

  Pos.addText(getText());

  for (auto Trailer : TrailingTrivia) {
    Trailer.accumulateAbsolutePosition(Pos);
  }

  return Start;
}

void RawTokenSyntax::dumpKind(llvm::raw_ostream &OS) const {
  switch (getTokenKind()) {
  case tok::unknown:
    OS << "unknown";
    break;
  case tok::eof:
    OS << "eof";
    break;
  case tok::code_complete:
    OS << "code_complete";
    break;
  case tok::identifier:
    OS << "identifier";
    break;
  case tok::oper_binary_unspaced:
    OS << "oper_binary_unspaced";
    break;
  case tok::oper_binary_spaced:
    OS << "oper_binary_spaced";
    break;
  case tok::string_interpolation_anchor:
    OS << "string_interpolation_anchor";
    break;
  case tok::contextual_keyword:
    OS << "contextual_keyword";
    break;
  case tok::oper_postfix:
    OS << "oper_postfix";
    break;
  case tok::oper_prefix:
    OS << "oper_prefix";
    break;
  case tok::dollarident:
    OS << "dollarident";
    break;
  case tok::integer_literal:
    OS << "integer_literal";
    break;
  case tok::floating_literal:
    OS << "floating_literal";
    break;
  case tok::string_literal:
    OS << "string_literal";
    break;
  case tok::sil_local_name:
    OS << "sil_local_name";
    break;
  case tok::comment:
    OS << "comment";
    break;
  case tok::NUM_TOKENS:
    OS << "NUM_TOKENS (unset)";
    break;
#define KEYWORD(X)                                                             \
  case tok::kw_##X:                                                            \
    OS << "kw_" << #X;                                                         \
    break;
#define PUNCTUATOR(X, Y)                                                       \
  case tok::X:                                                                 \
    OS << #X;                                                                  \
    break;
#define POUND_KEYWORD(X)                                                       \
  case tok::pound_##X:                                                         \
    OS << "pound_" << #X;                                                      \
    break;
#include "swift/Syntax/TokenKinds.def"
  }
}

void RawTokenSyntax::dump(llvm::raw_ostream &OS, unsigned Indent) const {
  auto indent = [&](unsigned Amount) {
    for (decltype(Amount) i = 0; i < Amount; ++i) {
      OS << ' ';
    }
  };

  indent(Indent);

  OS << "(token ";
  dumpKind(OS);
  if (isMissing())
    OS << " [missing] ";

  for (auto Leader : LeadingTrivia) {
    OS << "\n";
    Leader.dump(OS, Indent + 1);
  }

  OS << "\n";
  indent(Indent + 1);
  OS << "(text=\"" << getText() << "\")";

  for (auto Trailer : TrailingTrivia) {
    OS << "\n";
    Trailer.dump(OS, Indent + 1);
  }
  OS << ')';
}
