45 lines
1.4 KiB
Go
45 lines
1.4 KiB
Go
package ls
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/ast"
|
|
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/astnav"
|
|
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/checker"
|
|
)
|
|
|
|
var (
|
|
ErrNoSourceFile = errors.New("source file not found")
|
|
ErrNoTokenAtPosition = errors.New("no token found at position")
|
|
)
|
|
|
|
func (l *LanguageService) GetSymbolAtPosition(ctx context.Context, fileName string, position int) (*ast.Symbol, error) {
|
|
program, file := l.tryGetProgramAndFile(fileName)
|
|
if file == nil {
|
|
return nil, fmt.Errorf("%w: %s", ErrNoSourceFile, fileName)
|
|
}
|
|
node := astnav.GetTokenAtPosition(file, position)
|
|
if node == nil {
|
|
return nil, fmt.Errorf("%w: %s:%d", ErrNoTokenAtPosition, fileName, position)
|
|
}
|
|
checker, done := program.GetTypeCheckerForFile(ctx, file)
|
|
defer done()
|
|
return checker.GetSymbolAtLocation(node), nil
|
|
}
|
|
|
|
func (l *LanguageService) GetSymbolAtLocation(ctx context.Context, node *ast.Node) *ast.Symbol {
|
|
program := l.GetProgram()
|
|
checker, done := program.GetTypeCheckerForFile(ctx, ast.GetSourceFileOfNode(node))
|
|
defer done()
|
|
return checker.GetSymbolAtLocation(node)
|
|
}
|
|
|
|
func (l *LanguageService) GetTypeOfSymbol(ctx context.Context, symbol *ast.Symbol) *checker.Type {
|
|
program := l.GetProgram()
|
|
checker, done := program.GetTypeChecker(ctx)
|
|
defer done()
|
|
return checker.GetTypeOfSymbolAtLocation(symbol, nil)
|
|
}
|