Coverage for src/debputy/lsp/debputy_ls.py: 74%
48 statements
« prev ^ index » next coverage.py v7.2.7, created at 2024-04-07 12:14 +0200
« prev ^ index » next coverage.py v7.2.7, created at 2024-04-07 12:14 +0200
1from typing import Optional, List, Any
3from debputy.linting.lint_util import LintState
4from debputy.lsp.text_util import LintCapablePositionCodec
5from debputy.plugin.api.feature_set import PluginProvidedFeatureSet
7try:
8 from pygls.server import LanguageServer
9 from pygls.workspace import TextDocument
10except ImportError as e:
12 class LanguageServer:
13 def __init__(self, *args, **kwargs) -> None:
14 """Placeholder to work if pygls is not installed"""
15 # Should not be called
16 raise e
19class LSProvidedLintState(LintState):
20 def __init__(self, ls: "DebputyLanguageServer", doc: "TextDocument") -> None:
21 self._ls = ls
22 self._doc = doc
23 # Cache lines (doc.lines re-splits everytime)
24 self._lines = doc.lines
26 @property
27 def plugin_feature_set(self) -> PluginProvidedFeatureSet:
28 return self._ls.plugin_feature_set
30 @property
31 def doc_uri(self) -> str:
32 return self._doc.uri
34 @property
35 def path(self) -> str:
36 return self._doc.path
38 @property
39 def lines(self) -> List[str]:
40 return self._lines
42 @property
43 def position_codec(self) -> LintCapablePositionCodec:
44 return self._doc.position_codec
47class DebputyLanguageServer(LanguageServer):
49 def __init__(
50 self,
51 *args: Any,
52 **kwargs: Any,
53 ):
54 super().__init__(*args, **kwargs)
55 self._plugin_feature_set: Optional[PluginProvidedFeatureSet] = None
57 @property
58 def plugin_feature_set(self) -> PluginProvidedFeatureSet:
59 res = self._plugin_feature_set
60 if res is None: 60 ↛ 61line 60 didn't jump to line 61, because the condition on line 60 was never true
61 raise RuntimeError(
62 "Initialization error: The plugin feature set has not been initialized before it was needed."
63 )
64 return res
66 @plugin_feature_set.setter
67 def plugin_feature_set(self, plugin_feature_set: PluginProvidedFeatureSet) -> None:
68 if self._plugin_feature_set is not None: 68 ↛ 69line 68 didn't jump to line 69, because the condition on line 68 was never true
69 raise RuntimeError(
70 "The plugin_feature_set attribute cannot be changed once set"
71 )
72 self._plugin_feature_set = plugin_feature_set
74 def lint_state(self, doc: "TextDocument") -> LintState:
75 return LSProvidedLintState(self, doc)