Merge branch 'master' into lsp-server

This commit is contained in:
csh 2025-08-29 16:58:14 +08:00
commit 23d113457a
13 changed files with 259 additions and 209 deletions

View File

@ -8,10 +8,10 @@
### 安装方式一(推荐) ### 安装方式一(推荐)
安装[vsix](./vscode/tsl-devkit-1.0.0.vsix)扩展 安装[vsix](./vscode/)扩展
```bash ```bash
code --install-extension tsl-devkit-1.0.0.vsix # 具体版本号以vsix文件为准 code --install-extension tsl-tools-1.0.0.vsix # 具体版本号以vsix文件为准
``` ```
### 安装方式二 ### 安装方式二
@ -33,7 +33,7 @@ npm install
npx vsce package npx vsce package
# 安装 # 安装
code --install-extension tsl-devkit-1.0.0.vsix # 具体版本号以vsix文件为准 code --install-extension tsl-tools-1.0.0.vsix # 具体版本号以vsix文件为准
``` ```
## Vim ## Vim
@ -53,8 +53,8 @@ autocmd BufNewFile,BufRead *.ts[lf] setf tsl
"languageserver": { "languageserver": {
"tsl-server": { "tsl-server": {
"command": "tsl-server", "command": "tsl-server",
"args": ["--log=trace", "--log=stderr"],
"filetypes": ["tsl", "tsf"] "filetypes": ["tsl", "tsf"]
} }
} }
``` ```

View File

@ -1,13 +1,22 @@
// SYNTAX TEST "tsl" // SYNTAX TEST "tsl"
// 字符串,数字,注释
// 注释 TODO // 注释 TODO
// abc(); // TODO: 注释
a := "string"; // 字符串 {aaaaa TODO}
b := 123; // 数字 (* abcdef *)
c := 1.23; // 浮点数
a := "字符串函数func()";
// 数字
num6 := 123; // 数字
num7 := 1.23; // 浮点数
num1 := 0xAF123;
num2 := 0O12357;
num3 := 0B010111;
num4 := 1.2e-12;
num5 := +3E15;
// 字符串
string1 := '123';
string2 := "func2()";
// 类相关 // 类相关
type MyClass = class type MyClass = class
@ -20,6 +29,8 @@ public
property P1 write param1_ read param1_; property P1 write param1_ read param1_;
private private
[weakref]obj: integer;
[weakref]b: MyClass;
param1_: real; param1_: real;
param2_: array of string; param2_: array of string;
end; end;
@ -30,7 +41,7 @@ end;
function MyClass.Func3(a: real = 1; b: string = "123"): array of string; function MyClass.Func3(a: real = 1; b: string = "123"): array of string;
begin begin
obj.P1; obj.P1.P2;
self.P1; self.P1;
end end
@ -42,7 +53,8 @@ data.items.count;
// 函数声明 // 函数声明
function f(); // 无参数 function f(); // 无参数
function f(a, b); // 参数无类型 function f(a, b); // 参数无类型
function f(a: real; b: DD); // 参数有类型 function f(a: real; b: DD); // 参数有类型1
function f(a: real, b: DD); // 参数有类型2
function f(a: real = 1; b: string = "123"; c: number = abc.CONST1): def; // 带返回类型 function f(a: real = 1; b: string = "123"; c: number = abc.CONST1): def; // 带返回类型
// 函数调用 // 函数调用
@ -70,3 +82,15 @@ b := array((1, 2), (3, 4));
sql += "update ts_xbcheck result set isvalid = "$status$remark$" where checkid in ('"$array2str sql += "update ts_xbcheck result set isvalid = "$status$remark$" where checkid in ('"$array2str
(checkid[(i-1)*len:], "','")$"');\r\n" (checkid[(i-1)*len:], "','")$"');\r\n"
sql += sql +=
// tsl-web块
<?tslx>
<HTML>
<Body>
<p>
<?tsl write("TSL Script");?>
</p>
</Body>
</HTML>

View File

