Do not emit references in generated declaration files if the --noreso… · bxd602/TypeScript@acf557d · GitHub
Skip to content

Commit acf557d

Browse files
committed
Do not emit references in generated declaration files if the --noresolve flag was set. This fixes a crash in the compiler when generating declarations with /// reference and noResolve
1 parent 4381f72 commit acf557d

5 files changed

Lines changed: 173 additions & 27 deletions

File tree

Lines changed: 124 additions & 0 deletions

src/compiler/emitter.ts

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3079,10 +3079,8 @@ module ts {
30793079
}
30803080
}
30813081

3082-
function resolveScriptReference(sourceFile: SourceFile, reference: FileReference) {
3083-
var referenceFileName = compilerOptions.noResolve
3084-
? reference.filename
3085-
: normalizePath(combinePaths(getDirectoryPath(sourceFile.filename), reference.filename));
3082+
function tryResolveScriptReference(sourceFile: SourceFile, reference: FileReference) {
3083+
var referenceFileName = normalizePath(combinePaths(getDirectoryPath(sourceFile.filename), reference.filename));
30863084
return program.getSourceFile(referenceFileName);
30873085
}
30883086

@@ -3108,21 +3106,23 @@ module ts {
31083106

31093107
if (root) {
31103108
// Emiting single file so emit references in this file only
3111-
var addedGlobalFileReference = false;
3112-
forEach(root.referencedFiles, fileReference => {
3113-
var referencedFile = resolveScriptReference(root, fileReference);
3114-
3115-
// All the references that are not going to be part of same file
3116-
if ((referencedFile.flags & NodeFlags.DeclarationFile) || // This is a declare file reference
3117-
shouldEmitToOwnFile(referencedFile) || // This is referenced file is emitting its own js file
3118-
!addedGlobalFileReference) { // Or the global out file corresponding to this reference was not added
3119-
3120-
writeReferencePath(referencedFile);
3121-
if (!isExternalModuleOrDeclarationFile(referencedFile)) {
3122-
addedGlobalFileReference = true;
3109+
if (!compilerOptions.noResolve) {
3110+
var addedGlobalFileReference = false;
3111+
forEach(root.referencedFiles, fileReference => {
3112+
var referencedFile = tryResolveScriptReference(root, fileReference);
3113+
3114+
// All the references that are not going to be part of same file
3115+
if (referencedFile && (referencedFile.flags & NodeFlags.DeclarationFile) || // This is a declare file reference
3116+
shouldEmitToOwnFile(referencedFile) || // This is referenced file is emitting its own js file
3117+
!addedGlobalFileReference) { // Or the global out file corresponding to this reference was not added
3118+
3119+
writeReferencePath(referencedFile);
3120+
if (!isExternalModuleOrDeclarationFile(referencedFile)) {
3121+
addedGlobalFileReference = true;
3122+
}
31233123
}
3124-
}
3125-
});
3124+
});
3125+
}
31263126

31273127
emitNode(root);
31283128
}
@@ -3132,17 +3132,19 @@ module ts {
31323132
forEach(program.getSourceFiles(), sourceFile => {
31333133
if (!isExternalModuleOrDeclarationFile(sourceFile)) {
31343134
// Check what references need to be added
3135-
forEach(sourceFile.referencedFiles, fileReference => {
3136-
var referencedFile = resolveScriptReference(sourceFile, fileReference);
3135+
if (!compilerOptions.noResolve) {
3136+
forEach(sourceFile.referencedFiles, fileReference => {
3137+
var referencedFile = tryResolveScriptReference(sourceFile, fileReference);
31373138

3138-
// If the reference file is declaration file or external module emit that reference
3139-
if (isExternalModuleOrDeclarationFile(referencedFile) &&
3140-
!contains(emittedReferencedFiles, referencedFile)) { // If the file refernece was not already emitted
3139+
// If the reference file is declaration file or external module emit that reference
3140+
if (referencedFile && isExternalModuleOrDeclarationFile(referencedFile) &&
3141+
!contains(emittedReferencedFiles, referencedFile)) { // If the file refernece was not already emitted
31413142

3142-
writeReferencePath(referencedFile);
3143-
emittedReferencedFiles.push(referencedFile);
3144-
}
3145-
});
3143+
writeReferencePath(referencedFile);
3144+
emittedReferencedFiles.push(referencedFile);
3145+
}
3146+
});
3147+
}
31463148

31473149
emitNode(sourceFile);
31483150
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//// [declarationEmit_invalidReference.ts]
2+
/// <reference path="invalid.ts" />
3+
var x = 0;
4+
5+
//// [declarationEmit_invalidReference.js]
6+
/// <reference path="invalid.ts" />
7+
var x = 0;
8+
9+
10+
//// [declarationEmit_invalidReference.d.ts]
11+
declare var x: number;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
=== tests/cases/compiler/declarationEmit_invalidReference.ts ===
2+
/// <reference path="invalid.ts" />
3+
var x = 0;
4+
>x : number
5+
Lines changed: 4 additions & 0 deletions

0 commit comments

Comments
 (0)