robotcode-language-server 1.3.0.dev6__tar.gz → 1.5.0__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 (79) hide show
  1. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/PKG-INFO +5 -5
  2. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/pyproject.toml +4 -4
  3. robotcode_language_server-1.5.0/src/robotcode/language_server/__version__.py +1 -0
  4. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/diagnostics.py +0 -3
  5. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/documents.py +0 -4
  6. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/rename.py +4 -6
  7. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/workspace.py +1 -1
  8. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/protocol.py +0 -9
  9. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/formatting.py +19 -22
  10. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/hover.py +1 -1
  11. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/inlay_hint.py +1 -1
  12. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/project_info.py +5 -6
  13. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/references.py +1 -1
  14. robotcode_language_server-1.5.0/src/robotcode/language_server/robotframework/parts/rename.py +260 -0
  15. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/robocop_diagnostics.py +11 -24
  16. robotcode_language_server-1.5.0/src/robotcode/language_server/robotframework/parts/robocop_helper.py +117 -0
  17. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/robot_workspace.py +0 -4
  18. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/signature_help.py +1 -1
  19. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/protocol.py +2 -0
  20. robotcode_language_server-1.3.0.dev6/src/robotcode/language_server/__version__.py +0 -1
  21. robotcode_language_server-1.3.0.dev6/src/robotcode/language_server/robotframework/parts/rename.py +0 -693
  22. robotcode_language_server-1.3.0.dev6/src/robotcode/language_server/robotframework/parts/robocop_tidy_mixin.py +0 -49
  23. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/.gitignore +0 -0
  24. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/LICENSE.txt +0 -0
  25. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/README.md +0 -0
  26. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/__init__.py +0 -0
  27. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/cli.py +0 -0
  28. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/__init__.py +0 -0
  29. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/decorators.py +0 -0
  30. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/__init__.py +0 -0
  31. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/code_action.py +0 -0
  32. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/code_lens.py +0 -0
  33. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/commands.py +0 -0
  34. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/completion.py +0 -0
  35. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/declaration.py +0 -0
  36. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/definition.py +0 -0
  37. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/document_highlight.py +0 -0
  38. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/document_symbols.py +0 -0
  39. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/folding_range.py +0 -0
  40. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/formatting.py +0 -0
  41. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/hover.py +0 -0
  42. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/implementation.py +0 -0
  43. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/inlay_hint.py +0 -0
  44. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/inline_value.py +0 -0
  45. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/linked_editing_ranges.py +0 -0
  46. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/protocol_part.py +0 -0
  47. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/references.py +0 -0
  48. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/selection_range.py +0 -0
  49. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/semantic_tokens.py +0 -0
  50. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/signature_help.py +0 -0
  51. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/window.py +0 -0
  52. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/parts/workspace_symbols.py +0 -0
  53. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/common/server.py +0 -0
  54. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/hooks.py +0 -0
  55. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/py.typed +0 -0
  56. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/__init__.py +0 -0
  57. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/configuration.py +0 -0
  58. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/__init__.py +0 -0
  59. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/code_action_documentation.py +0 -0
  60. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/code_action_helper_mixin.py +0 -0
  61. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/code_action_quick_fixes.py +0 -0
  62. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/code_action_refactor.py +0 -0
  63. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/code_lens.py +0 -0
  64. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/completion.py +0 -0
  65. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/debugging_utils.py +0 -0
  66. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/diagnostics.py +0 -0
  67. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/document_highlight.py +0 -0
  68. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/document_symbols.py +0 -0
  69. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/documents_cache.py +0 -0
  70. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/folding_range.py +0 -0
  71. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/goto.py +0 -0
  72. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/http_server.py +0 -0
  73. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/inline_value.py +0 -0
  74. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/keywords_treeview.py +0 -0
  75. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/protocol_part.py +0 -0
  76. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/selection_range.py +0 -0
  77. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/semantic_tokens.py +0 -0
  78. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/parts/workspace_symbols.py +0 -0
  79. {robotcode_language_server-1.3.0.dev6 → robotcode_language_server-1.5.0}/src/robotcode/language_server/robotframework/server.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: robotcode-language-server
3
- Version: 1.3.0.dev6
3
+ Version: 1.5.0
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
@@ -25,10 +25,10 @@ Classifier: Programming Language :: Python :: Implementation :: PyPy
25
25
  Classifier: Topic :: Utilities
