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  }