robotcode-language-server 2.8.0.dev677__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.
Files changed (78) hide show
  1. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/PKG-INFO +5 -5
  2. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/pyproject.toml +4 -4
  3. robotcode_language_server-2.9.0.dev51/src/robotcode/language_server/__version__.py +1 -0
  4. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/cli.py +30 -5
  5. robotcode_language_server-2.9.0.dev51/src/robotcode/language_server/robotframework/parts/documentation_viewer.py +127 -0
  6. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/protocol.py +11 -1
  7. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/server.py +4 -2
  8. robotcode_language_server-2.8.0.dev677/src/robotcode/language_server/__version__.py +0 -1
  9. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/.gitignore +0 -0
  10. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/README.md +0 -0
  11. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/__init__.py +0 -0
  12. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/__init__.py +0 -0
  13. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/decorators.py +0 -0
  14. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/__init__.py +0 -0
  15. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/code_action.py +0 -0
  16. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/code_lens.py +0 -0
  17. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/commands.py +0 -0
  18. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/completion.py +0 -0
  19. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/declaration.py +0 -0
  20. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/definition.py +0 -0
  21. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/diagnostics.py +0 -0
  22. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/document_highlight.py +0 -0
  23. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/document_symbols.py +0 -0
  24. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/documents.py +0 -0
  25. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/folding_range.py +0 -0
  26. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/formatting.py +0 -0
  27. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/hover.py +0 -0
  28. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/implementation.py +0 -0
  29. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/inlay_hint.py +0 -0
  30. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/inline_value.py +0 -0
  31. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/linked_editing_ranges.py +0 -0
  32. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/protocol_part.py +0 -0
  33. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/references.py +0 -0
  34. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/rename.py +0 -0
  35. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/selection_range.py +0 -0
  36. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/semantic_tokens.py +0 -0
  37. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/signature_help.py +0 -0
  38. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/window.py +0 -0
  39. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/workspace.py +0 -0
  40. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/parts/workspace_symbols.py +0 -0
  41. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/protocol.py +0 -0
  42. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/common/server.py +0 -0
  43. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/hooks.py +0 -0
  44. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/py.typed +0 -0
  45. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/__init__.py +0 -0
  46. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/configuration.py +0 -0
  47. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/__init__.py +0 -0
  48. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/code_action_documentation.py +0 -0
  49. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/code_action_helper_mixin.py +0 -0
  50. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/code_action_quick_fixes.py +0 -0
  51. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/code_action_refactor.py +0 -0
  52. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/code_lens.py +0 -0
  53. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/completion.py +0 -0
  54. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/debugging_utils.py +0 -0
  55. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/diagnostics.py +0 -0
  56. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/document_highlight.py +0 -0
  57. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/document_symbols.py +0 -0
  58. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/documents_cache.py +0 -0
  59. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/folding_range.py +0 -0
  60. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/formatting.py +0 -0
  61. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/goto.py +0 -0
  62. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/hover.py +0 -0
  63. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/http_server.py +0 -0
  64. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/inlay_hint.py +0 -0
  65. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/inline_value.py +0 -0
  66. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/keywords_treeview.py +0 -0
  67. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/model_variables.py +0 -0
  68. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/project_info.py +0 -0
  69. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/protocol_part.py +0 -0
  70. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/references.py +0 -0
  71. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/rename.py +0 -0
  72. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/robocop_diagnostics.py +0 -0
  73. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/robocop_helper.py +0 -0
  74. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/robot_workspace.py +0 -0
  75. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/selection_range.py +0 -0
  76. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/semantic_tokens.py +0 -0
  77. {robotcode_language_server-2.8.0.dev677 → robotcode_language_server-2.9.0.dev51}/src/robotcode/language_server/robotframework/parts/signature_help.py +0 -0
  78. {robotcode_language_server-2.8.0.dev677 → 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.8.0-dev.677
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.8.0-dev.677
30
- Requires-Dist: robotcode-jsonrpc2==2.8.0-dev.677
31
- Requires-Dist: robotcode-robot==2.8.0-dev.677
32
- Requires-Dist: robotcode==2.8.0-dev.677
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
 
@@ -29,10 +29,10 @@ classifiers = [
29
29
  ]
30
30
  dependencies = [
31
31
  "robotframework>=5.0.0",
32
- "robotcode-jsonrpc2==2.8.0-dev.677",
33
- "robotcode-robot==2.8.0-dev.677",
34
- "robotcode-analyze==2.8.0-dev.677",
35
- "robotcode==2.8.0-dev.677",
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 []), verbose_callback=app.verbose, error_callback=app.error
103
- ).evaluated_with_env(verbose_callback=app.verbose, error_callback=app.error)
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
- app.error(str(e), err=True)
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.677"