Permissions of sections in other modules are respected

This commit is contained in:
Sasha Koshka 2022-10-12 15:48:22 -04:00
parent 15fa122547
commit aaf268d0d1
2 changed files with 24 additions and 7 deletions

View File

@ -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
}

View File

@ -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
}