# Copyright 2021 The Cobalt Authors. All Rights Reserved.
#
# 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.

config("css_parser_config") {
  include_dirs = [ "$target_gen_dir" ]
}

# Generates header files from Bison grammar that are privately included
# by CSS scanner and parser.
action("css_grammar") {
  script = "//starboard/build/run_bash.py"

  # Define the platform specific Bison binary.
  if (is_win) {
    bison_executable = "win_bison"
  } else {
    bison_executable = "bison"
  }

  inputs = [ "grammar.y" ]

  outputs = [
    # Tokens and types, included by scanner.
    "$target_gen_dir/grammar_generated.h",

    # LALR(1) parser tables and yy*() functions, included by parser.
    "$target_gen_dir/grammar_impl_generated.h",
  ]

  args = [
    bison_executable,
    "-Wall",
    "-Werror",
    "--defines=" + rebase_path(outputs[0], root_build_dir),
    "--output=" + rebase_path(outputs[1], root_build_dir),
    rebase_path(inputs[0], root_build_dir),
  ]
}

static_library("css_parser") {
  has_pedantic_warnings = true

  sources = [
    "animation_shorthand_property_parse_structures.cc",
    "animation_shorthand_property_parse_structures.h",
    "background_shorthand_property_parse_structures.cc",
    "background_shorthand_property_parse_structures.h",
    "border_shorthand_property_parse_structures.cc",
    "border_shorthand_property_parse_structures.h",
    "flex_shorthand_property_parse_structures.cc",
    "flex_shorthand_property_parse_structures.h",
    "font_shorthand_property_parse_structures.cc",
    "font_shorthand_property_parse_structures.h",
    "grammar.h",
    "margin_or_padding_shorthand.cc",
    "margin_or_padding_shorthand.h",
    "parser.cc",
    "parser.h",
    "position_parse_structures.cc",
    "position_parse_structures.h",
    "property_declaration.h",
    "ref_counted_util.h",
    "scanner.cc",
    "scanner.h",
    "shadow_property_parse_structures.cc",
    "shadow_property_parse_structures.h",
    "string_pool.h",
    "text_decoration_shorthand_property_parse_structures.cc",
    "text_decoration_shorthand_property_parse_structures.h",
    "transition_shorthand_property_parse_structures.cc",
    "transition_shorthand_property_parse_structures.h",
    "trivial_string_piece.h",
    "trivial_type_pairs.h",
  ]
  sources += get_target_outputs(":css_grammar")

  public_configs = [ ":css_parser_config" ]

  # Scanner exposes UChar32 in a header.
  public_deps = [ "//third_party/icu:icuuc" ]

  deps = [
    ":css_grammar",
    "//cobalt/base",
    "//cobalt/cssom",
    "//nb",
    "//starboard/common",
  ]
}

target(gtest_target_type, "css_parser_test") {
  testonly = true
  has_pedantic_warnings = true

  sources = [
    "parser_test.cc",
    "ref_counted_util_test.cc",
    "scanner_test.cc",
    "trivial_string_piece_test.cc",
  ]

  deps = [
    ":css_grammar",
    ":css_parser",
    "//base",
    "//cobalt/cssom",
    "//cobalt/test:run_all_unittests",
    "//testing/gmock",
    "//testing/gtest",
  ]
}