26
26
  Classifier: Typing :: Typed
27
27
  Requires-Python: >=3.8
28
- Requires-Dist: robotcode-analyze==1.3.0-dev.6
29
- Requires-Dist: robotcode-jsonrpc2==1.3.0-dev.6
30
- Requires-Dist: robotcode-robot==1.3.0-dev.6
31
- Requires-Dist: robotcode==1.3.0-dev.6
28
+ Requires-Dist: robotcode-analyze==1.5.0
29
+ Requires-Dist: robotcode-jsonrpc2==1.5.0
30
+ Requires-Dist: robotcode-robot==1.5.0
31
+ Requires-Dist: robotcode==1.5.0
32
32
  Requires-Dist: robotframework>=4.1.0
33
33
  Description-Content-Type: text/markdown
34
34
 
@@ -27,10 +27,10 @@ classifiers = [
27
27
  ]
28
28
  dependencies = [
29
29
  "robotframework>=4.1.0",
30
- "robotcode-jsonrpc2==1.3.0-dev.6",
31
- "robotcode-robot==1.3.0-dev.6",
32
- "robotcode-analyze==1.3.0-dev.6",
33
- "robotcode==1.3.0-dev.6",
30
+ "robotcode-jsonrpc2==1.5.0",
31
+ "robotcode-robot==1.5.0",
32
+ "robotcode-analyze==1.5.0",
33
+ "robotcode==1.5.0",
34
34
  ]
35
35
  dynamic = ["version"]
36
36
 
@@ -1,7 +1,6 @@
1
1
  import concurrent.futures
2
2
  import functools
3
3
  import itertools
4
- import logging
5
4
  import time
6
5
  import uuid
7
6
  from concurrent.futures import CancelledError
@@ -361,7 +360,6 @@ class DiagnosticsProtocolPart(LanguageServerProtocolPart):
361
360
  with self._logger.measure_time(
362
361
  lambda: f"analyzing workspace for {len(documents)} documents",
363
362
  context_name="workspace_diagnostics",
364
- level=logging.CRITICAL,
365
363
  ):
366
364
  self.on_workspace_diagnostics_analyze(self)
367
365
 
@@ -444,7 +442,6 @@ class DiagnosticsProtocolPart(LanguageServerProtocolPart):
444
442
  with self._logger.measure_time(
445
443
  lambda: f"collect workspace diagnostic for {len(documents_to_collect)} documents",
446
444
  context_name="collect_workspace_diagnostics",
447
- level=logging.CRITICAL,
448
445
  ):
449
446
  breaked = False
450
447
  for document in set(documents) - set(documents_to_collect):
@@ -47,10 +47,6 @@ class LanguageServerDocumentError(JsonRPCException):
47
47
  pass
48
48
 
49
49
 
50
- class CantReadDocumentError(Exception):
51
- pass
52
-
53
-
54
50
  class TextDocumentProtocolPart(LanguageServerProtocolPart, DocumentsManager):
55
51
  __logger: Final = LoggingDescriptor()
56
52
 
@@ -46,12 +46,7 @@ class RenameProtocolPart(LanguageServerProtocolPart):
46
46
  )
47
47
 
48
48
  @event
49
- def collect(
50
- sender,
51
- document: TextDocument,
52
- position: Position,
53
- new_name: str,
54
- ) -> Optional[WorkspaceEdit]: ...
49
+ def collect(sender, document: TextDocument, position: Position, new_name: str) -> Optional[WorkspaceEdit]: ...
55
50
 
56
51
  @event
57
52
  def collect_prepare(sender, document: TextDocument, position: Position) -> Optional[PrepareRenameResult]: ...
@@ -81,6 +76,9 @@ class RenameProtocolPart(LanguageServerProtocolPart):
81
76
  check_current_task_canceled()
82
77
 
83
78
  if isinstance(result, BaseException):
79
+ if isinstance(result, CantRenameError):
80
+ raise JsonRPCErrorException(ErrorCodes.INVALID_PARAMS, str(result))
81
+
84
82
  if not isinstance(result, CancelledError):
85
83
  self._logger.exception(result, exc_info=result)
86
84
  else:
@@ -315,7 +315,7 @@ class Workspace(LanguageServerProtocolPart, CoreWorkspace, FileWatcherManagerBas
315
315
  List[Any],
316
316
  )
