Added isSingular to method (this is cool)
This commit is contained in:
parent
b8c57d5a56
commit
020833c4c6
@ -18,7 +18,7 @@ func (literal IntLiteral) ToString (indent int) (output string) {
|
||||
// specified type, and false if it can't.
|
||||
func (literal IntLiteral) canBePassedAs (what Type) (allowed bool) {
|
||||
// must be a singlular value
|
||||
if what.length != 1 { return }
|
||||
if !what.isSingular() { return }
|
||||
|
||||
// can be passed to types that are signed numbers at a primitive level.
|
||||
primitive := what.underlyingPrimitive()
|
||||
@ -47,7 +47,7 @@ func (literal UIntLiteral) ToString (indent int) (output string) {
|
||||
// specified type, and false if it can't.
|
||||
func (literal UIntLiteral) canBePassedAs (what Type) (allowed bool) {
|
||||
// must be a singlular value
|
||||
if what.length != 1 { return }
|
||||
if !what.isSingular() { return }
|
||||
|
||||
// can be passed to types that are numbers at a primitive level.
|
||||
primitive := what.underlyingPrimitive()
|
||||
@ -81,7 +81,7 @@ func (literal FloatLiteral) ToString (indent int) (output string) {
|
||||
// specified type, and false if it can't.
|
||||
func (literal FloatLiteral) canBePassedAs (what Type) (allowed bool) {
|
||||
// must be a singlular value
|
||||
if what.length != 1 { return }
|
||||
if !what.isSingular() { return }
|
||||
|
||||
// can be passed to types that are floats at a primitive level.
|
||||
primitive := what.underlyingPrimitive()
|
||||
@ -108,12 +108,11 @@ func (literal StringLiteral) canBePassedAs (what Type) (allowed bool) {
|
||||
// types that can be reduced to a variable array pointing to numbers at
|
||||
// a primitive level.
|
||||
|
||||
what, worked := what.reduce()
|
||||
reduced, worked := what.reduce()
|
||||
if worked {
|
||||
// TODO: make some method to check the total length of a type
|
||||
if what.length != 1 { return }
|
||||
|
||||
if what.kind != TypeKindVariableArray { return }
|
||||
if !what.isSingular() { return }
|
||||
if reduced.kind != TypeKindVariableArray { return }
|
||||
what = reduced
|
||||
}
|
||||
|
||||
primitive := what.underlyingPrimitive()
|
||||
|
@ -29,6 +29,7 @@ type Type struct {
|
||||
kind TypeKind
|
||||
|
||||
primitiveCache *TypeSection
|
||||
singularCache *bool
|
||||
|
||||
// if this is greater than 1, it means that this is a fixed-length array
|
||||
// of whatever the type is. even if the type is a variable length array.
|
||||
@ -114,6 +115,27 @@ func (what Type) underlyingPrimitive () (underlying *TypeSection) {
|
||||
}
|
||||
}
|
||||
|
||||
// isSingular returns whether or not the type is a singular value. this goes
|
||||
// all the way up the inheritence chain, only stopping when it hits a non-basic
|
||||
// type because this is about data storage of a value.
|
||||
func (what Type) isSingular () (singular bool) {
|
||||
// if we have already done this operation, return the cahced result.
|
||||
if what.singularCache != nil {
|
||||
singular = *what.singularCache
|
||||
return
|
||||
}
|
||||
|
||||
// decide whether or not to recurse
|
||||
if what.kind != TypeKindBasic { return }
|
||||
actual := what.actual
|
||||
if actual == nil {
|
||||
return
|
||||
} else {
|
||||
singular = actual.what.isSingular()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// reduce ascends up the inheritence chain and gets the first type it finds that
|
||||
// isn't basic. If the type has a clear path of inheritence to a simple
|
||||
// primitive, there will be no non-basic types in the chain and this method will
|
||||
|
Reference in New Issue
Block a user