68 lines
1.9 KiB
Go
68 lines
1.9 KiB
Go
package ls
|
|
|
|
import (
|
|
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/ast"
|
|
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/compiler"
|
|
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/lsp/lsproto"
|
|
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/sourcemap"
|
|
)
|
|
|
|
type LanguageService struct {
|
|
host Host
|
|
program *compiler.Program
|
|
converters *Converters
|
|
documentPositionMappers map[string]*sourcemap.DocumentPositionMapper
|
|
}
|
|
|
|
func NewLanguageService(
|
|
program *compiler.Program,
|
|
host Host,
|
|
) *LanguageService {
|
|
return &LanguageService{
|
|
host: host,
|
|
program: program,
|
|
converters: host.Converters(),
|
|
documentPositionMappers: map[string]*sourcemap.DocumentPositionMapper{},
|
|
}
|
|
}
|
|
|
|
func (l *LanguageService) GetProgram() *compiler.Program {
|
|
return l.program
|
|
}
|
|
|
|
func (l *LanguageService) tryGetProgramAndFile(fileName string) (*compiler.Program, *ast.SourceFile) {
|
|
program := l.GetProgram()
|
|
file := program.GetSourceFile(fileName)
|
|
return program, file
|
|
}
|
|
|
|
func (l *LanguageService) getProgramAndFile(documentURI lsproto.DocumentUri) (*compiler.Program, *ast.SourceFile) {
|
|
fileName := documentURI.FileName()
|
|
program, file := l.tryGetProgramAndFile(fileName)
|
|
if file == nil {
|
|
panic("file not found: " + fileName)
|
|
}
|
|
return program, file
|
|
}
|
|
|
|
func (l *LanguageService) GetDocumentPositionMapper(fileName string) *sourcemap.DocumentPositionMapper {
|
|
d, ok := l.documentPositionMappers[fileName]
|
|
if !ok {
|
|
d = sourcemap.GetDocumentPositionMapper(l, fileName)
|
|
l.documentPositionMappers[fileName] = d
|
|
}
|
|
return d
|
|
}
|
|
|
|
func (l *LanguageService) ReadFile(fileName string) (string, bool) {
|
|
return l.host.ReadFile(fileName)
|
|
}
|
|
|
|
func (l *LanguageService) UseCaseSensitiveFileNames() bool {
|
|
return l.host.UseCaseSensitiveFileNames()
|
|
}
|
|
|
|
func (l *LanguageService) GetECMALineInfo(fileName string) *sourcemap.ECMALineInfo {
|
|
return l.host.GetECMALineInfo(fileName)
|
|
}
|