317
317
 
318
- result = self.settings
318
+ result: Any = self.settings
319
319
  for sub_key in str(section).split("."):
320
320
  if sub_key in result:
321
321
  result = result.get(sub_key, None)
@@ -98,15 +98,6 @@ class LanguageServerLogHandler(logging.Handler):
98
98
  if self.trace != TraceValues.OFF:
99
99
  self.protocol.log_trace(record.getMessage())
100
100
 
101
- type = self.MAPPING.get(record.levelno, None)
102
- if type is None:
103
- type = MessageType.LOG
104
-
105
- self.protocol.window_log_message(
106
- type=type,
107
- message=record.getMessage(),
108
- )
109
-
110
101
 
111
102
  class LanguageServerProtocol(JsonRPCProtocol):
112
103
  __logger = LoggingDescriptor()
@@ -17,13 +17,12 @@ from robotcode.robot.utils import get_robot_version
17
17
 
18
18
  from ..configuration import RoboCopConfig, RoboTidyConfig
19
19
  from .protocol_part import RobotLanguageServerProtocolPart
20
- from .robocop_tidy_mixin import RoboCopTidyMixin
21
20
 
22
21
  if TYPE_CHECKING:
23
22
  from ..protocol import RobotLanguageServerProtocol
24
23
 
25
24
 
26
- class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, RoboCopTidyMixin):
25
+ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart):
27
26
  _logger = LoggingDescriptor()
28
27
 
29
28
  def __init__(self, parent: "RobotLanguageServerProtocol") -> None:
@@ -31,7 +30,9 @@ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, RoboCopTidyMi
31
30
 
32
31
  parent.formatting.format.add(self.format)
33
32
 
34
- if self.robotidy_installed or (self.robocop_installed and self.robocop_version >= (6, 0)):
33
+ if self.parent.robocop_helper.robotidy_installed or (
34
+ self.parent.robocop_helper.robocop_installed and self.parent.robocop_helper.robocop_version >= (6, 0)
35
+ ):
35
36
  parent.formatting.format_range.add(self.format_range)
36
37
 
37
38
  self.space_count = 4
@@ -64,8 +65,8 @@ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, RoboCopTidyMi
64
65
  options: FormattingOptions,
65
66
  **further_options: Any,
66
67
  ) -> Optional[List[TextEdit]]:
