// 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(value);
SENTINEL_TOKEN_DESCRIPTORS(DEFINE_VALUES);
#undef DEFINE_VALUES
const TokenPosition TokenPosition::kMinSource(kMinSourcePos);

const TokenPosition TokenPosition::kMaxSource(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
