github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/cmd/lsp/indexer/indexer.go (about) 1 package indexer 2 3 import ( 4 "context" 5 "fmt" 6 7 "github.com/nevalang/neva/internal/builder" 8 "github.com/nevalang/neva/internal/compiler" 9 "github.com/nevalang/neva/internal/compiler/analyzer" 10 "github.com/nevalang/neva/internal/compiler/desugarer" 11 "github.com/nevalang/neva/internal/compiler/parser" 12 src "github.com/nevalang/neva/internal/compiler/sourcecode" 13 ) 14 15 type Indexer struct { 16 builder builder.Builder 17 parser parser.Parser 18 desugarer desugarer.Desugarer 19 analyzer analyzer.Analyzer 20 } 21 22 func (i Indexer) FullIndex(ctx context.Context, path string) (src.Build, *compiler.Error, error) { 23 rawBuild, _, err := i.builder.Build(ctx, path) 24 if err != nil { 25 return src.Build{}, nil, fmt.Errorf("builder: %w", err) 26 } 27 28 parsedMods, err := i.parser.ParseModules(rawBuild.Modules) 29 if err != nil { 30 return src.Build{}, nil, fmt.Errorf("parse prog: %w", err) 31 } 32 33 parsedBuild := src.Build{ 34 EntryModRef: rawBuild.EntryModRef, 35 Modules: parsedMods, 36 } 37 38 _, err = i.analyzer.AnalyzeBuild(parsedBuild) 39 if err == nil { 40 return parsedBuild, nil, nil 41 } 42 43 return parsedBuild, err, nil 44 } 45 46 func New( 47 builder builder.Builder, 48 parser parser.Parser, 49 desugarer desugarer.Desugarer, 50 analyzer analyzer.Analyzer, 51 ) Indexer { 52 return Indexer{ 53 builder: builder, 54 parser: parser, 55 desugarer: desugarer, 56 analyzer: analyzer, 57 } 58 }