robotcode-language-server 1.3.0.dev2__tar.gz → 1.3.0.dev3__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 (77) hide show
  1. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/PKG-INFO +5 -5
  2. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/pyproject.toml +4 -4
  3. robotcode_language_server-1.3.0.dev3/src/robotcode/language_server/__version__.py +1 -0
  4. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/configuration.py +3 -0
  5. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/formatting.py +81 -34
  6. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/project_info.py +6 -19
  7. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/robocop_diagnostics.py +3 -10
  8. robotcode_language_server-1.3.0.dev3/src/robotcode/language_server/robotframework/parts/robocop_tidy_mixin.py +49 -0
  9. robotcode_language_server-1.3.0.dev2/src/robotcode/language_server/__version__.py +0 -1
  10. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/.gitignore +0 -0
  11. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/LICENSE.txt +0 -0
  12. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/README.md +0 -0
  13. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/__init__.py +0 -0
  14. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/cli.py +0 -0
  15. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/__init__.py +0 -0
  16. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/decorators.py +0 -0
  17. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/__init__.py +0 -0
  18. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/code_action.py +0 -0
  19. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/code_lens.py +0 -0
  20. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/commands.py +0 -0
  21. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/completion.py +0 -0
  22. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/declaration.py +0 -0
  23. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/definition.py +0 -0
  24. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/diagnostics.py +0 -0
  25. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/document_highlight.py +0 -0
  26. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/document_symbols.py +0 -0
  27. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/documents.py +0 -0
  28. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/folding_range.py +0 -0
  29. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/formatting.py +0 -0
  30. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/hover.py +0 -0
  31. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/implementation.py +0 -0
  32. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/inlay_hint.py +0 -0
  33. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/inline_value.py +0 -0
  34. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/linked_editing_ranges.py +0 -0
  35. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/protocol_part.py +0 -0
  36. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/references.py +0 -0
  37. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/rename.py +0 -0
  38. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/selection_range.py +0 -0
  39. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/semantic_tokens.py +0 -0
  40. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/signature_help.py +0 -0
  41. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/window.py +0 -0
  42. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/workspace.py +0 -0
  43. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/parts/workspace_symbols.py +0 -0
  44. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/protocol.py +0 -0
  45. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/common/server.py +0 -0
  46. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/hooks.py +0 -0
  47. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/py.typed +0 -0
  48. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/__init__.py +0 -0
  49. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/__init__.py +0 -0
  50. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/code_action_documentation.py +0 -0
  51. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/code_action_helper_mixin.py +0 -0
  52. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/code_action_quick_fixes.py +0 -0
  53. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/code_action_refactor.py +0 -0
  54. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/code_lens.py +0 -0
  55. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/completion.py +0 -0
  56. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/debugging_utils.py +0 -0
  57. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/diagnostics.py +0 -0
  58. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/document_highlight.py +0 -0
  59. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/document_symbols.py +0 -0
  60. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/documents_cache.py +0 -0
  61. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/folding_range.py +0 -0
  62. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/goto.py +0 -0
  63. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/hover.py +0 -0
  64. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/http_server.py +0 -0
  65. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/inlay_hint.py +0 -0
  66. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/inline_value.py +0 -0
  67. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/keywords_treeview.py +0 -0
  68. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/protocol_part.py +0 -0
  69. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/references.py +0 -0
  70. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/rename.py +0 -0
  71. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/robot_workspace.py +0 -0
  72. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/selection_range.py +0 -0
  73. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/semantic_tokens.py +0 -0
  74. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/signature_help.py +0 -0
  75. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/parts/workspace_symbols.py +0 -0
  76. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/src/robotcode/language_server/robotframework/protocol.py +0 -0
  77. {robotcode_language_server-1.3.0.dev2 → robotcode_language_server-1.3.0.dev3}/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.dev2