@ -20,7 +20,7 @@ syn keyword tslPrimitiveType string integer boolean int64 real array
# 类型系统和面向对象 # 类型系统和面向对象
syn keyword tslClassType type class fakeclass new syn keyword tslClassType type class fakeclass new
syn keyword tslClassModifier override overload virtual property self inherited syn keyword tslClassModifier override overload virtual property inherited self
syn keyword tslAccessModifier public protected private published syn keyword tslAccessModifier public protected private published
syn keyword tslConstructor create destroy operator syn keyword tslConstructor create destroy operator
syn keyword tslReferenceModifier weakref autoref syn keyword tslReferenceModifier weakref autoref
@ -66,15 +66,17 @@ syn keyword tslBoolean false true
syn keyword tslNull nil syn keyword tslNull nil
syn keyword tslMathConstant inf nan syn keyword tslMathConstant inf nan
# todo
syn keyword tslTodo FIXME NOTE NOTES TODO XXX contained syn keyword tslTodo FIXME NOTE NOTES TODO XXX contained
# Function definitions # Function definitions
syn match tslFuncName '\%(\h\w*\.\)\?\h\w*' contained nextgroup=tslFuncParams skipwhite contains=tslTypeNameInFunc,tslDotInFunc,tslFuncNamePart syn match tslFuncName '\%(\h\w*\.\)\?\h\w*' contained nextgroup=tslFuncParams skipwhite contains=tslTypeNameInFunc,tslDotInFunc
syn match tslTypeNameInFunc '\h\w*\ze\.\h\w*' contained syn match tslTypeNameInFunc '\h\w*\ze\.\h\w*' contained
syn match tslDotInFunc '\.' contained syn match tslDotInFunc '\.' contained
syn match tslFuncName '\.\@<=\h\w*' contained syn match tslFuncName '\.\@<=\h\w*' contained
syn region tslFuncParams syn region tslFuncParams
\ matchgroup=Delimiter
\ start='(' \ start='('
\ end=')' \ end=')'
\ contained \ contained
@ -87,12 +89,8 @@ syn match tslReturnType ':\s*[^;]*' contained contains=tslColon
syn match tslParamSep '[;,]' contained syn match tslParamSep '[;,]' contained
syn match tslColon ':' contained syn match tslColon ':' contained
syn match tslVarDecl '\(?\s\)\@<!\h\w\s:=\@!\s[^;?];' contains=tslVarName,tslVarType # Property chain
syn match tslVarName '\(?\s\)\@<!\h\w\ze\s:=\@!' contained syn match tslPropertyChain '\h\w*\%(\.\h\w*\)\+\>' contains=tslObjectName,tslPropertyDot,tslPropertyName
syn match tslVarType ':=\@!\s[^;?]' contained contains=tslColon
# 匹配完整的属性链
syn match tslPropertyChain '\h\w*\%(\.\h\w*\)\+' contains=tslObjectName,tslPropertyDot,tslPropertyName
syn match tslObjectName '\h\w*\ze\.\h\w*' contained syn match tslObjectName '\h\w*\ze\.\h\w*' contained
syn match tslPropertyDot '\.' contained syn match tslPropertyDot '\.' contained
syn match tslPropertyName '\.\@<=\h\w*\%(\ze\.\|\ze\s*[^(]\|\ze\s*$\)' contained syn match tslPropertyName '\.\@<=\h\w*\%(\ze\.\|\ze\s*[^(]\|\ze\s*$\)' contained
@ -107,7 +105,7 @@ syn region tslFuncCall
\ contains=tslFuncCallName,tslFuncCall,tslNamedParam,tslPositionalParam,tslString,tslRawString,tslNumber,tslIdentifier,tslOperator,tslParamSep \ contains=tslFuncCallName,tslFuncCall,tslNamedParam,tslPositionalParam,tslString,tslRawString,tslNumber,tslIdentifier,tslOperator,tslParamSep
\ transparent \ transparent
syn match tslNamedParam '\h\w*\s*:\s*[^;,)]*' contained syn match tslNamedParam '\%((\|;\s*\)\zs\h\w*\s*:\s*[^;,)]*' contained
\ contains=tslParamName,tslParamColon,tslParamValue \ contains=tslParamName,tslParamColon,tslParamValue
syn match tslParamName '\h\w*\ze\s*:' contained syn match tslParamName '\h\w*\ze\s*:' contained
@ -118,8 +116,21 @@ syn match tslParamValue ':\s*\zs[^;,)]*' contained
syn match tslPositionalParam '[^;,():]*' contained syn match tslPositionalParam '[^;,():]*' contained
\ contains=tslString,tslNumber,tslIdentifier,tslOperator,tslFuncCall,tslFuncCallName \ contains=tslString,tslNumber,tslIdentifier,tslOperator,tslFuncCall,tslFuncCallName
syn match tslParamSep '[;,]' contained # Variable declaration
syn match tslVarDeclWithTag '\]\@<=\s*\h\w*\ze\s*:\%(=\)\@!'
\ nextgroup=tslVarTypeDecl skipwhite
\ contains=tslVarName
syn match tslVarDeclStart '\%(^\s*\|;\s*\)\zs\h\w*\ze\s*:\%(=\)\@!'
\ nextgroup=tslVarTypeDecl skipwhite
\ contains=tslVarName
syn match tslVarName '\h\w*' contained
syn region tslVarTypeDecl
\ matchgroup=tslVarDelimiter start=':\%(=\)\@!' end=';'
\ contained keepend oneline
\ contains=tslVarType
syn match tslVarType '[^;]*' contained
# Operators and delimiters # Operators and delimiters
syn match tslOperator '[+\-*/<>=!&|^~%]' syn match tslOperator '[+\-*/<>=!&|^~%]'
@ -144,6 +155,7 @@ syn match tslNumber '\<\d\+[eE][+-]\=\d\+[jJ]\=\>'
syn match tslNumber '\<\d\+\.\%([eE][+-]\=\d\+\)\=[jJ]\=\%(\W\|$\)\@=' syn match tslNumber '\<\d\+\.\%([eE][+-]\=\d\+\)\=[jJ]\=\%(\W\|$\)\@='
syn match tslNumber '\%(^\|\W\)\zs\d*\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>' syn match tslNumber '\%(^\|\W\)\zs\d*\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>'
# Highlight links # Highlight links
hi def link tslProgramStructure Statement hi def link tslProgramStructure Statement
hi def link tslModuleStructure Statement hi def link tslModuleStructure Statement
@ -179,8 +191,8 @@ hi def link tslNull Constant
hi def link tslMathConstant Number hi def link tslMathConstant Number
# 其他元素的高亮链接保持不变 # 其他元素的高亮链接保持不变
hi def link tslClassName Type hi def link tslObjectName Type
hi def link tslDot Operator hi def link tslPropertyDot Operator
hi def link tslPropertyName Special hi def link tslPropertyName Special
hi def link tslFuncName Function hi def link tslFuncName Function

