Skip to content

Commit e3b7827

Browse files
committed
some refactorings and simplifications
1 parent f184544 commit e3b7827

33 files changed

+250
-224
lines changed

robotcode/language_server/__main__.py

Lines changed: 75 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import sys
77
from logging.handlers import RotatingFileHandler
88
from pathlib import Path
9+
from typing import Any
910

1011
__file__ = os.path.abspath(__file__)
1112
if __file__.endswith((".pyc", ".pyo")):
@@ -60,53 +61,103 @@ def run_server(mode: str, port: int) -> None:
6061
with RobotLanguageServer(mode=JsonRpcServerMode(mode), tcp_params=TcpParams("127.0.0.1", port)) as server:
6162
try:
6263
server.run()
63-
except (SystemExit, KeyboardInterrupt):
64+
except SystemExit:
65+
raise
66+
except KeyboardInterrupt:
6467
pass
6568
except BaseException as e:
6669
_logger.exception(e)
6770

6871

69-
def main() -> None:
70-
parser = argparse.ArgumentParser(
72+
def create_parser() -> argparse.ArgumentParser:
73+
result = argparse.ArgumentParser(
7174
description="RobotCode Language Server",
7275
prog=__package__,
7376
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
7477
)
7578

76-
parser.add_argument("--version", action="store_true", help="shows the version and exits")
77-
parser.add_argument(
79+
result.add_argument("--version", action="store_true", help="shows the version and exits")
80+
result.add_argument(
7881
"-m",
7982
"--mode",
8083
default="stdio",
8184
choices=["stdio", "tcp"],
8285
help="communication mode",
8386
)
84-
parser.add_argument("-p", "--port", default=6610, help="server listen port (tcp)", type=int)
85-
parser.add_argument("--log", action="store_true", help="enable logging")
86-
parser.add_argument("--log-json-rpc", action="store_true", help="show json-rpc log messages")
87-
parser.add_argument("--log-json-rpc-data", action="store_true", help="show json-rpc messages log messages")
88-
parser.add_argument("--log-language-server", action="store_true", help="show language server log messages")
89-
parser.add_argument(
87+
result.add_argument("-p", "--port", default=6610, help="server listen port (tcp)", type=int)
88+
result.add_argument("--log", action="store_true", help="enable logging")
89+
result.add_argument("--log-json-rpc", action="store_true", help="show json-rpc log messages")
90+
result.add_argument("--log-json-rpc-data", action="store_true", help="show json-rpc messages log messages")
91+
result.add_argument("--log-language-server", action="store_true", help="show language server log messages")
92+
result.add_argument(
9093
"--log-language-server-parts", action="store_true", help="show language server parts log messages"
9194
)
92-
parser.add_argument(
95+
result.add_argument(
9396
"--log-robotframework", action="store_true", help="show robotframework language server log messages"
9497
)
95-
parser.add_argument("--debug-asyncio", action="store_true", help="enable async io debugging messages")
96-
parser.add_argument("--log-asyncio", action="store_true", help="show asyncio log messages")
97-
parser.add_argument("--log-colored", action="store_true", help="colored output for logs")
98-
parser.add_argument("--log-config", default=None, help="reads logging configuration from file", metavar="FILE")
99-
parser.add_argument("--log-file", default=None, help="enables logging to file", metavar="FILE")
100-
parser.add_argument("--log-level", default="WARNING", help="sets the overall log level", metavar="LEVEL")
101-
parser.add_argument("--call-tracing", action="store_true", help="enables log tracing of method calls")
102-
parser.add_argument(
98+
result.add_argument("--debug-asyncio", action="store_true", help="enable async io debugging messages")
99+
result.add_argument("--log-asyncio", action="store_true", help="show asyncio log messages")
100+
result.add_argument("--log-colored", action="store_true", help="colored output for logs")
101+
result.add_argument("--log-config", default=None, help="reads logging configuration from file", metavar="FILE")
102+
result.add_argument("--log-file", default=None, help="enables logging to file", metavar="FILE")
103+
result.add_argument("--log-level", default="WARNING", help="sets the overall log level", metavar="LEVEL")
104+
result.add_argument("--call-tracing", action="store_true", help="enables log tracing of method calls")
105+
result.add_argument(
103106
"--call-tracing-default-level", default="TRACE", help="sets the default level for call tracing", metavar="LEVEL"
104107
)
105-
parser.add_argument("--debugpy", action="store_true", help="starts a debugpy session")
106-
parser.add_argument(
108+
result.add_argument("--debugpy", action="store_true", help="starts a debugpy session")
109+
result.add_argument(
107110
"--debugpy-port", default=5678, help="sets the port for debugpy session", type=int, metavar="PORT"
108111
)
109-
parser.add_argument("--debugpy-wait-for-client", action="store_true", help="waits for debugpy client to connect")
112+
result.add_argument("--debugpy-wait-for-client", action="store_true", help="waits for debugpy client to connect")
113+
return result
114+
115+
116+
def init_colored_logs(log_level: Any) -> bool:
117+
try:
118+
import coloredlogs
119+
120+
coloredlogs.install(level=log_level)
121+
except ImportError:
122+
return False
123+
124+
return True
125+
126+
127+
def init_logging(args: argparse.Namespace) -> None:
128+
log_level = logging._checkLevel(args.log_level) if args.log else logging.WARNING # type: ignore
129+
130+
log_initialized = False
131+
if args.log_colored:
132+
log_initialized = init_colored_logs(log_level)
133+
134+
if not log_initialized:
135+
logging.basicConfig(level=log_level)
136+
137+
if args.log_file is not None:
138+
_logger.logger.addHandler(get_log_handler(args.log_file))
139+
140+
if not args.log_asyncio:
141+
logging.getLogger("asyncio").propagate = False
142+
143+
if not args.log_json_rpc:
144+
logging.getLogger("robotcode.jsonrpc2").propagate = False
145+
146+
if not args.log_json_rpc_data:
147+
logging.getLogger("robotcode.jsonrpc2.protocol.JsonRPCProtocol.message").propagate = False
148+
149+
if not args.log_language_server:
150+
logging.getLogger("robotcode.language_server.common").propagate = False
151+
152+
if not args.log_language_server_parts:
153+
logging.getLogger("robotcode.language_server.common.parts").propagate = False
154+
155+
if not args.log_robotframework:
156+
logging.getLogger("robotcode.language_server.robotframework").propagate = False
157+
158+
159+
def main() -> None:
160+
parser = create_parser()
110161

111162
args = parser.parse_args()
112163

@@ -133,41 +184,7 @@ def main() -> None:
133184

134185
logging.config.fileConfig(args.log_config, disable_existing_loggers=True)
135186
else:
136-
log_level = logging._checkLevel(args.log_level) if args.log else logging.WARNING # type: ignore
137-
138-
log_initialized = False
139-
if args.log_colored:
140-
try:
141-
import coloredlogs
142-
143-
coloredlogs.install(level=log_level)
144-
log_initialized = True
145-
except ImportError:
146-
pass
147-
148-
if not log_initialized:
149-
logging.basicConfig(level=log_level)
150-
151-
if args.log_file is not None:
152-
_logger.logger.addHandler(get_log_handler(args.log_file))
153-
154-
if not args.log_asyncio:
155-
logging.getLogger("asyncio").propagate = False
156-
157-
if not args.log_json_rpc:
158-
logging.getLogger("robotcode.jsonrpc2").propagate = False
159-
160-
if not args.log_json_rpc_data:
161-
logging.getLogger("robotcode.jsonrpc2.protocol.JsonRPCProtocol.message").propagate = False
162-
163-
if not args.log_language_server:
164-
logging.getLogger("robotcode.language_server.common").propagate = False
165-
166-
if not args.log_language_server_parts:
167-
logging.getLogger("robotcode.language_server.common.parts").propagate = False
168-
169-
if not args.log_robotframework:
170-
logging.getLogger("robotcode.language_server.robotframework").propagate = False
187+
init_logging(args)
171188

172189
_logger.info(f"starting language server version={__version__}")
173190
_logger.debug(f"args={args}")

robotcode/language_server/common/language.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from typing import Any, Callable, List, Protocol, TypeVar, runtime_checkable
22

3+
from robotcode.language_server.common.text_document import TextDocument
4+
35
_F = TypeVar("_F", bound=Callable[..., Any])
46

57

@@ -53,3 +55,10 @@ def decorator(func: _F) -> _F:
5355
@runtime_checkable
5456
class HasAllCommitCharacters(Protocol):
5557
__all_commit_characters__: List[str]
58+
59+
60+
def language_id_filter(document: TextDocument) -> Callable[[Any], bool]:
61+
def filter(c: Any) -> bool:
62+
return not isinstance(c, HasLanguageId) or c.__language_id__ == document.language_id
63+
64+
return filter

robotcode/language_server/common/lsp_types.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -941,25 +941,25 @@ class ServerCapabilities(Model):
941941
definition_provider: Union[bool, DefinitionOptions, None] = None
942942
implementation_provider: Union[bool, ImplementationOptions, ImplementationRegistrationOptions, None] = None
943943
references_provider: Union[bool, ReferenceOptions, None] = None
944-
# document_highlight_provider: Union[bool, DocumentHighlightOptions, None] = None
944+
# TODO document_highlight_provider: Union[bool, DocumentHighlightOptions, None] = None
945945
document_symbol_provider: Union[bool, DocumentSymbolOptions, None] = None
946-
# code_action_provider: Union[bool, CodeActionOptions] = None
946+
# TODO code_action_provider: Union[bool, CodeActionOptions] = None
947947
code_lens_provider: Optional[CodeLensOptions] = None
948-
# document_link_provider: Optional[DocumentLinkOptions] = None
949-
# color_provider: Union[bool, DocumentColorOptions, DocumentColorRegistrationOptions, None] = None
948+
# TODO document_link_provider: Optional[DocumentLinkOptions] = None
949+
# TODO color_provider: Union[bool, DocumentColorOptions, DocumentColorRegistrationOptions, None] = None
950950
document_formatting_provider: Union[bool, DocumentFormattingOptions, None] = None
951951
document_range_formatting_provider: Union[bool, DocumentRangeFormattingOptions, None] = None
952-
# document_on_type_formatting_provider: Optional[DocumentOnTypeFormattingOptions] = None
953-
# rename_provider: Union[bool, RenameOptions, None] = None
952+
# TODO document_on_type_formatting_provider: Optional[DocumentOnTypeFormattingOptions] = None
953+
# TODO rename_provider: Union[bool, RenameOptions, None] = None
954954
folding_range_provider: Union[bool, FoldingRangeOptions, FoldingRangeRegistrationOptions, None] = None
955955
execute_command_provider: Optional[ExecuteCommandOptions] = None
956-
# selection_range_provider: Union[bool, SelectionRangeOptions, SelectionRangeRegistrationOptions, None] = None
957-
# linked_editing_range_provider: Union[
956+
# TODO selection_range_provider: Union[bool, SelectionRangeOptions, SelectionRangeRegistrationOptions, None] = None
957+
# TODO linked_editing_range_provider: Union[
958958
# boolean, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions, None
959959
# ] = None
960-
# call_hierarchy_provider: Union[boolean, CallHierarchyOptions, CallHierarchyRegistrationOptions, None] = None
960+
# TODO call_hierarchy_provider: Union[boolean, CallHierarchyOptions, CallHierarchyRegistrationOptions, None] = None
961961
semantic_tokens_provider: Union[SemanticTokensOptions, SemanticTokensRegistrationOptions, None] = None
962-
# moniker_provider: Union[bool, MonikerOptions, MonikerRegistrationOptions, None] = None
962+
# TODO moniker_provider: Union[bool, MonikerOptions, MonikerRegistrationOptions, None] = None
963963
workspace_symbol_provider: Union[bool, WorkspaceSymbolOptions, None] = None
964964
workspace: Optional[ServerCapabilitiesWorkspace] = None
965965
experimental: Optional[Any] = None

robotcode/language_server/common/parts/code_lens.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from ....utils.async_event import async_tasking_event
88
from ....utils.logging import LoggingDescriptor
99
from ..has_extend_capabilities import HasExtendCapabilities
10-
from ..language import HasLanguageId
10+
from ..language import language_id_filter
1111
from ..lsp_types import (
1212
CodeLens,
1313
CodeLensOptions,
@@ -31,11 +31,11 @@ def __init__(self, parent: LanguageServerProtocol) -> None:
3131
super().__init__(parent)
3232

3333
@async_tasking_event
34-
async def collect(sender, document: TextDocument) -> Optional[List[CodeLens]]:
34+
async def collect(sender, document: TextDocument) -> Optional[List[CodeLens]]: # NOSONAR
3535
...
3636

3737
@async_tasking_event
38-
async def resolve(sender, code_lens: CodeLens) -> Optional[CodeLens]:
38+
async def resolve(sender, code_lens: CodeLens) -> Optional[CodeLens]: # NOSONAR
3939
...
4040

4141
def extend_capabilities(self, capabilities: ServerCapabilities) -> None:
@@ -49,11 +49,7 @@ async def _text_document_code_lens(
4949

5050
results: List[CodeLens] = []
5151
document = self.parent.documents[text_document.uri]
52-
for result in await self.collect(
53-
self,
54-
document,
55-
callback_filter=lambda c: not isinstance(c, HasLanguageId) or c.__language_id__ == document.language_id,
56-
):
52+
for result in await self.collect(self, document, callback_filter=language_id_filter(document)):
5753
if isinstance(result, BaseException):
5854
if not isinstance(result, CancelledError):
5955
self._logger.exception(result, exc_info=result)
@@ -92,6 +88,6 @@ async def refresh(self) -> None:
9288
and self.parent.client_capabilities.workspace.code_lens is not None
9389
and self.parent.client_capabilities.workspace.code_lens.refresh_support
9490
):
95-
pass
91+
return
9692

9793
await self.parent.send_request("workspace/codeLens/refresh")

robotcode/language_server/common/parts/completion.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from ....utils.async_event import async_tasking_event
99
from ....utils.logging import LoggingDescriptor
1010
from ..has_extend_capabilities import HasExtendCapabilities
11-
from ..language import HasAllCommitCharacters, HasLanguageId, HasTriggerCharacters
11+
from ..language import HasAllCommitCharacters, HasTriggerCharacters, language_id_filter
1212
from ..lsp_types import (
1313
CompletionContext,
1414
CompletionItem,
@@ -36,12 +36,12 @@ def __init__(self, parent: LanguageServerProtocol) -> None:
3636

3737
@async_tasking_event
3838
async def collect(
39-
sender, document: TextDocument, position: Position, context: Optional[CompletionContext]
39+
sender, document: TextDocument, position: Position, context: Optional[CompletionContext] # NOSONAR
4040
) -> Union[List[CompletionItem], CompletionList, None]:
4141
...
4242

4343
@async_tasking_event
44-
async def resolve(sender, completion_item: CompletionItem) -> CompletionItem:
44+
async def resolve(sender, completion_item: CompletionItem) -> CompletionItem: # NOSONAR
4545
...
4646

4747
def extend_capabilities(self, capabilities: ServerCapabilities) -> None:
@@ -91,7 +91,7 @@ async def _text_document_completion(
9191
document,
9292
position,
9393
context,
94-
callback_filter=lambda c: not isinstance(c, HasLanguageId) or c.__language_id__ == document.language_id,
94+
callback_filter=language_id_filter(document),
9595
):
9696
if isinstance(result, BaseException):
9797
if not isinstance(result, CancelledError):

robotcode/language_server/common/parts/declaration.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from ....utils.async_event import async_tasking_event
88
from ....utils.logging import LoggingDescriptor
99
from ..has_extend_capabilities import HasExtendCapabilities
10-
from ..language import HasLanguageId
10+
from ..language import language_id_filter
1111
from ..lsp_types import (
1212
DeclarationParams,
1313
Location,
@@ -34,7 +34,7 @@ def __init__(self, parent: LanguageServerProtocol) -> None:
3434

3535
@async_tasking_event
3636
async def collect(
37-
sender, document: TextDocument, position: Position
37+
sender, document: TextDocument, position: Position # NOSONAR
3838
) -> Union[Location, List[Location], List[LocationLink], None]:
3939
...
4040

@@ -58,12 +58,7 @@ async def _text_document_declaration(
5858
location_links: List[LocationLink] = []
5959

6060
document = self.parent.documents[text_document.uri]
61-
for result in await self.collect(
62-
self,
63-
document,
64-
position,
65-
callback_filter=lambda c: not isinstance(c, HasLanguageId) or c.__language_id__ == document.language_id,
66-
):
61+
for result in await self.collect(self, document, position, callback_filter=language_id_filter(document)):
6762
if isinstance(result, BaseException):
6863
if not isinstance(result, CancelledError):
6964
self._logger.exception(result, exc_info=result)

robotcode/language_server/common/parts/definition.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from ....utils.async_event import async_tasking_event
88
from ....utils.logging import LoggingDescriptor
99
from ..has_extend_capabilities import HasExtendCapabilities
10-
from ..language import HasLanguageId
10+
from ..language import language_id_filter
1111
from ..lsp_types import (
1212
DefinitionParams,
1313
Location,
@@ -34,7 +34,7 @@ def __init__(self, parent: LanguageServerProtocol) -> None:
3434

3535
@async_tasking_event
3636
async def collect(
37-
sender, document: TextDocument, position: Position
37+
sender, document: TextDocument, position: Position # NOSONAR
3838
) -> Union[Location, List[Location], List[LocationLink], None]:
3939
...
4040

@@ -58,12 +58,7 @@ async def _text_document_definition(
5858
location_links: List[LocationLink] = []
5959

6060
document = self.parent.documents[text_document.uri]
61-
for result in await self.collect(
62-
self,
63-
document,
64-
position,
65-
callback_filter=lambda c: not isinstance(c, HasLanguageId) or c.__language_id__ == document.language_id,
66-
):
61+
for result in await self.collect(self, document, position, callback_filter=language_id_filter(document)):
6762
if isinstance(result, BaseException):
6863
if not isinstance(result, CancelledError):
6964
self._logger.exception(result, exc_info=result)

0 commit comments

Comments
 (0)