3
+ Version: 1.3.0.dev3
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.2
29
- Requires-Dist: robotcode-jsonrpc2==1.3.0-dev.2
30
- Requires-Dist: robotcode-robot==1.3.0-dev.2
31
- Requires-Dist: robotcode==1.3.0-dev.2
28
+ Requires-Dist: robotcode-analyze==1.3.0-dev.3
29
+ Requires-Dist: robotcode-jsonrpc2==1.3.0-dev.3
30
+ Requires-Dist: robotcode-robot==1.3.0-dev.3
31
+ Requires-Dist: robotcode==1.3.0-dev.3
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.2",
31
- "robotcode-robot==1.3.0-dev.2",
32
- "robotcode-analyze==1.3.0-dev.2",
33
- "robotcode==1.3.0-dev.2",
30
+ "robotcode-jsonrpc2==1.3.0-dev.3",
31
+ "robotcode-robot==1.3.0-dev.3",
32
+ "robotcode-analyze==1.3.0-dev.3",
33
+ "robotcode==1.3.0-dev.3",
34
34
  ]
35
35
  dynamic = ["version"]
36
36
 
@@ -0,0 +1 @@
1
+ __version__ = "1.3.0-dev.3"
@@ -33,6 +33,9 @@ class RoboCopConfig(ConfigBase):
33
33
  enabled: bool = True
34
34
  include: List[str] = field(default_factory=list)
35
35
  exclude: List[str] = field(default_factory=list)
36
+ ignore_git_dir: bool = False
37
+ ignore_file_config: bool = False
38
+ config_file: Optional[str] = None
36
39
  configurations: List[str] = field(default_factory=list)
37
40
 
38
41
 
@@ -1,6 +1,5 @@
1
1
  import io
2
2
  import os
3
- import re
4
3
  from concurrent.futures import CancelledError
5
4
  from typing import TYPE_CHECKING, Any, List, Optional, cast
6
5
 
@@ -14,26 +13,17 @@ from robotcode.core.lsp.types import (
14
13
  )
15
14
  from robotcode.core.text_document import TextDocument
16
15
  from robotcode.core.utils.logging import LoggingDescriptor
17
- from robotcode.core.utils.version import create_version_from_str
18
- from robotcode.robot.diagnostics.model_helper import ModelHelper
19
16
  from robotcode.robot.utils import get_robot_version
20
17
 
21
- from ..configuration import RoboTidyConfig
18
+ from ..configuration import RoboCopConfig, RoboTidyConfig
22
19
  from .protocol_part import RobotLanguageServerProtocolPart
20
+ from .robocop_tidy_mixin import RoboCopTidyMixin
23
21
 
24
22
  if TYPE_CHECKING:
25
23
  from ..protocol import RobotLanguageServerProtocol
26
24
 
27
25
 
28
- def robotidy_installed() -> bool:
29
- try:
30
- __import__("robotidy")
31
- except ImportError:
32
- return False
33
- return True
34
-
35
-
36
- class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, ModelHelper):
26
+ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, RoboCopTidyMixin):
37
27
  _logger = LoggingDescriptor()
38
28
 
39
29
  def __init__(self, parent: "RobotLanguageServerProtocol") -> None:
@@ -41,7 +31,7 @@ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, ModelHelper):
41
31
 
42
32
  parent.formatting.format.add(self.format)
43
33
 
44
- if robotidy_installed():
34
+ if self.robotidy_installed or (self.robocop_installed and self.robocop_version >= (6, 0)):
45
35
  parent.formatting.format_range.add(self.format_range)
46
36
 
47
37
  self.space_count = 4
@@ -49,14 +39,22 @@ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, ModelHelper):
49
39
  self.line_separator = os.linesep
50
40
  self.short_test_name_length = 18
51
41
  self.setting_and_variable_name_length = 14
42
+ self.robocop_installed_message_shown = False
52
43
 
53
- def get_config(self, document: TextDocument) -> RoboTidyConfig:
44
+ def get_tidy_config(self, document: TextDocument) -> RoboTidyConfig:
54
45
  folder = self.parent.workspace.get_workspace_folder(document.uri)
55
46
  if folder is None:
56
47
  return RoboTidyConfig()
57
48
 
58
49
  return self.parent.workspace.get_configuration(RoboTidyConfig, folder.uri)
59
50
 
