@@ -7,6 +7,13 @@ import * as vscode from 'vscode'
77
88export type LogTopic = 'crashReport' | 'notifications' | 'test' | 'unknown'
99
10+ class ErrorLog {
11+ constructor (
12+ public topic : string ,
13+ public error : Error
14+ ) { }
15+ }
16+
1017const toolkitLoggers : {
1118 main : Logger | undefined
1219 debugConsole : Logger | undefined
@@ -30,16 +37,17 @@ export interface Logger {
3037 getLogById ( logID : number , file : vscode . Uri ) : string | undefined
3138 /** HACK: Enables logging to vscode Debug Console. */
3239 enableDebugConsole ( ) : void
40+ sendToLog (
41+ logLevel : 'debug' | 'verbose' | 'info' | 'warn' | 'error' ,
42+ message : string | Error ,
43+ ...meta : any [ ]
44+ ) : number
3345}
3446
3547export abstract class BaseLogger implements Logger {
3648 logFile ?: vscode . Uri
3749 topic : LogTopic = 'unknown'
3850
39- setTopic ( topic : LogTopic = 'unknown' ) {
40- this . topic = topic
41- }
42-
4351 debug ( message : string | Error , ...meta : any [ ] ) : number {
4452 return this . sendToLog ( 'debug' , message , ...meta )
4553 }
@@ -58,17 +66,16 @@ export abstract class BaseLogger implements Logger {
5866 log ( logLevel : LogLevel , message : string | Error , ...meta : any [ ] ) : number {
5967 return this . sendToLog ( logLevel , message , ...meta )
6068 }
61- abstract setLogLevel ( logLevel : LogLevel ) : void
62- abstract logLevelEnabled ( logLevel : LogLevel ) : boolean
63- abstract getLogById ( logID : number , file : vscode . Uri ) : string | undefined
64- /** HACK: Enables logging to vscode Debug Console. */
65- abstract enableDebugConsole ( ) : void
66-
6769 abstract sendToLog (
6870 logLevel : 'debug' | 'verbose' | 'info' | 'warn' | 'error' ,
6971 message : string | Error ,
7072 ...meta : any [ ]
7173 ) : number
74+ abstract setLogLevel ( logLevel : LogLevel ) : void
75+ abstract logLevelEnabled ( logLevel : LogLevel ) : boolean
76+ abstract getLogById ( logID : number , file : vscode . Uri ) : string | undefined
77+ /** HACK: Enables logging to vscode Debug Console. */
78+ abstract enableDebugConsole ( ) : void
7279}
7380
7481/**
@@ -121,6 +128,20 @@ export function compareLogLevel(l1: LogLevel, l2: LogLevel): number {
121128 return logLevels . get ( l1 ) ! - logLevels . get ( l2 ) !
122129}
123130
131+ /* Format the message with topic header */
132+ function prependTopic ( topic : string , message : string | Error ) : string | ErrorLog {
133+ if ( typeof message === 'string' ) {
134+ // TODO: remove this after all calls are migrated and topic is a required param.
135+ if ( topic === 'unknown' ) {
136+ return message
137+ }
138+ return `${ topic } : ` + message
139+ } else if ( message instanceof Error ) {
140+ return new ErrorLog ( topic , message )
141+ }
142+ return message
143+ }
144+
124145/**
125146 * Gets the logger if it has been initialized
126147 * the logger is of `'main'` or `undefined`: Main logger; default impl: logs to log file and log output channel
@@ -131,17 +152,15 @@ export function getLogger(topic?: LogTopic): Logger {
131152 if ( ! logger ) {
132153 return new ConsoleLogger ( )
133154 }
134- ; ( logger as BaseLogger ) . setTopic ?.( topic )
135- return logger
155+ return new TopicLogger ( topic ?? 'unknown' , logger )
136156}
137157
138158export function getDebugConsoleLogger ( topic ?: LogTopic ) : Logger {
139159 const logger = toolkitLoggers [ 'debugConsole' ]
140160 if ( ! logger ) {
141161 return new ConsoleLogger ( )
142162 }
143- ; ( logger as BaseLogger ) . setTopic ?.( topic )
144- return logger
163+ return new TopicLogger ( topic ?? 'unknown' , logger )
145164}
146165
147166// jscpd:ignore-start
@@ -194,6 +213,46 @@ export class ConsoleLogger extends BaseLogger {
194213 return 0
195214 }
196215}
216+
217+ /**
218+ * Wraps a `ToolkitLogger` and defers to it for everything except `topic`.
219+ */
220+ export class TopicLogger extends BaseLogger implements vscode . Disposable {
221+ /**
222+ * Wraps a `ToolkitLogger` and defers to it for everything except `topic`.
223+ */
224+ public constructor (
225+ public override topic : LogTopic ,
226+ public readonly logger : Logger
227+ ) {
228+ super ( )
229+ }
230+
231+ override setLogLevel ( logLevel : LogLevel ) : void {
232+ this . logger . setLogLevel ( logLevel )
233+ }
234+
235+ override logLevelEnabled ( logLevel : LogLevel ) : boolean {
236+ return this . logger . logLevelEnabled ( logLevel )
237+ }
238+
239+ override getLogById ( logID : number , file : vscode . Uri ) : string | undefined {
240+ return this . logger . getLogById ( logID , file )
241+ }
242+
243+ override enableDebugConsole ( ) : void {
244+ this . logger . enableDebugConsole ( )
245+ }
246+
247+ override sendToLog ( level : LogLevel , message : string | Error , ...meta : any [ ] ) : number {
248+ if ( typeof message === 'string' ) {
249+ message = prependTopic ( this . topic , message ) as string
250+ }
251+ return this . logger . sendToLog ( level , message , meta )
252+ }
253+
254+ public async dispose ( ) : Promise < void > { }
255+ }
197256// jscpd:ignore-end
198257
199258export function getNullLogger ( type ?: 'debugConsole' | 'main' ) : Logger {
0 commit comments