Skip to content

Commit de82e5b

Browse files
Trace the actual error message for internal error (#1190)
1 parent d2e1c83 commit de82e5b

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

src/daemon/index.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ const INTERESTED_REQUESTS: Set<string> = new Set([
7979
]);
8080
const CANCELLATION_CODE: number = -32800; // report such error if the request is cancelled.
8181
const CONTENT_MODIFIED_CODE: number = -32801; // report such error if semantic token request is outdated while content modified.
82+
const INTERNAL_ERROR_CODE: number = -32603; // Internal Error.
8283
async function traceLSPPerformance(javaExt: vscode.Extension<any>) {
8384
const javaExtVersion = javaExt.packageJSON?.version;
8485
const isPreReleaseVersion = /^\d+\.\d+\.\d{10}/.test(javaExtVersion);
@@ -98,6 +99,14 @@ async function traceLSPPerformance(javaExt: vscode.Extension<any>) {
9899
return;
99100
}
100101

102+
// See https://github.com/eclipse-lsp4j/lsp4j/commit/bf22871f4e669a2d7fd97ce046cb50903aa68120#diff-3b3e5d6517a47e0459195078645a0837aafa4d4520fe79b1cb1922a749074748
103+
// lsp4j will wrap the error message as "Internal error."
104+
// when it encounters an uncaught exception from jdt language server.
105+
if (code === INTERNAL_ERROR_CODE) {
106+
const actualCause = resolveActualCause(traceEvent.error.data);
107+
errorMessage = actualCause ? errorMessage + " " + actualCause : errorMessage;
108+
}
109+
101110
sendInfo("", {
102111
name: "lsp",
103112
kind: escapeLspRequestName(traceEvent.type),
@@ -170,3 +179,20 @@ async function checkIfJavaServerCrashed(wait: number = 0/*ms*/) {
170179
function escapeLspRequestName(name: string) {
171180
return name.replace(/\//g, "-")
172181
}
182+
183+
function resolveActualCause(callstack: any): string | undefined {
184+
if (!callstack) {
185+
return;
186+
}
187+
188+
const callstacks = callstack.split(/\r?\n/);
189+
if (callstacks?.length) {
190+
for (let i = callstacks.length - 1; i >= 0; i--) {
191+
if (callstacks[i]?.startsWith("Caused by:")) {
192+
return callstacks[i];
193+
}
194+
}
195+
}
196+
197+
return;
198+
}

0 commit comments

Comments
 (0)