@@ -293,7 +293,7 @@ const declarationEmitNodeBuilderFlags = NodeBuilderFlags.MultilineObjectLiterals
293
293
*
294
294
* @internal
295
295
*/
296
- export function transformDeclarations ( context : TransformationContext ) {
296
+ export function transformDeclarations ( context : TransformationContext , _useTscEmit = true ) {
297
297
const throwDiagnostic = ( ) => Debug . fail ( "Diagnostic emitted without context" ) ;
298
298
let getSymbolAccessibilityDiagnostic : GetSymbolAccessibilityDiagnostic = throwDiagnostic ;
299
299
let needsDeclare = true ;
@@ -318,20 +318,30 @@ export function transformDeclarations(context: TransformationContext) {
318
318
let refs : Map < NodeId , SourceFile > ;
319
319
let libs : Map < string , boolean > ;
320
320
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 } = createTransformerServices ( ) ;
321
+ const { localInferenceResolver, isolatedDeclarations, host, resolver, symbolTracker, ensureNoInitializer, useTscEmit } = createTransformerServices ( ) ;
322
322
const options = context . getCompilerOptions ( ) ;
323
323
const { noResolve, stripInternal } = options ;
324
324
return transformRoot ;
325
325
326
326
function createTransformerServices ( ) : {
327
327
isolatedDeclarations : true ;
328
+ useTscEmit : false ;
328
329
resolver : IsolatedEmitResolver ;
329
330
localInferenceResolver : LocalInferenceResolver ;
330
331
host : undefined ;
331
332
symbolTracker : undefined ;
332
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 ;
333
342
} | {
334
343
isolatedDeclarations : false ;
344
+ useTscEmit : false ;
335
345
resolver : EmitResolver ;
336
346
localInferenceResolver : undefined ;
337
347
host : EmitHost ;
@@ -353,30 +363,53 @@ export function transformDeclarations(context: TransformationContext) {
353
363
} ) ;
354
364
355
365
if ( isolatedDeclarations ) {
356
- const resolver : IsolatedEmitResolver = context . getEmitResolver ( ) ;
357
- // Ideally nothing should require the symbol tracker in isolated declarations mode.
358
- // createLiteralConstValue is teh one exception
359
- const emptySymbolTracker = { } ;
360
- return {
361
- isolatedDeclarations,
362
- resolver,
363
- localInferenceResolver,
364
- symbolTracker : undefined ,
365
- host : undefined ,
366
- ensureNoInitializer : ( node : CanHaveLiteralInitializer ) => {
367
- if ( shouldPrintWithInitializer ( node ) ) {
368
- return resolver . createLiteralConstValue ( getParseTreeNode ( node ) as CanHaveLiteralInitializer , emptySymbolTracker ) ; // TODO: Make safe
369
- }
370
- return undefined ;
371
- } ,
372
- } ;
366
+ if ( ! _useTscEmit ) {
367
+ const resolver : IsolatedEmitResolver = context . getEmitResolver ( ) ;
368
+ // Ideally nothing should require the symbol tracker in isolated declarations mode.
369
+ // createLiteralConstValue is the one exception
370
+ const emptySymbolTracker = { } ;
371
+ return {
372
+ isolatedDeclarations,
373
+ useTscEmit : false ,
374
+ resolver,
375
+ localInferenceResolver,
376
+ symbolTracker : undefined ,
377
+ 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
+ } ;
385
+ }
386
+ else {
387
+ const host = context . getEmitHost ( ) ;
388
+ const resolver : EmitResolver = context . getEmitResolver ( ) ;
389
+ const symbolTracker = createSymbolTracker ( resolver , host ) ;
390
+ return {
391
+ isolatedDeclarations,
392
+ useTscEmit : true ,
393
+ resolver,
394
+ localInferenceResolver,
395
+ symbolTracker,
396
+ 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
+ } ;
404
+ }
373
405
}
374
406
else {
375
407
const host = context . getEmitHost ( ) ;
376
408
const resolver = context . getEmitResolver ( ) ;
377
409
const symbolTracker : SymbolTracker = createSymbolTracker ( resolver , host ) ;
378
410
return {
379
411
isolatedDeclarations,
412
+ useTscEmit : false ,
380
413
localInferenceResolver,
381
414
resolver,
382
415
symbolTracker,
@@ -918,7 +951,10 @@ export function transformDeclarations(context: TransformationContext) {
918
951
return ;
919
952
}
920
953
if ( isolatedDeclarations ) {
921
- return localInferenceResolver . fromInitializer ( node , type , currentSourceFile ) ;
954
+ const { typeNode, isInvalid } = localInferenceResolver . fromInitializer ( node , type , currentSourceFile ) ;
955
+ if ( ! useTscEmit || isInvalid ) {
956
+ return typeNode ;
957
+ }
922
958
}
923
959
const shouldUseResolverType = node . kind === SyntaxKind . Parameter &&
924
960
( resolver . isRequiredInitializedParameter ( node ) ||
@@ -1571,7 +1607,7 @@ export function transformDeclarations(context: TransformationContext) {
1571
1607
} ) ;
1572
1608
errorFallbackNode = input ;
1573
1609
const type = isolatedDeclarations ?
1574
- localInferenceResolver . fromInitializer ( input , /*type*/ undefined , currentSourceFile ) :
1610
+ localInferenceResolver . fromInitializer ( input , /*type*/ undefined , currentSourceFile ) . typeNode :
1575
1611
resolver . createTypeOfExpression ( input . expression , input , declarationEmitNodeBuilderFlags , symbolTracker ) ;
1576
1612
const varDecl = factory . createVariableDeclaration ( newId , /*exclamationToken*/ undefined , type , /*initializer*/ undefined ) ;
1577
1613
errorFallbackNode = undefined ;
0 commit comments