Skip to content

Commit 001b81c

Browse files
authored
Disable VS Code file watching for yarn pnp (#213238)
Disable VS Code file watching on yarn pnp
1 parent c04c9f8 commit 001b81c

File tree

3 files changed

+46
-22
lines changed

3 files changed

+46
-22
lines changed

extensions/typescript-language-features/src/tsServer/api.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,8 @@ export class API {
8080
public lt(other: API): boolean {
8181
return !this.gte(other);
8282
}
83+
84+
public isYarnPnp(): boolean {
85+
return this.fullVersionString.includes('-sdk');
86+
}
8387
}

extensions/typescript-language-features/src/tsServer/spawner.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,11 @@ export class TypeScriptServerSpawner {
271271

272272
args.push('--noGetErrOnBackgroundUpdate');
273273

274-
if (apiVersion.gte(API.v544) && configuration.useVsCodeWatcher) {
274+
if (
275+
apiVersion.gte(API.v544)
276+
&& configuration.useVsCodeWatcher
277+
&& !apiVersion.isYarnPnp() // Disable for yarn pnp as it currently breaks with the VS Code watcher
278+
) {
275279
args.push('--canUseWatchEvents');
276280
}
277281

extensions/typescript-language-features/src/typescriptServiceClient.ts

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,32 @@
55

66
import * as path from 'path';
77
import * as vscode from 'vscode';
8+
import { ServiceConfigurationProvider, SyntaxServerConfiguration, TsServerLogLevel, TypeScriptServiceConfiguration, areServiceConfigurationsEqual } from './configuration/configuration';
9+
import * as fileSchemes from './configuration/fileSchemes';
10+
import { Schemes } from './configuration/schemes';
811
import { IExperimentationTelemetryReporter } from './experimentTelemetryReporter';
912
import { DiagnosticKind, DiagnosticsManager } from './languageFeatures/diagnostics';
10-
import * as Proto from './tsServer/protocol/protocol';
11-
import { EventName } from './tsServer/protocol/protocol.const';
13+
import { Logger } from './logging/logger';
14+
import { TelemetryProperties, TelemetryReporter, VSCodeTelemetryReporter } from './logging/telemetry';
15+
import Tracer from './logging/tracer';
16+
import { ProjectType, inferredProjectCompilerOptions } from './tsconfig';
1217
import { API } from './tsServer/api';
1318
import BufferSyncSupport from './tsServer/bufferSyncSupport';
1419
import { OngoingRequestCancellerFactory } from './tsServer/cancellation';
1520
import { ILogDirectoryProvider } from './tsServer/logDirectoryProvider';
21+
import { NodeVersionManager } from './tsServer/nodeManager';
1622
import { TypeScriptPluginPathsProvider } from './tsServer/pluginPathsProvider';
23+
import { PluginManager, TypeScriptServerPlugin } from './tsServer/plugins';
24+
import * as Proto from './tsServer/protocol/protocol';
25+
import { EventName } from './tsServer/protocol/protocol.const';
1726
import { ITypeScriptServer, TsServerLog, TsServerProcessFactory, TypeScriptServerExitEvent } from './tsServer/server';
1827
import { TypeScriptServerError } from './tsServer/serverError';
1928
import { TypeScriptServerSpawner } from './tsServer/spawner';
2029
import { TypeScriptVersionManager } from './tsServer/versionManager';
2130
import { ITypeScriptVersionProvider, TypeScriptVersion } from './tsServer/versionProvider';
2231
import { ClientCapabilities, ClientCapability, ExecConfig, ITypeScriptServiceClient, ServerResponse, TypeScriptRequests } from './typescriptService';
23-
import { ServiceConfigurationProvider, SyntaxServerConfiguration, TsServerLogLevel, TypeScriptServiceConfiguration, areServiceConfigurationsEqual } from './configuration/configuration';
2432
import { Disposable, DisposableStore, disposeAll } from './utils/dispose';
25-
import * as fileSchemes from './configuration/fileSchemes';
26-
import { Logger } from './logging/logger';
2733
import { isWeb, isWebAndHasSharedArrayBuffers } from './utils/platform';
28-
import { PluginManager, TypeScriptServerPlugin } from './tsServer/plugins';
29-
import { TelemetryProperties, TelemetryReporter, VSCodeTelemetryReporter } from './logging/telemetry';
30-
import Tracer from './logging/tracer';
31-
import { ProjectType, inferredProjectCompilerOptions } from './tsconfig';
32-
import { Schemes } from './configuration/schemes';
33-
import { NodeVersionManager } from './tsServer/nodeManager';
3434

3535

3636
export interface TsDiagnostics {
@@ -463,7 +463,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType
463463
}
464464
*/
465465
this.logTelemetry('tsserver.error');
466-
this.serviceExited(false);
466+
this.serviceExited(false, apiVersion);
467467
});
468468

469469
handle.onExit((data: TypeScriptServerExitEvent) => {
@@ -484,7 +484,6 @@ export default class TypeScriptServiceClient extends Disposable implements IType
484484
*/
485485
this.logTelemetry('tsserver.exitWithCode', { code: code ?? undefined, signal: signal ?? undefined });
486486

487-
488487
if (this.token !== mytoken) {
489488
// this is coming from an old process
490489
return;
@@ -493,7 +492,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType
493492
if (handle.tsServerLog?.type === 'file') {
494493
this.info(`TSServer log file: ${handle.tsServerLog.uri.fsPath}`);
495494
}
496-
this.serviceExited(!this.isRestarting);
495+
this.serviceExited(!this.isRestarting, apiVersion);
497496
this.isRestarting = false;
498497
});
499498

@@ -612,7 +611,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType
612611
};
613612
}
614613