51
+ def get_robocop_config(self, document: TextDocument) -> RoboCopConfig:
52
+ folder = self.parent.workspace.get_workspace_folder(document.uri)
53
+ if folder is None:
54
+ return RoboCopConfig()
55
+
56
+ return self.parent.workspace.get_configuration(RoboCopConfig, folder.uri)
57
+
60
58
  @language_id("robotframework")
61
59
  @_logger.call
62
60
  def format(
@@ -66,23 +64,32 @@ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, ModelHelper):
66
64
  options: FormattingOptions,
67
65
  **further_options: Any,
68
66
  ) -> Optional[List[TextEdit]]:
69
- config = self.get_config(document)
67
+ if (get_robot_version() >= (5, 0)) and self.robocop_installed and self.robocop_version >= (6, 0):
68
+ if not self.robocop_installed_message_shown and self.robotidy_installed:
69
+ self.parent.window.show_message(
70
+ "`robotframework-robocop >= 6.0` is installed and will be used for formatting.\n"
71
+ "`robotframework-tidy` is also detected in the workspace. "
72
+ "It is not needed as `robocop` handles formatting tasks.\n",
73
+ MessageType.INFO,
74
+ )
75
+ self.robocop_installed_message_shown = True
70
76
 
71
- if (config.enabled or get_robot_version() >= (5, 0)) and robotidy_installed():
72
- return self.format_robot_tidy(document, options, config=config, **further_options)
77
+ return self.format_robocop(document, options, **further_options)
78
+
79
+ tidy_config = self.get_tidy_config(document)
80
+ if (tidy_config.enabled or get_robot_version() >= (5, 0)) and self.robotidy_installed:
81
+ return self.format_robot_tidy(document, options, config=tidy_config, **further_options)
73
82
 
74
83
  if get_robot_version() < (5, 0):
75
84
  return self.format_internal(document, options, **further_options)
76
85
 
77
86
  self.parent.window.show_message(
78
- "RobotFramework formatter is not available, please install 'robotframework-tidy'.",
87
+ "RobotFramework formatter is not available, please install 'robotframework-robocop'.",
79
88
  MessageType.ERROR,
80
89
  )
81
90
 
82
91
  return None
83
92
 
84
- RE_LINEBREAKS = re.compile(r"\r\n|\r|\n")
85
-
86
93
  def format_robot_tidy(
87
94
  self,
88
95
  document: TextDocument,
@@ -91,28 +98,24 @@ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, ModelHelper):
91
98
  config: Optional[RoboTidyConfig] = None,
92
99
  **further_options: Any,
93
100
  ) -> Optional[List[TextEdit]]:
94
- from robotidy.version import __version__
95
-
96
101
  try:
97
102
  if config is None:
98
- config = self.get_config(document)
99
-
100
- robotidy_version = create_version_from_str(__version__)
103
+ config = self.get_tidy_config(document)
101
104
 
102
105
  model = self.parent.documents_cache.get_model(document, False)
103
106
 
104
- if robotidy_version >= (3, 0):
107
+ if self.robotidy_version >= (3, 0):
105
108
  from robotidy.api import get_robotidy
106
109
  from robotidy.disablers import RegisterDisablers
107
110
 
108
- if robotidy_version >= (4, 2):
111
+ if self.robotidy_version >= (4, 2):
109
112
  robot_tidy = get_robotidy(
110
113
  document.uri.to_path(),
111
114
  None,
112
115
  ignore_git_dir=config.ignore_git_dir,
113
116
  config=config.config,
114
117
  )
115
- elif robotidy_version >= (4, 1):
118
+ elif self.robotidy_version >= (4, 1):
116
119
  robot_tidy = get_robotidy(
117
120
  document.uri.to_path(),
118
121
  None,
@@ -131,14 +134,14 @@ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, ModelHelper):
131
134
  )
132
135
  disabler_finder.visit(model)
133
136
 
134
- if robotidy_version >= (4, 11):
137
+ if self.robotidy_version >= (4, 11):
135
138
  if disabler_finder.is_disabled_in_file():
136
139
  return None
137
140
  else:
138
141
  if disabler_finder.file_disabled:
139
142
  return None
140
143
 
141
- if robotidy_version >= (4, 0):
144
+ if self.robotidy_version >= (4, 0):
142
145
  _, _, new, _ = robot_tidy.transform_until_stable(model, disabler_finder)
