// 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 <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 SyntaxTreeLeaf *leaf = down_cast<const SyntaxTreeLeaf *>(symbol);
    return equals(leaf, compare_tokens);
  } else {
    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);
}

}  // namespace verible
