Skip to content

Commit 054d210

Browse files
committed
feat(langserver): goto, highlight, rename, hover, find references for named arguments
rename and goto only works for resource keywords
1 parent 934e299 commit 054d210

File tree

3,720 files changed

+32902
-61335
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

3,720 files changed

+32902
-61335
lines changed

packages/core/src/robotcode/core/dataclasses.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ def __default(o: Any) -> Any:
158158
field,
159159
)
160160
for field in dataclasses.fields(o)
161-
if field.init or field.metadata.get("force_json", False)
161+
if (field.init or field.metadata.get("force_json", False)) and not field.metadata.get("nosave", False)
162162
)
163163
if value is not None or field.default == dataclasses.MISSING
164164
}

packages/language_server/src/robotcode/language_server/robotframework/diagnostics/analyzer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,7 @@ async def _analyze_keyword_call(
618618
name, value = split_from_equals(arg.value)
619619
if value is not None and name:
620620
arg_def = next(
621-
(e for e in result.argument_definitions if e.name_token and e.name_token.value == name),
621+
(e for e in result.argument_definitions if e.name[2:-1] == name),
622622
None,
623623
)
624624
if arg_def is not None:

packages/language_server/src/robotcode/language_server/robotframework/diagnostics/entities.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,13 +256,20 @@ def __hash__(self) -> int:
256256
@dataclass
257257
class ArgumentDefinition(VariableDefinition):
258258
type: VariableDefinitionType = VariableDefinitionType.ARGUMENT
259-
keyword_doc: Optional["KeywordDoc"] = None
259+
keyword_doc: Optional["KeywordDoc"] = field(default=None, compare=False, metadata={"nosave": True})
260260

261261
@single_call
262262
def __hash__(self) -> int:
263263
return hash((type(self), self.name, self.type, self.range, self.source))
264264

265265

266+
@dataclass
267+
class LibraryArgumentDefinition(ArgumentDefinition):
268+
@single_call
269+
def __hash__(self) -> int:
270+
return hash((type(self), self.name, self.type, self.range, self.source))
271+
272+
266273
@dataclass(frozen=True, eq=False, repr=False)
267274
class NativeValue:
268275
value: Any

packages/language_server/src/robotcode/language_server/robotframework/diagnostics/imports_manager.py

Lines changed: 3 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import weakref
1111
import zlib
1212
from abc import ABC, abstractmethod
13-
from ast import walk
1413
from collections import OrderedDict
1514
from concurrent.futures import ProcessPoolExecutor
1615
from dataclasses import dataclass
@@ -25,7 +24,6 @@
2524
Mapping,
2625
Optional,
2726
Tuple,
28-
cast,
2927
final,
3028
)
3129

@@ -41,20 +39,14 @@
4139
from robotcode.language_server.common.parts.workspace import FileWatcherEntry, Workspace
4240
from robotcode.language_server.common.text_document import TextDocument
4341
from robotcode.language_server.robotframework.configuration import CacheSaveLocation, RobotCodeConfig
44-
from robotcode.language_server.robotframework.utils.ast_utils import HasError, HasErrors, Token
4542
from robotcode.language_server.robotframework.utils.robot_path import find_file_ex
4643
from robotcode.language_server.robotframework.utils.version import get_robot_version, get_robot_version_str
4744