143
146
  else:
144
147
  _, _, new = robot_tidy.transform(model, disabler_finder.disablers)
@@ -152,7 +155,7 @@ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, ModelHelper):
152
155
  robot_tidy.formatting_config.start_line = range.start.line + 1
153
156
  robot_tidy.formatting_config.end_line = range.end.line + 1
154
157
 
155
- if robotidy_version >= (2, 2):
158
+ if self.robotidy_version >= (2, 2):
156
159
  from robotidy.disablers import RegisterDisablers
157
160
 
158
161
  disabler_finder = RegisterDisablers(
@@ -186,6 +189,50 @@ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, ModelHelper):
186
189
  self.parent.window.show_message(f"Executing `robotidy` failed: {e}", MessageType.ERROR)
187
190
  return None
188
191
 
192
+ def format_robocop(
193
+ self,
194
+ document: TextDocument,
195
+ options: FormattingOptions,
196
+ range: Optional[Range] = None,
197
+ **further_options: Any,
198
+ ) -> Optional[List[TextEdit]]:
199
+ from robocop.config import ConfigManager
200
+ from robocop.formatter.runner import RobocopFormatter
201
+
202
+ robocop_config = self.get_robocop_config(document)
203
+
204
+ config_manager = ConfigManager(
205
+ [document.uri.to_path()],
206
+ config=robocop_config.config_file,
207
+ ignore_git_dir=robocop_config.ignore_git_dir,
208
+ ignore_file_config=robocop_config.ignore_file_config,
209
+ )
210
+
211
+ config = config_manager.get_config_for_source_file(document.uri.to_path())
212
+
213
+ if range is not None:
214
+ config.formatter.start_line = range.start.line + 1
215
+ config.formatter.end_line = range.end.line + 1
216
+
217
+ runner = RobocopFormatter(config_manager)
218
+ runner.config = config
219
+
220
+ model = self.parent.documents_cache.get_model(document, False)
221
+ _, _, new, _ = runner.format_until_stable(model)
222
+
223
+ if new.text == document.text():
224
+ return None
225
+
226
+ return [
227
+ TextEdit(
228
+ range=Range(
229
+ start=Position(line=0, character=0),
230
+ end=Position(line=len(document.get_lines()), character=0),
231
+ ),
232
+ new_text=new.text,
233
+ )
234
+ ]
235
+
189
236
  def format_internal(
190
237
  self,
191
238
  document: TextDocument,
@@ -233,8 +280,8 @@ class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart, ModelHelper):
233
280
  options: FormattingOptions,
234
281
  **further_options: Any,
235
282
  ) -> Optional[List[TextEdit]]:
236
- config = self.get_config(document)
237
- if config.enabled and robotidy_installed():
283
+ config = self.get_tidy_config(document)
284
+ if (config.enabled and self.robotidy_installed) or (self.robocop_installed and self.robocop_version >= (6, 0)):
238
285
  return self.format_robot_tidy(document, options, range=range, config=config, **further_options)
239
286
 
240
287
  return None
@@ -7,9 +7,8 @@ from robotcode.core.utils.dataclasses import CamelSnakeMixin
7
7
  from robotcode.core.utils.logging import LoggingDescriptor
8
8
  from robotcode.jsonrpc2.protocol import rpc_method
9
9
 
10
- from .formatting import robotidy_installed
11
10
  from .protocol_part import RobotLanguageServerProtocolPart
12
- from .robocop_diagnostics import robocop_installed
11
+ from .robocop_tidy_mixin import RoboCopTidyMixin
13
12
 
14
13
  if TYPE_CHECKING:
15
14
  from ..protocol import RobotLanguageServerProtocol
@@ -22,7 +21,7 @@ class ProjectInfo(CamelSnakeMixin):
22
21
  tidy_version_string: Optional[str] = None
23
22
 
24
23
 
25
- class ProjectInfoPart(RobotLanguageServerProtocolPart):
24
+ class ProjectInfoPart(RobotLanguageServerProtocolPart, RoboCopTidyMixin):
26
25
  _logger = LoggingDescriptor()
27
26
 
28
27
  def __init__(self, parent: "RobotLanguageServerProtocol") -> None:
