44 lines
1.3 KiB
Go
44 lines
1.3 KiB
Go
package generator
|
|
|
|
import "fmt"
|
|
import "git.tebibyte.media/sashakoshka/fspl/llvm"
|
|
import "git.tebibyte.media/sashakoshka/fspl/entity"
|
|
|
|
func (this *generator) generateTypedef (
|
|
def *entity.Typedef,
|
|
) (
|
|
llvm.Type,
|
|
error,
|
|
) {
|
|
irType, err := this.generateType(def.Type)
|
|
if err != nil { return nil, err }
|
|
return this.module.NewType(def.Name, irType), 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.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))
|
|
}
|
|
}
|