|
10 | 10 | import weakref
|
11 | 11 | import zlib
|
12 | 12 | from abc import ABC, abstractmethod
|
13 |
| -from ast import walk |
14 | 13 | from collections import OrderedDict
|
15 | 14 | from concurrent.futures import ProcessPoolExecutor
|
16 | 15 | from dataclasses import dataclass
|
|
25 | 24 | Mapping,
|
26 | 25 | Optional,
|
27 | 26 | Tuple,
|
28 |
| - cast, |
29 | 27 | final,
|
30 | 28 | )
|
31 | 29 |
|
|
41 | 39 | from robotcode.language_server.common.parts.workspace import FileWatcherEntry, Workspace
|
42 | 40 | from robotcode.language_server.common.text_document import TextDocument
|
43 | 41 | from robotcode.language_server.robotframework.configuration import CacheSaveLocation, RobotCodeConfig
|
44 |
| -from robotcode.language_server.robotframework.utils.ast_utils import HasError, HasErrors, Token |
45 | 42 | from robotcode.language_server.robotframework.utils.robot_path import find_file_ex
|
46 | 43 | from robotcode.language_server.robotframework.utils.version import get_robot_version, get_robot_version_str
|
47 | 44 |
|
48 | 45 | from ...__version__ import __version__
|
49 | 46 | from .entities import CommandLineVariableDefinition, VariableDefinition
|
50 | 47 | from .library_doc import (
|
51 | 48 | ROBOT_LIBRARY_PACKAGE,
|
52 |
| - ArgumentSpec, |
53 | 49 | CompleteResult,
|
54 |
| - Error, |
55 |
| - KeywordArgumentDoc, |
56 |
| - KeywordDoc, |
57 |
| - KeywordStore, |
58 | 50 | LibraryDoc,
|
59 | 51 | ModuleSpec,
|
60 | 52 | VariablesDoc,
|
|
65 | 57 | find_library,
|
66 | 58 | find_variables,
|
67 | 59 | get_library_doc,
|
| 60 | + get_model_doc, |
68 | 61 | get_module_spec,
|
69 | 62 | get_variables_doc,
|
70 |
| - is_embedded_keyword, |
71 | 63 | is_library_by_path,
|
72 | 64 | is_variables_by_path,
|
73 | 65 | resolve_args,
|
@@ -1177,121 +1169,10 @@ def get_libdoc_from_model(
|
1177 | 1169 | scope: str = "GLOBAL",
|
1178 | 1170 | append_model_errors: bool = True,
|
1179 | 1171 | ) -> LibraryDoc:
|
1180 |
| - from robot.errors import DataError |
1181 |
| - from robot.libdocpkg.robotbuilder import KeywordDocBuilder |
1182 |
| - from robot.parsing.lexer.tokens import Token as RobotToken |
1183 |
| - from robot.parsing.model.statements import KeywordName |
1184 |
| - from robot.running.builder.transformers import ResourceBuilder |
1185 |
| - from robot.running.model import ResourceFile |
1186 |
| - from robot.running.usererrorhandler import UserErrorHandler |
1187 |
| - from robot.running.userkeyword import UserLibrary |
1188 |
| - |
1189 |
| - errors: List[Error] = [] |
1190 |
| - keyword_names: List[KeywordName] = [] |
1191 |
| - |
1192 |
| - for node in walk(model): |
1193 |
| - if isinstance(node, KeywordName): |
1194 |
| - keyword_names.append(node) |
1195 |
| - |
1196 |
| - error = node.error if isinstance(node, HasError) else None |
1197 |
| - if error is not None: |
1198 |
| - errors.append(Error(message=error, type_name="ModelError", source=source, line_no=node.lineno)) |
1199 |
| - if append_model_errors: |
1200 |
| - node_errors = node.errors if isinstance(node, HasErrors) else None |
1201 |
| - if node_errors is not None: |
1202 |
| - for e in node_errors: |
1203 |
| - errors.append(Error(message=e, type_name="ModelError", source=source, line_no=node.lineno)) |
1204 |
| - |
1205 |
| - def get_keyword_name_token_from_line(line: int) -> Optional[Token]: |
1206 |
| - for keyword_name in keyword_names: |
1207 |
| - if keyword_name.lineno == line: |
1208 |
| - return cast(Token, keyword_name.get_token(RobotToken.KEYWORD_NAME)) |
1209 |
| - |
1210 |
| - return None |
1211 |
| - |
1212 |
| - res = ResourceFile(source=source) |
1213 |
| - |
1214 |
| - ResourceBuilder(res).visit(model) |
1215 |
| - |
1216 |
| - class MyUserLibrary(UserLibrary): |
1217 |
| - current_kw: Any = None |
1218 |
| - |
1219 |
| - def _log_creating_failed(self, handler: UserErrorHandler, error: BaseException) -> None: |
1220 |
| - err = Error( |
1221 |
| - message=f"Creating keyword '{handler.name}' failed: {error!s}", |
1222 |
| - type_name=type(error).__qualname__, |
1223 |
| - source=self.current_kw.source if self.current_kw is not None else None, |
1224 |
| - line_no=self.current_kw.lineno if self.current_kw is not None else None, |
1225 |
| - ) |
1226 |
| - errors.append(err) |
1227 |
| - |
1228 |
| - def _create_handler(self, kw: Any) -> Any: |
1229 |
| - self.current_kw = kw |
1230 |
| - try: |
1231 |
| - handler = super()._create_handler(kw) |
1232 |
| - setattr(handler, "errors", None) |
1233 |
| - except DataError as e: |
1234 |
| - err = Error( |
1235 |
| - message=str(e), |
1236 |
| - type_name=type(e).__qualname__, |
1237 |
| - source=kw.source, |
1238 |
| - line_no=kw.lineno, |
1239 |
| - ) |
1240 |
| - errors.append(err) |
1241 |
| - |
1242 |
| - handler = UserErrorHandler(e, kw.name, self.name) |
1243 |
| - handler.source = kw.source |
1244 |
| - handler.lineno = kw.lineno |
1245 |
| - |
1246 |
| - setattr(handler, "errors", [err]) |
1247 |
| - |
1248 |
| - return handler |
1249 |
| - |
1250 |
| - lib = MyUserLibrary(res) |
1251 |
| - |
1252 |
| - libdoc = LibraryDoc( |
1253 |
| - name=lib.name or "", |
1254 |
| - doc=lib.doc, |
1255 |
| - type=model_type, |
1256 |
| - scope=scope, |
1257 |
| - source=source, |
1258 |
| - line_no=1, |
1259 |
| - errors=errors, |
| 1172 | + return get_model_doc( |
| 1173 | + model=model, source=source, model_type=model_type, scope=scope, append_model_errors=append_model_errors |
1260 | 1174 | )
|
1261 | 1175 |
|
1262 |
| - libdoc.keywords = KeywordStore( |
1263 |
| - source=libdoc.name, |
1264 |
| - source_type=libdoc.type, |
1265 |
| - keywords=[ |
1266 |
| - KeywordDoc( |
1267 |
| - name=kw[0].name, |
1268 |
| - args=[KeywordArgumentDoc.from_robot(a) for a in kw[0].args], |
1269 |
| - doc=kw[0].doc, |
1270 |
| - tags=list(kw[0].tags), |
1271 |
| - source=str(kw[0].source), |
1272 |
| - name_token=get_keyword_name_token_from_line(kw[0].lineno), |
1273 |
| - line_no=kw[0].lineno if kw[0].lineno is not None else -1, |
1274 |
| - col_offset=-1, |
1275 |
| - end_col_offset=-1, |
1276 |
| - end_line_no=-1, |
1277 |
| - libname=libdoc.name, |
1278 |
| - libtype=libdoc.type, |
1279 |
| - longname=f"{libdoc.name}.{kw[0].name}", |
1280 |
| - is_embedded=is_embedded_keyword(kw[0].name), |
1281 |
| - errors=getattr(kw[1], "errors") if hasattr(kw[1], "errors") else None, |
1282 |
| - is_error_handler=isinstance(kw[1], UserErrorHandler), |
1283 |
| - error_handler_message=str(cast(UserErrorHandler, kw[1]).error) |
1284 |
| - if isinstance(kw[1], UserErrorHandler) |
1285 |
| - else None, |
1286 |
| - arguments=ArgumentSpec.from_robot_argument_spec(kw[1].arguments), |
1287 |
| - parent=libdoc.digest, |
1288 |
| - ) |
1289 |
| - for kw in [(KeywordDocBuilder(resource=True).build_keyword(lw), lw) for lw in lib.handlers] |
1290 |
| - ], |
1291 |
| - ) |
1292 |
| - |
1293 |
| - return libdoc |
1294 |
| - |
1295 | 1176 | @_logger.call
|
1296 | 1177 | async def get_libdoc_for_variables_import(
|
1297 | 1178 | self,
|
|
0 commit comments