diff --git a/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage b/Pluto.tmbundle/Syntaxes/Pluto.tmLanguage
index be012ed..036ef1a 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
@@ -539,7 +544,7 @@
match
- \+|-|%|#|\*|\/|\^|==|~=|!=|<=?|>=?|(?<!\.)\.{2}(?!\.)|\$|\||~|&
+ \+|-|%|#|\*|\/|\^|==|~=|!=|<=?|>=?|(?<!\.)\.{2}(?!\.)|\$(?![a-zA-Z_])|\||~|&
name
keyword.operator.logical.pluto
@@ -772,6 +777,52 @@
+
+ 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
+
+
+
include
#function_type
@@ -803,6 +854,33 @@
+
+ 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
\b(?<![.\:])(local|global|export|pluto_export)\b
diff --git a/test.js b/test.js
index e5f8f7d..0f8076f 100644
--- a/test.js
+++ b/test.js
@@ -270,6 +270,35 @@ 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`
+ );
const langConfig = JSON.parse(
fs.readFileSync(path.join(__dirname, "language-config.json"), "utf8").replace(/\/\/.*$/gm, "")