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

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