View File

@ -1,6 +1,23 @@
# Change Log # Change Log
Notable changes to the `TSL` extension will be documented in this file. Notable changes to the `TSL` extension will be documented in thio file.
## [2.3.1]: 2025-07-10
- 修复:关键字`initialization`拼写错误
## [2.3.0]: 2025-07-03
- 修改插件名为`tsl-tools`
- 支持设置参数
- `tsl.server.executable`: `tsl-server`的执行路径
- `tsl.server.arguments`: `tsl-server`的启动参数
- `tsl.interpreter.executable`: `tsl`解释器的路径
## [2.3.0]: 2025-08-29
- 支持`begin|else|do|then`等换行增加缩进
- 支持`end`等换行减少缩进
## [2.2.0]: 2025-07-02 ## [2.2.0]: 2025-07-02

Binary file not shown.

Binary file not shown.

View File

@ -1,3 +0,0 @@
cp ../lsp-server/build/arch/tsl-server ./bin/tsl-server
cp ../lsp-server/build/msys2/tsl-server.exe ./bin/tsl-server.exe
npx vsce package

View File

@ -22,15 +22,9 @@
["\"", "\""], ["\"", "\""],
["'", "'"] ["'", "'"]
], ],
"folding": {
"markers": {
"start": "^\\s*\\{\\s*$",
"end": "^\\s*\\}\\s*$"
}
},
"wordPattern": "\\b[a-zA-Z_][a-zA-Z0-9_]*\\b", "wordPattern": "\\b[a-zA-Z_][a-zA-Z0-9_]*\\b",
"indentationRules": { "indentationRules": {
"increaseIndentPattern": "^.*(\\{[^}\"']*|\\([^)\"']*|\\[[^\\]\"']*)$", "increaseIndentPattern": "^.*\\b([Bb][Ee][Gg][Ii][Nn]|[Dd][Oo]|[Tt][Hh][Ee][Nn]|[Ee][Ll][Ss][Ee])\\b.*$",
"decreaseIndentPattern": "^(.*\\*\\/)?\\s*[\\}\\]\\)].*$" "decreaseIndentPattern": "^\\s*\\b([Ee][Nn][Dd])\\b.*$"
} }
} }

