6
6
import sys
7
7
from logging .handlers import RotatingFileHandler
8
8
from pathlib import Path
9
+ from typing import Any
9
10
10
11
__file__ = os .path .abspath (__file__ )
11
12
if __file__ .endswith ((".pyc" , ".pyo" )):
@@ -60,53 +61,103 @@ def run_server(mode: str, port: int) -> None:
60
61
with RobotLanguageServer (mode = JsonRpcServerMode (mode ), tcp_params = TcpParams ("127.0.0.1" , port )) as server :
61
62
try :
62
63
server .run ()
63
- except (SystemExit , KeyboardInterrupt ):
64
+ except SystemExit :
65
+ raise
66
+ except KeyboardInterrupt :
64
67
pass
65
68
except BaseException as e :
66
69
_logger .exception (e )
67
70
68
71
69
- def main () -> None :
70
- parser = argparse .ArgumentParser (
72
+ def create_parser () -> argparse . ArgumentParser :
73
+ result = argparse .ArgumentParser (
71
74
description = "RobotCode Language Server" ,
72
75
prog = __package__ ,
73
76
formatter_class = argparse .ArgumentDefaultsHelpFormatter ,
74
77
)
75
78
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 (
78
81
"-m" ,
79
82
"--mode" ,
80
83
default = "stdio" ,
81
84
choices = ["stdio" , "tcp" ],
82
85
help = "communication mode" ,
83
86
)
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 (
90
93
"--log-language-server-parts" , action = "store_true" , help = "show language server parts log messages"
91
94
)
92
- parser .add_argument (
95
+ result .add_argument (
93
96
"--log-robotframework" , action = "store_true" , help = "show robotframework language server log messages"
94
97
)
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 (
103
106
"--call-tracing-default-level" , default = "TRACE" , help = "sets the default level for call tracing" , metavar = "LEVEL"
104
107
)
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 (
107
110
"--debugpy-port" , default = 5678 , help = "sets the port for debugpy session" , type = int , metavar = "PORT"
108
111
)
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 ()
110
161
111
162
args = parser .parse_args ()
112
163
@@ -133,41 +184,7 @@ def main() -> None:
133
184
134
185
logging .config .fileConfig (args .log_config , disable_existing_loggers = True )
135
186
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 )
171
188
172
189
_logger .info (f"starting language server version={ __version__ } " )
173
190
_logger .debug (f"args={ args } " )
0 commit comments