Skip to content

Commit 400d542

Browse files
authored
Update LSP error generation, enum naming, string enums (#2173)
1 parent 00e99d1 commit 400d542

File tree

5 files changed

+135
-161
lines changed

5 files changed

+135
-161
lines changed

internal/lsp/lsproto/_generate/generate.mts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,29 @@ function patchAndPreprocessModel() {
306306

307307
// Remove _InitializeParams structure after flattening (it was only needed for inheritance)
308308
model.structures = model.structures.filter(s => s.name !== "_InitializeParams");
309+
310+
// Merge LSPErrorCodes into ErrorCodes and remove LSPErrorCodes
311+
const errorCodesEnum = model.enumerations.find(e => e.name === "ErrorCodes");
312+
const lspErrorCodesEnum = model.enumerations.find(e => e.name === "LSPErrorCodes");
313+
if (errorCodesEnum && lspErrorCodesEnum) {
314+
// Merge LSPErrorCodes values into ErrorCodes
315+
errorCodesEnum.values.push(...lspErrorCodesEnum.values);
316+
// Remove LSPErrorCodes from the model
317+
model.enumerations = model.enumerations.filter(e => e.name !== "LSPErrorCodes");
318+
}
319+
320+
// Singularize plural enum names (e.g., "ErrorCodes" -> "ErrorCode")
321+
for (const enumeration of model.enumerations) {
322+
if (enumeration.name.endsWith("Codes")) {
323+
enumeration.name = enumeration.name.slice(0, -1); // "Codes" -> "Code"
324+
}
325+
else if (enumeration.name.endsWith("Modifiers")) {
326+
enumeration.name = enumeration.name.slice(0, -1); // "Modifiers" -> "Modifier"
327+
}
328+
else if (enumeration.name.endsWith("Types")) {
329+
enumeration.name = enumeration.name.slice(0, -1); // "Types" -> "Type"
330+
}
331+
}
309332
}
310333

311334
patchAndPreprocessModel();
@@ -1051,7 +1074,7 @@ function generateCode() {
10511074
value: String(value.value),
10521075
numericValue: Number(value.value),
10531076
name: value.name,
1054-
identifier: `${enumeration.name}${value.name}`,
1077+
identifier: `${enumeration.name}${titleCase(value.name)}`,
10551078
documentation: value.documentation,
10561079
deprecated: value.deprecated,
10571080
}));
@@ -1264,6 +1287,14 @@ function generateCode() {
12641287
}
12651288
}
12661289
}
1290+
1291+
// Generate Error() method for ErrorCode to implement the error interface
1292+
if (enumeration.name === "ErrorCode") {
1293+
writeLine(`func (e ${enumeration.name}) Error() string {`);
1294+
writeLine(`\treturn e.String()`);
1295+
writeLine(`}`);
1296+
writeLine("");
1297+
}
12671298
}
12681299

12691300
const requestsAndNotifications: (Request | Notification)[] = [...model.requests, ...model.notifications];

internal/lsp/lsproto/baseproto.go

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -90,51 +90,3 @@ func (w *BaseWriter) Write(data []byte) error {
9090
}
9191
return w.w.Flush()
9292
}
93-
94-
type ErrorCode struct { //nolint:errname
95-
Name string
96-
Code int32
97-
}
98-
99-
func (e *ErrorCode) Error() string {
100-
return e.Name
101-
}
102-
103-
var (
104-
// Defined by JSON-RPC
105-
ErrParseError = &ErrorCode{"ParseError", -32700}
106-
ErrInvalidRequest = &ErrorCode{"InvalidRequest", -32600}
107-
ErrMethodNotFound = &ErrorCode{"MethodNotFound", -32601}
108-
ErrInvalidParams = &ErrorCode{"InvalidParams", -32602}
109-
ErrInternalError = &ErrorCode{"InternalError", -32603}
110-
111-
// Error code indicating that a server received a notification or
112-
// request before the server has received the `initialize` request.
113-
ErrServerNotInitialized = &ErrorCode{"ServerNotInitialized", -32002}
114-
ErrUnknownErrorCode = &ErrorCode{"UnknownErrorCode", -32001}
115-
116-
// A request failed but it was syntactically correct, e.g the
117-
// method name was known and the parameters were valid. The error
118-
// message should contain human readable information about why
119-
// the request failed.
120-
ErrRequestFailed = &ErrorCode{"RequestFailed", -32803}
121-
122-
// The server cancelled the request. This error code should
123-
// only be used for requests that explicitly support being
124-
// server cancellable.
125-
ErrServerCancelled = &ErrorCode{"ServerCancelled", -32802}
126-
127-
// The server detected that the content of a document got
128-
// modified outside normal conditions. A server should
129-
// NOT send this error code if it detects a content change
130-
// in it unprocessed messages. The result even computed
131-
// on an older state might still be useful for the client.
132-
//
133-
// If a client decides that a result is not of any use anymore
134-
// the client should cancel the request.
135-
ErrContentModified = &ErrorCode{"ContentModified", -32801}
136-
137-
// The client has canceled a request and a server has detected
138-
// the cancel.
139-
ErrRequestCancelled = &ErrorCode{"RequestCancelled", -32800}
140-
)

internal/lsp/lsproto/jsonrpc.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ func (m *Message) UnmarshalJSON(data []byte) error {
111111
Error *ResponseError `json:"error,omitzero"`
112112
}
113113
if err := json.Unmarshal(data, &raw); err != nil {
114-
return fmt.Errorf("%w: %w", ErrInvalidRequest, err)
114+
return fmt.Errorf("%w: %w", ErrorCodeInvalidRequest, err)
115115
}
116116
if raw.ID != nil && raw.Method == "" {
117117
m.Kind = MessageKindResponse
@@ -128,7 +128,7 @@ func (m *Message) UnmarshalJSON(data []byte) error {
128128
if len(raw.Params) > 0 {
129129
params, err = unmarshalParams(raw.Method, raw.Params)
130130
if err != nil {
131-
return fmt.Errorf("%w: %w", ErrInvalidRequest, err)
131+
return fmt.Errorf("%w: %w", ErrorCodeInvalidRequest, err)
132132
}
133133
}
134134

@@ -173,7 +173,7 @@ func (r *RequestMessage) UnmarshalJSON(data []byte) error {
173173
Params jsontext.Value `json:"params"`
174174
}
175175
if err := json.Unmarshal(data, &raw); err != nil {
176-
return fmt.Errorf("%w: %w", ErrInvalidRequest, err)
176+
return fmt.Errorf("%w: %w", ErrorCodeInvalidRequest, err)
177177
}
178178

179179
r.ID = raw.ID
@@ -182,7 +182,7 @@ func (r *RequestMessage) UnmarshalJSON(data []byte) error {
182182
var err error
183183
r.Params, err = unmarshalParams(raw.Method, raw.Params)
184184
if err != nil {
185-
return fmt.Errorf("%w: %w", ErrInvalidRequest, err)
185+
return fmt.Errorf("%w: %w", ErrorCodeInvalidRequest, err)
186186
}
187187

188188
return nil

0 commit comments

Comments
 (0)