All tsserver unittests use session and typing installer (#56337)

This commit is contained in:
Sheetal Nandi
2023-11-09 11:48:48 -08:00
committed by GitHub
parent 8e1fb5789a
commit efecc85dca
1350 changed files with 149066 additions and 39856 deletions
+3 -3
View File
@@ -6,7 +6,7 @@ import * as Utils from "./_namespaces/Utils";
import * as vfs from "./_namespaces/vfs";
import * as vpath from "./_namespaces/vpath";
import {
Logger,
LoggerWithInMemoryLogs,
} from "./tsserverLogger";
import ArrayOrSingle = FourSlashInterface.ArrayOrSingle;
@@ -259,7 +259,7 @@ export class TestState {
private inputFiles = new Map<string, string>(); // Map between inputFile's fileName and its content for easily looking up when resolving references
private logger: Logger | undefined;
private logger: LoggerWithInMemoryLogs | undefined;
private static getDisplayPartsJson(displayParts: ts.SymbolDisplayPart[] | undefined) {
let result = "";
@@ -519,7 +519,7 @@ export class TestState {
if (this.logger) {
Harness.Baseline.runBaseline(
`tsserver/fourslashServer/${ts.getBaseFileName(this.originalInputFileName).replace(".ts", ".js")}`,
this.logger.logs!.join("\n"),
this.logger.logs.join("\n"),
);
}
}
+3 -3
View File
@@ -17,7 +17,7 @@ import {
import {
createLoggerWithInMemoryLogs,
HarnessLSCouldNotResolveModule,
Logger,
LoggerWithInMemoryLogs,
} from "./tsserverLogger";
import {
createWatchUtils,
@@ -130,7 +130,7 @@ export interface LanguageServiceAdapter {
getLanguageService(): ts.LanguageService;
getClassifier(): ts.Classifier;
getPreProcessedFileInfo(fileName: string, fileContents: string): ts.PreProcessedFileInfo;
getLogger(): Logger | undefined;
getLogger(): LoggerWithInMemoryLogs | undefined;
}
export abstract class LanguageServiceAdapterHost {
@@ -611,7 +611,7 @@ export class ServerLanguageServiceAdapter implements LanguageServiceAdapter {
private host: SessionClientHost;
private client: ts.server.SessionClient;
private server: FourslashSession;
private logger: Logger;
private logger: LoggerWithInMemoryLogs;
constructor(cancellationToken?: ts.HostCancellationToken, options?: ts.CompilerOptions) {
// This is the main host that tests use to direct tests
const clientHost = new SessionClientHost(cancellationToken, options);
+1
View File
@@ -431,6 +431,7 @@ function verifyProgram(service: ts.server.ProjectService, project: ts.server.Pro
const getDefaultLibLocation = compilerHost.getDefaultLibLocation!;
compilerHost.getDefaultLibLocation = () => ts.getNormalizedAbsolutePath(getDefaultLibLocation(), service.host.getCurrentDirectory());
compilerHost.getDefaultLibFileName = options => ts.combinePaths(compilerHost.getDefaultLibLocation!(), ts.getDefaultLibFileName(options));
compilerHost.trace = ts.noop; // We dont want to update host just because of trace
const readFile = compilerHost.readFile;
compilerHost.readFile = fileName => {
const path = project.toPath(fileName);
+35 -28
View File
@@ -50,12 +50,16 @@ export function nullLogger(): Logger {
}
export function createHasErrorMessageLogger(): Logger {
return {
...nullLogger(),
msg: (s, type) => ts.Debug.fail(`Error: ${s}, type: ${type}`),
};
const logger = nullLogger();
logger.msg = (s, type) => ts.Debug.fail(`Error: ${s}, type: ${type}`);
return logger;
}
function handleLoggerGroup(logger: Logger): Logger {
function handleLoggerGroup(logger: Logger, host: ts.server.ServerHost, logText: (s: string) => void, sanitizeLibs: true | undefined): Logger {
logger.hasLevel = ts.returnTrue;
logger.loggingEnabled = ts.returnTrue;
logger.host = host;
if (host) logText(`currentDirectory:: ${host.getCurrentDirectory()} useCaseSensitiveFileNames: ${host.useCaseSensitiveFileNames}`);
let inGroup = false;
let firstInGroup = false;
logger.startGroup = () => {
@@ -63,11 +67,14 @@ function handleLoggerGroup(logger: Logger): Logger {
firstInGroup = true;
};
logger.endGroup = () => inGroup = false;
const originalInfo = logger.info;
logger.info = s => msg(s, ts.server.Msg.Info, s => originalInfo.call(logger, s));
logger.log = s => originalInfo.call(logger, s);
logger.info = s => msg(s, ts.server.Msg.Info, log);
logger.log = log;
return logger;
function log(s: string) {
logText((sanitizeLibs ? sanitizeLibFileText : ts.identity)(sanitizeLog(s)));
}
function msg(s: string, type = ts.server.Msg.Err, write: (s: string) => void) {
s = `[${nowString(logger)}] ${s}`;
if (!inGroup || firstInGroup) s = padStringRight(type + " seq", " ") + s;
@@ -86,16 +93,19 @@ export function nowString(logger: Logger) {
return `hh:mm:ss:mss`;
}
export function createLoggerWritingToConsole(host: ts.server.ServerHost) {
return handleLoggerGroup({
...nullLogger(),
hasLevel: ts.returnTrue,
loggingEnabled: ts.returnTrue,
perftrc: s => console.log(s),
info: s => console.log(s),
msg: (s, type) => console.log(`${type}:: ${s}`),
export function createLoggerWritingToConsole(host: ts.server.ServerHost, sanitizeLibs?: true) {
const logger = createHasErrorMessageLogger();
logger.logs = [];
logger.logs.push = (...args) => {
args.forEach(s => console.log(s));
return 0;
};
return handleLoggerGroup(
logger,
host,
});
s => console.log(s),
sanitizeLibs,
) as LoggerWithInMemoryLogs;
}
export function sanitizeLog(s: string): string {
@@ -117,6 +127,7 @@ export function sanitizeLog(s: string): string {
s = s.replace(/"exportMapKey":\s*"\d+ \d+ /g, match => match.replace(/ \d+ /, ` * `));
s = s.replace(/getIndentationAtPosition: getCurrentSourceFile: \d+(?:\.\d+)?/, `getIndentationAtPosition: getCurrentSourceFile: *`);
s = s.replace(/getIndentationAtPosition: computeIndentation\s*: \d+(?:\.\d+)?/, `getIndentationAtPosition: computeIndentation: *`);
s = replaceAll(s, `@ts${ts.versionMajorMinor}`, `@tsFakeMajor.Minor`);
s = sanitizeHarnessLSException(s);
return s;
}
@@ -135,16 +146,12 @@ export function sanitizeLibFileText(s: string): string {
return s;
}
export function createLoggerWithInMemoryLogs(host: ts.server.ServerHost, sanitizeLibs?: true): Logger {
export interface LoggerWithInMemoryLogs extends Logger {
logs: string[];
}
export function createLoggerWithInMemoryLogs(host: ts.server.ServerHost, sanitizeLibs?: true): LoggerWithInMemoryLogs {
const logger = createHasErrorMessageLogger();
const logs: string[] = [];
if (host) logs.push(`currentDirectory:: ${host.getCurrentDirectory()} useCaseSensitiveFileNames: ${host.useCaseSensitiveFileNames}`);
return handleLoggerGroup({
...logger,
logs,
hasLevel: ts.returnTrue,
loggingEnabled: ts.returnTrue,
info: s => logs.push((sanitizeLibs ? sanitizeLibFileText : ts.identity)(sanitizeLog(s))),
host,
});
logger.logs = [];
return handleLoggerGroup(logger, host, s => logger.logs!.push(s), sanitizeLibs) as LoggerWithInMemoryLogs;
}