Merge pull request 'tcl_language_support' (#9) from tcl_language_support into main
/ build_and_publish (push) Failing after 5s
/ build_and_publish (push) Failing after 5s
Reviewed-on: #9
This commit was merged in pull request #9.
This commit is contained in:
@@ -17,7 +17,11 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
- name: Install NPM Packages
|
- name: Install NPM Packages
|
||||||
run: npm i
|
run: |
|
||||||
|
npm i /
|
||||||
|
cd ./client
|
||||||
|
npm i
|
||||||
|
cd ..
|
||||||
- name: Install VSCE
|
- name: Install VSCE
|
||||||
run: npm -g i @vscode/vsce
|
run: npm -g i @vscode/vsce
|
||||||
- name: Build Package Files
|
- name: Build Package Files
|
||||||
|
|||||||
@@ -1,81 +0,0 @@
|
|||||||
# tokens.py
|
|
||||||
from typing import List
|
|
||||||
import attrs
|
|
||||||
import enum
|
|
||||||
from lark import Tree, Token
|
|
||||||
|
|
||||||
# Legend must match the client
|
|
||||||
SEMANTIC_TOKEN_TYPES = {
|
|
||||||
"keyword": 0,
|
|
||||||
"variable": 2,
|
|
||||||
"string": 3,
|
|
||||||
}
|
|
||||||
SEMANTIC_TOKEN_MODIFIERS = {
|
|
||||||
"declaration": 1 << 0,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class TokenModifier(enum.IntFlag):
|
|
||||||
deprecated = enum.auto()
|
|
||||||
readonly = enum.auto()
|
|
||||||
defaultLibrary = enum.auto()
|
|
||||||
definition = enum.auto()
|
|
||||||
|
|
||||||
|
|
||||||
@attrs.define
|
|
||||||
class TokenData:
|
|
||||||
line: int
|
|
||||||
offset: int
|
|
||||||
text: str
|
|
||||||
|
|
||||||
tok_type: str = ""
|
|
||||||
tok_modifiers: List[TokenModifier] = attrs.field(factory=list)
|
|
||||||
|
|
||||||
|
|
||||||
TokenTypes = ["keyword", "variable", "function", "operator", "parameter", "type"]
|
|
||||||
|
|
||||||
|
|
||||||
def collect_semantic_tokens(tree: Tree) -> list[int]:
|
|
||||||
"""
|
|
||||||
Walk the parse tree and return a flat LSP semanticTokens/full array:
|
|
||||||
[line, char, length, tokenType, tokenModifiers, …]
|
|
||||||
"""
|
|
||||||
data = []
|
|
||||||
for tok in tree.scan_values(lambda v: isinstance(v, Token)):
|
|
||||||
# 'set' keyword
|
|
||||||
if tok.type == "SET":
|
|
||||||
data.append(
|
|
||||||
[
|
|
||||||
tok.line - 1,
|
|
||||||
tok.column - 1,
|
|
||||||
len(tok.value),
|
|
||||||
SEMANTIC_TOKEN_TYPES["keyword"],
|
|
||||||
0,
|
|
||||||
]
|
|
||||||
)
|
|
||||||
# variable being declared
|
|
||||||
elif tok.type == "NAME":
|
|
||||||
data.append(
|
|
||||||
[
|
|
||||||
tok.line - 1,
|
|
||||||
tok.column - 1,
|
|
||||||
len(tok.value),
|
|
||||||
SEMANTIC_TOKEN_TYPES["variable"],
|
|
||||||
SEMANTIC_TOKEN_MODIFIERS["declaration"],
|
|
||||||
]
|
|
||||||
)
|
|
||||||
# string literal
|
|
||||||
elif tok.type == "STRING":
|
|
||||||
data.append(
|
|
||||||
[
|
|
||||||
tok.line - 1,
|
|
||||||
tok.column - 1,
|
|
||||||
len(tok.value),
|
|
||||||
SEMANTIC_TOKEN_TYPES["string"],
|
|
||||||
0,
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
# sort by position and flatten
|
|
||||||
data.sort(key=lambda x: (x[0], x[1]))
|
|
||||||
return [p for token in data for p in token]
|
|
||||||
Reference in New Issue
Block a user