diff --git a/analyzer/analyzer.go b/analyzer/analyzer.go index ed4ad73..1f9ecd8 100644 --- a/analyzer/analyzer.go +++ b/analyzer/analyzer.go @@ -136,22 +136,25 @@ func (analyzer *analysisOperation) fetchSection ( // of whatever module is currently being analyzed. The identifier in question // may have more items than 1 or 2, but those will be ignored. This method // "consumes" items from the identifier, it will return an identifier without -// those items. +// those items. If the section comes from a different module (and permissions +// should therefore be respected), external will be set to true. func (analyzer *analysisOperation) fetchSectionFromIdentifier ( which parser.Identifier, ) ( - section Section, - bitten parser.Identifier, - err error, + section Section, + external bool, + bitten parser.Identifier, + err error, ) { item, bitten := which.Bite() - + path, exists := analyzer.currentTree.ResolveRequire(item) if exists { // we have our module path, so get the section name item, bitten = bitten.Bite() + external = true } else { - // that wasn't a module name, so the module path must be the our + // that wasn't a module name, so the module path must be our // current one path = analyzer.currentPosition.modulePath } diff --git a/analyzer/type.go b/analyzer/type.go index 57f921b..8c26125 100644 --- a/analyzer/type.go +++ b/analyzer/type.go @@ -1,6 +1,7 @@ package analyzer import "fmt" +import "git.tebibyte.media/arf/arf/types" import "git.tebibyte.media/arf/arf/parser" import "git.tebibyte.media/arf/arf/infoerr" @@ -185,15 +186,19 @@ func (analyzer analysisOperation) analyzeType ( return } - // analyze type this type points to, if it exists if inputType.Kind() != parser.TypeKindBasic { + // analyze type this type points to, if it exists var points Type points, err = analyzer.analyzeType(inputType.Points()) outputType.points = &points } else { + // analyze the type section this type uses var bitten parser.Identifier + var external bool var actual Section + actual, + external, bitten, err = analyzer.fetchSectionFromIdentifier(inputType.Name()) if err != nil { return } @@ -213,6 +218,14 @@ func (analyzer analysisOperation) analyzeType ( infoerr.ErrorKindError) return } + + if external && actual.Permission() == types.PermissionPrivate { + err = bitten.NewError( + "this type is private, and cannot be used " + + "outside of its module", + infoerr.ErrorKindError) + return + } if bitten.Length() > 0 { err = bitten.NewError( @@ -223,6 +236,7 @@ func (analyzer analysisOperation) analyzeType ( } // TODO + // TODO: figure out what todo ??? return }