Skip to content

Commit 498af3c

Browse files
committed
fix(langserver): only send complete documentation when resolving completion items for typed dicts and enums
1 parent 39e509e commit 498af3c

File tree

2 files changed

+44
-21
lines changed
  • packages

2 files changed

+44
-21
lines changed

packages/language_server/src/robotcode/language_server/robotframework/parts/completion.py

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ class RobotCompletionProtocolPart(RobotLanguageServerProtocolPart):
127127

128128
def __init__(self, parent: "RobotLanguageServerProtocol") -> None:
129129
super().__init__(parent)
130-
130+
self.doc_cache: Dict[str, str] = {}
131131
parent.completion.collect.add(self.collect)
132132
parent.completion.resolve.add(self.resolve)
133133

@@ -171,9 +171,9 @@ def collect(
171171
model = self.parent.documents_cache.get_model(document, False)
172172

173173
config = self.get_config(document)
174-
174+
self.doc_cache = {}
175175
return CompletionCollector(
176-
self.parent,
176+
self,
177177
document,
178178
model,
179179
namespace,
@@ -195,7 +195,7 @@ def resolve(self, sender: Any, completion_item: CompletionItem) -> CompletionIte
195195
config = self.get_config(document)
196196

197197
return CompletionCollector(
198-
self.parent,
198+
self,
199199
document,
200200
model,
201201
namespace,
@@ -331,7 +331,7 @@ class CompletionCollector(ModelHelper):
331331

332332
def __init__(
333333
self,
334-
parent: "RobotLanguageServerProtocol",
334+
parent: "RobotCompletionProtocolPart",
335335
document: TextDocument,
336336
model: ast.AST,
337337
namespace: Namespace,
@@ -407,7 +407,7 @@ def resolve(self, completion_item: CompletionItem) -> CompletionItem:
407407
if data is not None:
408408
document_uri = data.get("document_uri", None)
409409
if document_uri is not None:
410-
document = self.parent.documents.get(document_uri)
410+
document = self.parent.parent.documents.get(document_uri)
411411
if document is not None and (comp_type := data.get("type", None)) is not None:
412412
if comp_type in [
413413
CompleteResultKind.MODULE.name,
@@ -532,11 +532,15 @@ def resolve(self, completion_item: CompletionItem) -> CompletionItem:
532532
raise
533533
except BaseException:
534534
pass
535+
elif comp_type == CompleteResultKind.DOC_CACHE.name:
536+
if (name := data.get("name", None)) is not None:
537+
if (doc := self.parent.doc_cache.get(name, None)) is not None:
538+
completion_item.documentation = MarkupContent(kind=MarkupKind.MARKDOWN, value=doc)
535539

536540
return completion_item
537541

538542
def create_headers_completion_items(self, range: Optional[Range]) -> List[CompletionItem]:
539-
doc_type = self.parent.documents_cache.get_document_type(self.document)
543+
doc_type = self.parent.parent.documents_cache.get_document_type(self.document)
540544

541545
if self.namespace.languages is None:
542546
if doc_type in [DocumentType.RESOURCE, DocumentType.INIT]:
@@ -624,7 +628,7 @@ def create_variables_completion_items(
624628
]
625629

626630
def create_settings_completion_items(self, range: Optional[Range]) -> List[CompletionItem]:
627-
doc_type = self.parent.documents_cache.get_document_type(self.document)
631+
doc_type = self.parent.parent.documents_cache.get_document_type(self.document)
628632

629633
settings_class: Type[Settings] = SuiteFileSettings
630634
if doc_type == DocumentType.RESOURCE:
@@ -2283,21 +2287,24 @@ def _complete_keyword_arguments_at_position(
22832287

22842288
for i, b_snippet in enumerate(bool_snippets):
22852289
if b_snippet[0]:
2290+
cache_name = f"BOOL{id(type_info)}_{i}"
2291+
self.parent.doc_cache[cache_name] = type_info.to_markdown()
22862292
result.append(
22872293
CompletionItem(
22882294
label=b_snippet[0],
22892295
kind=CompletionItemKind.CONSTANT,
22902296
detail=f"{type_info.name}({b_snippet[1]})",
2291-
documentation=MarkupContent(
2292-
MarkupKind.MARKDOWN,
2293-
type_info.to_markdown(),
2294-
),
22952297
sort_text=f"01_000_{int(not b_snippet[1])}_{b_snippet[0]}",
22962298
insert_text_format=InsertTextFormat.PLAIN_TEXT,
22972299
text_edit=TextEdit(
22982300
range=completion_range,
22992301
new_text=b_snippet[0],
23002302
),
2303+
data=CompletionItemData(
2304+
document_uri=str(self.document.uri),
2305+
type=CompleteResultKind.DOC_CACHE.name,
2306+
name=cache_name,
2307+
),
23012308
)
23022309
)
23032310
elif type_info.name == "None":
@@ -2325,18 +2332,29 @@ def _complete_keyword_arguments_at_position(
23252332
)
23262333
if type_info.members:
23272334
for member_index, member in enumerate(type_info.members):
2335+
cache_name = f"TYPE_MEMBER{id(type_info)}_{member_index}"
2336+
self.parent.doc_cache[cache_name] = (
2337+
f"```python\n{member.name} = {member.value}\n```"
2338+
"\n\n---"
2339+
f"\n{type_info.to_markdown(only_doc=True)}"
2340+
)
23282341
result.append(
23292342
CompletionItem(
23302343
label=member.name,
23312344
kind=CompletionItemKind.ENUM_MEMBER,
2332-
detail=type_info.name,
2345+
detail=f"{type_info.name}({type_info.type})",
23332346
documentation=MarkupContent(
23342347
MarkupKind.MARKDOWN,
2335-
f"```python\n{member.name} = {member.value}\n```\n\n{type_info.to_markdown()}",
2348+
f"```python\n{member.name} = {member.value}\n```",
23362349
),
2337-
sort_text=f"09_{i:03}_{member_index:03}_{member.name}",
2350+
sort_text=f"09_{i:9}_{member_index:09}_{member.name}",
23382351
insert_text_format=InsertTextFormat.PLAIN_TEXT,
23392352
text_edit=TextEdit(range=completion_range, new_text=member.name),
2353+
data=CompletionItemData(
2354+
document_uri=str(self.document.uri),
2355+
type=CompleteResultKind.DOC_CACHE.name,
2356+
name=cache_name,
2357+
),
23402358
)
23412359
)
23422360
if type_info.items:
@@ -2357,19 +2375,22 @@ def _complete_keyword_arguments_at_position(
23572375
+ "}",
23582376
]
23592377
for i, snippet in enumerate(snippets):
2378+
cache_name = f"TYPE_ITEMS{id(type_info)}_{i}"
2379+
self.parent.doc_cache[cache_name] = type_info.to_markdown()
23602380
if snippet:
23612381
result.append(
23622382
CompletionItem(
23632383
label=snippet,
23642384
kind=CompletionItemKind.STRUCT,
2365-
detail=type_info.name,
2366-
documentation=MarkupContent(
2367-
MarkupKind.MARKDOWN,
2368-
type_info.to_markdown(),
2369-
),
2370-
sort_text=f"08_{i:03}_{snippet}",
2385+
detail=f"{type_info.name}({type_info.type})",
2386+
sort_text=f"08_{i:09}_{snippet}",
23712387
insert_text_format=InsertTextFormat.SNIPPET,
23722388
text_edit=TextEdit(range=completion_range, new_text=snippet),
2389+
data=CompletionItemData(
2390+
document_uri=str(self.document.uri),
2391+
type=CompleteResultKind.DOC_CACHE.name,
2392+
name=cache_name,
2393+
),
23732394
)
23742395
)
23752396

packages/robot/src/robotcode/robot/diagnostics/library_doc.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2091,6 +2091,7 @@ def _get_type_docs(keywords: List[Any], custom_converters: List[Any]) -> Set[Rob
20912091
td.usages,
20922092
[EnumMember(m.name, m.value) for m in td.members] if td.members else None,
20932093
[TypedDictItem(i.key, i.type, i.required) for i in td.items] if td.items else None,
2094+
# TODO nested types like Literals
20942095
libname=libdoc.name,
20952096
libtype=libdoc.type,
20962097
doc_format=libdoc.doc_format,
@@ -2463,6 +2464,7 @@ class CompleteResultKind(Enum):
24632464
VARIABLES_MODULE = "Variables Module"
24642465
FOLDER = "Directory"
24652466
KEYWORD = "Keyword"
2467+
DOC_CACHE = "DOC_CACHE"
24662468

24672469

24682470
class CompleteResult(NamedTuple):

0 commit comments

Comments
 (0)