Added some permission checks

This commit is contained in:
Sasha Koshka 2022-10-13 02:20:47 -04:00
parent ae50fab159
commit b8693af68b
4 changed files with 53 additions and 3 deletions

View File

@ -249,6 +249,19 @@ func (analyzer *analysisOperation) typeCheck (
return
}
// inCurrentModule returns whether or not the specified section resides within
// the current module.
func (analyzer *analysisOperation) inCurrentModule (
section Section,
) (
inCurrent bool,
){
inCurrent =
section.locator().modulePath ==
analyzer.currentPosition.modulePath
return
}
// doIndent perfroms a fmt.Sprint operation on input, indenting the string. This
// does not add a trailing newline.
func doIndent (indent int, input ...any) (output string) {

View File

@ -169,6 +169,8 @@ func (analyzer *analysisOperation) analyzeObjectMembers (
err error,
) {
inheritedSection := into.what.actual
inheritsFromSameModule := analyzer.inCurrentModule(inheritedSection)
for index := 0; index < from.MembersLength(); index ++ {
inputMember := from.Member(index)
@ -185,6 +187,20 @@ func (analyzer *analysisOperation) analyzeObjectMembers (
// modifying default value/permissions of an
// inherited member
canAccessMember :=
inheritsFromSameModule ||
inheritedMember.permission !=
types.PermissionPrivate
if !canAccessMember {
err = inputMember.NewError (
"inherited member is private (pv) in " +
"parent type, and cannot be modified " +
"here",
infoerr.ErrorKindError)
return
}
outputMember.what = inheritedMember.what
if !inputMember.Type().Nil() {
err = inputMember.NewError (
@ -202,11 +218,25 @@ func (analyzer *analysisOperation) analyzeObjectMembers (
return
}
canOverwriteMember :=
inheritsFromSameModule ||
inheritedMember.permission ==
types.PermissionReadWrite
// apply default value
if inputMember.Argument().Nil() {
// if it is unspecified, inherit it
outputMember.argument = inheritedMember.argument
} else {
if !canOverwriteMember {
err = inputMember.Argument().NewError (
"member is read-only (ro) in " +
"parent type, its default " +
"value cannot be overridden",
infoerr.ErrorKindError)
return
}
outputMember.argument,
err = analyzer.analyzeArgument(inputMember.Argument())
if err != nil { return }

View File

@ -10,7 +10,11 @@ type ro cBasicObject:Obj
ro that:UInt
ro this:Int
type ro dInheritedFromOther:something.Thing
type ro dInheritFromOther:something.aBasic
type ro eInheritObject:cBasicObject
rw that
ro that 5
type ro dInheritObjectFromOther:something.bBird
ro wing 2
ro beak:Int 238

View File

@ -1,3 +1,6 @@
:arf
---
type ro Thing:Int
type ro aBasic:Int
type ro bBird:Obj
rw wing:Int 2