{
  "displayName": "Nextflow",
  "name": "nextflow",
  "patterns": [
    {
      "include": "#nextflow"
    }
  ],
  "repository": {
    "enum-def": {
      "begin": "^\\s*(enum)\\s+(\\w+)\\s*\\{",
      "beginCaptures": {
        "1": {
          "name": "keyword.nextflow"
        },
        "2": {
          "name": "storage.type.groovy"
        }
      },
      "end": "}",
      "patterns": [
        {
          "include": "source.nextflow-groovy#comments"
        },
        {
          "include": "#enum-values"
        }
      ]
    },
    "enum-values": {
      "patterns": [
        {
          "begin": "(?<=;|^)\\s*\\b([0-9A-Z_]+)(?=\\s*(?:[(,}]|$))",
          "beginCaptures": {
            "1": {
              "name": "constant.enum.name.groovy"
            }
          },
          "end": ",|(?=})|^(?!\\s*\\w+\\s*(?:,|$))",
          "patterns": [
            {
              "begin": "\\(",
              "end": "\\)",
              "name": "meta.enum.value.groovy",
              "patterns": [
                {
                  "match": ",",
                  "name": "punctuation.definition.seperator.parameter.groovy"
                },
                {
                  "include": "#groovy-code"
                }
              ]
            }
          ]
        }
      ]
    },
    "function-body": {
      "patterns": [
        {
          "match": "\\s"
        },
        {
          "begin": "(?=[<\\w][^(]*\\s+[$<\\w]+\\s*\\()",
          "end": "(?=[$\\w]+\\s*\\()",
          "name": "meta.method.return-type.java",
          "patterns": [
            {
              "include": "source.nextflow-groovy#types"
            }
          ]
        },
        {
          "begin": "([$\\w]+)\\s*\\(",
          "beginCaptures": {
            "1": {
              "name": "entity.name.function.nextflow"
            }
          },
          "end": "\\)",
          "name": "meta.definition.method.signature.java",
          "patterns": [
            {
              "begin": "(?=[^)])",
              "end": "(?=\\))",
              "name": "meta.method.parameters.groovy",
              "patterns": [
                {
                  "begin": "(?=[^),])",
                  "end": "(?=[),])",
                  "name": "meta.method.parameter.groovy",
                  "patterns": [
                    {
                      "match": ",",
                      "name": "punctuation.definition.separator.groovy"
                    },
                    {
                      "begin": "=",
                      "beginCaptures": {
                        "0": {
                          "name": "keyword.operator.assignment.groovy"
                        }
                      },
                      "end": "(?=[),])",
                      "name": "meta.parameter.default.groovy",
                      "patterns": [
                        {
                          "include": "source.nextflow-groovy#groovy-code"
                        }
                      ]
                    },
                    {
                      "include": "source.nextflow-groovy#parameters"
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "begin": "(?=<)",
          "end": "(?=\\s)",
          "name": "meta.method.paramerised-type.groovy",
          "patterns": [
            {
              "begin": "<",
              "end": ">",
              "name": "storage.type.parameters.groovy",
              "patterns": [
                {
                  "include": "source.nextflow-groovy#types"
                },
                {
                  "match": ",",
                  "name": "punctuation.definition.seperator.groovy"
                }
              ]
            }
          ]
        },
        {
          "begin": "\\{",
          "end": "(?=})",
          "name": "meta.method.body.java",
          "patterns": [
            {
              "include": "source.nextflow-groovy#groovy-code"
            }
          ]
        }
      ]
    },
    "function-def": {
      "applyEndPatternLast": 1,
      "begin": "(?<=;|^|\\{)(?=\\s*(?:def|(?:(?:boolean|byte|char|short|int|float|long|double)|@?(?:[A-Za-z]\\w*\\.)*[A-Z]+\\w*)[]\\[]*(?:<.*>)?n)\\s+([^=]+\\s+)?\\w+\\s*\\()",
      "end": "}|(?=[^{])",
      "name": "meta.definition.method.groovy",
      "patterns": [
        {
          "include": "#function-body"
        }
      ]
    },
    "include-decl": {
      "patterns": [
        {
          "match": "^\\b(include)\\b",
          "name": "keyword.nextflow"
        },
        {
          "match": "\\b(from)\\b",
          "name": "keyword.nextflow"
        }
      ]
    },
    "nextflow": {
      "patterns": [
        {
          "include": "#enum-def"
        },
        {
          "include": "#function-def"
        },
        {
          "include": "#process-def"
        },
        {
          "include": "#workflow-def"
        },
        {
          "include": "#output-def"
        },
        {
          "include": "#include-decl"
        },
        {
          "include": "source.nextflow-groovy"
        }
      ]
    },
    "output-def": {
      "begin": "^\\s*(output)\\s*\\{",
      "beginCaptures": {
        "1": {
          "name": "keyword.nextflow"
        }
      },
      "end": "}",
      "name": "output.nextflow",
      "patterns": [
        {
          "include": "source.nextflow-groovy#groovy"
        }
      ]
    },
    "process-body": {
      "patterns": [
        {
          "match": "(?:input|output|when|script|shell|exec):",
          "name": "constant.block.nextflow"
        },
        {
          "match": "\\b(val|env|file|path|stdin|stdout|tuple)([(\\s])",
          "name": "entity.name.function.nextflow"
        },
        {
          "include": "source.nextflow-groovy#groovy"
        }
      ]
    },
    "process-def": {
      "begin": "^\\s*(process)\\s+(\\w+)\\s*\\{",
      "beginCaptures": {
        "1": {
          "name": "keyword.nextflow"
        },
        "2": {
          "name": "entity.name.function.nextflow"
        }
      },
      "end": "}",
      "name": "process.nextflow",
      "patterns": [
        {
          "include": "#process-body"
        }
      ]
    },
    "workflow-body": {
      "patterns": [
        {
          "match": "(?:take|main|emit|publish):",
          "name": "constant.block.nextflow"
        },
        {
          "include": "source.nextflow-groovy#groovy"
        }
      ]
    },
    "workflow-def": {
      "begin": "^\\s*(workflow)(?:\\s+(\\w+))?\\s*\\{",
      "beginCaptures": {
        "1": {
          "name": "keyword.nextflow"
        },
        "2": {
          "name": "entity.name.function.nextflow"
        }
      },
      "end": "}",
      "name": "workflow.nextflow",
      "patterns": [
        {
          "include": "#workflow-body"
        }
      ]
    }
  },
  "scopeName": "source.nextflow"
}
