From 40634c2fda5bc53a205722983d85f961be870dc1 Mon Sep 17 00:00:00 2001 From: csh Date: Sat, 14 Jun 2025 15:36:19 +0800 Subject: [PATCH] first commit --- .gitignore | 1 + README.md | 32 ++ test.tsl | 35 ++ vim/tsl.vim | 184 ++++++++ vscode/tsl-syntax/README.md | 12 + vscode/tsl-syntax/images/ts.png | Bin 0 -> 2306 bytes vscode/tsl-syntax/language-configuration.json | 36 ++ vscode/tsl-syntax/package-lock.json | 40 ++ vscode/tsl-syntax/package.json | 51 ++ .../tsl-syntax/syntaxes/tsl.tmLanguage.json | 438 ++++++++++++++++++ vscode/tsl-syntax/tsl-syntax-1.0.0.vsix | Bin 0 -> 7034 bytes 11 files changed, 829 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 test.tsl create mode 100644 vim/tsl.vim create mode 100644 vscode/tsl-syntax/README.md create mode 100644 vscode/tsl-syntax/images/ts.png create mode 100644 vscode/tsl-syntax/language-configuration.json create mode 100644 vscode/tsl-syntax/package-lock.json create mode 100644 vscode/tsl-syntax/package.json create mode 100644 vscode/tsl-syntax/syntaxes/tsl.tmLanguage.json create mode 100644 vscode/tsl-syntax/tsl-syntax-1.0.0.vsix diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fa36576 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +vscode/tsl-syntax/node_modules \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..570d032 --- /dev/null +++ b/README.md @@ -0,0 +1,32 @@ +# TSL Syntax + +该插件提供 tsl 语言的语法高亮 + +## VSCode + +### 安装方式一 + +复制[tsl-syntax](./vscode/tsl-syntax/)文件夹到`VSCode`扩展目录 + +```txt +Windows: %USERPROFILE%\.vscode\extensions +macOS: ~/.vscode/extensions +Linux: ~/.vscode/extensions +``` + +### 安装方式二 + +安装[vsix](./vscode/tsl-syntax/tsl-syntax-1.0.0.vsix)扩展 + +```txt +code --install-extension tsl-syntax-1.0.0.vsix +``` + +## Vim + +将[tsl.vim](./vim/tsl.vim)放入`~/.vim/syntax/` + +```vim +" 你的vimrc加入,可同时支持tsl和tsf +autocmd BufNewFile,BufRead *.ts[lf] setf tsl +``` diff --git a/test.tsl b/test.tsl new file mode 100644 index 0000000..1015dec --- /dev/null +++ b/test.tsl @@ -0,0 +1,35 @@ +type MyClass = class +type UserType = class +end; + +MyClass.init() +UserType.getName(): string; +function MyClass.setValue(val: integer = 123; a: stringa): AA; +begin +end + +function Mycalss.Init(); +begin +end; + +obj.name; +user.profile.email; +data.items.count; +data.Func(a: abc; b: 2); + +function f(); // 无参数 +begin + {self.}abc; +end; +function f(a, b); // 参数无类型 +begin +end; +function f(a: real; b: DD); // 参数有类型 +function f(a: real; b): def; // 带返回类型 +begin +end; +a ? b : c; + +f(); +f(a, b); +f(a: 1; b: 's'); diff --git a/vim/tsl.vim b/vim/tsl.vim new file mode 100644 index 0000000..7737fdb --- /dev/null +++ b/vim/tsl.vim @@ -0,0 +1,184 @@ +vim9script + +# Vim9 syntax file for TSL language +if exists("b:current_syntax") + finish +endif + +var cpo_save = &cpo +set cpo&vim + +syn case ignore + +# Keywords +syn keyword tslHeader program function procedure nextgroup=tslFuncName skipwhite +syn keyword tslBuiltinVar paramcount realparamcount params +syn keyword tslBuiltinVar system thisfunction tslassigning +syn keyword tslBuiltinVar likeeps likeepsrate + +syn keyword tslConditional else if +syn keyword tslStatement begin end then +syn keyword tslStatement this with exit +syn keyword tslStatement weakref autoref namespace +syn keyword tslInterface unit uses implementation interface initalization finalization +syn keyword tslRepeat for while do downto step until repeat to +syn keyword tslBranch break continue +syn keyword tslReturn return debugreturn debugrunenv debugrunenvdo +syn keyword tslLabel case of goto label + +syn keyword tslOperator write read +syn keyword tslOperator union minus union2 +syn keyword tslShiftOperator ror rol shr shl +syn keyword tslLogicOperator and in is not or +syn keyword tslArithmOperator div mod + +syn keyword tslException except raise try finally exceptobject +syn keyword tslBoolean false true +syn keyword tslNil nil + +syn keyword tslType string integer boolean int64 real +syn keyword tslBuiltins echo mtic mtoc this +syn keyword tslBuiltins inf nan +syn keyword tslBuiltins external const out var + +syn keyword tslSql select vselect sselect update delete mselect set +syn keyword tslSqlOperator sqlin from where group by like order + +syn keyword tslOther setuid sudo +syn keyword tslCallFunc cdecl pascal stdcall safecall fastcall register +syn keyword tslScope global static +syn keyword tslClass type class fakeclass new +syn keyword tslClassModifier override overload virtual property self inherited +syn keyword tslConstruct create destroy operator +syn keyword tslAccess public protected private published +syn keyword tslTodo FIXME NOTE NOTES TODO XXX contained + +# Function definitions +syn match tslFuncName '\%(\h\w*\.\)\?\h\w*' contained nextgroup=tslFuncParams skipwhite contains=tslTypeNameInFunc,tslDotInFunc,tslFuncNamePart +syn match tslTypeNameInFunc '\h\w*\ze\.\h\w*' contained +syn match tslDotInFunc '\.' contained +syn match tslFuncName '\.\@<=\h\w*' contained + +syn region tslFuncParams + \ start='(' + \ end=')' + \ contained + \ contains=tslParam,tslParamType,tslParamSep + \ nextgroup=tslReturnType skipwhite + +syn match tslParam '\h\w*' contained nextgroup=tslParamType skipnl skipwhite +syn match tslParamType ':\s*\h\w*' contained contains=tslColon,tslTypeName +syn match tslReturnType ':\s*\h\w*' contained contains=tslColon,tslTypeName +syn match tslTypeName '\h\w*' contained +syn match tslParamSep '[;,]' contained +syn match tslColon ':' contained + +# 匹配完整的属性链 +syn match tslPropertyChain '\h\w*\%(\.\h\w*\)\+' contains=tslObjectName,tslPropertyDot,tslPropertyName +syn match tslObjectName '\h\w*\ze\.\h\w*' contained +syn match tslPropertyDot '\.' contained +syn match tslPropertyName '\.\@<=\h\w*\%(\ze\.\|\ze\s*[^(]\|\ze\s*$\)' contained + +# Function calls +syn match tslFuncCallName '\%(\<\%(function\|procedure\)\s\+\%(\h\w*\.\)\?\)\@=!&|^~%]' +syn match tslOperator ':=' +syn match tslDelimiter '[()[\]{},;:.@?]' + +# Comments +syn match tslComment '//.*$' contains=tslTodo,@Spell +syn region tslComment start='(\*' end='\*)' contains=tslTodo,@Spell keepend +syn region tslComment start='{' end='}' contains=tslTodo,@Spell keepend + +# Strings +syn region tslString start=+[uU]\=\z(['"]\)+ end='\z1' skip='\\\\\|\\\z1' +syn region tslRawString start=+[uU]\=[rR]\z(['"]\)+ end='\z1' skip='\\\\\|\\\z1' + +# Numbers +syn match tslNumber '\<0[oO]\=\o\+[Ll]\=\>' +syn match tslNumber '\<0[xX]\x\+[Ll]\=\>' +syn match tslNumber '\<0[bB][01]\+[Ll]\=\>' +syn match tslNumber '\<\%([1-9]\d*\|0\)[Ll]\=\>' +syn match tslNumber '\<\d\+[jJ]\>' +syn match tslNumber '\<\d\+[eE][+-]\=\d\+[jJ]\=\>' +syn match tslNumber '\<\d\+\.\%([eE][+-]\=\d\+\)\=[jJ]\=\%(\W\|$\)\@=' +syn match tslNumber '\%(^\|\W\)\zs\d*\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>' + +# Highlight links +hi def link tslClassName Type +hi def link tslDot Operator +hi def link tslPropertyName Special + +hi def link tslHeader Statement +hi def link tslFuncName Function +hi def link tslTypeNameInFunc Type +hi def link tslParam Identifier +hi def link tslParamType Type +hi def link tslReturnType Type +hi def link tslTypeName Type +hi def link tslParamSep Delimiter +hi def link tslColon Delimiter + +hi def link tslFuncCallName Function +hi def link tslCallParam Identifier +hi def link tslCallValue Type +hi def link tslCallSep Delimiter + +hi def link tslBuiltinVar Constant +hi def link tslConditional Conditional +hi def link tslStatement Statement +hi def link tslInterface Statement +hi def link tslRepeat Repeat +hi def link tslBranch Conditional +hi def link tslReturn Statement +hi def link tslLabel Label +hi def link tslOperator Operator +hi def link tslDelimiter Delimiter +hi def link tslException Exception +hi def link tslBoolean Boolean +hi def link tslNil Constant +hi def link tslBuiltins Constant +hi def link tslShiftOperator Operator +hi def link tslLogicOperator Operator +hi def link tslArithmOperator Operator +hi def link tslSql Keyword +hi def link tslSqlOperator Special +hi def link tslOther Special +hi def link tslScope StorageClass +hi def link tslClass Statement +hi def link tslClassModifier Identifier +hi def link tslConstruct Special +hi def link tslAccess Statement +hi def link tslTodo Todo +hi def link tslComment Comment +hi def link tslString String +hi def link tslRawString String +hi def link tslQuotes String +hi def link tslNumber Number + +b:current_syntax = "tsl" + +&cpo = cpo_save diff --git a/vscode/tsl-syntax/README.md b/vscode/tsl-syntax/README.md new file mode 100644 index 0000000..f4e1c95 --- /dev/null +++ b/vscode/tsl-syntax/README.md @@ -0,0 +1,12 @@ +# TSL Syntax + +`VSCode` 的 `ts[lf]`语法插件 + +## 编译&安装 + +```bash +npm install +vsce package + +code --install-extension tsl-syntax-1.0.0.vsix +``` diff --git a/vscode/tsl-syntax/images/ts.png b/vscode/tsl-syntax/images/ts.png new file mode 100644 index 0000000000000000000000000000000000000000..bda5035a0f73dbadc4fa94eab3b10014f3bcfde1 GIT binary patch literal 2306 zcmV+d3H|noP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2$xAjK~!i%?U-9^ zRMi^Ce`{Z6rZ?!#VzGb*Bv4ws5e$kqh!2v83M!xvCK!VWCWgc)CMG^;BKkm#55z=$ zFepkQ(L^Ie11h)3r5EVw%aE;E^8?f5&pp#=|B9_m=ZYInG!hJnG!hJnG!hJnG!hJQ5n~wBA^t}rY5d_{yF(i zK1u$vW$9K~5%1`rZ|6=>io&&Pi7Z%<{J(6;SfFT)G7MT*t)gJ>Uiua;q;Tz8l-6L3 zE(j4pTz5=cltQK0AOa$Y))Mz%Fs`0WRPKz7hjsmW8q`7Mwgu&Z0&C=Qk*V9vPwe?z@q* zXNhS|jtEX!83oIi6Rxbp%*{na(1U|q{^%o=;~<8Cr8TO&oZLI_L_80P$8oy5iFI^f z4G!Wc1-6ahI7nU|)opE9H{Fyzg3OWe;&~z>a_QZ7r3s`Kq&_!SF1`J>#4cV;x0a!r z8mTu7sWA+xv2AGq>DjhzjExtIN$mW2>E6Cw8p_M19;6QB)T~+Jjf{-3&6e>C6p>ha zyVOmeE{!0KbLYy?i4)0ZT5HjcBRU!t?Ksl8Ws9_e)PzEEQYoo13>mJeNf?iI8Zgw* zAg9a9q)91hTDtVQHrbGo_g;GE9SZvU@ou?=x%>8!yJQJ?9wLHL3T0WSa2O1OYX=V! zR|-V1MF`KIPh|08zoS&25_&QPMO~!C(^Z96NJ{;nSyy1_2^RDGFAuL|K*}6;n|POcO*fb8|5w5kj+P`~9Wc zX2H0F%;3R;MCN=qqu{`u=hH}O1_Y4XR89rSMA%&=vF2qDj-V$U9m)~xy4ugl(=lWB59Ykxy zbrH`?e>93xc>Vnh{Pr6o!Mx=tMgINwW0jUBmoTaQxvuZW!4<82zYL0ii85}1$}s#O zVw&lXAjMw>j~v1H^G`g(@CySGrmbA*8)==iOZI13z8?oy48yN@l=?3h$c7uYL<8Tt z@Y-vPY~RkHZ6onG%CcBkTT4!Lwf}~K2^y}cp?}{#;+>tKHC9Op`OB7(zhVVuK><#0 zFW%+LL@Fz<>+j>`#t97GV)H%sAg4|dvn*`a#jLKTvaZe_pi&H-K26W7uM$0bmdKJN zgyzgag~Pa)FEe!XC~i*=`42yg*W66x(MOrRV@EQ0Wkp(E%nBVO<>AIgIcZsPGDz^P zN=fIIElIm;$Bs!$L4llIwMydM-6=izc+sfzy!W0ofSd<8w{D$CO8?m~ZXf(x68^V; zKY6YTmW8-3BO**&vBEcT9NIT-#EC?h`@;`@GEWIK;&~Y1Ff+DpW#;bPM1lB)3joPH zn+-QcV360Y{ql=n(HI7%*67kw^6$G3fM`PlR%0VM4?W~BR}n}FG>IiBu1oQ=&k}m> zIid{>zTZxO8zN9Cg?IHT1BVWcNe=}NK8RUd3_z@-1Jf|@`h!iB)??B}62kxyX1@6* zSQc(?Z@NWBOk7~FJg*%-jB({kGCk2kgFR&8I&}QFG*whc z8%Q(Asq%7Z-?T{ve*Rf>JU-f=)}x;ZGBJU{07e=bq$ZIbY+G8Dk_&IV;oBrc2DZ`j z=cQ}&W~nbKk~2X%s0C@Nu9k~$y(Pm94Wr!$Z70Hn1Zvk65s}Luekjf0=Rm`ddXWB~ ze)4Tn2ATRj*3lu|+qOybU3W=6NE^r*klIK@+Sad^k=E9r(Zt^3!~_O^e&+GVrCBMd z35BE%q`tgd+`+-Iw!vhG)?-CGj`Z){EA215AoV3B(i{kFnmJRh9X=d1$zJ4y1d52b zy}eRbTr9Og_0po0v~AenKm5CaX+0`BAlB6-J@3CSr%FoX-@!y(uj0vs?4xL+dO36m zv#$?rn#uH#|Hva_Y{Yfx-MJHQU|_VpQls@{u*(QlR50W9*O~j>cf?CdDCq9yuU)%F z+hjr30#nmNBr#amB^rs0=D)TU;paaQbUaSp^5qn6+(^D* z5NmHAYnvgN2@FoF6ZuLz4g>r5Ga`Zts+UN0HKAFv#%zvNIE-CZ#+5I>^vkq#feC^# zPdtyDswxC9^7GTJG9oj9iIX$aM42YBbLWV+wBRU(h+qT78#bV9dvr4!5Sl%k*wEOg35C3f!;R5i*piFI}1YE9k)4~!W?rew4qj5akfbmRys97YU-!2<^v+_@7c zSc-<$OkcN-oXScJ$3c~qans8$`{y+4*TXm8FkDf=ZM%1qckjLF-6x54b#bn`8e`ES z792d7+~sFOMgq^RSwqpc-|`n=0vd<|D)?w1FZezkxUzmdw|(^$039#A1fPCNuWf^A zQn-3Gg-<*|?j3hv6c!?mL%g$-pc<~r&!5li-Mg`8%t)TQX2ZAziq>4*x)r%} z2_1>}K_xgxF+w4KS=u%#62XW>P{6d+tBK5;2SCpUAK=14.17" + } + } + } +} diff --git a/vscode/tsl-syntax/package.json b/vscode/tsl-syntax/package.json new file mode 100644 index 0000000..7a9e7db --- /dev/null +++ b/vscode/tsl-syntax/package.json @@ -0,0 +1,51 @@ +{ + "name": "tsl-syntax", + "displayName": "TSL Syntax", + "description": "Syntax highlighting for tsl/tsf files", + "version": "1.0.0", + "publisher": "csh", + "homepage": "https://git.mytsl.cn/csh/tsl-syntax", + "repository": { + "type": "git", + "url": "https://git.mytsl.cn/csh/tsl-syntax" + }, + "bugs": { + "url": "https://git.mytsl.cn/csh/tsl-syntax/issues" + }, + "icon": "images/ts.png", + "categories": [ + "Programming Languages" + ], + "contributes": { + "languages": [ + { + "id": "tsl", + "aliases": [ + "TSL", + "tsl" + ], + "extensions": [ + ".tsl", + ".tsf" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "tsl", + "scopeName": "source.tsl", + "path": "./syntaxes/tsl.tmLanguage.json" + } + ] + }, + "scripts": {}, + "devDependencies": { + "@types/vscode": "^1.101.0", + "@vscode/vsce": "^3.5.0", + "typescript": "^5.8.3" + }, + "engines": { + "vscode": "^1.101.0" + } +} \ No newline at end of file diff --git a/vscode/tsl-syntax/syntaxes/tsl.tmLanguage.json b/vscode/tsl-syntax/syntaxes/tsl.tmLanguage.json new file mode 100644 index 0000000..70c260d --- /dev/null +++ b/vscode/tsl-syntax/syntaxes/tsl.tmLanguage.json @@ -0,0 +1,438 @@ +{ + "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", + "name": "TSL", + "scopeName": "source.tsl", + "patterns": [ + { + "include": "#comments" + }, + { + "include": "#strings" + }, + { + "include": "#numbers" + }, + { + "include": "#keywords" + }, + { + "include": "#functions" + }, + { + "include": "#function-calls" + }, + { + "include": "#property-chains" + }, + { + "include": "#operators" + }, + { + "include": "#types" + }, + { + "include": "#builtins" + }, + { + "include": "#identifiers" + } + ], + "repository": { + "comments": { + "patterns": [ + { + "name": "comment.line.double-slash.tsl", + "match": "//.*$", + "captures": { + "0": { + "patterns": [ + { + "include": "#comment-todo" + } + ] + } + } + }, + { + "name": "comment.block.pascal.tsl", + "begin": "\\(\\*", + "end": "\\*\\)", + "patterns": [ + { + "include": "#comment-todo" + } + ] + }, + { + "name": "comment.block.curly.tsl", + "begin": "\\{", + "end": "\\}", + "patterns": [ + { + "include": "#comment-todo" + } + ] + } + ] + }, + "comment-todo": { + "patterns": [ + { + "name": "keyword.other.todo.tsl", + "match": "\\b(FIXME|NOTE|NOTES|TODO|XXX)\\b" + } + ] + }, + "strings": { + "patterns": [ + { + "name": "string.quoted.double.tsl", + "begin": "\"", + "end": "\"", + "patterns": [ + { + "name": "constant.character.escape.tsl", + "match": "\\\\." + } + ] + }, + { + "name": "string.quoted.single.tsl", + "begin": "'", + "end": "'", + "patterns": [ + { + "name": "constant.character.escape.tsl", + "match": "\\\\." + } + ] + } + ] + }, + "numbers": { + "patterns": [ + { + "name": "constant.numeric.hex.tsl", + "match": "\\b0[xX][0-9a-fA-F]+[Ll]?\\b" + }, + { + "name": "constant.numeric.octal.tsl", + "match": "\\b0[oO]?[0-7]+[Ll]?\\b" + }, + { + "name": "constant.numeric.binary.tsl", + "match": "\\b0[bB][01]+[Ll]?\\b" + }, + { + "name": "constant.numeric.float.tsl", + "match": "\\b\\d+\\.\\d*([eE][+-]?\\d+)?[jJ]?\\b" + }, + { + "name": "constant.numeric.float.tsl", + "match": "\\b\\d*\\.\\d+([eE][+-]?\\d+)?[jJ]?\\b" + }, + { + "name": "constant.numeric.scientific.tsl", + "match": "\\b\\d+[eE][+-]?\\d+[jJ]?\\b" + }, + { + "name": "constant.numeric.integer.tsl", + "match": "\\b([1-9]\\d*|0)[Ll]?\\b" + }, + { + "name": "constant.numeric.complex.tsl", + "match": "\\b\\d+[jJ]\\b" + } + ] + }, + "keywords": { + "patterns": [ + { + "name": "keyword.control.conditional.tsl", + "match": "\\b(if|else|case|of)\\b" + }, + { + "name": "keyword.control.repeat.tsl", + "match": "\\b(for|while|do|downto|step|until|repeat|to)\\b" + }, + { + "name": "keyword.control.flow.tsl", + "match": "\\b(break|continue|exit|return|debugreturn|debugrunenv|debugrunenvdo)\\b" + }, + { + "name": "keyword.control.exception.tsl", + "match": "\\b(try|except|finally|raise|exceptobject)\\b" + }, + { + "name": "keyword.other.unit.tsl", + "match": "\\b(unit|uses|implementation|interface|initalization|finalization)\\b" + }, + { + "name": "storage.type.class.tsl", + "match": "\\b(class|type|fakeclass|new)\\b" + }, + { + "name": "storage.modifier.access.tsl", + "match": "\\b(public|protected|private|published)\\b" + }, + { + "name": "storage.modifier.tsl", + "match": "\\b(global|static|external|const|out|var)\\b" + }, + { + "name": "keyword.other.tsl", + "match": "\\b(begin|end|then|this|with|weakref|autoref|namespace|goto|label)\\b" + }, + { + "name": "keyword.other.calling-convention.tsl", + "match": "\\b(cdecl|pascal|stdcall|safecall|fastcall|register)\\b" + }, + { + "name": "keyword.other.class-modifier.tsl", + "match": "\\b(override|overload|virtual|property|self|inherited)\\b" + }, + { + "name": "keyword.other.construct.tsl", + "match": "\\b(create|destroy|operator)\\b" + }, + { + "name": "keyword.other.special.tsl", + "match": "\\b(setuid|sudo)\\b" + } + ] + }, + "functions": { + "patterns": [ + { + "name": "meta.function.tsl", + "begin": "\\b(program|function|procedure)\\s+", + "beginCaptures": { + "1": { + "name": "storage.type.function.tsl" + } + }, + "end": "(?=;|\\n|\\{|begin)", + "patterns": [ + { + "name": "entity.name.function.tsl", + "match": "\\b[a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*\\b" + }, + { + "include": "#function-parameters" + } + ] + } + ] + }, + "function-parameters": { + "patterns": [ + { + "name": "meta.function.parameters.tsl", + "begin": "\\(", + "end": "\\)", + "patterns": [ + { + "name": "variable.parameter.tsl", + "match": "\\b[a-zA-Z_][a-zA-Z0-9_]*\\b" + }, + { + "name": "punctuation.separator.parameter.tsl", + "match": "[;,]" + }, + { + "name": "punctuation.separator.type.tsl", + "match": ":" + }, + { + "include": "#types" + } + ] + } + ] + }, + "function-calls": { + "patterns": [ + { + "name": "meta.function-call.method.tsl", + "begin": "\\b([a-zA-Z_][a-zA-Z0-9_]*)(\\.)([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\(", + "beginCaptures": { + "1": { + "name": "variable.other.object.tsl" + }, + "2": { + "name": "punctuation.accessor.tsl" + }, + "3": { + "name": "entity.name.function.call.method.tsl" + } + }, + "end": "\\)", + "patterns": [ + { + "include": "#function-call-parameters" + } + ] + }, + { + "name": "meta.function-call.tsl", + "begin": "\\b([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\(", + "beginCaptures": { + "1": { + "name": "entity.name.function.call.tsl" + } + }, + "end": "\\)", + "patterns": [ + { + "include": "#function-call-parameters" + } + ] + } + ] + }, + "function-call-parameters": { + "patterns": [ + { + "name": "variable.parameter.named.tsl", + "match": "\\b[a-zA-Z_][a-zA-Z0-9_]*(?=\\s*:)" + }, + { + "name": "punctuation.separator.parameter.tsl", + "match": "[;,]" + }, + { + "name": "punctuation.separator.type.tsl", + "match": ":" + }, + { + "include": "#strings" + }, + { + "include": "#numbers" + }, + { + "include": "#identifiers" + } + ] + }, + "property-chains": { + "patterns": [ + { + "name": "meta.property-access.chained.tsl", + "match": "\\b([a-zA-Z_][a-zA-Z0-9_]*)((?:\\.[a-zA-Z_][a-zA-Z0-9_]*)+)(?!\\s*\\()", + "captures": { + "1": { + "name": "variable.other.object.tsl" + }, + "2": { + "patterns": [ + { + "match": "(\\.)([a-zA-Z_][a-zA-Z0-9_]*)", + "captures": { + "1": { + "name": "punctuation.accessor.tsl" + }, + "2": { + "name": "variable.other.property.tsl" + } + } + } + ] + } + } + }, + { + "name": "meta.property-access.simple.tsl", + "match": "\\b([a-zA-Z_][a-zA-Z0-9_]*)(\\.)([a-zA-Z_][a-zA-Z0-9_]*)(?!\\s*\\()", + "captures": { + "1": { + "name": "variable.other.object.tsl" + }, + "2": { + "name": "punctuation.accessor.tsl" + }, + "3": { + "name": "variable.other.property.tsl" + } + } + } + ] + }, + "operators": { + "patterns": [ + { + "name": "keyword.operator.assignment.tsl", + "match": ":=" + }, + { + "name": "keyword.operator.arithmetic.tsl", + "match": "[+\\-*/<>=]|\\b(div|mod)\\b" + }, + { + "name": "keyword.operator.logical.tsl", + "match": "\\b(and|or|not|in|is)\\b" + }, + { + "name": "keyword.operator.bitwise.tsl", + "match": "\\b(ror|rol|shr|shl)\\b" + }, + { + "name": "keyword.operator.io.tsl", + "match": "\\b(write|read)\\b" + }, + { + "name": "keyword.operator.set.tsl", + "match": "\\b(union|minus|union2)\\b" + }, + { + "name": "keyword.operator.other.tsl", + "match": "[!&|^~%]" + }, + { + "name": "punctuation.separator.tsl", + "match": "[()\\[\\]{},;:.@?]" + } + ] + }, + "types": { + "patterns": [ + { + "name": "storage.type.primitive.tsl", + "match": "\\b(string|integer|boolean|int64|real)\\b" + } + ] + }, + "builtins": { + "patterns": [ + { + "name": "constant.language.boolean.tsl", + "match": "\\b(true|false)\\b" + }, + { + "name": "constant.language.null.tsl", + "match": "\\bnil\\b" + }, + { + "name": "support.variable.builtin.tsl", + "match": "\\b(paramcount|realparamcount|params|system|thisfunction|tslassigning|likeeps|likeepsrate)\\b" + }, + { + "name": "support.function.builtin.tsl", + "match": "\\b(echo|mtic|mtoc|this|inf|nan)\\b" + }, + { + "name": "keyword.other.sql.tsl", + "match": "\\b(select|vselect|sselect|update|delete|mselect|set|sqlin|from|where|group|by|like|order)\\b" + } + ] + }, + "identifiers": { + "patterns": [ + { + "name": "variable.other.tsl", + "match": "\\b[a-zA-Z_][a-zA-Z0-9_]*\\b" + } + ] + } + } +} \ No newline at end of file diff --git a/vscode/tsl-syntax/tsl-syntax-1.0.0.vsix b/vscode/tsl-syntax/tsl-syntax-1.0.0.vsix new file mode 100644 index 0000000000000000000000000000000000000000..da045dc99fd106de179428d6e3e64cdd2cc1b5a9 GIT binary patch literal 7034 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