mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
All tsserver unittests use session and typing installer (#56337)
This commit is contained in:
@@ -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"),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user