// 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 "verilog/parser/verilog_token_classifications.h"

#include "verilog/parser/verilog_token_enum.h"

namespace verilog {

bool IsWhitespace(verilog_tokentype token_type) {
  return (token_type == verilog_tokentype::TK_SPACE ||
          token_type == verilog_tokentype::TK_NEWLINE);
}

bool IsComment(verilog_tokentype token_type) {
  return (token_type == verilog_tokentype::TK_COMMENT_BLOCK ||
          token_type == verilog_tokentype::TK_EOL_COMMENT);
}

bool IsUnaryOperator(verilog_tokentype token_type) {
  switch (static_cast<int>(token_type)) {
    // See verilog/parser/verilog.y
    // TODO(fangism): find a way to generate this function automatically
    // from the yacc file, perhaps with extra annotations or metadata.
    case '+':
    case '-':
    case '~':
    case '&':
    case '!':
    case '|':
    case '^':
    case TK_NAND:
    case TK_NOR:
    case TK_NXOR:
    case TK_INCR:
    case TK_DECR:
      return true;
    default:
      return false;
  }
}

bool IsTernaryOperator(verilog_tokentype token_type) {
  switch (static_cast<int>(token_type)) {
    case '?':
    case ':':
      return true;
    default:
      return false;
  }
}

bool IsPreprocessorControlFlow(verilog_tokentype token_type) {
  switch (token_type) {
    case verilog_tokentype::PP_ifdef:
    case verilog_tokentype::PP_ifndef:
    case verilog_tokentype::PP_elsif:
    case verilog_tokentype::PP_else:
    case verilog_tokentype::PP_endif:
      return true;
    default:
      return false;
  }
}

bool IsPreprocessorKeyword(verilog_tokentype token_type) {
  switch (token_type) {
    case verilog_tokentype::PP_include:
    case verilog_tokentype::PP_define:
    case verilog_tokentype::PP_ifdef:
    case verilog_tokentype::PP_ifndef:
    case verilog_tokentype::PP_else:
    case verilog_tokentype::PP_elsif:
    case verilog_tokentype::PP_endif:
    case verilog_tokentype::PP_undef:
      return true;
    default:
      return false;
  }
}

bool IsPreprocessorControlToken(verilog_tokentype token_type) {
  switch (token_type) {
    case verilog_tokentype::PP_Identifier:
    case verilog_tokentype::PP_include:
    case verilog_tokentype::PP_define:
    case verilog_tokentype::PP_define_body:
    case verilog_tokentype::PP_ifdef:
    case verilog_tokentype::PP_ifndef:
    case verilog_tokentype::PP_else:
    case verilog_tokentype::PP_elsif:
    case verilog_tokentype::PP_endif:
    case verilog_tokentype::PP_undef:
    case verilog_tokentype::PP_default_text:
      // Excludes macro call tokens.
      return true;
    default:
      return false;
  }
}

bool IsEndKeyword(verilog_tokentype token_type) {
  switch (token_type) {
    case verilog_tokentype::TK_end:
    case verilog_tokentype::TK_endcase:
    case verilog_tokentype::TK_endgroup:
    case verilog_tokentype::TK_endpackage:
    case verilog_tokentype::TK_endgenerate:
    case verilog_tokentype::TK_endinterface:
    case verilog_tokentype::TK_endfunction:
    case verilog_tokentype::TK_endtask:
    case verilog_tokentype::TK_endproperty:
    case verilog_tokentype::TK_endclocking:
    case verilog_tokentype::TK_endclass:
    case verilog_tokentype::TK_endmodule:
      // TODO(fangism): join and join* keywords?
      return true;
    default:
      return false;
  }
}

bool IsUnlexed(verilog_tokentype token_type) {
  switch (token_type) {
    case verilog_tokentype::MacroArg:
    case verilog_tokentype::PP_define_body:
      return true;
    default:
      return false;
  }
}

bool IsIdentifierLike(verilog_tokentype token_type) {
  switch (token_type) {
    case verilog_tokentype::SymbolIdentifier:
    case verilog_tokentype::PP_Identifier:
    case verilog_tokentype::MacroIdentifier:
    case verilog_tokentype::MacroIdItem:
    case verilog_tokentype::MacroCallId:
    case verilog_tokentype::SystemTFIdentifier:
    case verilog_tokentype::EscapedIdentifier:
      // specify block built-in functions
    case verilog_tokentype::TK_Srecrem:
    case verilog_tokentype::TK_Ssetuphold:
    case verilog_tokentype::TK_Speriod:
    case verilog_tokentype::TK_Shold:
    case verilog_tokentype::TK_Srecovery:
    case verilog_tokentype::TK_Sremoval:
    case verilog_tokentype::TK_Ssetup:
    case verilog_tokentype::TK_Sskew:
    case verilog_tokentype::TK_Stimeskew:
    case verilog_tokentype::TK_Swidth:
      return true;
    default:
      break;
  }
  return false;
}

}  // namespace verilog
