59 lines
1.8 KiB
Go
59 lines
1.8 KiB
Go
package moduletransforms
|
|
|
|
import (
|
|
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/ast"
|
|
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/binder"
|
|
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/core"
|
|
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/transformers"
|
|
)
|
|
|
|
type ImpliedModuleTransformer struct {
|
|
transformers.Transformer
|
|
opts *transformers.TransformOptions
|
|
resolver binder.ReferenceResolver
|
|
getEmitModuleFormatOfFile func(file ast.HasFileName) core.ModuleKind
|
|
cjsTransformer *transformers.Transformer
|
|
esmTransformer *transformers.Transformer
|
|
}
|
|
|
|
func NewImpliedModuleTransformer(opts *transformers.TransformOptions) *transformers.Transformer {
|
|
compilerOptions := opts.CompilerOptions
|
|
resolver := opts.Resolver
|
|
if resolver == nil {
|
|
resolver = binder.NewReferenceResolver(compilerOptions, binder.ReferenceResolverHooks{})
|
|
}
|
|
tx := &ImpliedModuleTransformer{opts: opts, resolver: resolver, getEmitModuleFormatOfFile: opts.GetEmitModuleFormatOfFile}
|
|
return tx.NewTransformer(tx.visit, opts.Context)
|
|
}
|
|
|
|
func (tx *ImpliedModuleTransformer) visit(node *ast.Node) *ast.Node {
|
|
switch node.Kind {
|
|
case ast.KindSourceFile:
|
|
node = tx.visitSourceFile(node.AsSourceFile())
|
|
}
|
|
return node
|
|
}
|
|
|
|
func (tx *ImpliedModuleTransformer) visitSourceFile(node *ast.SourceFile) *ast.Node {
|
|
if node.IsDeclarationFile {
|
|
return node.AsNode()
|
|
}
|
|
|
|
format := tx.getEmitModuleFormatOfFile(node)
|
|
|
|
var transformer *transformers.Transformer
|
|
if format >= core.ModuleKindES2015 {
|
|
if tx.esmTransformer == nil {
|
|
tx.esmTransformer = NewESModuleTransformer(tx.opts)
|
|
}
|
|
transformer = tx.esmTransformer
|
|
} else {
|
|
if tx.cjsTransformer == nil {
|
|
tx.cjsTransformer = NewCommonJSModuleTransformer(tx.opts)
|
|
}
|
|
transformer = tx.cjsTransformer
|
|
}
|
|
|
|
return transformer.TransformSourceFile(node).AsNode()
|
|
}
|