Skip to content

Commit bc86f35

Browse files
committed
Add JS support to declaration transformer (currently untested in baselines aside from diagnostic output)
1 parent ffa0b5c commit bc86f35

File tree

6 files changed

+102
-37
lines changed

6 files changed

+102
-37
lines changed

internal/ast/utilities.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3092,6 +3092,7 @@ func IsLateVisibilityPaintedStatement(node *Node) bool {
30923092
KindFunctionDeclaration,
30933093
KindModuleDeclaration,
30943094
KindTypeAliasDeclaration,
3095+
KindJSTypeAliasDeclaration,
30953096
KindInterfaceDeclaration,
30963097
KindEnumDeclaration:
30973098
return true

internal/checker/emitresolver.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ func (r *emitResolver) determineIfDeclarationIsVisible(node *ast.Node) bool {
114114
ast.KindClassDeclaration,
115115
ast.KindInterfaceDeclaration,
116116
ast.KindTypeAliasDeclaration,
117+
ast.KindJSTypeAliasDeclaration,
117118
ast.KindFunctionDeclaration,
118119
ast.KindEnumDeclaration,
119120
ast.KindImportEqualsDeclaration:
@@ -185,7 +186,7 @@ func (r *emitResolver) determineIfDeclarationIsVisible(node *ast.Node) bool {
185186
return true
186187

187188
// Export assignments do not create name bindings outside the module
188-
case ast.KindExportAssignment:
189+
case ast.KindExportAssignment, ast.KindJSExportAssignment:
189190
return false
190191

191192
default:
@@ -206,7 +207,7 @@ func (r *emitResolver) PrecalculateDeclarationEmitVisibility(file *ast.SourceFil
206207

207208
func (r *emitResolver) aliasMarkingVisitor(node *ast.Node) bool {
208209
switch node.Kind {
209-
case ast.KindExportAssignment:
210+
case ast.KindExportAssignment, ast.KindJSExportAssignment:
210211
if node.AsExportAssignment().Expression.Kind == ast.KindIdentifier {
211212
r.markLinkedAliases(node.Expression())
212213
}

internal/checker/nodebuilder.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -928,6 +928,7 @@ func (b *NodeBuilder) getSymbolChain(symbol *ast.Symbol, meaning ast.SymbolFlags
928928
// parentChain root _is_ symbol - symbol is a module export=, so it kinda looks like it's own parent
929929
// No need to lookup an alias for the symbol in itself
930930
accessibleSymbolChain = parentChain
931+
break
931932
}
932933
}
933934
nextSyms := accessibleSymbolChain

internal/declarations/diagnostics.go

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -182,28 +182,16 @@ func createGetSymbolAccessibilityDiagnosticForNode(node *ast.Node) GetSymbolAcce
182182
return wrapSimpleDiagnosticSelector(node, func(_ *ast.Node, _ printer.SymbolAccessibilityResult) *diagnostics.Message {
183183
return diagnostics.Import_declaration_0_is_using_private_name_1
184184
})
185-
} else if ast.IsTypeAliasDeclaration(node) /*|| ast.IsJSDocTypeAlias(node)*/ { // !!! JSDoc support
185+
} else if ast.IsTypeAliasDeclaration(node) || ast.IsJSTypeAliasDeclaration(node) {
186186
// unique node selection behavior, inline closure
187187
return func(symbolAccessibilityResult printer.SymbolAccessibilityResult) *SymbolAccessibilityDiagnostic {
188188
diagnosticMessage := selectDiagnosticBasedOnModuleNameNoNameCheck(
189189
symbolAccessibilityResult,
190190
diagnostics.Exported_type_alias_0_has_or_is_using_private_name_1_from_module_2,
191191
diagnostics.Exported_type_alias_0_has_or_is_using_private_name_1,
192192
)
193-
var errorNode *ast.Node
194-
// !!! JSDoc Support
195-
////if ast.IsJSDocTypeAlias(node) {
196-
//// errorNode = node.AsJSDocTypedefTag().TypeExpression
197-
////} else {
198-
errorNode = node.AsTypeAliasDeclaration().Type
199-
////}
200-
var typeName *ast.Node
201-
// !!! JSDoc Support
202-
////if ast.IsJSDocTypeAlias(node) {
203-
//// errorNode = getNameOfDeclaration(node)
204-
////} else {
205-
typeName = node.Name()
206-
////}
193+
errorNode := node.AsTypeAliasDeclaration().Type
194+
typeName := node.Name()
207195
return &SymbolAccessibilityDiagnostic{
208196
errorNode: errorNode,
209197
diagnosticMessage: diagnosticMessage,
@@ -454,7 +442,7 @@ func getTypeParameterConstraintVisibilityDiagnosticMessage(node *ast.Node, symbo
454442
case ast.KindInferType:
455443
return diagnostics.Extends_clause_for_inferred_type_0_has_or_is_using_private_name_1
456444

457-
case ast.KindTypeAliasDeclaration:
445+
case ast.KindTypeAliasDeclaration, ast.KindJSTypeAliasDeclaration:
458446
return diagnostics.Type_parameter_0_of_exported_type_alias_has_or_is_using_private_name_1
459447

460448
default:

internal/declarations/transform.go

Lines changed: 88 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,13 @@ func (tx *DeclarationTransformer) visit(node *ast.Node) *ast.Node {
106106
ast.KindImportEqualsDeclaration,
107107
ast.KindInterfaceDeclaration,
108108
ast.KindClassDeclaration,
109+
ast.KindJSTypeAliasDeclaration,
109110
ast.KindTypeAliasDeclaration,
110111
ast.KindEnumDeclaration,
111112
ast.KindVariableStatement,
112113
ast.KindImportDeclaration,
113114
ast.KindExportDeclaration,
115+
ast.KindJSExportAssignment,
114116
ast.KindExportAssignment:
115117
return tx.visitDeclarationStatements(node)
116118
// statements we elide
@@ -133,8 +135,7 @@ func (tx *DeclarationTransformer) visit(node *ast.Node) *ast.Node {
133135
ast.KindWithStatement,
134136
ast.KindNotEmittedStatement,
135137
ast.KindBlock,
136-
ast.KindMissingDeclaration,
137-
ast.KindJSTypeAliasDeclaration: // !!! TODO: Jsdoc support
138+
ast.KindMissingDeclaration:
138139
return nil
139140
// parts of things, things we just visit children of
140141
default:
@@ -180,20 +181,15 @@ func (tx *DeclarationTransformer) collectFileReferences(sourceFile *ast.SourceFi
180181

181182
func (tx *DeclarationTransformer) transformSourceFile(node *ast.SourceFile) *ast.Node {
182183
var combinedStatements *ast.StatementList
183-
if ast.IsSourceFileJS(node) {
184-
// !!! TODO: JS declaration emit support
185-
combinedStatements = tx.Factory().NewNodeList([]*ast.Node{})
186-
} else {
187-
statements := tx.Visitor().VisitNodes(node.Statements)
188-
combinedStatements = tx.transformAndReplaceLatePaintedStatements(statements)
189-
combinedStatements.Loc = statements.Loc // setTextRange
190-
if ast.IsExternalModule(node) && (!tx.resultHasExternalModuleIndicator || (tx.needsScopeFixMarker && !tx.resultHasScopeMarker)) {
191-
marker := createEmptyExports(tx.Factory().AsNodeFactory())
192-
newList := append(combinedStatements.Nodes, marker)
193-
withMarker := tx.Factory().NewNodeList(newList)
194-
withMarker.Loc = combinedStatements.Loc
195-
combinedStatements = withMarker
196-
}
184+
statements := tx.Visitor().VisitNodes(node.Statements)
185+
combinedStatements = tx.transformAndReplaceLatePaintedStatements(statements)
186+
combinedStatements.Loc = statements.Loc // setTextRange
187+
if ast.IsExternalOrCommonJSModule(node) && (!tx.resultHasExternalModuleIndicator || (tx.needsScopeFixMarker && !tx.resultHasScopeMarker)) {
188+
marker := createEmptyExports(tx.Factory().AsNodeFactory())
189+
newList := append(combinedStatements.Nodes, marker)
190+
withMarker := tx.Factory().NewNodeList(newList)
191+
withMarker.Loc = combinedStatements.Loc
192+
combinedStatements = withMarker
197193
}
198194
outputFilePath := tspath.GetDirectoryPath(tspath.NormalizeSlashes(tx.declarationFilePath))
199195
result := tx.Factory().UpdateSourceFile(node, combinedStatements)
@@ -409,7 +405,7 @@ func (tx *DeclarationTransformer) visitDeclarationSubtree(input *ast.Node) *ast.
409405

410406
canProdiceDiagnostic := canProduceDiagnostics(input)
411407
oldWithinObjectLiteralType := tx.suppressNewDiagnosticContexts
412-
shouldEnterSuppressNewDiagnosticsContextContext := (input.Kind == ast.KindTypeLiteral || input.Kind == ast.KindMappedType) && input.Parent.Kind != ast.KindTypeAliasDeclaration
408+
shouldEnterSuppressNewDiagnosticsContextContext := (input.Kind == ast.KindTypeLiteral || input.Kind == ast.KindMappedType) && !(input.Parent.Kind == ast.KindTypeAliasDeclaration || input.Parent.Kind == ast.KindJSTypeAliasDeclaration)
413409

414410
oldDiag := tx.state.getSymbolAccessibilityDiagnostic
415411
if canProdiceDiagnostic && !tx.suppressNewDiagnosticContexts {
@@ -476,6 +472,22 @@ func (tx *DeclarationTransformer) visitDeclarationSubtree(input *ast.Node) *ast.
476472
tx.EmitContext().AddEmitFlags(result, printer.EFSingleLine)
477473
}
478474
}
475+
case ast.KindJSDocTypeExpression:
476+
result = tx.transformJSDocTypeExpression(input.AsJSDocTypeExpression())
477+
case ast.KindJSDocTypeLiteral:
478+
result = tx.transformJSDocTypeLiteral(input.AsJSDocTypeLiteral())
479+
case ast.KindJSDocPropertyTag:
480+
result = tx.transformJSDocPropertyTag(input.AsJSDocPropertyTag())
481+
case ast.KindJSDocAllType:
482+
result = tx.transformJSDocAllType(input.AsJSDocAllType())
483+
case ast.KindJSDocNullableType:
484+
result = tx.transformJSDocNullableType(input.AsJSDocNullableType())
485+
case ast.KindJSDocNonNullableType:
486+
result = tx.transformJSDocNonNullableType(input.AsJSDocNonNullableType())
487+
case ast.KindJSDocOptionalType:
488+
result = tx.transformJSDocOptionalType(input.AsJSDocOptionalType())
489+
case ast.KindJSDocVariadicType:
490+
result = tx.transformJSDocVariadicType(input.AsJSDocVariadicType())
479491
default:
480492
result = tx.Visitor().VisitEachChild(input)
481493
}
@@ -890,7 +902,7 @@ func (tx *DeclarationTransformer) visitDeclarationStatements(input *ast.Node) *a
890902
tx.rewriteModuleSpecifier(input, input.AsExportDeclaration().ModuleSpecifier),
891903
tx.tryGetResolutionModeOverride(input.AsExportDeclaration().Attributes),
892904
)
893-
case ast.KindExportAssignment:
905+
case ast.KindExportAssignment, ast.KindJSExportAssignment:
894906
if ast.IsSourceFile(input.Parent) {
895907
tx.resultHasExternalModuleIndicator = true
896908
}
@@ -1067,7 +1079,7 @@ func (tx *DeclarationTransformer) transformTopLevelDeclaration(input *ast.Node)
10671079

10681080
var result *ast.Node
10691081
switch input.Kind {
1070-
case ast.KindTypeAliasDeclaration:
1082+
case ast.KindTypeAliasDeclaration, ast.KindJSTypeAliasDeclaration:
10711083
result = tx.transformTypeAliasDeclaration(input.AsTypeAliasDeclaration())
10721084
case ast.KindInterfaceDeclaration:
10731085
result = tx.transformInterfaceDeclaration(input.AsInterfaceDeclaration())
@@ -1691,3 +1703,60 @@ func (tx *DeclarationTransformer) transformImportDeclaration(decl *ast.ImportDec
16911703
// Nothing visible
16921704
return nil
16931705
}
1706+
1707+
func (tx *DeclarationTransformer) transformJSDocTypeExpression(input *ast.JSDocTypeExpression) *ast.Node {
1708+
return tx.Visitor().Visit(input.Type)
1709+
}
1710+
1711+
func (tx *DeclarationTransformer) transformJSDocTypeLiteral(input *ast.JSDocTypeLiteral) *ast.Node {
1712+
members, _ := tx.Visitor().VisitSlice(input.JSDocPropertyTags)
1713+
replacement := tx.Factory().NewTypeLiteralNode(tx.Factory().NewNodeList(members))
1714+
tx.EmitContext().SetOriginal(replacement, input.AsNode())
1715+
return replacement
1716+
}
1717+
1718+
func (tx *DeclarationTransformer) transformJSDocPropertyTag(input *ast.JSDocPropertyTag) *ast.Node {
1719+
replacement := tx.Factory().NewPropertySignatureDeclaration(
1720+
nil,
1721+
tx.Visitor().Visit(input.TagName),
1722+
nil,
1723+
tx.Visitor().Visit(input.TypeExpression),
1724+
nil,
1725+
)
1726+
tx.EmitContext().SetOriginal(replacement, input.AsNode())
1727+
return replacement
1728+
}
1729+
1730+
func (tx *DeclarationTransformer) transformJSDocAllType(input *ast.JSDocAllType) *ast.Node {
1731+
replacement := tx.Factory().NewKeywordTypeNode(ast.KindAnyKeyword)
1732+
tx.EmitContext().SetOriginal(replacement, input.AsNode())
1733+
return replacement
1734+
}
1735+
1736+
func (tx *DeclarationTransformer) transformJSDocNullableType(input *ast.JSDocNullableType) *ast.Node {
1737+
replacement := tx.Factory().NewUnionTypeNode(tx.Factory().NewNodeList([]*ast.Node{
1738+
tx.Visitor().Visit(input.Type),
1739+
tx.Factory().NewLiteralTypeNode(tx.Factory().NewKeywordExpression(ast.KindNullKeyword)),
1740+
}))
1741+
tx.EmitContext().SetOriginal(replacement, input.AsNode())
1742+
return replacement
1743+
}
1744+
1745+
func (tx *DeclarationTransformer) transformJSDocNonNullableType(input *ast.JSDocNonNullableType) *ast.Node {
1746+
return tx.Visitor().Visit(input.Type)
1747+
}
1748+
1749+
func (tx *DeclarationTransformer) transformJSDocVariadicType(input *ast.JSDocVariadicType) *ast.Node {
1750+
replacement := tx.Factory().NewArrayTypeNode(tx.Visitor().Visit(input.Type))
1751+
tx.EmitContext().SetOriginal(replacement, input.AsNode())
1752+
return replacement
1753+
}
1754+
1755+
func (tx *DeclarationTransformer) transformJSDocOptionalType(input *ast.JSDocOptionalType) *ast.Node {
1756+
replacement := tx.Factory().NewUnionTypeNode(tx.Factory().NewNodeList([]*ast.Node{
1757+
tx.Visitor().Visit(input.Type),
1758+
tx.Factory().NewKeywordTypeNode(ast.KindUndefinedKeyword),
1759+
}))
1760+
tx.EmitContext().SetOriginal(replacement, input.AsNode())
1761+
return replacement
1762+
}

internal/declarations/util.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ func canProduceDiagnostics(node *ast.Node) bool {
3939
ast.IsExpressionWithTypeArguments(node) ||
4040
ast.IsImportEqualsDeclaration(node) ||
4141
ast.IsTypeAliasDeclaration(node) ||
42+
ast.IsJSTypeAliasDeclaration(node) ||
4243
ast.IsConstructorDeclaration(node) ||
4344
ast.IsIndexSignatureDeclaration(node) ||
4445
ast.IsPropertyAccessExpression(node) ||
@@ -59,6 +60,7 @@ func hasInferredType(node *ast.Node) bool {
5960
ast.KindBinaryExpression,
6061
ast.KindVariableDeclaration,
6162
ast.KindExportAssignment,
63+
ast.KindJSExportAssignment,
6264
ast.KindPropertyAssignment,
6365
ast.KindShorthandPropertyAssignment,
6466
ast.KindJSDocParameterTag,
@@ -78,6 +80,7 @@ func isDeclarationAndNotVisible(emitContext *printer.EmitContext, resolver print
7880
ast.KindInterfaceDeclaration,
7981
ast.KindClassDeclaration,
8082
ast.KindTypeAliasDeclaration,
83+
ast.KindJSTypeAliasDeclaration,
8184
ast.KindEnumDeclaration:
8285
return !resolver.IsDeclarationVisible(node)
8386
// The following should be doing their own visibility checks based on filtering their members
@@ -86,6 +89,7 @@ func isDeclarationAndNotVisible(emitContext *printer.EmitContext, resolver print
8689
case ast.KindImportEqualsDeclaration,
8790
ast.KindImportDeclaration,
8891
ast.KindExportDeclaration,
92+
ast.KindJSExportAssignment,
8993
ast.KindExportAssignment:
9094
return false
9195
case ast.KindClassStaticBlockDeclaration:
@@ -119,6 +123,7 @@ func getBindingNameVisible(resolver printer.EmitResolver, elem *ast.Node) bool {
119123
func isEnclosingDeclaration(node *ast.Node) bool {
120124
return ast.IsSourceFile(node) ||
121125
ast.IsTypeAliasDeclaration(node) ||
126+
ast.IsJSTypeAliasDeclaration(node) ||
122127
ast.IsModuleDeclaration(node) ||
123128
ast.IsClassDeclaration(node) ||
124129
ast.IsInterfaceDeclaration(node) ||

0 commit comments

Comments
 (0)