Skip to content

Commit 0388f07

Browse files
committed
Improve null handling
1 parent a12e29e commit 0388f07

File tree

1 file changed

+27
-22
lines changed

1 file changed

+27
-22
lines changed

src/server/session.ts

+27-22
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,7 @@ namespace ts.server {
412412
let progress = false;
413413
perProjectResults.forEach((referencedSymbols, project) => {
414414
if (updatedProjects.has(project)) return;
415+
if (!referencedSymbols) return;
415416
const updated = project.getLanguageService().updateIsDefinitionOfReferencedSymbols(referencedSymbols, knownSymbolSpans);
416417
if (updated) {
417418
updatedProjects.add(project);
@@ -423,6 +424,7 @@ namespace ts.server {
423424

424425
perProjectResults.forEach((referencedSymbols, project) => {
425426
if (updatedProjects.has(project)) return;
427+
if (!referencedSymbols) return;
426428
for (const referencedSymbol of referencedSymbols) {
427429
for (const ref of referencedSymbol.references) {
428430
ref.isDefinition = false;
@@ -441,27 +443,29 @@ namespace ts.server {
441443
// Otherwise, it just ends up attached to the first corresponding def we happen to process. The others may or may not be
442444
// dropped later when we check for defs with ref-count 0.
443445
perProjectResults.forEach((projectResults, project) => {
444-
for (const referencedSymbol of projectResults) {
445-
const mappedDefinitionFile = getMappedLocationForProject(documentSpanLocation(referencedSymbol.definition), project);
446-
const definition: ReferencedSymbolDefinitionInfo = mappedDefinitionFile === undefined ?
447-
referencedSymbol.definition :
448-
{
449-
...referencedSymbol.definition,
450-
textSpan: createTextSpan(mappedDefinitionFile.pos, referencedSymbol.definition.textSpan.length), // Why would the length be the same in the original?
451-
fileName: mappedDefinitionFile.fileName,
452-
contextSpan: getMappedContextSpanForProject(referencedSymbol.definition, project)
453-
};
446+
if (projectResults) {
447+
for (const referencedSymbol of projectResults) {
448+
const mappedDefinitionFile = getMappedLocationForProject(documentSpanLocation(referencedSymbol.definition), project);
449+
const definition: ReferencedSymbolDefinitionInfo = mappedDefinitionFile === undefined ?
450+
referencedSymbol.definition :
451+
{
452+
...referencedSymbol.definition,
453+
textSpan: createTextSpan(mappedDefinitionFile.pos, referencedSymbol.definition.textSpan.length), // Why would the length be the same in the original?
454+
fileName: mappedDefinitionFile.fileName,
455+
contextSpan: getMappedContextSpanForProject(referencedSymbol.definition, project)
456+
};
454457

455-
let symbolToAddTo = find(results, o => documentSpansEqual(o.definition, definition));
456-
if (!symbolToAddTo) {
457-
symbolToAddTo = { definition, references: [] };
458-
results.push(symbolToAddTo);
459-
}
458+
let symbolToAddTo = find(results, o => documentSpansEqual(o.definition, definition));
459+
if (!symbolToAddTo) {
460+
symbolToAddTo = { definition, references: [] };
461+
results.push(symbolToAddTo);
462+
}
460463

461-
for (const ref of referencedSymbol.references) {
462-
if (!seenRefs.has(ref) && !getMappedLocationForProject(documentSpanLocation(ref), project)) {
463-
seenRefs.add(ref);
464-
symbolToAddTo.references.push(ref);
464+
for (const ref of referencedSymbol.references) {
465+
if (!seenRefs.has(ref) && !getMappedLocationForProject(documentSpanLocation(ref), project)) {
466+
seenRefs.add(ref);
467+
symbolToAddTo.references.push(ref);
468+
}
465469
}
466470
}
467471
}
@@ -504,9 +508,9 @@ namespace ts.server {
504508
isForRename: boolean,
505509
getResultsForPosition: (project: Project, location: DocumentPosition) => readonly TResult[] | undefined,
506510
forPositionInResult: (result: TResult, cb: (location: DocumentPosition) => void) => void,
507-
): readonly TResult[] | ESMap<Project, readonly TResult[]> {
511+
): readonly TResult[] | ESMap<Project, undefined | readonly TResult[]> {
508512
// If `getResultsForPosition` returns results for a project, they go in here
509-
const resultsMap = new Map<Project, readonly TResult[]>();
513+
const resultsMap = new Map<Project, undefined | readonly TResult[]>();
510514

511515
const queue: ProjectAndLocation[] = [];
512516

@@ -588,7 +592,8 @@ namespace ts.server {
588592
// it easier for the caller to skip post-processing.
589593
if (resultsMap.size === 1) {
590594
const it = resultsMap.values().next();
591-
return it.done ? emptyArray : it.value; // There may not be any results at all
595+
Debug.assert(!it.done);
596+
return it.value ?? emptyArray;
592597
}
593598

594599
return resultsMap;

0 commit comments

Comments
 (0)