67
- if self.robocop_installed and self.robocop_version >= (6, 0):
68
- if not self.is_robocop_notification_shown and self.robotidy_installed:
68
+ if self.parent.robocop_helper.robocop_installed and self.parent.robocop_helper.robocop_version >= (6, 0):
69
+ if not self.is_robocop_notification_shown and self.parent.robocop_helper.robotidy_installed:
69
70
  self.parent.window.show_message(
70
71
  "`robotframework-robocop >= 6.0` is installed and will be used for formatting.\n\n"
71
72
  "`robotframework-tidy` is also detected in the workspace, but its use is redundant.\n"
@@ -78,7 +79,7 @@ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, RoboCopTidyMi
78
79
  return self.format_robocop(document, options, **further_options)
79
80
 
80
81
  tidy_config = self.get_tidy_config(document)
81
- if (tidy_config.enabled or get_robot_version() >= (5, 0)) and self.robotidy_installed:
82
+ if (tidy_config.enabled or get_robot_version() >= (5, 0)) and self.parent.robocop_helper.robotidy_installed:
82
83
  return self.format_robot_tidy(document, options, config=tidy_config, **further_options)
83
84
 
84
85
  if get_robot_version() < (5, 0):
@@ -105,18 +106,18 @@ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, RoboCopTidyMi
105
106
 
106
107
  model = self.parent.documents_cache.get_model(document, False)
107
108
 
108
- if self.robotidy_version >= (3, 0):
109
+ if self.parent.robocop_helper.robotidy_version >= (3, 0):
109
110
  from robotidy.api import get_robotidy
110
111
  from robotidy.disablers import RegisterDisablers
111
112
 
112
- if self.robotidy_version >= (4, 2):
113
+ if self.parent.robocop_helper.robotidy_version >= (4, 2):
113
114
  robot_tidy = get_robotidy(
114
115
  document.uri.to_path(),
115
116
  None,
116
117
  ignore_git_dir=config.ignore_git_dir,
117
118
  config=config.config,
118
119
  )
119
- elif self.robotidy_version >= (4, 1):
120
+ elif self.parent.robocop_helper.robotidy_version >= (4, 1):
120
121
  robot_tidy = get_robotidy(
121
122
  document.uri.to_path(),
122
123
  None,
@@ -135,14 +136,14 @@ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, RoboCopTidyMi
135
136
  )
136
137
  disabler_finder.visit(model)
137
138
 
138
- if self.robotidy_version >= (4, 11):
139
+ if self.parent.robocop_helper.robotidy_version >= (4, 11):
139
140
  if disabler_finder.is_disabled_in_file():
140
141
  return None
141
142
  else:
142
143
  if disabler_finder.file_disabled:
143
144
  return None
144
145
 
145
- if self.robotidy_version >= (4, 0):
146
+ if self.parent.robocop_helper.robotidy_version >= (4, 0):
146
147
  _, _, new, _ = robot_tidy.transform_until_stable(model, disabler_finder)
147
148
  else:
148
149
  _, _, new = robot_tidy.transform(model, disabler_finder.disablers)
@@ -156,7 +157,7 @@ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, RoboCopTidyMi
156
157
  robot_tidy.formatting_config.start_line = range.start.line + 1
157
158
  robot_tidy.formatting_config.end_line = range.end.line + 1
158
159
 
159
- if self.robotidy_version >= (2, 2):
160
+ if self.parent.robocop_helper.robotidy_version >= (2, 2):
160
161
  from robotidy.disablers import RegisterDisablers
161
162
 
162
163
  disabler_finder = RegisterDisablers(
@@ -197,19 +198,13 @@ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, RoboCopTidyMi
197
198
  range: Optional[Range] = None,
198
199
  **further_options: Any,
199
200
  ) -> Optional[List[TextEdit]]:
200
- from robocop.config import ConfigManager
201
201
  from robocop.formatter.runner import RobocopFormatter
202
202
 
203
- robocop_config = self.get_robocop_config(document)
204
203
  workspace_folder = self.parent.workspace.get_workspace_folder(document.uri)
204
+ if workspace_folder is None:
205
+ return None
205
206
 
206
- config_manager = ConfigManager(
207
- [document.uri.to_path()],
208
- root=workspace_folder.uri.to_path() if workspace_folder else None,
209
- config=robocop_config.config_file,
210
- ignore_git_dir=robocop_config.ignore_git_dir,
211
- ignore_file_config=robocop_config.ignore_file_config,
212
- )
207
+ config_manager = self.parent.robocop_helper.get_config_manager(workspace_folder)
213
208
 
214
209
  config = config_manager.get_config_for_source_file(document.uri.to_path())
215
210
 
@@ -284,7 +279,9 @@ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, RoboCopTidyMi
284
279
  **further_options: Any,
285
280
  ) -> Optional[List[TextEdit]]:
286
281
  config = self.get_tidy_config(document)
287
- if (config.enabled and self.robotidy_installed) or (self.robocop_installed and self.robocop_version >= (6, 0)):
282
+ if (config.enabled and self.parent.robocop_helper.robotidy_installed) or (
283
+ self.parent.robocop_helper.robocop_installed and self.parent.robocop_helper.robocop_version >= (6, 0)
284
+ ):
288
285
  return self.format_robot_tidy(document, options, range=range, config=config, **further_options)
289
286
 
290
287
  return None
@@ -73,7 +73,7 @@ class RobotHoverProtocolPart(RobotLanguageServerProtocolPart, ModelHelper):
73
73
  for base in cls.__bases__:
74
74
  method = self._find_method(base)
75
75
  if method:
76
- return cast(_HoverMethod, method)
76
+ return method
77
77
 
78
78
  return None
79
79
 
@@ -61,7 +61,7 @@ class RobotInlayHintProtocolPart(RobotLanguageServerProtocolPart, ModelHelper):
61
61
  for base in cls.__bases__:
62
62
  method = self._find_method(base)
63
63
  if method:
64
- return cast(_HandlerMethod, method)
64
+ return method
65
65
 
66
66
  return None
67
67
 
@@ -10,7 +10,6 @@ from robotcode.jsonrpc2.protocol import rpc_method
10
10
 
11
11
  from ...__version__ import __version__ as robotcode_version
