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 }