robotcode-language-server 2.8.0.dev670__tar.gz → 2.9.0.dev51__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/PKG-INFO +5 -5
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/pyproject.toml +4 -4
- robotcode_language_server-2.9.0.dev51/src/robotcode/language_server/__version__.py +1 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/cli.py +30 -5
- robotcode_language_server-2.9.0.dev51/src/robotcode/language_server/robotframework/parts/documentation_viewer.py +127 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/protocol.py +11 -1
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/server.py +4 -2
- robotcode_language_server-2.8.0.dev670/src/robotcode/language_server/__version__.py +0 -1
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/.gitignore +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/README.md +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/__init__.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/__init__.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/decorators.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/__init__.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/code_action.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/code_lens.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/commands.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/completion.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/declaration.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/definition.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/diagnostics.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/document_highlight.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/document_symbols.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/documents.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/folding_range.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/formatting.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/hover.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/implementation.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/inlay_hint.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/inline_value.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/linked_editing_ranges.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/protocol_part.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/references.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/rename.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/selection_range.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/semantic_tokens.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/signature_help.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/window.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/workspace.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/workspace_symbols.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/protocol.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/server.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/hooks.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/py.typed +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/__init__.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/configuration.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/__init__.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/code_action_documentation.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/code_action_helper_mixin.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/code_action_quick_fixes.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/code_action_refactor.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/code_lens.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/completion.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/debugging_utils.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/diagnostics.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/document_highlight.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/document_symbols.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/documents_cache.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/folding_range.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/formatting.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/goto.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/hover.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/http_server.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/inlay_hint.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/inline_value.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/keywords_treeview.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/model_variables.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/project_info.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/protocol_part.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/references.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/rename.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/robocop_diagnostics.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/robocop_helper.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/robot_workspace.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/selection_range.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/semantic_tokens.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/signature_help.py +0 -0
- {robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/workspace_symbols.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: robotcode-language-server
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.9.0-dev.51
|
|
4
4
|
Summary: RobotCode Language Server for Robot Framework
|
|
5
5
|
Project-URL: Homepage, https://robotcode.io
|
|
6
6
|
Project-URL: Donate, https://opencollective.com/robotcode
|
|
@@ -26,10 +26,10 @@ Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
|
26
26
|
Classifier: Topic :: Utilities
|
|
27
27
|
Classifier: Typing :: Typed
|
|
28
28
|
Requires-Python: >=3.10
|
|
29
|
-
Requires-Dist: robotcode-analyze==2.
|
|
30
|
-
Requires-Dist: robotcode-jsonrpc2==2.
|
|
31
|
-
Requires-Dist: robotcode-robot==2.
|
|
32
|
-
Requires-Dist: robotcode==2.
|
|
29
|
+
Requires-Dist: robotcode-analyze==2.9.0-dev.51
|
|
30
|
+
Requires-Dist: robotcode-jsonrpc2==2.9.0-dev.51
|
|
31
|
+
Requires-Dist: robotcode-robot==2.9.0-dev.51
|
|
32
|
+
Requires-Dist: robotcode==2.9.0-dev.51
|
|
33
33
|
Requires-Dist: robotframework>=5.0.0
|
|
34
34
|
Description-Content-Type: text/markdown
|
|
35
35
|
|
{robotcode_language_server-2.8.0.dev670 → robotcode_language_server-2.9.0.dev51}/pyproject.toml
RENAMED
|
@@ -29,10 +29,10 @@ classifiers = [
|
|
|
29
29
|
]
|
|
30
30
|
dependencies = [
|
|
31
31
|
"robotframework>=5.0.0",
|
|
32
|
-
"robotcode-jsonrpc2==2.
|
|
33
|
-
"robotcode-robot==2.
|
|
34
|
-
"robotcode-analyze==2.
|
|
35
|
-
"robotcode==2.
|
|
32
|
+
"robotcode-jsonrpc2==2.9.0-dev.51",
|
|
33
|
+
"robotcode-robot==2.9.0-dev.51",
|
|
34
|
+
"robotcode-analyze==2.9.0-dev.51",
|
|
35
|
+
"robotcode==2.9.0-dev.51",
|
|
36
36
|
]
|
|
37
37
|
dynamic = ["version"]
|
|
38
38
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.9.0-dev.51"
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import os
|
|
2
2
|
from pathlib import Path
|
|
3
|
-
from typing import Final, Optional, Sequence, Union
|
|
3
|
+
from typing import Any, Callable, Final, List, Optional, Sequence, Union
|
|
4
4
|
|
|
5
5
|
import click
|
|
6
|
+
from click.core import ParameterSource
|
|
6
7
|
|
|
7
8
|
from robotcode.analyze.config import AnalyzeConfig
|
|
8
9
|
from robotcode.core.types import ServerMode, TcpParams
|
|
@@ -13,7 +14,7 @@ from robotcode.plugin.click_helper.options import (
|
|
|
13
14
|
)
|
|
14
15
|
from robotcode.plugin.click_helper.types import AddressesPort, add_options
|
|
15
16
|
from robotcode.robot.config.loader import load_robot_config_from_path
|
|
16
|
-
from robotcode.robot.config.model import RobotBaseProfile
|
|
17
|
+
from robotcode.robot.config.model import RobotBaseProfile, UnknownProfile
|
|
17
18
|
from robotcode.robot.config.utils import get_config_files
|
|
18
19
|
from robotcode.robot.diagnostics.workspace_config import WorkspaceAnalysisConfig
|
|
19
20
|
|
|
@@ -29,6 +30,7 @@ def run_server(
|
|
|
29
30
|
pipe_name: Optional[str],
|
|
30
31
|
profile: Optional[RobotBaseProfile] = None,
|
|
31
32
|
analysis_config: Optional[WorkspaceAnalysisConfig] = None,
|
|
33
|
+
configuration_errors: Optional[List[str]] = None,
|
|
32
34
|
) -> None:
|
|
33
35
|
from .robotframework.server import RobotLanguageServer
|
|
34
36
|
|
|
@@ -38,6 +40,7 @@ def run_server(
|
|
|
38
40
|
pipe_name=pipe_name,
|
|
39
41
|
profile=profile,
|
|
40
42
|
analysis_config=analysis_config,
|
|
43
|
+
configuration_errors=configuration_errors,
|
|
41
44
|
) as server:
|
|
42
45
|
server.run()
|
|
43
46
|
|
|
@@ -76,6 +79,23 @@ def language_server(
|
|
|
76
79
|
|
|
77
80
|
profile: Optional[RobotBaseProfile] = None
|
|
78
81
|
analysis_config: Optional[WorkspaceAnalysisConfig] = None
|
|
82
|
+
# the errors of the configuration go to the log and, once the editor has connected, to the editor
|
|
83
|
+
configuration_errors: List[str] = []
|
|
84
|
+
|
|
85
|
+
def report_error(message: Union[str, Callable[[], Any]]) -> None:
|
|
86
|
+
text = str(message() if callable(message) else message)
|
|
87
|
+
configuration_errors.append(text)
|
|
88
|
+
app.error(text)
|
|
89
|
+
|
|
90
|
+
# the editors report a name that they pass with `-p` and that selects no profile themselves, with a way to fix it;
|
|
91
|
+
# a name from `ROBOTCODE_PROFILES` no editor reports
|
|
92
|
+
profiles_from_environment = ctx.find_root().get_parameter_source("profiles") == ParameterSource.ENVIRONMENT
|
|
93
|
+
|
|
94
|
+
def report_unknown_profile(unknown: UnknownProfile) -> None:
|
|
95
|
+
if unknown.selected and not profiles_from_environment:
|
|
96
|
+
app.error(unknown.message)
|
|
97
|
+
else:
|
|
98
|
+
report_error(unknown.message)
|
|
79
99
|
|
|
80
100
|
config_files, root_folder, _ = get_config_files(
|
|
81
101
|
paths,
|
|
@@ -98,11 +118,15 @@ def language_server(
|
|
|
98
118
|
|
|
99
119
|
analysis_config = analyzer_config.to_workspace_analysis_config()
|
|
100
120
|
|
|
121
|
+
# the server starts also when a name selects no profile, with the configuration without that name
|
|
101
122
|
profile = robot_config.combine_profiles(
|
|
102
|
-
*(app.config.profiles or []),
|
|
103
|
-
|
|
123
|
+
*(app.config.profiles or []),
|
|
124
|
+
verbose_callback=app.verbose,
|
|
125
|
+
error_callback=report_error,
|
|
126
|
+
unknown_profile_callback=report_unknown_profile,
|
|
127
|
+
).evaluated_with_env(verbose_callback=app.verbose, error_callback=report_error)
|
|
104
128
|
except (TypeError, ValueError) as e:
|
|
105
|
-
|
|
129
|
+
report_error(str(e))
|
|
106
130
|
|
|
107
131
|
mode, port, bind, pipe_name = resolve_server_options(
|
|
108
132
|
ctx, app, mode, port, bind, pipe_name, tcp, socket, stdio, pipe, None
|
|
@@ -115,6 +139,7 @@ def language_server(
|
|
|
115
139
|
pipe_name=pipe_name,
|
|
116
140
|
profile=profile,
|
|
117
141
|
analysis_config=analysis_config,
|
|
142
|
+
configuration_errors=configuration_errors,
|
|
118
143
|
)
|
|
119
144
|
except SystemExit as e:
|
|
120
145
|
app.verbose(f"Server exited with code {e.code}", err=e.code != 0)
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from concurrent.futures import CancelledError
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import TYPE_CHECKING, Any, Callable, List, Optional, Sequence, Set, Tuple
|
|
6
|
+
|
|
7
|
+
from robotcode.core.uri import Uri
|
|
8
|
+
from robotcode.core.utils.dataclasses import CamelSnakeMixin
|
|
9
|
+
from robotcode.core.utils.logging import LoggingDescriptor
|
|
10
|
+
from robotcode.jsonrpc2.protocol import rpc_method
|
|
11
|
+
from robotcode.robot.diagnostics.library_doc import BUILTIN_LIBRARY_NAME, CompleteResult, CompleteResultKind
|
|
12
|
+
|
|
13
|
+
from .protocol_part import RobotLanguageServerProtocolPart
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from ..protocol import RobotLanguageServerProtocol
|
|
17
|
+
|
|
18
|
+
PATH_SEPARATORS = ("/", os.sep)
|
|
19
|
+
|
|
20
|
+
# Of two equal labels, a module comes before a file and a file before a directory, as in the editor's completion.
|
|
21
|
+
KIND_ORDER = {CompleteResultKind.MODULE_INTERNAL: 0, CompleteResultKind.MODULE: 0, CompleteResultKind.FOLDER: 2}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass(repr=False)
|
|
25
|
+
class CompleteTargetParams(CamelSnakeMixin):
|
|
26
|
+
workspace_folder_uri: str
|
|
27
|
+
text: str
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass(repr=False)
|
|
31
|
+
class TargetCompletion(CamelSnakeMixin):
|
|
32
|
+
label: str
|
|
33
|
+
# the name of the `CompleteResultKind`, and its value as the editor's completion shows it
|
|
34
|
+
kind: str
|
|
35
|
+
detail: str
|
|
36
|
+
# the index in the text from which the label replaces it, in UTF-16 code units as the page counts
|
|
37
|
+
start: int
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def split_at_last_separator(text: str, separators: Sequence[str]) -> Tuple[Optional[str], int]:
|
|
41
|
+
"""The text up to and with its last separator, or None without one, and the length of that prefix."""
|
|
42
|
+
index = max(text.rfind(separator) for separator in separators)
|
|
43
|
+
return (text[: index + 1], index + 1) if index >= 0 else (None, 0)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def utf16_length(text: str) -> int:
|
|
47
|
+
"""The length of `text` in UTF-16 code units, as LSP positions count."""
|
|
48
|
+
return len(text.encode("utf-16-le")) // 2
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def completion_order(text: str, result: CompleteResult, start: int) -> Tuple[int, str, int, str]:
|
|
52
|
+
"""The order of the editor's completion: first the labels that continue the typed part in the same case, then the
|
|
53
|
+
others, each by label without regard to case."""
|
|
54
|
+
same_case = result.label.startswith(text[start:])
|
|
55
|
+
return (0 if same_case else 1, result.label.lower(), KIND_ORDER.get(result.kind, 1), result.label)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class RobotDocumentationViewerPart(RobotLanguageServerProtocolPart):
|
|
59
|
+
_logger = LoggingDescriptor()
|
|
60
|
+
|
|
61
|
+
def __init__(self, parent: "RobotLanguageServerProtocol") -> None:
|
|
62
|
+
super().__init__(parent)
|
|
63
|
+
|
|
64
|
+
@rpc_method(name="robot/documentationViewer/completeTarget", param_type=CompleteTargetParams, threaded=True)
|
|
65
|
+
@_logger.call
|
|
66
|
+
def _complete_target(
|
|
67
|
+
self,
|
|
68
|
+
workspace_folder_uri: str,
|
|
69
|
+
text: str,
|
|
70
|
+
*args: Any,
|
|
71
|
+
**kwargs: Any,
|
|
72
|
+
) -> List[TargetCompletion]:
|
|
73
|
+
# The arguments of an import are not completed, nor a text of dots only, as in the editor.
|
|
74
|
+
if "::" in text or (text and all(c == "." for c in text)):
|
|
75
|
+
return []
|
|
76
|
+
|
|
77
|
+
folder = Uri(workspace_folder_uri)
|
|
78
|
+
imports_manager = self.parent.documents_cache.get_imports_manager_for_uri(folder)
|
|
79
|
+
base_dir = str(folder.to_path())
|
|
80
|
+
|
|
81
|
+
results: Set[Tuple[CompleteResult, int]] = set()
|
|
82
|
+
|
|
83
|
+
# Libraries are completed as in the editor: a name with a path separator as a path, any other as a module.
|
|
84
|
+
library_prefix, library_start = split_at_last_separator(
|
|
85
|
+
text, PATH_SEPARATORS if any(s in text for s in PATH_SEPARATORS) else (".",)
|
|
86
|
+
)
|
|
87
|
+
for result in self._completions(imports_manager.complete_library_import, library_prefix, base_dir):
|
|
88
|
+
results.add((result, library_start))
|
|
89
|
+
# The editor leaves out BuiltIn, which every file imports already; for the viewer it is a target like any other.
|
|
90
|
+
if library_prefix is None:
|
|
91
|
+
results.add((CompleteResult(BUILTIN_LIBRARY_NAME, CompleteResultKind.MODULE_INTERNAL), 0))
|
|
92
|
+
|
|
93
|
+
# Resources are looked up in the base directory only for names that start with `.` or a path separator, but
|
|
94
|
+
# the target field writes paths relative to the workspace folder without `./`.
|
|
95
|
+
resource_prefix, resource_start = split_at_last_separator(text, PATH_SEPARATORS)
|
|
96
|
+
resource_names = [resource_prefix]
|
|
97
|
+
if (
|
|
98
|
+
resource_prefix is not None
|
|
99
|
+
and not resource_prefix.startswith((".", *PATH_SEPARATORS))
|
|
100
|
+
and not Path(resource_prefix).is_absolute()
|
|
101
|
+
):
|
|
102
|
+
resource_names.append(f"./{resource_prefix}")
|
|
103
|
+
for name in resource_names:
|
|
104
|
+
for result in self._completions(imports_manager.complete_resource_import, name, base_dir):
|
|
105
|
+
results.add((result, resource_start))
|
|
106
|
+
|
|
107
|
+
matching = [(r, start) for r, start in results if r.label.lower().startswith(text[start:].lower())]
|
|
108
|
+
matching.sort(key=lambda item: completion_order(text, *item))
|
|
109
|
+
return [
|
|
110
|
+
TargetCompletion(result.label, result.kind.name, result.kind.value, utf16_length(text[:start]))
|
|
111
|
+
for result, start in matching
|
|
112
|
+
]
|
|
113
|
+
|
|
114
|
+
def _completions(
|
|
115
|
+
self,
|
|
116
|
+
complete: Callable[[Optional[str], str], Optional[List[CompleteResult]]],
|
|
117
|
+
name: Optional[str],
|
|
118
|
+
base_dir: str,
|
|
119
|
+
) -> List[CompleteResult]:
|
|
120
|
+
# A side that fails, such as on a directory without read permission, leaves the other side's results.
|
|
121
|
+
try:
|
|
122
|
+
return complete(name, base_dir) or []
|
|
123
|
+
except (SystemExit, KeyboardInterrupt, CancelledError):
|
|
124
|
+
raise
|
|
125
|
+
except BaseException as e:
|
|
126
|
+
self._logger.exception(e)
|
|
127
|
+
return []
|
|
@@ -15,7 +15,7 @@ from typing import (
|
|
|
15
15
|
|
|
16
16
|
from robotcode.core.event import event
|
|
17
17
|
from robotcode.core.language import LanguageDefinition
|
|
18
|
-
from robotcode.core.lsp.types import InitializeError
|
|
18
|
+
from robotcode.core.lsp.types import InitializeError, MessageType
|
|
19
19
|
from robotcode.core.utils.dataclasses import CamelSnakeMixin, from_dict
|
|
20
20
|
from robotcode.core.utils.logging import LoggingDescriptor
|
|
21
21
|
from robotcode.jsonrpc2.protocol import JsonRPCErrorException, JsonRPCErrors, ProtocolPartDescriptor
|
|
@@ -35,6 +35,7 @@ from .parts.debugging_utils import RobotDebuggingUtilsProtocolPart
|
|
|
35
35
|
from .parts.diagnostics import RobotDiagnosticsProtocolPart
|
|
36
36
|
from .parts.document_highlight import RobotDocumentHighlightProtocolPart
|
|
37
37
|
from .parts.document_symbols import RobotDocumentSymbolsProtocolPart
|
|
38
|
+
from .parts.documentation_viewer import RobotDocumentationViewerPart
|
|
38
39
|
from .parts.documents_cache import DocumentsCachePart
|
|
39
40
|
from .parts.folding_range import RobotFoldingRangeProtocolPart
|
|
40
41
|
from .parts.formatting import RobotFormattingProtocolPart
|
|
@@ -121,6 +122,7 @@ class RobotLanguageServerProtocol(LanguageServerProtocol):
|
|
|
121
122
|
|
|
122
123
|
robot_debugging_utils = ProtocolPartDescriptor(RobotDebuggingUtilsProtocolPart)
|
|
123
124
|
robot_keywords_treeview = ProtocolPartDescriptor(RobotKeywordsTreeViewPart)
|
|
125
|
+
robot_documentation_viewer = ProtocolPartDescriptor(RobotDocumentationViewerPart)
|
|
124
126
|
robot_project_info = ProtocolPartDescriptor(ProjectInfoPart)
|
|
125
127
|
robot_workspace_symbols = ProtocolPartDescriptor(RobotWorkspaceSymbolsProtocolPart)
|
|
126
128
|
|
|
@@ -159,13 +161,16 @@ class RobotLanguageServerProtocol(LanguageServerProtocol):
|
|
|
159
161
|
server: "RobotLanguageServer",
|
|
160
162
|
profile: Optional[RobotBaseProfile] = None,
|
|
161
163
|
analysis_config: Optional[WorkspaceAnalysisConfig] = None,
|
|
164
|
+
configuration_errors: Optional[List[str]] = None,
|
|
162
165
|
):
|
|
163
166
|
super().__init__(server)
|
|
164
167
|
self.robot_profile = profile if profile is not None else RobotBaseProfile()
|
|
165
168
|
self.analysis_config = analysis_config if analysis_config is not None else WorkspaceAnalysisConfig()
|
|
169
|
+
self.configuration_errors = configuration_errors if configuration_errors is not None else []
|
|
166
170
|
self.robot_initialization_options = RobotInitializationOptions()
|
|
167
171
|
self.on_initialize.add(self._on_initialize)
|
|
168
172
|
self.on_initialized.add(self.server_initialized)
|
|
173
|
+
self.on_initialized.add(self.show_configuration_errors)
|
|
169
174
|
self._documents_cache: Optional[DocumentsCachePart] = None
|
|
170
175
|
|
|
171
176
|
@_logger.call
|
|
@@ -223,6 +228,11 @@ class RobotLanguageServerProtocol(LanguageServerProtocol):
|
|
|
223
228
|
@event
|
|
224
229
|
def on_robot_initialized(sender) -> None: ...
|
|
225
230
|
|
|
231
|
+
# the errors of the configuration that the start loaded, which the editors otherwise show only in the server's log
|
|
232
|
+
def show_configuration_errors(self, sender: Any) -> None:
|
|
233
|
+
for message in self.configuration_errors:
|
|
234
|
+
self.window.show_message(message, MessageType.ERROR)
|
|
235
|
+
|
|
226
236
|
def server_initialized(self, sender: Any) -> None:
|
|
227
237
|
for folder in self.workspace.workspace_folders:
|
|
228
238
|
for p in self.robot_profile.python_path or []:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import Optional
|
|
1
|
+
from typing import List, Optional
|
|
2
2
|
|
|
3
3
|
from robotcode.core.types import ServerMode, TcpParams
|
|
4
4
|
from robotcode.language_server.common.server import (
|
|
@@ -19,10 +19,12 @@ class RobotLanguageServer(LanguageServerBase[RobotLanguageServerProtocol]):
|
|
|
19
19
|
pipe_name: Optional[str] = None,
|
|
20
20
|
profile: Optional[RobotBaseProfile] = None,
|
|
21
21
|
analysis_config: Optional[WorkspaceAnalysisConfig] = None,
|
|
22
|
+
configuration_errors: Optional[List[str]] = None,
|
|
22
23
|
):
|
|
23
24
|
super().__init__(mode, tcp_params, pipe_name)
|
|
24
25
|
self.profile = profile
|
|
25
26
|
self.analysis_config = analysis_config
|
|
27
|
+
self.configuration_errors = configuration_errors
|
|
26
28
|
|
|
27
29
|
def create_protocol(self) -> RobotLanguageServerProtocol:
|
|
28
|
-
return RobotLanguageServerProtocol(self, self.profile, self.analysis_config)
|
|
30
|
+
return RobotLanguageServerProtocol(self, self.profile, self.analysis_config, self.configuration_errors)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "2.8.0-dev.670"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|