mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-04 21:53:42 -06:00
Propagate noDefaultLib comment into emitted declaration files (#23003)
This commit is contained in:
parent
d2d0f86831
commit
ea8904e33d
@ -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();
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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() {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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.
|
||||
*/
|
||||
|
||||
@ -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.
|
||||
*/
|
||||
|
||||
@ -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 {
|
||||
}
|
||||
@ -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))
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 {
|
||||
}
|
||||
@ -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))
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 {}
|
||||
@ -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 {}
|
||||
Loading…
x
Reference in New Issue
Block a user