{
  "name": "dune-project",
  "scopeName": "source.dune-project",
  "fileTypes": ["dune-project"],
  "patterns": [{ "include": "#stanzas" }, { "include": "source.dune#general" }],
  "repository": {
    "stanzas": {
      "patterns": [
        {
          "comment": "lang",
          "begin": "\\([[:space:]]*(lang)[[:space:]]+(dune)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" },
            "2": { "name": "keyword.language.dune-project" }
          },
          "patterns": [{ "include": "source.dune#general" }]
        },

        {
          "comment": "name",
          "begin": "\\([[:space:]]*(name)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "contentName": "variable.other.declaration.dune-project",
          "patterns": [{ "include": "source.dune#general" }]
        },

        {
          "comment": "version",
          "begin": "\\([[:space:]]*(version)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "contentName": "constant.language.dune-project",
          "patterns": [{ "include": "source.dune#general" }]
        },

        {
          "comment": "implicit_transitive_deps",
          "begin": "\\([[:space:]]*(implicit_transitive_deps)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [{ "include": "source.dune#general" }]
        },

        {
          "comment": "wrapped_executables",
          "begin": "\\([[:space:]]*(wrapped_executables)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [{ "include": "source.dune#general" }]
        },

        {
          "comment": "explicit_js_mode",
          "match": "\\([[:space:]]*(explicit_js_mode)[[:space:]]*\\)",
          "captures": {
            "1": { "name": "keyword.language.dune-project" }
          }
        },

        {
          "comment": "dialect",
          "begin": "\\([[:space:]]*(dialect)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [
            {
              "comment": "name",
              "begin": "\\([[:space:]]*(name)\\b",
              "end": "\\)",
              "beginCaptures": {
                "1": { "name": "keyword.language.dune-project" }
              },
              "contentName": "variable.other.declaration.dune-project",
              "patterns": [{ "include": "source.dune#general" }]
            },

            {
              "comment": "implementation/interface",
              "begin": "\\([[:space:]]*(implementation|interface)\\b",
              "end": "\\)",
              "beginCaptures": {
                "1": { "name": "keyword.language.dune-project" }
              },
              "patterns": [
                {
                  "comment": "extension/preprocess/format",
                  "begin": "\\([[:space:]]*(extension|preprocess|format)\\b",
                  "end": "\\)",
                  "beginCaptures": {
                    "1": { "name": "keyword.language.dune-project" }
                  },
                  "patterns": [{ "include": "source.dune#general" }]
                }
              ]
            },

            { "include": "source.dune#general" }
          ]
        },

        {
          "comment": "formatting",
          "begin": "\\([[:space:]]*(formatting)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [
            {
              "name": "constant.language.dune-project",
              "match": "\\b(disabled)\\b"
            },
            {
              "begin": "\\([[:space:]]*(enabled_for)\\b",
              "end": "\\)",
              "beginCaptures": {
                "1": { "name": "keyword.language.dune-project" }
              },
              "patterns": [{ "include": "source.dune#general" }]
            },
            { "include": "source.dune#general" }
          ]
        },

        {
          "comment": "generate_opam_files",
          "begin": "\\([[:space:]]*(generate_opam_files)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [{ "include": "source.dune#general" }]
        },

        {
          "comment": "package",
          "begin": "\\([[:space:]]*(package)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [
            {
              "comment": "name",
              "begin": "\\([[:space:]]*(name)\\b",
              "end": "\\)",
              "beginCaptures": {
                "1": { "name": "keyword.language.dune-project" }
              },
              "contentName": "variable.other.declaration.dune-project",
              "patterns": [{ "include": "source.dune#general" }]
            },

            {
              "comment": "version",
              "begin": "\\([[:space:]]*(version)\\b",
              "end": "\\)",
              "beginCaptures": {
                "1": { "name": "keyword.language.dune-project" }
              },
              "contentName": "constant.language.dune-project",
              "patterns": [{ "include": "source.dune#general" }]
            },

            {
              "comment": "synopsis/description",
              "begin": "\\([[:space:]]*(synopsis|description)\\b",
              "end": "\\)",
              "beginCaptures": {
                "1": { "name": "keyword.language.dune-project" }
              },
              "patterns": [{ "include": "source.dune#general" }]
            },

            {
              "comment": "depends/conflicts/depopts",
              "begin": "\\([[:space:]]*(depends|conflicts|depopts)\\b",
              "end": "\\)",
              "beginCaptures": {
                "1": { "name": "keyword.language.dune-project" }
              },
              "patterns": [
                {
                  "comment": "dependency",
                  "name": "variable.other.declaration.dune-project",
                  "match": "\\b([[:word:]-]+)\\b"
                },
                {
                  "comment": "dependency constraint",
                  "begin": "\\([[:space:]]*([[:word:]-]+)\\b",
                  "end": "\\)",
                  "beginCaptures": {
                    "1": { "name": "variable.other.declaration.dune-project" }
                  },
                  "patterns": [{ "include": "source.dune#general" }]
                },
                { "include": "source.dune#general" }
              ]
            },

            {
              "comment": "tags",
              "begin": "\\([[:space:]]*(tags)\\b",
              "end": "\\)",
              "beginCaptures": {
                "1": { "name": "keyword.language.dune-project" }
              },
              "contentName": "variable.other.declaration.dune-project",
              "patterns": [{ "include": "source.dune#general" }]
            },

            {
              "comment": "deprecated_package_names",
              "begin": "\\([[:space:]]*(deprecated_package_names)\\b",
              "end": "\\)",
              "beginCaptures": {
                "1": { "name": "keyword.language.dune-project" }
              },
              "patterns": [{ "include": "source.dune#general" }]
            },

            {
              "comment": "allow_empty",
              "begin": "\\([[:space:]]*(allow_empty)\\b",
              "end": "\\)",
              "beginCaptures": {
                "1": { "name": "keyword.language.dune-project" }
              },
              "patterns": [{ "include": "source.dune#general" }]
            },

            { "include": "#opam-metadata" },
            { "include": "source.dune#general" }
          ]
        },

        {
          "comment": "using",
          "begin": "\\([[:space:]]*(using)([[:space:]]+menhir)?\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" },
            "2": { "name": "variable.other.declaration.dune-project" }
          },
          "patterns": [{ "include": "source.dune#general" }]
        },

        {
          "comment": "cram",
          "begin": "\\([[:space:]]*(cram)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "contentName": "variable.other.declaration.dune-project",
          "patterns": [{ "include": "source.dune#general" }]
        },
        {
          "comment": "accept_alternative_dune_file_name",
          "begin": "\\([[:space:]]*(accept_alternative_dune_file_name)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [{ "include": "source.dune#general" }]
        },
        {
          "comment": "executables_implicit_empty_intf",
          "begin": "\\([[:space:]]*(executables_implicit_empty_intf)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [{ "include": "source.dune#general" }]
        },
        {
          "comment": "expand_aliases_in_sandbox",
          "begin": "\\([[:space:]]*(expand_aliases_in_sandbox)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [{ "include": "source.dune#general" }]
        },
        {
          "comment": "opam_file_location",
          "begin": "\\([[:space:]]*(opam_file_location)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [
            {
              "comment": "relative_to_project/inside_opam_directory",
              "name": "variable.other.declaration.dune-project",
              "match": "\\b(relative_to_project|inside_opam_directory)\\b"
            },
            { "include": "source.dune#general" }
          ]
        },
        {
          "comment": "subst",
          "begin": "\\([[:space:]]*(subst)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [
            {
              "comment": "enabled/disabled",
              "name": "variable.other.declaration.dune-project",
              "match": "\\b(enabled|disabled)\\b"
            },
            { "include": "source.dune#general" }
          ]
        },
        {
          "comment": "use_standard_c_and_cxx_flags",
          "begin": "\\([[:space:]]*(use_standard_c_and_cxx_flags)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [{ "include": "source.dune#general" }]
        },
        {
          "comment": "map_workspace_root",
          "begin": "\\([[:space:]]*(map_workspace_root)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [{ "include": "source.dune#general" }]
        },
        {
          "comment": "warnings",
          "begin": "\\([[:space:]]*(warnings)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [{ "include": "source.dune#general" }]
        },
        {
          "comment": "maintenance_intent",
          "begin": "\\([[:space:]]*(maintenance_intent)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [{ "include": "source.dune#general" }]
        },
        {
          "comment": "pin",
          "begin": "\\([[:space:]]*(pin)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [
            {
              "comment": "url",
              "begin": "\\([[:space:]]*(url)\\b",
              "end": "\\)",
              "beginCaptures": {
                "1": { "name": "keyword.language.dune-project" }
              },
              "patterns": [{ "include": "source.dune#general" }]
            },
            {
              "comment": "package",
              "begin": "\\([[:space:]]*(package)\\b",
              "end": "\\)",
              "beginCaptures": {
                "1": { "name": "keyword.language.dune-project" }
              },
              "patterns": [
                {
                  "comment": "name",
                  "begin": "\\([[:space:]]*(name)\\b",
                  "end": "\\)",
                  "beginCaptures": {
                    "1": { "name": "keyword.language.dune-project" }
                  },
                  "contentName": "variable.other.declaration.dune-project",
                  "patterns": [{ "include": "source.dune#general" }]
                },
                {
                  "comment": "version",
                  "begin": "\\([[:space:]]*(version)\\b",
                  "end": "\\)",
                  "beginCaptures": {
                    "1": { "name": "keyword.language.dune-project" }
                  },
                  "contentName": "constant.language.dune-project",
                  "patterns": [{ "include": "source.dune#general" }]
                },
                { "include": "source.dune#general" }
              ]
            },
            { "include": "source.dune#general" }
          ]
        },

        { "include": "#opam-metadata" }
      ]
    },

    "opam-metadata": {
      "patterns": [
        {
          "comment": "license",
          "begin": "\\([[:space:]]*(license)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "contentName": "constant.language.dune-project",
          "patterns": [{ "include": "source.dune#general" }]
        },

        {
          "comment": "authors/maintainers",
          "begin": "\\([[:space:]]*(authors|maintainers)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [{ "include": "source.dune#general" }]
        },

        {
          "comment": "source",
          "begin": "\\([[:space:]]*(source)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [
            {
              "comment": "hosting services",
              "begin": "\\([[:space:]]*(bitbucket|github|gitlab|sourcehut)\\b",
              "end": "\\)",
              "beginCaptures": {
                "1": { "name": "keyword.language.dune-project" }
              },
              "patterns": [
                {
                  "name": "keyword.language.dune-project",
                  "match": "/"
                },
                { "include": "source.dune#general" }
              ],
              "contentName": "string.other.line.dune-project"
            },
            {
              "comment": "uri",
              "begin": "\\([[:space:]]*(uri)\\b",
              "end": "\\)",
              "beginCaptures": {
                "1": { "name": "keyword.language.dune-project" }
              },
              "patterns": [{ "include": "source.dune#general" }]
            },
            { "include": "source.dune#general" }
          ]
        },

        {
          "comment": "bug_reports/homepage/documentation",
          "begin": "\\([[:space:]]*(bug_reports|homepage|documentation)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [{ "include": "source.dune#general" }]
        },

        {
          "comment": "maintenance_intent",
          "begin": "\\([[:space:]]*(maintenance_intent)\\b",
          "end": "\\)",
          "beginCaptures": {
            "1": { "name": "keyword.language.dune-project" }
          },
          "patterns": [{ "include": "source.dune#general" }]
        }
      ]
    }
  }
}
