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() }