12
12
  from .protocol_part import RobotLanguageServerProtocolPart
13
- from .robocop_tidy_mixin import RoboCopTidyMixin
14
13
 
15
14
  if TYPE_CHECKING:
16
15
  from ..protocol import RobotLanguageServerProtocol
@@ -26,7 +25,7 @@ class ProjectInfo(CamelSnakeMixin):
26
25
  robot_code_version_string: Optional[str] = None
27
26
 
28
27
 
29
- class ProjectInfoPart(RobotLanguageServerProtocolPart, RoboCopTidyMixin):
28
+ class ProjectInfoPart(RobotLanguageServerProtocolPart):
30
29
  _logger = LoggingDescriptor()
31
30
 
32
31
  def __init__(self, parent: "RobotLanguageServerProtocol") -> None:
@@ -40,12 +39,12 @@ class ProjectInfoPart(RobotLanguageServerProtocolPart, RoboCopTidyMixin):
40
39
  **kwargs: Any,
41
40
  ) -> ProjectInfo:
42
41
  robocop_version_string = None
43
- if self.robocop_installed:
44
- robocop_version_string = self.robocop_version_str
42
+ if self.parent.robocop_helper.robocop_installed:
43
+ robocop_version_string = self.parent.robocop_helper.robocop_version_str
45
44
 
46
45
  tidy_version_string = None
47
- if self.robotidy_installed:
48
- tidy_version_string = self.robotidy_version_str
46
+ if self.parent.robocop_helper.robotidy_installed:
47
+ tidy_version_string = self.parent.robocop_helper.robotidy_version_str
49
48
 
