summaryrefslogtreecommitdiffstats
path: root/src/debputy/lsp/lsp_debian_copyright.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/debputy/lsp/lsp_debian_copyright.py')
-rw-r--r--src/debputy/lsp/lsp_debian_copyright.py156
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)