本文整理汇总了Golang中go/ast.StarExpr类的典型用法代码示例。如果您正苦于以下问题:Golang StarExpr类的具体用法?Golang StarExpr怎么用?Golang StarExpr使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了StarExpr类的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: checkForBuiltinFuncs
func checkForBuiltinFuncs(typ *ast.Ident, c *ast.CallExpr) ast.Expr {
if strings.HasPrefix(typ.Name(), "func(") {
if t, ok := c.Fun.(*ast.Ident); ok {
switch t.Name() {
case "new":
e := new(ast.StarExpr)
e.X = c.Args[0]
return e
case "make":
return c.Args[0]
case "cmplx":
return ast.NewIdent("complex")
case "closed":
return ast.NewIdent("bool")
}
}
}
return nil
}
示例2: check_for_builtin_funcs
func check_for_builtin_funcs(typ *ast.Ident, c *ast.CallExpr, scope *scope) (ast.Expr, *scope) {
if strings.HasPrefix(typ.Name, "func(") {
if t, ok := c.Fun.(*ast.Ident); ok {
switch t.Name {
case "new":
e := new(ast.StarExpr)
e.X = c.Args[0]
return e, scope
case "make":
return c.Args[0], scope
case "append":
return c.Args[0], scope
case "cmplx":
return ast.NewIdent("complex"), g_universe_scope
case "closed":
return ast.NewIdent("bool"), g_universe_scope
}
}
}
return nil, nil
}
示例3: check_for_builtin_funcs
func check_for_builtin_funcs(typ *ast.Ident, c *ast.CallExpr, scope *scope) (ast.Expr, *scope) {
if strings.HasPrefix(typ.Name, "func(") {
if t, ok := c.Fun.(*ast.Ident); ok {
switch t.Name {
case "new":
if len(c.Args) > 0 {
e := new(ast.StarExpr)
e.X = c.Args[0]
return e, scope
}
case "make":
if len(c.Args) > 0 {
return c.Args[0], scope
}
case "append":
if len(c.Args) > 0 {
t, scope, _ := infer_type(c.Args[0], scope, -1)
return t, scope
}
case "complex":
// TODO: fix it
return ast.NewIdent("complex"), g_universe_scope
case "closed":
return ast.NewIdent("bool"), g_universe_scope
case "cap":
return ast.NewIdent("int"), g_universe_scope
case "copy":
return ast.NewIdent("int"), g_universe_scope
case "len":
return ast.NewIdent("int"), g_universe_scope
}
// TODO:
// func recover() interface{}
// func imag(c ComplexType) FloatType
// func real(c ComplexType) FloatType
}
}
return nil, nil
}
示例4: infer_type
// RETURNS:
// - type expression which represents a full name of a type
// - bool whether a type expression is actually a type (used internally)
// - scope in which type makes sense
func infer_type(v ast.Expr, scope *scope, index int) (ast.Expr, *scope, bool) {
switch t := v.(type) {
case *ast.CompositeLit:
return t.Type, scope, true
case *ast.Ident:
if d := scope.lookup(t.Name); d != nil {
if d.class == decl_package {
return ast.NewIdent(t.Name), scope, false
}
typ, scope := d.infer_type()
return typ, scope, d.class == decl_type
}
case *ast.UnaryExpr:
switch t.Op {
case token.AND:
// &a makes sense only with values, don't even check for type
it, s, _ := infer_type(t.X, scope, -1)
if it == nil {
break
}
e := new(ast.StarExpr)
e.X = it
return e, s, false
case token.ARROW:
// <-a makes sense only with values
it, s, _ := infer_type(t.X, scope, -1)
if it == nil {
break
}
switch index {
case -1, 0:
it, s = advance_to_type(chan_predicate, it, s)
return it.(*ast.ChanType).Value, s, false
case 1:
// technically it's a value, but in case of index == 1
// it is always the last infer operation
return ast.NewIdent("bool"), g_universe_scope, false
}
case token.ADD, token.NOT, token.SUB, token.XOR:
it, s, _ := infer_type(t.X, scope, -1)
if it == nil {
break
}
return it, s, false
}
case *ast.BinaryExpr:
switch t.Op {
case token.EQL, token.NEQ, token.LSS, token.LEQ,
token.GTR, token.GEQ, token.LOR, token.LAND:
// logic operations, the result is a bool, always
return ast.NewIdent("bool"), g_universe_scope, false
case token.ADD, token.SUB, token.MUL, token.QUO, token.OR,
token.XOR, token.REM, token.AND, token.AND_NOT:
// try X, then Y, they should be the same anyway
it, s, _ := infer_type(t.X, scope, -1)
if it == nil {
it, s, _ = infer_type(t.Y, scope, -1)
if it == nil {
break
}
}
return it, s, false
case token.SHL, token.SHR:
// try only X for shifts, Y is always uint
it, s, _ := infer_type(t.X, scope, -1)
if it == nil {
break
}
return it, s, false
}
case *ast.IndexExpr:
// something[another] always returns a value and it works on a value too
it, s, _ := infer_type(t.X, scope, -1)
if it == nil {
break
}
it, s = advance_to_type(index_predicate, it, s)
switch t := it.(type) {
case *ast.ArrayType:
return t.Elt, s, false
case *ast.Ellipsis:
return t.Elt, s, false
case *ast.MapType:
switch index {
case -1, 0:
return t.Value, s, false
case 1:
return ast.NewIdent("bool"), g_universe_scope, false
}
}
case *ast.SliceExpr:
// something[start : end] always returns a value
it, s, _ := infer_type(t.X, scope, -1)
if it == nil {
break
//.........这里部分代码省略.........
示例5: inferType
// RETURNS:
// - type expression which represents a full name of a type
// - bool whether a type expression is actually a type (used internally)
// - scope in which type makes sense
func (ctx *TypeInferenceContext) inferType(v ast.Expr) (ast.Expr, bool, *Scope) {
cc := *ctx
cc.index = -1
switch t := v.(type) {
case *ast.CompositeLit:
return t.Type, true, ctx.scope
case *ast.Ident:
if d := ctx.scope.lookup(t.Name()); d != nil {
// we don't check for DECL_MODULE here, because module itself
// isn't a type, in a type context it always will be used together
// with SelectorExpr like: os.Error, ast.TypeSpec, etc.
// and SelectorExpr ignores type bool.
typ, scope := d.InferType(ctx.ac)
return typ, d.Class == DECL_TYPE, scope
}
//return t, true // probably a builtin
case *ast.UnaryExpr:
switch t.Op {
case token.AND:
// & makes sense only with values, don't even check for type
it, _, scope := cc.inferType(t.X)
if it == nil {
break
}
e := new(ast.StarExpr)
e.X = it
return e, false, scope
case token.ARROW:
// <- makes sense only with values
it, _, scope := cc.inferType(t.X)
if it == nil {
break
}
switch ctx.index {
case -1, 0:
return it.(*ast.ChanType).Value, false, scope
case 1:
// technically it's a value, but in case of index == 1
// it is always the last infer operation
return ast.NewIdent("bool"), false, scope // TODO: return real built-in bool here
}
}
case *ast.IndexExpr:
// something[another] always returns a value and it works on a value too
it, _, scope := cc.inferType(t.X)
if it == nil {
break
}
switch t := it.(type) {
case *ast.ArrayType:
return t.Elt, false, scope
case *ast.MapType:
switch ctx.index {
case -1, 0:
return t.Value, false, scope
case 1:
return ast.NewIdent("bool"), false, scope // TODO: return real built-in bool here
}
}
case *ast.StarExpr:
it, isType, scope := cc.inferType(t.X)
if it == nil {
break
}
if isType {
// if it's a type, add * modifier, make it a 'pointer of' type
e := new(ast.StarExpr)
e.X = it
return e, true, scope
} else if s, ok := it.(*ast.StarExpr); ok {
// if it's a pointer value, dereference pointer
return s.X, false, scope
}
case *ast.CallExpr:
it, _, scope := cc.inferType(t.Fun)
if it == nil {
break
}
switch ct := it.(type) {
case *ast.FuncType:
// in case if <here>() is a function type variable, we're making a
// func call, resulting expr is always a value
return funcReturnType(ct, ctx.index), false, scope
case *ast.Ident:
ty := checkForBuiltinFuncs(ct, t)
if ty != nil {
return ty, false, ctx.scope
}
return ct, false, ctx.scope
default:
// otherwise it's a type cast, and the result is a value too
return ct, false, ctx.scope
}
case *ast.ParenExpr:
//.........这里部分代码省略.........