@@ -23,6 +23,7 @@ import {
2323 ConstructorTypeNode ,
2424 ConstructSignatureDeclaration ,
2525 contains ,
26+ CoreEmitResolver ,
2627 createDiagnosticForNode ,
2728 createDiagnosticForRange ,
2829 createEmptyExports ,
@@ -46,7 +47,6 @@ import {
4647 EnumDeclaration ,
4748 ExportAssignment ,
4849 ExportDeclaration ,
49- Expression ,
5050 ExpressionWithTypeArguments ,
5151 factory ,
5252 FileReference ,
@@ -139,7 +139,7 @@ import {
139139 isMethodSignature ,
140140 isModifier ,
141141 isModuleDeclaration ,
142- IsolatedEmitResolver ,
142+ IsolatedTransformationContext ,
143143 isOmittedExpression ,
144144 isPrivateIdentifier ,
145145 isPropertySignature ,
@@ -167,7 +167,6 @@ import {
167167 LateBoundDeclaration ,
168168 LateVisibilityPaintedStatement ,
169169 length ,
170- LocalInferenceResolver ,
171170 map ,
172171 mapDefined ,
173172 MethodDeclaration ,
@@ -221,6 +220,7 @@ import {
221220 SyntaxKind ,
222221 toFileNameLowerCase ,
223222 TransformationContext ,
223+ TransformationContextKind ,
224224 transformNodes ,
225225 tryCast ,
226226 tryGetModuleSpecifierFromDeclaration ,
@@ -293,7 +293,7 @@ const declarationEmitNodeBuilderFlags = NodeBuilderFlags.MultilineObjectLiterals
293293 *
294294 * @internal
295295 */
296- export function transformDeclarations ( context : TransformationContext , _useTscEmit = true ) {
296+ export function transformDeclarations ( context : TransformationContext | IsolatedTransformationContext ) {
297297 const throwDiagnostic = ( ) => Debug . fail ( "Diagnostic emitted without context" ) ;
298298 let getSymbolAccessibilityDiagnostic : GetSymbolAccessibilityDiagnostic = throwDiagnostic ;
299299 let needsDeclare = true ;
@@ -318,108 +318,80 @@ export function transformDeclarations(context: TransformationContext, _useTscEmi
318318 let refs : Map < NodeId , SourceFile > ;
319319 let libs : Map < string , boolean > ;
320320 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 ( ) ;
321+ const { localInferenceResolver, isolatedDeclarations, host, resolver, symbolTracker, ensureNoInitializer, useLocalInferenceTypePrint } = createTransformerServices ( ) ;
322322 const options = context . getCompilerOptions ( ) ;
323323 const { noResolve, stripInternal } = options ;
324324 return transformRoot ;
325325
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- } ) ;
326+ function createTransformerServices ( ) {
327+ const isolatedDeclarations = context . getCompilerOptions ( ) . isolatedDeclarations ;
364328
365329 if ( isolatedDeclarations ) {
366- if ( ! _useTscEmit ) {
367- const resolver : IsolatedEmitResolver = context . getEmitResolver ( ) ;
330+ const localInferenceResolver = createLocalInferenceResolver ( {
331+ ensureParameter,
332+ context,
333+ visitDeclarationSubtree,
334+ setEnclosingDeclarations ( node ) {
335+ const oldNode = enclosingDeclaration ;
336+ enclosingDeclaration = node ;
337+ return oldNode ;
338+ } ,
339+ checkEntityNameVisibility ( name , container ) {
340+ return checkEntityNameVisibility ( name , container ?? enclosingDeclaration ) ;
341+ } ,
342+ } ) ;
343+ if ( context . kind === TransformationContextKind . IsolatedContext ) {
344+ const resolver : CoreEmitResolver = context . getEmitResolver ( ) ;
368345 // Ideally nothing should require the symbol tracker in isolated declarations mode.
369346 // createLiteralConstValue is the one exception
370347 const emptySymbolTracker = { } ;
371348 return {
372349 isolatedDeclarations,
373- useTscEmit : false ,
350+ useLocalInferenceTypePrint : true ,
374351 resolver,
375352 localInferenceResolver,
376353 symbolTracker : undefined ,
377354 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- } ;
355+ ensureNoInitializer : createEnsureNoInitializer ( emptySymbolTracker ) ,
356+ } as const ;
385357 }
386358 else {
387359 const host = context . getEmitHost ( ) ;
388360 const resolver : EmitResolver = context . getEmitResolver ( ) ;
389361 const symbolTracker = createSymbolTracker ( resolver , host ) ;
390362 return {
391363 isolatedDeclarations,
392- useTscEmit : true ,
364+ useLocalInferenceTypePrint : false ,
393365 resolver,
394366 localInferenceResolver,
395367 symbolTracker,
396368 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- } ;
369+ ensureNoInitializer : createEnsureNoInitializer ( symbolTracker ) ,
370+ } as const ;
404371 }
405372 }
406373 else {
374+ Debug . assert ( context . kind === TransformationContextKind . FullContext ) ;
407375 const host = context . getEmitHost ( ) ;
408376 const resolver = context . getEmitResolver ( ) ;
409377 const symbolTracker : SymbolTracker = createSymbolTracker ( resolver , host ) ;
410378 return {
411- isolatedDeclarations,
412- useTscEmit : false ,
413- localInferenceResolver,
379+ isolatedDeclarations : false ,
380+ useLocalInferenceTypePrint : false ,
381+ localInferenceResolver : undefined ,
414382 resolver,
415383 symbolTracker,
416384 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- } ,
385+ ensureNoInitializer : createEnsureNoInitializer ( symbolTracker ) ,
386+ } as const ;
387+ }
388+
389+ function createEnsureNoInitializer ( symbolTracker : SymbolTracker ) {
390+ return function ensureNoInitializer ( node : CanHaveLiteralInitializer ) {
391+ if ( shouldPrintWithInitializer ( node ) ) {
392+ return resolver . createLiteralConstValue ( getParseTreeNode ( node ) as CanHaveLiteralInitializer , symbolTracker ) ; // TODO: Make safe
393+ }
394+ return undefined ;
423395 } ;
424396 }
425397 }
@@ -659,6 +631,7 @@ export function transformDeclarations(context: TransformationContext, _useTscEmi
659631 libs = new Map ( ) ;
660632 existingTypeReferencesSources = node . sourceFiles ;
661633 let hasNoDefaultLib = false ;
634+ Debug . assert ( ! isolatedDeclarations , "Bundles are not supported in isolated declarations" ) ;
662635 const bundle = factory . createBundle (
663636 map ( node . sourceFiles , sourceFile => {
664637 if ( sourceFile . isDeclarationFile ) return undefined ! ; // Omit declaration files from bundle results, too // TODO: GH#18217
@@ -681,7 +654,7 @@ export function transformDeclarations(context: TransformationContext, _useTscEmi
681654 sourceFile ,
682655 [ factory . createModuleDeclaration (
683656 [ factory . createModifier ( SyntaxKind . DeclareKeyword ) ] ,
684- factory . createStringLiteral ( getResolvedExternalModuleName ( context . getEmitHost ( ) , sourceFile ) ) ,
657+ factory . createStringLiteral ( getResolvedExternalModuleName ( host , sourceFile ) ) ,
685658 factory . createModuleBlock ( setTextRange ( factory . createNodeArray ( transformAndReplaceLatePaintedStatements ( statements ) ) , sourceFile . statements ) ) ,
686659 ) ] ,
687660 /*isDeclarationFile*/ true ,
@@ -952,7 +925,7 @@ export function transformDeclarations(context: TransformationContext, _useTscEmi
952925 }
953926 if ( isolatedDeclarations ) {
954927 const { typeNode, isInvalid } = localInferenceResolver . fromInitializer ( node , type , currentSourceFile ) ;
955- if ( ! useTscEmit || isInvalid ) {
928+ if ( useLocalInferenceTypePrint || isInvalid ) {
956929 return typeNode ;
957930 }
958931 }
@@ -1121,7 +1094,7 @@ export function transformDeclarations(context: TransformationContext, _useTscEmi
11211094 if ( isBundledEmit ) {
11221095 // Bundle emit not supported for isolatedDeclarations
11231096 if ( ! isolatedDeclarations ) {
1124- const newName = getExternalModuleNameFromDeclaration ( context . getEmitHost ( ) , resolver , parent ) ;
1097+ const newName = getExternalModuleNameFromDeclaration ( host , resolver , parent ) ;
11251098 if ( newName ) {
11261099 return factory . createStringLiteral ( newName ) ;
11271100 }
0 commit comments