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

// SyntaxTreeLeaf class is a wrapper for TokenInfo. It inherits from Symbol
// to allow placing TokenInfo's into a tree structure

#ifndef VERIBLE_COMMON_TEXT_CONCRETE_SYNTAX_LEAF_H_
#define VERIBLE_COMMON_TEXT_CONCRETE_SYNTAX_LEAF_H_

#include <utility>

#include "common/text/symbol.h"
#include "common/text/token_info.h"
#include "common/text/tree_compare.h"
#include "common/text/visitors.h"

namespace verible {

class SyntaxTreeLeaf : public Symbol {
 public:
  SyntaxTreeLeaf() = delete;

  explicit SyntaxTreeLeaf(const TokenInfo& token) : token_(token) {}

  // All passed arguments will be forwarded to T's constructor
  template <typename... Args>
  explicit SyntaxTreeLeaf(Args&&... args)
      : token_(std::forward<Args>(args)...) {}

  const TokenInfo& get() const { return token_; }

  TokenInfo* get_mutable() { return &token_; }

  // Compares this to an arbitrary symbol using compare_tokens
  bool equals(const Symbol* symbol,
              const TokenComparator& compare_tokens) const override;

  // Compares this to another leaf using compare_tokens
  bool equals(const SyntaxTreeLeaf* leaf,
              const TokenComparator& compare_tokens) const;

  // The Accept() methods have the visitor visit this leaf and perform no
  // other actions.
  void Accept(TreeVisitorRecursive* visitor) const override;
  void Accept(SymbolVisitor* visitor) const override;
  void Accept(MutableTreeVisitorRecursive* visitor,
              SymbolPtr* this_owned) override;

  // Method override that returns the Kind of SyntaxTreeLeaf
  SymbolKind Kind() const override { return SymbolKind::kLeaf; }
  SymbolTag Tag() const override { return LeafTag(get().token_enum()); }

 private:
  TokenInfo token_;
};

// Returns a SyntaxTreeLeaf down_casted from a Symbol.
const SyntaxTreeLeaf& SymbolCastToLeaf(const Symbol&);

}  // namespace verible

#endif  // VERIBLE_COMMON_TEXT_CONCRETE_SYNTAX_LEAF_H_
