Removed Void as a concept
This commit is contained in:
parent
24af8e0b49
commit
d435a1b1be
@ -66,8 +66,7 @@ func (this *Tree) canAssign (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// base type
|
// base type
|
||||||
case *entity.TypeVoid,
|
case *entity.TypePointer,
|
||||||
*entity.TypePointer,
|
|
||||||
*entity.TypeSlice,
|
*entity.TypeSlice,
|
||||||
*entity.TypeArray,
|
*entity.TypeArray,
|
||||||
*entity.TypeStruct,
|
*entity.TypeStruct,
|
||||||
@ -190,8 +189,7 @@ func (this *Tree) areStructurallyEquivalent (left, right entity.Type) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// terminals
|
// terminals
|
||||||
case *entity.TypeVoid,
|
case *entity.TypeInt,
|
||||||
*entity.TypeInt,
|
|
||||||
*entity.TypeFloat,
|
*entity.TypeFloat,
|
||||||
*entity.TypeWord,
|
*entity.TypeWord,
|
||||||
*entity.TypeBool:
|
*entity.TypeBool:
|
||||||
|
@ -174,7 +174,7 @@ func (this *Tree) analyzeSubscript (
|
|||||||
subscript.Slice)
|
subscript.Slice)
|
||||||
if err != nil { return nil, err }
|
if err != nil { return nil, err }
|
||||||
subscript.Slice = slice
|
subscript.Slice = slice
|
||||||
subscript.Ty = voidIfNil(into)
|
subscript.Ty = into
|
||||||
|
|
||||||
offset, err := this.analyzeExpression (
|
offset, err := this.analyzeExpression (
|
||||||
builtinType("Index"), weak,
|
builtinType("Index"), weak,
|
||||||
@ -232,7 +232,7 @@ func (this *Tree) analyzeDereference (
|
|||||||
dereference.Pointer)
|
dereference.Pointer)
|
||||||
if err != nil { return nil, err }
|
if err != nil { return nil, err }
|
||||||
dereference.Pointer = pointer
|
dereference.Pointer = pointer
|
||||||
dereference.Ty = voidIfNil(into)
|
dereference.Ty = into
|
||||||
|
|
||||||
return pointer, nil
|
return pointer, nil
|
||||||
}
|
}
|
||||||
@ -471,7 +471,6 @@ func (this *Tree) analyzeBlock (
|
|||||||
}
|
}
|
||||||
|
|
||||||
final := len(block.Steps) - 1
|
final := len(block.Steps) - 1
|
||||||
block.Ty = &entity.TypeVoid { }
|
|
||||||
for index, step := range block.Steps {
|
for index, step := range block.Steps {
|
||||||
if index == final && into != nil {
|
if index == final && into != nil {
|
||||||
expression, ok := step.(entity.Expression)
|
expression, ok := step.(entity.Expression)
|
||||||
@ -567,7 +566,7 @@ func (this *Tree) analyzeLoop (
|
|||||||
entity.Expression,
|
entity.Expression,
|
||||||
error,
|
error,
|
||||||
) {
|
) {
|
||||||
loop.Ty = voidIfNil(into)
|
loop.Ty = into
|
||||||
this.pushLoop(loop)
|
this.pushLoop(loop)
|
||||||
defer this.popLoop()
|
defer this.popLoop()
|
||||||
|
|
||||||
@ -598,7 +597,7 @@ func (this *Tree) analyzeBreak (
|
|||||||
}
|
}
|
||||||
brk.Loop = loop
|
brk.Loop = loop
|
||||||
|
|
||||||
if !loop.Type().Equals(&entity.TypeVoid { }) && brk.Value == nil {
|
if loop.Type() != nil && brk.Value == nil {
|
||||||
return nil, participle.Errorf (
|
return nil, participle.Errorf (
|
||||||
brk.Pos,
|
brk.Pos,
|
||||||
"break statement must have value")
|
"break statement must have value")
|
||||||
@ -634,7 +633,7 @@ func (this *Tree) analyzeReturn (
|
|||||||
ty = ret.Declaration.(*entity.Method).Signature.Return
|
ty = ret.Declaration.(*entity.Method).Signature.Return
|
||||||
}
|
}
|
||||||
|
|
||||||
if !ty.Equals(&entity.TypeVoid { }) && ret.Value == nil {
|
if ty != nil && ret.Value == nil {
|
||||||
return nil, participle.Errorf (
|
return nil, participle.Errorf (
|
||||||
ret.Pos,
|
ret.Pos,
|
||||||
"break statement must have value")
|
"break statement must have value")
|
||||||
|
@ -103,8 +103,7 @@ func (this *Tree) analyzeMethodOrBehavior (
|
|||||||
ty := ty.(*entity.TypePointer)
|
ty := ty.(*entity.TypePointer)
|
||||||
return this.analyzeMethodOrBehavior(pos, ty.Referenced, name)
|
return this.analyzeMethodOrBehavior(pos, ty.Referenced, name)
|
||||||
|
|
||||||
case *entity.TypeVoid,
|
case *entity.TypeSlice,
|
||||||
*entity.TypeSlice,
|
|
||||||
*entity.TypeArray,
|
*entity.TypeArray,
|
||||||
*entity.TypeStruct,
|
*entity.TypeStruct,
|
||||||
*entity.TypeInt,
|
*entity.TypeInt,
|
||||||
|
@ -60,9 +60,7 @@ func (this *Tree) analyzeTypeInternal (
|
|||||||
error,
|
error,
|
||||||
) {
|
) {
|
||||||
// edge cases
|
// edge cases
|
||||||
void := &entity.TypeVoid { }
|
if ty == nil { return nil, nil }
|
||||||
if ty == nil { return void, nil }
|
|
||||||
if ty.Equals(void) { return ty, nil }
|
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
// if we are analyzing a typedef, we will need to update incomplete type
|
// if we are analyzing a typedef, we will need to update incomplete type
|
||||||
@ -201,11 +199,3 @@ func (this *Tree) analyzeBehavior (behavior *entity.Signature) (*entity.Signatur
|
|||||||
behavior.Return, err = this.analyzeType(behavior.Return, false)
|
behavior.Return, err = this.analyzeType(behavior.Return, false)
|
||||||
return behavior, err
|
return behavior, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func voidIfNil (ty entity.Type) entity.Type {
|
|
||||||
if ty == nil {
|
|
||||||
return &entity.TypeVoid { }
|
|
||||||
} else {
|
|
||||||
return ty
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -365,7 +365,7 @@ type Break struct {
|
|||||||
}
|
}
|
||||||
func (*Break) expression(){}
|
func (*Break) expression(){}
|
||||||
func (*Break) statement(){}
|
func (*Break) statement(){}
|
||||||
func (this *Break) Type () Type { return &TypeVoid { } }
|
func (this *Break) Type () Type { return nil }
|
||||||
func (this *Break) String () string {
|
func (this *Break) String () string {
|
||||||
if this.Value == nil {
|
if this.Value == nil {
|
||||||
return "[break]"
|
return "[break]"
|
||||||
@ -388,7 +388,7 @@ type Return struct {
|
|||||||
}
|
}
|
||||||
func (*Return) expression(){}
|
func (*Return) expression(){}
|
||||||
func (*Return) statement(){}
|
func (*Return) statement(){}
|
||||||
func (this *Return) Type () Type { return &TypeVoid { } }
|
func (this *Return) Type () Type { return nil }
|
||||||
func (this *Return) String () string {
|
func (this *Return) String () string {
|
||||||
if this.Value == nil {
|
if this.Value == nil {
|
||||||
return "[return]"
|
return "[return]"
|
||||||
|
@ -11,15 +11,6 @@ type Type interface {
|
|||||||
ty ()
|
ty ()
|
||||||
}
|
}
|
||||||
|
|
||||||
// TypeVoid represents the absence of a type.
|
|
||||||
type TypeVoid struct { }
|
|
||||||
func (*TypeVoid) ty(){}
|
|
||||||
func (*TypeVoid) Equals (ty Type) bool {
|
|
||||||
_, equals := ty.(*TypeVoid)
|
|
||||||
return equals
|
|
||||||
}
|
|
||||||
func (*TypeVoid) String () string { return "Void" }
|
|
||||||
|
|
||||||
// TypeNamed refers to a user-defined or built in named type.
|
// TypeNamed refers to a user-defined or built in named type.
|
||||||
type TypeNamed struct {
|
type TypeNamed struct {
|
||||||
Pos lexer.Position
|
Pos lexer.Position
|
||||||
|
Loading…
Reference in New Issue
Block a user