4845
from ...__version__ import __version__
4946
from .entities import CommandLineVariableDefinition, VariableDefinition
5047
from .library_doc import (
5148
ROBOT_LIBRARY_PACKAGE,
52-
ArgumentSpec,
5349
CompleteResult,
54-
Error,
55-
KeywordArgumentDoc,
56-
KeywordDoc,
57-
KeywordStore,
5850
LibraryDoc,
5951
ModuleSpec,
6052
VariablesDoc,
@@ -65,9 +57,9 @@
6557
find_library,
6658
find_variables,
6759
get_library_doc,
60+
get_model_doc,
6861
get_module_spec,
6962
get_variables_doc,
70-
is_embedded_keyword,
7163
is_library_by_path,
7264
is_variables_by_path,
7365
resolve_args,
@@ -1177,121 +1169,10 @@ def get_libdoc_from_model(
11771169
scope: str = "GLOBAL",
11781170
append_model_errors: bool = True,
11791171
) -> LibraryDoc:
1180-
from robot.errors import DataError
1181-
from robot.libdocpkg.robotbuilder import KeywordDocBuilder
1182-
from robot.parsing.lexer.tokens import Token as RobotToken
1183-
from robot.parsing.model.statements import KeywordName
1184-
from robot.running.builder.transformers import ResourceBuilder
1185-
from robot.running.model import ResourceFile
1186-
from robot.running.usererrorhandler import UserErrorHandler
1187-
from robot.running.userkeyword import UserLibrary
1188-
1189-
errors: List[Error] = []
1190-
keyword_names: List[KeywordName] = []
1191-
1192-
for node in walk(model):
1193-
if isinstance(node, KeywordName):
1194-
keyword_names.append(node)
1195-
1196-
error = node.error if isinstance(node, HasError) else None
1197-
if error is not None:
1198-
errors.append(Error(message=error, type_name="ModelError", source=source, line_no=node.lineno))
1199-
if append_model_errors:
1200-
node_errors = node.errors if isinstance(node, HasErrors) else None
1201-
if node_errors is not None:
1202-
for e in node_errors:
1203-
errors.append(Error(message=e, type_name="ModelError", source=source, line_no=node.lineno))
1204-
1205-
def get_keyword_name_token_from_line(line: int) -> Optional[Token]:
1206-
for keyword_name in keyword_names:
1207-
if keyword_name.lineno == line:
1208-
return cast(Token, keyword_name.get_token(RobotToken.KEYWORD_NAME))
1209-
1210-
return None
1211-
1212-
res = ResourceFile(source=source)
1213-
1214-
ResourceBuilder(res).visit(model)
1215-
1216-
class MyUserLibrary(UserLibrary):
1217-
current_kw: Any = None
1218-
1219-
def _log_creating_failed(self, handler: UserErrorHandler, error: BaseException) -> None:
1220-
err = Error(
1221-
message=f"Creating keyword '{handler.name}' failed: {error!s}",
1222-
type_name=type(error).__qualname__,
1223-
source=self.current_kw.source if self.current_kw is not None else None,
1224-
line_no=self.current_kw.lineno if self.current_kw is not None else None,
1225-
)
1226-
errors.append(err)
1227-
1228-
def _create_handler(self, kw: Any) -> Any:
1229-
self.current_kw = kw
1230-
try:
1231-
handler = super()._create_handler(kw)
1232-
setattr(handler, "errors", None)
1233-
except DataError as e:
1234-
err = Error(
1235-
message=str(e),
1236-
type_name=type(e).__qualname__,
1237-
source=kw.source,
1238-
line_no=kw.lineno,
1239-
)
1240-
errors.append(err)
1241-
1242-
handler = UserErrorHandler(e, kw.name, self.name)
1243-
handler.source = kw.source
1244-
handler.lineno = kw.lineno
1245-
1246-
setattr(handler, "errors", [err])
1247-
1248-
return handler
1249-
1250-
lib = MyUserLibrary(res)
1251-
1252-
libdoc = LibraryDoc(
1253-
name=lib.name or "",
1254-
doc=lib.doc,
1255-
type=model_type,
1256-
scope=scope,
1257-
source=source,
1258-
line_no=1,
1259-
errors=errors,
1172+
return get_model_doc(
1173+
model=model, source=source, model_type=model_type, scope=scope, append_model_errors=append_model_errors
12601174
)
12611175

1262-
libdoc.keywords = KeywordStore(
1263-
source=libdoc.name,
1264-
source_type=libdoc.type,
1265-
keywords=[
1266-
KeywordDoc(
1267-
name=kw[0].name,
1268-
args=[KeywordArgumentDoc.from_robot(a) for a in kw[0].args],
1269-
doc=kw[0].doc,
1270-
tags=list(kw[0].tags),
1271-
source=str(kw[0].source),
1272-
name_token=get_keyword_name_token_from_line(kw[0].lineno),
1273-
line_no=kw[0].lineno if kw[0].lineno is not None else -1,
1274-
col_offset=-1,
1275-
end_col_offset=-1,
1276-
end_line_no=-1,
1277-
libname=libdoc.name,
1278-
libtype=libdoc.type,
1279-
longname=f"{libdoc.name}.{kw[0].name}",
1280-
is_embedded=is_embedded_keyword(kw[0].name),
1281-
errors=getattr(kw[1], "errors") if hasattr(kw[1], "errors") else None,
1282-
is_error_handler=isinstance(kw[1], UserErrorHandler),
1283-
error_handler_message=str(cast(UserErrorHandler, kw[1]).error)
1284-
if isinstance(kw[1], UserErrorHandler)
1285-
else None,
1286-
arguments=ArgumentSpec.from_robot_argument_spec(kw[1].arguments),
1287-
parent=libdoc.digest,
1288-
)
1289-
for kw in [(KeywordDocBuilder(resource=True).build_keyword(lw), lw) for lw in lib.handlers]
1290-
],
1291-
)
1292-
1293-
return libdoc
1294-
12951176
@_logger.call
12961177
async def get_libdoc_for_variables_import(
12971178
self,

0 commit comments

Comments
 (0)