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

1from typing import Optional, List, Any 

2 

3from debputy.linting.lint_util import LintState 

4from debputy.lsp.text_util import LintCapablePositionCodec 

5from debputy.plugin.api.feature_set import PluginProvidedFeatureSet 

6 

7try: 

8 from pygls.server import LanguageServer 

9 from pygls.workspace import TextDocument 

10except ImportError as e: 

11 

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 

17 

18 

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 

25 

26 @property 

27 def plugin_feature_set(self) -> PluginProvidedFeatureSet: 

28 return self._ls.plugin_feature_set 

29 

30 @property 

31 def doc_uri(self) -> str: 

32 return self._doc.uri 

33 

34 @property 

35 def path(self) -> str: 

36 return self._doc.path 

37 

38 @property 

39 def lines(self) -> List[str]: 

40 return self._lines 

41 

42 @property 

43 def position_codec(self) -> LintCapablePositionCodec: 

44 return self._doc.position_codec 

45 

46 

47class DebputyLanguageServer(LanguageServer): 

48 

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 

56 

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 

65 

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 

73 

74 def lint_state(self, doc: "TextDocument") -> LintState: 

75 return LSProvidedLintState(self, doc)