Skip to content

Commit baa62cc

Browse files
authored
[WIP] Improved logging implementation (#412)
* refactoring * update changelog * implement new logger * add example usage in comment * use new logger everywhere * add data argument to be jsonified * jsonify in callee * add show() to reveal log in the UI * add return type * rename child->getChild
1 parent f1e040b commit baa62cc

17 files changed

+187
-118
lines changed

src/BsvProvider.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { assert } from 'console';
2727
import { readFileSync } from 'fs';
2828
import { join } from 'path';
2929
import { readdirSync } from 'fs';
30+
import { Logger } from './logger';
3031

3132
export interface BsvInfoProvider {
3233
getSymbol(doc: TextDocument): Promise<SymbolInformation[]> | Promise<DocumentSymbol[]>;
@@ -3132,9 +3133,9 @@ class BsvBaseInfoProvider {
31323133
parserCache: Map<Uri, bsvSyntaxParser.TopContext> = new Map();
31333134
docSymbolCache: Map<Uri, SymbolInformation[]> = new Map();
31343135

3135-
public logger: LogOutputChannel;
3136+
public logger: Logger;
31363137

3137-
constructor(logger: LogOutputChannel) {
3138+
constructor(logger: Logger) {
31383139
this.logger = logger;
31393140
}
31403141

@@ -3243,7 +3244,7 @@ class SymbolLink implements LocationLink {
32433244
class BsvWorkspaceInfoProvider extends BsvBaseInfoProvider implements BsvInfoProvider {
32443245
initFinished = false;
32453246

3246-
constructor(_path: Uri, logger: LogOutputChannel) {
3247+
constructor(_path: Uri, logger: Logger) {
32473248
super(logger);
32483249
this.updateWorkspace();
32493250
workspace.onDidCreateFiles(async (e) => {
@@ -3393,7 +3394,7 @@ class BsvSingleFileInfoProvider extends BsvBaseInfoProvider implements BsvInfoPr
33933394
return undefined;
33943395
}
33953396

3396-
constructor(logger: LogOutputChannel) {
3397+
constructor(logger: Logger) {
33973398
super(logger);
33983399
}
33993400
}
@@ -3416,12 +3417,12 @@ export class BsvInfoProviderManger {
34163417
return this.provider;
34173418
}
34183419

3419-
onWorkspace(logger: LogOutputChannel): Boolean {
3420+
onWorkspace(logger: Logger): Boolean {
34203421
this.refreshWorkspace(logger);
34213422
return true;
34223423
}
34233424

3424-
protected refreshWorkspace(logger: LogOutputChannel) {
3425+
protected refreshWorkspace(logger: Logger) {
34253426
if (!workspace.workspaceFolders) {
34263427
this.provider = new BsvSingleFileInfoProvider(logger);
34273428
} else if (workspace.workspaceFolders.length == 0) {

src/ctags.ts

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// SPDX-License-Identifier: MIT
22
import * as vscode from 'vscode';
33
import * as child_process from 'child_process';
4+
import { Logger } from './logger';
45

56
// Internal representation of a symbol
67
export class Symbol {
@@ -135,9 +136,9 @@ export class Ctags {
135136
symbols: Symbol[];
136137
doc: vscode.TextDocument;
137138
isDirty: boolean;
138-
private logger: vscode.LogOutputChannel;
139+
private logger: Logger;
139140

140-
constructor(logger: vscode.LogOutputChannel) {
141+
constructor(logger: Logger) {
141142
this.symbols = [];
142143
this.isDirty = true;
143144
this.logger = logger;
@@ -158,14 +159,14 @@ export class Ctags {
158159
}
159160

160161
execCtags(filepath: string): Thenable<string> {
161-
this.logger.info('[Ctags] executing ctags');
162+
this.logger.info('executing ctags');
162163

163164
let binPath: string = <string>(
164165
vscode.workspace.getConfiguration().get('verilog.ctags.path', 'none')
165166
);
166167
if (binPath !== 'none') {
167168
let command: string = binPath + ' -f - --fields=+K --sort=no --excmd=n "' + filepath + '"';
168-
this.logger.info('[Ctags] Executing Command: ' + command);
169+
this.logger.info('Executing Command: ' + command);
169170
return new Promise((resolve, _reject) => {
170171
child_process.exec(command, (_error: Error, stdout: string, _stderr: string) => {
171172
resolve(stdout);
@@ -196,18 +197,18 @@ export class Ctags {
196197
lineNo = Number(lineNoStr.slice(0, -2)) - 1;
197198
return new Symbol(name, type, pattern, lineNo, parentScope, parentType, lineNo, false);
198199
} catch (e) {
199-
this.logger.error('[Ctags] Line Parser: ' + e);
200-
this.logger.error('[Ctags] Line: ' + line);
200+
this.logger.error('Line Parser: ' + e);
201+
this.logger.error('Line: ' + line);
201202
}
202203
return undefined;
203204
}
204205

205206
buildSymbolsList(tags: string): Thenable<void> {
206207
try {
207208
if (this.isDirty) {
208-
this.logger.info('[Ctags] building symbols');
209+
this.logger.info('building symbols');
209210
if (tags === '') {
210-
this.logger.error('[Ctags] No output from ctags');
211+
this.logger.error('No output from ctags');
211212
return undefined;
212213
}
213214
// Parse ctags output
@@ -250,18 +251,18 @@ export class Ctags {
250251
}
251252
}
252253
}
253-
this.logger.info('[Ctags] Symbols: ' + this.symbols.toString());
254+
this.logger.info('Symbols: ' + this.symbols.toString());
254255
this.isDirty = false;
255256
}
256257
return Promise.resolve();
257258
} catch (e) {
258-
this.logger.error('[Ctags] ' + e.toString());
259+
this.logger.error(e.toString());
259260
}
260261
return undefined;
261262
}
262263

263264
index(): Thenable<void> {
264-
this.logger.info('[Ctags] indexing...');
265+
this.logger.info('indexing...');
265266
return new Promise((resolve, _reject) => {
266267
this.execCtags(this.doc.uri.fsPath)
267268
.then((output) => this.buildSymbolsList(output))
@@ -272,20 +273,20 @@ export class Ctags {
272273

273274
export class CtagsManager {
274275
private static ctags: Ctags;
275-
private logger: vscode.LogOutputChannel;
276+
private logger: Logger;
276277

277-
constructor(logger: vscode.LogOutputChannel) {
278+
constructor(logger: Logger) {
278279
this.logger = logger;
279-
CtagsManager.ctags = new Ctags(logger);
280+
CtagsManager.ctags = new Ctags(logger.getChild('Ctags'));
280281
}
281282

282283
configure() {
283-
this.logger.info('[Ctags] ctags manager configure');
284+
this.logger.info('ctags manager configure');
284285
vscode.workspace.onDidSaveTextDocument(this.onSave.bind(this));
285286
}
286287

287288
onSave(doc: vscode.TextDocument) {
288-
this.logger.info('[Ctags] on save');
289+
this.logger.info('on save');
289290
let ctags: Ctags = CtagsManager.ctags;
290291
if (ctags.doc === undefined || ctags.doc.uri.fsPath === doc.uri.fsPath) {
291292
CtagsManager.ctags.clearSymbols();

src/extension.ts

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,20 @@ import { BsvInfoProviderManger } from './BsvProvider';
1212
import * as ModuleInstantiation from './commands/ModuleInstantiation';
1313
import * as FormatProvider from './providers/FormatPrivider';
1414
import { ExtensionManager } from './extensionManager';
15+
import { createLogger, Logger } from './logger';
1516

16-
export var logger: vscode.LogOutputChannel; // Global logger
17+
export var logger: Logger; // Global logger
1718
var ctagsManager: CtagsManager;
1819
let extensionID: string = 'mshr-h.veriloghdl';
1920

2021
let lintManager: LintManager;
2122
let languageClients = new Map<string, LanguageClient>();
2223

2324
export function activate(context: vscode.ExtensionContext) {
24-
logger = vscode.window.createOutputChannel('Verilog', { log: true });
25+
logger = createLogger('Verilog');
2526
logger.info(extensionID + ' is now active.');
2627

27-
let extMgr = new ExtensionManager(context, extensionID, logger);
28+
let extMgr = new ExtensionManager(context, extensionID, logger.getChild('ExtensionManager'));
2829
if (extMgr.isVersionUpdated()) {
2930
extMgr.showChangelogNotification();
3031
}
@@ -35,12 +36,12 @@ export function activate(context: vscode.ExtensionContext) {
3536
});
3637

3738
// Configure ctags
38-
ctagsManager = new CtagsManager(logger);
39+
ctagsManager = new CtagsManager(logger.getChild('CtagsManager'));
3940
ctagsManager.configure();
4041

4142
// Configure Document Symbol Provider
4243
let verilogDocumentSymbolProvider = new DocumentSymbolProvider.VerilogDocumentSymbolProvider(
43-
logger
44+
logger.getChild('VerilogDocumentSymbolProvider')
4445
);
4546
context.subscriptions.push(
4647
vscode.languages.registerDocumentSymbolProvider(
@@ -54,7 +55,9 @@ export function activate(context: vscode.ExtensionContext) {
5455
verilogDocumentSymbolProvider
5556
)
5657
);
57-
let bsvDocumentSymbolProvider = new DocumentSymbolProvider.BsvDocumentSymbolProvider(logger);
58+
let bsvDocumentSymbolProvider = new DocumentSymbolProvider.BsvDocumentSymbolProvider(
59+
logger.getChild('BsvDocumentSymbolProvider')
60+
);
5861
context.subscriptions.push(
5962
vscode.languages.registerDocumentSymbolProvider(
6063
{ scheme: 'file', language: 'bsv' },
@@ -65,7 +68,7 @@ export function activate(context: vscode.ExtensionContext) {
6568
// Configure Completion Item Provider
6669
// Trigger on ".", "(", "="
6770
let verilogCompletionItemProvider = new CompletionItemProvider.VerilogCompletionItemProvider(
68-
logger
71+
logger.getChild('VerilogCompletionItemProvider')
6972
);
7073
context.subscriptions.push(
7174
vscode.languages.registerCompletionItemProvider(
@@ -85,7 +88,9 @@ export function activate(context: vscode.ExtensionContext) {
8588
'='
8689
)
8790
);
88-
let bsvCompletionItemProvider = new CompletionItemProvider.BsvCompletionItemProvider(logger);
91+
let bsvCompletionItemProvider = new CompletionItemProvider.BsvCompletionItemProvider(
92+
logger.getChild('BsvCompletionItemProvider')
93+
);
8994
context.subscriptions.push(
9095
vscode.languages.registerCompletionItemProvider(
9196
{ scheme: 'file', language: 'bsv' },
@@ -97,7 +102,9 @@ export function activate(context: vscode.ExtensionContext) {
97102
);
98103

99104
// Configure Hover Providers
100-
let verilogHoverProvider = new HoverProvider.VerilogHoverProvider(logger);
105+
let verilogHoverProvider = new HoverProvider.VerilogHoverProvider(
106+
logger.getChild('VerilogHoverProvider')
107+
);
101108
context.subscriptions.push(
102109
vscode.languages.registerHoverProvider(
103110
{ scheme: 'file', language: 'verilog' },
@@ -110,13 +117,15 @@ export function activate(context: vscode.ExtensionContext) {
110117
verilogHoverProvider
111118
)
112119
);
113-
let bsvHoverProvider = new HoverProvider.BsvHoverProvider(logger);
120+
let bsvHoverProvider = new HoverProvider.BsvHoverProvider(logger.getChild('BsvHoverProvider'));
114121
context.subscriptions.push(
115122
vscode.languages.registerHoverProvider({ scheme: 'file', language: 'bsv' }, bsvHoverProvider)
116123
);
117124

118125
// Configure Definition Providers
119-
let verilogDefinitionProvider = new DefinitionProvider.VerilogDefinitionProvider(logger);
126+
let verilogDefinitionProvider = new DefinitionProvider.VerilogDefinitionProvider(
127+
logger.getChild('VerilogDefinitionProvider')
128+
);
120129
context.subscriptions.push(
121130
vscode.languages.registerDefinitionProvider(
122131
{ scheme: 'file', language: 'verilog' },
@@ -138,14 +147,18 @@ export function activate(context: vscode.ExtensionContext) {
138147
);
139148

140149
// Configure Format Provider
141-
let verilogFormatProvider = new FormatProvider.VerilogFormatProvider(logger);
150+
let verilogFormatProvider = new FormatProvider.VerilogFormatProvider(
151+
logger.getChild('VerilogFormatProvider')
152+
);
142153
context.subscriptions.push(
143154
vscode.languages.registerDocumentFormattingEditProvider(
144155
{ scheme: 'file', language: 'verilog' },
145156
verilogFormatProvider
146157
)
147158
);
148-
let systemVerilogFormatProvider = new FormatProvider.SystemVerilogFormatProvider(logger);
159+
let systemVerilogFormatProvider = new FormatProvider.SystemVerilogFormatProvider(
160+
logger.getChild('SystemVerilogFormatProvider')
161+
);
149162
context.subscriptions.push(
150163
vscode.languages.registerDocumentFormattingEditProvider(
151164
{ scheme: 'file', language: 'systemverilog' },
@@ -160,7 +173,7 @@ export function activate(context: vscode.ExtensionContext) {
160173
);
161174

162175
// Register command for manual linting
163-
lintManager = new LintManager(logger);
176+
lintManager = new LintManager(logger.getChild('LintManager'));
164177
vscode.commands.registerCommand('verilog.lint', lintManager.runLintTool, lintManager);
165178

166179
// Configure language server

src/extensionManager.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
// SPDX-License-Identifier: MIT
22
import * as vscode from 'vscode';
33
import { SemVer } from 'semver';
4+
import { Logger } from './logger';
45

56
export class ExtensionManager {
67
private context: vscode.ExtensionContext;
78
private extensionID: string;
89
private packageJSON: any;
910
private extensionPath: string;
10-
private logger: vscode.LogOutputChannel;
11+
private logger: Logger;
1112

12-
constructor(
13-
context: vscode.ExtensionContext,
14-
extensionID: string,
15-
logger: vscode.LogOutputChannel
16-
) {
13+
constructor(context: vscode.ExtensionContext, extensionID: string, logger: Logger) {
1714
this.context = context;
1815
this.extensionID = extensionID;
1916
this.logger = logger;
@@ -27,6 +24,12 @@ export class ExtensionManager {
2724

2825
// update version value
2926
this.context.globalState.update('version', currentVersion.version);
27+
this.logger.info(
28+
'previousVersion: ' +
29+
JSON.stringify(previousVersion.version) +
30+
', currentVersion: ' +
31+
JSON.stringify(currentVersion.version)
32+
);
3033

3134
return previousVersion < currentVersion;
3235
}

src/linter/BaseLinter.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
// SPDX-License-Identifier: MIT
22
import * as vscode from 'vscode';
33
import * as path from 'path';
4+
import { Logger } from '../logger';
45

56
export default abstract class BaseLinter {
67
protected diagnosticCollection: vscode.DiagnosticCollection;
78
name: string;
8-
protected logger: vscode.LogOutputChannel;
9+
protected logger: Logger;
910

10-
constructor(
11-
name: string,
12-
diagnosticCollection: vscode.DiagnosticCollection,
13-
logger: vscode.LogOutputChannel
14-
) {
11+
constructor(name: string, diagnosticCollection: vscode.DiagnosticCollection, logger: Logger) {
1512
this.diagnosticCollection = diagnosticCollection;
1613
this.name = name;
1714
this.logger = logger;

0 commit comments

Comments
 (0)