From 71a00a6581d0e5ca61d5c01dcde71f3c92e1257a Mon Sep 17 00:00:00 2001
From: Sainan <63328889+Sainan@users.noreply.github.com>
Date: Mon, 23 Jun 2025 04:00:55 +0200
Subject: [PATCH 01/12] Add json.msgpack constant
---
Pluto.tmbundle/Syntaxes/Pluto.tmLanguage | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage b/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
index bf3bc7a..db06e97 100644
--- a/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
+++ b/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
@@ -714,7 +714,7 @@
match
- (?<![^.]\.|:)\b(_G|_VERSION|_PVERSION|math\.(pi|huge|mininteger|maxinteger)|os\.(platform|arch)|json\.(null|withnull|withorder))\b
+ (?<![^.]\.|:)\b(_G|_VERSION|_PVERSION|math\.(pi|huge|mininteger|maxinteger)|os\.(platform|arch)|json\.(null|withnull|withorder|msgpack))\b
name
constant.language.pluto support.constant.builtin.pluto
From 841a873f6931a08a587e7d7a0e26be5734b4d6f5 Mon Sep 17 00:00:00 2001
From: Sainan <63328889+Sainan@users.noreply.github.com>
Date: Mon, 21 Jul 2025 17:02:36 +0200
Subject: [PATCH 02/12] Add 'any' type hint
---
Pluto.tmbundle/Syntaxes/Pluto.tmLanguage | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage b/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
index db06e97..1690f9d 100644
--- a/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
+++ b/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
@@ -51,7 +51,7 @@
end
- (\))(?:(:)\s+(void|\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata)\??))?(\s*<nodiscard>)?
+ (\))(?:(:)\s+(void|\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any)\??))?(\s*<nodiscard>)?
endCaptures
1
@@ -109,7 +109,7 @@
match
- (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata)\??)
+ (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any)\??)
captures
1
@@ -561,7 +561,7 @@
match
- (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata)\??)
+ (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any)\??)
captures
1
@@ -669,7 +669,7 @@
match
- \b(?<!\.)(local|global)\s+(?!class)(?!pluto_class)(?!function)(?:(and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|pluto_use|pluto_switch|pluto_continue|pluto_enum|pluto_new|pluto_class|pluto_export|pluto_try|pluto_catch|switch|continue|enum|new|class|export|try|catch|return|then|true|until|while)\b|\w+)(?:\s*(:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata)\??))?(?!\s*=\s*\|[a-zA-Z0-9_,\s]*\|\s*->)
+ \b(?<!\.)(local|global)\s+(?!class)(?!pluto_class)(?!function)(?:(and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|pluto_use|pluto_switch|pluto_continue|pluto_enum|pluto_new|pluto_class|pluto_export|pluto_try|pluto_catch|switch|continue|enum|new|class|export|try|catch|return|then|true|until|while)\b|\w+)(?:\s*(:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any)\??))?(?!\s*=\s*\|[a-zA-Z0-9_,\s]*\|\s*->)
captures
1
From 8d8a6961c4806a8600ba873d38afd7847f388718 Mon Sep 17 00:00:00 2001
From: Sainan <63328889+Sainan@users.noreply.github.com>
Date: Wed, 23 Jul 2025 11:12:58 +0200
Subject: [PATCH 03/12] Add 'nil' type hint
---
Pluto.tmbundle/Syntaxes/Pluto.tmLanguage | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage b/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
index 1690f9d..f721d9a 100644
--- a/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
+++ b/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
@@ -51,7 +51,7 @@
end
- (\))(?:(:)\s+(void|\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any)\??))?(\s*<nodiscard>)?
+ (\))(?:(:)\s+(void|\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??))?(\s*<nodiscard>)?
endCaptures
1
@@ -109,7 +109,7 @@
match
- (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any)\??)
+ (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??)
captures
1
@@ -561,7 +561,7 @@
match
- (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any)\??)
+ (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??)
captures
1
@@ -669,7 +669,7 @@
match
- \b(?<!\.)(local|global)\s+(?!class)(?!pluto_class)(?!function)(?:(and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|pluto_use|pluto_switch|pluto_continue|pluto_enum|pluto_new|pluto_class|pluto_export|pluto_try|pluto_catch|switch|continue|enum|new|class|export|try|catch|return|then|true|until|while)\b|\w+)(?:\s*(:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any)\??))?(?!\s*=\s*\|[a-zA-Z0-9_,\s]*\|\s*->)
+ \b(?<!\.)(local|global)\s+(?!class)(?!pluto_class)(?!function)(?:(and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|pluto_use|pluto_switch|pluto_continue|pluto_enum|pluto_new|pluto_class|pluto_export|pluto_try|pluto_catch|switch|continue|enum|new|class|export|try|catch|return|then|true|until|while)\b|\w+)(?:\s*(:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??))?(?!\s*=\s*\|[a-zA-Z0-9_,\s]*\|\s*->)
captures
1
From c7264418c3ca5fe38055115538f16d21b22a3d97 Mon Sep 17 00:00:00 2001
From: Sainan <63328889+Sainan@users.noreply.github.com>
Date: Wed, 6 Aug 2025 16:56:57 +0200
Subject: [PATCH 04/12] Support complex table & function hints
---
Pluto.tmbundle/Syntaxes/Pluto.tmLanguage | 290 ++++++++++++++++++++++-
test.js | 110 ++++++++-
2 files changed, 397 insertions(+), 3 deletions(-)
diff --git a/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage b/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
index f721d9a..aa38e29 100644
--- a/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
+++ b/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
@@ -51,7 +51,7 @@
end
- (\))(?:(:)\s+(void|\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??))?(\s*<nodiscard>)?
+ (\))(?:(:)\s+(void|\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|\{[^}]*\})\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|\{[^}]*\})\??))?(\s*<nodiscard>)?
endCaptures
1
@@ -107,6 +107,14 @@
name
constant.language.pluto
+
+ include
+ #function_type
+
+
+ include
+ #table_type
+
match
(:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??)
@@ -559,6 +567,14 @@
end
\w+
+
+ include
+ #function_type
+
+
+ include
+ #table_type
+
match
(:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??)
@@ -667,9 +683,59 @@
name
keyword.control.pluto
+
+ begin
+ \b(?<!\.)(local|global)\s+(?!class)(?!pluto_class)(?!function)(?:(and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|pluto_use|pluto_switch|pluto_continue|pluto_enum|pluto_new|pluto_class|pluto_export|pluto_try|pluto_catch|switch|continue|enum|new|class|export|try|catch|return|then|true|until|while)\b|\w+)\s*(:)\s*(\{)
+ beginCaptures
+
+ 1
+
+ name
+ storage.modifier.pluto
+
+ 2
+
+ name
+ invalid.name.reserved.not-narrow.not-overridable.not-optional.not-special.pluto
+
+ 3
+
+ name
+ punctuation.separator.colon.pluto
+
+ 4
+
+ name
+ punctuation.section.table.begin.pluto
+
+
+ end
+ \}
+ endCaptures
+
+ 0
+
+ name
+ punctuation.section.table.end.pluto
+
+
+ name
+ meta.typehint.table.pluto
+ patterns
+
+
+ include
+ #table_type_body
+
+
+
+
+ include
+ #function_type
+
match
- \b(?<!\.)(local|global)\s+(?!class)(?!pluto_class)(?!function)(?:(and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|pluto_use|pluto_switch|pluto_continue|pluto_enum|pluto_new|pluto_class|pluto_export|pluto_try|pluto_catch|switch|continue|enum|new|class|export|try|catch|return|then|true|until|while)\b|\w+)(?:\s*(:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??))?(?!\s*=\s*\|[a-zA-Z0-9_,\s]*\|\s*->)
+ \b(?<!\.)(local|global)\s+(?!class)(?!pluto_class)(?!function)(?:(and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|pluto_use|pluto_switch|pluto_continue|pluto_enum|pluto_new|pluto_class|pluto_export|pluto_try|pluto_catch|switch|continue|enum|new|class|export|try|catch|return|then|true|until|while)\b|\w+)(?:\s*(:)\s+(?!function\s*\()(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??))?(?!\s*=\s*\|[a-zA-Z0-9_,\s]*\|\s*->)
captures
1
@@ -1184,6 +1250,226 @@
+ table_type
+
+ begin
+ (:)\s*(\{)
+ beginCaptures
+
+ 1
+
+ name
+ punctuation.separator.colon.pluto
+
+ 2
+
+ name
+ punctuation.section.table.begin.pluto
+
+
+ end
+ \}
+ endCaptures
+
+ 0
+
+ name
+ punctuation.section.table.end.pluto
+
+
+ name
+ meta.typehint.table.pluto
+ patterns
+
+
+ include
+ #table_type_body
+
+
+
+ table_type_body
+
+ patterns
+
+
+ match
+ [a-zA-Z_][a-zA-Z0-9_]*
+ name
+ variable.other.field.pluto
+
+
+ include
+ #function_type
+
+
+ include
+ #table_type
+
+
+ match
+ (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??)
+ captures
+
+ 1
+
+ name
+ punctuation.separator.colon.pluto
+
+ 2
+
+ name
+ storage.type.primitive.pluto
+
+
+ name
+ meta.typehint.pluto
+
+
+ match
+ ;
+ name
+ punctuation.terminator.semicolon.pluto
+
+
+ match
+ ,
+ name
+ punctuation.separator.comma.pluto
+
+
+
+ function_type
+
+ begin
+ (:)\s*(function)\s*(?=\()
+ beginCaptures
+
+ 1
+
+ name
+ punctuation.separator.colon.pluto
+
+ 2
+
+ name
+ storage.type.function.pluto
+
+
+ end
+ (?=[,)=\}\]\|$])
+ name
+ meta.typehint.function.pluto
+ patterns
+
+
+ begin
+ \(
+ beginCaptures
+
+ 0
+
+ name
+ punctuation.section.group.begin.pluto
+
+
+ end
+ \)
+ endCaptures
+
+ 0
+
+ name
+ punctuation.section.group.end.pluto
+
+
+ patterns
+
+
+ include
+ #function_type_params
+
+
+
+
+ include
+ #function_type
+
+
+ include
+ #table_type
+
+
+ match
+ (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??)
+ captures
+
+ 1
+
+ name
+ punctuation.separator.colon.pluto
+
+ 2
+
+ name
+ storage.type.primitive.pluto
+
+
+ name
+ meta.typehint.pluto
+
+
+
+ function_type_params
+
+ patterns
+
+
+ match
+ [a-zA-Z_][a-zA-Z0-9_]*
+ name
+ variable.parameter.function.pluto
+
+
+ match
+ ,
+ name
+ punctuation.separator.comma.pluto
+
+
+ match
+ \.\.\.
+ name
+ constant.language.pluto
+
+
+ include
+ #function_type
+
+
+ include
+ #table_type
+
+
+ match
+ (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??)
+ captures
+
+ 1
+
+ name
+ punctuation.separator.colon.pluto
+
+ 2
+
+ name
+ storage.type.primitive.pluto
+
+
+ name
+ meta.typehint.pluto
+
+
+
string_inner
patterns
diff --git a/test.js b/test.js
index 166bdc1..13db4d2 100644
--- a/test.js
+++ b/test.js
@@ -59,7 +59,8 @@ async function main()
const actual = createClassificationString(code);
if (actual != expected)
{
- console.log(`Mismatch for ${code}`);
+ console.log(code + " MISMATCH");
+ console.log(actual);
ok = false;
}
};
@@ -82,6 +83,113 @@ async function main()
` - constant.numeric.integer.pluto`
);
+ checkClassification(
+ `local p: { x: number; y: number }`,
+ `----- storage.modifier.pluto`,
+ ` -- meta.typehint.table.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.table.pluto`,
+ ` - punctuation.section.table.begin.pluto`,
+ ` - meta.typehint.table.pluto`,
+ ` - variable.other.field.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.pluto`,
+ ` ------ storage.type.primitive.pluto`,
+ ` - punctuation.terminator.semicolon.pluto`,
+ ` - meta.typehint.table.pluto`,
+ ` - variable.other.field.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.pluto`,
+ ` ------ storage.type.primitive.pluto`,
+ ` - meta.typehint.table.pluto`,
+ ` - punctuation.section.table.end.pluto`
+ );
+
+ checkClassification(
+ `local p: { x: number, y: number }`,
+ `----- storage.modifier.pluto`,
+ ` -- meta.typehint.table.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.table.pluto`,
+ ` - punctuation.section.table.begin.pluto`,
+ ` - meta.typehint.table.pluto`,
+ ` - variable.other.field.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.pluto`,
+ ` ------ storage.type.primitive.pluto`,
+ ` - punctuation.separator.comma.pluto`,
+ ` - meta.typehint.table.pluto`,
+ ` - variable.other.field.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.pluto`,
+ ` ------ storage.type.primitive.pluto`,
+ ` - meta.typehint.table.pluto`,
+ ` - punctuation.section.table.end.pluto`
+ );
+
+ checkClassification(
+ `local function f(cb: { a: string })`,
+ `----- storage.modifier.pluto`,
+ ` -------- storage.type.function.pluto`,
+ ` - meta.function.pluto`,
+ ` - entity.name.function.pluto`,
+ ` - punctuation.section.group.begin.pluto`,
+ ` -- variable.parameter.function.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.table.pluto`,
+ ` - punctuation.section.table.begin.pluto`,
+ ` - meta.typehint.table.pluto`,
+ ` - variable.other.field.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.pluto`,
+ ` ------ storage.type.primitive.pluto`,
+ ` - meta.typehint.table.pluto`,
+ ` - punctuation.section.table.end.pluto`,
+ ` - punctuation.section.group.end.pluto`
+ );
+
+ checkClassification(
+ `local f: function(a: string): int = tonumber`,
+ `----- storage.modifier.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.function.pluto`,
+ ` -------- storage.type.function.pluto`,
+ ` - punctuation.section.group.begin.pluto`,
+ ` - variable.parameter.function.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.pluto`,
+ ` ------ storage.type.primitive.pluto`,
+ ` - punctuation.section.group.end.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.pluto`,
+ ` --- storage.type.primitive.pluto`,
+ ` - meta.typehint.function.pluto`,
+ ` - keyword.operator.assignment.pluto`
+ );
+
+ checkClassification(
+ `local function f(cb: function(a: string): int)`,
+ `----- storage.modifier.pluto`,
+ ` -------- storage.type.function.pluto`,
+ ` - meta.function.pluto`,
+ ` - entity.name.function.pluto`,
+ ` - punctuation.section.group.begin.pluto`,
+ ` -- variable.parameter.function.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.function.pluto`,
+ ` -------- storage.type.function.pluto`,
+ ` - punctuation.section.group.begin.pluto`,
+ ` - variable.parameter.function.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.pluto`,
+ ` ------ storage.type.primitive.pluto`,
+ ` - punctuation.section.group.end.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.pluto`,
+ ` --- storage.type.primitive.pluto`,
+ ` - punctuation.section.group.end.pluto`
+ );
+
const langConfig = JSON.parse(
fs.readFileSync(path.join(__dirname, "language-config.json"), "utf8").replace(/\/\/.*$/gm, "")
);
From 48a827ba1ef155f6fc9d30798a54bdaa16573654 Mon Sep 17 00:00:00 2001
From: Sainan <63328889+Sainan@users.noreply.github.com>
Date: Wed, 6 Aug 2025 17:55:26 +0200
Subject: [PATCH 05/12] Add support for $type named types
---
Pluto.tmbundle/Syntaxes/Pluto.tmLanguage | 167 +++++++++++++++++++++--
test.js | 83 ++++++++++-
2 files changed, 241 insertions(+), 9 deletions(-)
diff --git a/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage b/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
index aa38e29..372f956 100644
--- a/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
+++ b/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
@@ -51,7 +51,7 @@
end
- (\))(?:(:)\s+(void|\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|\{[^}]*\})\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|\{[^}]*\})\??))?(\s*<nodiscard>)?
+ (\))(?:(:)\s+(void|\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\??))?(\s*<nodiscard>)?
endCaptures
1
@@ -117,7 +117,7 @@
match
- (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??)
+ (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\??)
captures
1
@@ -213,6 +213,49 @@
+
+ begin
+ (\$type)\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*(=)
+ beginCaptures
+
+ 1
+
+ name
+ storage.type.named.pluto
+
+ 2
+
+ name
+ entity.name.type.pluto
+
+ 3
+
+ name
+ keyword.operator.assignment.pluto
+
+
+ end
+ (?=$)
+ name
+ meta.type.named.pluto
+ patterns
+
+
+ include
+ #function_type_no_colon
+
+
+ include
+ #table_type_no_colon
+
+
+ match
+ \??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\??
+ name
+ storage.type.primitive.pluto
+
+
+
match
\b(function)($|\s+)(?:[a-zA-Z_][a-zA-Z0-9_]*([.:]))?([a-zA-Z_][a-zA-Z0-9_]*)?
@@ -577,7 +620,7 @@
match
- (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??)
+ (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\??)
captures
1
@@ -735,7 +778,7 @@
match
- \b(?<!\.)(local|global)\s+(?!class)(?!pluto_class)(?!function)(?:(and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|pluto_use|pluto_switch|pluto_continue|pluto_enum|pluto_new|pluto_class|pluto_export|pluto_try|pluto_catch|switch|continue|enum|new|class|export|try|catch|return|then|true|until|while)\b|\w+)(?:\s*(:)\s+(?!function\s*\()(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??))?(?!\s*=\s*\|[a-zA-Z0-9_,\s]*\|\s*->)
+ \b(?<!\.)(local|global)\s+(?!class)(?!pluto_class)(?!function)(?:(and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|pluto_use|pluto_switch|pluto_continue|pluto_enum|pluto_new|pluto_class|pluto_export|pluto_try|pluto_catch|switch|continue|enum|new|class|export|try|catch|return|then|true|until|while)\b|\w+)(?:\s*(:)\s+(?!function\s*\()(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\??))?(?!\s*=\s*\|[a-zA-Z0-9_,\s]*\|\s*->)
captures
1
@@ -1307,7 +1350,7 @@
match
- (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??)
+ (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\??)
captures
1
@@ -1356,7 +1399,7 @@
end
- (?=[,)=\}\]\|$])
+ (?=[,)=\}\]\|\s]|$)
name
meta.typehint.function.pluto
patterns
@@ -1400,7 +1443,7 @@
match
- (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??)
+ (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\??)
captures
1
@@ -1451,7 +1494,83 @@
match
- (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil)\??)
+ (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\??)
+ captures
+
+ 1
+
+ name
+ punctuation.separator.colon.pluto
+
+ 2
+
+ name
+ storage.type.primitive.pluto
+
+
+ name
+ meta.typehint.pluto
+
+
+
+ function_type_no_colon
+
+ begin
+ (function)\s*(?=\()
+ beginCaptures
+
+ 1
+
+ name
+ storage.type.function.pluto
+
+
+ end
+ (?=[,)=\}\]\|\s]|$)
+ name
+ meta.typehint.function.pluto
+ patterns
+
+
+ begin
+ \(
+ beginCaptures
+
+ 0
+
+ name
+ punctuation.section.group.begin.pluto
+
+
+ end
+ \)
+ endCaptures
+
+ 0
+
+ name
+ punctuation.section.group.end.pluto
+
+
+ patterns
+
+
+ include
+ #function_type_params
+
+
+
+
+ include
+ #function_type
+
+
+ include
+ #table_type
+
+
+ match
+ (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\??)
captures
1
@@ -1470,6 +1589,38 @@
+ table_type_no_colon
+
+ begin
+ (\{)
+ beginCaptures
+
+ 0
+
+ name
+ punctuation.section.table.begin.pluto
+
+
+ end
+ \}
+ endCaptures
+
+ 0
+
+ name
+ punctuation.section.table.end.pluto
+
+
+ name
+ meta.typehint.table.pluto
+ patterns
+
+
+ include
+ #table_type_body
+
+
+
string_inner
patterns
diff --git a/test.js b/test.js
index 13db4d2..e5f8f7d 100644
--- a/test.js
+++ b/test.js
@@ -163,7 +163,6 @@ async function main()
` - punctuation.separator.colon.pluto`,
` - meta.typehint.pluto`,
` --- storage.type.primitive.pluto`,
- ` - meta.typehint.function.pluto`,
` - keyword.operator.assignment.pluto`
);
@@ -190,6 +189,88 @@ async function main()
` - punctuation.section.group.end.pluto`
);
+ checkClassification(
+ `$type StringOrNumber = string|number`,
+ `----- storage.type.named.pluto`,
+ ` - meta.type.named.pluto`,
+ ` -------------- entity.name.type.pluto`,
+ ` - meta.type.named.pluto`,
+ ` - keyword.operator.assignment.pluto`,
+ ` - meta.type.named.pluto`,
+ ` ------------- storage.type.primitive.pluto`
+ );
+ checkClassification(
+ `$type Point = { x: number, y: number }`,
+ `----- storage.type.named.pluto`,
+ ` - meta.type.named.pluto`,
+ ` ----- entity.name.type.pluto`,
+ ` - meta.type.named.pluto`,
+ ` - keyword.operator.assignment.pluto`,
+ ` - meta.type.named.pluto`,
+ ` - punctuation.section.table.begin.pluto`,
+ ` - meta.typehint.table.pluto`,
+ ` - variable.other.field.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.pluto`,
+ ` ------ storage.type.primitive.pluto`,
+ ` - punctuation.separator.comma.pluto`,
+ ` - meta.typehint.table.pluto`,
+ ` - variable.other.field.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.pluto`,
+ ` ------ storage.type.primitive.pluto`,
+ ` - meta.typehint.table.pluto`,
+ ` - punctuation.section.table.end.pluto`
+ );
+ checkClassification(
+ `$type Point = { x: number; y: number }`,
+ `----- storage.type.named.pluto`,
+ ` - meta.type.named.pluto`,
+ ` ----- entity.name.type.pluto`,
+ ` - meta.type.named.pluto`,
+ ` - keyword.operator.assignment.pluto`,
+ ` - meta.type.named.pluto`,
+ ` - punctuation.section.table.begin.pluto`,
+ ` - meta.typehint.table.pluto`,
+ ` - variable.other.field.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.pluto`,
+ ` ------ storage.type.primitive.pluto`,
+ ` - punctuation.terminator.semicolon.pluto`,
+ ` - meta.typehint.table.pluto`,
+ ` - variable.other.field.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.pluto`,
+ ` ------ storage.type.primitive.pluto`,
+ ` - meta.typehint.table.pluto`,
+ ` - punctuation.section.table.end.pluto`
+ );
+ checkClassification(
+ `$type Callback = function(a: string): int`,
+ `----- storage.type.named.pluto`,
+ ` - meta.type.named.pluto`,
+ ` -------- entity.name.type.pluto`,
+ ` - meta.type.named.pluto`,
+ ` - keyword.operator.assignment.pluto`,
+ ` - meta.type.named.pluto`,
+ ` -------- storage.type.function.pluto`,
+ ` - punctuation.section.group.begin.pluto`,
+ ` - variable.parameter.function.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.pluto`,
+ ` ------ storage.type.primitive.pluto`,
+ ` - punctuation.section.group.end.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.pluto`,
+ ` --- storage.type.primitive.pluto`
+ );
+ checkClassification(
+ `local f: Callback`,
+ `----- storage.modifier.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` -------- storage.type.primitive.pluto`
+ );
+
const langConfig = JSON.parse(
fs.readFileSync(path.join(__dirname, "language-config.json"), "utf8").replace(/\/\/.*$/gm, "")
);
From 52eb0b5575c15773af560dfc4a9458da17999967 Mon Sep 17 00:00:00 2001
From: Sainan <63328889+Sainan@users.noreply.github.com>
Date: Wed, 6 Aug 2025 17:56:27 +0200
Subject: [PATCH 06/12] Add type hint stuff to visual check
---
visual-check.pluto | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/visual-check.pluto b/visual-check.pluto
index 0cf329a..42efdaf 100644
--- a/visual-check.pluto
+++ b/visual-check.pluto
@@ -30,3 +30,16 @@ goto label;
-- @param p1 first parameter
-- @return something
-- @see other function
+
+
+$type StringOrNumber = string|number
+$type Point = { x: number, y: number }
+$type Point = { x: number; y: number }
+$type Callback = function(a: string): int
+
+local f: function(a: string): int = tonumber
+local function f(cb: function(a: string): int) end
+
+local p: { x: number, y: number } = { x = 1, y = 2 }
+local p: { x: number; y: number } = { x = 1, y = 2 }
+local function f(cb: { a: string }) end
From df156cea8eaf8715f2bff016e295bf2419abdc01 Mon Sep 17 00:00:00 2001
From: Sainan <63328889+Sainan@users.noreply.github.com>
Date: Wed, 6 Aug 2025 17:59:20 +0200
Subject: [PATCH 07/12] Add highlighting for $haltcompiler
---
Pluto.tmbundle/Syntaxes/Pluto.tmLanguage | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage b/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
index 372f956..be012ed 100644
--- a/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
+++ b/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
@@ -533,7 +533,7 @@
match
- \$(define|alias)\b
+ \$(define|alias|haltcompiler)\b
name
storage.modifier.pluto
From c980bf7ce6b0f29637934a2d04df603dbb1fa82e Mon Sep 17 00:00:00 2001
From: Sainan <63328889+Sainan@users.noreply.github.com>
Date: Wed, 6 Aug 2025 18:46:25 +0200
Subject: [PATCH 08/12] Add highlighting for $declare
---
Pluto.tmbundle/Syntaxes/Pluto.tmLanguage | 86 ++++++++++++++++++++++--
test.js | 47 +++++++++++++
2 files changed, 129 insertions(+), 4 deletions(-)
diff --git a/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage b/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
index be012ed..9ef358a 100644
--- a/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
+++ b/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
@@ -26,25 +26,30 @@
begin
- \b(function)(?:\s+(?:[a-zA-Z_][a-zA-Z0-9_]*([.:]))?([a-zA-Z_][a-zA-Z0-9_]*))?\s*(\()
+ (?:(\$declare)\s+)?\b(function)(?:\s+(?:[a-zA-Z_][a-zA-Z0-9_]*([.:]))?([a-zA-Z_][a-zA-Z0-9_]*))?\s*(\()
beginCaptures
1
name
- storage.type.function.pluto
+ storage.modifier.pluto
2
name
- punctuation.separator.parameter.pluto
+ storage.type.function.pluto
3
name
- entity.name.function.pluto
+ punctuation.separator.parameter.pluto
4
+
+ name
+ entity.name.function.pluto
+
+ 5
name
punctuation.section.group.begin.pluto
@@ -537,6 +542,79 @@
name
storage.modifier.pluto
+
+ begin
+ (?<!\S)(\$declare)\s+(?!class)(?!pluto_class)(?!function)(?:(and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|pluto_use|pluto_switch|pluto_continue|pluto_enum|pluto_new|pluto_class|pluto_export|pluto_try|pluto_catch|switch|continue|enum|new|class|export|try|catch|return|then|true|until|while)\b|\w+)\s*(:)\s*(\{)
+ beginCaptures
+
+ 1
+
+ name
+ storage.modifier.pluto
+
+ 2
+
+ name
+ invalid.name.reserved.not-narrow.not-overridable.not-optional.not-special.pluto
+
+ 3
+
+ name
+ punctuation.separator.colon.pluto
+
+ 4
+
+ name
+ punctuation.section.table.begin.pluto
+
+
+ end
+ \}
+ endCaptures
+
+ 0
+
+ name
+ punctuation.section.table.end.pluto
+
+
+ name
+ meta.typehint.table.pluto
+ patterns
+
+
+ include
+ #table_type_body
+
+
+
+
+ match
+ (?<!\S)(\$declare)\s+(?!class)(?!pluto_class)(?!function)(?:(and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|pluto_use|pluto_switch|pluto_continue|pluto_enum|pluto_new|pluto_class|pluto_export|pluto_try|pluto_catch|switch|continue|enum|new|class|export|try|catch|return|then|true|until|while)\b|\w+)(?:\s*(:)\s+(?!function\s*\()(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\??))?(?!\s*=\s*\|[a-zA-Z0-9_,\s]*\|\s*->)
+ captures
+
+ 1
+
+ name
+ storage.modifier.pluto
+
+ 2
+
+ name
+ invalid.name.reserved.not-narrow.not-overridable.not-optional.not-special.pluto
+
+ 3
+
+ name
+ punctuation.separator.colon.pluto
+
+ 4
+
+ name
+ storage.type.primitive.pluto
+
+
+
match
\+|-|%|#|\*|\/|\^|==|~=|!=|<=?|>=?|(?<!\.)\.{2}(?!\.)|\$|\||~|&
diff --git a/test.js b/test.js
index e5f8f7d..14d2e51 100644
--- a/test.js
+++ b/test.js
@@ -270,6 +270,53 @@ async function main()
` - punctuation.separator.colon.pluto`,
` -------- storage.type.primitive.pluto`
);
+ checkClassification(
+ `$declare _PVERSION: string`,
+ `-------- storage.modifier.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` ------ storage.type.primitive.pluto`
+ );
+ checkClassification(
+ `$declare function tonumber(str: string, base: ?number): number`,
+ `-------- storage.modifier.pluto`,
+ ` - meta.function.pluto`,
+ ` -------- storage.type.function.pluto`,
+ ` - meta.function.pluto`,
+ ` -------- entity.name.function.pluto`,
+ ` - punctuation.section.group.begin.pluto`,
+ ` --- variable.parameter.function.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.pluto`,
+ ` ------ storage.type.primitive.pluto`,
+ ` - punctuation.separator.comma.pluto`,
+ ` - meta.function.pluto`,
+ ` ---- variable.parameter.function.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.typehint.pluto`,
+ ` ------- storage.type.primitive.pluto`,
+ ` - punctuation.section.group.end.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.function.pluto`,
+ ` ------ storage.type.primitive.pluto`
+ );
+
+ checkClassification(
+ `$if true then`,
+ `- keyword.operator.logical.pluto`,
+ ` -- keyword.control.pluto`,
+ ` ---- constant.language.pluto`,
+ ` ---- keyword.control.pluto`
+ );
+ checkClassification(
+ `$else`,
+ `- keyword.operator.logical.pluto`,
+ ` ---- keyword.control.pluto`
+ );
+ checkClassification(
+ `$end`,
+ `- keyword.operator.logical.pluto`,
+ ` --- keyword.control.pluto`
+ );
const langConfig = JSON.parse(
fs.readFileSync(path.join(__dirname, "language-config.json"), "utf8").replace(/\/\/.*$/gm, "")
From ed0d49461bdfb98b308db2dcb99aae3388730e5b Mon Sep 17 00:00:00 2001
From: Sainan <63328889+Sainan@users.noreply.github.com>
Date: Wed, 6 Aug 2025 18:48:37 +0200
Subject: [PATCH 09/12] Bump version
---
package.json | 2 +-
source.extension.vsixmanifest | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index 8c74ce9..617cd7c 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
"keywords": [
"Pluto language"
],
- "version": "0.7.1",
+ "version": "0.8.0",
"publisher": "calamity-inc",
"icon": "icon.png",
"repository": "https://github.com/PlutoLang/Syntax-Highlighting",
diff --git a/source.extension.vsixmanifest b/source.extension.vsixmanifest
index 85c416b..b7233e0 100644
--- a/source.extension.vsixmanifest
+++ b/source.extension.vsixmanifest
@@ -1,7 +1,7 @@
-
+
Pluto Syntax Highlighting
Provides syntax highlighting and snippets for Pluto, a Lua dialect.
icon.png
From 089b9a44374c5790852e3302758d77d53acb4b66 Mon Sep 17 00:00:00 2001
From: Sainan <63328889+Sainan@users.noreply.github.com>
Date: Sun, 24 Aug 2025 06:03:29 +0200
Subject: [PATCH 10/12] Highlight type hints for multiple return values
---
Pluto.tmbundle/Syntaxes/Pluto.tmLanguage | 14 +++++++-------
test.js | 13 +++++++++++++
2 files changed, 20 insertions(+), 7 deletions(-)
diff --git a/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage b/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
index 9ef358a..9f031ba 100644
--- a/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
+++ b/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
@@ -56,7 +56,7 @@
end
- (\))(?:(:)\s+(void|\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\??))?(\s*<nodiscard>)?
+ (\))(?:(:)\s+(void|\([^)]*\)|\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\??))?(\s*<nodiscard>)?
endCaptures
1
@@ -122,7 +122,7 @@
match
- (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\??)
+ (:)\s+(\([^)]*\)|\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\??)
captures
1
@@ -698,7 +698,7 @@
match
- (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\??)
+ (:)\s+(\([^)]*\)|\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\??)
captures
1
@@ -1428,7 +1428,7 @@
match
- (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\??)
+ (:)\s+(\([^)]*\)|\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\??)
captures
1
@@ -1521,7 +1521,7 @@
match
- (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\??)
+ (:)\s+(\([^)]*\)|\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\??)
captures
1
@@ -1572,7 +1572,7 @@
match
- (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\??)
+ (:)\s+(\([^)]*\)|\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\??)
captures
1
@@ -1648,7 +1648,7 @@
match
- (:)\s+(\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*)\??)
+ (:)\s+(\([^)]*\)|\??(?:(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\|)*(?:string|number|int|float|bool(?:ean)?|function|table|userdata|any|nil|[a-zA-Z_][a-zA-Z0-9_]*|\{[^}]*\})\??)
captures
1
diff --git a/test.js b/test.js
index 14d2e51..c4ff56e 100644
--- a/test.js
+++ b/test.js
@@ -189,6 +189,19 @@ async function main()
` - punctuation.section.group.end.pluto`
);
+ checkClassification(
+ `local function f(): (bool, int)`,
+ `----- storage.modifier.pluto`,
+ ` -------- storage.type.function.pluto`,
+ ` - meta.function.pluto`,
+ ` - entity.name.function.pluto`,
+ ` - punctuation.section.group.begin.pluto`,
+ ` - punctuation.section.group.end.pluto`,
+ ` - punctuation.separator.colon.pluto`,
+ ` - meta.function.pluto`,
+ ` ----------- storage.type.primitive.pluto`
+ );
+
checkClassification(
`$type StringOrNumber = string|number`,
`----- storage.type.named.pluto`,
From cccf5edd3c9c49e82d49e7553a844dec31226117 Mon Sep 17 00:00:00 2001
From: Sainan <63328889+Sainan@users.noreply.github.com>
Date: Sun, 24 Aug 2025 06:25:00 +0200
Subject: [PATCH 11/12] Fix function in $type and $declare triggering indent
pattern
---
Pluto.tmbundle/Preferences/Indentation Rules.tmPreferences | 2 +-
language-config.json | 4 ++--
test.js | 2 ++
3 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/Pluto.tmbundle/Preferences/Indentation Rules.tmPreferences b/Pluto.tmbundle/Preferences/Indentation Rules.tmPreferences
index f6f5089..e972573 100644
--- a/Pluto.tmbundle/Preferences/Indentation Rules.tmPreferences
+++ b/Pluto.tmbundle/Preferences/Indentation Rules.tmPreferences
@@ -7,7 +7,7 @@
increaseIndentPattern
- (^\s*\$?\b((local)?[\s\w=]+)?(function|repeat|else|elseif|if|while|class|pluto_class|enum|pluto_enum|try|pluto_try)\b((?!\bend\b).)*$|^.*\b(do|then)\b((?!\bend\b).)*$|^.*\{((?!\}).)*$)
+ (^\s*\$?(?!declare\s+function\b)\b((local)?[\s\w=]+)?(function(?!\s*\([^)]*\)\s*:)|repeat|else|elseif|if|while|class|pluto_class|enum|pluto_enum|try|pluto_try)\b((?!\bend\b).)*$|^.*\b(do|then)\b((?!\bend\b).)*$|^.*\{((?!\}).)*$)
decreaseIndentPattern
(^\s*\$?\b(elsei|elseif|else|catch|pluto_catch|end|until)\b.*$|^((?!\{).)*\}\;?.*$)
diff --git a/language-config.json b/language-config.json
index 6e7cf57..2947597 100644
--- a/language-config.json
+++ b/language-config.json
@@ -5,7 +5,7 @@
},
// Keep in sync with Pluto.tmbundle/Preferences/Indentation Rules.tmPreferences
"indentationRules": {
- "increaseIndentPattern": "(^\\s*\\$?\\b((local)?[\\s\\w=]+)?(function|repeat|else|elseif|if|while|class|pluto_class|enum|pluto_enum|try|pluto_try)\\b((?!\\bend\\b).)*$|^.*\\b(do|then)\\b((?!\\bend\\b).)*$|^.*\\{((?!\\}).)*$)",
+ "increaseIndentPattern": "(^\\s*\\$?(?!declare\\s+function\\b)\\b((local)?[\\s\\w=]+)?(function(?!\\s*\\([^)]*\\)\\s*:)|repeat|else|elseif|if|while|class|pluto_class|enum|pluto_enum|try|pluto_try)\\b((?!\\bend\\b).)*$|^.*\\b(do|then)\\b((?!\\bend\\b).)*$|^.*\\{((?!\\}).)*$)",
"decreaseIndentPattern": "(^\\s*\\$?\\b(elsei|elseif|else|catch|pluto_catch|end|until)\\b.*$|^((?!\\{).)*\\}\\;?.*$)"
}
-}
\ No newline at end of file
+}
diff --git a/test.js b/test.js
index c4ff56e..1e2f4fb 100644
--- a/test.js
+++ b/test.js
@@ -360,6 +360,8 @@ async function main()
checkIndentation("until finished", false, true);
checkIndentation("values = {", true, false);
checkIndentation("}", false, true);
+ checkIndentation("$type Func = function(_: string): void", false, false);
+ checkIndentation("$declare function tonumber(str: string, base: ?number): number", false, false);
if (!ok)
{
From facfb553ce43053d8b48d7cf1eb96dd9b8f01956 Mon Sep 17 00:00:00 2001
From: Sainan <63328889+Sainan@users.noreply.github.com>
Date: Mon, 25 Aug 2025 04:29:05 +0200
Subject: [PATCH 12/12] Fix regression with increaseIndentPattern
---
Pluto.tmbundle/Preferences/Indentation Rules.tmPreferences | 2 +-
language-config.json | 2 +-
test.js | 1 +
3 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/Pluto.tmbundle/Preferences/Indentation Rules.tmPreferences b/Pluto.tmbundle/Preferences/Indentation Rules.tmPreferences
index e972573..157eeac 100644
--- a/Pluto.tmbundle/Preferences/Indentation Rules.tmPreferences
+++ b/Pluto.tmbundle/Preferences/Indentation Rules.tmPreferences
@@ -7,7 +7,7 @@
increaseIndentPattern
- (^\s*\$?(?!declare\s+function\b)\b((local)?[\s\w=]+)?(function(?!\s*\([^)]*\)\s*:)|repeat|else|elseif|if|while|class|pluto_class|enum|pluto_enum|try|pluto_try)\b((?!\bend\b).)*$|^.*\b(do|then)\b((?!\bend\b).)*$|^.*\{((?!\}).)*$)
+ (^\s*\$?(?!declare\s+function\b)\b((local)?[\s\w=]+)?\b(function(?!\s*\([^)]*\)\s*:)|repeat|else|elseif|if|while|class|pluto_class|enum|pluto_enum|try|pluto_try)\b((?!\bend\b).)*$|^.*\b(do|then)\b((?!\bend\b).)*$|^.*\{((?!\}).)*$)
decreaseIndentPattern
(^\s*\$?\b(elsei|elseif|else|catch|pluto_catch|end|until)\b.*$|^((?!\{).)*\}\;?.*$)
diff --git a/language-config.json b/language-config.json
index 2947597..8f81179 100644
--- a/language-config.json
+++ b/language-config.json
@@ -5,7 +5,7 @@
},
// Keep in sync with Pluto.tmbundle/Preferences/Indentation Rules.tmPreferences
"indentationRules": {
- "increaseIndentPattern": "(^\\s*\\$?(?!declare\\s+function\\b)\\b((local)?[\\s\\w=]+)?(function(?!\\s*\\([^)]*\\)\\s*:)|repeat|else|elseif|if|while|class|pluto_class|enum|pluto_enum|try|pluto_try)\\b((?!\\bend\\b).)*$|^.*\\b(do|then)\\b((?!\\bend\\b).)*$|^.*\\{((?!\\}).)*$)",
+ "increaseIndentPattern": "(^\\s*\\$?(?!declare\\s+function\\b)\\b((local)?[\\s\\w=]+)?\\b(function(?!\\s*\\([^)]*\\)\\s*:)|repeat|else|elseif|if|while|class|pluto_class|enum|pluto_enum|try|pluto_try)\\b((?!\\bend\\b).)*$|^.*\\b(do|then)\\b((?!\\bend\\b).)*$|^.*\\{((?!\\}).)*$)",
"decreaseIndentPattern": "(^\\s*\\$?\\b(elsei|elseif|else|catch|pluto_catch|end|until)\\b.*$|^((?!\\{).)*\\}\\;?.*$)"
}
}
diff --git a/test.js b/test.js
index 1e2f4fb..2d15767 100644
--- a/test.js
+++ b/test.js
@@ -362,6 +362,7 @@ async function main()
checkIndentation("}", false, true);
checkIndentation("$type Func = function(_: string): void", false, false);
checkIndentation("$declare function tonumber(str: string, base: ?number): number", false, false);
+ checkIndentation("local entry", false, false);
if (!ok)
{