@@ -36,24 +35,12 @@ class ProjectInfoPart(RobotLanguageServerProtocolPart):
36
35
  **kwargs: Any,
37
36
  ) -> ProjectInfo:
38
37
  robocop_version_string = None
39
- if robocop_installed():
40
- try:
41
- from robocop.version import __version__
42
-
43
- robocop_version_string = __version__
44
- except ImportError:
45
- try:
46
- from robocop import __version__
47
-
48
- robocop_version_string = __version__
49
- except ImportError:
50
- pass
38
+ if self.robocop_installed:
39
+ robocop_version_string = self.robocop_version_str
51
40
 
52
41
  tidy_version_string = None
53
- if robotidy_installed():
54
- from robotidy.version import __version__
55
-
56
- tidy_version_string = __version__
42
+ if self.robotidy_installed:
43
+ tidy_version_string = self.robotidy_version_str
57
44
 
58
45
  return ProjectInfo(
59
46
  robot_version_string=get_version(),
@@ -17,20 +17,13 @@ from robotcode.core.workspace import WorkspaceFolder
17
17
  from ...common.parts.diagnostics import DiagnosticsCollectType, DiagnosticsResult
18
18
  from ..configuration import RoboCopConfig
19
19
  from .protocol_part import RobotLanguageServerProtocolPart
20
+ from .robocop_tidy_mixin import RoboCopTidyMixin
20
21
 
21
22
  if TYPE_CHECKING:
22
23
  from ..protocol import RobotLanguageServerProtocol
23
24
 
24
25
 
25
- def robocop_installed() -> bool:
26
- try:
27
- __import__("robocop")
28
- except ImportError:
29
- return False
30
- return True
31
-
32
-
33
- class RobotRoboCopDiagnosticsProtocolPart(RobotLanguageServerProtocolPart):
26
+ class RobotRoboCopDiagnosticsProtocolPart(RobotLanguageServerProtocolPart, RoboCopTidyMixin):
34
27
  _logger = LoggingDescriptor()
35
28
 
36
29
  def __init__(self, parent: "RobotLanguageServerProtocol") -> None:
@@ -38,7 +31,7 @@ class RobotRoboCopDiagnosticsProtocolPart(RobotLanguageServerProtocolPart):
38
31
 
39
32
  self.source_name = "robocop"
40
33
 
41
- if robocop_installed():
34
+ if self.robocop_installed and self.robocop_version < (6, 0):
42
35
  parent.diagnostics.collect.add(self.collect_diagnostics)
43
36
 
44
37
  def get_config(self, document: TextDocument) -> Optional[RoboCopConfig]:
@@ -0,0 +1,49 @@
1
+ import functools
2
+
3
+ from robotcode.core.utils.version import Version, create_version_from_str
4
+
5
+
6
+ class RoboCopTidyMixin:
7
+ """
8
+ Mixin class for handling Robocop tidy operations.
9
+ """
10
+
11
+ @functools.cached_property
12
+ def robotidy_installed(self) -> bool:
13
+ try:
14
+ __import__("robotidy")
15
+ except ImportError:
16
+ return False
17
+ return True
18
+
19
+ @functools.cached_property
20
+ def robotidy_version(self) -> Version:
21
+ from robotidy.version import __version__
22
+
23
+ return create_version_from_str(__version__)
24
+
25
+ @functools.cached_property
26
+ def robotidy_version_str(self) -> str:
27
+ from robotidy.version import __version__
28
+
29
+ return str(__version__)
30
+
31
+ @functools.cached_property
32
+ def robocop_installed(self) -> bool:
33
+ try:
34
+ __import__("robocop")
35
+ except ImportError:
36
+ return False
37
+ return True
38
+
39
+ @functools.cached_property
40
+ def robocop_version(self) -> Version:
41
+ from robocop import __version__
42
+
43
+ return create_version_from_str(__version__)
44
+
45
+ @functools.cached_property
46
+ def robocop_version_str(self) -> str:
47
+ from robocop import __version__
48
+
49
+ return str(__version__)
@@ -1 +0,0 @@
1
- __version__ = "1.3.0-dev.2"