// Copyright 2017-2020 The Verible Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "common/text/concrete_syntax_leaf.h"

#include <iostream>
#include <memory>

#include "common/text/concrete_syntax_tree.h"
#include "common/text/symbol.h"
#include "common/text/tree_compare.h"
#include "common/text/visitors.h"
#include "common/util/logging.h"

namespace verible {

// Tests if this is equal to SymbolPtr under compare_tokens function
bool SyntaxTreeLeaf::equals(const Symbol *symbol,
                            const TokenComparator &compare_tokens) const {
  if (symbol->Kind() == SymbolKind::kLeaf) {
    const auto *leaf = down_cast<const SyntaxTreeLeaf *>(symbol);
    return equals(leaf, compare_tokens);
  }
  return false;
}

// Tests if this is equal to SyntaxTreeLeaf under compare_tokens function
bool SyntaxTreeLeaf::equals(const SyntaxTreeLeaf *leaf,
                            const TokenComparator &compare_tokens) const {
  return compare_tokens(this->get(), leaf->get());
}

// Uses treevisitor to visit this
void SyntaxTreeLeaf::Accept(TreeVisitorRecursive *visitor) const {
  visitor->Visit(*this);
}

void SyntaxTreeLeaf::Accept(MutableTreeVisitorRecursive *visitor,
                            SymbolPtr *this_owned) {
  CHECK_EQ(ABSL_DIE_IF_NULL(this_owned)->get(), this);
  visitor->Visit(*this, this_owned);
}

void SyntaxTreeLeaf::Accept(SymbolVisitor *visitor) const {
  visitor->Visit(*this);
}

std::ostream &operator<<(std::ostream &os, const SyntaxTreeLeaf &l) {
  return os << l.get();
}

}  // namespace verible
