فهرست منبع

Fix bare nodepaths referencing absolute/root paths (#712)

David Kincaid 11 ماه پیش
والد
کامیت
5b725b55fd

+ 8 - 0
src/formatter/snapshots/nodepaths/in.gd

@@ -11,6 +11,14 @@ func f():
 
 
 @onready var score := $HBoxContainer/Score   as   Label
 @onready var score := $HBoxContainer/Score   as   Label
 
 
+var a = $/root
+var a = $ / root
+var a = $/root/Child
+var a = $ /  root /   Child
+var a = $/root/Child/%Unique
+var a = $ /  root /   Child/%Unique
+var a = $/root/Child/GrandChild
+
 var a = $Child
 var a = $Child
 var a = $Child/   GrandChild
 var a = $Child/   GrandChild
 var a = $Child/   GrandChild  /   GreatGrandChild
 var a = $Child/   GrandChild  /   GreatGrandChild

+ 8 - 0
src/formatter/snapshots/nodepaths/out.gd

@@ -11,6 +11,14 @@ func f():
 
 
 @onready var score := $HBoxContainer/Score as Label
 @onready var score := $HBoxContainer/Score as Label
 
 
+var a = $/root
+var a = $/root
+var a = $/root/Child
+var a = $/root/Child
+var a = $/root/Child/%Unique
+var a = $/root/Child/%Unique
+var a = $/root/Child/GrandChild
+
 var a = $Child
 var a = $Child
 var a = $Child/GrandChild
 var a = $Child/GrandChild
 var a = $Child/GrandChild/GreatGrandChild
 var a = $Child/GrandChild/GreatGrandChild

+ 8 - 2
src/formatter/textmate.ts

@@ -78,6 +78,11 @@ function parse_token(token: Token) {
 		token.type = "nodepath";
 		token.type = "nodepath";
 		return;
 		return;
 	}
 	}