251
vscode/package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "tsl-devkit", "name": "tsl-devkit",
"version": "2.1.0", "version": "2.3.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "tsl-devkit", "name": "tsl-devkit",
"version": "2.1.0", "version": "2.3.0",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"dependencies": { "dependencies": {
"vscode-languageclient": "^9.0.1" "vscode-languageclient": "^9.0.1"
@ -14,7 +14,7 @@
"devDependencies": { "devDependencies": {
"@types/node": "^24.0.3", "@types/node": "^24.0.3",
"@types/vscode": "^1.101.0", "@types/vscode": "^1.101.0",
"@vscode/vsce": "^3.5.0", "@vscode/vsce": "^3.6.0",
"prettier": "^3.5.3", "prettier": "^3.5.3",
"typescript": "^5.8.3" "typescript": "^5.8.3"
}, },
@ -367,64 +367,64 @@
} }
}, },
"node_modules/@secretlint/config-creator": { "node_modules/@secretlint/config-creator": {
"version": "9.3.4", "version": "10.1.1",
"resolved": "https://registry.npmjs.org/@secretlint/config-creator/-/config-creator-9.3.4.tgz", "resolved": "https://registry.npmjs.org/@secretlint/config-creator/-/config-creator-10.1.1.tgz",
"integrity": "sha512-GRMYfHJ+rewwB26CC3USVObqSQ/mDLXzXcUMJw/wJisPr3HDZmdsYlcsNnaAcGN+EZmvqSDkgSibQm1hyZpzbg==", "integrity": "sha512-TJ42CHZqqnEe9ORvIXVVMqdu3KAtyZRxLspjFexo6XgrwJ6CoFHQYzIihilqRjo2sJh9HMrpnYSj/5hopofGrA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@secretlint/types": "^9.3.4" "@secretlint/types": "^10.1.1"
}, },
"engines": { "engines": {
"node": "^14.13.1 || >=16.0.0" "node": ">=20.0.0"
} }
}, },
"node_modules/@secretlint/config-loader": { "node_modules/@secretlint/config-loader": {
"version": "9.3.4", "version": "10.1.1",
"resolved": "https://registry.npmjs.org/@secretlint/config-loader/-/config-loader-9.3.4.tgz", "resolved": "https://registry.npmjs.org/@secretlint/config-loader/-/config-loader-10.1.1.tgz",
"integrity": "sha512-sy+yWDWh4cbAbpQYLiO39DjwNGEK1EUhTqNamLLBo163BdJP10FIWhqpe8mtGQBSBXRtxr8Hg/gc3Xe4meIoww==", "integrity": "sha512-jBClVFmS6Yu/zI5ejBCRF5a5ASYsE4gOjogjB+WsaHbQHtGvnyY7I26Qtdg4ihCc/VPKYQg0LdM75pLTXzwsjg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@secretlint/profiler": "^9.3.4", "@secretlint/profiler": "^10.1.1",
"@secretlint/resolver": "^9.3.4", "@secretlint/resolver": "^10.1.1",
"@secretlint/types": "^9.3.4", "@secretlint/types": "^10.1.1",
"ajv": "^8.17.1", "ajv": "^8.17.1",
"debug": "^4.4.1", "debug": "^4.4.1",
"rc-config-loader": "^4.1.3" "rc-config-loader": "^4.1.3"
}, },
"engines": { "engines": {
"node": "^14.13.1 || >=16.0.0" "node": ">=20.0.0"
} }
}, },
"node_modules/@secretlint/core": { "node_modules/@secretlint/core": {
"version": "9.3.4", "version": "10.1.1",
"resolved": "https://registry.npmjs.org/@secretlint/core/-/core-9.3.4.tgz", "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-10.1.1.tgz",
"integrity": "sha512-ErIVHI6CJd191qdNKuMkH3bZQo9mWJsrSg++bQx64o0WFuG5nPvkYrDK0p/lebf+iQuOnzvl5HrZU6GU9a6o+Q==", "integrity": "sha512-COLCxSoH/iVQdLeaZPVtBj0UWKOagO09SqYkCQgfFfZ+soGxKVK405dL317r4PnH9Pm8/s8xQC6OSY5rWTRObQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@secretlint/profiler": "^9.3.4", "@secretlint/profiler": "^10.1.1",
"@secretlint/types": "^9.3.4", "@secretlint/types": "^10.1.1",
"debug": "^4.4.1", "debug": "^4.4.1",
"structured-source": "^4.0.0" "structured-source": "^4.0.0"
}, },
"engines": { "engines": {
"node": "^14.13.1 || >=16.0.0" "node": ">=20.0.0"
} }
}, },
"node_modules/@secretlint/formatter": { "node_modules/@secretlint/formatter": {
"version": "9.3.4", "version": "10.1.1",
"resolved": "https://registry.npmjs.org/@secretlint/formatter/-/formatter-9.3.4.tgz", "resolved": "https://registry.npmjs.org/@secretlint/formatter/-/formatter-10.1.1.tgz",
"integrity": "sha512-ARpoBOKz6WP3ocLITCFkR1/Lj636ugpBknylhlpc45r5aLdvmyvWAJqodlw5zmUCfgD6JXeAMf3Hi60aAiuqWQ==", "integrity": "sha512-Gpd8gTPN121SJ0h/9e6nWlZU7PitfhXUiEzW7Kyswg6kNGs+bSqmgTgWFtbo1VQ4ygJYiveWPNT05RCImBexJw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@secretlint/resolver": "^9.3.4", "@secretlint/resolver": "^10.1.1",
"@secretlint/types": "^9.3.4", "@secretlint/types": "^10.1.1",
"@textlint/linter-formatter": "^14.7.2", "@textlint/linter-formatter": "^14.8.4",
"@textlint/module-interop": "^14.7.2", "@textlint/module-interop": "^14.8.4",
"@textlint/types": "^14.7.2", "@textlint/types": "^14.8.4",
"chalk": "^4.1.2", "chalk": "^4.1.2",
"debug": "^4.4.1", "debug": "^4.4.1",
"pluralize": "^8.0.0", "pluralize": "^8.0.0",
@ -433,47 +433,47 @@
"terminal-link": "^2.1.1" "terminal-link": "^2.1.1"
}, },
"engines": { "engines": {
"node": "^14.13.1 || >=16.0.0" "node": ">=20.0.0"
} }
}, },
"node_modules/@secretlint/node": { "node_modules/@secretlint/node": {
"version": "9.3.4", "version": "10.1.1",
"resolved": "https://registry.npmjs.org/@secretlint/node/-/node-9.3.4.tgz", "resolved": "https://registry.npmjs.org/@secretlint/node/-/node-10.1.1.tgz",
"integrity": "sha512-S0u8i+CnPmyAKtuccgot9L5cmw6DqJc0F+b3hhVIALd8kkeLt3RIXOOej15tU7N0V1ISph90Gz92V72ovsprgQ==", "integrity": "sha512-AhN+IGqljVObm8a+B33b23FY79wihu5E61Nd3oYSoZV7SxUvMjpafqhLfpt4frNSY7Ghf/pirWu7JY7GMujFrA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@secretlint/config-loader": "^9.3.4", "@secretlint/config-loader": "^10.1.1",
"@secretlint/core": "^9.3.4", "@secretlint/core": "^10.1.1",
"@secretlint/formatter": "^9.3.4", "@secretlint/formatter": "^10.1.1",
"@secretlint/profiler": "^9.3.4", "@secretlint/profiler": "^10.1.1",
"@secretlint/source-creator": "^9.3.4", "@secretlint/source-creator": "^10.1.1",
"@secretlint/types": "^9.3.4", "@secretlint/types": "^10.1.1",
"debug": "^4.4.1", "debug": "^4.4.1",
"p-map": "^4.0.0" "p-map": "^7.0.3"
}, },
"engines": { "engines": {
"node": "^14.13.1 || >=16.0.0" "node": ">=20.0.0"
} }
}, },
"node_modules/@secretlint/profiler": { "node_modules/@secretlint/profiler": {
"version": "9.3.4", "version": "10.1.1",
"resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-9.3.4.tgz", "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-10.1.1.tgz",
"integrity": "sha512-99WmaHd4dClNIm5BFsG++E6frNIZ3qVwg6s804Ql/M19pDmtZOoVCl4/UuzWpwNniBqLIgn9rHQZ/iGlIW3wyw==", "integrity": "sha512-kReI+Wr7IQz0LbVwYByzlnPbx4BEF2oEWJBc4Oa45g24alCjHu+jD9h9mzkTJqYUgMnVYD3o7HfzeqxFrV+9XA==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@secretlint/resolver": { "node_modules/@secretlint/resolver": {
"version": "9.3.4", "version": "10.1.1",
"resolved": "https://registry.npmjs.org/@secretlint/resolver/-/resolver-9.3.4.tgz", "resolved": "https://registry.npmjs.org/@secretlint/resolver/-/resolver-10.1.1.tgz",
"integrity": "sha512-L1lIrcjzqcspPzZttmOvMmOFDpJTYFyRBONg94TZBWrpv4x0w5G2SYR+K7EE1SbYQAiPxw1amoXT1YRP8cZF2A==", "integrity": "sha512-GdQzxnBtdBRjBULvZ8ERkaRqDp0njVwXrzBCav1pb0XshVk76C1cjeDqtTqM4RJ1Awo/g5U5MIWYztYv67v5Gg==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@secretlint/secretlint-formatter-sarif": { "node_modules/@secretlint/secretlint-formatter-sarif": {
"version": "9.3.4", "version": "10.1.1",
"resolved": "https://registry.npmjs.org/@secretlint/secretlint-formatter-sarif/-/secretlint-formatter-sarif-9.3.4.tgz", "resolved": "https://registry.npmjs.org/@secretlint/secretlint-formatter-sarif/-/secretlint-formatter-sarif-10.1.1.tgz",
"integrity": "sha512-IpAl5gzKwpTRqoivKOTJB89l6b7uvBwjSNKzJb3oIGD9Jg3vXcQunSntvLv5XGynYtdi1NhANfEpbhavlmMSyA==", "integrity": "sha512-Dyq8nzy6domjSlZKX1E5PEzuWxeTqjQJWrlXBmVmOjwLBLfRZDlm5Vq+AduBmEk03KEIKIZi4cZQwsniuRPO9Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -481,50 +481,50 @@
} }
}, },
"node_modules/@secretlint/secretlint-rule-no-dotenv": { "node_modules/@secretlint/secretlint-rule-no-dotenv": {
"version": "9.3.4", "version": "10.1.1",
"resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-no-dotenv/-/secretlint-rule-no-dotenv-9.3.4.tgz", "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-no-dotenv/-/secretlint-rule-no-dotenv-10.1.1.tgz",
"integrity": "sha512-lMSVwTrJiZ/zL9VIzpT7tMcb0ClI6u4cyJo2YKGSbuJErJG1zB4gQKtjIwCSt7px5JF6U+aFtpb9M8+s40WWCQ==", "integrity": "sha512-a3/sOUUtEHuw1HCadtxUjViNeomiiohfJj+rwtHxJkCq4pjITS3HSYhQBXnNvkctQNljKIzFm7JUA/4QJ6I4sQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@secretlint/types": "^9.3.4" "@secretlint/types": "^10.1.1"
}, },
"engines": { "engines": {
"node": "^14.13.1 || >=16.0.0" "node": ">=20.0.0"
} }
}, },
"node_modules/@secretlint/secretlint-rule-preset-recommend": { "node_modules/@secretlint/secretlint-rule-preset-recommend": {
"version": "9.3.4", "version": "10.1.1",
"resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-9.3.4.tgz", "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-10.1.1.tgz",
"integrity": "sha512-RvzrLNN2A0B2bYQgRSRjh2dkdaIDuhXjj4SO5bElK1iBtJNiD6VBTxSSY1P3hXYaBeva7MEF+q1PZ3cCL8XYOA==", "integrity": "sha512-+GeISCXVgpnoeRZE4ZPsuO97+fm6z8Ge23LNq6LvR9ZJAq018maXVftkJhHj4hnvYB5URUAEerBBkPGNk5/Ong==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": "^14.13.1 || >=16.0.0" "node": ">=20.0.0"
} }
}, },
"node_modules/@secretlint/source-creator": { "node_modules/@secretlint/source-creator": {
"version": "9.3.4", "version": "10.1.1",
"resolved": "https://registry.npmjs.org/@secretlint/source-creator/-/source-creator-9.3.4.tgz", "resolved": "https://registry.npmjs.org/@secretlint/source-creator/-/source-creator-10.1.1.tgz",
"integrity": "sha512-I9ZA1gm9HJNaAhZiQdInY9VM04VTAGDV4bappVbEJzMUDnK/LTbYqfQ88RPqgCGCqa6ee8c0/j5Bn7ypweouIw==", "integrity": "sha512-IWjvHcE0bhC/x88a9M9jbZlFRZGUEbBzujxrs2KzI5IQ2BXTBRBRhRSjE/BEpWqDHILB22c3mfam8X+UjukphA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@secretlint/types": "^9.3.4", "@secretlint/types": "^10.1.1",
"istextorbinary": "^9.5.0" "istextorbinary": "^9.5.0"
}, },
"engines": { "engines": {
"node": "^14.13.1 || >=16.0.0" "node": ">=20.0.0"
} }
}, },
"node_modules/@secretlint/types": { "node_modules/@secretlint/types": {
"version": "9.3.4", "version": "10.1.1",
"resolved": "https://registry.npmjs.org/@secretlint/types/-/types-9.3.4.tgz", "resolved": "https://registry.npmjs.org/@secretlint/types/-/types-10.1.1.tgz",
"integrity": "sha512-z9rdKHNeL4xa48+367RQJVw1d7/Js9HIQ+gTs/angzteM9osfgs59ad3iwVRhCGYbeUoUUDe2yxJG2ylYLaH3Q==", "integrity": "sha512-/JGAvVkurVHkargk3AC7UxRy+Ymc+52AVBO/fZA5pShuLW2dX4O/rKc4n8cyhQiOb/3ym5ACSlLQuQ8apPfxrQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": "^14.13.1 || >=16.0.0" "node": ">=20.0.0"
} }
}, },
"node_modules/@sindresorhus/merge-streams": { "node_modules/@sindresorhus/merge-streams": {
@ -541,24 +541,24 @@
} }
}, },
"node_modules/@textlint/ast-node-types": { "node_modules/@textlint/ast-node-types": {
"version": "14.8.1", "version": "14.8.4",
"resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.8.1.tgz", "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.8.4.tgz",
"integrity": "sha512-fW5Tx5F3ZmTZeKNins9uRhoDCVLHcuUijGNQRfCmJX8R6MjL0yBFt3hHlrvXDpZg5t2PELCvBA25id83LhNMSg==", "integrity": "sha512-+fI7miec/r9VeniFV9ppL4jRCmHNsTxieulTUf/4tvGII3db5hGriKHC4p/diq1SkQ9Sgs7kg6UyydxZtpTz1Q==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@textlint/linter-formatter": { "node_modules/@textlint/linter-formatter": {
"version": "14.8.1", "version": "14.8.4",
"resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-14.8.1.tgz", "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-14.8.4.tgz",
"integrity": "sha512-guraonRgEZJ9MnysT+pCvXFDaT5VeHwAHZAsr7uDRSviqEldmG2oqtXf4lxaQ1Qo4SL16bzSEr6F7+j5k8QONQ==", "integrity": "sha512-sZ0UfYRDBNHnfMVBqLqqYnqTB7Ec169ljlmo+SEHR1T+dHUPYy1/DZK4p7QREXlBSFL4cnkswETCbc9xRodm4Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@azu/format-text": "^1.0.2", "@azu/format-text": "^1.0.2",
"@azu/style-format": "^1.0.1", "@azu/style-format": "^1.0.1",
"@textlint/module-interop": "^14.8.1", "@textlint/module-interop": "14.8.4",
"@textlint/resolver": "^14.8.1", "@textlint/resolver": "14.8.4",
"@textlint/types": "^14.8.1", "@textlint/types": "14.8.4",
"chalk": "^4.1.2", "chalk": "^4.1.2",
"debug": "^4.4.1", "debug": "^4.4.1",
"js-yaml": "^3.14.1", "js-yaml": "^3.14.1",
@ -578,27 +578,27 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@textlint/module-interop": { "node_modules/@textlint/module-interop": {
"version": "14.8.1", "version": "14.8.4",
"resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-14.8.1.tgz", "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-14.8.4.tgz",
"integrity": "sha512-Lt3Qjb81e09nPElcJM6rOml5uPyZLKHScAoI9LlpcVca5oS2ZjnPr6M92tKxf/kfkqL4lDkg0LY61W1r5MI7Zg==", "integrity": "sha512-1LdPYLAVpa27NOt6EqvuFO99s4XLB0c19Hw9xKSG6xQ1K82nUEyuWhzTQKb3KJ5Qx7qj14JlXZLfnEuL6A16Bw==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@textlint/resolver": { "node_modules/@textlint/resolver": {
"version": "14.8.1", "version": "14.8.4",
"resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-14.8.1.tgz", "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-14.8.4.tgz",
"integrity": "sha512-aAOKXQJhVnq8LXBibEpo0dgEr8ImCw4waj3kAeC+Nj+a9nQkOitg4Veul/IO6he7mNxvYRgqWWoMaN9JRqp34w==", "integrity": "sha512-nMDOgDAVwNU9ommh+Db0U+MCMNDPbQ/1HBNjbnHwxZkCpcT6hsAJwBe38CW/DtWVUv8yeR4R40IYNPT84srNwA==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@textlint/types": { "node_modules/@textlint/types": {
"version": "14.8.1", "version": "14.8.4",
"resolved": "https://registry.npmjs.org/@textlint/types/-/types-14.8.1.tgz", "resolved": "https://registry.npmjs.org/@textlint/types/-/types-14.8.4.tgz",
"integrity": "sha512-8ncGYcEoKLE3JP2s9+2IlxMbMLWpNmvptOZmF3qI188vW3g/a00r3hBRNMcKxJg3phYDtgLOyXdv44/jwJxsLw==", "integrity": "sha512-9nyY8vVXlr8hHKxa6+37omJhXWCwovMQcgMteuldYd4dOxGm14AK2nXdkgtKEUQnzLGaXy46xwLCfhQy7V7/YA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@textlint/ast-node-types": "^14.8.1" "@textlint/ast-node-types": "14.8.4"
} }
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
@ -648,17 +648,17 @@
} }
}, },
"node_modules/@vscode/vsce": { "node_modules/@vscode/vsce": {
"version": "3.5.0", "version": "3.6.0",
"resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.5.0.tgz", "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.6.0.tgz",
"integrity": "sha512-2Eb6fBh8OzNhWqviCjeUPA1MW+d2GCb1QlVxrpOR8lrLHGk8x7HD4LbfELnZPyOz2X33Myz9FE9t4LwYbmeMRg==", "integrity": "sha512-u2ZoMfymRNJb14aHNawnXJtXHLXDVKc1oKZaH4VELKT/9iWKRVgtQOdwxCgtwSxJoqYvuK4hGlBWQJ05wxADhg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@azure/identity": "^4.1.0", "@azure/identity": "^4.1.0",
"@secretlint/node": "^9.3.4", "@secretlint/node": "^10.1.1",
"@secretlint/secretlint-formatter-sarif": "^9.3.4", "@secretlint/secretlint-formatter-sarif": "^10.1.1",
"@secretlint/secretlint-rule-no-dotenv": "^9.3.4", "@secretlint/secretlint-rule-no-dotenv": "^10.1.1",
"@secretlint/secretlint-rule-preset-recommend": "^9.3.4", "@secretlint/secretlint-rule-preset-recommend": "^10.1.1",
"@vscode/vsce-sign": "^2.0.0", "@vscode/vsce-sign": "^2.0.0",
"azure-devops-node-api": "^12.5.0", "azure-devops-node-api": "^12.5.0",
"chalk": "^4.1.2", "chalk": "^4.1.2",
@ -675,7 +675,7 @@
"minimatch": "^3.0.3", "minimatch": "^3.0.3",
"parse-semver": "^1.1.1", "parse-semver": "^1.1.1",
"read": "^1.0.7", "read": "^1.0.7",
"secretlint": "^9.3.4", "secretlint": "^10.1.1",
"semver": "^7.5.2", "semver": "^7.5.2",
"tmp": "^0.2.3", "tmp": "^0.2.3",
"typed-rest-client": "^1.8.4", "typed-rest-client": "^1.8.4",
@ -849,20 +849,6 @@
"node": ">= 14" "node": ">= 14"
} }
}, },
"node_modules/aggregate-error": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
"integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
"dev": true,
"license": "MIT",
"dependencies": {
"clean-stack": "^2.0.0",
"indent-string": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/ajv": { "node_modules/ajv": {
"version": "8.17.1", "version": "8.17.1",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
@ -1227,16 +1213,6 @@
"license": "ISC", "license": "ISC",
"optional": true "optional": true
}, },
"node_modules/clean-stack": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
"integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/cockatiel": { "node_modules/cockatiel": {
"version": "3.2.1", "version": "3.2.1",
"resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.2.1.tgz", "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.2.1.tgz",
@ -2141,16 +2117,6 @@
"node": ">= 4" "node": ">= 4"
} }
}, },
"node_modules/indent-string": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/inherits": { "node_modules/inherits": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
@ -2853,16 +2819,13 @@
} }
}, },
"node_modules/p-map": { "node_modules/p-map": {
"version": "4.0.0", "version": "7.0.3",
"resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz",
"integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": {
"aggregate-error": "^3.0.0"
},
"engines": { "engines": {
"node": ">=10" "node": ">=18"
}, },
"funding": { "funding": {
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
@ -3363,16 +3326,16 @@
"license": "ISC" "license": "ISC"
}, },
"node_modules/secretlint": { "node_modules/secretlint": {
"version": "9.3.4", "version": "10.1.1",
"resolved": "https://registry.npmjs.org/secretlint/-/secretlint-9.3.4.tgz", "resolved": "https://registry.npmjs.org/secretlint/-/secretlint-10.1.1.tgz",
"integrity": "sha512-iNOzgMX/+W1SQNW/TW6eikGChyaPiazr2AEXjzjpoB0R6QJEulvlwhn0KLT1/xjPfdYrk3yiXZM40csUqET8uQ==", "integrity": "sha512-q50i+I9w6HH8P6o34LVq6M3hm5GZn2Eq5lYGHkEByOAbVqBHn8gsMGgyxjP1xSrSv1QjDtjxs/zKPm6JtkNzGw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@secretlint/config-creator": "^9.3.4", "@secretlint/config-creator": "^10.1.1",
"@secretlint/formatter": "^9.3.4", "@secretlint/formatter": "^10.1.1",
"@secretlint/node": "^9.3.4", "@secretlint/node": "^10.1.1",
"@secretlint/profiler": "^9.3.4", "@secretlint/profiler": "^10.1.1",
"debug": "^4.4.1", "debug": "^4.4.1",
"globby": "^14.1.0", "globby": "^14.1.0",
"read-pkg": "^8.1.0" "read-pkg": "^8.1.0"
@ -3381,7 +3344,7 @@
"secretlint": "bin/secretlint.js" "secretlint": "bin/secretlint.js"
}, },
"engines": { "engines": {
"node": "^14.13.1 || >=16.0.0" "node": ">=20.0.0"
} }
}, },
"node_modules/semver": { "node_modules/semver": {

View File

@ -1,8 +1,8 @@
{ {
"name": "tsl-devkit", "name": "tsl-tools",
"displayName": "TSL", "displayName": "TSL",
"version": "2.2.0", "version": "2.3.0",
"description": "TSL syntax highlighter support for VSCode.", "description": "VSCode extension for TSL, with syntax highlighting, code completion, and formatting",
"publisher": "csh", "publisher": "csh",
"homepage": "https://git.mytsl.cn/csh/tsl-devkit", "homepage": "https://git.mytsl.cn/csh/tsl-devkit",
"author": { "author": {
@ -46,6 +46,33 @@
"path": "./syntaxes/tsl.tmLanguage.json" "path": "./syntaxes/tsl.tmLanguage.json"
} }
], ],
"configuration": {
"type": "object",
"title": "TSL",
"properties": {
"tsl.server.executable": {
"type": "string",
"default": "",
"description": "Path to tsl-server executable (leave empty for auto-detection)"
},
"tsl.server.arguments": {
"type": "array",
"default": [
"--log=info",
"--log-stderr"
],
"description": "Arguments for TSL server",
"items": {
"type": "string"
}
},
"tsl.interpreter.executable": {
"type": "string",
"default": "",
"description": "Path to TSL interpreter executable (leave empty for auto-detection)"
}
}
},
"commands": [ "commands": [
{ {
"command": "extension.start", "command": "extension.start",
@ -59,11 +86,11 @@
"watch": "tsc -watch -p ." "watch": "tsc -watch -p ."
}, },
"devDependencies": { "devDependencies": {
"@vscode/vsce": "^3.5.0",
"typescript": "^5.8.3",
"@types/node": "^24.0.3", "@types/node": "^24.0.3",
"@types/vscode": "^1.101.0", "@types/vscode": "^1.101.0",
"prettier": "^3.5.3" "@vscode/vsce": "^3.6.0",
"prettier": "^3.5.3",
"typescript": "^5.8.3"
}, },
"engines": { "engines": {
"vscode": "^1.101.0" "vscode": "^1.101.0"

View File

@ -20,17 +20,26 @@ function findSystemTslServer(): string | null {
} }
export function activate(context: vscode.ExtensionContext) { export function activate(context: vscode.ExtensionContext) {
// server配置项
const config = vscode.workspace.getConfiguration('tsl')
const customExecutable = config.get<string>('server.executable', '')
const serverArguments = config.get<string[]>('server.arguments')
let serverExe: string | null = null
if (customExecutable) {
serverExe = customExecutable
} else {
const bundledPath = context.asAbsolutePath( const bundledPath = context.asAbsolutePath(
path.join('bin', process.platform === 'win32' ? 'tsl-server.exe' : 'tsl-server') path.join('bin', process.platform === 'win32' ? 'tsl-server.exe' : 'tsl-server')
) )
// 查找路径优先级:插件目录 -> 系统 PATH // 查找路径优先级:插件目录 -> 系统 PATH
let serverExe: string | null = null
if (fs.existsSync(bundledPath)) { if (fs.existsSync(bundledPath)) {
serverExe = bundledPath serverExe = bundledPath
} else { } else {
serverExe = findSystemTslServer() serverExe = findSystemTslServer()
} }
}
if (!serverExe) { if (!serverExe) {
vscode.window.showErrorMessage( vscode.window.showErrorMessage(
@ -41,7 +50,13 @@ export function activate(context: vscode.ExtensionContext) {
const serverOptions: ServerOptions = { const serverOptions: ServerOptions = {
run: {command: serverExe, transport: TransportKind.stdio, args: ['--log=trace', '--log-stderr']}, run: {command: serverExe, transport: TransportKind.stdio, args: ['--log=trace', '--log-stderr']},
debug: {command: serverExe, transport: TransportKind.stdio} debug: {command: serverExe, transport: TransportKind.stdio, args: ['--log=trace', '--log-stderr']}
}
const clientOptions: LanguageClientOptions = {
documentSelector: [{scheme: 'file', language: 'tsl'}],
synchronize: {
fileEvents: vscode.workspace.createFileSystemWatcher('**/*.tsl')
} }
const clientOptions: LanguageClientOptions = { const clientOptions: LanguageClientOptions = {
@ -59,6 +74,7 @@ export function activate(context: vscode.ExtensionContext) {
) )
client.start() client.start()
}
} }
export function deactivate(): Thenable<void> | undefined { export function deactivate(): Thenable<void> | undefined {

View File

@ -431,7 +431,7 @@
"patterns": [ "patterns": [
{ {
"name": "keyword.control.program-structure.tsl", "name": "keyword.control.program-structure.tsl",
"match": "(?i)\\b(program|function|procedure|unit|uses|implementation|interface|initalization|finalization)\\b" "match": "(?i)\\b(program|function|procedure|unit|uses|implementation|interface|initialization|finalization)\\b"
}, },
{ {
"name": "keyword.control.interface.tsl", "name": "keyword.control.interface.tsl",

Binary file not shown.