github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/internal/compiler/analyzer/main_pkg.go (about)

     1  package analyzer
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  
     7  	"github.com/nevalang/neva/internal/compiler"
     8  	src "github.com/nevalang/neva/internal/compiler/sourcecode"
     9  )
    10  
    11  var (
    12  	ErrMainEntityNotFound       = errors.New("Main entity is not found")
    13  	ErrMainEntityIsNotComponent = errors.New("Main entity is not a component")
    14  	ErrMainEntityExported       = errors.New("Main entity cannot be exported")
    15  	ErrMainPkgExports           = errors.New("Main package must cannot have exported entities")
    16  )
    17  
    18  func (a Analyzer) mainSpecificPkgValidation(mainPkgName string, mod src.Module, scope src.Scope) *compiler.Error {
    19  	mainPkg := mod.Packages[mainPkgName]
    20  
    21  	location := &src.Location{
    22  		ModRef:  scope.Location.ModRef,
    23  		PkgName: mainPkgName,
    24  	}
    25  
    26  	entityMain, filename, ok := mainPkg.Entity("Main")
    27  	if !ok {
    28  		return &compiler.Error{
    29  			Err:      ErrMainEntityNotFound,
    30  			Location: location,
    31  		}
    32  	}
    33  
    34  	location.FileName = filename
    35  
    36  	if entityMain.Kind != src.ComponentEntity {
    37  		return &compiler.Error{
    38  			Err:      ErrMainEntityIsNotComponent,
    39  			Location: location,
    40  		}
    41  	}
    42  
    43  	if entityMain.IsPublic {
    44  		return &compiler.Error{
    45  			Err:      ErrMainEntityExported,
    46  			Location: location,
    47  			Meta:     &entityMain.Component.Meta,
    48  		}
    49  	}
    50  
    51  	scope = scope.WithLocation(*location)
    52  
    53  	if err := a.analyzeMainComponent(entityMain.Component, scope); err != nil {
    54  		return compiler.Error{
    55  			Location: location,
    56  			Meta:     &entityMain.Component.Meta,
    57  		}.Wrap(err)
    58  	}
    59  
    60  	if err := mainPkg.Entities(func(entity src.Entity, entityName, _ string) error {
    61  		if entity.IsPublic {
    62  			return &compiler.Error{
    63  				Err:      fmt.Errorf("%w: exported entity %v", ErrMainPkgExports, entityName),
    64  				Meta:     entity.Meta(),
    65  				Location: location,
    66  			}
    67  		}
    68  		return nil
    69  	}); err != nil {
    70  		return err.(*compiler.Error) //nolint:forcetypeassert
    71  	}
    72  
    73  	return nil
    74  }