robotcode-language-server 1.9.0__tar.gz → 2.0.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.
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/PKG-INFO +9 -8
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/pyproject.toml +10 -9
- robotcode_language_server-2.0.0/src/robotcode/language_server/__version__.py +1 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/configuration.py +0 -8
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/completion.py +3 -3
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/folding_range.py +4 -0
- robotcode_language_server-2.0.0/src/robotcode/language_server/robotframework/parts/formatting.py +161 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/project_info.py +0 -6
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/robocop_helper.py +0 -20
- robotcode_language_server-1.9.0/src/robotcode/language_server/__version__.py +0 -1
- robotcode_language_server-1.9.0/src/robotcode/language_server/robotframework/parts/formatting.py +0 -287
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/.gitignore +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/README.md +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/__init__.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/cli.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/__init__.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/decorators.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/__init__.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/code_action.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/code_lens.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/commands.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/completion.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/declaration.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/definition.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/diagnostics.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/document_highlight.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/document_symbols.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/documents.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/folding_range.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/formatting.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/hover.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/implementation.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/inlay_hint.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/inline_value.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/linked_editing_ranges.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/protocol_part.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/references.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/rename.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/selection_range.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/semantic_tokens.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/signature_help.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/window.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/workspace.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/parts/workspace_symbols.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/protocol.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/common/server.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/hooks.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/py.typed +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/__init__.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/__init__.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/code_action_documentation.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/code_action_helper_mixin.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/code_action_quick_fixes.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/code_action_refactor.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/code_lens.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/debugging_utils.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/diagnostics.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/document_highlight.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/document_symbols.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/documents_cache.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/goto.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/hover.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/http_server.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/inlay_hint.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/inline_value.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/keywords_treeview.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/protocol_part.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/references.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/rename.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/robocop_diagnostics.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/robot_workspace.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/selection_range.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/semantic_tokens.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/signature_help.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/parts/workspace_symbols.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.0}/src/robotcode/language_server/robotframework/protocol.py +0 -0
- {robotcode_language_server-1.9.0 → robotcode_language_server-2.0.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:
|
|
3
|
+
Version: 2.0.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
|
|
@@ -15,19 +15,20 @@ Classifier: Framework :: Robot Framework
|
|
|
15
15
|
Classifier: Framework :: Robot Framework :: Tool
|
|
16
16
|
Classifier: Operating System :: OS Independent
|
|
17
17
|
Classifier: Programming Language :: Python
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
20
18
|
Classifier: Programming Language :: Python :: 3.10
|
|
21
19
|
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
22
23
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
23
24
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
24
25
|
Classifier: Topic :: Utilities
|
|
25
26
|
Classifier: Typing :: Typed
|
|
26
|
-
Requires-Python: >=3.
|
|
27
|
-
Requires-Dist: robotcode-analyze==
|
|
28
|
-
Requires-Dist: robotcode-jsonrpc2==
|
|
29
|
-
Requires-Dist: robotcode-robot==
|
|
30
|
-
Requires-Dist: robotcode==
|
|
27
|
+
Requires-Python: >=3.10
|
|
28
|
+
Requires-Dist: robotcode-analyze==2.0.0
|
|
29
|
+
Requires-Dist: robotcode-jsonrpc2==2.0.0
|
|
30
|
+
Requires-Dist: robotcode-robot==2.0.0
|
|
31
|
+
Requires-Dist: robotcode==2.0.0
|
|
31
32
|
Requires-Dist: robotframework>=4.1.0
|
|
32
33
|
Description-Content-Type: text/markdown
|
|
33
34
|
|
|
@@ -6,17 +6,18 @@ build-backend = "hatchling.build"
|
|
|
6
6
|
name = "robotcode-language-server"
|
|
7
7
|
description = 'RobotCode Language Server for Robot Framework'
|
|
8
8
|
readme = { "file" = "README.md", "content-type" = "text/markdown" }
|
|
9
|
-
requires-python = ">=3.
|
|
9
|
+
requires-python = ">=3.10"
|
|
10
10
|
license = {text = "Apache-2.0"}
|
|
11
11
|
keywords = []
|
|
12
12
|
authors = [{ name = "Daniel Biehl", email = "dbiehl@live.de" }]
|
|
13
13
|
classifiers = [
|
|
14
14
|
"Development Status :: 5 - Production/Stable",
|
|
15
15
|
"Programming Language :: Python",
|
|
16
|
-
"Programming Language :: Python :: 3.8",
|
|
17
|
-
"Programming Language :: Python :: 3.9",
|
|
18
16
|
"Programming Language :: Python :: 3.10",
|
|
19
17
|
"Programming Language :: Python :: 3.11",
|
|
18
|
+
"Programming Language :: Python :: 3.12",
|
|
19
|
+
"Programming Language :: Python :: 3.13",
|
|
20
|
+
"Programming Language :: Python :: 3.14",
|
|
20
21
|
"Programming Language :: Python :: Implementation :: CPython",
|
|
21
22
|
"Programming Language :: Python :: Implementation :: PyPy",
|
|
22
23
|
"Operating System :: OS Independent",
|
|
@@ -27,10 +28,10 @@ classifiers = [
|
|
|
27
28
|
]
|
|
28
29
|
dependencies = [
|
|
29
30
|
"robotframework>=4.1.0",
|
|
30
|
-
"robotcode-jsonrpc2==
|
|
31
|
-
"robotcode-robot==
|
|
32
|
-
"robotcode-analyze==
|
|
33
|
-
"robotcode==
|
|
31
|
+
"robotcode-jsonrpc2==2.0.0",
|
|
32
|
+
"robotcode-robot==2.0.0",
|
|
33
|
+
"robotcode-analyze==2.0.0",
|
|
34
|
+
"robotcode==2.0.0",
|
|
34
35
|
]
|
|
35
36
|
dynamic = ["version"]
|
|
36
37
|
|
|
@@ -53,11 +54,11 @@ dev-mode-dirs = ["src"]
|
|
|
53
54
|
|
|
54
55
|
[tool.hatch.build.targets.wheel]
|
|
55
56
|
only-include = ["src/robotcode"]
|
|
56
|
-
|
|
57
|
+
|
|
57
58
|
|
|
58
59
|
[tool.hatch.build.targets.sdist]
|
|
59
60
|
only-include = ["src"]
|
|
60
61
|
|
|
61
62
|
[tool.hatch.envs.build]
|
|
62
63
|
detached = true
|
|
63
|
-
python = "
|
|
64
|
+
python = "310"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.0.0"
|
|
@@ -39,14 +39,6 @@ class RoboCopConfig(ConfigBase):
|
|
|
39
39
|
configurations: List[str] = field(default_factory=list)
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
@config_section("robotcode.robotidy")
|
|
43
|
-
@dataclass
|
|
44
|
-
class RoboTidyConfig(ConfigBase):
|
|
45
|
-
enabled: bool = True
|
|
46
|
-
ignore_git_dir: bool = False
|
|
47
|
-
config: Optional[str] = None
|
|
48
|
-
|
|
49
|
-
|
|
50
42
|
@config_section("robotcode.documentationServer")
|
|
51
43
|
@dataclass
|
|
52
44
|
class DocumentationServerConfig(ConfigBase):
|
|
@@ -1739,7 +1739,7 @@ class CompletionCollector(ModelHelper):
|
|
|
1739
1739
|
)
|
|
1740
1740
|
),
|
|
1741
1741
|
detail=e.kind.value,
|
|
1742
|
-
sort_text=f"030_{e}",
|
|
1742
|
+
sort_text=f"030_{e.label}",
|
|
1743
1743
|
insert_text_format=InsertTextFormat.PLAIN_TEXT,
|
|
1744
1744
|
text_edit=TextEdit(range=r, new_text=e.label) if r is not None else None,
|
|
1745
1745
|
data=CompletionItemData(
|
|
@@ -1936,7 +1936,7 @@ class CompletionCollector(ModelHelper):
|
|
|
1936
1936
|
)
|
|
1937
1937
|
),
|
|
1938
1938
|
detail=e.kind.value,
|
|
1939
|
-
sort_text=f"030_{e}",
|
|
1939
|
+
sort_text=f"030_{e.label}",
|
|
1940
1940
|
insert_text_format=InsertTextFormat.PLAIN_TEXT,
|
|
1941
1941
|
text_edit=TextEdit(range=r, new_text=e.label) if r is not None else None,
|
|
1942
1942
|
data=CompletionItemData(
|
|
@@ -2060,7 +2060,7 @@ class CompletionCollector(ModelHelper):
|
|
|
2060
2060
|
)
|
|
2061
2061
|
),
|
|
2062
2062
|
detail=e.kind.value,
|
|
2063
|
-
sort_text=f"030_{e}",
|
|
2063
|
+
sort_text=f"030_{e.label}",
|
|
2064
2064
|
insert_text_format=InsertTextFormat.PLAIN_TEXT,
|
|
2065
2065
|
text_edit=TextEdit(range=r, new_text=e.label) if r is not None else None,
|
|
2066
2066
|
data=CompletionItemData(
|
|
@@ -83,6 +83,10 @@ class _Visitor(Visitor):
|
|
|
83
83
|
self.__append(node, kind="comment")
|
|
84
84
|
self.generic_visit(node)
|
|
85
85
|
|
|
86
|
+
def visit_Documentation(self, node: ast.AST) -> None: # noqa: N802
|
|
87
|
+
self.__append(node, kind="documentation")
|
|
88
|
+
self.generic_visit(node)
|
|
89
|
+
|
|
86
90
|
def visit_TestCase(self, node: TestCase) -> None: # noqa: N802
|
|
87
91
|
if node.name:
|
|
88
92
|
self.__append(node, kind="testcase")
|
robotcode_language_server-2.0.0/src/robotcode/language_server/robotframework/parts/formatting.py
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import io
|
|
2
|
+
import os
|
|
3
|
+
from typing import TYPE_CHECKING, Any, List, Optional, cast
|
|
4
|
+
|
|
5
|
+
from robotcode.core.language import language_id
|
|
6
|
+
from robotcode.core.lsp.types import (
|
|
7
|
+
FormattingOptions,
|
|
8
|
+
MessageType,
|
|
9
|
+
Position,
|
|
10
|
+
Range,
|
|
11
|
+
TextEdit,
|
|
12
|
+
)
|
|
13
|
+
from robotcode.core.text_document import TextDocument
|
|
14
|
+
from robotcode.core.utils.logging import LoggingDescriptor
|
|
15
|
+
from robotcode.robot.utils import get_robot_version
|
|
16
|
+
|
|
17
|
+
from ..configuration import RoboCopConfig
|
|
18
|
+
from .protocol_part import RobotLanguageServerProtocolPart
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from ..protocol import RobotLanguageServerProtocol
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart):
|
|
25
|
+
_logger = LoggingDescriptor()
|
|
26
|
+
|
|
27
|
+
def __init__(self, parent: "RobotLanguageServerProtocol") -> None:
|
|
28
|
+
super().__init__(parent)
|
|
29
|
+
|
|
30
|
+
parent.formatting.format.add(self.format)
|
|
31
|
+
|
|
32
|
+
if self.parent.robocop_helper.robocop_installed and self.parent.robocop_helper.robocop_version >= (6, 0):
|
|
33
|
+
parent.formatting.format_range.add(self.format_range)
|
|
34
|
+
|
|
35
|
+
self.space_count = 4
|
|
36
|
+
self.use_pipes = False
|
|
37
|
+
self.line_separator = os.linesep
|
|
38
|
+
self.short_test_name_length = 18
|
|
39
|
+
self.setting_and_variable_name_length = 14
|
|
40
|
+
self.is_robocop_notification_shown = False
|
|
41
|
+
|
|
42
|
+
def get_robocop_config(self, document: TextDocument) -> RoboCopConfig:
|
|
43
|
+
folder = self.parent.workspace.get_workspace_folder(document.uri)
|
|
44
|
+
if folder is None:
|
|
45
|
+
return RoboCopConfig()
|
|
46
|
+
|
|
47
|
+
return self.parent.workspace.get_configuration(RoboCopConfig, folder.uri)
|
|
48
|
+
|
|
49
|
+
@language_id("robotframework")
|
|
50
|
+
@_logger.call
|
|
51
|
+
def format(
|
|
52
|
+
self,
|
|
53
|
+
sender: Any,
|
|
54
|
+
document: TextDocument,
|
|
55
|
+
options: FormattingOptions,
|
|
56
|
+
**further_options: Any,
|
|
57
|
+
) -> Optional[List[TextEdit]]:
|
|
58
|
+
if self.parent.robocop_helper.robocop_installed and self.parent.robocop_helper.robocop_version >= (6, 0):
|
|
59
|
+
return self.format_robocop(document, options, **further_options)
|
|
60
|
+
|
|
61
|
+
if get_robot_version() < (5, 0):
|
|
62
|
+
return self.format_internal(document, options, **further_options)
|
|
63
|
+
|
|
64
|
+
self.parent.window.show_message(
|
|
65
|
+
"RobotFramework formatter is not available, please install 'robotframework-robocop'.",
|
|
66
|
+
MessageType.ERROR,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
def format_robocop(
|
|
72
|
+
self,
|
|
73
|
+
document: TextDocument,
|
|
74
|
+
options: FormattingOptions,
|
|
75
|
+
range: Optional[Range] = None,
|
|
76
|
+
**further_options: Any,
|
|
77
|
+
) -> Optional[List[TextEdit]]:
|
|
78
|
+
from robocop.formatter.runner import RobocopFormatter
|
|
79
|
+
|
|
80
|
+
workspace_folder = self.parent.workspace.get_workspace_folder(document.uri)
|
|
81
|
+
if workspace_folder is None:
|
|
82
|
+
return None
|
|
83
|
+
|
|
84
|
+
config_manager = self.parent.robocop_helper.get_config_manager(workspace_folder)
|
|
85
|
+
|
|
86
|
+
config = config_manager.get_config_for_source_file(document.uri.to_path())
|
|
87
|
+
|
|
88
|
+
if range is not None:
|
|
89
|
+
config.formatter.start_line = range.start.line + 1
|
|
90
|
+
config.formatter.end_line = range.end.line + 1
|
|
91
|
+
|
|
92
|
+
runner = RobocopFormatter(config_manager)
|
|
93
|
+
runner.config = config
|
|
94
|
+
|
|
95
|
+
model = self.parent.documents_cache.get_model(document, False)
|
|
96
|
+
_, _, new, _ = runner.format_until_stable(model)
|
|
97
|
+
|
|
98
|
+
if new.text == document.text():
|
|
99
|
+
return None
|
|
100
|
+
|
|
101
|
+
return [
|
|
102
|
+
TextEdit(
|
|
103
|
+
range=Range(
|
|
104
|
+
start=Position(line=0, character=0),
|
|
105
|
+
end=Position(line=len(document.get_lines()), character=0),
|
|
106
|
+
),
|
|
107
|
+
new_text=new.text,
|
|
108
|
+
)
|
|
109
|
+
]
|
|
110
|
+
|
|
111
|
+
def format_internal(
|
|
112
|
+
self,
|
|
113
|
+
document: TextDocument,
|
|
114
|
+
options: FormattingOptions,
|
|
115
|
+
**further_options: Any,
|
|
116
|
+
) -> Optional[List[TextEdit]]:
|
|
117
|
+
from robot.parsing.model.blocks import File
|
|
118
|
+
from robot.tidypkg import ( # pyright: ignore [reportMissingImports]
|
|
119
|
+
Aligner,
|
|
120
|
+
Cleaner,
|
|
121
|
+
NewlineNormalizer,
|
|
122
|
+
SeparatorNormalizer,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
model = cast(File, self.parent.documents_cache.get_model(document, False))
|
|
126
|
+
|
|
127
|
+
Cleaner().visit(model)
|
|
128
|
+
NewlineNormalizer(self.line_separator, self.short_test_name_length).visit(model)
|
|
129
|
+
SeparatorNormalizer(self.use_pipes, self.space_count).visit(model)
|
|
130
|
+
Aligner(
|
|
131
|
+
self.short_test_name_length,
|
|
132
|
+
self.setting_and_variable_name_length,
|
|
133
|
+
self.use_pipes,
|
|
134
|
+
).visit(model)
|
|
135
|
+
|
|
136
|
+
with io.StringIO() as s:
|
|
137
|
+
model.save(s)
|
|
138
|
+
|
|
139
|
+
return [
|
|
140
|
+
TextEdit(
|
|
141
|
+
range=Range(
|
|
142
|
+
start=Position(line=0, character=0),
|
|
143
|
+
end=Position(line=len(document.get_lines()), character=0),
|
|
144
|
+
),
|
|
145
|
+
new_text=s.getvalue(),
|
|
146
|
+
)
|
|
147
|
+
]
|
|
148
|
+
|
|
149
|
+
@language_id("robotframework")
|
|
150
|
+
def format_range(
|
|
151
|
+
self,
|
|
152
|
+
sender: Any,
|
|
153
|
+
document: TextDocument,
|
|
154
|
+
range: Range,
|
|
155
|
+
options: FormattingOptions,
|
|
156
|
+
**further_options: Any,
|
|
157
|
+
) -> Optional[List[TextEdit]]:
|
|
158
|
+
if self.parent.robocop_helper.robocop_installed and self.parent.robocop_helper.robocop_version >= (6, 0):
|
|
159
|
+
return self.format_robocop(document, options, range=range, **further_options)
|
|
160
|
+
|
|
161
|
+
return None
|
|
@@ -19,7 +19,6 @@ if TYPE_CHECKING:
|
|
|
19
19
|
class ProjectInfo(CamelSnakeMixin):
|
|
20
20
|
robot_version_string: str
|
|
21
21
|
robocop_version_string: Optional[str]
|
|
22
|
-
tidy_version_string: Optional[str] = None
|
|
23
22
|
python_version_string: Optional[str] = None
|
|
24
23
|
python_executable: Optional[str] = None
|
|
25
24
|
robot_code_version_string: Optional[str] = None
|
|
@@ -42,14 +41,9 @@ class ProjectInfoPart(RobotLanguageServerProtocolPart):
|
|
|
42
41
|
if self.parent.robocop_helper.robocop_installed:
|
|
43
42
|
robocop_version_string = self.parent.robocop_helper.robocop_version_str
|
|
44
43
|
|
|
45
|
-
tidy_version_string = None
|
|
46
|
-
if self.parent.robocop_helper.robotidy_installed:
|
|
47
|
-
tidy_version_string = self.parent.robocop_helper.robotidy_version_str
|
|
48
|
-
|
|
49
44
|
return ProjectInfo(
|
|
50
45
|
robot_version_string=get_version(),
|
|
51
46
|
robocop_version_string=robocop_version_string,
|
|
52
|
-
tidy_version_string=tidy_version_string,
|
|
53
47
|
python_version_string=sys.version,
|
|
54
48
|
python_executable=sys.executable,
|
|
55
49
|
robot_code_version_string=robotcode_version,
|
|
@@ -29,26 +29,6 @@ class RoboCopHelper(RobotLanguageServerProtocolPart):
|
|
|
29
29
|
super().__init__(parent)
|
|
30
30
|
self._config_managers: Dict[WorkspaceFolder, "ConfigManager"] = {}
|
|
31
31
|
|
|
32
|
-
@functools.cached_property
|
|
33
|
-
def robotidy_installed(self) -> bool:
|
|
34
|
-
try:
|
|
35
|
-
__import__("robotidy")
|
|
36
|
-
except ImportError:
|
|
37
|
-
return False
|
|
38
|
-
return True
|
|
39
|
-
|
|
40
|
-
@functools.cached_property
|
|
41
|
-
def robotidy_version(self) -> Version:
|
|
42
|
-
from robotidy.version import __version__
|
|
43
|
-
|
|
44
|
-
return create_version_from_str(__version__)
|
|
45
|
-
|
|
46
|
-
@functools.cached_property
|
|
47
|
-
def robotidy_version_str(self) -> str:
|
|
48
|
-
from robotidy.version import __version__
|
|
49
|
-
|
|
50
|
-
return str(__version__)
|
|
51
|
-
|
|
52
32
|
@functools.cached_property
|
|
53
33
|
def robocop_installed(self) -> bool:
|
|
54
34
|
try:
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "1.9.0"
|
robotcode_language_server-1.9.0/src/robotcode/language_server/robotframework/parts/formatting.py
DELETED
|
@@ -1,287 +0,0 @@
|
|
|
1
|
-
import io
|
|
2
|
-
import os
|
|
3
|
-
from concurrent.futures import CancelledError
|
|
4
|
-
from typing import TYPE_CHECKING, Any, List, Optional, cast
|
|
5
|
-
|
|
6
|
-
from robotcode.core.language import language_id
|
|
7
|
-
from robotcode.core.lsp.types import (
|
|
8
|
-
FormattingOptions,
|
|
9
|
-
MessageType,
|
|
10
|
-
Position,
|
|
11
|
-
Range,
|
|
12
|
-
TextEdit,
|
|
13
|
-
)
|
|
14
|
-
from robotcode.core.text_document import TextDocument
|
|
15
|
-
from robotcode.core.utils.logging import LoggingDescriptor
|
|
16
|
-
from robotcode.robot.utils import get_robot_version
|
|
17
|
-
|
|
18
|
-
from ..configuration import RoboCopConfig, RoboTidyConfig
|
|
19
|
-
from .protocol_part import RobotLanguageServerProtocolPart
|
|
20
|
-
|
|
21
|
-
if TYPE_CHECKING:
|
|
22
|
-
from ..protocol import RobotLanguageServerProtocol
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class RobotFormattingProtocolPart(RobotLanguageServerProtocolPart):
|
|
26
|
-
_logger = LoggingDescriptor()
|
|
27
|
-
|
|
28
|
-
def __init__(self, parent: "RobotLanguageServerProtocol") -> None:
|
|
29
|
-
super().__init__(parent)
|
|
30
|
-
|
|
31
|
-
parent.formatting.format.add(self.format)
|
|
32
|
-
|
|
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
|
-
):
|
|
36
|
-
parent.formatting.format_range.add(self.format_range)
|
|
37
|
-
|
|
38
|
-
self.space_count = 4
|
|
39
|
-
self.use_pipes = False
|
|
40
|
-
self.line_separator = os.linesep
|
|
41
|
-
self.short_test_name_length = 18
|
|
42
|
-
self.setting_and_variable_name_length = 14
|
|
43
|
-
self.is_robocop_notification_shown = False
|
|
44
|
-
|
|
45
|
-
def get_tidy_config(self, document: TextDocument) -> RoboTidyConfig:
|
|
46
|
-
folder = self.parent.workspace.get_workspace_folder(document.uri)
|
|
47
|
-
if folder is None:
|
|
48
|
-
return RoboTidyConfig()
|
|
49
|
-
|
|
50
|
-
return self.parent.workspace.get_configuration(RoboTidyConfig, folder.uri)
|
|
51
|
-
|
|
52
|
-
def get_robocop_config(self, document: TextDocument) -> RoboCopConfig:
|
|
53
|
-
folder = self.parent.workspace.get_workspace_folder(document.uri)
|
|
54
|
-
if folder is None:
|
|
55
|
-
return RoboCopConfig()
|
|
56
|
-
|
|
57
|
-
return self.parent.workspace.get_configuration(RoboCopConfig, folder.uri)
|
|
58
|
-
|
|
59
|
-
@language_id("robotframework")
|
|
60
|
-
@_logger.call
|
|
61
|
-
def format(
|
|
62
|
-
self,
|
|
63
|
-
sender: Any,
|
|
64
|
-
document: TextDocument,
|
|
65
|
-
options: FormattingOptions,
|
|
66
|
-
**further_options: Any,
|
|
67
|
-
) -> Optional[List[TextEdit]]:
|
|
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:
|
|
70
|
-
self.parent.window.show_message(
|
|
71
|
-
"`robotframework-robocop >= 6.0` is installed and will be used for formatting.\n\n"
|
|
72
|
-
"`robotframework-tidy` is also detected in the workspace, but its use is redundant.\n"
|
|
73
|
-
"Robocop fully supports all formatting tasks and provides a more comprehensive solution.\n\n"
|
|
74
|
-
"Note: The use of `robotframework-tidy` is deprecated and should be avoided in favor of Robocop.",
|
|
75
|
-
MessageType.INFO,
|
|
76
|
-
)
|
|
77
|
-
self.is_robocop_notification_shown = True
|
|
78
|
-
|
|
79
|
-
return self.format_robocop(document, options, **further_options)
|
|
80
|
-
|
|
81
|
-
tidy_config = self.get_tidy_config(document)
|
|
82
|
-
if (tidy_config.enabled or get_robot_version() >= (5, 0)) and self.parent.robocop_helper.robotidy_installed:
|
|
83
|
-
return self.format_robot_tidy(document, options, config=tidy_config, **further_options)
|
|
84
|
-
|
|
85
|
-
if get_robot_version() < (5, 0):
|
|
86
|
-
return self.format_internal(document, options, **further_options)
|
|
87
|
-
|
|
88
|
-
self.parent.window.show_message(
|
|
89
|
-
"RobotFramework formatter is not available, please install 'robotframework-robocop'.",
|
|
90
|
-
MessageType.ERROR,
|
|
91
|
-
)
|
|
92
|
-
|
|
93
|
-
return None
|
|
94
|
-
|
|
95
|
-
def format_robot_tidy(
|
|
96
|
-
self,
|
|
97
|
-
document: TextDocument,
|
|
98
|
-
options: FormattingOptions,
|
|
99
|
-
range: Optional[Range] = None,
|
|
100
|
-
config: Optional[RoboTidyConfig] = None,
|
|
101
|
-
**further_options: Any,
|
|
102
|
-
) -> Optional[List[TextEdit]]:
|
|
103
|
-
try:
|
|
104
|
-
if config is None:
|
|
105
|
-
config = self.get_tidy_config(document)
|
|
106
|
-
|
|
107
|
-
model = self.parent.documents_cache.get_model(document, False)
|
|
108
|
-
|
|
109
|
-
if self.parent.robocop_helper.robotidy_version >= (3, 0):
|
|
110
|
-
from robotidy.api import get_robotidy
|
|
111
|
-
from robotidy.disablers import RegisterDisablers
|
|
112
|
-
|
|
113
|
-
if self.parent.robocop_helper.robotidy_version >= (4, 2):
|
|
114
|
-
robot_tidy = get_robotidy(
|
|
115
|
-
document.uri.to_path(),
|
|
116
|
-
None,
|
|
117
|
-
ignore_git_dir=config.ignore_git_dir,
|
|
118
|
-
config=config.config,
|
|
119
|
-
)
|
|
120
|
-
elif self.parent.robocop_helper.robotidy_version >= (4, 1):
|
|
121
|
-
robot_tidy = get_robotidy(
|
|
122
|
-
document.uri.to_path(),
|
|
123
|
-
None,
|
|
124
|
-
ignore_git_dir=config.ignore_git_dir,
|
|
125
|
-
)
|
|
126
|
-
else:
|
|
127
|
-
robot_tidy = get_robotidy(document.uri.to_path(), None)
|
|
128
|
-
|
|
129
|
-
if range is not None:
|
|
130
|
-
robot_tidy.config.formatting.start_line = range.start.line + 1
|
|
131
|
-
robot_tidy.config.formatting.end_line = range.end.line + 1
|
|
132
|
-
|
|
133
|
-
disabler_finder = RegisterDisablers(
|
|
134
|
-
robot_tidy.config.formatting.start_line,
|
|
135
|
-
robot_tidy.config.formatting.end_line,
|
|
136
|
-
)
|
|
137
|
-
disabler_finder.visit(model)
|
|
138
|
-
|
|
139
|
-
if self.parent.robocop_helper.robotidy_version >= (4, 11):
|
|
140
|
-
if disabler_finder.is_disabled_in_file():
|
|
141
|
-
return None
|
|
142
|
-
else:
|
|
143
|
-
if disabler_finder.file_disabled:
|
|
144
|
-
return None
|
|
145
|
-
|
|
146
|
-
if self.parent.robocop_helper.robotidy_version >= (4, 0):
|
|
147
|
-
_, _, new, _ = robot_tidy.transform_until_stable(model, disabler_finder)
|
|
148
|
-
else:
|
|
149
|
-
_, _, new = robot_tidy.transform(model, disabler_finder.disablers)
|
|
150
|
-
|
|
151
|
-
else:
|
|
152
|
-
from robotidy.api import RobotidyAPI
|
|
153
|
-
|
|
154
|
-
robot_tidy = RobotidyAPI(document.uri.to_path(), None)
|
|
155
|
-
|
|
156
|
-
if range is not None:
|
|
157
|
-
robot_tidy.formatting_config.start_line = range.start.line + 1
|
|
158
|
-
robot_tidy.formatting_config.end_line = range.end.line + 1
|
|
159
|
-
|
|
160
|
-
if self.parent.robocop_helper.robotidy_version >= (2, 2):
|
|
161
|
-
from robotidy.disablers import RegisterDisablers
|
|
162
|
-
|
|
163
|
-
disabler_finder = RegisterDisablers(
|
|
164
|
-
robot_tidy.formatting_config.start_line,
|
|
165
|
-
robot_tidy.formatting_config.end_line,
|
|
166
|
-
)
|
|
167
|
-
disabler_finder.visit(model)
|
|
168
|
-
if disabler_finder.file_disabled:
|
|
169
|
-
return None
|
|
170
|
-
_, _, new = robot_tidy.transform(model, disabler_finder.disablers)
|
|
171
|
-
else:
|
|
172
|
-
_, _, new = robot_tidy.transform(model)
|
|
173
|
-
|
|
174
|
-
if new.text == document.text():
|
|
175
|
-
return None
|
|
176
|
-
|
|
177
|
-
return [
|
|
178
|
-
TextEdit(
|
|
179
|
-
range=Range(
|
|
180
|
-
start=Position(line=0, character=0),
|
|
181
|
-
end=Position(line=len(document.get_lines()), character=0),
|
|
182
|
-
),
|
|
183
|
-
new_text=new.text,
|
|
184
|
-
)
|
|
185
|
-
]
|
|
186
|
-
|
|
187
|
-
except (SystemExit, KeyboardInterrupt, CancelledError):
|
|
188
|
-
raise
|
|
189
|
-
except BaseException as e:
|
|
190
|
-
self._logger.exception(e)
|
|
191
|
-
self.parent.window.show_message(f"Executing `robotidy` failed: {e}", MessageType.ERROR)
|
|
192
|
-
return None
|
|
193
|
-
|
|
194
|
-
def format_robocop(
|
|
195
|
-
self,
|
|
196
|
-
document: TextDocument,
|
|
197
|
-
options: FormattingOptions,
|
|
198
|
-
range: Optional[Range] = None,
|
|
199
|
-
**further_options: Any,
|
|
200
|
-
) -> Optional[List[TextEdit]]:
|
|
201
|
-
from robocop.formatter.runner import RobocopFormatter
|
|
202
|
-
|
|
203
|
-
workspace_folder = self.parent.workspace.get_workspace_folder(document.uri)
|
|
204
|
-
if workspace_folder is None:
|
|
205
|
-
return None
|
|
206
|
-
|
|
207
|
-
config_manager = self.parent.robocop_helper.get_config_manager(workspace_folder)
|
|
208
|
-
|
|
209
|
-
config = config_manager.get_config_for_source_file(document.uri.to_path())
|
|
210
|
-
|
|
211
|
-
if range is not None:
|
|
212
|
-
config.formatter.start_line = range.start.line + 1
|
|
213
|
-
config.formatter.end_line = range.end.line + 1
|
|
214
|
-
|
|
215
|
-
runner = RobocopFormatter(config_manager)
|
|
216
|
-
runner.config = config
|
|
217
|
-
|
|
218
|
-
model = self.parent.documents_cache.get_model(document, False)
|
|
219
|
-
_, _, new, _ = runner.format_until_stable(model)
|
|
220
|
-
|
|
221
|
-
if new.text == document.text():
|
|
222
|
-
return None
|
|
223
|
-
|
|
224
|
-
return [
|
|
225
|
-
TextEdit(
|
|
226
|
-
range=Range(
|
|
227
|
-
start=Position(line=0, character=0),
|
|
228
|
-
end=Position(line=len(document.get_lines()), character=0),
|
|
229
|
-
),
|
|
230
|
-
new_text=new.text,
|
|
231
|
-
)
|
|
232
|
-
]
|
|
233
|
-
|
|
234
|
-
def format_internal(
|
|
235
|
-
self,
|
|
236
|
-
document: TextDocument,
|
|
237
|
-
options: FormattingOptions,
|
|
238
|
-
**further_options: Any,
|
|
239
|
-
) -> Optional[List[TextEdit]]:
|
|
240
|
-
from robot.parsing.model.blocks import File
|
|
241
|
-
from robot.tidypkg import ( # pyright: ignore [reportMissingImports]
|
|
242
|
-
Aligner,
|
|
243
|
-
Cleaner,
|
|
244
|
-
NewlineNormalizer,
|
|
245
|
-
SeparatorNormalizer,
|
|
246
|
-
)
|
|
247
|
-
|
|
248
|
-
model = cast(File, self.parent.documents_cache.get_model(document, False))
|
|
249
|
-
|
|
250
|
-
Cleaner().visit(model)
|
|
251
|
-
NewlineNormalizer(self.line_separator, self.short_test_name_length).visit(model)
|
|
252
|
-
SeparatorNormalizer(self.use_pipes, self.space_count).visit(model)
|
|
253
|
-
Aligner(
|
|
254
|
-
self.short_test_name_length,
|
|
255
|
-
self.setting_and_variable_name_length,
|
|
256
|
-
self.use_pipes,
|
|
257
|
-
).visit(model)
|
|
258
|
-
|
|
259
|
-
with io.StringIO() as s:
|
|
260
|
-
model.save(s)
|
|
261
|
-
|
|
262
|
-
return [
|
|
263
|
-
TextEdit(
|
|
264
|
-
range=Range(
|
|
265
|
-
start=Position(line=0, character=0),
|
|
266
|
-
end=Position(line=len(document.get_lines()), character=0),
|
|
267
|
-
),
|
|
268
|
-
new_text=s.getvalue(),
|
|
269
|
-
)
|
|
270
|
-
]
|
|
271
|
-
|
|
272
|
-
@language_id("robotframework")
|
|
273
|
-
def format_range(
|
|
274
|
-
self,
|
|
275
|
-
sender: Any,
|
|
276
|
-
document: TextDocument,
|
|
277
|
-
range: Range,
|
|
278
|
-
options: FormattingOptions,
|
|
279
|
-
**further_options: Any,
|
|
280
|
-
) -> Optional[List[TextEdit]]:
|
|
281
|
-
config = self.get_tidy_config(document)
|
|
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
|
-
):
|
|
285
|
-
return self.format_robot_tidy(document, options, range=range, config=config, **further_options)
|
|
286
|
-
|
|
287
|
-
return None
|
|
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
|