robotcode-robot 0.69.0__py3-none-any.whl → 0.71.0__py3-none-any.whl
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/robot/__version__.py +1 -1
- robotcode/robot/diagnostics/document_cache_helper.py +7 -6
- robotcode/robot/diagnostics/entities.py +22 -2
- robotcode/robot/diagnostics/imports_manager.py +13 -19
- robotcode/robot/diagnostics/library_doc.py +64 -52
- robotcode/robot/diagnostics/namespace.py +175 -118
- robotcode/robot/diagnostics/namespace_analyzer.py +53 -5
- robotcode/robot/diagnostics/workspace_config.py +6 -0
- robotcode/robot/utils/markdownformatter.py +4 -8
- robotcode/robot/utils/stubs.py +2 -4
- {robotcode_robot-0.69.0.dist-info → robotcode_robot-0.71.0.dist-info}/METADATA +2 -2
- {robotcode_robot-0.69.0.dist-info → robotcode_robot-0.71.0.dist-info}/RECORD +14 -14
- {robotcode_robot-0.69.0.dist-info → robotcode_robot-0.71.0.dist-info}/WHEEL +1 -1
- {robotcode_robot-0.69.0.dist-info → robotcode_robot-0.71.0.dist-info}/licenses/LICENSE.txt +0 -0
robotcode/robot/__version__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "0.
|
1
|
+
__version__ = "0.71.0"
|
@@ -33,7 +33,7 @@ from ..utils import get_robot_version
|
|
33
33
|
from ..utils.stubs import Languages
|
34
34
|
from .imports_manager import ImportsManager
|
35
35
|
from .namespace import DocumentType, Namespace
|
36
|
-
from .workspace_config import CacheConfig, RobotConfig
|
36
|
+
from .workspace_config import AnalysisRobotConfig, CacheConfig, RobotConfig
|
37
37
|
|
38
38
|
|
39
39
|
class UnknownFileTypeError(Exception):
|
@@ -59,9 +59,9 @@ class DocumentsCacheHelper:
|
|
59
59
|
self._imports_managers_lock = threading.RLock()
|
60
60
|
self._imports_managers: weakref.WeakKeyDictionary[WorkspaceFolder, ImportsManager] = weakref.WeakKeyDictionary()
|
61
61
|
self._default_imports_manager: Optional[ImportsManager] = None
|
62
|
-
self._workspace_languages: weakref.WeakKeyDictionary[
|
63
|
-
|
64
|
-
|
62
|
+
self._workspace_languages: weakref.WeakKeyDictionary[WorkspaceFolder, Optional[Languages]] = (
|
63
|
+
weakref.WeakKeyDictionary()
|
64
|
+
)
|
65
65
|
|
66
66
|
def get_languages_for_document(self, document_or_uri: Union[TextDocument, Uri, str]) -> Optional[Languages]:
|
67
67
|
if get_robot_version() < (6, 0):
|
@@ -416,8 +416,7 @@ class DocumentsCacheHelper:
|
|
416
416
|
return self.__get_namespace_for_document_type(document, DocumentType.GENERAL)
|
417
417
|
|
418
418
|
@event
|
419
|
-
def namespace_invalidated(sender, namespace: Namespace) -> None:
|
420
|
-
...
|
419
|
+
def namespace_invalidated(sender, namespace: Namespace) -> None: ...
|
421
420
|
|
422
421
|
def __invalidate_namespace(self, sender: Namespace) -> None:
|
423
422
|
document = sender.document
|
@@ -475,6 +474,7 @@ class DocumentsCacheHelper:
|
|
475
474
|
*robot_config.variable_files,
|
476
475
|
]
|
477
476
|
|
477
|
+
analysis_config = self.workspace.get_configuration(AnalysisRobotConfig, root_uri)
|
478
478
|
return ImportsManager(
|
479
479
|
self.documents_manager,
|
480
480
|
self.file_watcher_manager,
|
@@ -485,6 +485,7 @@ class DocumentsCacheHelper:
|
|
485
485
|
environment,
|
486
486
|
cache_config.ignored_libraries,
|
487
487
|
cache_config.ignored_variables,
|
488
|
+
analysis_config.global_library_search_order,
|
488
489
|
cache_base_path,
|
489
490
|
)
|
490
491
|
|
@@ -173,7 +173,9 @@ class VariableMatcher:
|
|
173
173
|
class VariableDefinitionType(Enum):
|
174
174
|
VARIABLE = "suite variable"
|
175
175
|
LOCAL_VARIABLE = "local variable"
|
176
|
+
TEST_VARIABLE = "test variable"
|
176
177
|
ARGUMENT = "argument"
|
178
|
+
GLOBAL_VARIABLE = "global variable"
|
177
179
|
COMMAND_LINE_VARIABLE = "global variable [command line]"
|
178
180
|
BUILTIN_VARIABLE = "builtin variable"
|
179
181
|
IMPORTED_VARIABLE = "suite variable [imported]"
|
@@ -218,6 +220,15 @@ class VariableDefinition(SourceEntity):
|
|
218
220
|
)
|
219
221
|
|
220
222
|
|
223
|
+
@dataclass
|
224
|
+
class TestVariableDefinition(VariableDefinition):
|
225
|
+
type: VariableDefinitionType = VariableDefinitionType.TEST_VARIABLE
|
226
|
+
|
227
|
+
@single_call
|
228
|
+
def __hash__(self) -> int:
|
229
|
+
return hash((type(self), self.name, self.type, self.range, self.source))
|
230
|
+
|
231
|
+
|
221
232
|
@dataclass
|
222
233
|
class LocalVariableDefinition(VariableDefinition):
|
223
234
|
type: VariableDefinitionType = VariableDefinitionType.LOCAL_VARIABLE
|
@@ -227,6 +238,15 @@ class LocalVariableDefinition(VariableDefinition):
|
|
227
238
|
return hash((type(self), self.name, self.type, self.range, self.source))
|
228
239
|
|
229
240
|
|
241
|
+
@dataclass
|
242
|
+
class GlobalVariableDefinition(VariableDefinition):
|
243
|
+
type: VariableDefinitionType = VariableDefinitionType.GLOBAL_VARIABLE
|
244
|
+
|
245
|
+
@single_call
|
246
|
+
def __hash__(self) -> int:
|
247
|
+
return hash((type(self), self.name, self.type, self.range, self.source))
|
248
|
+
|
249
|
+
|
230
250
|
@dataclass
|
231
251
|
class BuiltInVariableDefinition(VariableDefinition):
|
232
252
|
type: VariableDefinitionType = VariableDefinitionType.BUILTIN_VARIABLE
|
@@ -238,13 +258,13 @@ class BuiltInVariableDefinition(VariableDefinition):
|
|
238
258
|
|
239
259
|
|
240
260
|
@dataclass
|
241
|
-
class CommandLineVariableDefinition(
|
261
|
+
class CommandLineVariableDefinition(GlobalVariableDefinition):
|
242
262
|
type: VariableDefinitionType = VariableDefinitionType.COMMAND_LINE_VARIABLE
|
243
263
|
resolvable: bool = True
|
244
264
|
|
245
265
|
@single_call
|
246
266
|
def __hash__(self) -> int:
|
247
|
-
return hash((type(self), self.name, self.type))
|
267
|
+
return hash((type(self), self.name, self.type, self.range, self.source))
|
248
268
|
|
249
269
|
|
250
270
|
@dataclass
|
@@ -119,8 +119,7 @@ class _ImportEntry(ABC):
|
|
119
119
|
self.file_watchers = []
|
120
120
|
|
121
121
|
@abstractmethod
|
122
|
-
def check_file_changed(self, changes: List[FileEvent]) -> Optional[FileChangeType]:
|
123
|
-
...
|
122
|
+
def check_file_changed(self, changes: List[FileEvent]) -> Optional[FileChangeType]: ...
|
124
123
|
|
125
124
|
@final
|
126
125
|
def invalidate(self) -> None:
|
@@ -128,16 +127,13 @@ class _ImportEntry(ABC):
|
|
128
127
|
self._invalidate()
|
129
128
|
|
130
129
|
@abstractmethod
|
131
|
-
def _invalidate(self) -> None:
|
132
|
-
...
|
130
|
+
def _invalidate(self) -> None: ...
|
133
131
|
|
134
132
|
@abstractmethod
|
135
|
-
def _update(self) -> None:
|
136
|
-
...
|
133
|
+
def _update(self) -> None: ...
|
137
134
|
|
138
135
|
@abstractmethod
|
139
|
-
def is_valid(self) -> bool:
|
140
|
-
...
|
136
|
+
def is_valid(self) -> bool: ...
|
141
137
|
|
142
138
|
|
143
139
|
class _LibrariesEntry(_ImportEntry):
|
@@ -211,9 +207,7 @@ class _LibrariesEntry(_ImportEntry):
|
|
211
207
|
source_or_origin = (
|
212
208
|
self._lib_doc.source
|
213
209
|
if self._lib_doc.source is not None
|
214
|
-
else self._lib_doc.module_spec.origin
|
215
|
-
if self._lib_doc.module_spec is not None
|
216
|
-
else None
|
210
|
+
else self._lib_doc.module_spec.origin if self._lib_doc.module_spec is not None else None
|
217
211
|
)
|
218
212
|
|
219
213
|
# we are a module, so add the module path into file watchers
|
@@ -495,6 +489,7 @@ class ImportsManager:
|
|
495
489
|
environment: Optional[Dict[str, str]],
|
496
490
|
ignored_libraries: List[str],
|
497
491
|
ignored_variables: List[str],
|
492
|
+
global_library_search_order: List[str],
|
498
493
|
cache_base_path: Optional[Path],
|
499
494
|
) -> None:
|
500
495
|
super().__init__()
|
@@ -536,6 +531,9 @@ class ImportsManager:
|
|
536
531
|
|
537
532
|
self.ignored_libraries_patters = [Pattern(s) for s in ignored_libraries]
|
538
533
|
self.ignored_variables_patters = [Pattern(s) for s in ignored_variables]
|
534
|
+
|
535
|
+
self.global_library_search_order = global_library_search_order
|
536
|
+
|
539
537
|
self._libaries_lock = threading.RLock()
|
540
538
|
self._libaries: OrderedDict[_LibrariesEntryKey, _LibrariesEntry] = OrderedDict()
|
541
539
|
self._resources_lock = threading.RLock()
|
@@ -661,20 +659,16 @@ class ImportsManager:
|
|
661
659
|
return self._resolvable_command_line_variables
|
662
660
|
|
663
661
|
@event
|
664
|
-
def libraries_changed(sender, libraries: List[LibraryDoc]) -> None:
|
665
|
-
...
|
662
|
+
def libraries_changed(sender, libraries: List[LibraryDoc]) -> None: ...
|
666
663
|
|
667
664
|
@event
|
668
|
-
def resources_changed(sender, resources: List[LibraryDoc]) -> None:
|
669
|
-
...
|
665
|
+
def resources_changed(sender, resources: List[LibraryDoc]) -> None: ...
|
670
666
|
|
671
667
|
@event
|
672
|
-
def variables_changed(sender, variables: List[LibraryDoc]) -> None:
|
673
|
-
...
|
668
|
+
def variables_changed(sender, variables: List[LibraryDoc]) -> None: ...
|
674
669
|
|
675
670
|
@event
|
676
|
-
def imports_changed(sender, uri: DocumentUri) -> None:
|
677
|
-
...
|
671
|
+
def imports_changed(sender, uri: DocumentUri) -> None: ...
|
678
672
|
|
679
673
|
def possible_imports_modified(self, sender: Any, uri: DocumentUri) -> None:
|
680
674
|
self.imports_changed(self, uri)
|
@@ -397,11 +397,15 @@ class ArgumentInfo:
|
|
397
397
|
name=robot_arg.name,
|
398
398
|
default_value=robot_arg_repr(robot_arg),
|
399
399
|
str_repr=str(arg),
|
400
|
-
types=
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
400
|
+
types=(
|
401
|
+
robot_arg.types_reprs
|
402
|
+
if get_robot_version() < (7, 0)
|
403
|
+
else (
|
404
|
+
([str(robot_arg.type)] if not robot_arg.type.is_union else [str(t) for t in robot_arg.type.nested])
|
405
|
+
if robot_arg.type
|
406
|
+
else None
|
407
|
+
)
|
408
|
+
),
|
405
409
|
kind=KeywordArgumentKind[robot_arg.kind],
|
406
410
|
required=robot_arg.required,
|
407
411
|
)
|
@@ -1273,9 +1277,9 @@ def get_module_spec(module_name: str) -> Optional[ModuleSpec]:
|
|
1273
1277
|
return ModuleSpec( # type: ignore
|
1274
1278
|
name=result.name,
|
1275
1279
|
origin=result.origin,
|
1276
|
-
submodule_search_locations=
|
1277
|
-
|
1278
|
-
|
1280
|
+
submodule_search_locations=(
|
1281
|
+
list(result.submodule_search_locations) if result.submodule_search_locations else None
|
1282
|
+
),
|
1279
1283
|
member_name=member_name,
|
1280
1284
|
)
|
1281
1285
|
return None
|
@@ -1396,9 +1400,11 @@ def get_message_and_traceback_from_exception_text(
|
|
1396
1400
|
|
1397
1401
|
return MessageAndTraceback(
|
1398
1402
|
message=splitted[0].strip(),
|
1399
|
-
traceback=
|
1400
|
-
|
1401
|
-
|
1403
|
+
traceback=(
|
1404
|
+
[SourceAndLineInfo(t.group(1), int(t.group(2))) for t in __RE_TRACEBACK.finditer(splitted[1])]
|
1405
|
+
if len(splitted) > 1
|
1406
|
+
else []
|
1407
|
+
),
|
1402
1408
|
)
|
1403
1409
|
|
1404
1410
|
|
@@ -1723,20 +1729,20 @@ def get_library_doc(
|
|
1723
1729
|
except BaseException as e:
|
1724
1730
|
return LibraryDoc(
|
1725
1731
|
name=name,
|
1726
|
-
source=
|
1727
|
-
|
1728
|
-
|
1729
|
-
|
1730
|
-
|
1732
|
+
source=(
|
1733
|
+
source or module_spec.origin
|
1734
|
+
if module_spec is not None and module_spec.origin
|
1735
|
+
else import_name if is_library_by_path(import_name) else None
|
1736
|
+
),
|
1731
1737
|
module_spec=module_spec,
|
1732
1738
|
errors=[
|
1733
1739
|
error_from_exception(
|
1734
1740
|
e,
|
1735
|
-
|
1736
|
-
|
1737
|
-
|
1738
|
-
|
1739
|
-
|
1741
|
+
(
|
1742
|
+
source or module_spec.origin
|
1743
|
+
if module_spec is not None and module_spec.origin
|
1744
|
+
else import_name if is_library_by_path(import_name) else None
|
1745
|
+
),
|
1740
1746
|
1 if source is not None or module_spec is not None and module_spec.origin is not None else None,
|
1741
1747
|
)
|
1742
1748
|
],
|
@@ -1798,11 +1804,13 @@ def get_library_doc(
|
|
1798
1804
|
libdoc = LibraryDoc(
|
1799
1805
|
name=library_name,
|
1800
1806
|
source=real_source,
|
1801
|
-
module_spec=
|
1802
|
-
|
1803
|
-
|
1804
|
-
|
1805
|
-
|
1807
|
+
module_spec=(
|
1808
|
+
module_spec
|
1809
|
+
if module_spec is not None
|
1810
|
+
and module_spec.origin != real_source
|
1811
|
+
and module_spec.submodule_search_locations is None
|
1812
|
+
else None
|
1813
|
+
),
|
1806
1814
|
python_path=sys.path,
|
1807
1815
|
line_no=lib.lineno if lib is not None else -1,
|
1808
1816
|
doc=str(lib.doc) if lib is not None else "",
|
@@ -1921,18 +1929,22 @@ def get_library_doc(
|
|
1921
1929
|
is_registered_run_keyword=RUN_KW_REGISTER.is_run_keyword(libdoc.name, kw[0].name),
|
1922
1930
|
args_to_process=get_args_to_process(libdoc.name, kw[0].name),
|
1923
1931
|
deprecated=kw[0].deprecated,
|
1924
|
-
arguments_spec=
|
1925
|
-
|
1926
|
-
|
1927
|
-
|
1928
|
-
|
1932
|
+
arguments_spec=(
|
1933
|
+
ArgumentSpec.from_robot_argument_spec(
|
1934
|
+
kw[1].arguments if get_robot_version() < (7, 0) else kw[1].args
|
1935
|
+
)
|
1936
|
+
if not kw[1].is_error_handler
|
1937
|
+
else None
|
1938
|
+
),
|
1929
1939
|
return_type=(
|
1930
|
-
|
1931
|
-
|
1940
|
+
(
|
1941
|
+
str(kw[1].args.return_type)
|
1942
|
+
if kw[1].args.return_type is not None and kw[1].args.return_type != type(None)
|
1943
|
+
else None
|
1944
|
+
)
|
1945
|
+
if get_robot_version() >= (7, 0)
|
1932
1946
|
else None
|
1933
|
-
)
|
1934
|
-
if get_robot_version() >= (7, 0)
|
1935
|
-
else None,
|
1947
|
+
),
|
1936
1948
|
)
|
1937
1949
|
for kw in keyword_docs
|
1938
1950
|
],
|
@@ -2273,9 +2285,9 @@ def get_variables_doc(
|
|
2273
2285
|
source=source or (module_spec.origin if module_spec is not None else None) or "",
|
2274
2286
|
name=name if get_robot_version() < (7, 0) else f"${{{name}}}",
|
2275
2287
|
name_token=None,
|
2276
|
-
value=
|
2277
|
-
|
2278
|
-
|
2288
|
+
value=(
|
2289
|
+
NativeValue(value) if value is None or isinstance(value, (int, float, bool, str)) else None
|
2290
|
+
),
|
2279
2291
|
has_value=value is None or isinstance(value, (int, float, bool, str)),
|
2280
2292
|
value_is_native=value is None or isinstance(value, (int, float, bool, str)),
|
2281
2293
|
)
|
@@ -2287,11 +2299,11 @@ def get_variables_doc(
|
|
2287
2299
|
libdoc.errors = [
|
2288
2300
|
error_from_exception(
|
2289
2301
|
e,
|
2290
|
-
|
2291
|
-
|
2292
|
-
|
2293
|
-
|
2294
|
-
|
2302
|
+
(
|
2303
|
+
source or module_spec.origin
|
2304
|
+
if module_spec is not None and module_spec.origin
|
2305
|
+
else import_name if is_variables_by_path(import_name) else None
|
2306
|
+
),
|
2295
2307
|
1 if source is not None or module_spec is not None and module_spec.origin is not None else None,
|
2296
2308
|
)
|
2297
2309
|
]
|
@@ -2307,11 +2319,11 @@ def get_variables_doc(
|
|
2307
2319
|
errors=[
|
2308
2320
|
error_from_exception(
|
2309
2321
|
e,
|
2310
|
-
|
2311
|
-
|
2312
|
-
|
2313
|
-
|
2314
|
-
|
2322
|
+
(
|
2323
|
+
source or module_spec.origin
|
2324
|
+
if module_spec is not None and module_spec.origin
|
2325
|
+
else import_name if is_variables_by_path(import_name) else None
|
2326
|
+
),
|
2315
2327
|
1 if source is not None or module_spec is not None and module_spec.origin is not None else None,
|
2316
2328
|
)
|
2317
2329
|
],
|
@@ -2788,9 +2800,9 @@ def get_model_doc(
|
|
2788
2800
|
is_embedded=is_embedded_keyword(kw[0].name),
|
2789
2801
|
errors=get_kw_errors(kw[1]),
|
2790
2802
|
is_error_handler=isinstance(kw[1], UserErrorHandler),
|
2791
|
-
error_handler_message=
|
2792
|
-
|
2793
|
-
|
2803
|
+
error_handler_message=(
|
2804
|
+
str(cast(UserErrorHandler, kw[1]).error) if isinstance(kw[1], UserErrorHandler) else None
|
2805
|
+
),
|
2794
2806
|
arguments_spec=ArgumentSpec.from_robot_argument_spec(
|
2795
2807
|
kw[1].arguments if get_robot_version() < (7, 0) else kw[1].args
|
2796
2808
|
),
|
@@ -20,6 +20,7 @@ from typing import (
|
|
20
20
|
Set,
|
21
21
|
Tuple,
|
22
22
|
Union,
|
23
|
+
cast,
|
23
24
|
)
|
24
25
|
|
25
26
|
from robot.errors import VariableError
|
@@ -75,6 +76,7 @@ from .entities import (
|
|
75
76
|
BuiltInVariableDefinition,
|
76
77
|
CommandLineVariableDefinition,
|
77
78
|
EnvironmentVariableDefinition,
|
79
|
+
GlobalVariableDefinition,
|
78
80
|
Import,
|
79
81
|
InvalidVariableError,
|
80
82
|
LibraryEntry,
|
@@ -82,6 +84,7 @@ from .entities import (
|
|
82
84
|
LocalVariableDefinition,
|
83
85
|
ResourceEntry,
|
84
86
|
ResourceImport,
|
87
|
+
TestVariableDefinition,
|
85
88
|
VariableDefinition,
|
86
89
|
VariableMatcher,
|
87
90
|
VariablesEntry,
|
@@ -182,18 +185,21 @@ class BlockVariableVisitor(Visitor):
|
|
182
185
|
def __init__(
|
183
186
|
self,
|
184
187
|
library_doc: LibraryDoc,
|
188
|
+
global_variables: List[VariableDefinition],
|
185
189
|
source: str,
|
186
190
|
position: Optional[Position] = None,
|
187
191
|
in_args: bool = True,
|
188
192
|
) -> None:
|
189
193
|
super().__init__()
|
190
194
|
self.library_doc = library_doc
|
195
|
+
self.global_variables = global_variables
|
191
196
|
self.source = source
|
192
197
|
self.position = position
|
193
198
|
self.in_args = in_args
|
194
199
|
|
195
200
|
self._results: Dict[str, VariableDefinition] = {}
|
196
201
|
self.current_kw_doc: Optional[KeywordDoc] = None
|
202
|
+
self._var_statements_vars: List[VariableDefinition] = []
|
197
203
|
|
198
204
|
def get(self, model: ast.AST) -> List[VariableDefinition]:
|
199
205
|
self._results = {}
|
@@ -384,15 +390,32 @@ class BlockVariableVisitor(Visitor):
|
|
384
390
|
)
|
385
391
|
|
386
392
|
def visit_Var(self, node: Statement) -> None: # noqa: N802
|
393
|
+
from robot.parsing.model.statements import Var
|
394
|
+
|
387
395
|
variable = node.get_token(Token.VARIABLE)
|
388
396
|
if variable is None:
|
389
397
|
return
|
390
398
|
try:
|
391
|
-
|
399
|
+
var_name = variable.value
|
400
|
+
if var_name.endswith("="):
|
401
|
+
var_name = var_name[:-1].rstrip()
|
402
|
+
|
403
|
+
if not is_variable(var_name):
|
392
404
|
return
|
393
405
|
|
394
|
-
|
395
|
-
|
406
|
+
scope = cast(Var, node).scope
|
407
|
+
|
408
|
+
if scope in ("SUITE",):
|
409
|
+
var_type = VariableDefinition
|
410
|
+
elif scope in ("TEST", "TASK"):
|
411
|
+
var_type = TestVariableDefinition
|
412
|
+
elif scope in ("GLOBAL",):
|
413
|
+
var_type = GlobalVariableDefinition
|
414
|
+
else:
|
415
|
+
var_type = LocalVariableDefinition
|
416
|
+
|
417
|
+
var = var_type(
|
418
|
+
name=var_name,
|
396
419
|
name_token=strip_variable_token(variable),
|
397
420
|
line_no=variable.lineno,
|
398
421
|
col_offset=variable.col_offset,
|
@@ -401,6 +424,16 @@ class BlockVariableVisitor(Visitor):
|
|
401
424
|
source=self.source,
|
402
425
|
)
|
403
426
|
|
427
|
+
self._var_statements_vars.append(var)
|
428
|
+
|
429
|
+
if var_name not in self._results or type(self._results[var_name]) != type(var):
|
430
|
+
if isinstance(var, LocalVariableDefinition) or not any(
|
431
|
+
l for l in self.global_variables if l.matcher == var.matcher
|
432
|
+
):
|
433
|
+
self._results[var_name] = var
|
434
|
+
else:
|
435
|
+
self._results.pop(var_name, None)
|
436
|
+
|
404
437
|
except VariableError:
|
405
438
|
pass
|
406
439
|
|
@@ -433,16 +466,16 @@ class ImportVisitor(Visitor):
|
|
433
466
|
alias_token=alias_token,
|
434
467
|
line_no=node.lineno,
|
435
468
|
col_offset=node.col_offset,
|
436
|
-
end_line_no=
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
end_col_offset=
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
469
|
+
end_line_no=(
|
470
|
+
last_data_token.lineno
|
471
|
+
if last_data_token is not None
|
472
|
+
else node.end_lineno if node.end_lineno is not None else -1
|
473
|
+
),
|
474
|
+
end_col_offset=(
|
475
|
+
last_data_token.end_col_offset
|
476
|
+
if last_data_token is not None
|
477
|
+
else node.end_col_offset if node.end_col_offset is not None else -1
|
478
|
+
),
|
446
479
|
source=self.source,
|
447
480
|
)
|
448
481
|
)
|
@@ -458,16 +491,16 @@ class ImportVisitor(Visitor):
|
|
458
491
|
name_token=name if name is not None else None,
|
459
492
|
line_no=node.lineno,
|
460
493
|
col_offset=node.col_offset,
|
461
|
-
end_line_no=
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
end_col_offset=
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
494
|
+
end_line_no=(
|
495
|
+
last_data_token.lineno
|
496
|
+
if last_data_token is not None
|
497
|
+
else node.end_lineno if node.end_lineno is not None else -1
|
498
|
+
),
|
499
|
+
end_col_offset=(
|
500
|
+
last_data_token.end_col_offset
|
501
|
+
if last_data_token is not None
|
502
|
+
else node.end_col_offset if node.end_col_offset is not None else -1
|
503
|
+
),
|
471
504
|
source=self.source,
|
472
505
|
)
|
473
506
|
)
|
@@ -484,16 +517,16 @@ class ImportVisitor(Visitor):
|
|
484
517
|
args=node.args,
|
485
518
|
line_no=node.lineno,
|
486
519
|
col_offset=node.col_offset,
|
487
|
-
end_line_no=
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
end_col_offset=
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
520
|
+
end_line_no=(
|
521
|
+
last_data_token.lineno
|
522
|
+
if last_data_token is not None
|
523
|
+
else node.end_lineno if node.end_lineno is not None else -1
|
524
|
+
),
|
525
|
+
end_col_offset=(
|
526
|
+
last_data_token.end_col_offset
|
527
|
+
if last_data_token is not None
|
528
|
+
else node.end_col_offset if node.end_col_offset is not None else -1
|
529
|
+
),
|
497
530
|
source=self.source,
|
498
531
|
)
|
499
532
|
)
|
@@ -563,7 +596,7 @@ class Namespace:
|
|
563
596
|
self._keywords_lock = RLock(default_timeout=120, name="Namespace.keywords")
|
564
597
|
|
565
598
|
# TODO: how to get the search order from model
|
566
|
-
self.
|
599
|
+
self._search_order: Optional[Tuple[str, ...]] = None
|
567
600
|
|
568
601
|
self._finder: Optional[KeywordFinder] = None
|
569
602
|
|
@@ -577,25 +610,28 @@ class Namespace:
|
|
577
610
|
self._ignored_lines: Optional[List[int]] = None
|
578
611
|
|
579
612
|
@event
|
580
|
-
def has_invalidated(sender) -> None:
|
581
|
-
...
|
613
|
+
def has_invalidated(sender) -> None: ...
|
582
614
|
|
583
615
|
@event
|
584
|
-
def has_initialized(sender) -> None:
|
585
|
-
...
|
616
|
+
def has_initialized(sender) -> None: ...
|
586
617
|
|
587
618
|
@event
|
588
|
-
def has_imports_changed(sender) -> None:
|
589
|
-
...
|
619
|
+
def has_imports_changed(sender) -> None: ...
|
590
620
|
|
591
621
|
@event
|
592
|
-
def has_analysed(sender) -> None:
|
593
|
-
...
|
622
|
+
def has_analysed(sender) -> None: ...
|
594
623
|
|
595
624
|
@property
|
596
625
|
def document(self) -> Optional[TextDocument]:
|
597
626
|
return self._document() if self._document is not None else None
|
598
627
|
|
628
|
+
@property
|
629
|
+
def search_order(self) -> Tuple[str, ...]:
|
630
|
+
if self._search_order is None:
|
631
|
+
return tuple(self.imports_manager.global_library_search_order)
|
632
|
+
|
633
|
+
return self._search_order
|
634
|
+
|
599
635
|
def imports_changed(self, sender: Any, uri: DocumentUri) -> None:
|
600
636
|
# TODO: optimise this by checking our imports
|
601
637
|
if self.document is not None:
|
@@ -926,15 +962,18 @@ class Namespace:
|
|
926
962
|
for var in chain(
|
927
963
|
*[
|
928
964
|
(
|
929
|
-
|
930
|
-
|
931
|
-
|
932
|
-
|
933
|
-
|
934
|
-
|
965
|
+
(
|
966
|
+
BlockVariableVisitor(
|
967
|
+
self.get_library_doc(),
|
968
|
+
self.get_global_variables(),
|
969
|
+
self.source,
|
970
|
+
position,
|
971
|
+
isinstance(test_or_keyword_nodes[-1], Arguments) if nodes else False,
|
972
|
+
).get(test_or_keyword)
|
973
|
+
)
|
974
|
+
if test_or_keyword is not None
|
975
|
+
else []
|
935
976
|
)
|
936
|
-
if test_or_keyword is not None
|
937
|
-
else []
|
938
977
|
],
|
939
978
|
self.get_global_variables(),
|
940
979
|
):
|
@@ -1064,17 +1103,19 @@ class Namespace:
|
|
1064
1103
|
message="Possible circular import.",
|
1065
1104
|
severity=DiagnosticSeverity.INFORMATION,
|
1066
1105
|
source=DIAGNOSTICS_SOURCE_NAME,
|
1067
|
-
related_information=
|
1068
|
-
|
1069
|
-
|
1070
|
-
|
1071
|
-
|
1072
|
-
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
1076
|
-
|
1077
|
-
|
1106
|
+
related_information=(
|
1107
|
+
[
|
1108
|
+
DiagnosticRelatedInformation(
|
1109
|
+
location=Location(
|
1110
|
+
str(Uri.from_path(value.source)),
|
1111
|
+
value.range,
|
1112
|
+
),
|
1113
|
+
message=f"'{Path(self.source).name}' is also imported here.",
|
1114
|
+
)
|
1115
|
+
]
|
1116
|
+
if value.source
|
1117
|
+
else None
|
1118
|
+
),
|
1078
1119
|
code=Error.POSSIBLE_CIRCULAR_IMPORT,
|
1079
1120
|
)
|
1080
1121
|
else:
|
@@ -1140,20 +1181,24 @@ class Namespace:
|
|
1140
1181
|
uri=str(Uri.from_path(err.source)),
|
1141
1182
|
range=Range(
|
1142
1183
|
start=Position(
|
1143
|
-
line=
|
1144
|
-
|
1145
|
-
|
1146
|
-
|
1147
|
-
|
1184
|
+
line=(
|
1185
|
+
err.line_no - 1
|
1186
|
+
if err.line_no is not None
|
1187
|
+
else max(
|
1188
|
+
result.library_doc.line_no,
|
1189
|
+
0,
|
1190
|
+
)
|
1148
1191
|
),
|
1149
1192
|
character=0,
|
1150
1193
|
),
|
1151
1194
|
end=Position(
|
1152
|
-
line=
|
1153
|
-
|
1154
|
-
|
1155
|
-
|
1156
|
-
|
1195
|
+
line=(
|
1196
|
+
err.line_no - 1
|
1197
|
+
if err.line_no is not None
|
1198
|
+
else max(
|
1199
|
+
result.library_doc.line_no,
|
1200
|
+
0,
|
1201
|
+
)
|
1157
1202
|
),
|
1158
1203
|
character=0,
|
1159
1204
|
),
|
@@ -1261,17 +1306,21 @@ class Namespace:
|
|
1261
1306
|
message=f"Resource {entry} already imported.",
|
1262
1307
|
severity=DiagnosticSeverity.INFORMATION,
|
1263
1308
|
source=DIAGNOSTICS_SOURCE_NAME,
|
1264
|
-
related_information=
|
1265
|
-
|
1266
|
-
|
1267
|
-
|
1268
|
-
|
1269
|
-
|
1270
|
-
|
1271
|
-
|
1272
|
-
|
1273
|
-
|
1274
|
-
|
1309
|
+
related_information=(
|
1310
|
+
[
|
1311
|
+
DiagnosticRelatedInformation(
|
1312
|
+
location=Location(
|
1313
|
+
uri=str(
|
1314
|
+
Uri.from_path(already_imported_resources.import_source)
|
1315
|
+
),
|
1316
|
+
range=already_imported_resources.import_range,
|
1317
|
+
),
|
1318
|
+
message="",
|
1319
|
+
)
|
1320
|
+
]
|
1321
|
+
if already_imported_resources.import_source
|
1322
|
+
else None
|
1323
|
+
),
|
1275
1324
|
code=Error.RESOURCE_ALREADY_IMPORTED,
|
1276
1325
|
)
|
1277
1326
|
|
@@ -1293,17 +1342,19 @@ class Namespace:
|
|
1293
1342
|
message=f'Variables "{entry}" already imported.',
|
1294
1343
|
severity=DiagnosticSeverity.INFORMATION,
|
1295
1344
|
source=DIAGNOSTICS_SOURCE_NAME,
|
1296
|
-
related_information=
|
1297
|
-
|
1298
|
-
|
1299
|
-
|
1300
|
-
|
1301
|
-
|
1302
|
-
|
1303
|
-
|
1304
|
-
|
1305
|
-
|
1306
|
-
|
1345
|
+
related_information=(
|
1346
|
+
[
|
1347
|
+
DiagnosticRelatedInformation(
|
1348
|
+
location=Location(
|
1349
|
+
uri=str(Uri.from_path(already_imported_variables[0].import_source)),
|
1350
|
+
range=already_imported_variables[0].import_range,
|
1351
|
+
),
|
1352
|
+
message="",
|
1353
|
+
)
|
1354
|
+
]
|
1355
|
+
if already_imported_variables[0].import_source
|
1356
|
+
else None
|
1357
|
+
),
|
1307
1358
|
code=Error.VARIABLES_ALREADY_IMPORTED,
|
1308
1359
|
)
|
1309
1360
|
|
@@ -1318,17 +1369,19 @@ class Namespace:
|
|
1318
1369
|
' because it would override the "BuiltIn" library.',
|
1319
1370
|
severity=DiagnosticSeverity.INFORMATION,
|
1320
1371
|
source=DIAGNOSTICS_SOURCE_NAME,
|
1321
|
-
related_information=
|
1322
|
-
|
1323
|
-
|
1324
|
-
|
1325
|
-
|
1326
|
-
|
1327
|
-
|
1328
|
-
|
1329
|
-
|
1330
|
-
|
1331
|
-
|
1372
|
+
related_information=(
|
1373
|
+
[
|
1374
|
+
DiagnosticRelatedInformation(
|
1375
|
+
location=Location(
|
1376
|
+
uri=str(Uri.from_path(entry.import_source)),
|
1377
|
+
range=entry.import_range,
|
1378
|
+
),
|
1379
|
+
message="",
|
1380
|
+
)
|
1381
|
+
]
|
1382
|
+
if entry.import_source
|
1383
|
+
else None
|
1384
|
+
),
|
1332
1385
|
code=Error.LIBRARY_OVERRIDES_BUILTIN,
|
1333
1386
|
)
|
1334
1387
|
continue
|
@@ -1347,17 +1400,19 @@ class Namespace:
|
|
1347
1400
|
message=f'Library "{entry}" already imported.',
|
1348
1401
|
severity=DiagnosticSeverity.INFORMATION,
|
1349
1402
|
source=DIAGNOSTICS_SOURCE_NAME,
|
1350
|
-
related_information=
|
1351
|
-
|
1352
|
-
|
1353
|
-
|
1354
|
-
|
1355
|
-
|
1356
|
-
|
1357
|
-
|
1358
|
-
|
1359
|
-
|
1360
|
-
|
1403
|
+
related_information=(
|
1404
|
+
[
|
1405
|
+
DiagnosticRelatedInformation(
|
1406
|
+
location=Location(
|
1407
|
+
uri=str(Uri.from_path(already_imported_library[0].import_source)),
|
1408
|
+
range=already_imported_library[0].import_range,
|
1409
|
+
),
|
1410
|
+
message="",
|
1411
|
+
)
|
1412
|
+
]
|
1413
|
+
if already_imported_library[0].import_source
|
1414
|
+
else None
|
1415
|
+
),
|
1361
1416
|
code=Error.LIBRARY_ALREADY_IMPORTED,
|
1362
1417
|
)
|
1363
1418
|
|
@@ -1661,9 +1716,11 @@ class Namespace:
|
|
1661
1716
|
self._analyzed = not canceled
|
1662
1717
|
|
1663
1718
|
self._logger.debug(
|
1664
|
-
lambda:
|
1665
|
-
|
1666
|
-
|
1719
|
+
lambda: (
|
1720
|
+
f"end analyzed {self.document} succeed in {time.monotonic() - start_time}s"
|
1721
|
+
if self._analyzed
|
1722
|
+
else f"end analyzed {self.document} failed in {time.monotonic() - start_time}s"
|
1723
|
+
)
|
1667
1724
|
)
|
1668
1725
|
|
1669
1726
|
self.has_analysed(self)
|
@@ -5,8 +5,9 @@ import itertools
|
|
5
5
|
import os
|
6
6
|
from collections import defaultdict
|
7
7
|
from dataclasses import dataclass
|
8
|
-
from typing import Any, Dict, Iterator, List, Optional, Set, Tuple, Union
|
8
|
+
from typing import Any, Dict, Iterator, List, Optional, Set, Tuple, Type, Union
|
9
9
|
|
10
|
+
import robot.parsing.model.statements
|
10
11
|
from robot.parsing.lexer.tokens import Token
|
11
12
|
from robot.parsing.model.blocks import Keyword, TestCase
|
12
13
|
from robot.parsing.model.statements import (
|
@@ -206,11 +207,60 @@ class NamespaceAnalyzer(Visitor, ModelHelper):
|
|
206
207
|
if var_def not in self._variable_references:
|
207
208
|
self._variable_references[var_def] = set()
|
208
209
|
|
210
|
+
def visit_Var(self, node: Statement) -> None: # noqa: N802
|
211
|
+
name_token = node.get_token(Token.VARIABLE)
|
212
|
+
if name_token is None:
|
213
|
+
return
|
214
|
+
|
215
|
+
name = name_token.value
|
216
|
+
|
217
|
+
if name is not None:
|
218
|
+
match = search_variable(name, ignore_errors=True)
|
219
|
+
if not match.is_assign(allow_assign_mark=True):
|
220
|
+
return
|
221
|
+
|
222
|
+
if name.endswith("="):
|
223
|
+
name = name[:-1].rstrip()
|
224
|
+
|
225
|
+
r = range_from_token(
|
226
|
+
strip_variable_token(
|
227
|
+
Token(
|
228
|
+
name_token.type,
|
229
|
+
name,
|
230
|
+
name_token.lineno,
|
231
|
+
name_token.col_offset,
|
232
|
+
name_token.error,
|
233
|
+
)
|
234
|
+
)
|
235
|
+
)
|
236
|
+
# r.start.character = 0
|
237
|
+
# r.end.character = 0
|
238
|
+
|
239
|
+
var_def = self.namespace.find_variable(
|
240
|
+
name,
|
241
|
+
skip_commandline_variables=False,
|
242
|
+
nodes=self.node_stack,
|
243
|
+
position=range_from_token(node.get_token(Token.VAR)).start,
|
244
|
+
ignore_error=True,
|
245
|
+
)
|
246
|
+
if var_def is not None:
|
247
|
+
if var_def.name_range != r:
|
248
|
+
if self.namespace.document is not None:
|
249
|
+
self._variable_references[var_def].add(Location(self.namespace.document.document_uri, r))
|
250
|
+
else:
|
251
|
+
if self.namespace.document is not None:
|
252
|
+
self._variable_references[var_def] = set()
|
253
|
+
|
209
254
|
def generic_visit(self, node: ast.AST) -> None:
|
210
255
|
check_current_task_canceled()
|
211
256
|
|
212
257
|
super().generic_visit(node)
|
213
258
|
|
259
|
+
if get_robot_version() < (7, 0):
|
260
|
+
variable_statements: Tuple[Type[Any], ...] = (Variable,)
|
261
|
+
else:
|
262
|
+
variable_statements = (Variable, robot.parsing.model.statements.Var)
|
263
|
+
|
214
264
|
def visit(self, node: ast.AST) -> None:
|
215
265
|
check_current_task_canceled()
|
216
266
|
|
@@ -231,7 +281,7 @@ class NamespaceAnalyzer(Visitor, ModelHelper):
|
|
231
281
|
for token1 in (
|
232
282
|
t
|
233
283
|
for t in node.tokens
|
234
|
-
if not (isinstance(node,
|
284
|
+
if not (isinstance(node, self.variable_statements) and t.type == Token.VARIABLE)
|
235
285
|
and t.error is None
|
236
286
|
and contains_variable(t.value, "$@&%")
|
237
287
|
):
|
@@ -505,9 +555,7 @@ class NamespaceAnalyzer(Visitor, ModelHelper):
|
|
505
555
|
Uri.from_path(
|
506
556
|
err.source
|
507
557
|
if err.source is not None
|
508
|
-
else result.source
|
509
|
-
if result.source is not None
|
510
|
-
else "/<unknown>"
|
558
|
+
else result.source if result.source is not None else "/<unknown>"
|
511
559
|
)
|
512
560
|
),
|
513
561
|
range=Range(
|
@@ -48,3 +48,9 @@ class CacheConfig(ConfigBase):
|
|
48
48
|
save_location: CacheSaveLocation = CacheSaveLocation.WORKSPACE_STORAGE
|
49
49
|
ignored_libraries: List[str] = field(default_factory=list)
|
50
50
|
ignored_variables: List[str] = field(default_factory=list)
|
51
|
+
|
52
|
+
|
53
|
+
@config_section("robotcode.analysis.robot")
|
54
|
+
@dataclass
|
55
|
+
class AnalysisRobotConfig(ConfigBase):
|
56
|
+
global_library_search_order: List[str] = field(default_factory=list)
|
@@ -17,8 +17,7 @@ class Formatter(ABC):
|
|
17
17
|
return self._handles(line.strip() if self._strip_lines else line)
|
18
18
|
|
19
19
|
@abstractmethod
|
20
|
-
def _handles(self, line: str) -> bool:
|
21
|
-
...
|
20
|
+
def _handles(self, line: str) -> bool: ...
|
22
21
|
|
23
22
|
def add(self, line: str) -> None:
|
24
23
|
self._lines.append(line.strip() if self._strip_lines else line)
|
@@ -29,8 +28,7 @@ class Formatter(ABC):
|
|
29
28
|
return result
|
30
29
|
|
31
30
|
@abstractmethod
|
32
|
-
def format(self, lines: List[str]) -> str:
|
33
|
-
...
|
31
|
+
def format(self, lines: List[str]) -> str: ...
|
34
32
|
|
35
33
|
|
36
34
|
class MarkDownFormatter:
|
@@ -80,15 +78,13 @@ class SingleLineFormatter(Formatter):
|
|
80
78
|
return bool(not self._lines and self.match(line))
|
81
79
|
|
82
80
|
@abstractmethod
|
83
|
-
def match(self, line: str) -> Optional[re.Match[str]]:
|
84
|
-
...
|
81
|
+
def match(self, line: str) -> Optional[re.Match[str]]: ...
|
85
82
|
|
86
83
|
def format(self, lines: List[str]) -> str:
|
87
84
|
return self.format_line(lines[0])
|
88
85
|
|
89
86
|
@abstractmethod
|
90
|
-
def format_line(self, line: str) -> str:
|
91
|
-
...
|
87
|
+
def format_line(self, line: str) -> str: ...
|
92
88
|
|
93
89
|
|
94
90
|
class HeaderFormatter(SingleLineFormatter):
|
robotcode/robot/utils/stubs.py
CHANGED
@@ -33,8 +33,6 @@ class Languages(Protocol):
|
|
33
33
|
true_strings: Set[str]
|
34
34
|
false_strings: Set[str]
|
35
35
|
|
36
|
-
def add_language(self, name: str) -> None:
|
37
|
-
...
|
36
|
+
def add_language(self, name: str) -> None: ...
|
38
37
|
|
39
|
-
def __iter__(self) -> Iterator[Any]:
|
40
|
-
...
|
38
|
+
def __iter__(self) -> Iterator[Any]: ...
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: robotcode-robot
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.71.0
|
4
4
|
Summary: Support classes for RobotCode for handling Robot Framework projects.
|
5
5
|
Project-URL: Homepage, https://robotcode.io
|
6
6
|
Project-URL: Donate, https://github.com/sponsors/d-biehl
|
@@ -26,7 +26,7 @@ Classifier: Topic :: Utilities
|
|
26
26
|
Classifier: Typing :: Typed
|
27
27
|
Requires-Python: >=3.8
|
28
28
|
Requires-Dist: platformdirs<4.2.0,>=3.2.0
|
29
|
-
Requires-Dist: robotcode-core==0.
|
29
|
+
Requires-Dist: robotcode-core==0.71.0
|
30
30
|
Requires-Dist: robotframework>=4.1.0
|
31
31
|
Requires-Dist: tomli>=1.1.0; python_version < '3.11'
|
32
32
|
Description-Content-Type: text/markdown
|
@@ -1,29 +1,29 @@
|
|
1
1
|
robotcode/robot/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
robotcode/robot/__version__.py,sha256=
|
2
|
+
robotcode/robot/__version__.py,sha256=mNejnumd8tVE1XGXnMJ_BwjG-FRuO9U5tz0dQVo3UpU,23
|
3
3
|
robotcode/robot/py.typed,sha256=bWew9mHgMy8LqMu7RuqQXFXLBxh2CRx0dUbSx-3wE48,27
|
4
4
|
robotcode/robot/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
5
5
|
robotcode/robot/config/loader.py,sha256=RvFjU3fu5U4VlTSVDa0uUzZNAnpVdZwIy_4a0sXh6d0,5777
|
6
6
|
robotcode/robot/config/model.py,sha256=ZfzBA3iMqH2F7hWRmvRxOIiWj_ryyn6iSnjmA4ETuF4,82380
|
7
7
|
robotcode/robot/config/utils.py,sha256=mNNE8Uq5U78_OPwhOdZjtt1HufczyEHogGMB0azRcC4,2651
|
8
8
|
robotcode/robot/diagnostics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
9
|
-
robotcode/robot/diagnostics/document_cache_helper.py,sha256=
|
10
|
-
robotcode/robot/diagnostics/entities.py,sha256=
|
9
|
+
robotcode/robot/diagnostics/document_cache_helper.py,sha256=LRMMF6eVHpOw0RvgG1GqeUxjfgXDeguy5Mh13-JVZ80,20019
|
10
|
+
robotcode/robot/diagnostics/entities.py,sha256=m_AXtaMGrkk7f7oVOQc90-gA21y-sHiMbsxxI_YrmWc,11084
|
11
11
|
robotcode/robot/diagnostics/errors.py,sha256=VavgWYuHoW5sTT16j2rl9hxMhWxBKNSFsNmHWPzARQQ,1413
|
12
|
-
robotcode/robot/diagnostics/imports_manager.py,sha256=
|
13
|
-
robotcode/robot/diagnostics/library_doc.py,sha256=
|
12
|
+
robotcode/robot/diagnostics/imports_manager.py,sha256=HR71GvdjJd1uwcV9ARWVd6bkDBxVUwmojSIhK8-ZcCo,53246
|
13
|
+
robotcode/robot/diagnostics/library_doc.py,sha256=0m5VT0eBuFBwEDET65rnex-sDipGP-s0g3KUNS7kwD0,97659
|
14
14
|
robotcode/robot/diagnostics/model_helper.py,sha256=wkh2ltduJkl8YPU1UVltgrpRAgLZEAOqgfSsaSF9X54,29858
|
15
|
-
robotcode/robot/diagnostics/namespace.py,sha256=
|
16
|
-
robotcode/robot/diagnostics/namespace_analyzer.py,sha256=
|
17
|
-
robotcode/robot/diagnostics/workspace_config.py,sha256=
|
15
|
+
robotcode/robot/diagnostics/namespace.py,sha256=8n45qHM7WVqkpOh8IzcIl5_E85d5ozUBrVMWerL1x2A,86395
|
16
|
+
robotcode/robot/diagnostics/namespace_analyzer.py,sha256=I1svp-nOB9MslnHPMlb6VD24E64MbRLNAV95H0x3od4,48500
|
17
|
+
robotcode/robot/diagnostics/workspace_config.py,sha256=WbHH8R3KSX-ryPgUYgBnR6gPMpTST2o98Mqyp4p6liw,1729
|
18
18
|
robotcode/robot/utils/__init__.py,sha256=OjNPMn_XSnfaMCyKd8Kmq6vlRt6mIGlzW4qiiD3ykUg,447
|
19
19
|
robotcode/robot/utils/ast.py,sha256=N7PobxXjpPWwv6UBa-GBn5wn6RAsiRm8unP6UZt0P6M,10193
|
20
|
-
robotcode/robot/utils/markdownformatter.py,sha256=
|
20
|
+
robotcode/robot/utils/markdownformatter.py,sha256=IVVnCYJLpX8-sK73n3AjtjBVirB-Xa3U2ZudAtFUOD0,11621
|
21
21
|
robotcode/robot/utils/match.py,sha256=jxKXVpv0SHw_LxsDc1vgOxSGGtcV_9eO9cOVj4MAgIo,527
|
22
22
|
robotcode/robot/utils/robot_path.py,sha256=qKBh1cEnReBBLKkWu4gB9EzM-scAwE4xJc1m6v2LRN0,1786
|
23
|
-
robotcode/robot/utils/stubs.py,sha256=
|
23
|
+
robotcode/robot/utils/stubs.py,sha256=6-DMI_CQVJHDgG13t-zINKGCRb_Q7MQPm0_AkfhAEvE,748
|
24
24
|
robotcode/robot/utils/variables.py,sha256=fEl8S37lb_mD4hn2MZRAlkiuLGBjAOeZVK0r2o2CfPw,742
|
25
25
|
robotcode/robot/utils/visitor.py,sha256=uYLqEhGPmzWKWI3SSrmCaYMwtKvNShvbiPZ4b3FavX8,3241
|
26
|
-
robotcode_robot-0.
|
27
|
-
robotcode_robot-0.
|
28
|
-
robotcode_robot-0.
|
29
|
-
robotcode_robot-0.
|
26
|
+
robotcode_robot-0.71.0.dist-info/METADATA,sha256=_lW_qkoCAOKjsAUYHLivzJsmuIgIX6VmsnER4BgHzgs,2209
|
27
|
+
robotcode_robot-0.71.0.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87
|
28
|
+
robotcode_robot-0.71.0.dist-info/licenses/LICENSE.txt,sha256=B05uMshqTA74s-0ltyHKI6yoPfJ3zYgQbvcXfDVGFf8,10280
|
29
|
+
robotcode_robot-0.71.0.dist-info/RECORD,,
|
File without changes
|