Skip to content

Commit d91c282

Browse files
Merge pull request #129 from bloomberg/isolated-declarations-use-tsc-resolver
TSC in isolated declaration will still use the type checker to print types
2 parents 4554796 + 2c0bf81 commit d91c282

File tree

297 files changed

+28904
-958
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

297 files changed

+28904
-958
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,6 @@ import {
461461
isAssignmentTarget,
462462
isAutoAccessorPropertyDeclaration,
463463
isAwaitExpression,
464-
isBigIntLiteral,
465464
isBinaryExpression,
466465
isBindableObjectDefinePropertyCall,
467466
isBindableStaticElementAccessExpression,
@@ -678,6 +677,7 @@ import {
678677
isPartOfTypeQuery,
679678
isPlainJsFile,
680679
isPrefixUnaryExpression,
680+
isPrimitiveLiteralValue,
681681
isPrivateIdentifier,
682682
isPrivateIdentifierClassElementDeclaration,
683683
isPrivateIdentifierPropertyAccessExpression,
@@ -721,7 +721,6 @@ import {
721721
isSuperCall,
722722
isSuperProperty,
723723
isTaggedTemplateExpression,
724-
isTemplateExpression,
725724
isTemplateSpan,
726725
isThisContainerOrFunctionBlock,
727726
isThisIdentifier,
@@ -47885,26 +47884,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4788547884
return undefined;
4788647885
}
4788747886

47888-
function isPrimitiveLiteralValue(node: Expression): boolean {
47889-
if (isNumericLiteral(node) || isBigIntLiteral(node) || isStringLiteralLike(node)) return true;
47890-
47891-
if (node.kind === SyntaxKind.TrueKeyword || node.kind === SyntaxKind.FalseKeyword) return true;
47892-
47893-
if (isPrefixUnaryExpression(node)) {
47894-
const operand = node.operand;
47895-
if (node.operator === SyntaxKind.MinusToken) {
47896-
return isNumericLiteral(operand) || isBigIntLiteral(operand);
47897-
}
47898-
if (node.operator === SyntaxKind.PlusToken) {
47899-
return isNumericLiteral(operand);
47900-
}
47901-
}
47902-
if (isTemplateExpression(node)) {
47903-
return node.templateSpans.every(t => isPrimitiveLiteralValue(t.expression));
47904-
}
47905-
return false;
47906-
}
47907-
4790847887
function isLiteralConstDeclaration(node: VariableDeclaration | PropertyDeclaration | PropertySignature | ParameterDeclaration): boolean {
4790947888
if (isDeclarationReadonly(node) || (isVariableDeclaration(node) && isVarConstLike(node)) || isEnumMember(node)) {
4791047889
if (compilerOptions.isolatedDeclarations) {
@@ -47916,7 +47895,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4791647895
}
4791747896
function isLiteralComputedName(node: ComputedPropertyName) {
4791847897
const expression = node.expression;
47919-
if (isPrimitiveLiteralValue(expression)) {
47898+
if (isPrimitiveLiteralValue(expression, /*includeBigInt*/ false)) {
4792047899
return true;
4792147900
}
4792247901
const type = getTypeOfExpression(expression);

src/compiler/transformers/declarations.ts

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ const declarationEmitNodeBuilderFlags = NodeBuilderFlags.MultilineObjectLiterals
293293
*
294294
* @internal
295295
*/
296-
export function transformDeclarations(context: TransformationContext) {
296+
export function transformDeclarations(context: TransformationContext, _useTscEmit = true) {
297297
const throwDiagnostic = () => Debug.fail("Diagnostic emitted without context");
298298
let getSymbolAccessibilityDiagnostic: GetSymbolAccessibilityDiagnostic = throwDiagnostic;
299299
let needsDeclare = true;
@@ -318,20 +318,30 @@ export function transformDeclarations(context: TransformationContext) {
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 } = createTransformerServices();
321+
const { localInferenceResolver, isolatedDeclarations, host, resolver, symbolTracker, ensureNoInitializer, useTscEmit } = createTransformerServices();
322322
const options = context.getCompilerOptions();
323323
const { noResolve, stripInternal } = options;
324324
return transformRoot;
325325

326326
function createTransformerServices(): {
327327
isolatedDeclarations: true;
328+
useTscEmit: false;
328329
resolver: IsolatedEmitResolver;
329330
localInferenceResolver: LocalInferenceResolver;
330331
host: undefined;
331332
symbolTracker: undefined;
332333
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;
333342
} | {
334343
isolatedDeclarations: false;
344+
useTscEmit: false;
335345
resolver: EmitResolver;
336346
localInferenceResolver: undefined;
337347
host: EmitHost;
@@ -353,30 +363,53 @@ export function transformDeclarations(context: TransformationContext) {
353363
});
354364

355365
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+
}
373405
}
374406
else {
375407
const host = context.getEmitHost();
376408
const resolver = context.getEmitResolver();
377409
const symbolTracker: SymbolTracker = createSymbolTracker(resolver, host);
378410
return {
379411
isolatedDeclarations,
412+
useTscEmit: false,
380413
localInferenceResolver,
381414
resolver,
382415
symbolTracker,
@@ -918,7 +951,10 @@ export function transformDeclarations(context: TransformationContext) {
918951
return;
919952
}
920953
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+
}
922958
}
923959
const shouldUseResolverType = node.kind === SyntaxKind.Parameter &&
924960
(resolver.isRequiredInitializedParameter(node) ||
@@ -1571,7 +1607,7 @@ export function transformDeclarations(context: TransformationContext) {
15711607
});
15721608
errorFallbackNode = input;
15731609
const type = isolatedDeclarations ?
1574-
localInferenceResolver.fromInitializer(input, /*type*/ undefined, currentSourceFile) :
1610+
localInferenceResolver.fromInitializer(input, /*type*/ undefined, currentSourceFile).typeNode :
15751611
resolver.createTypeOfExpression(input.expression, input, declarationEmitNodeBuilderFlags, symbolTracker);
15761612
const varDecl = factory.createVariableDeclaration(newId, /*exclamationToken*/ undefined, type, /*initializer*/ undefined);
15771613
errorFallbackNode = undefined;

0 commit comments

Comments
 (0)