compiler: refactor typeinfo functions

This commit is contained in:
Evgenii Stratonikov 2020-05-13 18:09:55 +03:00
parent b9b1066435
commit 70d0ff869d
4 changed files with 93 additions and 114 deletions

44
pkg/compiler/types.go Normal file
View file

@ -0,0 +1,44 @@
package compiler
import (
"go/ast"
"go/types"
)
func (c *codegen) typeAndValueOf(e ast.Expr) types.TypeAndValue {
return c.typeInfo.Types[e]
}
func (c *codegen) typeOf(e ast.Expr) types.Type {
return c.typeAndValueOf(e).Type
}
func isBasicTypeOfKind(typ types.Type, ks ...types.BasicKind) bool {
if t, ok := typ.Underlying().(*types.Basic); ok {
k := t.Kind()
for i := range ks {
if k == ks[i] {
return true
}
}
}
return false
}
func isByte(typ types.Type) bool {
return isBasicTypeOfKind(typ, types.Uint8, types.Int8)
}
func isString(typ types.Type) bool {
return isBasicTypeOfKind(typ, types.String)
}
func isCompoundSlice(typ types.Type) bool {
t, ok := typ.Underlying().(*types.Slice)
return ok && !isByte(t.Elem())
}
func isByteSlice(typ types.Type) bool {
t, ok := typ.Underlying().(*types.Slice)
return ok && isByte(t.Elem())
}