Skip to content

Commit 9e43939

Browse files
Update AST to unify type with other modifiers
1 parent de82ce7 commit 9e43939

27 files changed

+100
-109
lines changed

src/compiler/checker.ts

+13-8
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,6 @@ import {
432432
ImportDeclaration,
433433
ImportEqualsDeclaration,
434434
ImportOrExportSpecifier,
435-
ImportPhase,
436435
ImportSpecifier,
437436
ImportTypeNode,
438437
IndexedAccessType,
@@ -9852,14 +9851,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
98529851
factory.createImportDeclaration(
98539852
/*modifiers*/ undefined,
98549853
factory.createImportClause(
9855-
/*isTypeOnly*/ false,
9854+
/*phaseModifier*/ undefined,
98569855
/*name*/ undefined,
98579856
factory.createNamedImports([factory.createImportSpecifier(
98589857
/*isTypeOnly*/ false,
98599858
propertyName && isIdentifier(propertyName) ? factory.createIdentifier(idText(propertyName)) : undefined,
98609859
factory.createIdentifier(localName),
98619860
)]),
9862-
ImportPhase.Evaluation,
98639861
),
98649862
factory.createStringLiteral(specifier),
98659863
/*attributes*/ undefined,
@@ -9946,7 +9944,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
99469944
addResult(
99479945
factory.createImportDeclaration(
99489946
/*modifiers*/ undefined,
9949-
factory.createImportClause(isTypeOnly, factory.createIdentifier(localName), /*namedBindings*/ undefined, ImportPhase.Evaluation),
9947+
factory.createImportClause(
9948+
/* phaseModifier */ isTypeOnly ? SyntaxKind.TypeKeyword : undefined,
9949+
factory.createIdentifier(localName),
9950+
/*namedBindings*/ undefined,
9951+
),
99509952
specifier,
99519953
attributes,
99529954
),
@@ -9961,7 +9963,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
99619963
addResult(
99629964
factory.createImportDeclaration(
99639965
/*modifiers*/ undefined,
9964-
factory.createImportClause(isTypeOnly, /*name*/ undefined, factory.createNamespaceImport(factory.createIdentifier(localName)), ImportPhase.Evaluation),
9966+
factory.createImportClause(
9967+
/* phaseModifier */ isTypeOnly ? SyntaxKind.TypeKeyword : undefined,
9968+
/*name*/ undefined,
9969+
factory.createNamespaceImport(factory.createIdentifier(localName)),
9970+
),
99659971
specifier,
99669972
(node as ImportClause).parent.attributes,
99679973
),
@@ -9988,7 +9994,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
99889994
factory.createImportDeclaration(
99899995
/*modifiers*/ undefined,
99909996
factory.createImportClause(
9991-
isTypeOnly,
9997+
/* phaseModifier */ isTypeOnly ? SyntaxKind.TypeKeyword : undefined,
99929998
/*name*/ undefined,
99939999
factory.createNamedImports([
999410000
factory.createImportSpecifier(
@@ -9997,7 +10003,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
999710003
factory.createIdentifier(localName),
999810004
),
999910005
]),
10000-
ImportPhase.Evaluation,
1000110006
),
1000210007
specifier,
1000310008
(node as ImportSpecifier).parent.parent.parent.attributes,
@@ -52863,7 +52868,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
5286352868
if (node.isTypeOnly && node.namedBindings?.kind === SyntaxKind.NamedImports) {
5286452869
return checkGrammarNamedImportsOrExports(node.namedBindings);
5286552870
}
52866-
if (node.phase !== ImportPhase.Evaluation && moduleKind !== ModuleKind.ESNext) {
52871+
if (node.phaseModifier === SyntaxKind.DeferKeyword && moduleKind !== ModuleKind.ESNext) {
5286752872
return grammarErrorOnNode(node, Diagnostics.Deferred_imports_are_only_supported_when_the_module_flag_is_set_to_esnext);
5286852873
}
5286952874
return false;

src/compiler/emitter.ts

+4-5
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,6 @@ import {
182182
ImportDeclaration,
183183
ImportEqualsDeclaration,
184184
ImportOrExportSpecifier,
185-
ImportPhase,
186185
ImportSpecifier,
187186
ImportTypeNode,
188187
IndexedAccessTypeNode,
@@ -3686,12 +3685,12 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri
36863685
}
36873686

36883687
function emitImportClause(node: ImportClause) {
3689-
if (node.isTypeOnly) {
3690-
emitTokenWithComment(SyntaxKind.TypeKeyword, node.pos, writeKeyword, node);
3688+
if (node.phaseModifier !== undefined) {
3689+
emitTokenWithComment(node.phaseModifier, node.pos, writeKeyword, node);
36913690
writeSpace();
36923691
}
3693-
else if (node.phase !== ImportPhase.Evaluation) {
3694-
emitTokenWithComment(SyntaxKind.DeferKeyword, node.pos, writeKeyword, node);
3692+
else if (node.isTypeOnly) {
3693+
emitTokenWithComment(SyntaxKind.TypeKeyword, node.pos, writeKeyword, node);
36953694
writeSpace();
36963695
}
36973696
emit(node.name);

src/compiler/factory/nodeFactory.ts

+14-9
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ import {
135135
ImportClause,
136136
ImportDeclaration,
137137
ImportEqualsDeclaration,
138-
ImportPhase,
138+
ImportPhaseModifier,
139139
ImportSpecifier,
140140
ImportTypeAssertionContainer,
141141
ImportTypeNode,
@@ -4724,28 +4724,33 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
47244724
}
47254725

47264726
// @api
4727-
function createImportClause(isTypeOnly: boolean, name: Identifier | undefined, namedBindings: NamedImportBindings | undefined, phase: ImportPhase): ImportClause {
4727+
function createImportClause(phaseModifier: ImportPhaseModifier | boolean | undefined, name: Identifier | undefined, namedBindings: NamedImportBindings | undefined): ImportClause {
47284728
const node = createBaseDeclaration<ImportClause>(SyntaxKind.ImportClause);
4729-
node.isTypeOnly = isTypeOnly;
4729+
if (typeof phaseModifier === "boolean") {
4730+
phaseModifier = phaseModifier ? SyntaxKind.TypeKeyword : undefined;
4731+
}
4732+
node.isTypeOnly = phaseModifier === SyntaxKind.TypeKeyword;
4733+
node.phaseModifier = phaseModifier;
47304734
node.name = name;
47314735
node.namedBindings = namedBindings;
4732-
node.phase = phase;
47334736
node.transformFlags |= propagateChildFlags(node.name) |
47344737
propagateChildFlags(node.namedBindings);
4735-
if (isTypeOnly) {
4738+
if (phaseModifier === SyntaxKind.TypeKeyword) {
47364739
node.transformFlags |= TransformFlags.ContainsTypeScript;
47374740
}
47384741
node.transformFlags &= ~TransformFlags.ContainsPossibleTopLevelAwait; // always parsed in an Await context
47394742
return node;
47404743
}
47414744

47424745
// @api
4743-
function updateImportClause(node: ImportClause, isTypeOnly: boolean, name: Identifier | undefined, namedBindings: NamedImportBindings | undefined, phase: ImportPhase) {
4744-
return node.isTypeOnly !== isTypeOnly
4746+
function updateImportClause(node: ImportClause, phaseModifier: ImportPhaseModifier | boolean | undefined, name: Identifier | undefined, namedBindings: NamedImportBindings | undefined) {
4747+
if (typeof phaseModifier === "boolean") {
4748+
phaseModifier = phaseModifier ? SyntaxKind.TypeKeyword : undefined;
4749+
}
4750+
return node.phaseModifier !== phaseModifier
47454751
|| node.name !== name
47464752
|| node.namedBindings !== namedBindings
4747-
|| node.phase !== phase
4748-
? update(createImportClause(isTypeOnly, name, namedBindings, phase), node)
4753+
? update(createImportClause(phaseModifier, name, namedBindings), node)
47494754
: node;
47504755
}
47514756

src/compiler/factory/utilities.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ import {
7575
ImportCall,
7676
ImportDeclaration,
7777
ImportEqualsDeclaration,
78-
ImportPhase,
7978
InternalEmitFlags,
8079
isAssignmentExpression,
8180
isAssignmentOperator,
@@ -731,7 +730,7 @@ export function createExternalHelpersImportDeclarationIfNeeded(nodeFactory: Node
731730

732731
const externalHelpersImportDeclaration = nodeFactory.createImportDeclaration(
733732
/*modifiers*/ undefined,
734-
nodeFactory.createImportClause(/*isTypeOnly*/ false, /*name*/ undefined, namedBindings, ImportPhase.Evaluation),
733+
nodeFactory.createImportClause(/*phaseModifier*/ undefined, /*name*/ undefined, namedBindings),
735734
nodeFactory.createStringLiteral(externalHelpersModuleNameText),
736735
/*attributes*/ undefined,
737736
);

src/compiler/parser.ts

+13-14
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ import {
123123
ImportDeclaration,
124124
ImportEqualsDeclaration,
125125
ImportOrExportSpecifier,
126-
ImportPhase,
126+
ImportPhaseModifier,
127127
ImportSpecifier,
128128
ImportTypeAssertionContainer,
129129
ImportTypeNode,
@@ -8368,30 +8368,29 @@ namespace Parser {
83688368
identifier = parseIdentifier();
83698369
}
83708370

8371-
let isTypeOnly = false;
8372-
let phase = ImportPhase.Evaluation;
8371+
let phaseModifier: ImportPhaseModifier | undefined;
83738372
if (
83748373
identifier?.escapedText === "type" &&
83758374
(token() !== SyntaxKind.FromKeyword || isIdentifier() && lookAhead(nextTokenIsFromKeywordOrEqualsToken)) &&
83768375
(isIdentifier() || tokenAfterImportDefinitelyProducesImportDeclaration())
83778376
) {
8378-
isTypeOnly = true;
8377+
phaseModifier = SyntaxKind.TypeKeyword;
83798378
identifier = isIdentifier() ? parseIdentifier() : undefined;
83808379
}
83818380
else if (identifier?.escapedText === "defer" && token() !== SyntaxKind.FromKeyword) {
8382-
phase = ImportPhase.Defer;
8381+
phaseModifier = SyntaxKind.DeferKeyword;
83838382
identifier = undefined;
83848383
if (isIdentifier()) {
83858384
parseErrorAtCurrentToken(Diagnostics.Default_imports_aren_t_allowed_for_deferred_imports);
83868385
identifier = parseIdentifier();
83878386
}
83888387
}
83898388

8390-
if (identifier && !tokenAfterImportedIdentifierDefinitelyProducesImportDeclaration() && phase !== ImportPhase.Defer) {
8391-
return parseImportEqualsDeclaration(pos, hasJSDoc, modifiers, identifier, isTypeOnly);
8389+
if (identifier && !tokenAfterImportedIdentifierDefinitelyProducesImportDeclaration() && phaseModifier !== SyntaxKind.DeferKeyword) {
8390+
return parseImportEqualsDeclaration(pos, hasJSDoc, modifiers, identifier, phaseModifier === SyntaxKind.TypeKeyword);
83928391
}
83938392

8394-
const importClause = tryParseImportClause(identifier, afterImportPos, isTypeOnly, /*skipJsDocLeadingAsterisks*/ undefined, phase);
8393+
const importClause = tryParseImportClause(identifier, afterImportPos, phaseModifier, /*skipJsDocLeadingAsterisks*/ undefined);
83958394
const moduleSpecifier = parseModuleSpecifier();
83968395
const attributes = tryParseImportAttributes();
83978396

@@ -8400,7 +8399,7 @@ namespace Parser {
84008399
return withJSDoc(finishNode(node, pos), hasJSDoc);
84018400
}
84028401

8403-
function tryParseImportClause(identifier: Identifier | undefined, pos: number, isTypeOnly: boolean, skipJsDocLeadingAsterisks = false, phase: ImportPhase) {
8402+
function tryParseImportClause(identifier: Identifier | undefined, pos: number, phaseModifier: undefined | ImportPhaseModifier, skipJsDocLeadingAsterisks = false) {
84048403
// ImportDeclaration:
84058404
// import ImportClause from ModuleSpecifier ;
84068405
// import ModuleSpecifier;
@@ -8410,7 +8409,7 @@ namespace Parser {
84108409
token() === SyntaxKind.AsteriskToken || // import *
84118410
token() === SyntaxKind.OpenBraceToken // import {
84128411
) {
8413-
importClause = parseImportClause(identifier, pos, isTypeOnly, skipJsDocLeadingAsterisks, phase);
8412+
importClause = parseImportClause(identifier, pos, phaseModifier, skipJsDocLeadingAsterisks);
84148413
parseExpected(SyntaxKind.FromKeyword);
84158414
}
84168415
return importClause;
@@ -8476,7 +8475,7 @@ namespace Parser {
84768475
return finished;
84778476
}
84788477

8479-
function parseImportClause(identifier: Identifier | undefined, pos: number, isTypeOnly: boolean, skipJsDocLeadingAsterisks: boolean, phase: ImportPhase) {
8478+
function parseImportClause(identifier: Identifier | undefined, pos: number, phaseModifier: undefined | ImportPhaseModifier, skipJsDocLeadingAsterisks: boolean) {
84808479
// ImportClause:
84818480
// ImportedDefaultBinding
84828481
// NameSpaceImport
@@ -8496,15 +8495,15 @@ namespace Parser {
84968495
namedBindings = parseNamespaceImport();
84978496
}
84988497
else {
8499-
if (phase === ImportPhase.Defer) {
8498+
if (phaseModifier === SyntaxKind.DeferKeyword) {
85008499
parseErrorAtCurrentToken(Diagnostics.Named_imports_aren_t_allowed_for_deferred_imports);
85018500
}
85028501
namedBindings = parseNamedImportsOrExports(SyntaxKind.NamedImports);
85038502
}
85048503
if (skipJsDocLeadingAsterisks) scanner.setSkipJsDocLeadingAsterisks(false);
85058504
}
85068505

8507-
return finishNode(factory.createImportClause(isTypeOnly, identifier, namedBindings, phase), pos);
8506+
return finishNode(factory.createImportClause(phaseModifier, identifier, namedBindings), pos);
85088507
}
85098508

85108509
function parseModuleReference() {
@@ -9538,7 +9537,7 @@ namespace Parser {
95389537
identifier = parseIdentifier();
95399538
}
95409539

9541-
const importClause = tryParseImportClause(identifier, afterImportTagPos, /*isTypeOnly*/ true, /*skipJsDocLeadingAsterisks*/ true, ImportPhase.Evaluation);
9540+
const importClause = tryParseImportClause(identifier, afterImportTagPos, SyntaxKind.TypeKeyword, /*skipJsDocLeadingAsterisks*/ true);
95429541
const moduleSpecifier = parseModuleSpecifier();
95439542
const attributes = tryParseImportAttributes();
95449543

src/compiler/transformers/declarations.ts

+3-6
Original file line numberDiff line numberDiff line change
@@ -886,10 +886,9 @@ export function transformDeclarations(context: TransformationContext): Transform
886886
decl.modifiers,
887887
factory.updateImportClause(
888888
decl.importClause,
889-
decl.importClause.isTypeOnly,
889+
decl.importClause.phaseModifier,
890890
visibleDefaultBinding,
891891
/*namedBindings*/ undefined,
892-
decl.importClause.phase,
893892
),
894893
rewriteModuleSpecifier(decl, decl.moduleSpecifier),
895894
tryGetResolutionModeOverride(decl.attributes),
@@ -903,10 +902,9 @@ export function transformDeclarations(context: TransformationContext): Transform
903902
decl.modifiers,
904903
factory.updateImportClause(
905904
decl.importClause,
906-
decl.importClause.isTypeOnly,
905+
decl.importClause.phaseModifier,
907906
visibleDefaultBinding,
908907
namedBindings,
909-
decl.importClause.phase,
910908
),
911909
rewriteModuleSpecifier(decl, decl.moduleSpecifier),
912910
tryGetResolutionModeOverride(decl.attributes),
@@ -920,10 +918,9 @@ export function transformDeclarations(context: TransformationContext): Transform
920918
decl.modifiers,
921919
factory.updateImportClause(
922920
decl.importClause,
923-
decl.importClause.isTypeOnly,
921+
decl.importClause.phaseModifier,
924922
visibleDefaultBinding,
925923
bindingList && bindingList.length ? factory.updateNamedImports(decl.importClause.namedBindings, bindingList) : undefined,
926-
decl.importClause.phase,
927924
),
928925
rewriteModuleSpecifier(decl, decl.moduleSpecifier),
929926
tryGetResolutionModeOverride(decl.attributes),

src/compiler/transformers/jsx.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import {
2222
getSemanticJsxChildren,
2323
Identifier,
2424
idText,
25-
ImportPhase,
2625
ImportSpecifier,
2726
insertStatementAfterCustomPrologue,
2827
isExpression,
@@ -173,7 +172,7 @@ export function transformJsx(context: TransformationContext): (x: SourceFile | B
173172
for (const [importSource, importSpecifiersMap] of arrayFrom(currentFileState.utilizedImplicitRuntimeImports.entries())) {
174173
if (isExternalModule(node)) {
175174
// Add `import` statement
176-
const importStatement = factory.createImportDeclaration(/*modifiers*/ undefined, factory.createImportClause(/*isTypeOnly*/ false, /*name*/ undefined, factory.createNamedImports(arrayFrom(importSpecifiersMap.values())), ImportPhase.Evaluation), factory.createStringLiteral(importSource), /*attributes*/ undefined);
175+
const importStatement = factory.createImportDeclaration(/*modifiers*/ undefined, factory.createImportClause(/*phaseModifier*/ undefined, /*name*/ undefined, factory.createNamedImports(arrayFrom(importSpecifiersMap.values()))), factory.createStringLiteral(importSource), /*attributes*/ undefined);
177176
setParentRecursive(importStatement, /*incremental*/ false);
178177
statements = insertStatementAfterCustomPrologue(statements.slice(), importStatement);
179178
}

src/compiler/transformers/module/esnextAnd2015.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import {
2828
idText,
2929
ImportDeclaration,
3030
ImportEqualsDeclaration,
31-
ImportPhase,
3231
insertStatementsAfterCustomPrologue,
3332
isExportNamespaceAsDefaultDeclaration,
3433
isExternalModule,
@@ -220,12 +219,11 @@ export function transformECMAScriptModule(context: TransformationContext): (x: S
220219
const importStatement = factory.createImportDeclaration(
221220
/*modifiers*/ undefined,
222221
factory.createImportClause(
223-
/*isTypeOnly*/ false,
222+
/*phaseModifier*/ undefined,
224223
/*name*/ undefined,
225224
factory.createNamedImports([
226225
factory.createImportSpecifier(/*isTypeOnly*/ false, factory.createIdentifier("createRequire"), createRequireName),
227226
]),
228-
ImportPhase.Evaluation,
229227
),
230228
factory.createStringLiteral("module"),
231229
/*attributes*/ undefined,
@@ -353,12 +351,11 @@ export function transformECMAScriptModule(context: TransformationContext): (x: S
353351
const importDecl = factory.createImportDeclaration(
354352
/*modifiers*/ undefined,
355353
factory.createImportClause(
356-
/*isTypeOnly*/ false,
354+
/*phaseModifier*/ undefined,
357355
/*name*/ undefined,
358356
factory.createNamespaceImport(
359357
synthName,
360358
),
361-
ImportPhase.Evaluation,
362359
),
363360
updatedModuleSpecifier!,
364361
node.attributes,

0 commit comments

Comments
 (0)