예제 #1
0
파일: type.go 프로젝트: enex/RUN
func typeOf(n ast.Node, s *ast.Scope) (t *ast.Ident) {
	switch e := n.(type) {
	case *ast.AssignExpr:
		t = typeOfObject(s.Lookup(e.Name.Name))
	case *ast.BasicLit:
		t = typeOfBasic(e)
	case *ast.BinaryExpr:
		t = typeOf(e.List[0], s)
	case *ast.CallExpr:
		t = typeOfObject(s.Lookup(e.Name.Name))
	case *ast.DeclExpr:
		t = typeOfObject(s.Lookup(e.Name.Name))
	case *ast.ExprList:
		// BUG: should follow chain of execution to make sure all return
		// values match return type
		t = typeOf(e.List[len(e.List)-1], s)
	case *ast.Ident:
		t = typeOfObject(s.Lookup(e.Name))
	case *ast.IfExpr:
		if e.Type != nil {
			t = e.Type
		}
	case *ast.UnaryExpr:
		t = typeOf(e.Value, s)
	case *ast.VarExpr:
		t = typeOf(e.Name, s)
	}

	if t == nil {
		t = &ast.Ident{Name: "unknown", NamePos: n.Pos()}
	}
	return t
}
예제 #2
0
파일: type.go 프로젝트: unreal/calc
func typeOf(n ast.Node, s *ast.Scope) string {
	t := "unknown"
	switch e := n.(type) {
	case *ast.BasicLit:
		t = typeOfBasic(e)
	case *ast.BinaryExpr:
		t = "int"
	case *ast.CallExpr:
		ob := s.Lookup(e.Name.Name)
		t = typeOfObject(ob)
	case *ast.DeclExpr:
		ob := s.Lookup(e.Name.Name)
		t = typeOfObject(ob)
	case *ast.Ident:
		ob := s.Lookup(e.Name)
		t = typeOfObject(ob)
	}
	return t
}