Skip to content

Commit 8ab5be9

Browse files
authored
Add hook for adding transforms into the declaration emit pipeline after the main one (microsoft#23946)
* Add hook for adding transforms into the declaration emit pipeline after the main one * Fix lint
1 parent ddf20ec commit 8ab5be9

File tree

7 files changed

+38
-9
lines changed

7 files changed

+38
-9
lines changed

src/compiler/emitter.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ namespace ts {
9595

9696
/*@internal*/
9797
// targetSourceFile is when users only want one file in entire project to be emitted. This is used in compileOnSave feature
98-
export function emitFiles(resolver: EmitResolver, host: EmitHost, targetSourceFile: SourceFile, emitOnlyDtsFiles?: boolean, transformers?: TransformerFactory<SourceFile | Bundle>[]): EmitResult {
98+
export function emitFiles(resolver: EmitResolver, host: EmitHost, targetSourceFile: SourceFile, emitOnlyDtsFiles?: boolean, transformers?: TransformerFactory<Bundle | SourceFile>[], declarationTransformers?: TransformerFactory<Bundle | SourceFile>[]): EmitResult {
9999
const compilerOptions = host.getCompilerOptions();
100100
const sourceMapDataList: SourceMapData[] = (compilerOptions.sourceMap || compilerOptions.inlineSourceMap || getAreDeclarationMapsEnabled(compilerOptions)) ? [] : undefined;
101101
const emittedFilesList: string[] = compilerOptions.listEmittedFiles ? [] : undefined;
@@ -192,7 +192,7 @@ namespace ts {
192192
// Setup and perform the transformation to retrieve declarations from the input files
193193
const nonJsFiles = filter(sourceFiles, isSourceFileNotJavaScript);
194194
const inputListOrBundle = (compilerOptions.outFile || compilerOptions.out) ? [createBundle(nonJsFiles, !isSourceFile(sourceFileOrBundle) ? sourceFileOrBundle.prepends : undefined)] : nonJsFiles;
195-
const declarationTransform = transformNodes(resolver, host, compilerOptions, inputListOrBundle, [transformDeclarations], /*allowDtsFiles*/ false);
195+
const declarationTransform = transformNodes(resolver, host, compilerOptions, inputListOrBundle, concatenate([transformDeclarations], declarationTransformers), /*allowDtsFiles*/ false);
196196
if (length(declarationTransform.diagnostics)) {
197197
for (const diagnostic of declarationTransform.diagnostics) {
198198
emitterDiagnostics.add(diagnostic);

src/compiler/program.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1296,7 +1296,9 @@ namespace ts {
12961296
getEmitHost(writeFileCallback),
12971297
sourceFile,
12981298
emitOnlyDtsFiles,
1299-
transformers);
1299+
transformers,
1300+
customTransformers && customTransformers.afterDeclarations
1301+
);
13001302

13011303
performance.mark("afterEmit");
13021304
performance.measure("Emit", "beforeEmit", "afterEmit");

src/compiler/types.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2788,10 +2788,12 @@ namespace ts {
27882788
}
27892789

27902790
export interface CustomTransformers {
2791-
/** Custom transformers to evaluate before built-in transformations. */
2791+
/** Custom transformers to evaluate before built-in .js transformations. */
27922792
before?: TransformerFactory<SourceFile>[];
2793-
/** Custom transformers to evaluate after built-in transformations. */
2793+
/** Custom transformers to evaluate after built-in .js transformations. */
27942794
after?: TransformerFactory<SourceFile>[];
2795+
/** Custom transformers to evaluate after built-in .d.ts transformations. */
2796+
afterDeclarations?: TransformerFactory<Bundle | SourceFile>[];
27952797
}
27962798

27972799
export interface SourceMapSpan {

src/harness/unittests/transform.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,26 @@ namespace ts {
250250
}
251251
}
252252
});
253+
254+
testBaseline("transformDeclarationFile", () => {
255+
return baselineDeclarationTransform(`var oldName = undefined;`, {
256+
transformers: {
257+
afterDeclarations: [replaceIdentifiersNamedOldNameWithNewName]
258+
},
259+
compilerOptions: {
260+
newLine: NewLineKind.CarriageReturnLineFeed,
261+
declaration: true
262+
}
263+
});
264+
});
265+
266+
function baselineDeclarationTransform(text: string, opts: TranspileOptions) {
267+
const fs = vfs.createFromFileSystem(Harness.IO, /*caseSensitive*/ true, { documents: [new documents.TextDocument("/.src/index.ts", text)] });
268+
const host = new fakes.CompilerHost(fs, opts.compilerOptions);
269+
const program = createProgram(["/.src/index.ts"], opts.compilerOptions, host);
270+
program.emit(program.getSourceFiles()[1], (p, s, bom) => host.writeFile(p, s, bom), /*cancellationToken*/ undefined, /*onlyDts*/ true, opts.transformers);
271+
return fs.readFileSync("/.src/index.d.ts").toString();
272+
}
253273
});
254274
}
255275

tests/baselines/reference/api/tsserverlibrary.d.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1735,10 +1735,12 @@ declare namespace ts {
17351735
sourceFile: SourceFile;
17361736
}
17371737
interface CustomTransformers {
1738-
/** Custom transformers to evaluate before built-in transformations. */
1738+
/** Custom transformers to evaluate before built-in .js transformations. */
17391739
before?: TransformerFactory<SourceFile>[];
1740-
/** Custom transformers to evaluate after built-in transformations. */
1740+
/** Custom transformers to evaluate after built-in .js transformations. */
17411741
after?: TransformerFactory<SourceFile>[];
1742+
/** Custom transformers to evaluate after built-in .d.ts transformations. */
1743+
afterDeclarations?: TransformerFactory<Bundle | SourceFile>[];
17421744
}
17431745
interface SourceMapSpan {
17441746
/** Line number in the .js file. */

tests/baselines/reference/api/typescript.d.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1735,10 +1735,12 @@ declare namespace ts {
17351735
sourceFile: SourceFile;
17361736
}
17371737
interface CustomTransformers {
1738-
/** Custom transformers to evaluate before built-in transformations. */
1738+
/** Custom transformers to evaluate before built-in .js transformations. */
17391739
before?: TransformerFactory<SourceFile>[];
1740-
/** Custom transformers to evaluate after built-in transformations. */
1740+
/** Custom transformers to evaluate after built-in .js transformations. */
17411741
after?: TransformerFactory<SourceFile>[];
1742+
/** Custom transformers to evaluate after built-in .d.ts transformations. */
1743+
afterDeclarations?: TransformerFactory<Bundle | SourceFile>[];
17421744
}
17431745
interface SourceMapSpan {
17441746
/** Line number in the .js file. */
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
declare var newName: any;

0 commit comments

Comments
 (0)