diff options
Diffstat (limited to 'src/debputy/lsp/lsp_debian_copyright.py')
-rw-r--r-- | src/debputy/lsp/lsp_debian_copyright.py | 156 |
1 files changed, 33 insertions, 123 deletions
diff --git a/src/debputy/lsp/lsp_debian_copyright.py b/src/debputy/lsp/lsp_debian_copyright.py index 052654a..f22bd0b 100644 --- a/src/debputy/lsp/lsp_debian_copyright.py +++ b/src/debputy/lsp/lsp_debian_copyright.py @@ -10,36 +10,16 @@ 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, Diagnostic, Position, - DidOpenTextDocumentParams, - DidChangeTextDocumentParams, - FoldingRangeKind, - FoldingRange, - FoldingRangeParams, CompletionItem, CompletionList, CompletionParams, TEXT_DOCUMENT_DID_OPEN, TEXT_DOCUMENT_DID_CHANGE, - TEXT_DOCUMENT_FOLDING_RANGE, TEXT_DOCUMENT_COMPLETION, TEXT_DOCUMENT_WILL_SAVE_WAIT_UNTIL, DiagnosticRelatedInformation, @@ -53,10 +33,11 @@ from lsprotocol.types import ( TEXT_DOCUMENT_SEMANTIC_TOKENS_FULL, SemanticTokens, SemanticTokensParams, + FoldingRangeParams, + FoldingRange, ) from debputy.lsp.lsp_debian_control_reference_data import ( - FieldValueClass, _DEP5_HEADER_FIELDS, _DEP5_FILES_FIELDS, Deb822KnownField, @@ -68,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, propose_correct_text_quick_fix, @@ -83,7 +71,20 @@ from debputy.lsp.text_util import ( detect_possible_typo, te_range_to_lsp, ) -from debputy.util import _info, _error +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 _error try: from debputy.lsp.vendoring._deb822_repro.locatable import ( @@ -109,32 +110,6 @@ _LANGUAGE_IDS = [ _DEP5_FILE_METADATA = Dep5FileMetadata() -SEMANTIC_TOKENS_LEGEND = SemanticTokensLegend( - token_types=["keyword"], - token_modifiers=[], -) - - -def register_dcpy_lsp(ls: "LanguageServer") -> None: - try: - from debian._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_copyright) - ls.feature(TEXT_DOCUMENT_DID_CHANGE)(_diagnostics_debian_copyright) - ls.feature(TEXT_DOCUMENT_FOLDING_RANGE)(_detect_folding_ranges_debian_copyright) - ls.feature(TEXT_DOCUMENT_COMPLETION)(_debian_copyright_completions) - ls.feature(TEXT_DOCUMENT_CODE_ACTION)(provide_standard_quickfixes_from_diagnostics) - ls.feature(TEXT_DOCUMENT_HOVER)(_debian_copyright_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) @@ -155,36 +130,12 @@ def _debian_copyright_completions( return deb822_completer(ls, params, _DEP5_FILE_METADATA) -def _detect_folding_ranges_debian_copyright( +@lsp_folding_ranges(_LANGUAGE_IDS) +def _debian_copyright_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, _DEP5_FILE_METADATA) def _deb822_token_iter( @@ -576,22 +527,6 @@ def _scan_for_syntax_errors_and_token_level_diagnostics( return first_error -def _diagnostics_debian_copyright( - ls: "LanguageServer", - params: Union[DidOpenTextDocumentParams, DidChangeTextDocumentParams], -) -> None: - doc = ls.workspace.get_text_document(params.text_document.uri) - _info(f"Opened document: {doc.path} ({doc.language_id})") - lines = doc.lines - position_codec: LintCapablePositionCodec = doc.position_codec - - diagnostics = _lint_debian_copyright(doc.uri, doc.path, lines, position_codec) - ls.publish_diagnostics( - doc.uri, - diagnostics, - ) - - @lint_diagnostics(_LANGUAGE_IDS) def _lint_debian_copyright( doc_reference: str, @@ -648,38 +583,13 @@ def _lint_debian_copyright( 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, + _DEP5_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) |