@@ -23,6 +23,7 @@ import {
23
23
ConstructorTypeNode ,
24
24
ConstructSignatureDeclaration ,
25
25
contains ,
26
+ CoreEmitResolver ,
26
27
createDiagnosticForNode ,
27
28
createDiagnosticForRange ,
28
29
createEmptyExports ,
@@ -46,7 +47,6 @@ import {
46
47
EnumDeclaration ,
47
48
ExportAssignment ,
48
49
ExportDeclaration ,
49
- Expression ,
50
50
ExpressionWithTypeArguments ,
51
51
factory ,
52
52
FileReference ,
@@ -139,7 +139,7 @@ import {
139
139
isMethodSignature ,
140
140
isModifier ,
141
141
isModuleDeclaration ,
142
- IsolatedEmitResolver ,
142
+ IsolatedTransformationContext ,
143
143
isOmittedExpression ,
144
144
isPrivateIdentifier ,
145
145
isPropertySignature ,
@@ -167,7 +167,6 @@ import {
167
167
LateBoundDeclaration ,
168
168
LateVisibilityPaintedStatement ,
169
169
length ,
170
- LocalInferenceResolver ,
171
170
map ,
172
171
mapDefined ,
173
172
MethodDeclaration ,
@@ -293,7 +292,7 @@ const declarationEmitNodeBuilderFlags = NodeBuilderFlags.MultilineObjectLiterals
293
292
*
294
293
* @internal
295
294
*/
296
- export function transformDeclarations ( context : TransformationContext , _useTscEmit = true ) {
295
+ export function transformDeclarations ( context : ( TransformationContext & { useLocalInferenceTypePrint ?: false ; } ) | IsolatedTransformationContext ) {
297
296
const throwDiagnostic = ( ) => Debug . fail ( "Diagnostic emitted without context" ) ;
298
297
let getSymbolAccessibilityDiagnostic : GetSymbolAccessibilityDiagnostic = throwDiagnostic ;
299
298
let needsDeclare = true ;
@@ -318,108 +317,80 @@ export function transformDeclarations(context: TransformationContext, _useTscEmi
318
317
let refs : Map < NodeId , SourceFile > ;
319
318
let libs : Map < string , boolean > ;
320
319
let emittedImports : readonly AnyImportSyntax [ ] | undefined ; // must be declared in container so it can be `undefined` while transformer's first pass
321
- const { localInferenceResolver, isolatedDeclarations, host, resolver, symbolTracker, ensureNoInitializer, useTscEmit } = createTransformerServices ( ) ;
320
+ const { localInferenceResolver, isolatedDeclarations, host, resolver, symbolTracker, ensureNoInitializer, useLocalInferenceTypePrint } = createTransformerServices ( ) ;
322
321
const options = context . getCompilerOptions ( ) ;
323
322
const { noResolve, stripInternal } = options ;
324
323
return transformRoot ;
325
324
326
- function createTransformerServices ( ) : {
327
- isolatedDeclarations : true ;
328
- useTscEmit : false ;
329
- resolver : IsolatedEmitResolver ;
330
- localInferenceResolver : LocalInferenceResolver ;
331
- host : undefined ;
332
- symbolTracker : undefined ;
333
- ensureNoInitializer : ( node : CanHaveLiteralInitializer ) => Expression | undefined ;
334
- } | {
335
- isolatedDeclarations : true ;
336
- useTscEmit : true ;
337
- resolver : EmitResolver ;
338
- localInferenceResolver : LocalInferenceResolver ;
339
- host : EmitHost ;
340
- symbolTracker : SymbolTracker ;
341
- ensureNoInitializer : ( node : CanHaveLiteralInitializer ) => Expression | undefined ;
342
- } | {
343
- isolatedDeclarations : false ;
344
- useTscEmit : false ;
345
- resolver : EmitResolver ;
346
- localInferenceResolver : undefined ;
347
- host : EmitHost ;
348
- symbolTracker : SymbolTracker ;
349
- ensureNoInitializer : ( node : CanHaveLiteralInitializer ) => Expression | undefined ;
350
- } {
351
- const { isolatedDeclarations, resolver : localInferenceResolver } = createLocalInferenceResolver ( {
352
- ensureParameter,
353
- context,
354
- visitDeclarationSubtree,
355
- setEnclosingDeclarations ( node ) {
356
- const oldNode = enclosingDeclaration ;
357
- enclosingDeclaration = node ;
358
- return oldNode ;
359
- } ,
360
- checkEntityNameVisibility ( name , container ) {
361
- return checkEntityNameVisibility ( name , container ?? enclosingDeclaration ) ;
362
- } ,
363
- } ) ;
325
+ function createTransformerServices ( ) {
326
+ const isolatedDeclarations = context . getCompilerOptions ( ) . isolatedDeclarations ;
364
327
365
328
if ( isolatedDeclarations ) {
366
- if ( ! _useTscEmit ) {
367
- const resolver : IsolatedEmitResolver = context . getEmitResolver ( ) ;
329
+ const localInferenceResolver = createLocalInferenceResolver ( {
330
+ ensureParameter,
331
+ context,
332
+ visitDeclarationSubtree,
333
+ setEnclosingDeclarations ( node ) {
334
+ const oldNode = enclosingDeclaration ;
335
+ enclosingDeclaration = node ;
336
+ return oldNode ;
337
+ } ,
338
+ checkEntityNameVisibility ( name , container ) {
339
+ return checkEntityNameVisibility ( name , container ?? enclosingDeclaration ) ;
340
+ } ,
341
+ } ) ;
342
+ if ( context . useLocalInferenceTypePrint ) {
343
+ const resolver : CoreEmitResolver = context . getEmitResolver ( ) ;
368
344
// Ideally nothing should require the symbol tracker in isolated declarations mode.
369
345
// createLiteralConstValue is the one exception
370
346
const emptySymbolTracker = { } ;
371
347
return {
372
348
isolatedDeclarations,
373
- useTscEmit : false ,
349
+ useLocalInferenceTypePrint : true ,
374
350
resolver,
375
351
localInferenceResolver,
376
352
symbolTracker : undefined ,
377
353
host : undefined ,
378
- ensureNoInitializer : ( node : CanHaveLiteralInitializer ) => {
379
- if ( shouldPrintWithInitializer ( node ) ) {
380
- return resolver . createLiteralConstValue ( getParseTreeNode ( node ) as CanHaveLiteralInitializer , emptySymbolTracker ) ; // TODO: Make safe
381
- }
382
- return undefined ;
383
- } ,
384
- } ;
354
+ ensureNoInitializer : createEnsureNoInitializer ( emptySymbolTracker ) ,
355
+ } as const ;
385
356
}
386
357
else {
387
358
const host = context . getEmitHost ( ) ;
388
359
const resolver : EmitResolver = context . getEmitResolver ( ) ;
389
360
const symbolTracker = createSymbolTracker ( resolver , host ) ;
390
361
return {
391
362
isolatedDeclarations,
392
- useTscEmit : true ,
363
+ useLocalInferenceTypePrint : false ,
393
364
resolver,
394
365
localInferenceResolver,
395
366
symbolTracker,
396
367
host,
397
- ensureNoInitializer : ( node : CanHaveLiteralInitializer ) => {
398
- if ( shouldPrintWithInitializer ( node ) ) {
399
- return resolver . createLiteralConstValue ( getParseTreeNode ( node ) as CanHaveLiteralInitializer , symbolTracker ) ; // TODO: Make safe
400
- }
401
- return undefined ;
402
- } ,
403
- } ;
368
+ ensureNoInitializer : createEnsureNoInitializer ( symbolTracker ) ,
369
+ } as const ;
404
370
}
405
371
}
406
372
else {
373
+ Debug . assert ( ! context . useLocalInferenceTypePrint ) ;
407
374
const host = context . getEmitHost ( ) ;
408
375
const resolver = context . getEmitResolver ( ) ;
409
376
const symbolTracker : SymbolTracker = createSymbolTracker ( resolver , host ) ;
410
377
return {
411
- isolatedDeclarations,
412
- useTscEmit : false ,
413
- localInferenceResolver,
378
+ isolatedDeclarations : false ,
379
+ useLocalInferenceTypePrint : false ,
380
+ localInferenceResolver : undefined ,
414
381
resolver,
415
382
symbolTracker,
416
383
host,
417
- ensureNoInitializer : ( node : CanHaveLiteralInitializer ) => {
418
- if ( shouldPrintWithInitializer ( node ) ) {
419
- return resolver . createLiteralConstValue ( getParseTreeNode ( node ) as CanHaveLiteralInitializer , symbolTracker ) ; // TODO: Make safe
420
- }
421
- return undefined ;
422
- } ,
384
+ ensureNoInitializer : createEnsureNoInitializer ( symbolTracker ) ,
385
+ } as const ;
386
+ }
387
+
388
+ function createEnsureNoInitializer ( symbolTracker : SymbolTracker ) {
389
+ return function ensureNoInitializer ( node : CanHaveLiteralInitializer ) {
390
+ if ( shouldPrintWithInitializer ( node ) ) {
391
+ return resolver . createLiteralConstValue ( getParseTreeNode ( node ) as CanHaveLiteralInitializer , symbolTracker ) ; // TODO: Make safe
392
+ }
393
+ return undefined ;
423
394
} ;
424
395
}
425
396
}
@@ -659,6 +630,7 @@ export function transformDeclarations(context: TransformationContext, _useTscEmi
659
630
libs = new Map ( ) ;
660
631
existingTypeReferencesSources = node . sourceFiles ;
661
632
let hasNoDefaultLib = false ;
633
+ Debug . assert ( ! isolatedDeclarations , "Bundles are not supported in isolated declarations" ) ;
662
634
const bundle = factory . createBundle (
663
635
map ( node . sourceFiles , sourceFile => {
664
636
if ( sourceFile . isDeclarationFile ) return undefined ! ; // Omit declaration files from bundle results, too // TODO: GH#18217
@@ -681,7 +653,7 @@ export function transformDeclarations(context: TransformationContext, _useTscEmi
681
653
sourceFile ,
682
654
[ factory . createModuleDeclaration (
683
655
[ factory . createModifier ( SyntaxKind . DeclareKeyword ) ] ,
684
- factory . createStringLiteral ( getResolvedExternalModuleName ( context . getEmitHost ( ) , sourceFile ) ) ,
656
+ factory . createStringLiteral ( getResolvedExternalModuleName ( host , sourceFile ) ) ,
685
657
factory . createModuleBlock ( setTextRange ( factory . createNodeArray ( transformAndReplaceLatePaintedStatements ( statements ) ) , sourceFile . statements ) ) ,
686
658
) ] ,
687
659
/*isDeclarationFile*/ true ,
@@ -952,7 +924,7 @@ export function transformDeclarations(context: TransformationContext, _useTscEmi
952
924
}
953
925
if ( isolatedDeclarations ) {
954
926
const { typeNode, isInvalid } = localInferenceResolver . fromInitializer ( node , type , currentSourceFile ) ;
955
- if ( ! useTscEmit || isInvalid ) {
927
+ if ( useLocalInferenceTypePrint || isInvalid ) {
956
928
return typeNode ;
957
929
}
958
930
}
@@ -1121,7 +1093,7 @@ export function transformDeclarations(context: TransformationContext, _useTscEmi
1121
1093
if ( isBundledEmit ) {
1122
1094
// Bundle emit not supported for isolatedDeclarations
1123
1095
if ( ! isolatedDeclarations ) {
1124
- const newName = getExternalModuleNameFromDeclaration ( context . getEmitHost ( ) , resolver , parent ) ;
1096
+ const newName = getExternalModuleNameFromDeclaration ( host , resolver , parent ) ;
1125
1097
if ( newName ) {
1126
1098
return factory . createStringLiteral ( newName ) ;
1127
1099
}
0 commit comments