|
1 | 1 | defmodule Expert do |
| 2 | + alias Forge.Project |
| 3 | + alias Expert.ActiveProjects |
2 | 4 | alias Expert.Protocol.Convert |
3 | 5 | alias Expert.Protocol.Id |
4 | 6 | alias Expert.Provider.Handlers |
@@ -94,42 +96,72 @@ defmodule Expert do |
94 | 96 | def handle_request(request, lsp) do |
95 | 97 | state = assigns(lsp).state |
96 | 98 |
|
97 | | - if state.engine_initialized? do |
98 | | - with {:ok, handler} <- fetch_handler(request), |
99 | | - {:ok, request} <- Convert.to_native(request), |
100 | | - {:ok, response} <- handler.handle(request, state.configuration), |
101 | | - {:ok, response} <- Expert.Protocol.Convert.to_lsp(response) do |
102 | | - {:reply, response, lsp} |
103 | | - else |
104 | | - {:error, {:unhandled, _}} -> |
105 | | - Logger.info("Unhandled request: #{request.method}") |
106 | | - |
107 | | - {:reply, |
108 | | - %GenLSP.ErrorResponse{ |
109 | | - code: GenLSP.Enumerations.ErrorCodes.method_not_found(), |
110 | | - message: "Method not found" |
111 | | - }, lsp} |
112 | | - |
113 | | - error -> |
114 | | - message = "Failed to handle #{request.method}, #{inspect(error)}" |
115 | | - Logger.error(message) |
116 | | - |
117 | | - {:reply, |
118 | | - %GenLSP.ErrorResponse{ |
119 | | - code: GenLSP.Enumerations.ErrorCodes.internal_error(), |
120 | | - message: message |
121 | | - }, lsp} |
122 | | - end |
| 99 | + with {:ok, handler} <- fetch_handler(request), |
| 100 | + {:ok, request} <- Convert.to_native(request), |
| 101 | + :ok <- check_engine_initialized(request), |
| 102 | + {:ok, response} <- handler.handle(request, state.configuration), |
| 103 | + {:ok, response} <- Expert.Protocol.Convert.to_lsp(response) do |
| 104 | + {:reply, response, lsp} |
123 | 105 | else |
124 | | - GenLSP.warning( |
125 | | - lsp, |
126 | | - "Received request #{request.method} before engine was initialized. Ignoring." |
127 | | - ) |
| 106 | + {:error, {:unhandled, _}} -> |
| 107 | + Logger.info("Unhandled request: #{request.method}") |
128 | 108 |
|
129 | | - {:noreply, lsp} |
| 109 | + {:reply, |
| 110 | + %GenLSP.ErrorResponse{ |
| 111 | + code: GenLSP.Enumerations.ErrorCodes.method_not_found(), |
| 112 | + message: "Method not found" |
| 113 | + }, lsp} |
| 114 | + |
| 115 | + {:error, :engine_not_initialized, project} -> |
| 116 | + GenLSP.info( |
| 117 | + lsp, |
| 118 | + "Received request #{request.method} before engine for #{project && Project.name(project)} was initialized. Ignoring." |
| 119 | + ) |
| 120 | + |
| 121 | + {:reply, nil, lsp} |
| 122 | + |
| 123 | + error -> |
| 124 | + message = "Failed to handle #{request.method}, #{inspect(error)}" |
| 125 | + Logger.error(message) |
| 126 | + |
| 127 | + {:reply, |
| 128 | + %GenLSP.ErrorResponse{ |
| 129 | + code: GenLSP.Enumerations.ErrorCodes.internal_error(), |
| 130 | + message: message |
| 131 | + }, lsp} |
130 | 132 | end |
131 | 133 | end |
132 | 134 |
|
| 135 | + defp check_engine_initialized(request) do |
| 136 | + if document_request?(request) do |
| 137 | + case Forge.Document.Container.context_document(request, nil) do |
| 138 | + %Forge.Document{} = document -> |
| 139 | + projects = ActiveProjects.projects() |
| 140 | + project = Project.project_for_document(projects, document) |
| 141 | + |
| 142 | + if ActiveProjects.active?(project) do |
| 143 | + :ok |
| 144 | + else |
| 145 | + {:error, :engine_not_initialized, project} |
| 146 | + end |
| 147 | + |
| 148 | + nil -> |
| 149 | + {:error, :engine_not_initialized, nil} |
| 150 | + end |
| 151 | + else |
| 152 | + :ok |
| 153 | + end |
| 154 | + end |
| 155 | + |
| 156 | + defp document_request?(%{document: %Forge.Document{}}), do: true |
| 157 | + |
| 158 | + defp document_request?(%{params: params}) do |
| 159 | + document_request?(params) |
| 160 | + end |
| 161 | + |
| 162 | + defp document_request?(%{text_document: %{uri: _}}), do: true |
| 163 | + defp document_request?(_), do: false |
| 164 | + |
133 | 165 | def handle_notification(%GenLSP.Notifications.Initialized{}, lsp) do |
134 | 166 | Logger.info("Server initialized, registering capabilities") |
135 | 167 | registrations = registrations() |
@@ -175,18 +207,6 @@ defmodule Expert do |
175 | 207 | end |
176 | 208 | end |
177 | 209 |
|
178 | | - def handle_info(:engine_initialized, lsp) do |
179 | | - state = assigns(lsp).state |
180 | | - |
181 | | - new_state = %{state | engine_initialized?: true} |
182 | | - |
183 | | - lsp = assign(lsp, state: new_state) |
184 | | - |
185 | | - Logger.info("Engine initialized") |
186 | | - |
187 | | - {:noreply, lsp} |
188 | | - end |
189 | | - |
190 | 210 | def handle_info(:default_config, lsp) do |
191 | 211 | state = assigns(lsp).state |
192 | 212 |
|
|
0 commit comments