{
	"name": "GDShader",
	"scopeName": "source.gdshader",
	"uuid": "3a95d25d-688b-481f-a581-eee47f00e5ca",
	"fileTypes": [ "gdshader" ],
	"patterns": [ { "include": "#any" } ],
	"repository": {
		"any": {
			"patterns": [
				{ "include": "#comment" },
				{ "include": "#enclosed" },
				{ "include": "#classifier" },
				{ "include": "#definition" },
				{ "include": "#keyword" },
				{ "include": "#element" },
				{ "include": "#separator" },
				{ "include": "#operator" }
			]
		},
		"comment": {
			"patterns": [
				{ "include": "#commentLine" },
				{ "include": "#commentBlock" }
			]
		},
		"commentLine": {
			"name": "comment.line.double-slash.gdshader",
			"begin": "//",
			"end": "$"
		},
		"commentBlock": {
			"name": "comment.block.gdshader",
			"begin": "/\\*",
			"end": "\\*/"
		},
		"enclosed": {
			"name": "meta.parenthesis.gdshader",
			"begin": "\\(",
			"end": "\\)",
			"captures": { "0": { "name": "punctuation.parenthesis.gdshader" } },
			"patterns": [ { "include": "#any" } ]
		},
		"classifier": {
			"name": "meta.classifier.gdshader",
			"begin": "(?=\\b(?:shader_type|render_mode)\\b)",
			"patterns": [
				{ "include": "#comment" },
				{ "include": "#keyword" },
				{ "include": "#identifierClassification" },
				{ "include": "#separator" }
			],
			"end": "(?<=;)"
		},
		"classifierKeyword": {
			"name": "keyword.language.classifier.gdshader",
			"match": "\\b(?:shader_type|render_mode)\\b"
		},
		"identifierClassification": {
			"name": "entity.other.inherited-class.gdshader",
			"match": "\\b[a-z_]+\\b"
		},
		"definition": {
			"patterns": [ { "include": "#structDefinition" } ]
		},
		"arraySize": {
			"name": "meta.array-size.gdshader",
			"begin": "\\[",
			"end": "\\]",
			"captures": { "0": { "name": "punctuation.bracket.gdshader" } },
			"patterns": [
				{ "include": "#comment" },
				{ "include": "#keyword" },
				{ "include": "#element" },
				{ "include": "#separator" }
			]
		},
		"structDefinition": {
			"begin": "(?=\\b(?:struct)\\b)",
			"patterns": [
				{ "include": "#comment" },
				{ "include": "#keyword" },
				{ "include": "#structName" },
				{ "include": "#structDefinitionBlock" },
				{ "include": "#separator" }
			],
			"end": "(?<=;)"
		},
		"structKeyword": {
			"name": "keyword.other.struct.gdshader",
			"match": "\\b(?:struct)\\b"
		},
		"structName": {
			"name": "entity.name.type.struct.gdshader",
			"match": "\\b[a-zA-Z_]\\w*\\b"
		},
		"structDefinitionBlock": {
			"name": "meta.definition.block.struct.gdshader",
			"begin": "\\{",
			"end": "\\}",
			"captures": { "0": { "name": "punctuation.definition.block.struct.gdshader" } },
			"patterns": [
				{ "include": "#comment" },
				{ "include": "#precisionKeyword" },
				{ "include": "#fieldDefinition" },
				{ "include": "#keyword" },
				{ "include": "#any" }
			]
		},
		"fieldDefinition": {
			"name": "meta.definition.field.gdshader",
			"begin": "\\b[a-zA-Z_]\\w*\\b",
			"beginCaptures": {
				"0": {
					"patterns": [
						{ "include": "#typeKeyword" },
						{
							"match": ".+",
							"name": "entity.name.type.gdshader"
						}
					]
				}
			},
			"patterns": [
				{ "include": "#comment" },
				{ "include": "#keyword" },
				{ "include": "#arraySize" },
				{ "include": "#fieldName" },
				{ "include": "#any" }
			],
			"end": "(?<=;)"
		},
		"fieldName": {
			"name": "entity.name.variable.field.gdshader",
			"match": "\\b[a-zA-Z_]\\w*\\b"
		},
		"keyword": {
			"patterns": [
				{ "include": "#classifierKeyword" },
				{ "include": "#structKeyword" },
				{ "include": "#controlKeyword" },
				{ "include": "#modifierKeyword" },
				{ "include": "#precisionKeyword" },
				{ "include": "#typeKeyword" },
				{ "include": "#hintKeyword" }
			]
		},
		"controlKeyword": {
			"name": "keyword.control.gdshader",
			"match": "\\b(?:if|else|do|while|for|continue|break|switch|case|default|return|discard)\\b"
		},
		"modifierKeyword": {
			"name": "storage.modifier.gdshader",
			"match": "\\b(?:const|global|instance|uniform|varying|in|out|inout|flat|smooth)\\b"
		},
		"precisionKeyword": {
			"name": "storage.type.built-in.primitive.precision.gdshader",
			"match": "\\b(?:low|medium|high)p\\b"
		},
		"typeKeyword": {
			"name": "support.type.gdshader",
			"match": "\\b(?:void|bool|[biu]?vec[234]|u?int|float|mat[234]|[iu]?sampler(?:3D|2D(?:Array)?)|samplerCube)\\b"
		},
		"hintKeyword": {
			"name": "support.type.annotation.gdshader",
			"match": "\\b(?:source_color|hint_(?:color|range|(?:black_)?albedo|normal|(?:default_)?(?:white|black)|aniso|anisotropy|roughness_(?:[rgba]|normal|gray))|filter_(?:nearest|linear)(?:_mipmap(?:_anisotropic)?)?|repeat_(?:en|dis)able)\\b"
		},
		"element": {
			"patterns": [
				{ "include": "#literalFloat" },
				{ "include": "#literalInt" },
				{ "include": "#literalBool" },
				{ "include": "#identifierType" },
				{ "include": "#constructor" },
				{ "include": "#processorFunction" },
				{ "include": "#identifierFunction" },
				{ "include": "#swizzling" },
				{ "include": "#identifierField" },
				{ "include": "#constantFloat" },
				{ "include": "#languageVariable" },
				{ "include": "#identifierVariable" }
			]
		},
		"literalFloat": {
			"name": "constant.numeric.float.gdshader",
			"match": "\\b(?:\\d+[eE][-+]?\\d+|(?:\\d*[.]\\d+|\\d+[.])(?:[eE][-+]?\\d+)?)[fF]?"
		},
		"literalInt": {
			"name": "constant.numeric.integer.gdshader",
			"match": "\\b(?:0[xX][0-9A-Fa-f]+|\\d+[uU]?)\\b"
		},
		"literalBool": {
			"name": "constant.language.boolean.gdshader",
			"match": "\\b(?:false|true)\\b"
		},
		"identifierType": {
			"name": "entity.name.type.gdshader",
			"match": "\\b[a-zA-Z_]\\w*(?=(?:\\s*\\[\\s*\\w*\\s*\\])?\\s+[a-zA-Z_]\\w*\\b)"
		},
		"constructor": {
			"name": "entity.name.type.constructor.gdshader",
			"match": "\\b[a-zA-Z_]\\w*(?=\\s*\\[\\s*\\w*\\s*\\]\\s*[(])|\\b[A-Z]\\w*(?=\\s*[(])"
		},
		"processorFunction": {
			"name": "support.function.gdshader",
			"match": "\\b(?:vertex|fragment|light|start|process|sky|fog)(?=(?:\\s|/\\*(?:\\*(?!/)|[^*])*\\*/)*[(])"
		},
		"identifierFunction": {
			"name": "entity.name.function.gdshader",
			"match": "\\b[a-zA-Z_]\\w*(?=(?:\\s|/\\*(?:\\*(?!/)|[^*])*\\*/)*[(])"
		},
		"swizzling": {
			"match": "([.])\\s*([xyzw]{2,4}|[rgba]{2,4}|[stpq]{2,4})\\b",
			"captures": {
				"1": { "name": "punctuation.accessor.gdshader" },
				"2": { "name": "variable.other.property.gdshader" }
			}
		},
		"identifierField": {
			"match": "([.])\\s*([a-zA-Z_]\\w*)\\b(?!\\s*\\()",
			"captures": {
				"1": { "name": "punctuation.accessor.gdshader" },
				"2": { "name": "entity.name.variable.field.gdshader" }
			}
		},
		"constantFloat": {
			"name": "constant.language.float.gdshader",
			"match": "\\b(?:E|PI|TAU)\\b"
		},
		"languageVariable": {
			"name": "variable.language.gdshader",
			"match": "\\b(?:[A-Z][A-Z_0-9]*)\\b"
		},
		"identifierVariable": {
			"name": "variable.name.gdshader",
			"match": "\\b[a-zA-Z_]\\w*\\b"
		},
		"separator": {
			"patterns": [
				{
					"match": "[.]",
					"name": "punctuation.accessor.gdshader"
				},
				{ "include": "#separatorComma" },
				{
					"match": "[;]",
					"name": "punctuation.terminator.statement.gdshader"
				},
				{
					"match": "[:]",
					"name": "keyword.operator.type.annotation.gdshader"
				}
			]
		},
		"separatorComma": {
			"name": "punctuation.separator.comma.gdshader",
			"match": "[,]"
		},
		"operator": {
			"name": "keyword.operator.gdshader",
			"match": "\\<\\<\\=?|\\>\\>\\=?|[-+*/&|<>=!]\\=|\\&\\&|[|][|]|[-+~!*/%<>&^|=]"
		}
	}
}
