diff options
Diffstat (limited to 'src/debputy/lsp/lsp_debian_control.py')
-rw-r--r-- | src/debputy/lsp/lsp_debian_control.py | 130 |
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) |