// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#include "vm/token_position.h"

#include "vm/object.h"

namespace dart {


TokenPosition TokenPosition::SnapshotDecode(int32_t value) {
  return TokenPosition(static_cast<intptr_t>(value));
}


int32_t TokenPosition::SnapshotEncode() {
  return static_cast<int32_t>(value_);
}


bool TokenPosition::IsSynthetic() const {
  if (value_ >= kMinSourcePos) {
    return false;
  }
  if (value_ < kLast.value()) {
    return true;
  }
  return false;
}


#define DEFINE_VALUES(name, value)                                             \
const TokenPosition TokenPosition::k##name = TokenPosition(value);
  SENTINEL_TOKEN_DESCRIPTORS(DEFINE_VALUES);
#undef DEFINE_VALUES
const TokenPosition TokenPosition::kMinSource =
    TokenPosition(kMinSourcePos);

const TokenPosition TokenPosition::kMaxSource =
    TokenPosition(kMaxSourcePos);


const char* TokenPosition::ToCString() const {
  switch (value_) {
#define DEFINE_CASE(name, value)                                               \
    case value: return #name;
    SENTINEL_TOKEN_DESCRIPTORS(DEFINE_CASE);
#undef DEFINE_CASE
    default: {
      Zone* zone = Thread::Current()->zone();
      ASSERT(zone != NULL);
      if (IsSynthetic()) {
        // TODO(johnmccutchan): Print synthetic positions differently.
        return FromSynthetic().ToCString();
      } else {
        return OS::SCreate(zone, "%d", value_);
      }
    }
  }
}

}  // namespace dart
