237 lines
8.2 KiB
Go
237 lines
8.2 KiB
Go
package autoimport
|
|
|
|
import (
|
|
"github.com/microsoft/typescript-go/internal/ast"
|
|
"github.com/microsoft/typescript-go/internal/binder"
|
|
"github.com/microsoft/typescript-go/internal/checker"
|
|
"github.com/microsoft/typescript-go/internal/collections"
|
|
"github.com/microsoft/typescript-go/internal/core"
|
|
"github.com/microsoft/typescript-go/internal/module"
|
|
"github.com/microsoft/typescript-go/internal/packagejson"
|
|
"github.com/microsoft/typescript-go/internal/symlinks"
|
|
"github.com/microsoft/typescript-go/internal/tsoptions"
|
|
"github.com/microsoft/typescript-go/internal/tspath"
|
|
)
|
|
|
|
type pathAndFileName struct {
|
|
path tspath.Path
|
|
fileName string
|
|
}
|
|
|
|
type aliasResolver struct {
|
|
toPath func(fileName string) tspath.Path
|
|
host RegistryCloneHost
|
|
moduleResolver *module.Resolver
|
|
|
|
rootFiles []*ast.SourceFile
|
|
// symlinks maps from realpath to symlinked path and file name
|
|
symlinks map[tspath.Path]pathAndFileName
|
|
onFailedAmbientModuleLookup func(source ast.HasFileName, moduleName string)
|
|
resolvedModules collections.SyncMap[tspath.Path, *collections.SyncMap[module.ModeAwareCacheKey, *module.ResolvedModule]]
|
|
}
|
|
|
|
func newAliasResolver(
|
|
rootFiles []*ast.SourceFile,
|
|
symlinks map[tspath.Path]pathAndFileName,
|
|
host RegistryCloneHost,
|
|
moduleResolver *module.Resolver,
|
|
toPath func(fileName string) tspath.Path,
|
|
onFailedAmbientModuleLookup func(source ast.HasFileName, moduleName string),
|
|
) *aliasResolver {
|
|
r := &aliasResolver{
|
|
toPath: toPath,
|
|
host: host,
|
|
moduleResolver: moduleResolver,
|
|
rootFiles: rootFiles,
|
|
symlinks: symlinks,
|
|
onFailedAmbientModuleLookup: onFailedAmbientModuleLookup,
|
|
}
|
|
return r
|
|
}
|
|
|
|
// BindSourceFiles implements checker.Program.
|
|
func (r *aliasResolver) BindSourceFiles() {
|
|
// We will bind as we parse
|
|
}
|
|
|
|
// SourceFiles implements checker.Program.
|
|
func (r *aliasResolver) SourceFiles() []*ast.SourceFile {
|
|
return r.rootFiles
|
|
}
|
|
|
|
// Options implements checker.Program.
|
|
func (r *aliasResolver) Options() *core.CompilerOptions {
|
|
return &core.CompilerOptions{
|
|
NoCheck: core.TSTrue,
|
|
}
|
|
}
|
|
|
|
// GetCurrentDirectory implements checker.Program.
|
|
func (r *aliasResolver) GetCurrentDirectory() string {
|
|
return r.host.GetCurrentDirectory()
|
|
}
|
|
|
|
// UseCaseSensitiveFileNames implements checker.Program.
|
|
func (r *aliasResolver) UseCaseSensitiveFileNames() bool {
|
|
return r.host.FS().UseCaseSensitiveFileNames()
|
|
}
|
|
|
|
// GetSourceFile implements checker.Program.
|
|
func (r *aliasResolver) GetSourceFile(fileName string) *ast.SourceFile {
|
|
file := r.host.GetSourceFile(fileName, r.toPath(fileName))
|
|
// file may be nil due to symlink/realpath mismatch; see TestAutoImportBuilderFS
|
|
if file == nil {
|
|
return nil
|
|
}
|
|
binder.BindSourceFile(file)
|
|
return file
|
|
}
|
|
|
|
// GetDefaultResolutionModeForFile implements checker.Program.
|
|
func (r *aliasResolver) GetDefaultResolutionModeForFile(file ast.HasFileName) core.ResolutionMode {
|
|
return core.ModuleKindESNext
|
|
}
|
|
|
|
// GetEmitModuleFormatOfFile implements checker.Program.
|
|
func (r *aliasResolver) GetEmitModuleFormatOfFile(sourceFile ast.HasFileName) core.ModuleKind {
|
|
return core.ModuleKindESNext
|
|
}
|
|
|
|
// GetEmitSyntaxForUsageLocation implements checker.Program.
|
|
func (r *aliasResolver) GetEmitSyntaxForUsageLocation(sourceFile ast.HasFileName, usageLocation *ast.StringLiteralLike) core.ResolutionMode {
|
|
return core.ModuleKindESNext
|
|
}
|
|
|
|
// GetImpliedNodeFormatForEmit implements checker.Program.
|
|
func (r *aliasResolver) GetImpliedNodeFormatForEmit(sourceFile ast.HasFileName) core.ModuleKind {
|
|
return core.ModuleKindESNext
|
|
}
|
|
|
|
// GetModeForUsageLocation implements checker.Program.
|
|
func (r *aliasResolver) GetModeForUsageLocation(file ast.HasFileName, moduleSpecifier *ast.StringLiteralLike) core.ResolutionMode {
|
|
return core.ModuleKindESNext
|
|
}
|
|
|
|
// GetResolvedModule implements checker.Program.
|
|
func (r *aliasResolver) GetResolvedModule(currentSourceFile ast.HasFileName, moduleReference string, mode core.ResolutionMode) *module.ResolvedModule {
|
|
cache, _ := r.resolvedModules.LoadOrStore(currentSourceFile.Path(), &collections.SyncMap[module.ModeAwareCacheKey, *module.ResolvedModule]{})
|
|
if resolved, ok := cache.Load(module.ModeAwareCacheKey{Name: moduleReference, Mode: mode}); ok {
|
|
return resolved
|
|
}
|
|
resolved, _ := r.moduleResolver.ResolveModuleName(moduleReference, currentSourceFile.FileName(), mode, nil)
|
|
resolved, _ = cache.LoadOrStore(module.ModeAwareCacheKey{Name: moduleReference, Mode: mode}, resolved)
|
|
if !resolved.IsResolved() && !tspath.PathIsRelative(moduleReference) {
|
|
r.onFailedAmbientModuleLookup(currentSourceFile, moduleReference)
|
|
}
|
|
return resolved
|
|
}
|
|
|
|
// GetSourceFileForResolvedModule implements checker.Program.
|
|
func (r *aliasResolver) GetSourceFileForResolvedModule(fileName string) *ast.SourceFile {
|
|
return r.GetSourceFile(fileName)
|
|
}
|
|
|
|
// GetResolvedModules implements checker.Program.
|
|
func (r *aliasResolver) GetResolvedModules() map[tspath.Path]module.ModeAwareCache[*module.ResolvedModule] {
|
|
// only used when producing diagnostics, which hopefully the checker won't do
|
|
return nil
|
|
}
|
|
|
|
// ---
|
|
|
|
// GetSymlinkCache implements checker.Program.
|
|
func (r *aliasResolver) GetSymlinkCache() *symlinks.KnownSymlinks {
|
|
panic("unimplemented")
|
|
}
|
|
|
|
// GetSourceFileMetaData implements checker.Program.
|
|
func (r *aliasResolver) GetSourceFileMetaData(path tspath.Path) ast.SourceFileMetaData {
|
|
panic("unimplemented")
|
|
}
|
|
|
|
// CommonSourceDirectory implements checker.Program.
|
|
func (r *aliasResolver) CommonSourceDirectory() string {
|
|
panic("unimplemented")
|
|
}
|
|
|
|
// FileExists implements checker.Program.
|
|
func (r *aliasResolver) FileExists(fileName string) bool {
|
|
panic("unimplemented")
|
|
}
|
|
|
|
// GetGlobalTypingsCacheLocation implements checker.Program.
|
|
func (r *aliasResolver) GetGlobalTypingsCacheLocation() string {
|
|
panic("unimplemented")
|
|
}
|
|
|
|
// GetImportHelpersImportSpecifier implements checker.Program.
|
|
func (r *aliasResolver) GetImportHelpersImportSpecifier(path tspath.Path) *ast.Node {
|
|
panic("unimplemented")
|
|
}
|
|
|
|
// GetJSXRuntimeImportSpecifier implements checker.Program.
|
|
func (r *aliasResolver) GetJSXRuntimeImportSpecifier(path tspath.Path) (moduleReference string, specifier *ast.Node) {
|
|
panic("unimplemented")
|
|
}
|
|
|
|
// GetNearestAncestorDirectoryWithPackageJson implements checker.Program.
|
|
func (r *aliasResolver) GetNearestAncestorDirectoryWithPackageJson(dirname string) string {
|
|
panic("unimplemented")
|
|
}
|
|
|
|
// GetPackageJsonInfo implements checker.Program.
|
|
func (r *aliasResolver) GetPackageJsonInfo(pkgJsonPath string) *packagejson.InfoCacheEntry {
|
|
panic("unimplemented")
|
|
}
|
|
|
|
// GetProjectReferenceFromOutputDts implements checker.Program.
|
|
func (r *aliasResolver) GetProjectReferenceFromOutputDts(path tspath.Path) *tsoptions.SourceOutputAndProjectReference {
|
|
panic("unimplemented")
|
|
}
|
|
|
|
// GetProjectReferenceFromSource implements checker.Program.
|
|
func (r *aliasResolver) GetProjectReferenceFromSource(path tspath.Path) *tsoptions.SourceOutputAndProjectReference {
|
|
panic("unimplemented")
|
|
}
|
|
|
|
// GetRedirectForResolution implements checker.Program.
|
|
func (r *aliasResolver) GetRedirectForResolution(file ast.HasFileName) *tsoptions.ParsedCommandLine {
|
|
panic("unimplemented")
|
|
}
|
|
|
|
// GetRedirectTargets implements checker.Program.
|
|
func (r *aliasResolver) GetRedirectTargets(path tspath.Path) []string {
|
|
panic("unimplemented")
|
|
}
|
|
|
|
// GetResolvedModuleFromModuleSpecifier implements checker.Program.
|
|
func (r *aliasResolver) GetResolvedModuleFromModuleSpecifier(file ast.HasFileName, moduleSpecifier *ast.StringLiteralLike) *module.ResolvedModule {
|
|
panic("unimplemented")
|
|
}
|
|
|
|
// GetSourceOfProjectReferenceIfOutputIncluded implements checker.Program.
|
|
func (r *aliasResolver) GetSourceOfProjectReferenceIfOutputIncluded(file ast.HasFileName) string {
|
|
panic("unimplemented")
|
|
}
|
|
|
|
// IsSourceFileDefaultLibrary implements checker.Program.
|
|
func (r *aliasResolver) IsSourceFileDefaultLibrary(path tspath.Path) bool {
|
|
return false
|
|
}
|
|
|
|
// IsSourceFromProjectReference implements checker.Program.
|
|
func (r *aliasResolver) IsSourceFromProjectReference(path tspath.Path) bool {
|
|
panic("unimplemented")
|
|
}
|
|
|
|
// SourceFileMayBeEmitted implements checker.Program.
|
|
func (r *aliasResolver) SourceFileMayBeEmitted(sourceFile *ast.SourceFile, forceDtsEmit bool) bool {
|
|
panic("unimplemented")
|
|
}
|
|
|
|
func (r *aliasResolver) GetPackagesMap() map[string]bool {
|
|
return nil
|
|
}
|
|
|
|
var _ checker.Program = (*aliasResolver)(nil)
|