Skip to content

Commit 9ba85fb

Browse files
author
Andy Hanson
committed
wip
1 parent 2368847 commit 9ba85fb

File tree

8 files changed

+93
-65
lines changed

8 files changed

+93
-65
lines changed

src/compiler/moduleNameResolver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,7 @@ namespace ts {
686686
const { resolvedModule, failedLookupLocations } =
687687
nodeModuleNameResolverWorker(moduleName, initialDir, { moduleResolution: ts.ModuleResolutionKind.NodeJs, allowJs: true }, host, /*cache*/ undefined, /*jsOnly*/ true);
688688
if (!resolvedModule) {
689-
throw new Error(`Could not resolve JS module ${moduleName} starting at ${initialDir}. Looked in: ${failedLookupLocations.join(", ")}`);
689+
throw new Error(`Could not resolve JS module '${moduleName}' starting at '${initialDir}'. Looked in: ${failedLookupLocations.join(", ")}`);
690690
}
691691
return resolvedModule.resolvedFileName;
692692
}

src/harness/harnessLanguageService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -795,7 +795,7 @@ namespace Harness.LanguageService {
795795
default:
796796
return {
797797
module: undefined,
798-
error: "Could not resolve module"
798+
error: new Error("Could not resolve module")
799799
};
800800
}
801801

src/harness/unittests/tsserverProjectSystem.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2374,7 +2374,7 @@ namespace ts.projectSystem {
23742374
});
23752375
projectService.checkNumberOfProjects({ externalProjects: 1 });
23762376
const typeAcquisition = projectService.externalProjects[0].getTypeAcquisition();
2377-
assert.isTrue(typeAcquisition.enable, "Typine acquisition should be enabled");
2377+
assert.isTrue(typeAcquisition.enable, "Type acquisition should be enabled");
23782378
});
23792379
});
23802380

@@ -2738,7 +2738,7 @@ namespace ts.projectSystem {
27382738
});
27392739

