|
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