50
49
  return ProjectInfo(
51
50
  robot_version_string=get_version(),
@@ -113,7 +113,7 @@ class RobotReferencesProtocolPart(RobotLanguageServerProtocolPart, ModelHelper):
113
113
  for base in cls.__bases__:
114
114
  method = self._find_method(base)
115
115
  if method:
116
- return cast(_ReferencesMethod, method)
116
+ return method
117
117
  return None
118
118
 
119
119
  @language_id("robotframework")
@@ -0,0 +1,260 @@
1
+ import ast
2
+ from typing import (
3
+ TYPE_CHECKING,
4
+ Any,
5
+ Callable,
6
+ List,
7
+ Optional,
8
+ Tuple,
9
+ TypeVar,
10
+ Union,
11
+ cast,
12
+ )
13
+
14
+ from robotcode.core.concurrent import check_current_task_canceled
15
+ from robotcode.core.language import language_id
16
+ from robotcode.core.lsp.types import (
17
+ AnnotatedTextEdit,
18
+ ChangeAnnotation,
19
+ CreateFile,
20
+ DeleteFile,
21
+ OptionalVersionedTextDocumentIdentifier,
22
+ Position,
23
+ PrepareRenameResult,
24
+ PrepareRenameResultType1,
25
+ Range,
26
+ RenameFile,
27
+ TextDocumentEdit,
28
+ WorkspaceEdit,
29
+ )
30
+ from robotcode.core.text_document import TextDocument
31
+ from robotcode.core.utils.logging import LoggingDescriptor
32
+ from robotcode.robot.diagnostics.entities import (
33
+ VariableDefinition,
34
+ VariableDefinitionType,
35
+ )
36
+ from robotcode.robot.diagnostics.library_doc import KeywordDoc
37
+ from robotcode.robot.diagnostics.model_helper import ModelHelper
38
+
39
+ from ...common.parts.rename import CantRenameError
40
+ from .protocol_part import RobotLanguageServerProtocolPart
41
+
42
+ if TYPE_CHECKING:
43
+ from ..protocol import RobotLanguageServerProtocol
44
+
45
+
46
+ _RenameMethod = Callable[[ast.AST, TextDocument, Position, str], Optional[WorkspaceEdit]]
47
+ _PrepareRenameMethod = Callable[[ast.AST, TextDocument, Position], Optional[PrepareRenameResult]]
48
+
49
+ _T = TypeVar("_T", bound=Callable[..., Any])
50
+
51
+
52
+ class RobotRenameProtocolPart(RobotLanguageServerProtocolPart, ModelHelper):
53
+ _logger = LoggingDescriptor()
54
+
55
+ def __init__(self, parent: "RobotLanguageServerProtocol") -> None:
56
+ super().__init__(parent)
57
+
58
+ parent.rename.collect.add(self.collect)
59
+ parent.rename.collect_prepare.add(self.collect_prepare)
60
+
61
+ @language_id("robotframework")
62
+ @_logger.call
63
+ def collect(
64
+ self, sender: Any, document: TextDocument, position: Position, new_name: str
65
+ ) -> Optional[WorkspaceEdit]:
66
+ result = self._rename_variable(document, position, new_name)
67
+ if result:
68
+ return result
69
+
70
+ result = self._rename_keyword(document, position, new_name)
71
+ if result:
72
+ return result
73
+
74
+ return None
75
+
76
+ @language_id("robotframework")
77
+ @_logger.call
78
+ def collect_prepare(self, sender: Any, document: TextDocument, position: Position) -> Optional[PrepareRenameResult]:
79
+ result = self._prepare_rename_variable(document, position)
80
+ if result:
81
+ return result
82
+
83
+ result = self._prepare_rename_keyword(document, position)
84
+ if result:
85
+ return result
86
+
87
+ return None
88
+
89
+ def _prepare_rename_variable(self, document: TextDocument, position: Position) -> Optional[PrepareRenameResult]:
90
+ result = self._find_variable_definition_on_pos(document, position)
91
+ if result is not None:
92
+ var, found_range = result
93
+
94
+ if var.type == VariableDefinitionType.BUILTIN_VARIABLE:
95
+ self.parent.window.show_message("You cannot rename a builtin variable, only references are renamed.")
96
+
97
+ elif var.type == VariableDefinitionType.IMPORTED_VARIABLE:
98
+ self.parent.window.show_message(
99
+ "You are about to rename an imported variable. "
100
+ "Only references are renamed and you have to rename the variable definition yourself."
101
+ )
102
+ elif var.type == VariableDefinitionType.COMMAND_LINE_VARIABLE:
103
+ self.parent.window.show_message(
104
+ "You are about to rename a variable defined at commandline. "
105
+ "Only references are renamed and you have to rename the variable definition yourself."
106
+ )
107
+ elif var.type == VariableDefinitionType.ENVIRONMENT_VARIABLE:
108
+ self.parent.window.show_message(
109
+ "You are about to rename an environment variable. "
110
+ "Only references are renamed and you have to rename the variable definition yourself."
111
+ )
112
+
113
+ return PrepareRenameResultType1(found_range, document.get_text(found_range))
114
+
115
+ return None
116
+
117
+ def _rename_variable(self, document: TextDocument, position: Position, new_name: str) -> Optional[WorkspaceEdit]:
118
+ if " " in new_name or "\t" in new_name:
119
+ raise CantRenameError(
120
+ "Variable names cannot contain more then one spaces or tabs. "
121
+ "Please use only one space or underscores instead.",
122
+ )
123
+
124
+ result = self._find_variable_definition_on_pos(document, position)
125
+
126
+ if result is not None:
127
+ var, _ = result
128
+
129
+ references = self.parent.robot_references.find_variable_references(
130
+ document,
131
+ var,
132
+ include_declaration=var.type
133
+ in [
134
+ VariableDefinitionType.VARIABLE,
135
+ VariableDefinitionType.ARGUMENT,
136
+ VariableDefinitionType.LOCAL_VARIABLE,
137
+ ],
138
+ )
139
+ changes: List[Union[TextDocumentEdit, CreateFile, RenameFile, DeleteFile]] = []
140
+
141
+ for reference in references:
142
+ changes.append(
143
+ TextDocumentEdit(
144
+ OptionalVersionedTextDocumentIdentifier(reference.uri, None),
145
+ [AnnotatedTextEdit("rename_variable", reference.range, new_name)],
146
+ )
147
+ )
148
+
149
+ return WorkspaceEdit(
150
+ document_changes=changes,
151
+ change_annotations={"rename_variable": ChangeAnnotation("Rename Variable", False)},
152
+ )
153
+
154
+ return None
155
+
156
+ def _find_variable_definition_on_pos(
157
+ self, document: TextDocument, position: Position
158
+ ) -> Optional[Tuple[VariableDefinition, Range]]:
159
+ namespace = self.parent.documents_cache.get_namespace(document)
160
+
161
+ all_variable_refs = namespace.get_variable_references()
162
+ if all_variable_refs:
163
+ for variable, var_refs in all_variable_refs.items():
164
+ check_current_task_canceled()
165
+
166
+ found_range = (
167
+ variable.name_range
168
+ if variable.source == namespace.source and position.is_in_range(variable.name_range, False)
169
+ else cast(
170
+ Optional[Range],
171
+ next(
172
+ (r.range for r in var_refs if position.is_in_range(r.range)),
173
+ None,
174
+ ),
175
+ )
176
+ )
177
+
178
+ if found_range is not None:
179
+ return variable, found_range
180
+ return None
181
+
182
+ def _prepare_rename_keyword(self, document: TextDocument, position: Position) -> Optional[PrepareRenameResult]:
183
+ result = self._find_keyword_definition_on_pos(document, position)
184
+ if result is not None:
185
+ kw_doc, found_range = result
186
+
187
+ if kw_doc.is_embedded:
188
+ raise CantRenameError("Renaming of keywords with embedded parameters is not supported.")
189
+
190
+ if kw_doc.is_library_keyword:
191
+ self.parent.window.show_message(
192
+ "You are about to rename a library keyword. "
193
+ "Only references are renamed and you have to rename the keyword definition yourself."
194
+ )
195
+
196
+ return PrepareRenameResultType1(found_range, document.get_text(found_range))
197
+
198
+ return None
199
+
200
+ def _rename_keyword(self, document: TextDocument, position: Position, new_name: str) -> Optional[WorkspaceEdit]:
201
+ if " " in new_name or "\t" in new_name:
202
+ raise CantRenameError(
203
+ "Keyword names cannot contain more then one spaces or tabs. "
204
+ "Please use only one space or underscores instead.",
205
+ )
206
+
207
+ result = self._find_keyword_definition_on_pos(document, position)
208
+ if result is not None:
209
+ kw_doc, _ = result
210
+
211
+ references = self.parent.robot_references.find_keyword_references(
212
+ document,
213
+ kw_doc,
214
+ include_declaration=kw_doc.is_resource_keyword,
215
+ )
216
+ changes: List[Union[TextDocumentEdit, CreateFile, RenameFile, DeleteFile]] = []
217
+
218
+ for reference in references:
219
+ changes.append(
220
+ TextDocumentEdit(
221
+ OptionalVersionedTextDocumentIdentifier(reference.uri, None),
222
+ [AnnotatedTextEdit("rename_keyword", reference.range, new_name)],
223
+ )
224
+ )
225
+
226
+ return WorkspaceEdit(
227
+ document_changes=changes,
228
+ change_annotations={"rename_keyword": ChangeAnnotation("Rename Keyword", False)},
229
+ )
230
+
231
+ return None
232
+
233
+ def _find_keyword_definition_on_pos(
234
+ self, document: TextDocument, position: Position
235
+ ) -> Optional[Tuple[KeywordDoc, Range]]:
236
+ namespace = self.parent.documents_cache.get_namespace(document)
237
+
238
+ all_refs = namespace.get_keyword_references()
239
+ if all_refs:
240
+ for keyword, kw_refs in all_refs.items():
241
+ check_current_task_canceled()
242
+
243
+ found_range = (
244
+ keyword.name_range
245
+ if keyword.source == namespace.source and position.is_in_range(keyword.name_range, False)
246
+ else cast(
247
+ Optional[Range],
248
+ next(
249
+ (r.range for r in kw_refs if position.is_in_range(r.range)),
250
+ None,
251
+ ),
252
+ )
253
+ )
254
+
255
+ if found_range is not None:
256
+ return keyword, found_range
257
+ return None
258
+
259
+ # TODO: rename tags
260
+ # TODO: rename resource files and libraries
@@ -18,7 +18,6 @@ from robotcode.core.workspace import WorkspaceFolder
18
18
  from ...common.parts.diagnostics import DiagnosticsCollectType, DiagnosticsResult
19
19
  from ..configuration import RoboCopConfig
20
20
  from .protocol_part import RobotLanguageServerProtocolPart
21
- from .robocop_tidy_mixin import RoboCopTidyMixin
22
21
 
23
22
  if TYPE_CHECKING:
24
23
  from robocop.linter.runner import RobocopLinter
@@ -26,7 +25,7 @@ if TYPE_CHECKING:
26
25
  from ..protocol import RobotLanguageServerProtocol
27
26
 
28
27
 
29
- class RobotRoboCopDiagnosticsProtocolPart(RobotLanguageServerProtocolPart, RoboCopTidyMixin):
28
+ class RobotRoboCopDiagnosticsProtocolPart(RobotLanguageServerProtocolPart):
30
29
  _logger = LoggingDescriptor()
31
30
 
32
31
  def __init__(self, parent: "RobotLanguageServerProtocol") -> None:
@@ -35,7 +34,7 @@ class RobotRoboCopDiagnosticsProtocolPart(RobotLanguageServerProtocolPart, RoboC
35
34
  self.source_name = "robocop"
36
35
  self._robocop_linters: WeakKeyDictionary[WorkspaceFolder, "RobocopLinter"] = WeakKeyDictionary()
37
36
 
38
- if self.robocop_installed:
37
+ if self.parent.robocop_helper.robocop_installed:
39
38
  parent.diagnostics.collect.add(self.collect_diagnostics)
40
39
 
41
40
  def get_config(self, document: TextDocument) -> Optional[RoboCopConfig]:
@@ -50,18 +49,15 @@ class RobotRoboCopDiagnosticsProtocolPart(RobotLanguageServerProtocolPart, RoboC
50
49
  def collect_diagnostics(
51
50
  self, sender: Any, document: TextDocument, diagnostics_type: DiagnosticsCollectType
52
51
  ) -> Optional[DiagnosticsResult]:
53
- if self.robocop_installed:
52
+ if self.parent.robocop_helper.robocop_installed:
54
53
  workspace_folder = self.parent.workspace.get_workspace_folder(document.uri)
55
54
  if workspace_folder is not None:
56
55
  config = self.get_config(document)
57
56
 
58
57
  if config is not None and config.enabled:
59
- if self.robocop_version >= (6, 0):
58
+ if self.parent.robocop_helper.robocop_version >= (6, 0):
60
59
  # In Robocop 6.0, the diagnostics are collected in a different way
61
- return DiagnosticsResult(
62
- self.collect_diagnostics,
63
- self.collect(document, workspace_folder, config),
64
- )
60
+ return DiagnosticsResult(self.collect_diagnostics, self.collect(document, workspace_folder))
65
61
 
66
62
  return DiagnosticsResult(
67
63
  self.collect_diagnostics,
@@ -71,26 +67,17 @@ class RobotRoboCopDiagnosticsProtocolPart(RobotLanguageServerProtocolPart, RoboC
71
67
  return None
72
68
 
73
69
  @_logger.call
74
- def collect(
75
- self,
76
- document: TextDocument,
77
- workspace_folder: WorkspaceFolder,
78
- extension_config: RoboCopConfig,
79
- ) -> List[Diagnostic]:
80
- from robocop.config import ConfigManager
70
+ def collect(self, document: TextDocument, workspace_folder: WorkspaceFolder) -> List[Diagnostic]:
81
71
  from robocop.linter.rules import RuleSeverity
82
72
  from robocop.linter.runner import RobocopLinter
83
73
 
84
74
  linter = self._robocop_linters.get(workspace_folder, None)
85
75
 
86
76
  if linter is None:
87
- config_manager = ConfigManager(
88
- [],
89
- root=workspace_folder.uri.to_path(),
90
- config=extension_config.config_file,
91
- ignore_git_dir=extension_config.ignore_git_dir,
92
- ignore_file_config=extension_config.ignore_file_config,
93
- )
77
+ config_manager = self.parent.robocop_helper.get_config_manager(workspace_folder)
78
+
79
+ config = config_manager.get_config_for_source_file(document.uri.to_path())
80
+
94
81
  linter = RobocopLinter(config_manager)
95
82
  self._robocop_linters[workspace_folder] = linter
96
83
 
@@ -128,7 +115,7 @@ class RobotRoboCopDiagnosticsProtocolPart(RobotLanguageServerProtocolPart, RoboC
128
115
  ),
129
116
  source=self.source_name,
130
117
  code=f"{diagnostic.rule.rule_id}-{diagnostic.rule.name}",
131
- code_description=self.get_code_description(self.robocop_version, diagnostic),
118
+ code_description=self.get_code_description(self.parent.robocop_helper.robocop_version, diagnostic),
132
119
  )
133
120
  for diagnostic in diagnostics
134
121
  ]