From 0c40d0e1656c07fd1e15ad1a6ae42d4097f694e6 Mon Sep 17 00:00:00 2001 From: Alex Carney Date: Mon, 1 Feb 2021 16:17:25 +0000 Subject: [PATCH] Provide completion suggestions for a directive's options (#78) Contributes towards #36 --- .gitignore | 3 +- docs/lsp/features.rst | 10 ++- lib/esbonio/changes/36.feature.rst | 2 + lib/esbonio/esbonio/lsp/__init__.py | 2 +- .../esbonio/lsp/completion/directives.py | 78 +++++++++++++--- lib/esbonio/esbonio/lsp/completion/roles.py | 28 +++++- .../data/sphinx-default/directive_options.rst | 2 + .../tests/lsp/completion/test_integration.py | 84 ++++++++++++++++-- .../tests/lsp/completion/test_roles.py | 8 +- .../complete-directive-options-demo.gif | Bin 0 -> 43108 bytes 10 files changed, 192 insertions(+), 25 deletions(-) create mode 100644 lib/esbonio/changes/36.feature.rst create mode 100644 lib/esbonio/tests/data/sphinx-default/directive_options.rst create mode 100644 resources/images/complete-directive-options-demo.gif diff --git a/.gitignore b/.gitignore index 7d5cb348..e86da6bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .coverage .env +.ipynb_checkpoints .tox .vscode-test @@ -14,4 +15,4 @@ node_modules dist .changes.html -CHANGELOG.md \ No newline at end of file +CHANGELOG.md diff --git a/docs/lsp/features.rst b/docs/lsp/features.rst index 0f64e5fd..43e79e51 100644 --- a/docs/lsp/features.rst +++ b/docs/lsp/features.rst @@ -15,7 +15,7 @@ Directives .. figure:: ../../resources/images/complete-directive-demo.gif :align: center - Completing directive targets + Completing directive names .. note:: @@ -25,6 +25,14 @@ Directives Support for additional domains will come in a future release +Directive Options +^^^^^^^^^^^^^^^^^ + +.. figure:: ../../resources/images/complete-directive-options-demo.gif + :align: center + + Completing a directive's options + Roles ^^^^^ diff --git a/lib/esbonio/changes/36.feature.rst b/lib/esbonio/changes/36.feature.rst new file mode 100644 index 00000000..c9643692 --- /dev/null +++ b/lib/esbonio/changes/36.feature.rst @@ -0,0 +1,2 @@ +**Language Server** Directive option completions are now provided + within a directive's options block diff --git a/lib/esbonio/esbonio/lsp/__init__.py b/lib/esbonio/esbonio/lsp/__init__.py index 10ccc4d8..f42b092a 100644 --- a/lib/esbonio/esbonio/lsp/__init__.py +++ b/lib/esbonio/esbonio/lsp/__init__.py @@ -132,7 +132,7 @@ def on_completion(rst: RstLanguageServer, params: CompletionParams): match = pattern.match(line) if match: for handler in handlers: - items += handler(match, line, doc) + items += handler(match, doc, pos) return CompletionList(False, items) diff --git a/lib/esbonio/esbonio/lsp/completion/directives.py b/lib/esbonio/esbonio/lsp/completion/directives.py index 4167d26e..6fe069ce 100644 --- a/lib/esbonio/esbonio/lsp/completion/directives.py +++ b/lib/esbonio/esbonio/lsp/completion/directives.py @@ -11,8 +11,7 @@ from esbonio.lsp import RstLanguageServer -def to_completion_item(name: str, directive) -> CompletionItem: - """Convert an rst directive to its CompletionItem representation.""" +def resolve_directive(directive): # 'Core' docutils directives are returned as tuples (modulename, ClassName) # so its up to us to resolve the reference @@ -23,6 +22,13 @@ def to_completion_item(name: str, directive) -> CompletionItem: module = importlib.import_module(modulename) directive = getattr(module, cls) + return directive + + +def directive_to_completion_item(name: str, directive) -> CompletionItem: + """Convert an rst directive to its CompletionItem representation.""" + + directive = resolve_directive(directive) documentation = inspect.getdoc(directive) # TODO: Give better names to arguments based on what they represent. @@ -41,6 +47,23 @@ def to_completion_item(name: str, directive) -> CompletionItem: ) +def options_to_completion_items(directive) -> List[CompletionItem]: + """Convert a directive's options to a list of completion items.""" + + directive = resolve_directive(directive) + options = directive.option_spec + + if options is None: + return [] + + return [ + CompletionItem( + opt, detail="option", kind=CompletionItemKind.Field, insert_text=f"{opt}:" + ) + for opt in options + ] + + class DirectiveCompletion: """A completion handler for directives.""" @@ -68,26 +91,61 @@ def discover(self): dirs = {**dirs, **std_directives, **py_directives} self.directives = { - k: to_completion_item(k, v) + k: directive_to_completion_item(k, v) for k, v in dirs.items() if k != "restructuredtext-test-directive" } + + self.options = { + k: options_to_completion_items(v) + for k, v in dirs.items() + if k in self.directives + } + self.rst.logger.debug("Discovered %s directives", len(self.directives)) suggest_triggers = [ re.compile( r""" - ^\s* # directives may be indented - \.\. # they start with an rst comment - [ ]* # followed by a space - ([\w-]+)?$ # with an optional name + ^\s* # directives may be indented + \.\. # they start with an rst comment + [ ]* # followed by a space + (?P[\w-]+)?$ # with an optional name """, re.VERBOSE, - ) + ), + re.compile( + r""" + (?P\s+) # directive options must only be preceeded by whitespace + : # they start with a ':' + (?P[\w-]*) # they have a name + $ + """, + re.VERBOSE, + ), ] - def suggest(self, match, line, doc) -> List[CompletionItem]: - return list(self.directives.values()) + def suggest(self, match, doc, position) -> List[CompletionItem]: + groups = match.groupdict() + + if "indent" not in groups: + return list(self.directives.values()) + + # Search backwards so that we can determine the context for our completion + indent = groups["indent"] + linum = position.line - 1 + line = doc.lines[linum] + + while line.startswith(indent): + linum -= 1 + line = doc.lines[linum] + + # Only offer completions if we're within a directive's option block + match = re.match(r"\s*\.\.[ ]*(?P[\w-]+)::", line) + if not match: + return [] + + return self.options.get(match.group("name"), []) def setup(rst: RstLanguageServer): diff --git a/lib/esbonio/esbonio/lsp/completion/roles.py b/lib/esbonio/esbonio/lsp/completion/roles.py index 6ed7bfb1..cc730077 100644 --- a/lib/esbonio/esbonio/lsp/completion/roles.py +++ b/lib/esbonio/esbonio/lsp/completion/roles.py @@ -116,7 +116,27 @@ def discover(self): ) ] - def suggest(self, match, line, doc) -> List[CompletionItem]: + def suggest(self, match, doc, position) -> List[CompletionItem]: + indent = match.group(1) + + # If there's no indent, then this can only be a role defn + if indent == "": + return list(self.roles.values()) + + # Otherwise, search backwards until we find a blank line or an unindent + # so that we can determine the appropriate context. + linum = position.line - 1 + line = doc.lines[linum] + + while line.startswith(indent): + linum -= 1 + line = doc.lines[linum] + + # Unless we are within a directive's options block, we should offer role + # suggestions + if re.match(r"\s*\.\.[ ]*([\w-]+)::", line): + return [] + return list(self.roles.values()) @@ -200,7 +220,7 @@ def save(self, params: DidSaveTextDocumentParams): ), ] - def suggest(self, match, line, doc) -> List[CompletionItem]: + def suggest(self, match, doc, position) -> List[CompletionItem]: # TODO: Detect if we're in an angle bracket e.g. :ref:`More Info <|` in that # situation, add the closing '>' to the completion item insert text. @@ -264,7 +284,7 @@ def initialize(self): suggest_triggers = RoleTargetCompletion.suggest_triggers - def suggest(self, match, line, doc) -> List[CompletionItem]: + def suggest(self, match, doc, position) -> List[CompletionItem]: return list(self.namespaces.values()) @@ -341,7 +361,7 @@ def initialize(self): ), ] - def suggest(self, match, line, doc) -> List[CompletionItem]: + def suggest(self, match, doc, position) -> List[CompletionItem]: # TODO: Detect if we're in an angle bracket e.g. :ref:`More Info <|` in that # situation, add the closing '>' to the completion item insert text. diff --git a/lib/esbonio/tests/data/sphinx-default/directive_options.rst b/lib/esbonio/tests/data/sphinx-default/directive_options.rst new file mode 100644 index 00000000..71f4118e --- /dev/null +++ b/lib/esbonio/tests/data/sphinx-default/directive_options.rst @@ -0,0 +1,2 @@ +.. image:: filename.png + :alt: test diff --git a/lib/esbonio/tests/lsp/completion/test_integration.py b/lib/esbonio/tests/lsp/completion/test_integration.py index 97f568aa..d1169a31 100644 --- a/lib/esbonio/tests/lsp/completion/test_integration.py +++ b/lib/esbonio/tests/lsp/completion/test_integration.py @@ -1,6 +1,10 @@ +import logging import itertools +import pathlib import time +from typing import Set + import py.test from pygls.features import ( @@ -9,6 +13,7 @@ TEXT_DOCUMENT_DID_CHANGE, TEXT_DOCUMENT_DID_OPEN, ) +from pygls.server import LanguageServer from pygls.types import ( CompletionContext, CompletionParams, @@ -23,11 +28,55 @@ VersionedTextDocumentIdentifier, ) -WAIT = 0.1 +WAIT = 0.1 # How long should we sleep after an lsp.notify(...) + + +def do_completion_test( + client: LanguageServer, + server: LanguageServer, + root: pathlib.Path, + filename: str, + text: str, + expected: Set[str], + insert_newline: bool = True, +): + """A generic helper for performing completion tests. + Being an integration test, it is quite involved as it has to use the protocol to + take the server to a point where it can provide completion suggestions. As part of + the setup, this helper -def do_completion_test(client, server, root, text, expected): - """The actual implementation of the completion test""" + - Sends an 'initialize' request to the server, setting the workspace root. + - Sends a 'textDocument/didOpen' notification, loading the specified document in the + server's workspace + - Sends a 'textDocument/didChange' notification, inserting the text we want + suggestions for + - Sends a 'completion' request, and ensures that the expected completed items are in + the response + + Currently this method is only capable of ensuring that item labels are as expected, + none of the other CompletionItem fields are inspected. This method is also not capable + of ensuring particular items are NOT suggested. + + Parameters + ---------- + client: + The client LanguageServer instance + server: + The server LanguageServer instance + root: + The directory to use as the workspace root + filename: + The file to open for the test, relative to the workspace root + text: + The text to insert, this is the text this method requests completions for. + Note this CANNOT contain any newlines. + expected: + The CompletionItem labels that should be returned. This does not have to be + exhaustive. + insert_newline: + Flag to indicate if a newline should be inserted before the given ``text`` + """ # Initialize the language server. response = client.lsp.send_request( @@ -46,7 +95,7 @@ def do_completion_test(client, server, root, text, expected): # time.sleep(WAIT) # Let's open a file to edit. - testfile = root / "index.rst" + testfile = root / filename testuri = testfile.as_uri() content = testfile.read_text() @@ -60,7 +109,8 @@ def do_completion_test(client, server, root, text, expected): # With the setup out of the way, let's type the text we want completion suggestions # for - start = len(content.splitlines()) + 1 + start = len(content.splitlines()) + insert_newline + text = "\n" + text if insert_newline else text client.lsp.notify( TEXT_DOCUMENT_DID_CHANGE, @@ -68,7 +118,7 @@ def do_completion_test(client, server, root, text, expected): VersionedTextDocumentIdentifier(testuri, 2), [ TextDocumentContentChangeEvent( - Range(Position(start, 0), Position(start, 0)), text="\n" + text + Range(Position(start, 0), Position(start, 0)), text=text ) ], ), @@ -335,4 +385,24 @@ def test_expected_completions(client_server, testdata, text, setup): project, expected = setup root = testdata(project, path_only=True) - do_completion_test(client, server, root, text, expected) + do_completion_test(client, server, root, "index.rst", text, expected) + + +def test_expected_directive_option_completions(client_server, testdata, caplog): + """Ensure that we can handle directive option completions.""" + + caplog.set_level(logging.INFO) + + client, server = client_server + root = testdata("sphinx-default", path_only=True) + expected = {"align", "alt", "class", "height", "name", "scale", "target", "width"} + + do_completion_test( + client, + server, + root, + "directive_options.rst", + " :a", + expected, + insert_newline=False, + ) diff --git a/lib/esbonio/tests/lsp/completion/test_roles.py b/lib/esbonio/tests/lsp/completion/test_roles.py index 4f218e8a..25412a7b 100644 --- a/lib/esbonio/tests/lsp/completion/test_roles.py +++ b/lib/esbonio/tests/lsp/completion/test_roles.py @@ -101,7 +101,13 @@ def test_target_type_discovery(sphinx, role, objects): "sphinx-default", "doc", CompletionItemKind.File, - {"glossary", "index", "theorems/index", "theorems/pythagoras"}, + { + "glossary", + "index", + "theorems/index", + "theorems/pythagoras", + "directive_options", + }, ), ( "sphinx-default", diff --git a/resources/images/complete-directive-options-demo.gif b/resources/images/complete-directive-options-demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b2f1595186acdbbd6d17f9eb78401dd9f685e62 GIT binary patch literal 43108 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 literal 0 HcmV?d00001