Skip to content

Commit 7d69234

Browse files
committed
implement handling of command line variables
1 parent bacefdd commit 7d69234

File tree

9 files changed

+117
-25
lines changed

9 files changed

+117
-25
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@
143143
}
144144
],
145145
"languages": [
146-
{
146+
{
147147
"id": "robotframework",
148148
"aliases": [
149149
"Robot Framework",

poetry.lock

Lines changed: 44 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ robotframework-robocop = "^1.7.1"
3030
robotframework-tidy = "^1.5.1"
3131
orjson = "^3.6.3"
3232
types-orjson = "^3.6.0"
33+
PyYAML = "^6.0"
3334

3435

3536
[tool.poetry-dynamic-versioning]

robotcode/language_server/common/parts/workspace.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ async def get_configuration(
323323
else:
324324
result = {}
325325
break
326-
return self.settings.get(str(section), {})
326+
return result
327327

328328
def get_workspace_folder(self, uri: Union[Uri, str]) -> Optional[WorkspaceFolder]:
329329
if isinstance(uri, str):

robotcode/language_server/robotframework/diagnostics/namespace.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ def __hash__(self) -> int:
141141
class VariableDefinitionType(Enum):
142142
VARIABLE = "Variable"
143143
ARGUMENT = "Argument"
144-
BUILTIN_VARIABLE = "Variable (Builtin)"
144+
COMMAND_LINE_VARIABLE = "Command Line Variable"
145+
BUILTIN_VARIABLE = "Builtin Variable"
145146

146147

147148
@dataclass
@@ -174,6 +175,14 @@ def __hash__(self) -> int:
174175
return hash((type(self), self.name, self.type))
175176

176177

178+
@dataclass
179+
class CommandLineVariableDefinition(VariableDefinition):
180+
type: VariableDefinitionType = VariableDefinitionType.COMMAND_LINE_VARIABLE
181+
182+
def __hash__(self) -> int:
183+
return hash((type(self), self.name, self.type))
184+
185+
177186
@dataclass
178187
class ArgumentDefinition(VariableDefinition):
179188
type: VariableDefinitionType = VariableDefinitionType.ARGUMENT
@@ -995,6 +1004,15 @@ def get_builtin_variables(cls) -> List[BuiltInVariableDefinition]:
9951004

9961005
return cls._builtin_variables
9971006

1007+
def get_command_line_variables(self) -> List[VariableDefinition]:
1008+
if self.imports_manager.config is None:
1009+
return []
1010+
1011+
return [
1012+
CommandLineVariableDefinition(0, 0, 0, 0, "", f"${{{k}}}", None)
1013+
for k in self.imports_manager.config.variables.keys()
1014+
]
1015+
9981016
async def get_variables(
9991017
self, nodes: Optional[List[ast.AST]] = None, position: Optional[Position] = None
10001018
) -> Dict[VariableMatcher, VariableDefinition]:
@@ -1012,6 +1030,7 @@ async def get_variables(
10121030
],
10131031
(e for e in await self.get_own_variables()),
10141032
*(e.variables for e in self._resources.values()),
1033+
(e for e in self.get_command_line_variables()),
10151034
(e for e in self.get_builtin_variables()),
10161035
):
10171036
if var.name is not None and VariableMatcher(var.name) not in result.keys():

robotcode/language_server/robotframework/parts/completion.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,8 @@ async def create_environment_variables_completion_items(self, range: Optional[Ra
304304
_VARIABLE_COMPLETION_SORT_TEXT_PREFIX = {
305305
VariableDefinitionType.VARIABLE: "035",
306306
VariableDefinitionType.ARGUMENT: "034",
307-
VariableDefinitionType.BUILTIN_VARIABLE: "036",
307+
VariableDefinitionType.COMMAND_LINE_VARIABLE: "036",
308+
VariableDefinitionType.BUILTIN_VARIABLE: "037",
308309
}
309310

310311
async def create_variables_completion_items(

robotcode/language_server/robotframework/protocol.py

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -83,21 +83,27 @@ async def _on_initialize(self, sender: Any, initialization_options: Optional[Any
8383

8484
@_logger.call
8585
async def _on_initialized(self, sender: Any) -> None:
86-
document_selector = [DocumentFilter(language="python")]
87-
await self.register_capability(
88-
str(uuid.uuid4()),
89-
"textDocument/didOpen",
90-
TextDocumentRegistrationOptions(document_selector=document_selector),
91-
)
92-
await self.register_capability(
93-
str(uuid.uuid4()),
94-
"textDocument/didChange",
95-
TextDocumentChangeRegistrationOptions(
96-
document_selector=document_selector, sync_kind=TextDocumentSyncKind.INCREMENTAL
97-
),
98-
)
99-
await self.register_capability(
100-
str(uuid.uuid4()),
101-
"textDocument/didClose",
102-
TextDocumentRegistrationOptions(document_selector=document_selector),
103-
)
86+
if (
87+
self.client_capabilities
88+
and self.client_capabilities.workspace
89+
and self.client_capabilities.workspace.file_operations
90+
and self.client_capabilities.workspace.file_operations.dynamic_registration
91+
):
92+
document_selector = [DocumentFilter(language="python")]
93+
await self.register_capability(
94+
str(uuid.uuid4()),
95+
"textDocument/didOpen",
96+
TextDocumentRegistrationOptions(document_selector=document_selector),
97+
)
98+
await self.register_capability(
99+
str(uuid.uuid4()),
100+
"textDocument/didChange",
101+
TextDocumentChangeRegistrationOptions(
102+
document_selector=document_selector, sync_kind=TextDocumentSyncKind.INCREMENTAL
103+
),
104+
)
105+
await self.register_capability(
106+
str(uuid.uuid4()),
107+
"textDocument/didClose",
108+
TextDocumentRegistrationOptions(document_selector=document_selector),
109+
)

tests/robotcode/language_server/robotframework/parts/data/hover.robot

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ first
1212
FOR ${key} ${value} IN &{A DICT}
1313
Log ${key}=${value}
1414
END
15+
Log ${CMD_VAR}

tests/robotcode/language_server/robotframework/parts/test_hover.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
11
from pathlib import Path
2-
from typing import AsyncGenerator
2+
from typing import AsyncGenerator, cast
33

44
import pytest
55

6+
from robotcode.language_server.common.parts.workspace import HasConfigSection
67
from robotcode.language_server.common.text_document import TextDocument
78
from robotcode.language_server.common.types import (
89
ClientCapabilities,
910
ClientInfo,
1011
HoverClientCapabilities,
12+
InitializedParams,
1113
MarkupContent,
1214
MarkupKind,
1315
Position,
1416
Range,
1517
TextDocumentClientCapabilities,
1618
WorkspaceFolder,
1719
)
20+
from robotcode.language_server.robotframework.configuration import (
21+
RobotCodeConfig,
22+
RobotConfig,
23+
)
1824
from robotcode.language_server.robotframework.protocol import (
1925
RobotLanguageServerProtocol,
2026
)
@@ -38,7 +44,21 @@ async def protocol() -> AsyncGenerator[RobotLanguageServerProtocol, None]:
3844
workspace_folders=[WorkspaceFolder(name="test workspace", uri=root_path.as_uri())],
3945
client_info=ClientInfo(name="TestClient", version="1.0.0"),
4046
)
41-
47+
await protocol._initialized(InitializedParams())
48+
await protocol.workspace._workspace_did_change_configuration(
49+
{
50+
cast(HasConfigSection, RobotCodeConfig)
51+
.__config_section__: RobotCodeConfig(
52+
robot=RobotConfig(
53+
env={"ENV_VAR": "1"},
54+
variables={
55+
"CMD_VAR": "1",
56+
},
57+
)
58+
)
59+
.dict()
60+
}
61+
)
4262
yield protocol
4363
finally:
4464
server.close()
@@ -102,6 +122,7 @@ async def test_hover_should_not_find_simple_keyword_on_boundaries(
102122
(Position(line=10, character=36), "(Variable) &{A DICT}"),
103123
(Position(line=11, character=13), "(Variable) ${key}"), # FOR Variable
104124
(Position(line=11, character=24), "(Variable) ${value}"), # FOR Variable
125+
(Position(line=14, character=14), "(Command Line Variable) ${CMD_VAR}"), # CMD LINE Variable
105126
],
106127
)
107128
@pytest.mark.asyncio

0 commit comments

Comments
 (0)