vendor tsgo
This commit is contained in:
236
tools/tsgo/internal/ls/autoimport/aliasresolver.go
Normal file
236
tools/tsgo/internal/ls/autoimport/aliasresolver.go
Normal file
@@ -0,0 +1,236 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user