goLanguage top-level constant

Language const goLanguage

Go (source.go).

Implementation

const goLanguage = Language(
  name: 'go',
  scopeName: 'source.go',
  displayName: 'Go',
  aliases: [],
  grammar: <String, Object?>{
    'displayName': 'Go',
    'name': 'go',
    'patterns': [
      {'include': '#statements'},
    ],
    'repository': {
      'after_control_variables': {
        'captures': {
          '1': {
            'patterns': [
              {'include': '#type-declarations-without-brackets'},
              {
                'match': '\\[',
                'name': 'punctuation.definition.begin.bracket.square.go',
              },
              {
                'match': ']',
                'name': 'punctuation.definition.end.bracket.square.go',
              },
              {'match': '\\w+', 'name': 'variable.other.go'},
            ],
          },
        },
        'match':
            '(?<=\\brange\\b|;|\\bif\\b|\\bfor\\b|[<>]|<=|>=|==|!=|\\w[-%*+/]|\\w[-%*+/]=|\\|\\||&&)\\s*((?![]\\[]+)[-\\]!%*+./:<=>\\[_[:alnum:]]+)\\s*(?=\\{)',
      },
      'brackets': {
        'patterns': [
          {
            'begin': '\\{',
            'beginCaptures': {
              '0': {'name': 'punctuation.definition.begin.bracket.curly.go'},
            },
            'end': '}',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.curly.go'},
            },
            'patterns': [
              {'include': '\$self'},
            ],
          },
          {
            'begin': '\\(',
            'beginCaptures': {
              '0': {'name': 'punctuation.definition.begin.bracket.round.go'},
            },
            'end': '\\)',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.round.go'},
            },
            'patterns': [
              {'include': '\$self'},
            ],
          },
          {
            'begin': '\\[',
            'beginCaptures': {
              '0': {'name': 'punctuation.definition.begin.bracket.square.go'},
            },
            'end': ']',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.square.go'},
            },
            'patterns': [
              {'include': '\$self'},
            ],
          },
        ],
      },
      'built_in_functions': {
        'patterns': [
          {
            'match':
                '\\b(append|cap|close|complex|copy|delete|imag|len|panic|print|println|real|recover|min|max|clear)\\b(?=\\()',
            'name': 'entity.name.function.support.builtin.go',
          },
          {
            'begin': '\\b(new)\\b(\\()',
            'beginCaptures': {
              '1': {'name': 'entity.name.function.support.builtin.go'},
              '2': {'name': 'punctuation.definition.begin.bracket.round.go'},
            },
            'end': '\\)',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.round.go'},
            },
            'patterns': [
              {'include': '#functions'},
              {'include': '#struct_variables_types'},
              {'include': '#support_functions'},
              {'include': '#type-declarations'},
              {'include': '#generic_types'},
              {'match': '\\w+', 'name': 'entity.name.type.go'},
              {'include': '\$self'},
            ],
          },
          {
            'begin':
                '\\b(make)\\b(\\()((?:(?:[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+(?:\\([^)]+\\))?)?[]*\\[]+{0,1}(?:(?!\\bmap\\b)[.\\w]+)?(\\[(?:\\S+(?:,\\s*\\S+)*)?])?,?)?',
            'beginCaptures': {
              '1': {'name': 'entity.name.function.support.builtin.go'},
              '2': {'name': 'punctuation.definition.begin.bracket.round.go'},
              '3': {
                'patterns': [
                  {'include': '#type-declarations-without-brackets'},
                  {'include': '#parameter-variable-types'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'end': '\\)',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.round.go'},
            },
            'patterns': [
              {'include': '\$self'},
            ],
          },
        ],
      },
      'comments': {
        'patterns': [
          {
            'begin': '(/\\*)',
            'beginCaptures': {
              '1': {'name': 'punctuation.definition.comment.go'},
            },
            'end': '(\\*/)',
            'endCaptures': {
              '1': {'name': 'punctuation.definition.comment.go'},
            },
            'name': 'comment.block.go',
          },
          {
            'begin': '(//)',
            'beginCaptures': {
              '1': {'name': 'punctuation.definition.comment.go'},
            },
            'end': '\\n|\$',
            'name': 'comment.line.double-slash.go',
          },
        ],
      },
      'const_assignment': {
        'patterns': [
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#delimiters'},
                  {'match': '\\w+', 'name': 'variable.other.constant.go'},
                ],
              },
              '2': {
                'patterns': [
                  {'include': '#type-declarations-without-brackets'},
                  {'include': '#generic_types'},
                  {
                    'match': '\\(',
                    'name': 'punctuation.definition.begin.bracket.round.go',
                  },
                  {
                    'match': '\\)',
                    'name': 'punctuation.definition.end.bracket.round.go',
                  },
                  {
                    'match': '\\[',
                    'name': 'punctuation.definition.begin.bracket.square.go',
                  },
                  {
                    'match': ']',
                    'name': 'punctuation.definition.end.bracket.square.go',
                  },
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'match':
                '(?<=\\bconst\\b)\\s*\\b([.\\w]+(?:,\\s*[.\\w]+)*)\\s*((?:(?:[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+(?:\\([^)]+\\))?)?(?![]*\\[]+{0,1}\\b(?:struct|func|map)\\b)(?:[]*.\\[\\w]+(?:,\\s*[]*.\\[\\w]+)*)?\\s*=?)?',
          },
          {
            'begin': '(?<=\\bconst\\b)\\s*(\\()',
            'beginCaptures': {
              '1': {'name': 'punctuation.definition.begin.bracket.round.go'},
            },
            'end': '\\)',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.round.go'},
            },
            'patterns': [
              {
                'captures': {
                  '1': {
                    'patterns': [
                      {'include': '#delimiters'},
                      {'match': '\\w+', 'name': 'variable.other.constant.go'},
                    ],
                  },
                  '2': {
                    'patterns': [
                      {'include': '#type-declarations-without-brackets'},
                      {'include': '#generic_types'},
                      {
                        'match': '\\(',
                        'name': 'punctuation.definition.begin.bracket.round.go',
                      },
                      {
                        'match': '\\)',
                        'name': 'punctuation.definition.end.bracket.round.go',
                      },
                      {
                        'match': '\\[',
                        'name':
                            'punctuation.definition.begin.bracket.square.go',
                      },
                      {
                        'match': ']',
                        'name': 'punctuation.definition.end.bracket.square.go',
                      },
                      {'match': '\\w+', 'name': 'entity.name.type.go'},
                    ],
                  },
                },
                'match':
                    '^\\s*\\b([.\\w]+(?:,\\s*[.\\w]+)*)\\s*((?:(?:[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+(?:\\([^)]+\\))?)?(?![]*\\[]+{0,1}\\b(?:struct|func|map)\\b)(?:[]*.\\[\\w]+(?:,\\s*[]*.\\[\\w]+)*)?\\s*=?)?',
              },
              {'include': '\$self'},
            ],
          },
        ],
      },
      'delimiters': {
        'patterns': [
          {'match': ',', 'name': 'punctuation.other.comma.go'},
          {'match': '\\.(?!\\.\\.)', 'name': 'punctuation.other.period.go'},
          {'match': ':(?!=)', 'name': 'punctuation.other.colon.go'},
        ],
      },
      'double_parentheses_types': {
        'captures': {
          '1': {
            'patterns': [
              {'include': '#type-declarations-without-brackets'},
              {
                'match': '\\(',
                'name': 'punctuation.definition.begin.bracket.round.go',
              },
              {
                'match': '\\)',
                'name': 'punctuation.definition.end.bracket.round.go',
              },
              {
                'match': '\\[',
                'name': 'punctuation.definition.begin.bracket.square.go',
              },
              {
                'match': ']',
                'name': 'punctuation.definition.end.bracket.square.go',
              },
              {
                'match': '\\{',
                'name': 'punctuation.definition.begin.bracket.curly.go',
              },
              {
                'match': '}',
                'name': 'punctuation.definition.end.bracket.curly.go',
              },
              {'match': '\\w+', 'name': 'entity.name.type.go'},
            ],
          },
        },
        'match':
            '(?<!\\w)(\\([]*\\[]+{0,1}[.\\w]+(?:\\[(?:[]*.\\[{}\\w]+(?:,\\s*[]*.\\[{}\\w]+)*)?])?\\))(?=\\()',
      },
      'function_declaration': {
        'begin': '^\\b(func)\\b\\s*(\\([^)]+\\)\\s*)?(?:(\\w+)(?=[(\\[]))?',
        'beginCaptures': {
          '1': {'name': 'keyword.function.go'},
          '2': {
            'patterns': [
              {
                'begin': '\\(',
                'beginCaptures': {
                  '0': {
                    'name': 'punctuation.definition.begin.bracket.round.go',
                  },
                },
                'end': '\\)',
                'endCaptures': {
                  '0': {'name': 'punctuation.definition.end.bracket.round.go'},
                },
                'patterns': [
                  {
                    'captures': {
                      '1': {'name': 'variable.parameter.go'},
                      '2': {
                        'patterns': [
                          {'include': '#type-declarations-without-brackets'},
                          {'include': '#parameter-variable-types'},
                          {'match': '\\w+', 'name': 'entity.name.type.go'},
                        ],
                      },
                    },
                    'match':
                        '(\\w+\\s+)?([*.\\w]+(?:\\[(?:[*.\\w]+(?:,\\s+)?)+{0,1}])?)',
                  },
                  {'include': '\$self'},
                ],
              },
            ],
          },
          '3': {
            'patterns': [
              {'match': '\\d\\w*', 'name': 'invalid.illegal.identifier.go'},
              {'match': '\\w+', 'name': 'entity.name.function.go'},
            ],
          },
        },
        'end':
            '(?<=\\))\\s*((?:[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}(?![]*\\[]+{0,1}\\b(?:struct|interface)\\b)[-\\]*.\\[\\w]+)?\\s*(?=\\{)',
        'endCaptures': {
          '1': {
            'patterns': [
              {'include': '#type-declarations-without-brackets'},
              {'include': '#parameter-variable-types'},
              {'match': '\\w+', 'name': 'entity.name.type.go'},
            ],
          },
        },
        'patterns': [
          {
            'begin': '\\(',
            'beginCaptures': {
              '0': {'name': 'punctuation.definition.begin.bracket.round.go'},
            },
            'end': '\\)',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.round.go'},
            },
            'patterns': [
              {'include': '#function_param_types'},
            ],
          },
          {
            'begin': '([*.\\w]+)?(\\[)',
            'beginCaptures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
              '2': {'name': 'punctuation.definition.begin.bracket.square.go'},
            },
            'end': ']',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.square.go'},
            },
            'patterns': [
              {'include': '#generic_param_types'},
            ],
          },
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations-without-brackets'},
                  {'include': '#parameter-variable-types'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'match':
                '(?<=\\))\\s*((?:\\s*[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}[-\\]*.<>\\[\\w]+\\s*(?:/[*/].*)?)\$',
          },
          {'include': '\$self'},
        ],
      },
      'function_param_types': {
        'patterns': [
          {'include': '#struct_variables_types'},
          {'include': '#interface_variables_types'},
          {'include': '#type-declarations-without-brackets'},
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'variable.parameter.go'},
                ],
              },
            },
            'match':
                '((?:\\b\\w+,\\s*)+{0,1}\\b\\w+)\\s+(?=(?:\\s*[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}[]*\\[]+{0,1}\\b(?:struct|interface)\\b\\s*\\{)',
          },
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'variable.parameter.go'},
                ],
              },
            },
            'match': '(?:(?<=\\()|^\\s*)((?:\\b\\w+,\\s*)+(?:/[*/].*)?)\$',
          },
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#delimiters'},
                  {'match': '\\w+', 'name': 'variable.parameter.go'},
                ],
              },
              '2': {
                'patterns': [
                  {'include': '#type-declarations-without-brackets'},
                  {'include': '#parameter-variable-types'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'match':
                '((?:\\b\\w+,\\s*)+{0,1}\\b\\w+)\\s+((?:\\s*[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}(?:[]*.\\[\\w]+{0,1}(?:\\bfunc\\b\\([^)]+{0,1}\\)(?:\\s*[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}\\s*)+(?:[]*.\\[\\w]+|\\([^)]+{0,1}\\))?|(?:[]*\\[]+{0,1}[*.\\w]+(?:\\[[^]]+])?[*.\\w]+{0,1})+))',
          },
          {
            'begin': '([*.\\w]+)?(\\[)',
            'beginCaptures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
              '2': {'name': 'punctuation.definition.begin.bracket.square.go'},
            },
            'end': ']',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.square.go'},
            },
            'patterns': [
              {'include': '#generic_param_types'},
            ],
          },
          {
            'begin': '\\(',
            'beginCaptures': {
              '0': {'name': 'punctuation.definition.begin.bracket.round.go'},
            },
            'end': '\\)',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.round.go'},
            },
            'patterns': [
              {'include': '#function_param_types'},
            ],
          },
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'match': '([.\\w]+)',
          },
          {'include': '\$self'},
        ],
      },
      'functions': {
        'begin': '\\b(func)\\b(?=\\()',
        'beginCaptures': {
          '1': {'name': 'keyword.function.go'},
        },
        'end':
            '(?<=\\))(\\s*(?:[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+)?(\\s*(?:[]*\\[]+{0,1}[*.\\w]+)?(?:\\[(?:[*.\\w]+{0,1}(?:\\[[^]]+{0,1}])?(?:,\\s+)?)+]|\\([^)]+{0,1}\\))?[*.\\w]+{0,1}\\s*(?=\\{)|\\s*(?:[]*\\[]+{0,1}(?!\\bfunc\\b)[*.\\w]+(?:\\[(?:[*.\\w]+{0,1}(?:\\[[^]]+{0,1}])?(?:,\\s+)?)+])?[*.\\w]+{0,1}|\\([^)]+{0,1}\\)))?',
        'endCaptures': {
          '1': {
            'patterns': [
              {'include': '#type-declarations'},
            ],
          },
          '2': {
            'patterns': [
              {'include': '#type-declarations-without-brackets'},
              {'include': '#parameter-variable-types'},
              {'match': '\\w+', 'name': 'entity.name.type.go'},
            ],
          },
        },
        'patterns': [
          {'include': '#parameter-variable-types'},
        ],
      },
      'functions_inline': {
        'captures': {
          '1': {'name': 'keyword.function.go'},
          '2': {
            'patterns': [
              {'include': '#type-declarations-without-brackets'},
              {
                'begin': '\\(',
                'beginCaptures': {
                  '0': {
                    'name': 'punctuation.definition.begin.bracket.round.go',
                  },
                },
                'end': '\\)',
                'endCaptures': {
                  '0': {'name': 'punctuation.definition.end.bracket.round.go'},
                },
                'patterns': [
                  {'include': '#function_param_types'},
                  {'include': '\$self'},
                ],
              },
              {
                'match': '\\[',
                'name': 'punctuation.definition.begin.bracket.square.go',
              },
              {
                'match': ']',
                'name': 'punctuation.definition.end.bracket.square.go',
              },
              {
                'match': '\\{',
                'name': 'punctuation.definition.begin.bracket.curly.go',
              },
              {
                'match': '}',
                'name': 'punctuation.definition.end.bracket.curly.go',
              },
              {'match': '\\w+', 'name': 'entity.name.type.go'},
            ],
          },
        },
        'match': '\\b(func)\\b(\\([^/]*?\\)\\s+\\([^/]*?\\))\\s+(?=\\{)',
      },
      'generic_param_types': {
        'patterns': [
          {'include': '#struct_variables_types'},
          {'include': '#interface_variables_types'},
          {'include': '#type-declarations-without-brackets'},
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'variable.parameter.go'},
                ],
              },
            },
            'match':
                '((?:\\b\\w+,\\s*)+{0,1}\\b\\w+)\\s+(?=(?:\\s*[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}[]*\\[]+{0,1}\\b(?:struct|interface)\\b\\s*\\{)',
          },
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'variable.parameter.go'},
                ],
              },
            },
            'match': '(?:(?<=\\()|^\\s*)((?:\\b\\w+,\\s*)+(?:/[*/].*)?)\$',
          },
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#delimiters'},
                  {'match': '\\w+', 'name': 'variable.parameter.go'},
                ],
              },
              '2': {
                'patterns': [
                  {'include': '#type-declarations-without-brackets'},
                  {'include': '#parameter-variable-types'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
              '3': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'match':
                '((?:\\b\\w+,\\s*)+{0,1}\\b\\w+)\\s+((?:\\s*[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}(?:[]*.\\[\\w]+{0,1}(?:\\bfunc\\b\\([^)]+{0,1}\\)(?:\\s*[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}\\s*)+(?:[*.\\w]+|\\([^)]+{0,1}\\))?|(?:(?:[*.~\\w]+|\\[(?:[*.\\w]+{0,1}(?:\\[[^]]+{0,1}])?(?:,\\s+)?)+])[*.\\w]+{0,1})+))',
          },
          {
            'begin': '([*.\\w]+)?(\\[)',
            'beginCaptures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
              '2': {'name': 'punctuation.definition.begin.bracket.square.go'},
            },
            'end': ']',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.square.go'},
            },
            'patterns': [
              {'include': '#generic_param_types'},
            ],
          },
          {
            'begin': '\\(',
            'beginCaptures': {
              '0': {'name': 'punctuation.definition.begin.bracket.round.go'},
            },
            'end': '\\)',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.round.go'},
            },
            'patterns': [
              {'include': '#function_param_types'},
            ],
          },
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'match': '\\b([.\\w]+)',
          },
          {'include': '\$self'},
        ],
      },
      'generic_types': {
        'captures': {
          '1': {
            'patterns': [
              {'include': '#type-declarations'},
              {'match': '\\w+', 'name': 'entity.name.type.go'},
            ],
          },
          '2': {
            'patterns': [
              {'include': '#parameter-variable-types'},
            ],
          },
        },
        'match': '([*.\\w]+)(\\[[^]]+{0,1}])',
      },
      'group-functions': {
        'patterns': [
          {'include': '#function_declaration'},
          {'include': '#functions_inline'},
          {'include': '#functions'},
          {'include': '#built_in_functions'},
          {'include': '#support_functions'},
        ],
      },
      'group-types': {
        'patterns': [
          {'include': '#other_struct_interface_expressions'},
          {'include': '#type_assertion_inline'},
          {'include': '#struct_variables_types'},
          {'include': '#interface_variables_types'},
          {'include': '#single_type'},
          {'include': '#multi_types'},
          {'include': '#struct_interface_declaration'},
          {'include': '#double_parentheses_types'},
          {'include': '#switch_types'},
          {'include': '#type-declarations'},
        ],
      },
      'group-variables': {
        'patterns': [
          {'include': '#const_assignment'},
          {'include': '#var_assignment'},
          {'include': '#variable_assignment'},
          {'include': '#label_loop_variables'},
          {'include': '#slice_index_variables'},
          {'include': '#property_variables'},
          {'include': '#switch_variables'},
          {'include': '#other_variables'},
        ],
      },
      'hover': {
        'patterns': [
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'variable.other.property.go'},
                ],
              },
              '2': {
                'patterns': [
                  {
                    'match': '\\binvalid\\b\\s+\\btype\\b',
                    'name': 'invalid.field.go',
                  },
                  {'include': '#type-declarations-without-brackets'},
                  {'include': '#parameter-variable-types'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'match': '(?<=^\\bfield\\b)\\s+([*.\\w]+)\\s+([\\s\\S]+)',
          },
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations-without-brackets'},
                  {'include': '#parameter-variable-types'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'match': '(?<=^\\breturns\\b)\\s+([\\s\\S]+)',
          },
        ],
      },
      'import': {
        'patterns': [
          {
            'begin': '\\b(import)\\s+',
            'beginCaptures': {
              '1': {'name': 'keyword.control.import.go'},
            },
            'end': '(?!\\G)',
            'patterns': [
              {'include': '#imports'},
            ],
          },
        ],
      },
      'imports': {
        'patterns': [
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#delimiters'},
                  {'match': '\\w+', 'name': 'variable.other.import.go'},
                ],
              },
              '2': {'name': 'string.quoted.double.go'},
              '3': {'name': 'punctuation.definition.string.begin.go'},
              '4': {'name': 'entity.name.import.go'},
              '5': {'name': 'punctuation.definition.string.end.go'},
            },
            'match': '(\\s*[.\\w]+)?\\s*((")([^"]*)("))',
          },
          {
            'begin': '\\(',
            'beginCaptures': {
              '0': {
                'name': 'punctuation.definition.imports.begin.bracket.round.go',
              },
            },
            'end': '\\)',
            'endCaptures': {
              '0': {
                'name': 'punctuation.definition.imports.end.bracket.round.go',
              },
            },
            'patterns': [
              {'include': '#comments'},
              {'include': '#imports'},
            ],
          },
          {'include': '\$self'},
        ],
      },
      'interface_variables_types': {
        'begin': '\\b(interface)\\b\\s*(\\{)',
        'beginCaptures': {
          '1': {'name': 'keyword.interface.go'},
          '2': {'name': 'punctuation.definition.begin.bracket.curly.go'},
        },
        'end': '}',
        'endCaptures': {
          '0': {'name': 'punctuation.definition.end.bracket.curly.go'},
        },
        'patterns': [
          {'include': '#interface_variables_types_field'},
          {'include': '\$self'},
        ],
      },
      'interface_variables_types_field': {
        'patterns': [
          {'include': '#support_functions'},
          {'include': '#type-declarations-without-brackets'},
          {
            'begin': '([*.\\w]+)?(\\[)',
            'beginCaptures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
              '2': {'name': 'punctuation.definition.begin.bracket.square.go'},
            },
            'end': ']',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.square.go'},
            },
            'patterns': [
              {'include': '#generic_param_types'},
            ],
          },
          {
            'begin': '\\(',
            'beginCaptures': {
              '0': {'name': 'punctuation.definition.begin.bracket.round.go'},
            },
            'end': '\\)',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.round.go'},
            },
            'patterns': [
              {'include': '#function_param_types'},
            ],
          },
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'match': '([.\\w]+)',
          },
        ],
      },
      'keywords': {
        'patterns': [
          {
            'match':
                '\\b(break|case|continue|default|defer|else|fallthrough|for|go|goto|if|range|return|select|switch)\\b',
            'name': 'keyword.control.go',
          },
          {'match': '\\bchan\\b', 'name': 'keyword.channel.go'},
          {'match': '\\bconst\\b', 'name': 'keyword.const.go'},
          {'match': '\\bvar\\b', 'name': 'keyword.var.go'},
          {'match': '\\bfunc\\b', 'name': 'keyword.function.go'},
          {'match': '\\binterface\\b', 'name': 'keyword.interface.go'},
          {'match': '\\bmap\\b', 'name': 'keyword.map.go'},
          {'match': '\\bstruct\\b', 'name': 'keyword.struct.go'},
          {'match': '\\bimport\\b', 'name': 'keyword.control.import.go'},
          {'match': '\\btype\\b', 'name': 'keyword.type.go'},
        ],
      },
      'label_loop_variables': {
        'captures': {
          '1': {
            'patterns': [
              {'include': '#type-declarations'},
              {'match': '\\w+', 'name': 'variable.other.label.go'},
            ],
          },
        },
        'match':
            '^(\\s*\\w+:\\s*|\\s*\\b(?:break|goto|continue)\\b\\s+\\w+(?:\\s*/[*/]\\s*.*)?)\$',
      },
      'language_constants': {
        'captures': {
          '1': {'name': 'constant.language.boolean.go'},
          '2': {'name': 'constant.language.null.go'},
          '3': {'name': 'constant.language.iota.go'},
        },
        'match': '\\b(?:(true|false)|(nil)|(iota))\\b',
      },
      'map_types': {
        'begin': '\\b(map)\\b(\\[)',
        'beginCaptures': {
          '1': {'name': 'keyword.map.go'},
          '2': {'name': 'punctuation.definition.begin.bracket.square.go'},
        },
        'end':
            '(])((?:[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}(?![]*\\[]+{0,1}\\b(?:func|struct|map)\\b)[]*\\[]+{0,1}[.\\w]+(?:\\[(?:[]*.\\[{}\\w]+(?:,\\s*[]*.\\[{}\\w]+)*)?])?)?',
        'endCaptures': {
          '1': {'name': 'punctuation.definition.end.bracket.square.go'},
          '2': {
            'patterns': [
              {'include': '#type-declarations-without-brackets'},
              {
                'match': '\\[',
                'name': 'punctuation.definition.begin.bracket.square.go',
              },
              {
                'match': ']',
                'name': 'punctuation.definition.end.bracket.square.go',
              },
              {'match': '\\w+', 'name': 'entity.name.type.go'},
            ],
          },
        },
        'patterns': [
          {'include': '#type-declarations-without-brackets'},
          {'include': '#parameter-variable-types'},
          {'include': '#functions'},
          {
            'match': '\\[',
            'name': 'punctuation.definition.begin.bracket.square.go',
          },
          {
            'match': ']',
            'name': 'punctuation.definition.end.bracket.square.go',
          },
          {
            'match': '\\{',
            'name': 'punctuation.definition.begin.bracket.curly.go',
          },
          {'match': '}', 'name': 'punctuation.definition.end.bracket.curly.go'},
          {
            'match': '\\(',
            'name': 'punctuation.definition.begin.bracket.round.go',
          },
          {
            'match': '\\)',
            'name': 'punctuation.definition.end.bracket.round.go',
          },
          {'match': '\\w+', 'name': 'entity.name.type.go'},
        ],
      },
      'multi_types': {
        'begin': '\\b(type)\\b\\s*(\\()',
        'beginCaptures': {
          '1': {'name': 'keyword.type.go'},
          '2': {'name': 'punctuation.definition.begin.bracket.round.go'},
        },
        'end': '\\)',
        'endCaptures': {
          '0': {'name': 'punctuation.definition.end.bracket.round.go'},
        },
        'patterns': [
          {'include': '#struct_variables_types'},
          {'include': '#interface_variables_types'},
          {'include': '#type-declarations-without-brackets'},
          {'include': '#parameter-variable-types'},
          {'match': '\\w+', 'name': 'entity.name.type.go'},
        ],
      },
      'numeric_literals': {
        'captures': {
          '0': {
            'patterns': [
              {
                'begin': '(?=.)',
                'end': '\\n|\$',
                'patterns': [
                  {
                    'captures': {
                      '1': {
                        'name': 'constant.numeric.decimal.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '2': {
                        'name': 'punctuation.separator.constant.numeric.go',
                      },
                      '3': {'name': 'constant.numeric.decimal.point.go'},
                      '4': {
                        'name': 'constant.numeric.decimal.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '5': {
                        'name': 'punctuation.separator.constant.numeric.go',
                      },
                      '6': {'name': 'keyword.other.unit.exponent.decimal.go'},
                      '7': {
                        'name': 'keyword.operator.plus.exponent.decimal.go',
                      },
                      '8': {
                        'name': 'keyword.operator.minus.exponent.decimal.go',
                      },
                      '9': {
                        'name': 'constant.numeric.exponent.decimal.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '10': {'name': 'keyword.other.unit.imaginary.go'},
                      '11': {
                        'name': 'constant.numeric.decimal.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '12': {
                        'name': 'punctuation.separator.constant.numeric.go',
                      },
                      '13': {'name': 'keyword.other.unit.exponent.decimal.go'},
                      '14': {
                        'name': 'keyword.operator.plus.exponent.decimal.go',
                      },
                      '15': {
                        'name': 'keyword.operator.minus.exponent.decimal.go',
                      },
                      '16': {
                        'name': 'constant.numeric.exponent.decimal.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '17': {'name': 'keyword.other.unit.imaginary.go'},
                      '18': {'name': 'constant.numeric.decimal.point.go'},
                      '19': {
                        'name': 'constant.numeric.decimal.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '20': {
                        'name': 'punctuation.separator.constant.numeric.go',
                      },
                      '21': {'name': 'keyword.other.unit.exponent.decimal.go'},
                      '22': {
                        'name': 'keyword.operator.plus.exponent.decimal.go',
                      },
                      '23': {
                        'name': 'keyword.operator.minus.exponent.decimal.go',
                      },
                      '24': {
                        'name': 'constant.numeric.exponent.decimal.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '25': {'name': 'keyword.other.unit.imaginary.go'},
                      '26': {'name': 'keyword.other.unit.hexadecimal.go'},
                      '27': {
                        'name': 'constant.numeric.hexadecimal.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '28': {
                        'name': 'punctuation.separator.constant.numeric.go',
                      },
                      '29': {'name': 'constant.numeric.hexadecimal.go'},
                      '30': {
                        'name': 'constant.numeric.hexadecimal.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '31': {
                        'name': 'punctuation.separator.constant.numeric.go',
                      },
                      '32': {
                        'name': 'keyword.other.unit.exponent.hexadecimal.go',
                      },
                      '33': {
                        'name': 'keyword.operator.plus.exponent.hexadecimal.go',
                      },
                      '34': {
                        'name':
                            'keyword.operator.minus.exponent.hexadecimal.go',
                      },
                      '35': {
                        'name': 'constant.numeric.exponent.hexadecimal.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '36': {'name': 'keyword.other.unit.imaginary.go'},
                      '37': {'name': 'keyword.other.unit.hexadecimal.go'},
                      '38': {
                        'name': 'constant.numeric.hexadecimal.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '39': {
                        'name': 'punctuation.separator.constant.numeric.go',
                      },
                      '40': {
                        'name': 'keyword.other.unit.exponent.hexadecimal.go',
                      },
                      '41': {
                        'name': 'keyword.operator.plus.exponent.hexadecimal.go',
                      },
                      '42': {
                        'name':
                            'keyword.operator.minus.exponent.hexadecimal.go',
                      },
                      '43': {
                        'name': 'constant.numeric.exponent.hexadecimal.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '44': {'name': 'keyword.other.unit.imaginary.go'},
                      '45': {'name': 'keyword.other.unit.hexadecimal.go'},
                      '46': {'name': 'constant.numeric.hexadecimal.go'},
                      '47': {
                        'name': 'constant.numeric.hexadecimal.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '48': {
                        'name': 'punctuation.separator.constant.numeric.go',
                      },
                      '49': {
                        'name': 'keyword.other.unit.exponent.hexadecimal.go',
                      },
                      '50': {
                        'name': 'keyword.operator.plus.exponent.hexadecimal.go',
                      },
                      '51': {
                        'name':
                            'keyword.operator.minus.exponent.hexadecimal.go',
                      },
                      '52': {
                        'name': 'constant.numeric.exponent.hexadecimal.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '53': {'name': 'keyword.other.unit.imaginary.go'},
                    },
                    'match':
                        '\\G(?:(?:(?:(?:(?:(?=[.0-9])(?!0[BOXbox])([0-9](?:[0-9]|((?<=\\h)_(?=\\h)))*)((?<=[0-9])\\.|\\.(?=[0-9]))([0-9](?:[0-9]|((?<=\\h)_(?=\\h)))*)?(?:(?<!_)([Ee])(\\+?)(-?)([0-9](?:[0-9]|(?<=\\h)_(?=\\h))*))?(i(?!\\w))?(?:\\n|\$)|(?=[.0-9])(?!0[BOXbox])([0-9](?:[0-9]|((?<=\\h)_(?=\\h)))*)(?<!_)([Ee])(\\+?)(-?)([0-9](?:[0-9]|(?<=\\h)_(?=\\h))*)(i(?!\\w))?(?:\\n|\$))|((?<=[0-9])\\.|\\.(?=[0-9]))([0-9](?:[0-9]|((?<=\\h)_(?=\\h)))*)(?:(?<!_)([Ee])(\\+?)(-?)([0-9](?:[0-9]|(?<=\\h)_(?=\\h))*))?(i(?!\\w))?(?:\\n|\$))|(0[Xx])_?(\\h(?:\\h|((?<=\\h)_(?=\\h)))*)((?<=\\h)\\.|\\.(?=\\h))(\\h(?:\\h|((?<=\\h)_(?=\\h)))*)?(?<!_)([Pp])(\\+?)(-?)([0-9](?:[0-9]|(?<=\\h)_(?=\\h))*)(i(?!\\w))?(?:\\n|\$))|(0[Xx])_?(\\h(?:\\h|((?<=\\h)_(?=\\h)))*)(?<!_)([Pp])(\\+?)(-?)([0-9](?:[0-9]|(?<=\\h)_(?=\\h))*)(i(?!\\w))?(?:\\n|\$))|(0[Xx])((?<=\\h)\\.|\\.(?=\\h))(\\h(?:\\h|((?<=\\h)_(?=\\h)))*)(?<!_)([Pp])(\\+?)(-?)([0-9](?:[0-9]|(?<=\\h)_(?=\\h))*)(i(?!\\w))?(?:\\n|\$))',
                  },
                  {
                    'captures': {
                      '1': {
                        'name': 'constant.numeric.decimal.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '2': {
                        'name': 'punctuation.separator.constant.numeric.go',
                      },
                      '3': {'name': 'keyword.other.unit.imaginary.go'},
                      '4': {'name': 'keyword.other.unit.binary.go'},
                      '5': {
                        'name': 'constant.numeric.binary.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '6': {
                        'name': 'punctuation.separator.constant.numeric.go',
                      },
                      '7': {'name': 'keyword.other.unit.imaginary.go'},
                      '8': {'name': 'keyword.other.unit.octal.go'},
                      '9': {
                        'name': 'constant.numeric.octal.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '10': {
                        'name': 'punctuation.separator.constant.numeric.go',
                      },
                      '11': {'name': 'keyword.other.unit.imaginary.go'},
                      '12': {'name': 'keyword.other.unit.hexadecimal.go'},
                      '13': {
                        'name': 'constant.numeric.hexadecimal.go',
                        'patterns': [
                          {
                            'match': '(?<=\\h)_(?=\\h)',
                            'name': 'punctuation.separator.constant.numeric.go',
                          },
                        ],
                      },
                      '14': {
                        'name': 'punctuation.separator.constant.numeric.go',
                      },
                      '15': {'name': 'keyword.other.unit.imaginary.go'},
                    },
                    'match':
                        '\\G(?:(?:(?:(?=[.0-9])(?!0[BOXbox])([0-9](?:[0-9]|((?<=\\h)_(?=\\h)))*)(i(?!\\w))?(?:\\n|\$)|(0[Bb])_?([01](?:[01]|((?<=\\h)_(?=\\h)))*)(i(?!\\w))?(?:\\n|\$))|(0[Oo]?)_?((?:[0-7]|((?<=\\h)_(?=\\h)))+)(i(?!\\w))?(?:\\n|\$))|(0[Xx])_?(\\h(?:\\h|((?<=\\h)_(?=\\h)))*)(i(?!\\w))?(?:\\n|\$))',
                  },
                  {
                    'match': '(?:[.0-9A-Z_a-z]|(?<=[EPep])[-+])+',
                    'name': 'invalid.illegal.constant.numeric.go',
                  },
                ],
              },
            ],
          },
        },
        'match': '(?<!\\w)\\.?\\d(?:[.0-9A-Z_a-z]|(?<=[EPep])[-+])*',
      },
      'operators': {
        'patterns': [
          {
            'match': '(?<!\\w)[\\&*]+(?!\\d)(?=[]\\[\\w]|<-)',
            'name': 'keyword.operator.address.go',
          },
          {'match': '<-', 'name': 'keyword.operator.channel.go'},
          {'match': '--', 'name': 'keyword.operator.decrement.go'},
          {'match': '\\+\\+', 'name': 'keyword.operator.increment.go'},
          {
            'match': '(==|!=|<=|>=|<(?!<)|>(?!>))',
            'name': 'keyword.operator.comparison.go',
          },
          {'match': '(&&|\\|\\||!)', 'name': 'keyword.operator.logical.go'},
          {
            'match': '((?:|[-%*+/:^|]|<<|>>|&\\^?)=)',
            'name': 'keyword.operator.assignment.go',
          },
          {'match': '([-%*+/])', 'name': 'keyword.operator.arithmetic.go'},
          {
            'match': '(&(?!\\^)|[\\^|]|&\\^|<<|>>|~)',
            'name': 'keyword.operator.arithmetic.bitwise.go',
          },
          {'match': '\\.\\.\\.', 'name': 'keyword.operator.ellipsis.go'},
        ],
      },
      'other_struct_interface_expressions': {
        'patterns': [
          {'include': '#after_control_variables'},
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
              '2': {
                'patterns': [
                  {'include': '#type-declarations-without-brackets'},
                  {
                    'match': '\\[',
                    'name': 'punctuation.definition.begin.bracket.square.go',
                  },
                  {
                    'match': ']',
                    'name': 'punctuation.definition.end.bracket.square.go',
                  },
                  {
                    'match': '\\{',
                    'name': 'punctuation.definition.begin.bracket.curly.go',
                  },
                  {
                    'match': '}',
                    'name': 'punctuation.definition.end.bracket.curly.go',
                  },
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'match':
                '\\b(?!(?:struct|interface)\\b)([.\\w]+)(?<brackets>\\[(?:[^]\\[]|\\g<brackets>)*])?(?=\\{)',
          },
        ],
      },
      'other_variables': {'match': '\\w+', 'name': 'variable.other.go'},
      'package_name': {
        'patterns': [
          {
            'begin': '\\b(package)\\s+',
            'beginCaptures': {
              '1': {'name': 'keyword.package.go'},
            },
            'end': '(?!\\G)',
            'patterns': [
              {'match': '\\d\\w*', 'name': 'invalid.illegal.identifier.go'},
              {'match': '\\w+', 'name': 'entity.name.type.package.go'},
            ],
          },
        ],
      },
      'parameter-variable-types': {
        'patterns': [
          {
            'match': '\\{',
            'name': 'punctuation.definition.begin.bracket.curly.go',
          },
          {'match': '}', 'name': 'punctuation.definition.end.bracket.curly.go'},
          {
            'begin': '([*.\\w]+)?(\\[)',
            'beginCaptures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
              '2': {'name': 'punctuation.definition.begin.bracket.square.go'},
            },
            'end': ']',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.square.go'},
            },
            'patterns': [
              {'include': '#generic_param_types'},
            ],
          },
          {
            'begin': '\\(',
            'beginCaptures': {
              '0': {'name': 'punctuation.definition.begin.bracket.round.go'},
            },
            'end': '\\)',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.round.go'},
            },
            'patterns': [
              {'include': '#function_param_types'},
            ],
          },
        ],
      },
      'property_variables': {
        'captures': {
          '1': {
            'patterns': [
              {'include': '#type-declarations'},
              {'match': '\\w+', 'name': 'variable.other.property.go'},
            ],
          },
        },
        'match': '\\b([.\\w]+:(?!=))',
      },
      'raw_string_literals': {
        'begin': '`',
        'beginCaptures': {
          '0': {'name': 'punctuation.definition.string.begin.go'},
        },
        'end': '`',
        'endCaptures': {
          '0': {'name': 'punctuation.definition.string.end.go'},
        },
        'name': 'string.quoted.raw.go',
        'patterns': [
          {'include': '#string_placeholder'},
        ],
      },
      'runes': {
        'patterns': [
          {
            'begin': '\'',
            'beginCaptures': {
              '0': {'name': 'punctuation.definition.string.begin.go'},
            },
            'end': '\'',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.string.end.go'},
            },
            'name': 'string.quoted.rune.go',
            'patterns': [
              {
                'match':
                    '\\G(\\\\([0-7]{3}|["\'\\\\abfnrtv]|x\\h{2}|u\\h{4}|U\\h{8})|.)(?=\')',
                'name': 'constant.other.rune.go',
              },
              {'match': '[^\']+', 'name': 'invalid.illegal.unknown-rune.go'},
            ],
          },
        ],
      },
      'single_type': {
        'patterns': [
          {
            'captures': {
              '1': {'name': 'keyword.type.go'},
              '2': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
              '3': {
                'patterns': [
                  {
                    'begin': '\\(',
                    'beginCaptures': {
                      '0': {
                        'name': 'punctuation.definition.begin.bracket.round.go',
                      },
                    },
                    'end': '\\)',
                    'endCaptures': {
                      '0': {
                        'name': 'punctuation.definition.end.bracket.round.go',
                      },
                    },
                    'patterns': [
                      {'include': '#function_param_types'},
                      {'include': '\$self'},
                    ],
                  },
                  {'include': '#type-declarations'},
                  {'include': '#generic_types'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'match':
                '^\\s*\\b(type)\\b\\s*([*.\\w]+)\\s+(?!(?:=\\s*)?[]*\\[]+{0,1}\\b(?:struct|interface)\\b)([\\s\\S]+)',
          },
          {
            'begin': '(?:^|\\s+)\\b(type)\\b\\s*([*.\\w]+)(?=\\[)',
            'beginCaptures': {
              '1': {'name': 'keyword.type.go'},
              '2': {
                'patterns': [
                  {'include': '#type-declarations-without-brackets'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'end':
                '(?<=])(\\s+(?:=\\s*)?(?:[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}(?![]*\\[]+{0,1}\\b(?:struct|interface|func)\\b)[-\\]*.\\[\\w]+(?:,\\s*[]*.\\[\\w]+)*)?',
            'endCaptures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations-without-brackets'},
                  {
                    'match': '\\[',
                    'name': 'punctuation.definition.begin.bracket.square.go',
                  },
                  {
                    'match': ']',
                    'name': 'punctuation.definition.end.bracket.square.go',
                  },
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'patterns': [
              {'include': '#struct_variables_types'},
              {'include': '#type-declarations-without-brackets'},
              {'include': '#parameter-variable-types'},
              {
                'match': '\\[',
                'name': 'punctuation.definition.begin.bracket.square.go',
              },
              {
                'match': ']',
                'name': 'punctuation.definition.end.bracket.square.go',
              },
              {
                'match': '\\{',
                'name': 'punctuation.definition.begin.bracket.curly.go',
              },
              {
                'match': '}',
                'name': 'punctuation.definition.end.bracket.curly.go',
              },
              {
                'match': '\\(',
                'name': 'punctuation.definition.begin.bracket.round.go',
              },
              {
                'match': '\\)',
                'name': 'punctuation.definition.end.bracket.round.go',
              },
              {'match': '\\w+', 'name': 'entity.name.type.go'},
            ],
          },
        ],
      },
      'slice_index_variables': {
        'captures': {
          '1': {
            'patterns': [
              {'include': '#type-declarations'},
              {'match': '\\w+', 'name': 'variable.other.go'},
            ],
          },
        },
        'match':
            '(?<=\\w\\[)((?:\\b[-%\\&*+./<>|\\w]+:|:\\b[-%\\&*+./<>|\\w]+)(?:\\b[-%\\&*+./<>|\\w]+)?(?::\\b[-%\\&*+./<>|\\w]+)?)(?=])',
      },
      'statements': {
        'patterns': [
          {'include': '#package_name'},
          {'include': '#import'},
          {'include': '#syntax_errors'},
          {'include': '#group-functions'},
          {'include': '#group-types'},
          {'include': '#group-variables'},
          {'include': '#hover'},
        ],
      },
      'storage_types': {
        'patterns': [
          {'match': '\\bbool\\b', 'name': 'storage.type.boolean.go'},
          {'match': '\\bbyte\\b', 'name': 'storage.type.byte.go'},
          {'match': '\\berror\\b', 'name': 'storage.type.error.go'},
          {
            'match': '\\b(complex(64|128)|float(32|64)|u?int(8|16|32|64)?)\\b',
            'name': 'storage.type.numeric.go',
          },
          {'match': '\\brune\\b', 'name': 'storage.type.rune.go'},
          {'match': '\\bstring\\b', 'name': 'storage.type.string.go'},
          {'match': '\\buintptr\\b', 'name': 'storage.type.uintptr.go'},
          {'match': '\\bany\\b', 'name': 'entity.name.type.any.go'},
          {
            'match': '\\bcomparable\\b',
            'name': 'entity.name.type.comparable.go',
          },
        ],
      },
      'string_escaped_char': {
        'patterns': [
          {
            'match': '\\\\([0-7]{3}|["\'\\\\abfnrtv]|x\\h{2}|u\\h{4}|U\\h{8})',
            'name': 'constant.character.escape.go',
          },
          {
            'match': '\\\\[^"\'0-7Uabfnrtuvx]',
            'name': 'invalid.illegal.unknown-escape.go',
          },
        ],
      },
      'string_literals': {
        'patterns': [
          {
            'begin': '"',
            'beginCaptures': {
              '0': {'name': 'punctuation.definition.string.begin.go'},
            },
            'end': '"',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.string.end.go'},
            },
            'name': 'string.quoted.double.go',
            'patterns': [
              {'include': '#string_escaped_char'},
              {'include': '#string_placeholder'},
            ],
          },
        ],
      },
      'string_placeholder': {
        'patterns': [
          {
            'match':
                '%(\\[\\d+])?([- #+0]{0,2}((\\d+|\\*)?(\\.?(\\d+|\\*|(\\[\\d+])\\*?)?(\\[\\d+])?)?))?[%EFGTUXb-gopqstvwx]',
            'name': 'constant.other.placeholder.go',
          },
        ],
      },
      'struct_interface_declaration': {
        'captures': {
          '1': {'name': 'keyword.type.go'},
          '2': {
            'patterns': [
              {'include': '#type-declarations'},
              {'match': '\\w+', 'name': 'entity.name.type.go'},
            ],
          },
        },
        'match': '^\\s*\\b(type)\\b\\s*([.\\w]+)',
      },
      'struct_variable_types_fields_multi': {
        'patterns': [
          {
            'begin':
                '\\b(\\w+(?:,\\s*\\b\\w+)*(?:\\s*[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}\\s*[]*\\[]+{0,1})\\b(struct)\\b\\s*(\\{)',
            'beginCaptures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'variable.other.property.go'},
                ],
              },
              '2': {'name': 'keyword.struct.go'},
              '3': {'name': 'punctuation.definition.begin.bracket.curly.go'},
            },
            'end': '}',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.curly.go'},
            },
            'patterns': [
              {'include': '#struct_variables_types_fields'},
              {'include': '\$self'},
            ],
          },
          {
            'begin':
                '\\b(\\w+(?:,\\s*\\b\\w+)*(?:\\s*[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}\\s*[]*\\[]+{0,1})\\b(interface)\\b\\s*(\\{)',
            'beginCaptures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'variable.other.property.go'},
                ],
              },
              '2': {'name': 'keyword.interface.go'},
              '3': {'name': 'punctuation.definition.begin.bracket.curly.go'},
            },
            'end': '}',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.curly.go'},
            },
            'patterns': [
              {'include': '#interface_variables_types_field'},
              {'include': '\$self'},
            ],
          },
          {
            'begin':
                '\\b(\\w+(?:,\\s*\\b\\w+)*(?:\\s*[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}\\s*[]*\\[]+{0,1})\\b(func)\\b\\s*(\\()',
            'beginCaptures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'variable.other.property.go'},
                ],
              },
              '2': {'name': 'keyword.function.go'},
              '3': {'name': 'punctuation.definition.begin.bracket.round.go'},
            },
            'end': '\\)',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.round.go'},
            },
            'patterns': [
              {'include': '#function_param_types'},
              {'include': '\$self'},
            ],
          },
          {'include': '#parameter-variable-types'},
        ],
      },
      'struct_variables_types': {
        'begin': '\\b(struct)\\b\\s*(\\{)',
        'beginCaptures': {
          '1': {'name': 'keyword.struct.go'},
          '2': {'name': 'punctuation.definition.begin.bracket.curly.go'},
        },
        'end': '}',
        'endCaptures': {
          '0': {'name': 'punctuation.definition.end.bracket.curly.go'},
        },
        'patterns': [
          {'include': '#struct_variables_types_fields'},
          {'include': '\$self'},
        ],
      },
      'struct_variables_types_fields': {
        'patterns': [
          {'include': '#struct_variable_types_fields_multi'},
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'match':
                '(?<=\\{)\\s*((?:\\s*[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}[]*.\\[\\w]+)\\s*(?=})',
          },
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'variable.other.property.go'},
                ],
              },
              '2': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'match':
                '(?<=\\{)\\s*((?:\\w+,\\s*)+{0,1}\\w+\\s+)((?:\\s*[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}[]*.\\[\\w]+)\\s*(?=})',
          },
          {
            'captures': {
              '1': {
                'patterns': [
                  {
                    'captures': {
                      '1': {
                        'patterns': [
                          {'include': '#type-declarations'},
                          {
                            'match': '\\w+',
                            'name': 'variable.other.property.go',
                          },
                        ],
                      },
                      '2': {
                        'patterns': [
                          {'include': '#type-declarations'},
                          {'match': '\\w+', 'name': 'entity.name.type.go'},
                        ],
                      },
                    },
                    'match':
                        '((?:\\w+,\\s*)+{0,1}\\w+\\s+)?((?:\\s*[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}[^"/`\\s]+;?)',
                  },
                ],
              },
            },
            'match':
                '(?<=\\{)((?:\\s*(?:(?:\\w+,\\s*)+{0,1}\\w+\\s+)?(?:\\s*[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}[^"/`\\s]+;?)+)\\s*(?=})',
          },
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'match':
                '((?:\\s*[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}[*.\\w]+\\s*)(?:(?=["/`])|\$)',
          },
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'variable.other.property.go'},
                ],
              },
              '2': {
                'patterns': [
                  {'include': '#type-declarations-without-brackets'},
                  {'include': '#parameter-variable-types'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'match': '\\b(\\w+(?:\\s*,\\s*\\b\\w+)*)\\s*([^"/`]+)',
          },
        ],
      },
      'support_functions': {
        'captures': {
          '1': {'name': 'entity.name.function.support.go'},
          '2': {
            'patterns': [
              {'include': '#type-declarations'},
              {'match': '\\d\\w*', 'name': 'invalid.illegal.identifier.go'},
              {'match': '\\w+', 'name': 'entity.name.function.support.go'},
            ],
          },
          '3': {
            'patterns': [
              {'include': '#type-declarations-without-brackets'},
              {
                'match': '\\[',
                'name': 'punctuation.definition.begin.bracket.square.go',
              },
              {
                'match': ']',
                'name': 'punctuation.definition.end.bracket.square.go',
              },
              {
                'match': '\\{',
                'name': 'punctuation.definition.begin.bracket.curly.go',
              },
              {
                'match': '}',
                'name': 'punctuation.definition.end.bracket.curly.go',
              },
              {'match': '\\w+', 'name': 'entity.name.type.go'},
            ],
          },
        },
        'match':
            '(?:((?<=\\.)\\b\\w+)|\\b(\\w+))(?<brackets>\\[(?:[^]\\[]|\\g<brackets>)*])?(?=\\()',
      },
      'switch_types': {
        'begin':
            '(?<=\\bswitch\\b)\\s*(\\w+\\s*:=)?\\s*([-\\]%\\&(-+./<>\\[|\\w]+)(\\.\\(\\btype\\b\\)\\s*)(\\{)',
        'beginCaptures': {
          '1': {
            'patterns': [
              {'include': '#operators'},
              {'match': '\\w+', 'name': 'variable.other.assignment.go'},
            ],
          },
          '2': {
            'patterns': [
              {'include': '#support_functions'},
              {'include': '#type-declarations'},
              {'match': '\\w+', 'name': 'variable.other.go'},
            ],
          },
          '3': {
            'patterns': [
              {'include': '#delimiters'},
              {'include': '#brackets'},
              {'match': '\\btype\\b', 'name': 'keyword.type.go'},
            ],
          },
          '4': {'name': 'punctuation.definition.begin.bracket.curly.go'},
        },
        'end': '}',
        'endCaptures': {
          '0': {'name': 'punctuation.definition.end.bracket.curly.go'},
        },
        'patterns': [
          {
            'captures': {
              '1': {'name': 'keyword.control.go'},
              '2': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
              '3': {'name': 'punctuation.other.colon.go'},
              '4': {
                'patterns': [
                  {'include': '#comments'},
                ],
              },
            },
            'match':
                '^\\s*\\b(case)\\b\\s+([!*,.<=>\\w\\s]+)(:)(\\s*/[*/]\\s*.*)?\$',
          },
          {
            'begin': '\\bcase\\b',
            'beginCaptures': {
              '0': {'name': 'keyword.control.go'},
            },
            'end': ':',
            'endCaptures': {
              '0': {'name': 'punctuation.other.colon.go'},
            },
            'patterns': [
              {'include': '#type-declarations'},
              {'match': '\\w+', 'name': 'entity.name.type.go'},
            ],
          },
          {'include': '\$self'},
        ],
      },
      'switch_variables': {
        'patterns': [
          {
            'captures': {
              '1': {'name': 'keyword.control.go'},
              '2': {
                'patterns': [
                  {'include': '#type-declarations'},
                  {'include': '#support_functions'},
                  {'include': '#variable_assignment'},
                  {'match': '\\w+', 'name': 'variable.other.go'},
                ],
              },
            },
            'match': '^\\s*\\b(case)\\b\\s+([\\s\\S]+:\\s*(?:/[*/].*)?)\$',
          },
          {
            'begin':
                '(?<=\\bswitch\\b)\\s*((?:[.\\w]+(?:\\s*[-!%\\&+,/:<=>|]+\\s*[.\\w]+)*\\s*[-!%\\&+,/:<=>|]+)?\\s*[-\\]%\\&(-+./<>\\[|\\w]+{0,1}\\s*(?:;\\s*[-\\]%\\&(-+./<>\\[|\\w]+\\s*)?)(\\{)',
            'beginCaptures': {
              '1': {
                'patterns': [
                  {'include': '#support_functions'},
                  {'include': '#type-declarations'},
                  {'include': '#variable_assignment'},
                  {'match': '\\w+', 'name': 'variable.other.go'},
                ],
              },
              '2': {'name': 'punctuation.definition.begin.bracket.curly.go'},
            },
            'end': '}',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.curly.go'},
            },
            'patterns': [
              {
                'begin': '\\bcase\\b',
                'beginCaptures': {
                  '0': {'name': 'keyword.control.go'},
                },
                'end': ':',
                'endCaptures': {
                  '0': {'name': 'punctuation.other.colon.go'},
                },
                'patterns': [
                  {'include': '#support_functions'},
                  {'include': '#type-declarations'},
                  {'include': '#variable_assignment'},
                  {'match': '\\w+', 'name': 'variable.other.go'},
                ],
              },
              {'include': '\$self'},
            ],
          },
        ],
      },
      'syntax_errors': {
        'patterns': [
          {
            'captures': {
              '1': {'name': 'invalid.illegal.slice.go'},
            },
            'match': '\\[](\\s+)',
          },
          {
            'match': '\\b0[0-7]*[89]\\d*\\b',
            'name': 'invalid.illegal.numeric.go',
          },
        ],
      },
      'terminators': {'match': ';', 'name': 'punctuation.terminator.go'},
      'type-declarations': {
        'patterns': [
          {'include': '#language_constants'},
          {'include': '#comments'},
          {'include': '#map_types'},
          {'include': '#brackets'},
          {'include': '#delimiters'},
          {'include': '#keywords'},
          {'include': '#operators'},
          {'include': '#runes'},
          {'include': '#storage_types'},
          {'include': '#raw_string_literals'},
          {'include': '#string_literals'},
          {'include': '#numeric_literals'},
          {'include': '#terminators'},
        ],
      },
      'type-declarations-without-brackets': {
        'patterns': [
          {'include': '#language_constants'},
          {'include': '#comments'},
          {'include': '#map_types'},
          {'include': '#delimiters'},
          {'include': '#keywords'},
          {'include': '#operators'},
          {'include': '#runes'},
          {'include': '#storage_types'},
          {'include': '#raw_string_literals'},
          {'include': '#string_literals'},
          {'include': '#numeric_literals'},
          {'include': '#terminators'},
        ],
      },
      'type_assertion_inline': {
        'captures': {
          '1': {'name': 'keyword.type.go'},
          '2': {
            'patterns': [
              {'include': '#type-declarations-without-brackets'},
              {
                'match': '\\(',
                'name': 'punctuation.definition.begin.bracket.round.go',
              },
              {
                'match': '\\)',
                'name': 'punctuation.definition.end.bracket.round.go',
              },
              {
                'match': '\\[',
                'name': 'punctuation.definition.begin.bracket.square.go',
              },
              {
                'match': ']',
                'name': 'punctuation.definition.end.bracket.square.go',
              },
              {
                'match': '\\{',
                'name': 'punctuation.definition.begin.bracket.curly.go',
              },
              {
                'match': '}',
                'name': 'punctuation.definition.end.bracket.curly.go',
              },
              {'match': '\\w+', 'name': 'entity.name.type.go'},
            ],
          },
        },
        'match':
            '(?<=\\.\\()(?:\\b(type)\\b|((?:\\s*[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+{0,1}[]*\\[]+{0,1}[.\\w]+(?:\\[(?:[]*.\\[{}\\w]+(?:,\\s*[]*.\\[{}\\w]+)*)?])?))(?=\\))',
      },
      'var_assignment': {
        'patterns': [
          {
            'captures': {
              '1': {
                'patterns': [
                  {'include': '#delimiters'},
                  {'match': '\\w+', 'name': 'variable.other.assignment.go'},
                ],
              },
              '2': {
                'patterns': [
                  {'include': '#type-declarations-without-brackets'},
                  {'include': '#generic_types'},
                  {
                    'match': '\\(',
                    'name': 'punctuation.definition.begin.bracket.round.go',
                  },
                  {
                    'match': '\\)',
                    'name': 'punctuation.definition.end.bracket.round.go',
                  },
                  {
                    'match': '\\[',
                    'name': 'punctuation.definition.begin.bracket.square.go',
                  },
                  {
                    'match': ']',
                    'name': 'punctuation.definition.end.bracket.square.go',
                  },
                  {'match': '\\w+', 'name': 'entity.name.type.go'},
                ],
              },
            },
            'match':
                '(?<=\\bvar\\b)\\s*\\b([.\\w]+(?:,\\s*[.\\w]+)*)\\s*((?:(?:[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+(?:\\([^)]+\\))?)?(?![]*\\[]+{0,1}\\b(?:struct|func|map)\\b)(?:[]*.\\[\\w]+(?:,\\s*[]*.\\[\\w]+)*)?\\s*=?)?',
          },
          {
            'begin': '(?<=\\bvar\\b)\\s*(\\()',
            'beginCaptures': {
              '1': {'name': 'punctuation.definition.begin.bracket.round.go'},
            },
            'end': '\\)',
            'endCaptures': {
              '0': {'name': 'punctuation.definition.end.bracket.round.go'},
            },
            'patterns': [
              {
                'captures': {
                  '1': {
                    'patterns': [
                      {'include': '#delimiters'},
                      {'match': '\\w+', 'name': 'variable.other.assignment.go'},
                    ],
                  },
                  '2': {
                    'patterns': [
                      {'include': '#type-declarations-without-brackets'},
                      {'include': '#generic_types'},
                      {
                        'match': '\\(',
                        'name': 'punctuation.definition.begin.bracket.round.go',
                      },
                      {
                        'match': '\\)',
                        'name': 'punctuation.definition.end.bracket.round.go',
                      },
                      {
                        'match': '\\[',
                        'name':
                            'punctuation.definition.begin.bracket.square.go',
                      },
                      {
                        'match': ']',
                        'name': 'punctuation.definition.end.bracket.square.go',
                      },
                      {'match': '\\w+', 'name': 'entity.name.type.go'},
                    ],
                  },
                },
                'match':
                    '^\\s*\\b([.\\w]+(?:,\\s*[.\\w]+)*)\\s*((?:(?:[]*\\[]+{0,1}(?:<-\\s*)?\\bchan\\b(?:\\s*<-)?\\s*)+(?:\\([^)]+\\))?)?(?![]*\\[]+{0,1}\\b(?:struct|func|map)\\b)(?:[]*.\\[\\w]+(?:,\\s*[]*.\\[\\w]+)*)?\\s*=?)?',
              },
              {'include': '\$self'},
            ],
          },
        ],
      },
      'variable_assignment': {
        'patterns': [
          {
            'captures': {
              '0': {
                'patterns': [
                  {'include': '#delimiters'},
                  {'match': '\\d\\w*', 'name': 'invalid.illegal.identifier.go'},
                  {'match': '\\w+', 'name': 'variable.other.assignment.go'},
                ],
              },
            },
            'match': '\\b\\w+(?:,\\s*\\w+)*(?=\\s*:=)',
          },
          {
            'captures': {
              '0': {
                'patterns': [
                  {'include': '#delimiters'},
                  {'include': '#operators'},
                  {'match': '\\d\\w*', 'name': 'invalid.illegal.identifier.go'},
                  {'match': '\\w+', 'name': 'variable.other.assignment.go'},
                ],
              },
            },
            'match': '\\b[*.\\w]+(?:,\\s*[*.\\w]+)*(?=\\s*=(?!=))',
          },
        ],
      },
    },
    'scopeName': 'source.go',
  },
);