615-
private serviceExited(restart: boolean): void {
614+
private serviceExited(restart: boolean, tsVersion: API): void {
616615
this.resetWatchers();
617616
this.loadingIndicator.reset();
618617

@@ -686,25 +685,42 @@ export default class TypeScriptServiceClient extends Disposable implements IType
686685
this._isPromptingAfterCrash = true;
687686
}
688687

689-
prompt?.then(item => {
688+
prompt?.then(async item => {
690689
this._isPromptingAfterCrash = false;
691690

692691
if (item === reportIssueItem) {
692+
693693
const minModernTsVersion = this.versionProvider.bundledVersion.apiVersion;
694694

695-
if (
695+
// Don't allow reporting issues using the PnP patched version of TS Server
696+
if (tsVersion.isYarnPnp()) {
697+
const reportIssue: vscode.MessageItem = {
698+
title: vscode.l10n.t("Report issue against Yarn PnP"),
699+
};
700+
const response = await vscode.window.showWarningMessage(
701+
vscode.l10n.t("Please report an issue against Yarn PnP"),
702+
{
703+
modal: true,
704+
detail: vscode.l10n.t("The workspace is using a version of the TypeScript Server that has been patched by Yarn PnP. This patching is a common source of bugs."),
705+
},
706+
reportIssue);
707+
708+
if (response === reportIssue) {
709+
vscode.env.openExternal(vscode.Uri.parse('https://github.com/yarnpkg/berry/issues'));
710+
}
711+
}
712+
// Don't allow reporting issues with old TS versions
713+
else if (
696714
minModernTsVersion &&
697-
previousState.type === ServerState.Type.Errored &&
698-
previousState.error instanceof TypeScriptServerError &&
699-
previousState.error.version.apiVersion?.lt(minModernTsVersion)
715+
tsVersion.lt(minModernTsVersion)
700716
) {
701717
vscode.window.showWarningMessage(
702718
vscode.l10n.t("Please update your TypeScript version"),
703719
{
704720
modal: true,
705721
detail: vscode.l10n.t(
706722
"The workspace is using an old version of TypeScript ({0}).\n\nBefore reporting an issue, please update the workspace to use TypeScript {1} or newer to make sure the bug has not already been fixed.",
707-
previousState.error.version.apiVersion.displayName,
723+
tsVersion.displayName,
708724
minModernTsVersion.displayName),
709725
});
710726
} else {

0 commit comments

Comments
 (0)