diff --git a/.chronus/changes/compiler-trace-in-vscode-2024-11-10-12-32-36.md b/.chronus/changes/compiler-trace-in-vscode-2024-11-10-12-32-36.md new file mode 100644 index 0000000000..a02b59edf1 --- /dev/null +++ b/.chronus/changes/compiler-trace-in-vscode-2024-11-10-12-32-36.md @@ -0,0 +1,7 @@ +--- +changeKind: feature +packages: + - "@typespec/compiler" +--- + +Compiler trace will be sent to IDE as trace log through language server \ No newline at end of file diff --git a/packages/compiler/src/core/logger/console-sink.ts b/packages/compiler/src/core/logger/console-sink.ts index 87f03d7fd8..b7c023319a 100644 --- a/packages/compiler/src/core/logger/console-sink.ts +++ b/packages/compiler/src/core/logger/console-sink.ts @@ -8,6 +8,7 @@ import { supportsHyperlink } from "./support-hyperlinks.js"; export interface FormatLogOptions { pathRelativeTo?: string; pretty?: boolean; + excludeLogLevel?: boolean; } export interface ConsoleSinkOptions extends FormatLogOptions {} @@ -33,8 +34,8 @@ function hyperlink(text: string, url: string | undefined, options: FormatLogOpti export function formatLog(log: ProcessedLog, options: FormatLogOptions): string { const code = log.code ? ` ${hyperlink(color(options, log.code, pc.gray), log.url, options)}` : ""; - const level = formatLevel(options, log.level); - const content = `${level}${code}: ${log.message}`; + const level: string = options.excludeLogLevel === true ? "" : formatLevel(options, log.level); + const content = level || code ? `${level}${code}: ${log.message}` : log.message; const root = log.sourceLocation; if (root?.file) { const formattedLocation = formatSourceLocation(options, root); diff --git a/packages/compiler/src/server/serverlib.ts b/packages/compiler/src/server/serverlib.ts index 0e883c04b7..eb47f25d09 100644 --- a/packages/compiler/src/server/serverlib.ts +++ b/packages/compiler/src/server/serverlib.ts @@ -50,7 +50,8 @@ import { resolveCodeFix } from "../core/code-fixes.js"; import { compilerAssert, getSourceLocation } from "../core/diagnostics.js"; import { formatTypeSpec } from "../core/formatter.js"; import { getEntityName, getTypeName } from "../core/helpers/type-name-utils.js"; -import { resolveModule, ResolveModuleHost } from "../core/index.js"; +import { ProcessedLog, resolveModule, ResolveModuleHost } from "../core/index.js"; +import { formatLog } from "../core/logger/index.js"; import { getPositionBeforeTrivia } from "../core/parser-utils.js"; import { getNodeAtPosition, getNodeAtPositionDetail, visitChildren } from "../core/parser.js"; import { ensureTrailingDirectorySeparator, getDirectoryPath } from "../core/path-utils.js"; @@ -963,6 +964,16 @@ export function createServer(host: ServerHost): Server { readFile, stat, getSourceFileKind, + logSink: { + log: (log: ProcessedLog) => { + const msg = formatLog(log, { excludeLogLevel: true }); + const sLog: ServerLog = { + level: log.level, + message: msg, + }; + host.log(sLog); + }, + }, }; async function readFile(path: string): Promise {