Skip to content

Commit

Permalink
To collect semantic tokens the completion context is now always needed.
Browse files Browse the repository at this point in the history
  • Loading branch information
fabioz committed Feb 28, 2022
1 parent e165c03 commit 744afc4
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 12 deletions.
8 changes: 8 additions & 0 deletions robotframework-ls/src/robotframework_ls/impl/ast_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,14 @@ def _iter_nodes(node, stack=None, recursive=True):
stack.pop()


def iter_all_nodes_recursive(node):
"""
This function will iterate over all the nodes. Use only if there's no
other way to implement it as iterating over all the nodes is slow...
"""
yield from _iter_nodes(node)


def _iter_nodes_filtered_not_recursive(
ast, accept_class: Union[Tuple[str, ...], str]
) -> Iterator[Tuple[list, Any]]:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -356,18 +356,17 @@ def semantic_tokens_full(context: ICompletionContext):
ast = context.doc.get_ast()
except:
return []
return semantic_tokens_full_from_ast(ast, context.monitor)


def semantic_tokens_full_from_ast(ast, monitor: Optional[IMonitor]):
from robotframework_ls.impl import ast_utils

monitor = context.monitor

ret: List[int] = []
append = ret.append

last_line = 0
last_column = 0
for _stack, node in ast_utils._iter_nodes(ast, recursive=True):
for _stack, node in ast_utils.iter_all_nodes_recursive(ast):
if monitor:
monitor.check_cancelled()
tokens = getattr(node, "tokens", None)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,7 @@ def run():
prefix=code["prefix"],
full_code=code["full_code"],
indent=code["indent"],
uri=uri,
monitor=None,
)
except:
Expand Down
3 changes: 2 additions & 1 deletion robotframework-ls/src/robotframework_ls/server_api/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ def request_semantic_tokens_full(
)

def request_semantic_tokens_from_code_full(
self, prefix: str, full_code: str, indent: str
self, prefix: str, full_code: str, indent: str, uri: str
) -> Optional[IIdMessageMatcher]:
"""
:Note: async complete.
Expand All @@ -144,6 +144,7 @@ def request_semantic_tokens_from_code_full(
prefix=prefix,
full_code=full_code,
indent=indent,
uri=uri,
)
)

Expand Down
20 changes: 14 additions & 6 deletions robotframework-ls/src/robotframework_ls/server_api/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -895,13 +895,14 @@ def threaded_monaco_completions_from_code_full(
}

def m_semantic_tokens_from_code_full(
self, prefix: str = "", full_code: str = "", indent: str = ""
self, prefix: str = "", full_code: str = "", indent: str = "", uri: str = ""
):
func = partial(
self.threaded_semantic_tokens_from_code_full,
prefix=prefix,
full_code=full_code,
indent=indent,
uri=uri,
)
func = require_monitor(func)
return func
Expand All @@ -911,17 +912,24 @@ def threaded_semantic_tokens_from_code_full(
prefix: str,
full_code: str,
indent: str,
uri: str,
monitor: Optional[IMonitor] = None,
):
from robotframework_ls.impl.semantic_tokens import semantic_tokens_full_from_ast
from robotframework_ls.impl.semantic_tokens import semantic_tokens_full
from robotframework_ls.impl.completion_context import CompletionContext

try:
from robotframework_ls.impl.robot_workspace import RobotDocument

doc = RobotDocument("")
doc.source = full_code
ast = doc.get_ast()
data = semantic_tokens_full_from_ast(ast, monitor)
document = RobotDocument(uri, full_code)
completion_context = CompletionContext(
document,
config=self.config,
monitor=monitor,
workspace=self.workspace,
)

data = semantic_tokens_full(completion_context)
if not prefix:
return {"resultId": None, "data": data}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ def test_iter_nodes():
"unused", source="*** settings ***\nResource my_resource.resource"
)
lst = []
for stack, node in ast_utils._iter_nodes(doc.get_ast()):
for stack, node in ast_utils.iter_all_nodes_recursive(doc.get_ast()):
lst.append(
"%s - %s" % ([s.__class__.__name__ for s in stack], node.__class__.__name__)
)
Expand Down

0 comments on commit 744afc4

Please sign in to comment.