8
8
9
9
module RubyLsp
10
10
module Rails
11
+ module Common
12
+ # Write a message to the client. Can be used for sending notifications to the editor
13
+ def send_message ( message )
14
+ json_message = message . to_json
15
+ @stdout . write ( "Content-Length: #{ json_message . length } \r \n \r \n #{ json_message } " )
16
+ end
17
+
18
+ # Log a debug message to the editor's output
19
+ def debug_message ( message )
20
+ $stderr. puts ( message )
21
+ end
22
+ end
23
+
11
24
class ServerAddon
25
+ include Common
26
+
12
27
@server_addon_classes = [ ]
13
28
@server_addons = { }
14
29
@@ -38,12 +53,6 @@ def initialize(stdout)
38
53
@stdout = stdout
39
54
end
40
55
41
- # Write a response back. Can be used for sending notifications to the editor
42
- def write_response ( response )
43
- json_response = response . to_json
44
- @stdout . write ( "Content-Length: #{ json_response . length } \r \n \r \n #{ json_response } " )
45
- end
46
-
47
56
def name
48
57
raise NotImplementedError , "Not implemented!"
49
58
end
@@ -54,6 +63,8 @@ def execute(request, params)
54
63
end
55
64
56
65
class Server
66
+ include Common
67
+
57
68
def initialize ( stdout : $stdout, override_default_output_device : true )
58
69
# Grab references to the original pipes so that we can change the default output device further down
59
70
@stdin = $stdin
@@ -79,8 +90,7 @@ def start
79
90
routes_reloader = ::Rails . application . routes_reloader
80
91
routes_reloader . execute_unless_loaded if routes_reloader &.respond_to? ( :execute_unless_loaded )
81
92
82
- initialize_result = { result : { message : "ok" , root : ::Rails . root . to_s } } . to_json
83
- @stdout . write ( "Content-Length: #{ initialize_result . length } \r \n \r \n #{ initialize_result } " )
93
+ send_message ( { result : { message : "ok" , root : ::Rails . root . to_s } } )
84
94
85
95
while @running
86
96
headers = @stdin . gets ( "\r \n \r \n " )
@@ -96,15 +106,15 @@ def execute(request, params)
96
106
when "shutdown"
97
107
@running = false
98
108
when "model"
99
- write_response ( resolve_database_info_from_model ( params . fetch ( :name ) ) )
109
+ send_message ( resolve_database_info_from_model ( params . fetch ( :name ) ) )
100
110
when "association_target_location"
101
- write_response ( resolve_association_target ( params ) )
111
+ send_message ( resolve_association_target ( params ) )
102
112
when "reload"
103
113
::Rails . application . reloader . reload!
104
114
when "route_location"
105
- write_response ( route_location ( params . fetch ( :name ) ) )
115
+ send_message ( route_location ( params . fetch ( :name ) ) )
106
116
when "route_info"
107
- write_response ( resolve_route_info ( params ) )
117
+ send_message ( resolve_route_info ( params ) )
108
118
when "server_addon/register"
109
119
require params [ :server_addon_path ]
110
120
ServerAddon . finalize_registrations! ( @stdout )
@@ -114,16 +124,11 @@ def execute(request, params)
114
124
ServerAddon . delegate ( server_addon_name , request_name , params )
115
125
end
116
126
rescue => e
117
- write_response ( { error : e . full_message ( highlight : false ) } )
127
+ send_message ( { error : e . full_message ( highlight : false ) } )
118
128
end
119
129
120
130
private
121
131
122
- def write_response ( response )
123
- json_response = response . to_json
124
- @stdout . write ( "Content-Length: #{ json_response . length } \r \n \r \n #{ json_response } " )
125
- end
126
-
127
132
def resolve_route_info ( requirements )
128
133
if requirements [ :controller ]
129
134
requirements [ :controller ] = requirements . fetch ( :controller ) . underscore . delete_suffix ( "_controller" )
0 commit comments