2025-10-15 10:12:44 +03:00

129 lines
4.7 KiB
Go

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