Skip to content

Commit 03e5209

Browse files
feat(aegis-server): use aegis-core for semantics
1 parent 9ec33ff commit 03e5209

File tree

13 files changed

+442
-269
lines changed

13 files changed

+442
-269
lines changed

aegis-core/aegis_core/ast/features/__init__.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,41 @@
11
from dataclasses import dataclass, field
22

33
from beet import Context
4-
from bolt import AstAttribute, AstIdentifier, AstImportedItem, AstTargetAttribute, AstTargetIdentifier
5-
from mecha import AstNode, AstResourceLocation
4+
from bolt import (
5+
AstAttribute,
6+
AstClassName,
7+
AstFormatString,
8+
AstFunctionSignature,
9+
AstFunctionSignatureArgument,
10+
AstIdentifier,
11+
AstImportedItem,
12+
AstTargetAttribute,
13+
AstTargetIdentifier,
14+
AstValue,
15+
)
16+
from mecha import AstNode, AstResourceLocation, AstItemSlot
617

718
from .provider import *
819
from .resource_location import *
920
from .variable import *
10-
21+
from .generic import *
1122

1223
def get_default_providers() -> dict[type[AstNode], type[BaseFeatureProvider]]:
1324
return {
25+
# Bolt Specific
1426
AstIdentifier: VariableFeatureProvider,
1527
AstAttribute: VariableFeatureProvider,
1628
AstTargetAttribute: VariableFeatureProvider,
1729
AstTargetIdentifier: VariableFeatureProvider,
1830
AstImportedItem: VariableFeatureProvider,
31+
AstClassName: ClassNameProvider,
32+
AstFunctionSignature: FunctionSignatureProvider,
33+
AstFunctionSignatureArgument: FunctionSignatureArgProvider,
34+
AstValue: ValueProvider,
35+
AstFormatString: FormatStringProvider,
36+
# Mecha Specific
1937
AstResourceLocation: ResourceLocationFeatureProvider,
38+
AstItemSlot: ItemSlotProvider,
2039
}
2140

2241

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
import logging
2+
import re
3+
from types import NoneType
4+
from typing import ClassVar
5+
from aegis_core.ast.helpers import offset_location
6+
from aegis_core.ast.metadata import VariableMetadata, retrieve_metadata
7+
from aegis_core.semantics import TokenModifier, TokenType
8+
from bolt import (
9+
AstClassName,
10+
AstFormatString,
11+
AstFunctionSignature,
12+
AstFunctionSignatureArgument,
13+
AstValue,
14+
)
15+
from mecha import AstNode
16+
from mecha.ast import AstItemSlot
17+
from tokenstream import SourceLocation
18+
from .provider import BaseFeatureProvider
19+
20+
21+
__all__ = [
22+
"ItemSlotProvider",
23+
"ClassNameProvider",
24+
"FunctionSignatureProvider",
25+
"FunctionSignatureArgProvider",
26+
"ValueProvider",
27+
"FormatStringProvider",
28+
]
29+
30+
31+
# --- Mecha ---
32+
class ItemSlotProvider(BaseFeatureProvider[AstItemSlot]):
33+
@classmethod
34+
def semantics(cls, params):
35+
return [(params.node, "variable", ["readonly"])]
36+
37+
38+
# --- Bolt ---
39+
class ClassNameProvider(BaseFeatureProvider[AstClassName]):
40+
@classmethod
41+
def semantics(cls, params):
42+
return [(params.node, "class", [])]
43+
44+
45+
class FunctionSignatureProvider(BaseFeatureProvider[AstFunctionSignature]):
46+
@classmethod
47+
def semantics(cls, params):
48+
signature = params.node
49+
location = signature.location
50+
node = AstNode(
51+
location=location,
52+
end_location=offset_location(signature.location, len(signature.name)),
53+
)
54+
55+
tokens = [(node, "function", [])]
56+
57+
if len(signature.arguments) >= 1:
58+
first = signature.arguments[0]
59+
60+
if isinstance(first, AstFunctionSignatureArgument) and first.name == "self":
61+
tokens.append((first, "macro", []))
62+
63+
return tokens
64+
65+
66+
class FunctionSignatureArgProvider(BaseFeatureProvider[AstFunctionSignatureArgument]):
67+
@classmethod
68+
def semantics(cls, params):
69+
if params.node.type_annotation:
70+
return [(params.node.type_annotation, "class", [])]
71+
72+
return None
73+
74+
75+
class ValueProvider(BaseFeatureProvider[AstValue]):
76+
@classmethod
77+
def semantics(cls, params):
78+
value = params.node
79+
80+
metadata = retrieve_metadata(value, VariableMetadata)
81+
82+
if not metadata or not metadata.type_annotation:
83+
return None
84+
85+
annotation = metadata.type_annotation
86+
87+
if annotation is NoneType:
88+
89+
return [(value, "variable", ["readonly"])]
90+
91+
elif annotation is bool:
92+
return [(value, "macro", [])]
93+
94+
return None
95+
96+
97+
class FormatStringProvider(BaseFeatureProvider[AstFormatString]):
98+
FORMAT_REGEX: ClassVar[re.Pattern] = re.compile(r"\{(:.+)?\}")
99+
100+
@classmethod
101+
def semantics(cls, params):
102+
format_string = params.node
103+
104+
formats = cls.FORMAT_REGEX.findall(format_string.fmt)
105+
106+
nodes: list[tuple[AstNode, TokenType, list[TokenModifier]]] = []
107+
108+
nodes.append(
109+
(
110+
AstNode(
111+
format_string.location, offset_location(format_string.location, 1)
112+
),
113+
"macro",
114+
[],
115+
)
116+
)
117+
118+
for format, value in zip(formats, format_string.values):
119+
nodes.append(
120+
(
121+
AstNode(offset_location(value.location, -1), value.location),
122+
"macro",
123+
[],
124+
)
125+
)
126+
nodes.append(
127+
(
128+
AstNode(
129+
value.end_location,
130+
offset_location(value.end_location, 1 + len(format)),
131+
),
132+
"macro",
133+
[],
134+
)
135+
)
136+
137+
return nodes

aegis-core/aegis_core/ast/features/provider.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
class BaseParams(Generic[Node]):
2626
ctx: Context
2727
node: Node
28+
resource_location: str
2829

2930

3031
@dataclass
@@ -81,5 +82,5 @@ def rename(cls, params: RenameParams[Node]) -> lsp.WorkspaceEdit | None:
8182
@classmethod
8283
def semantics(
8384
cls, params: SemanticsParams[Node]
84-
) -> list[tuple[AstNode, TokenType, TokenModifier]] | None:
85+
) -> list[tuple[AstNode, TokenType, list[TokenModifier]]] | None:
8586
return None

aegis-core/aegis_core/ast/features/resource_location.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,3 +212,8 @@ def completion(cls, params):
212212
)
213213

214214
return lsp.CompletionList(False, items)
215+
216+
@classmethod
217+
def semantics(cls, params):
218+
return [(params.node, "function", [])]
219+

0 commit comments

Comments
 (0)