+	if (token.scopes.includes("meta.literal.nodepath.bare.gdscript")) {
+		token.skip = true;
+		token.type = "bare_nodepath";
+		return;
+	}
 	if (token.scopes.includes("keyword.control.flow.gdscript")) {
 	if (token.scopes.includes("keyword.control.flow.gdscript")) {
 		token.type = "keyword";
 		token.type = "keyword";
 		return;
 		return;
@@ -183,6 +188,7 @@ function between(tokens: Token[], current: number, options: FormatterOptions) {
 
 
 	if (prev === "[" && nextToken.type === "symbol") return "";
 	if (prev === "[" && nextToken.type === "symbol") return "";
 	if (prev === "[" && nextToken.type === "nodepath") return "";
 	if (prev === "[" && nextToken.type === "nodepath") return "";
+	if (prev === "[" && nextToken.type === "bare_nodepath") return "";
 	if (prev === ":") return " ";
 	if (prev === ":") return " ";
 	if (prev === ";") return " ";
 	if (prev === ";") return " ";
 	if (prev === "##") return " ";
 	if (prev === "##") return " ";
@@ -225,7 +231,7 @@ export function format_document(document: TextDocument, _options?: FormatterOpti
 	const edits: TextEdit[] = [];
 	const edits: TextEdit[] = [];
 
 
 	const options = _options ?? get_formatter_options();
 	const options = _options ?? get_formatter_options();
-	
+
 	let lineTokens: vsctm.ITokenizeLineResult = null;
 	let lineTokens: vsctm.ITokenizeLineResult = null;
 	let onlyEmptyLinesSoFar = true;
 	let onlyEmptyLinesSoFar = true;
 	let emptyLineCount = 0;
 	let emptyLineCount = 0;
@@ -290,7 +296,7 @@ export function format_document(document: TextDocument, _options?: FormatterOpti
 			tokens.push(token);
 			tokens.push(token);
 		}
 		}
 		for (let i = 0; i < tokens.length; i++) {
 		for (let i = 0; i < tokens.length; i++) {
-			// log.debug(i, tokens[i].value, tokens[i]);
+			log.debug(i, tokens[i].value, tokens[i]);
 			if (i > 0 && tokens[i - 1].string === true && tokens[i].string === true) {
 			if (i > 0 && tokens[i - 1].string === true && tokens[i].string === true) {
 				nextLine += tokens[i].original;
 				nextLine += tokens[i].original;
 			} else {
 			} else {

+ 8 - 6
syntaxes/GDScript.tmLanguage.json

@@ -400,20 +400,22 @@
 			]
 			]
 		},
 		},
 		"builtin_get_node_shorthand_bare": {
 		"builtin_get_node_shorthand_bare": {
-			"name": "meta.literal.nodepath.gdscript",
-			"match": "(?<!/\\s*)(\\$|%|\\$%)([a-zA-Z_]\\w*)\\b(?!\\s*/)",
+			"name": "meta.literal.nodepath.bare.gdscript",
+			"match": "(?<!/\\s*)(\\$\\s*|%|\\$%\\s*)(/\\s*)?([a-zA-Z_]\\w*)\\b(?!\\s*/)",
 			"captures": {
 			"captures": {
 				"1": { "name": "keyword.control.flow.gdscript" },
 				"1": { "name": "keyword.control.flow.gdscript" },
 				"2": { "name": "constant.character.escape.gdscript" },
 				"2": { "name": "constant.character.escape.gdscript" },
-				"3": { "name": "constant.character.escape.gdscript" }
+				"3": { "name": "constant.character.escape.gdscript" },
+				"4": { "name": "constant.character.escape.gdscript" }
 			}
 			}
 		},
 		},
 		"builtin_get_node_shorthand_bare_multi": {
 		"builtin_get_node_shorthand_bare_multi": {
-			"name": "meta.literal.nodepath.gdscript",
-			"begin": "(\\$|%|\\$%)([a-zA-Z_]\\w*)",
+			"name": "meta.literal.nodepath.bare.gdscript",
+			"begin": "(\\$\\s*|%|\\$%\\s*)(/\\s*)?([a-zA-Z_]\\w*)",
 			"beginCaptures": {
 			"beginCaptures": {
 				"1": { "name": "keyword.control.flow.gdscript" },
 				"1": { "name": "keyword.control.flow.gdscript" },
-				"2": { "name": "constant.character.escape.gdscript" }
+				"2": { "name": "constant.character.escape.gdscript" },
+				"3": { "name": "constant.character.escape.gdscript" }
 			},
 			},
 			"end": "(?!\\s*/\\s*%?\\s*[a-zA-Z_]\\w*)",
 			"end": "(?!\\s*/\\s*%?\\s*[a-zA-Z_]\\w*)",
 			"patterns": [
 			"patterns": [

+ 39 - 31
syntaxes/examples/gdscript1.gd

@@ -155,45 +155,53 @@ var CONSTANT_not
 
 
 # ------------------------------------------------------------------------------
 # ------------------------------------------------------------------------------
 
 
-onready var node_a = $Child
-onready var node_b = $Child/GrandChild
-onready var node_bb = $Child/GrandChild/GreatGrandChild
-onready var node_bbb = $Child/GrandChild/GreatGrandChild/GreatGreatGrandChild
-onready var node_c = $"../Sibling"
-onready var node_cc = $'../Sibling'
-onready var node_d = $'..' # parent
-onready var node_e = $"../.." # grandparent
-
-onready var node_f = get_node('Child')
-onready var node_g = get_node("Child/GrandChild")
-onready var node_h = get_node("../Sibling")
+var node_a = $Child
+var node_b = $Child/GrandChild
+var node_bb = $Child/GrandChild/GreatGrandChild
+var node_bbb = $Child/GrandChild/GreatGrandChild/GreatGreatGrandChild
+var node_c = $"../Sibling"
+var node_cc = $'../Sibling'
+var node_d = $'..' # parent
+var node_e = $"../.." # grandparent
+
+var node_f = get_node('Child')
+var node_g = get_node("Child/GrandChild")
+var node_h = get_node("../Sibling")
 
 
 if has_node('Child') and get_node('Child').has_node('GrandChild'):
 if has_node('Child') and get_node('Child').has_node('GrandChild'):
 	pass
 	pass
 
 
-onready var unique_node_a = $%Unique
-onready var unique_node_b = $Child/%Unique
-onready var unique_node_c = $Child/GrandChild/%Unique
-onready var unique_node_d = $Child/%Unique/ChildOfUnique
-onready var unique_node_e = %Unique
-onready var unique_node_f = %Unique/Child
-onready var unique_node_g = %Unique/%UniqueChild
-
-onready var node_i = $"%Unique"
-onready var node_ii = get_node("%Unique")
-onready var node_iii = NodePath("%Unique")
-onready var node_j = $'%Unique/Child'
-onready var node_jj = get_node('%Unique/Child')
-onready var node_jjj = NodePath('%Unique/Child')
-onready var node_k = $"%Unique/%UniqueChild"
-onready var node_kk = get_node("%Unique/%UniqueChild")
-onready var node_kkk = NodePath("%Unique/%UniqueChild")
+var unique_node_a = $%Unique
+var unique_node_b = $Child/%Unique
+var unique_node_c = $Child/GrandChild/%Unique
+var unique_node_d = $Child/%Unique/ChildOfUnique
+var unique_node_e = %Unique
+var unique_node_f = %Unique/Child
+var unique_node_g = %Unique/%UniqueChild
+
+var a = $/root
+var a = $/ root
+var a = $/root/Child
+var a = $/ root/   Child
+var a = $/root/Child/%Unique
+var a = $ /  root /   Child/%Unique
+var a = $/root/Child/GrandChild
+
+var node_i = $"%Unique"
+var node_ii = get_node("%Unique")
+var node_iii = NodePath("%Unique")
+var node_j = $'%Unique/Child'
+var node_jj = get_node('%Unique/Child')
+var node_jjj = NodePath('%Unique/Child')
+var node_k = $"%Unique/%UniqueChild"
+var node_kk = get_node("%Unique/%UniqueChild")
+var node_kkk = NodePath("%Unique/%UniqueChild")
 
 
 if has_node('%Unique') and get_node('%Child').has_node('%GrandChild'):
 if has_node('%Unique') and get_node('%Child').has_node('%GrandChild'):
 	pass
 	pass
 
 
-onready var node_i = $badlyNamedChild
-onready var node_j = $badlyNamedChild/badly_named_grandchild
+var node_i = $badlyNamedChild
+var node_j = $badlyNamedChild/badly_named_grandchild
 
 
 var node_path_a = NodePath("Child")
 var node_path_a = NodePath("Child")
 var node_path_b = NodePath('Child/GrandChild')
 var node_path_b = NodePath('Child/GrandChild')