// 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
