/*
 * MIT License
 *
 * Copyright (c) 2019 Petr Hosek
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

/*
 * highlight.js GN syntax highlighting definition
 *
 * @see https://github.com/highlightjs/highlight.js
 *
 * @package: highlightjs-GN
 * @author:  Petr Hosek <petrhosek@gmail.com>
 * @since:   2019-05-28
 *
 * Description: GN is a meta-build system that generates build files for Ninja.
 * Category: common
 */

/** @type LanguageFn */
export default function(hljs) {
  var SUBST = {
    className: 'subst', relevance: 2,
    variants: [
      {
        begin: '\\$[A-Za-z0-9_]+'
      },
      {
        begin: '\\${', end: '}',
        contains: [{
          className: 'variable',
          begin: hljs.UNDERSCORE_IDENT_RE,
          relevance: 0
        }]
      }
    ],
  };

  var LINK = {
    className: 'link', relevance: 5,
    begin: ':\\w+',
  }

  var NUMBER = {
    className: 'number', relevance: 0,
    begin: hljs.NUMBER_RE
  };

  var STRING = {
    className: 'string', relevance: 0,
    begin: '"',
    end: '"',
    illegal: '\\n',
    contains: [hljs.BACKSLASH_ESCAPE, SUBST, LINK],
  };

  var KEYWORDS = {
    keyword:
      'if else',
    literal:
      'true false ' +
      'current_cpu current_os current_toolchain ' +
      'default_toolchain host_cpu host_os ' +
      'root_build_dir root_gen_dir root_out_dir ' +
      'target_cpu target_gen_dir target_out_dir ' +
      'target_os target_name invoker',
    type:
      'action action_foreach copy executable group ' +
      'shared_library source_set static_library ' +
      'loadable_module generated_file',
    built_in:
      'assert config declare_args defined exec_script ' +
      'foreach get_label_info get_path_info ' +
      'get_target_outputs getenv import print ' +
      'process_file_template read_file rebase_path ' +
      'set_default_toolchain set_defaults ' +
      'set_sources_assignment_filter template tool ' +
      'toolchain toolchain_args propagates_configs ' +
      'write_file forward_variables_from target ' +
      'get_name_info not_needed',
    symbol:
      'all_dependent_configs allow_circular_includes_from ' +
      'args asmflags cflags cflags_c cflags_cc cflags_objc ' +
      'cflags_objcc check_includes complete_static_lib ' +
      'configs data data_deps defines depfile deps ' +
      'include_dirs inputs ldflags lib_dirs libs ' +
      'output_extension output_name outputs public ' +
      'public_configs public_deps script sources testonly ' +
      'visibility contents output_conversion rebase ' +
      'data_keys walk_keys',
  };

  return {
    aliases: ['gn', 'gni'],
    keywords: KEYWORDS,
    contains: [
      NUMBER,
      STRING,
      hljs.HASH_COMMENT_MODE,
    ]
  };
}
