summaryrefslogtreecommitdiffstats
path: root/src/debputy/lsp/lsp_debian_control.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/debputy/lsp/lsp_debian_control.py')
-rw-r--r--src/debputy/lsp/lsp_debian_control.py130
1 files changed, 30 insertions, 100 deletions
diff --git a/src/debputy/lsp/lsp_debian_control.py b/src/debputy/lsp/lsp_debian_control.py
index d00f1c2..f73612f 100644
--- a/src/debputy/lsp/lsp_debian_control.py
+++ b/src/debputy/lsp/lsp_debian_control.py
@@ -9,20 +9,6 @@ from typing import (
List,
)
-from debputy.lsp.vendoring._deb822_repro import (
- parse_deb822_file,
- Deb822FileElement,
- Deb822ParagraphElement,
-)
-from debputy.lsp.vendoring._deb822_repro.parsing import (
- Deb822KeyValuePairElement,
- LIST_SPACE_SEPARATED_INTERPRETATION,
-)
-from debputy.lsp.vendoring._deb822_repro.tokens import (
- Deb822Token,
- tokenize_deb822_file,
- Deb822FieldNameToken,
-)
from lsprotocol.types import (
DiagnosticSeverity,
Range,
@@ -30,7 +16,6 @@ from lsprotocol.types import (
Position,
DidOpenTextDocumentParams,
DidChangeTextDocumentParams,
- FoldingRangeKind,
FoldingRange,
FoldingRangeParams,
CompletionItem,
@@ -38,7 +23,6 @@ from lsprotocol.types import (
CompletionParams,
TEXT_DOCUMENT_DID_OPEN,
TEXT_DOCUMENT_DID_CHANGE,
- TEXT_DOCUMENT_FOLDING_RANGE,
TEXT_DOCUMENT_COMPLETION,
TEXT_DOCUMENT_WILL_SAVE_WAIT_UNTIL,
DiagnosticRelatedInformation,
@@ -58,7 +42,6 @@ from debputy.lsp.lsp_debian_control_reference_data import (
DctrlKnownField,
BINARY_FIELDS,
SOURCE_FIELDS,
- FieldValueClass,
DctrlFileMetadata,
)
from debputy.lsp.lsp_features import (
@@ -66,8 +49,15 @@ from debputy.lsp.lsp_features import (
lsp_completer,
lsp_hover,
lsp_standard_handler,
+ lsp_folding_ranges,
+ lsp_semantic_tokens_full,
+)
+from debputy.lsp.lsp_generic_deb822 import (
+ deb822_completer,
+ deb822_hover,
+ deb822_folding_ranges,
+ deb822_semantic_tokens_full,
)
-from debputy.lsp.lsp_generic_deb822 import deb822_completer, deb822_hover
from debputy.lsp.quickfixes import (
propose_remove_line_quick_fix,
range_compatible_with_remove_line_fix,
@@ -82,6 +72,19 @@ from debputy.lsp.text_util import (
detect_possible_typo,
te_range_to_lsp,
)
+from debputy.lsp.vendoring._deb822_repro import (
+ parse_deb822_file,
+ Deb822FileElement,
+ Deb822ParagraphElement,
+)
+from debputy.lsp.vendoring._deb822_repro.parsing import (
+ Deb822KeyValuePairElement,
+ LIST_SPACE_SEPARATED_INTERPRETATION,
+)
+from debputy.lsp.vendoring._deb822_repro.tokens import (
+ Deb822Token,
+ Deb822FieldNameToken,
+)
from debputy.util import _info, _error
try:
@@ -106,33 +109,9 @@ _LANGUAGE_IDS = [
]
-SEMANTIC_TOKENS_LEGEND = SemanticTokensLegend(
- token_types=["keyword"],
- token_modifiers=[],
-)
_DCTRL_FILE_METADATA = DctrlFileMetadata()
-def register_dctrl_lsp(ls: "LanguageServer") -> None:
- try:
- from debputy.lsp.vendoring._deb822_repro.locatable import Locatable
- except ImportError:
- _error(
- 'Sorry; this feature requires a newer version of python-debian (with "Locatable").'
- )
-
- ls.feature(TEXT_DOCUMENT_DID_OPEN)(_diagnostics_debian_control)
- ls.feature(TEXT_DOCUMENT_DID_CHANGE)(_diagnostics_debian_control)
- ls.feature(TEXT_DOCUMENT_FOLDING_RANGE)(_detect_folding_ranges_debian_control)
- ls.feature(TEXT_DOCUMENT_COMPLETION)(_debian_control_completions)
- ls.feature(TEXT_DOCUMENT_CODE_ACTION)(provide_standard_quickfixes_from_diagnostics)
- ls.feature(TEXT_DOCUMENT_HOVER)(_debian_control_hover)
- ls.feature(TEXT_DOCUMENT_WILL_SAVE_WAIT_UNTIL)(on_save_trim_end_of_line_whitespace)
- ls.feature(TEXT_DOCUMENT_SEMANTIC_TOKENS_FULL, SEMANTIC_TOKENS_LEGEND)(
- _handle_semantic_tokens_full
- )
-
-
lsp_standard_handler(_LANGUAGE_IDS, TEXT_DOCUMENT_CODE_ACTION)
lsp_standard_handler(_LANGUAGE_IDS, TEXT_DOCUMENT_WILL_SAVE_WAIT_UNTIL)
@@ -153,36 +132,12 @@ def _debian_control_completions(
return deb822_completer(ls, params, _DCTRL_FILE_METADATA)
-def _detect_folding_ranges_debian_control(
+@lsp_folding_ranges(_LANGUAGE_IDS)
+def _debian_control_folding_ranges(
ls: "LanguageServer",
params: FoldingRangeParams,
) -> Optional[Sequence[FoldingRange]]:
- doc = ls.workspace.get_text_document(params.text_document.uri)
- comment_start = -1
- folding_ranges = []
- for (
- token,
- start_line,
- start_offset,
- end_line,
- end_offset,
- ) in _deb822_token_iter(tokenize_deb822_file(doc.lines)):
- if token.is_comment:
- if comment_start < 0:
- comment_start = start_line
- _info(f"Detected new comment: {start_line}")
- elif comment_start > -1:
- comment_start = -1
- folding_range = FoldingRange(
- comment_start,
- end_line,
- kind=FoldingRangeKind.Comment,
- )
-
- folding_ranges.append(folding_range)
- _info(f"Detected folding range: {folding_range}")
-
- return folding_ranges
+ return deb822_folding_ranges(ls, params, _DCTRL_FILE_METADATA)
def _deb822_token_iter(
@@ -760,38 +715,13 @@ def _lint_debian_control(
return diagnostics
-def _handle_semantic_tokens_full(
+@lsp_semantic_tokens_full(_LANGUAGE_IDS)
+def _semantic_tokens_full(
ls: "LanguageServer",
request: SemanticTokensParams,
) -> Optional[SemanticTokens]:
- doc = ls.workspace.get_text_document(request.text_document.uri)
- lines = doc.lines
- deb822_file = parse_deb822_file(
- lines,
- accept_files_with_duplicated_fields=True,
- accept_files_with_error_tokens=True,
+ return deb822_semantic_tokens_full(
+ ls,
+ request,
+ _DCTRL_FILE_METADATA,
)
- tokens = []
- previous_line = 0
- keyword_token = 0
- no_modifiers = 0
-
- for paragraph_no, paragraph in enumerate(deb822_file, start=1):
- paragraph_position = paragraph.position_in_file()
- for kvpair in paragraph.iter_parts_of_type(Deb822KeyValuePairElement):
- field_position_without_comments = kvpair.position_in_parent().relative_to(
- paragraph_position
- )
- field_size = doc.position_codec.client_num_units(kvpair.field_name)
- current_line = field_position_without_comments.line_position
- line_delta = current_line - previous_line
- previous_line = current_line
- tokens.append(line_delta) # Line delta
- tokens.append(0) # Token delta
- tokens.append(field_size) # Token length
- tokens.append(keyword_token)
- tokens.append(no_modifiers)
-
- if not tokens:
- return None
- return SemanticTokens(tokens)