27402740
describe("watching @types", () => {
2741-
it("works correctly when typings are added or removed", () => {
2741+
it("works correctly when typings are added or removed", () => { //!
27422742
const f1 = {
27432743
path: "/a/b/app.ts",
27442744
content: "let x = 1;"

src/server/editorServices.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,17 @@
1010
namespace ts.server {
1111
export const maxProgramSizeForNonTsFiles = 20 * 1024 * 1024;
1212

13+
export const TypingsInstalledEvent = "typingsInstalled";
1314
export const ContextEvent = "context";
1415
export const ConfigFileDiagEvent = "configFileDiag";
1516
export const ProjectLanguageServiceStateEvent = "projectLanguageServiceState";
1617
export const ProjectInfoTelemetryEvent = "projectInfo";
1718

19+
export interface TypingsInstalledEvent {
20+
eventName: typeof TypingsInstalledEvent;
21+
data: { project: Project };
22+
}
23+
1824
export interface ContextEvent {
1925
eventName: typeof ContextEvent;
2026
data: { project: Project; fileName: NormalizedPath };
@@ -77,7 +83,7 @@ namespace ts.server {
7783
readonly dts: number;
7884
}
7985

80-
export type ProjectServiceEvent = ContextEvent | ConfigFileDiagEvent | ProjectLanguageServiceStateEvent | ProjectInfoTelemetryEvent;
86+
export type ProjectServiceEvent = TypingsInstalledEvent | ContextEvent | ConfigFileDiagEvent | ProjectLanguageServiceStateEvent | ProjectInfoTelemetryEvent;
8187

8288
export interface ProjectServiceEventHandler {
8389
(event: ProjectServiceEvent): void;
@@ -405,6 +411,7 @@ namespace ts.server {
405411
this.throttleWaitMilliseconds = opts.throttleWaitMilliseconds;
406412
this.eventHandler = opts.eventHandler;
407413
this.globalPlugins = opts.globalPlugins || emptyArray;
414+
this.logger.info(`GLOBAL PLUGINS: ${opts.globalPlugins}`);
408415
this.pluginProbeLocations = opts.pluginProbeLocations || emptyArray;
409416
this.allowLocalPluginLoads = !!opts.allowLocalPluginLoads;
410417

@@ -450,7 +457,9 @@ namespace ts.server {
450457
});
451458
}
452459

460+
//!
453461
updateTypingsForProject(response: SetTypings | InvalidateCachedTypings): void {
462+
debugger; //!
454463
const project = this.findProject(response.projectName);
455464
if (!project) {
456465
return;
@@ -463,7 +472,14 @@ namespace ts.server {
463472
this.typingsCache.deleteTypingsForProject(response.projectName);
464473
break;
465474
}
475+
476+
//Also send new errors...
466477
project.updateGraph();
478+
479+
//this.eventHandler(<ContextEvent>{
480+
// eventName: ContextEvent,
481+
// data: { project, fileName: response.proje }
482+
//});
467483
}
468484

469485
setCompilerOptionsForInferredProjects(projectCompilerOptions: protocol.ExternalProjectCompilerOptions): void {

src/server/project.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
/// <reference path="typingsCache.ts"/>
66
/// <reference path="builder.ts"/>
77

8+
interface Console { [x: string]: any; }
9+
declare var console: Console;
10+
811
namespace ts.server {
912

1013
export enum ProjectKind {
@@ -115,7 +118,7 @@ namespace ts.server {
115118
// wrapper over the real language service that will suppress all semantic operations
116119
protected languageService: LanguageService;
117120

118-
public languageServiceEnabled = true;
121+
public languageServiceEnabled = true; //If this is false, why even have a Project?
119122

120123
protected lsHost: LSHost;
121124

@@ -170,7 +173,8 @@ namespace ts.server {
170173
log(`Loading ${moduleName} from ${initialDir} (resolved to ${resolvedPath})`);
171174
const result = host.require(resolvedPath, moduleName);
172175
if (result.error) {
173-
log(`Failed to load module: ${JSON.stringify(result.error)}`);
176+
const err = result.error.stack || JSON.stringify(result.error);
177+
log(`Failed to load module ${resolvedPath}: ${err}`);
174178
return undefined;
175179
}
176180
return result.module;
@@ -530,7 +534,7 @@ namespace ts.server {
530534
* Updates set of files that contribute to this project
531535
* @returns: true if set of files in the project stays the same and false - otherwise.
532536
*/
533-
updateGraph(): boolean {
537+
updateGraph(): boolean { //!
534538
this.lsHost.startRecordingFilesWithChangedResolutions();
535539

536540
let hasChanges = this.updateGraphWorker();
@@ -566,7 +570,7 @@ namespace ts.server {
566570
// update builder only if language service is enabled
567571
// otherwise tell it to drop its internal state
568572
if (this.languageServiceEnabled) {
569-
this.builder.onProjectUpdateGraph();
573+
this.builder.onProjectUpdateGraph(); //important?
570574
}
571575
else {
572576
this.builder.clear();
@@ -963,7 +967,7 @@ namespace ts.server {
963967
return this.getProjectName();
964968
}
965969

966-
enablePlugins() {
970+
private enablePlugins() {
967971
const host = this.projectService.host;
968972
const options = this.getCompilerOptions();
969973

@@ -995,6 +999,7 @@ namespace ts.server {
995999
// Skip already-locally-loaded plugins
9961000
if (options.plugins && options.plugins.some(p => p.name === globalPluginName)) continue;
9971001

1002+
//For some reason, we have global plugins...
9981003
// Provide global: true so plugins can detect why they can't find their config
9991004
this.enablePlugin({ name: globalPluginName, global: true } as PluginImport, searchPaths);
10001005
}
@@ -1007,6 +1012,11 @@ namespace ts.server {
10071012
};
10081013

10091014
for (const searchPath of searchPaths) {
1015+
try {
1016+
Debug.assert(!!pluginConfigEntry.name);
1017+
} catch (e) {
1018+
console.error(e.stack);
1019+
}
10101020
const resolvedModule = <PluginModuleFactory>Project.resolveModule(pluginConfigEntry.name, searchPath, this.projectService.host, log);
10111021
if (resolvedModule) {
10121022
this.enableProxy(resolvedModule, pluginConfigEntry);

src/server/server.ts

Lines changed: 48 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,6 @@ namespace ts.server {
116116
birthtime: Date;
117117
}
118118

119-
type RequireResult = { module: {}, error: undefined } | { module: undefined, error: {} };
120-
121119
const readline: {
122120
createInterface(options: ReadLineOptions): NodeJS.EventEmitter;
123121
} = require("readline");
@@ -333,62 +331,59 @@ namespace ts.server {
333331
this.logger.info(`Received response: ${JSON.stringify(response)}`);
334332
}
335333

336-
if (response.kind === EventInitializationFailed) {
337-
if (!this.eventSender) {
338-
return;
339-
}
340-
const body: protocol.TypesInstallerInitializationFailedEventBody = {
341-
message: response.message
342-
};
343-
const eventName: protocol.TypesInstallerInitializationFailedEventName = "typesInstallerInitializationFailed";
344-
this.eventSender.event(body, eventName);
345-
return;
346-
}
347-
348-
if (response.kind === EventBeginInstallTypes) {
349-
if (!this.eventSender) {
350-
return;
351-
}
352-
const body: protocol.BeginInstallTypesEventBody = {
353-
eventId: response.eventId,
354-
packages: response.packagesToInstall,
355-
};
356-
const eventName: protocol.BeginInstallTypesEventName = "beginInstallTypes";
357-
this.eventSender.event(body, eventName);
334+
switch (response.kind) {
335+
case EventInitializationFailed:
336+
if (this.eventSender) {
337+
const body: protocol.TypesInstallerInitializationFailedEventBody = {
338+
message: response.message
339+
};
340+
const eventName: protocol.TypesInstallerInitializationFailedEventName = "typesInstallerInitializationFailed";
341+
this.eventSender.event(body, eventName);
342+
}
343+
break;
358344

359-
return;
360-
}
345+
case EventBeginInstallTypes:
346+
if (this.eventSender) {
347+
const body: protocol.BeginInstallTypesEventBody = {
348+
eventId: response.eventId,
349+
packages: response.packagesToInstall,
350+
};
351+
const eventName: protocol.BeginInstallTypesEventName = "beginInstallTypes";
352+
this.eventSender.event(body, eventName);
353+
}
354+
break;
361355

362-
if (response.kind === EventEndInstallTypes) {
363-
if (!this.eventSender) {
364-
return;
365-
}
366-
if (this.telemetryEnabled) {
367-
const body: protocol.TypingsInstalledTelemetryEventBody = {
368-
telemetryEventName: "typingsInstalled",
369-
payload: {
370-
installedPackages: response.packagesToInstall.join(","),
371-
installSuccess: response.installSuccess,
372-
typingsInstallerVersion: response.typingsInstallerVersion
356+
case EventEndInstallTypes:
357+
debugger; //kill
358+
if (this.eventSender) {
359+
if (this.telemetryEnabled) {
360+
const body: protocol.TypingsInstalledTelemetryEventBody = {
361+
telemetryEventName: "typingsInstalled",
362+
payload: {
363+
installedPackages: response.packagesToInstall.join(","),
364+
installSuccess: response.installSuccess,
365+
typingsInstallerVersion: response.typingsInstallerVersion
366+
}
367+
};
368+
const eventName: protocol.TelemetryEventName = "telemetry";
369+
this.eventSender.event(body, eventName);
373370
}
374-
};
375-
const eventName: protocol.TelemetryEventName = "telemetry";
376-
this.eventSender.event(body, eventName);
377-
}
378371

379-
const body: protocol.EndInstallTypesEventBody = {
380-
eventId: response.eventId,
381-
packages: response.packagesToInstall,
382-
success: response.installSuccess,
383-
};
384-
const eventName: protocol.EndInstallTypesEventName = "endInstallTypes";
385-
this.eventSender.event(body, eventName);
386-
return;
387-
}
372+
const body: protocol.EndInstallTypesEventBody = {
373+
eventId: response.eventId,
374+
packages: response.packagesToInstall,
375+
success: response.installSuccess,
376+
};
377+
const eventName: protocol.EndInstallTypesEventName = "endInstallTypes";
378+
this.eventSender.event(body, eventName);
379+
}
380+
break;
388381

389-
this.projectService.updateTypingsForProject(response);
390-
if (response.kind === ActionSet && this.socket) {
391-
this.sendEvent(0, "setTypings", response);
382+
default:
383+
this.projectService.updateTypingsForProject(response);//uh, when does this happen?
384+
if (response.kind === ActionSet && this.socket) {
385+
this.sendEvent(0, "setTypings", response);
386+
}
392387
}
393388
}
394389
}

src/server/session.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,8 +340,15 @@ namespace ts.server {
340340

341341
private defaultEventHandler(event: ProjectServiceEvent) {
342342
switch (event.eventName) {
343+
case TypingsInstalledEvent: {
344+
const { project } = event.data;
345+
this.projectService.logger.info(`new typings installed, updating diagnostics`);
346+
const files = project.getFileNames(); //TODO: only open files
347+
this.errorCheck.startNew(next => this.getDiagnostics(next, /*delay*/ 0, files));
348+
break;
349+
}
343350
case ContextEvent:
344-
const { project, fileName } = event.data;
351+
const { project, fileName } = event.data;//!
345352
this.projectService.logger.info(`got context event, updating diagnostics for ${fileName}`);
346353
this.errorCheck.startNew(next => this.updateErrorCheck(next, [{ fileName, project }], this.changeSeq, (n) => n === this.changeSeq, 100));
347354
break;

src/server/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ declare namespace ts.server {
99
data: any;
1010
}
1111

12-
type RequireResult = { module: {}, error: undefined } | { module: undefined, error: {} };
12+
type RequireResult = { module: {}, error: undefined } | { module: undefined, error: { stack?: string } };
1313
export interface ServerHost extends System {
1414
setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): any;
1515
clearTimeout(timeoutId: any): void;

0 commit comments

Comments
 (0)