Forráskód Böngészése

add languge support for gdscript

Geequlim 8 éve
szülő
commit
3470857f39

+ 388 - 0
configrations/GDScript.tmLanguage

@@ -0,0 +1,388 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>fileTypes</key>
+	<array>
+		<string>gd</string>
+	</array>
+	<key>name</key>
+	<string>GDScript (Godot Engine)</string>
+	<key>patterns</key>
+	<array>
+		<dict>
+			<key>captures</key>
+			<dict>
+				<key>1</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.comment.number-sign.gdscript</string>
+				</dict>
+			</dict>
+			<key>match</key>
+			<string>(#).*$\n?</string>
+			<key>name</key>
+			<string>comment.line.number-sign.gdscript</string>
+		</dict>
+		<dict>
+			<key>begin</key>
+			<string>^(""")</string>
+			<key>beginCaptures</key>
+			<dict>
+				<key>1</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.comment.triple-quote.gdscript</string>
+				</dict>
+			</dict>
+			<key>end</key>
+			<string>(""")</string>
+			<key>endCaptures</key>
+			<dict>
+				<key>1</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.comment.triple-quote.gdscript</string>
+				</dict>
+			</dict>
+			<key>name</key>
+			<string>comment.block.triple-quote</string>
+		</dict>
+		<dict>
+			<key>begin</key>
+			<string>"</string>
+			<key>end</key>
+			<string>(?&lt;!\\)"</string>
+			<key>name</key>
+			<string>string.quoted.double.gdscript</string>
+		</dict>
+		<dict>
+			<key>begin</key>
+			<string>'</string>
+			<key>end</key>
+			<string>(?&lt;!\\)'</string>
+			<key>name</key>
+			<string>string.quoted.single.gdscript</string>
+		</dict>
+		<dict>
+			<key>begin</key>
+			<string>"""</string>
+			<key>end</key>
+			<string>(?&lt;!\\)"""</string>
+			<key>name</key>
+			<string>string.quoted.triple.gdscript</string>
+		</dict>
+		<dict>
+			<key>begin</key>
+			<string>@"</string>
+			<key>end</key>
+			<string>(?&lt;!\\)"</string>
+			<key>name</key>
+			<string>string.quoted.double.node-path.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>\b(?i:0x\h*)\b</string>
+			<key>name</key>
+			<string>constant.numeric.integer.hexadecimal.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>\b(?i:(\d+\.\d*(e[\-\+]?\d+)?))\b</string>
+			<key>name</key>
+			<string>constant.numeric.float.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>\b(?i:(\.\d+(e[\-\+]?\d+)?))\b</string>
+			<key>name</key>
+			<string>constant.numeric.float.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>\b(?i:(\d+e[\-\+]?\d+))\b</string>
+			<key>name</key>
+			<string>constant.numeric.float.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>\b\d+\b</string>
+			<key>name</key>
+			<string>constant.numeric.integer.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>\b(?i:elif|else|for|if|while|break|continue|pass|return)\b</string>
+			<key>name</key>
+			<string>keyword.control.flow.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>\b(?i:&amp;&amp;|and|in|is|!|not|\|\||or)\b</string>
+			<key>name</key>
+			<string>keyword.operator.logical.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>&lt;=|&gt;=|==|&lt;|&gt;|!=</string>
+			<key>name</key>
+			<string>keyword.operator.comparison.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>\+=|-=|\*=|/=|%=|&amp;=|\|=|\*|/|%|\+|-|&lt;&lt;|&gt;&gt;|&amp;|\||\^|~</string>
+			<key>name</key>
+			<string>keyword.operator.arithmetic.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>=</string>
+			<key>name</key>
+			<string>keyword.operator.assignment.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>\b(bool|int|float|String|funcref)\b</string>
+			<key>name</key>
+			<string>support.type.basic.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>\b(Vector[23]|Rect2|Matrix32?|Plane|Quat|AABB|Transform)\b</string>
+			<key>name</key>
+			<string>support.type.vector.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>\b(Color|Image|NodePath|RID|Object|InputEvent)\b</string>
+			<key>name</key>
+			<string>support.type.engine.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>\b(Array|Dictionary|ByteArray|IntArray|FloatArray|StringArray|Vector[23]Array|ColorArray)\b</string>
+			<key>name</key>
+			<string>support.type.container.gdscript</string>
+		</dict>
+		<dict>
+			<key>captures</key>
+			<dict>
+				<key>1</key>
+				<dict>
+					<key>name</key>
+					<string>storage.type.class.gdscript</string>
+				</dict>
+				<key>2</key>
+				<dict>
+					<key>name</key>
+					<string>entity.name.type.class.gdscript</string>
+				</dict>
+			</dict>
+			<key>match</key>
+			<string>^\s*(?i:(class))\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*:</string>
+		</dict>
+		<dict>
+			<key>begin</key>
+			<string>^\s*(?i:(?:(static)\s+)?(func))\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(</string>
+			<key>beginCaptures</key>
+			<dict>
+				<key>1</key>
+				<dict>
+					<key>name</key>
+					<string>storage.modifier.static-function.gdscript</string>
+				</dict>
+				<key>2</key>
+				<dict>
+					<key>name</key>
+					<string>storage.type.function.gdscript</string>
+				</dict>
+				<key>3</key>
+				<dict>
+					<key>name</key>
+					<string>entity.name.function.gdscript</string>
+				</dict>
+			</dict>
+			<key>end</key>
+			<string>\)\s*:</string>
+			<key>patterns</key>
+			<array>
+				<dict>
+					<key>match</key>
+					<string>[a-zA-Z_][a-zA-Z_0-9]*</string>
+					<key>name</key>
+					<string>variable.parameter.gdscript</string>
+				</dict>
+			</array>
+		</dict>
+		<dict>
+			<key>begin</key>
+			<string>^\s*(?i:(signal))\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(</string>
+			<key>beginCaptures</key>
+			<dict>
+				<key>1</key>
+				<dict>
+					<key>name</key>
+					<string>storage.type.signal.gdscript</string>
+				</dict>
+				<key>2</key>
+				<dict>
+					<key>name</key>
+					<string>entity.name.function.siglan.gdscript</string>
+				</dict>
+			</dict>
+			<key>end</key>
+			<string>\)\s*:</string>
+			<key>patterns</key>
+			<array>
+				<dict>
+					<key>match</key>
+					<string>[a-zA-Z_][a-zA-Z_0-9]*</string>
+					<key>name</key>
+					<string>variable.parameter.gdscript</string>
+				</dict>
+			</array>
+		</dict>
+		<dict>
+			<key>captures</key>
+			<dict>
+				<key>1</key>
+				<dict>
+					<key>name</key>
+					<string>keyword.other.onready.gdscript</string>
+				</dict>
+				<key>2</key>
+				<dict>
+					<key>name</key>
+					<string>storage.type.var.gdscript</string>
+				</dict>
+				<key>3</key>
+				<dict>
+					<key>name</key>
+					<string>variable.other.gdscript</string>
+				</dict>
+			</dict>
+			<key>match</key>
+			<string>(?i:\b(?:(onready)\s+)?(var))\s+([a-zA-Z_][a-zA-Z_0-9]*)</string>
+		</dict>
+		<dict>
+			<key>captures</key>
+			<dict>
+				<key>1</key>
+				<dict>
+					<key>name</key>
+					<string>storage.type.const.gdscript</string>
+				</dict>
+				<key>2</key>
+				<dict>
+					<key>name</key>
+					<string>variable.other.gdscript</string>
+				</dict>
+			</dict>
+			<key>match</key>
+			<string>\b(?i:(const))\s+([a-zA-Z_][a-zA-Z_0-9]*)</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>\b(?i:extends|assert|breakpoint)\b</string>
+			<key>name</key>
+			<string>keyword.other.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>(?&lt;=extends)\s+[a-zA-Z_][a-zA-Z_0-9]*(\.([a-zA-Z_][a-zA-Z_0-9]*))?</string>
+			<key>name</key>
+			<string>entity.other.inherited-class.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>\b(?i:true|false|null)\b</string>
+			<key>name</key>
+			<string>constant.language.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>\b(?i:export|tool)\b</string>
+			<key>name</key>
+			<string>storage.modifier.static.gdscript</string>
+		</dict>
+		<dict>
+			<key>captures</key>
+			<dict>
+				<key>1</key>
+				<dict>
+					<key>name</key>
+					<string>keyword.operator.setget.gdscript</string>
+				</dict>
+				<key>2</key>
+				<dict>
+					<key>name</key>
+					<string>entity.name.function.gdscript</string>
+				</dict>
+				<key>3</key>
+				<dict>
+					<key>name</key>
+					<string>entity.name.function.gdscript</string>
+				</dict>
+				<key>4</key>
+				<dict>
+					<key>name</key>
+					<string>entity.name.function.gdscript</string>
+				</dict>
+			</dict>
+			<key>match</key>
+			<string>\b((?i:setget))\b\s+(?:,?([a-zA-Z_][a-zA-Z_0-9]*)|([a-zA-Z_][a-zA-Z_0-9]*)\s*,\s*([a-zA-Z_][a-zA-Z_0-9]*))</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>\b(?i:yield)\b</string>
+			<key>name</key>
+			<string>keyword.control.flow.yield.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>\b(?i:var|const|onready|class|func|signal)\b</string>
+			<key>name</key>
+			<string>invalid.illegal</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>([A-Z][a-zA-Z_0-9]*)</string>
+			<key>name</key>
+			<string>entity.name.type.class-type.gdscript</string>
+		</dict>
+		<dict>
+			<key>match</key>
+			<string>([a-z_][a-zA-Z_0-9]*)</string>
+			<key>name</key>
+			<string>entity.name.type.variant.gdscript</string>
+		</dict>
+		<dict>
+			<key>begin</key>
+			<string>([a-z][a-zA-Z_0-9]*)\s*\(</string>
+			<key>beginCaptures</key>
+			<dict>
+				<key>1</key>
+				<dict>
+					<key>name</key>
+					<string>entity.name.function.reference.gdscript</string>
+				</dict>
+			</dict>
+			<key>end</key>
+			<string>\)</string>
+			<key>patterns</key>
+			<array>
+				<dict>
+					<key>match</key>
+					<string>([a-zA-Z_][a-zA-Z_0-9]*)</string>
+					<key>name</key>
+					<string>variable.parameter.gdscript</string>
+				</dict>
+			</array>
+		</dict>
+	</array>
+	<key>scopeName</key>
+	<string>source.gdscript</string>
+	<key>uuid</key>
+	<string>e08b7d98-5d50-4aa9-8935-7c759a4a8fdd</string>
+</dict>
+</plist>

+ 25 - 0
configrations/gdscript-configuration.json

@@ -0,0 +1,25 @@
+{
+    "comments": {
+        "lineComment": "#",
+        "blockComment": ["\"\"\"", "\"\"\""]
+    },
+    "brackets": [
+        ["(", ")"],
+        ["[", "]"],
+        ["{", "}"]
+    ],
+    "autoClosingPairs": [
+        ["'", "'"],
+        ["\"", "\""],
+        ["(", ")"],
+        ["[", "]"],
+        ["{", "}"]
+    ],
+    "surroundingPairs": [
+        ["'", "'"],
+        ["\"", "\""],
+        ["(", ")"],
+        ["[", "]"],
+        ["{", "}"]
+    ]
+}

+ 165 - 0
configrations/snippets.json

@@ -0,0 +1,165 @@
+{
+
+	// Place your snippets for JavaScript React here. Each snippet is defined under a snippet name and has a prefix, body and 
+	// description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
+	// $1, $2 for tab stops, ${id} and ${id:label} and ${1:label} for variables. Variables with the same id are connected.
+	// Example:
+	"Subclass": {
+		"prefix": "class",
+		"body": [
+			"class '$1' extends ${2:Reference}",
+			"\t$3"
+		]
+	},
+
+	"Print messages to console": {
+		"prefix": "pr",
+		"body": [
+			"print($1)"
+		]
+	},
+
+	"_ready method of Node": {
+		"prefix": "ready",
+		"body": [
+			"func _ready():",
+			"\t${1:pass}"
+		]
+	},
+
+	"_init method of Object": {
+		"prefix": "init",
+		"body": [
+			"func _init():",
+			"\t${1:pass}"
+		]
+	},
+
+	"_process method of Node": {
+		"prefix": "process",
+		"body": [
+      "func _process(delta):",
+      "\t${1:pass}"
+    ]
+	},
+
+	"_input method of Node": {
+		"prefix": "input",
+		"body": [
+      "func _input(event):",
+      "\t${1:pass}"
+    ]
+	},
+
+  "_input_event method of Node": {
+		"prefix": "inpute",
+		"body": [
+      "func _input_event(event):",
+      "\t${1:pass}"
+    ]
+	},
+
+	"for loop": {
+		"prefix": "for",
+		"body": [
+      "for $1 in $2:",
+      "\t${3:pass}"
+    ]
+	},
+
+  "for range loop": {
+		"prefix": "for",
+		"body": [
+      "for $1 in range(${2:start}{$3:,end}):",
+      "\t${4:pass}"
+    ]
+	},
+
+  "if elif else": {
+    "prefix": "if",
+		"body": [
+      "if ${1:condition}:",
+      "\t${3:pass}",
+      "elif ${2:condition}:",
+      "\t${4:pass}",
+      "else:",
+      "\t${5:pass}"
+    ]
+  },
+
+  "if else": {
+    "prefix": "if",
+		"body": [
+      "if ${1:condition}:",
+      "\t${2:pass}",
+      "else:",
+      "\t${3:pass}"
+    ]
+  },
+
+  "if": {
+    "prefix": "if",
+		"body": [
+      "if ${1:condition}:",
+      "\t${2:pass}"
+    ]
+  },
+
+  "while": {
+    "prefix": "while",
+		"body": [
+      "while ${1:condition}:",
+      "\t${2:pass}"
+    ]
+  },
+
+  "function define": {
+    "prefix": "while",
+		"body": [
+      "func ${1:method}(${2:args}):",
+      "\t${3:pass}"
+    ]
+  },
+
+  "signal decleration": {
+    "prefix": "signal",
+		"body": [
+      "signal ${1:signalname}(${2:args})"
+    ]
+  },
+
+  "export variables": {
+    "prefix": "export",
+		"body": [
+      "export(${1:type}${2:,other_configs}) var ${3:name}${4: = default}${5: setget }"
+    ]
+  },
+
+  "define variables": {
+    "prefix": "var",
+		"body": [
+      "var ${1:name}${2: = default}${3: setget }"
+    ]
+  },
+
+  "define onready variables": {
+    "prefix": "onready",
+		"body": [
+      "onready var ${1:name}${2: = default}${3: setget }"
+    ]
+  },
+
+  "Is instance of a class": {
+    "prefix": "extends",
+		"body": [
+      "${1:instance} extends ${2:class_name}"
+    ]
+  },
+
+  "element in array": {
+    "prefix": "in",
+		"body": [
+      "${1:element} in ${$2:array}"
+    ]
+  }
+}

+ 27 - 1
package.json

@@ -37,7 +37,33 @@
           "description": "Controls the maximum number of problems produced by the server."
         }
       }
-    }
+    },
+    "languages": [
+      {
+        "id": "gdscript",
+        "aliases": [
+          "Godot Engine Script",
+          "gdscript"
+        ],
+        "extensions": [
+          ".gd"
+        ],
+        "configuration": "./configrations/gdscript-configuration.json"
+      }
+    ],
+    "grammars": [
+      {
+        "language": "gdscript",
+        "scopeName": "source.gdscript",
+        "path": "./configrations/GDScript.tmLanguage"
+      }
+    ],
+    "snippets": [
+      {
+        "language": "gdscript",
+        "path": "./configrations/snippets.json"
+      }
+    ]
   },
   "scripts": {
     "vscode:prepublish": "tsc -p ./",