fspl/generator/type-multiplex.go

52 lines
1.5 KiB
Go

package generator
import "fmt"
import "git.tebibyte.media/fspl/fspl/llvm"
import "git.tebibyte.media/fspl/fspl/entity"
func (this *generator) generateTypedef (
def *entity.Typedef,
) (
llvm.Type,
error,
) {
key := entity.Key {
Unit: def.Unit(),
Name: def.Name,
}
irType, err := this.generateType(def.Type)
if err != nil { return nil, err }
irTypeDef := this.module.NewType(key.LinkName(), irType)
this.types[key] = irTypeDef
return irTypeDef, nil
}
func (this *generator) generateType (ty entity.Type) (llvm.Type, error) {
switch ty.(type) {
case nil:
return llvm.Void, nil
case *entity.TypeNamed:
return this.generateTypeNamed(ty.(*entity.TypeNamed))
case *entity.TypePointer:
return this.generateTypePointer(ty.(*entity.TypePointer))
case *entity.TypeSlice:
return this.generateTypeSlice(ty.(*entity.TypeSlice))
case *entity.TypeArray:
return this.generateTypeArray(ty.(*entity.TypeArray))
case *entity.TypeStruct:
return this.generateTypeStruct(ty.(*entity.TypeStruct))
case *entity.TypeInterface:
return this.generateTypeInterface(ty.(*entity.TypeInterface))
case *entity.TypeUnion:
return this.generateTypeUnion(ty.(*entity.TypeUnion))
case *entity.TypeInt:
return this.generateTypeInt(ty.(*entity.TypeInt))
case *entity.TypeFloat:
return this.generateTypeFloat(ty.(*entity.TypeFloat))
case *entity.TypeWord:
return this.generateTypeWord(ty.(*entity.TypeWord))
default:
panic(fmt.Sprintln("generator doesn't know about type", ty))
}
}