microsoft/TypeScript · error · Error
getClassifier is not available using the server interface.
Error message
getClassifier is not available using the server interface.
What it means
Thrown by the server-backed language service adapter (harnessLanguageService.ts:807) when a test invokes getClassifier() on a TestSession/SessionClientHost. The classifier is a compiler-internal API that the tsserver protocol does not expose, so the server adapter deliberately throws rather than pretend to support it.
Source
Thrown at src/harness/harnessLanguageService.ts:807
if (options) {
client.setCompilerOptionsForInferredProjects(ts.optionMapToObject(ts.serializeCompilerOptions(options)) as ts.server.protocol.CompilerOptions);
}
// Set the properties
this.client = client;
this.host = clientHost;
}
getLogger(): LoggerWithInMemoryLogs {
return this.logger;
}
getHost(): SessionClientHost {
return this.host;
}
getLanguageService(): ts.LanguageService {
return this.client;
}
getClassifier(): ts.Classifier {
throw new Error("getClassifier is not available using the server interface.");
}
getPreProcessedFileInfo(): ts.PreProcessedFileInfo {
throw new Error("getPreProcessedFileInfo is not available using the server interface.");
}
assertTextConsistent(fileName: string): void {
const serverText = this.server.getText(fileName);
const clientText = this.host.readFile(fileName);
ts.Debug.assert(
serverText === clientText,
[
"Server and client text are inconsistent.",
"",
"\x1b[1mServer\x1b[0m\x1b[31m:",
serverText,
"",
"\x1b[1mClient\x1b[0m\x1b[31m:",
clientText,
"",
View on GitHub (pinned to b465fdbfe1)
Solutions
- Gate classifier tests to run only against the in-process adapter (skip when the adapter is the server/session variant).
- Move classifier assertions into a separate test that does not exercise the server code path.
- If you must assert server-side classification, use the EncodedSyntacticClassifications protocol command instead of getClassifier.
Example fix
// before — runs against every adapter, throws on server variant
test.each(adapters)("classifies", adapter => {
const cls = adapter.getClassifier().getClassificationsForLine(...);
assert.ok(cls);
});
// after — skip server variants for classifier-only tests
test.each(adapters.filter(a => !isServerAdapter(a)))("classifies", adapter => {
const cls = adapter.getClassifier().getClassificationsForLine(...);
assert.ok(cls);
}); Defensive patterns
Strategy: type-guard
Validate before calling
// Detect server-backed adapters and skip classifier tests for them.
function supportsClassifier(adapter: unknown): boolean {
// Server-backed adapters throw on getClassifier; detect by capability rather than type.
return typeof (adapter as any).getClassifier === 'function' && !isServerAdapter(adapter);
} Type guard
function isServerAdapter(adapter: unknown): boolean {
// SessionClientHost advertises getHost/getLanguageService but lacks a real classifier.
return typeof (adapter as any)?.getHost === 'function' && !(adapter as any)._classifierAvailable;
} Prevention
- Gate classifier tests to run only against in-process adapters.
- Use protocol commands (encodedSyntacticClassifications) for server-side classification coverage.
- Document adapter capabilities in test helpers so authors know which calls are safe.
When it happens
Trigger: A language service test is parameterised to run both against the in-process LanguageService and against a server Session, and the test body calls `adapter.getClassifier()`. The in-process variant returns a real Classifier; the server variant throws this message.
Common situations: Writing a classifier/syntax-classification test and running it through the server harness; sharing one test function across both adapter kinds without gating classifier-only calls.
Related errors
- getPreProcessedFileInfo is not available using the server in
- No script with name '" + fileName + "'
- verifyCurrentLineContent\n
- verifyFileContent in file '${fileName}' failed:\n${showTextD
- Expected at least one js file to be emitted or at least one
AI-assisted analysis of microsoft/TypeScript@b465fdbfe1 (2026-08-12).
Data as JSON: /api/errors/4e63ec7176b63cb9.
Report an issue: GitHub.