Skip to content

Commit 953bbae

Browse files
committed
Use sourcekit-lsp diagnose if available
1 parent 2fb8c42 commit 953bbae

File tree

2 files changed

+63
-3
lines changed

2 files changed

+63
-3
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@
167167
},
168168
{
169169
"command": "swift.captureDiagnostics",
170-
"title": "Capture VSCode Swift Diagnostic Logs",
170+
"title": "Capture VS Code Swift Diagnostic Logs",
171171
"category": "Swift"
172172
}
173173
],

src/commands/captureDiagnostics.ts

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@ import * as path from "path";
1717
import * as vscode from "vscode";
1818
import { tmpdir } from "os";
1919
import { exec } from "child_process";
20+
import { Writable } from "stream";
2021
import { SwiftOutputChannel } from "../ui/SwiftOutputChannel";
2122
import { WorkspaceContext } from "../WorkspaceContext";
23+
import { Version } from "../utilities/version";
24+
import { execFileStreamOutput } from "../utilities/utilities";
25+
import configuration from "../configuration";
2226

2327
export async function captureDiagnostics(ctx: WorkspaceContext) {
2428
const diagnosticsDir = path.join(
@@ -30,7 +34,15 @@ export async function captureDiagnostics(ctx: WorkspaceContext) {
3034
await fs.mkdir(diagnosticsDir);
3135
await writeLogFile(diagnosticsDir, "logs.txt", extensionLogs(ctx));
3236
await writeLogFile(diagnosticsDir, "environment.txt", environmentLogs(ctx));
33-
await writeLogFile(diagnosticsDir, "sourcekit-lsp.txt", sourceKitLogs(ctx));
37+
38+
if (ctx.swiftVersion.isGreaterThanOrEqual(new Version(6, 0, 0))) {
39+
// sourcekit-lsp diagnose command is only available in 6.0 and higher.
40+
// await writeLogFile(diagnosticsDir, "sourcekit-lsp.txt", );
41+
await sourcekitDiagnose(ctx, diagnosticsDir);
42+
} else {
43+
await writeLogFile(diagnosticsDir, "sourcekit-lsp.txt", sourceKitLogs(ctx));
44+
}
45+
3446
await writeLogFile(diagnosticsDir, "diagnostics.txt", diagnosticLogs());
3547

3648
ctx.outputChannel.log(`Saved diagnostics to ${diagnosticsDir}`);
@@ -71,7 +83,7 @@ function extensionLogs(ctx: WorkspaceContext): string {
7183
}
7284

7385
function environmentLogs(ctx: WorkspaceContext): string {
74-
const environmentOutputChannel = new SwiftOutputChannel("Swift");
86+
const environmentOutputChannel = new SwiftOutputChannel("Swift", false);
7587
ctx.toolchain.logDiagnostics(environmentOutputChannel);
7688
environmentOutputChannel.log("Extension Settings:");
7789
environmentOutputChannel.log(
@@ -97,6 +109,54 @@ function sourceKitLogs(ctx: WorkspaceContext) {
97109
return (ctx.languageClientManager.languageClientOutputChannel?.logs ?? []).join("\n");
98110
}
99111

112+
async function sourcekitDiagnose(ctx: WorkspaceContext, dir: string) {
113+
const sourcekitDiagnosticDir = path.join(dir, "sourcekit-lsp");
114+
await fs.mkdir(sourcekitDiagnosticDir);
115+
116+
const toolchainSourceKitLSP = ctx.toolchain.getToolchainExecutable("sourcekit-lsp");
117+
const lspConfig = configuration.lsp;
118+
const serverPathConfig = lspConfig.serverPath;
119+
const serverPath = serverPathConfig.length > 0 ? serverPathConfig : toolchainSourceKitLSP;
120+
121+
await vscode.window.withProgress(
122+
{
123+
location: vscode.ProgressLocation.Notification,
124+
},
125+
async progress => {
126+
progress.report({ message: "Capturing Diagnostics..." });
127+
const writableStream = progressUpdatingWritable(percent =>
128+
progress.report({ message: `Capturing Diagnostics: ${percent}%` })
129+
);
130+
131+
await execFileStreamOutput(
132+
serverPath,
133+
["diagnose", "--bundle-output-path", sourcekitDiagnosticDir],
134+
writableStream,
135+
writableStream,
136+
null,
137+
{
138+
env: { ...process.env, ...configuration.swiftEnvironmentVariables },
139+
maxBuffer: 16 * 1024 * 1024,
140+
}
141+
);
142+
}
143+
);
144+
}
145+
146+
function progressUpdatingWritable(updateProgress: (str: string) => void): Writable {
147+
return new Writable({
148+
write(chunk, encoding, callback) {
149+
const str = (chunk as Buffer).toString("utf8").trim();
150+
const percent = /^([0-9])+%/.exec(str);
151+
if (percent && percent[1]) {
152+
updateProgress(percent[1]);
153+
}
154+
155+
callback();
156+
},
157+
});
158+
}
159+
100160
function showDirectoryCommand(dir: string): string {
101161
switch (process.platform) {
102162
case "win32":

0 commit comments

Comments
 (0)