package compiler import ( "context" "efprojects.com/kitten-ipc/kitcom/internal/tsgo/ast" "efprojects.com/kitten-ipc/kitcom/internal/tsgo/core" "efprojects.com/kitten-ipc/kitcom/internal/tsgo/module" "efprojects.com/kitten-ipc/kitcom/internal/tsgo/modulespecifiers" "efprojects.com/kitten-ipc/kitcom/internal/tsgo/outputpaths" "efprojects.com/kitten-ipc/kitcom/internal/tsgo/printer" "efprojects.com/kitten-ipc/kitcom/internal/tsgo/transformers/declarations" "efprojects.com/kitten-ipc/kitcom/internal/tsgo/tsoptions" "efprojects.com/kitten-ipc/kitcom/internal/tsgo/tspath" ) // NOTE: EmitHost operations must be thread-safe type EmitHost interface { printer.EmitHost declarations.DeclarationEmitHost Options() *core.CompilerOptions SourceFiles() []*ast.SourceFile UseCaseSensitiveFileNames() bool GetCurrentDirectory() string CommonSourceDirectory() string IsEmitBlocked(file string) bool } var _ EmitHost = (*emitHost)(nil) // NOTE: emitHost operations must be thread-safe type emitHost struct { program *Program emitResolver printer.EmitResolver } func newEmitHost(ctx context.Context, program *Program, file *ast.SourceFile) (*emitHost, func()) { checker, done := program.GetTypeCheckerForFile(ctx, file) return &emitHost{ program: program, emitResolver: checker.GetEmitResolver(), }, done } func (host *emitHost) GetModeForUsageLocation(file ast.HasFileName, moduleSpecifier *ast.StringLiteralLike) core.ResolutionMode { return host.program.GetModeForUsageLocation(file, moduleSpecifier) } func (host *emitHost) GetResolvedModuleFromModuleSpecifier(file ast.HasFileName, moduleSpecifier *ast.StringLiteralLike) *module.ResolvedModule { return host.program.GetResolvedModuleFromModuleSpecifier(file, moduleSpecifier) } func (host *emitHost) GetDefaultResolutionModeForFile(file ast.HasFileName) core.ResolutionMode { return host.program.GetDefaultResolutionModeForFile(file) } func (host *emitHost) GetEmitModuleFormatOfFile(file ast.HasFileName) core.ModuleKind { return host.program.GetEmitModuleFormatOfFile(file) } func (host *emitHost) FileExists(path string) bool { return host.program.FileExists(path) } func (host *emitHost) GetGlobalTypingsCacheLocation() string { return host.program.GetGlobalTypingsCacheLocation() } func (host *emitHost) GetNearestAncestorDirectoryWithPackageJson(dirname string) string { return host.program.GetNearestAncestorDirectoryWithPackageJson(dirname) } func (host *emitHost) GetPackageJsonInfo(pkgJsonPath string) modulespecifiers.PackageJsonInfo { return host.program.GetPackageJsonInfo(pkgJsonPath) } func (host *emitHost) GetSourceOfProjectReferenceIfOutputIncluded(file ast.HasFileName) string { return host.program.GetSourceOfProjectReferenceIfOutputIncluded(file) } func (host *emitHost) GetProjectReferenceFromSource(path tspath.Path) *tsoptions.SourceOutputAndProjectReference { return host.program.GetProjectReferenceFromSource(path) } func (host *emitHost) GetRedirectTargets(path tspath.Path) []string { return host.program.GetRedirectTargets(path) } func (host *emitHost) GetEffectiveDeclarationFlags(node *ast.Node, flags ast.ModifierFlags) ast.ModifierFlags { return host.GetEmitResolver().GetEffectiveDeclarationFlags(node, flags) } func (host *emitHost) GetOutputPathsFor(file *ast.SourceFile, forceDtsPaths bool) declarations.OutputPaths { // TODO: cache return outputpaths.GetOutputPathsFor(file, host.Options(), host, forceDtsPaths) } func (host *emitHost) GetResolutionModeOverride(node *ast.Node) core.ResolutionMode { return host.GetEmitResolver().GetResolutionModeOverride(node) } func (host *emitHost) GetSourceFileFromReference(origin *ast.SourceFile, ref *ast.FileReference) *ast.SourceFile { return host.program.GetSourceFileFromReference(origin, ref) } func (host *emitHost) Options() *core.CompilerOptions { return host.program.Options() } func (host *emitHost) SourceFiles() []*ast.SourceFile { return host.program.SourceFiles() } func (host *emitHost) GetCurrentDirectory() string { return host.program.GetCurrentDirectory() } func (host *emitHost) CommonSourceDirectory() string { return host.program.CommonSourceDirectory() } func (host *emitHost) UseCaseSensitiveFileNames() bool { return host.program.UseCaseSensitiveFileNames() } func (host *emitHost) IsEmitBlocked(file string) bool { return host.program.IsEmitBlocked(file) } func (host *emitHost) WriteFile(fileName string, text string, writeByteOrderMark bool) error { return host.program.Host().FS().WriteFile(fileName, text, writeByteOrderMark) } func (host *emitHost) GetEmitResolver() printer.EmitResolver { return host.emitResolver } func (host *emitHost) IsSourceFileFromExternalLibrary(file *ast.SourceFile) bool { return host.program.IsSourceFileFromExternalLibrary(file) }