Skip to content

Commit fa3e9c8

Browse files
committed
Add PerfLogger and NullLogger to simplify conditional logic
1 parent 996e7e5 commit fa3e9c8

12 files changed

+121
-56
lines changed

src/compiler/binder.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,10 @@ namespace ts {
107107
export function bindSourceFile(file: SourceFile, options: CompilerOptions) {
108108
try {
109109
performance.mark("beforeBind");
110-
if (etwLogger) etwLogger.logStartBindFile("" + file.fileName);
110+
perfLogger.logStartBindFile("" + file.fileName);
111111
binder(file, options);
112112
} finally {
113-
if (etwLogger) etwLogger.logStopBindFile();
113+
perfLogger.logStopBindFile();
114114
performance.mark("afterBind");
115115
performance.measure("Bind", "beforeBind", "afterBind");
116116
}

src/compiler/core.ts

+1-17
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,7 @@ namespace ts {
55
/** The version of the TypeScript compiler release */
66
export const version = `${versionMajorMinor}.0-dev`;
77

8-
// Load optional module to enable Event Tracing for Windows
9-
// See https://github.com/microsoft/typescript-etw for more information
10-
let etwModule;
11-
try {
12-
// tslint:disable-next-line:no-implicit-dependencies
13-
etwModule = require("@microsoft/typescript-etw");
14-
}
15-
catch (e) {
16-
// Optional module not installed
17-
etwModule = undefined;
18-
}
19-
20-
/* @internal */
21-
// tslint:disable-next-line:no-implicit-dependencies
22-
export const etwLogger: typeof import("@microsoft/typescript-etw") | undefined = etwModule;
23-
24-
if (etwLogger) etwLogger.logInfoEvent(`Starting TypeScript v${versionMajorMinor} with command line: ${JSON.stringify(process.argv)}`);
8+
perfLogger.logInfoEvent(`Starting TypeScript v${versionMajorMinor} with command line: ${JSON.stringify(process.argv)}`);
259
}
2610

2711
namespace ts {

src/compiler/moduleNameResolver.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -666,7 +666,7 @@ namespace ts {
666666
}
667667

668668
try {
669-
if (etwLogger) etwLogger.logStartResolveModule(moduleName /* , containingFile, ModuleResolutionKind[moduleResolution]*/);
669+
perfLogger.logStartResolveModule(moduleName /* , containingFile, ModuleResolutionKind[moduleResolution]*/);
670670
switch (moduleResolution) {
671671
case ModuleResolutionKind.NodeJs:
672672
result = nodeModuleNameResolver(moduleName, containingFile, compilerOptions, host, cache, redirectedReference);
@@ -679,8 +679,8 @@ namespace ts {
679679
}
680680
}
681681
finally {
682-
if (etwLogger && result && result.resolvedModule) etwLogger.logInfoEvent(`Module "${moduleName}" resolved to "${result.resolvedModule.resolvedFileName}"`);
683-
if (etwLogger) etwLogger.logStopResolveModule((result && result.resolvedModule) ? "" + result.resolvedModule.resolvedFileName : "null");
682+
if (result && result.resolvedModule) perfLogger.logInfoEvent(`Module "${moduleName}" resolved to "${result.resolvedModule.resolvedFileName}"`);
683+
perfLogger.logStopResolveModule((result && result.resolvedModule) ? "" + result.resolvedModule.resolvedFileName : "null");
684684
}
685685

686686
if (perFolderCache) {

src/compiler/parser.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ namespace ts {
513513
performance.mark("beforeParse");
514514
let result: SourceFile;
515515
try {
516-
if (etwLogger) etwLogger.logStartParseSourceFile(fileName);
516+
perfLogger.logStartParseSourceFile(fileName);
517517
if (languageVersion === ScriptTarget.JSON) {
518518
result = Parser.parseSourceFile(fileName, sourceText, languageVersion, /*syntaxCursor*/ undefined, setParentNodes, ScriptKind.JSON);
519519
}
@@ -522,7 +522,7 @@ namespace ts {
522522
}
523523
}
524524
finally {
525-
if (etwLogger) etwLogger.logStopParseSourceFile();
525+
perfLogger.logStopParseSourceFile();
526526
}
527527

528528
performance.mark("afterParse");

src/compiler/perfLogger.ts

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/* @internal */
2+
namespace ts {
3+
export type PerfLogger = typeof import("@microsoft/typescript-etw"); // tslint:disable-line:no-implicit-dependencies
4+
5+
export class NullLogger implements PerfLogger {
6+
logEvent(_msg: string): void {
7+
return;
8+
}
9+
logErrEvent(_msg: string): void {
10+
return;
11+
}
12+
logPerfEvent(_msg: string): void {
13+
return;
14+
}
15+
logInfoEvent(_msg: string): void {
16+
return;
17+
}
18+
logStartCommand(_command: string, _msg: string): void {
19+
return;
20+
}
21+
logStopCommand(_command: string, _msg: string): void {
22+
return;
23+
}
24+
logStartUpdateProgram(_msg: string): void {
25+
return;
26+
}
27+
logStopUpdateProgram(_msg: string): void {
28+
return;
29+
}
30+
logStartUpdateGraph(): void {
31+
return;
32+
}
33+
logStopUpdateGraph(): void {
34+
return;
35+
}
36+
logStartResolveModule(_name: string): void {
37+
return;
38+
}
39+
logStopResolveModule(_success: string): void {
40+
return;
41+
}
42+
logStartParseSourceFile(_filename: string): void {
43+
return;
44+
}
45+
logStopParseSourceFile(): void {
46+
return;
47+
}
48+
logStartReadFile(_filename: string): void {
49+
return;
50+
}
51+
logStopReadFile(): void {
52+
return;
53+
}
54+
logStartBindFile(_filename: string): void {
55+
return;
56+
}
57+
logStopBindFile(): void {
58+
return;
59+
}
60+
logStartScheduledOperation(_operationId: string): void {
61+
return;
62+
}
63+
logStopScheduledOperation(): void {
64+
return;
65+
}
66+
}
67+
68+
// Load optional module to enable Event Tracing for Windows
69+
// See https://github.com/microsoft/typescript-etw for more information
70+
let etwModule;
71+
try {
72+
// require() will throw an exception if the module is not installed
73+
// It may also return undefined if not installed properly
74+
etwModule = require("@microsoft/typescript-etw"); // tslint:disable-line:no-implicit-dependencies
75+
}
76+
catch (e) {
77+
etwModule = undefined;
78+
}
79+
80+
export const perfLogger: PerfLogger = etwModule ? etwModule : new NullLogger();
81+
}

src/compiler/sys.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -1088,7 +1088,7 @@ namespace ts {
10881088

10891089
function readFile(fileName: string, _encoding?: string): string | undefined {
10901090
try {
1091-
if (etwLogger) etwLogger.logStartReadFile(fileName);
1091+
perfLogger.logStartReadFile(fileName);
10921092
if (!fileExists(fileName)) {
10931093
return undefined;
10941094
}
@@ -1116,12 +1116,12 @@ namespace ts {
11161116
// Default is UTF-8 with no byte order mark
11171117
return buffer.toString("utf8");
11181118
} finally {
1119-
if (etwLogger) etwLogger.logStopReadFile();
1119+
perfLogger.logStopReadFile();
11201120
}
11211121
}
11221122

11231123
function writeFile(fileName: string, data: string, writeByteOrderMark?: boolean): void {
1124-
if (etwLogger) etwLogger.logEvent("WriteFile: " + fileName);
1124+
perfLogger.logEvent("WriteFile: " + fileName);
11251125
// If a BOM is required, emit one
11261126
if (writeByteOrderMark) {
11271127
data = byteOrderMarkIndicator + data;
@@ -1141,7 +1141,7 @@ namespace ts {
11411141
}
11421142

11431143
function getAccessibleFileSystemEntries(path: string): FileSystemEntries {
1144-
if (etwLogger) etwLogger.logEvent("ReadDir: " + (path || "."));
1144+
perfLogger.logEvent("ReadDir: " + (path || "."));
11451145
try {
11461146
const entries = _fs.readdirSync(path || ".").sort();
11471147
const files: string[] = [];
@@ -1203,7 +1203,7 @@ namespace ts {
12031203
}
12041204

12051205
function getDirectories(path: string): string[] {
1206-
if (etwLogger) etwLogger.logEvent("ReadDir: " + path);
1206+
perfLogger.logEvent("ReadDir: " + path);
12071207
return filter<string>(_fs.readdirSync(path), dir => fileSystemEntryExists(combinePaths(path, dir), FileSystemEntryKind.Directory));
12081208
}
12091209

src/compiler/tsconfig.json

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"references": [],
88

99
"files": [
10+
"perfLogger.ts",
1011
"core.ts",
1112
"debug.ts",
1213
"performance.ts",

src/compiler/watch.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1006,18 +1006,18 @@ namespace ts {
10061006
try {
10071007
switch (reloadLevel) {
10081008
case ConfigFileProgramReloadLevel.Partial:
1009-
if (etwLogger) etwLogger.logStartUpdateProgram("PartialConfigReload");
1009+
perfLogger.logStartUpdateProgram("PartialConfigReload");
10101010
return reloadFileNamesFromConfigFile();
10111011
case ConfigFileProgramReloadLevel.Full:
1012-
if (etwLogger) etwLogger.logStartUpdateProgram("FullConfigReload");
1012+
perfLogger.logStartUpdateProgram("FullConfigReload");
10131013
return reloadConfigFile();
10141014
default:
1015-
if (etwLogger) etwLogger.logStartUpdateProgram("SynchronizeProgram");
1015+
perfLogger.logStartUpdateProgram("SynchronizeProgram");
10161016
synchronizeProgram();
10171017
return;
10181018
}
10191019
} finally {
1020-
if (etwLogger) etwLogger.logStopUpdateProgram("Done");
1020+
perfLogger.logStopUpdateProgram("Done");
10211021
}
10221022
}
10231023

src/server/project.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -851,7 +851,7 @@ namespace ts.server {
851851
* @returns: true if set of files in the project stays the same and false - otherwise.
852852
*/
853853
updateGraph(): boolean {
854-
if (etwLogger) etwLogger.logStartUpdateGraph();
854+
perfLogger.logStartUpdateGraph();
855855
try {
856856
this.resolutionCache.startRecordingFilesWithChangedResolutions();
857857

@@ -890,7 +890,7 @@ namespace ts.server {
890890
}
891891
return !hasNewProgram;
892892
} finally {
893-
if (etwLogger) etwLogger.logStopUpdateGraph();
893+
perfLogger.logStopUpdateGraph();
894894
}
895895
}
896896

src/server/session.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -732,7 +732,7 @@ namespace ts.server {
732732
return;
733733
}
734734
const msgText = formatMessage(msg, this.logger, this.byteLength, this.host.newLine);
735-
if (etwLogger) etwLogger.logEvent(`Response message size: ${msgText.length}`);
735+
perfLogger.logEvent(`Response message size: ${msgText.length}`);
736736
this.host.write(msgText);
737737
}
738738

@@ -2513,7 +2513,7 @@ namespace ts.server {
25132513
request = <protocol.Request>JSON.parse(message);
25142514
relevantFile = request.arguments && (request as protocol.FileRequest).arguments.file ? (request as protocol.FileRequest).arguments : undefined;
25152515

2516-
if (etwLogger) etwLogger.logStartCommand("" + request.command, message.substring(0, 100));
2516+
perfLogger.logStartCommand("" + request.command, message.substring(0, 100));
25172517
const { response, responseRequired } = this.executeCommand(request);
25182518

25192519
if (this.logger.hasLevel(LogLevel.requestTime)) {
@@ -2529,7 +2529,7 @@ namespace ts.server {
25292529
// Note: Log before writing the response, else the editor can complete its activity before the server does
25302530
// Set 'commandSucceded' flag to ensure logStopCommand doesn't get called twice (e.g. if doOutput throws)
25312531
commandSucceeded = true;
2532-
if (etwLogger) etwLogger.logStopCommand("" + request.command, "Success");
2532+
perfLogger.logStopCommand("" + request.command, "Success");
25332533
if (response) {
25342534
this.doOutput(response, request.command, request.seq, /*success*/ true);
25352535
}
@@ -2540,13 +2540,13 @@ namespace ts.server {
25402540
catch (err) {
25412541
if (err instanceof OperationCanceledException) {
25422542
// Handle cancellation exceptions
2543-
if (etwLogger && !commandSucceeded) etwLogger.logStopCommand("" + (request && request.command), "Canceled: " + err);
2543+
if (!commandSucceeded) perfLogger.logStopCommand("" + (request && request.command), "Canceled: " + err);
25442544
this.doOutput({ canceled: true }, request!.command, request!.seq, /*success*/ true);
25452545
return;
25462546
}
25472547

25482548
this.logErrorWorker(err, message, relevantFile);
2549-
if (etwLogger && !commandSucceeded) etwLogger.logStopCommand("" + (request && request.command), "Error: " + err);
2549+
if (!commandSucceeded) perfLogger.logStopCommand("" + (request && request.command), "Error: " + err);
25502550

25512551
this.doOutput(
25522552
/*info*/ undefined,

src/server/utilities.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -151,14 +151,14 @@ namespace ts.server {
151151

152152
private static run(self: ThrottledOperations, operationId: string, cb: () => void) {
153153
try {
154-
if (etwLogger) etwLogger.logStartScheduledOperation(operationId);
154+
perfLogger.logStartScheduledOperation(operationId);
155155
self.pendingTimeouts.delete(operationId);
156156
if (self.logger) {
157157
self.logger.info(`Running: ${operationId}`);
158158
}
159159
cb();
160160
} finally {
161-
if (etwLogger) etwLogger.logStopScheduledOperation();
161+
perfLogger.logStopScheduledOperation();
162162
}
163163
}
164164
}
@@ -180,7 +180,7 @@ namespace ts.server {
180180
self.timerId = undefined;
181181

182182
try {
183-
if (etwLogger) etwLogger.logStartScheduledOperation("GC collect");
183+
perfLogger.logStartScheduledOperation("GC collect");
184184
const log = self.logger.hasLevel(LogLevel.requestTime);
185185
const before = log && self.host.getMemoryUsage!(); // TODO: GH#18217
186186

@@ -190,7 +190,7 @@ namespace ts.server {
190190
self.logger.perftrc(`GC::before ${before}, after ${after}`);
191191
}
192192
} finally {
193-
if (etwLogger) etwLogger.logStopScheduledOperation();
193+
perfLogger.logStopScheduledOperation();
194194
}
195195
}
196196
}

src/tsserver/server.ts

+11-12
Original file line numberDiff line numberDiff line change
@@ -180,19 +180,18 @@ namespace ts.server {
180180
}
181181

182182
msg(s: string, type: Msg = Msg.Err) {
183-
if (etwLogger) {
184-
switch (type) {
185-
case Msg.Info:
186-
etwLogger.logInfoEvent(s);
187-
break;
188-
case Msg.Perf:
189-
etwLogger.logPerfEvent(s);
190-
break;
191-
default: // Msg.Err
192-
etwLogger.logErrEvent(s);
193-
break;
194-
}
183+
switch (type) {
184+
case Msg.Info:
185+
perfLogger.logInfoEvent(s);
186+
break;
187+
case Msg.Perf:
188+
perfLogger.logPerfEvent(s);
189+
break;
190+
default: // Msg.Err
191+
perfLogger.logErrEvent(s);
192+
break;
195193
}
194+
196195
if (!this.canWrite) return;
197196

198197
s = `[${nowString()}] ${s}\n`;

0 commit comments

Comments
 (0)