Propagate noDefaultLib comment into emitted declaration files (#23003)

This commit is contained in:
Wesley Wigham 2018-03-29 15:38:29 -07:00 committed by GitHub
parent d2d0f86831
commit ea8904e33d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 276 additions and 11 deletions

View File

@ -2473,14 +2473,18 @@ namespace ts {
}
function emitSyntheticTripleSlashReferencesIfNeeded(node: Bundle) {
emitTripleSlashDirectives(node.syntheticFileReferences || [], node.syntheticTypeReferences || []);
emitTripleSlashDirectives(node.hasNoDefaultLib, node.syntheticFileReferences || [], node.syntheticTypeReferences || []);
}
function emitTripleSlashDirectivesIfNeeded(node: SourceFile) {
if (node.isDeclarationFile) emitTripleSlashDirectives(node.referencedFiles, node.typeReferenceDirectives);
if (node.isDeclarationFile) emitTripleSlashDirectives(node.hasNoDefaultLib, node.referencedFiles, node.typeReferenceDirectives);
}
function emitTripleSlashDirectives(files: ReadonlyArray<FileReference>, types: ReadonlyArray<FileReference>) {
function emitTripleSlashDirectives(hasNoDefaultLib: boolean, files: ReadonlyArray<FileReference>, types: ReadonlyArray<FileReference>) {
if (hasNoDefaultLib) {
write(`/// <reference no-default-lib="true"/>`);
writeLine();
}
if (currentSourceFile && currentSourceFile.moduleName) {
write(`/// <amd-module name="${currentSourceFile.moduleName}" />`);
writeLine();

View File

@ -2387,12 +2387,13 @@ namespace ts {
// Top-level nodes
export function updateSourceFileNode(node: SourceFile, statements: ReadonlyArray<Statement>, isDeclarationFile?: boolean, referencedFiles?: SourceFile["referencedFiles"], typeReferences?: SourceFile["typeReferenceDirectives"]) {
export function updateSourceFileNode(node: SourceFile, statements: ReadonlyArray<Statement>, isDeclarationFile?: boolean, referencedFiles?: SourceFile["referencedFiles"], typeReferences?: SourceFile["typeReferenceDirectives"], hasNoDefaultLib?: boolean) {
if (
node.statements !== statements ||
(isDeclarationFile !== undefined && node.isDeclarationFile !== isDeclarationFile) ||
(referencedFiles !== undefined && node.referencedFiles !== referencedFiles) ||
(typeReferences !== undefined && node.typeReferenceDirectives !== typeReferences)
(typeReferences !== undefined && node.typeReferenceDirectives !== typeReferences) ||
(hasNoDefaultLib !== undefined && node.hasNoDefaultLib !== hasNoDefaultLib)
) {
const updated = <SourceFile>createSynthesizedNode(SyntaxKind.SourceFile);
updated.flags |= node.flags;
@ -2404,11 +2405,11 @@ namespace ts {
updated.isDeclarationFile = isDeclarationFile === undefined ? node.isDeclarationFile : isDeclarationFile;
updated.referencedFiles = referencedFiles === undefined ? node.referencedFiles : referencedFiles;
updated.typeReferenceDirectives = typeReferences === undefined ? node.typeReferenceDirectives : typeReferences;
updated.hasNoDefaultLib = hasNoDefaultLib === undefined ? node.hasNoDefaultLib : hasNoDefaultLib;
if (node.amdDependencies !== undefined) updated.amdDependencies = node.amdDependencies;
if (node.moduleName !== undefined) updated.moduleName = node.moduleName;
if (node.languageVariant !== undefined) updated.languageVariant = node.languageVariant;
if (node.renamedDependencies !== undefined) updated.renamedDependencies = node.renamedDependencies;
if (node.hasNoDefaultLib !== undefined) updated.hasNoDefaultLib = node.hasNoDefaultLib;
if (node.languageVersion !== undefined) updated.languageVersion = node.languageVersion;
if (node.scriptKind !== undefined) updated.scriptKind = node.scriptKind;
if (node.externalModuleIndicator !== undefined) updated.externalModuleIndicator = node.externalModuleIndicator;

View File

@ -135,9 +135,11 @@ namespace ts {
if (node.kind === SyntaxKind.Bundle) {
isBundledEmit = true;
const refs = createMap<SourceFile>();
let hasNoDefaultLib = false;
const bundle = createBundle(map(node.sourceFiles,
sourceFile => {
if (sourceFile.isDeclarationFile || isSourceFileJavaScript(sourceFile)) return; // Omit declaration files from bundle results, too
hasNoDefaultLib = hasNoDefaultLib || sourceFile.hasNoDefaultLib;
currentSourceFile = sourceFile;
enclosingDeclaration = sourceFile;
possibleImports = undefined;
@ -154,16 +156,17 @@ namespace ts {
[createModifier(SyntaxKind.DeclareKeyword)],
createLiteral(getResolvedExternalModuleName(context.getEmitHost(), sourceFile)),
createModuleBlock(setTextRange(createNodeArray(filterCandidateImports(statements)), sourceFile.statements))
)], /*isDeclarationFile*/ true, /*referencedFiles*/ [], /*typeReferences*/ []);
)], /*isDeclarationFile*/ true, /*referencedFiles*/ [], /*typeReferences*/ [], /*hasNoDefaultLib*/ false);
return newFile;
}
needsDeclare = true;
const updated = visitNodes(sourceFile.statements, visitDeclarationStatements);
return updateSourceFileNode(sourceFile, updated, /*isDeclarationFile*/ true, /*referencedFiles*/ [], /*typeReferences*/ []);
return updateSourceFileNode(sourceFile, updated, /*isDeclarationFile*/ true, /*referencedFiles*/ [], /*typeReferences*/ [], /*hasNoDefaultLib*/ false);
}
));
bundle.syntheticFileReferences = [];
bundle.syntheticTypeReferences = getFileReferencesForUsedTypeReferences();
bundle.hasNoDefaultLib = hasNoDefaultLib;
const outputFilePath = getDirectoryPath(normalizeSlashes(getOutputPathsFor(node, host, /*forceDtsPaths*/ true).declarationFilePath));
const referenceVisitor = mapReferencesIntoArray(bundle.syntheticFileReferences as FileReference[], outputFilePath);
refs.forEach(referenceVisitor);
@ -191,7 +194,7 @@ namespace ts {
if (isExternalModule(node) && !resultHasExternalModuleIndicator) {
combinedStatements = setTextRange(createNodeArray([...combinedStatements, createExportDeclaration(/*decorators*/ undefined, /*modifiers*/ undefined, createNamedExports([]), /*moduleSpecifier*/ undefined)]), combinedStatements);
}
const updated = updateSourceFileNode(node, combinedStatements, /*isDeclarationFile*/ true, references, getFileReferencesForUsedTypeReferences());
const updated = updateSourceFileNode(node, combinedStatements, /*isDeclarationFile*/ true, references, getFileReferencesForUsedTypeReferences(), node.hasNoDefaultLib);
return updated;
function getFileReferencesForUsedTypeReferences() {

View File

@ -2590,6 +2590,7 @@ namespace ts {
sourceFiles: ReadonlyArray<SourceFile>;
/* @internal */ syntheticFileReferences?: ReadonlyArray<FileReference>;
/* @internal */ syntheticTypeReferences?: ReadonlyArray<FileReference>;
/* @internal */ hasNoDefaultLib?: boolean;
}
export interface JsonSourceFile extends SourceFile {

View File

@ -3714,7 +3714,7 @@ declare namespace ts {
function updateSpreadAssignment(node: SpreadAssignment, expression: Expression): SpreadAssignment;
function createEnumMember(name: string | PropertyName, initializer?: Expression): EnumMember;
function updateEnumMember(node: EnumMember, name: PropertyName, initializer: Expression | undefined): EnumMember;
function updateSourceFileNode(node: SourceFile, statements: ReadonlyArray<Statement>, isDeclarationFile?: boolean, referencedFiles?: SourceFile["referencedFiles"], typeReferences?: SourceFile["typeReferenceDirectives"]): SourceFile;
function updateSourceFileNode(node: SourceFile, statements: ReadonlyArray<Statement>, isDeclarationFile?: boolean, referencedFiles?: SourceFile["referencedFiles"], typeReferences?: SourceFile["typeReferenceDirectives"], hasNoDefaultLib?: boolean): SourceFile;
/**
* Creates a shallow, memberwise clone of a node for mutation.
*/

View File

@ -3661,7 +3661,7 @@ declare namespace ts {
function updateSpreadAssignment(node: SpreadAssignment, expression: Expression): SpreadAssignment;
function createEnumMember(name: string | PropertyName, initializer?: Expression): EnumMember;
function updateEnumMember(node: EnumMember, name: PropertyName, initializer: Expression | undefined): EnumMember;
function updateSourceFileNode(node: SourceFile, statements: ReadonlyArray<Statement>, isDeclarationFile?: boolean, referencedFiles?: SourceFile["referencedFiles"], typeReferences?: SourceFile["typeReferenceDirectives"]): SourceFile;
function updateSourceFileNode(node: SourceFile, statements: ReadonlyArray<Statement>, isDeclarationFile?: boolean, referencedFiles?: SourceFile["referencedFiles"], typeReferences?: SourceFile["typeReferenceDirectives"], hasNoDefaultLib?: boolean): SourceFile;
/**
* Creates a shallow, memberwise clone of a node for mutation.
*/

View File

@ -0,0 +1,48 @@
//// [tests/cases/compiler/declarationEmitBundlePreservesHasNoDefaultLibDirective.ts] ////
//// [extensions.ts]
/// <reference no-default-lib="true"/>
class Foo {
public: string;
}
//// [core.ts]
interface Array<T> {}
interface Boolean {}
interface Function {}
interface IArguments {}
interface Number {}
interface Object {}
interface RegExp {}
interface String {}
//// [mylib.js]
/// <reference no-default-lib="true"/>
var Foo = /** @class */ (function () {
function Foo() {
}
return Foo;
}());
//// [mylib.d.ts]
/// <reference no-default-lib="true"/>
declare class Foo {
public: string;
}
interface Array<T> {
}
interface Boolean {
}
interface Function {
}
interface IArguments {
}
interface Number {
}
interface Object {
}
interface RegExp {
}
interface String {
}

View File

@ -0,0 +1,34 @@
=== tests/cases/compiler/extensions.ts ===
/// <reference no-default-lib="true"/>
class Foo {
>Foo : Symbol(Foo, Decl(extensions.ts, 0, 0))
public: string;
>public : Symbol(Foo.public, Decl(extensions.ts, 1, 11))
}
=== tests/cases/compiler/core.ts ===
interface Array<T> {}
>Array : Symbol(Array, Decl(core.ts, 0, 0))
>T : Symbol(T, Decl(core.ts, 0, 16))
interface Boolean {}
>Boolean : Symbol(Boolean, Decl(core.ts, 0, 21))
interface Function {}
>Function : Symbol(Function, Decl(core.ts, 1, 20))
interface IArguments {}
>IArguments : Symbol(IArguments, Decl(core.ts, 2, 21))
interface Number {}
>Number : Symbol(Number, Decl(core.ts, 3, 23))
interface Object {}
>Object : Symbol(Object, Decl(core.ts, 4, 19))
interface RegExp {}
>RegExp : Symbol(RegExp, Decl(core.ts, 5, 19))
interface String {}
>String : Symbol(String, Decl(core.ts, 6, 19))

View File

@ -0,0 +1,34 @@
=== tests/cases/compiler/extensions.ts ===
/// <reference no-default-lib="true"/>
class Foo {
>Foo : Foo
public: string;
>public : string
}
=== tests/cases/compiler/core.ts ===
interface Array<T> {}
>Array : T[]
>T : T
interface Boolean {}
>Boolean : Boolean
interface Function {}
>Function : Function
interface IArguments {}
>IArguments : IArguments
interface Number {}
>Number : Number
interface Object {}
>Object : Object
interface RegExp {}
>RegExp : RegExp
interface String {}
>String : String

View File

@ -0,0 +1,45 @@
//// [declarationEmitPreservesHasNoDefaultLibDirective.ts]
/// <reference no-default-lib="true"/>
class Foo {
public: string;
}
interface Array<T> {}
interface Boolean {}
interface Function {}
interface IArguments {}
interface Number {}
interface Object {}
interface RegExp {}
interface String {}
//// [declarationEmitPreservesHasNoDefaultLibDirective.js]
/// <reference no-default-lib="true"/>
var Foo = /** @class */ (function () {
function Foo() {
}
return Foo;
}());
//// [declarationEmitPreservesHasNoDefaultLibDirective.d.ts]
/// <reference no-default-lib="true"/>
declare class Foo {
public: string;
}
interface Array<T> {
}
interface Boolean {
}
interface Function {
}
interface IArguments {
}
interface Number {
}
interface Object {
}
interface RegExp {
}
interface String {
}

View File

@ -0,0 +1,33 @@
=== tests/cases/compiler/declarationEmitPreservesHasNoDefaultLibDirective.ts ===
/// <reference no-default-lib="true"/>
class Foo {
>Foo : Symbol(Foo, Decl(declarationEmitPreservesHasNoDefaultLibDirective.ts, 0, 0))
public: string;
>public : Symbol(Foo.public, Decl(declarationEmitPreservesHasNoDefaultLibDirective.ts, 1, 11))
}
interface Array<T> {}
>Array : Symbol(Array, Decl(declarationEmitPreservesHasNoDefaultLibDirective.ts, 3, 1))
>T : Symbol(T, Decl(declarationEmitPreservesHasNoDefaultLibDirective.ts, 4, 16))
interface Boolean {}
>Boolean : Symbol(Boolean, Decl(declarationEmitPreservesHasNoDefaultLibDirective.ts, 4, 21))
interface Function {}
>Function : Symbol(Function, Decl(declarationEmitPreservesHasNoDefaultLibDirective.ts, 5, 20))
interface IArguments {}
>IArguments : Symbol(IArguments, Decl(declarationEmitPreservesHasNoDefaultLibDirective.ts, 6, 21))
interface Number {}
>Number : Symbol(Number, Decl(declarationEmitPreservesHasNoDefaultLibDirective.ts, 7, 23))
interface Object {}
>Object : Symbol(Object, Decl(declarationEmitPreservesHasNoDefaultLibDirective.ts, 8, 19))
interface RegExp {}
>RegExp : Symbol(RegExp, Decl(declarationEmitPreservesHasNoDefaultLibDirective.ts, 9, 19))
interface String {}
>String : Symbol(String, Decl(declarationEmitPreservesHasNoDefaultLibDirective.ts, 10, 19))

View File

@ -0,0 +1,33 @@
=== tests/cases/compiler/declarationEmitPreservesHasNoDefaultLibDirective.ts ===
/// <reference no-default-lib="true"/>
class Foo {
>Foo : Foo
public: string;
>public : string
}
interface Array<T> {}
>Array : T[]
>T : T
interface Boolean {}
>Boolean : Boolean
interface Function {}
>Function : Function
interface IArguments {}
>IArguments : IArguments
interface Number {}
>Number : Number
interface Object {}
>Object : Object
interface RegExp {}
>RegExp : RegExp
interface String {}
>String : String

View File

@ -0,0 +1,16 @@
// @declaration: true
// @outFile: mylib.js
// @filename: extensions.ts
/// <reference no-default-lib="true"/>
class Foo {
public: string;
}
// @filename: core.ts
interface Array<T> {}
interface Boolean {}
interface Function {}
interface IArguments {}
interface Number {}
interface Object {}
interface RegExp {}
interface String {}

View File

@ -0,0 +1,13 @@
// @declaration: true
/// <reference no-default-lib="true"/>
class Foo {
public: string;
}
interface Array<T> {}
interface Boolean {}
interface Function {}
interface IArguments {}
interface Number {}
interface Object {}
interface RegExp {}
interface String {}