github.com/gocuntian/go@v0.0.0-20160610041250-fee02d270bf8/src/go/types/errors.go (about) 1 // Copyright 2012 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // This file implements various error reporters. 6 7 package types 8 9 import ( 10 "fmt" 11 "go/ast" 12 "go/token" 13 "strings" 14 ) 15 16 func assert(p bool) { 17 if !p { 18 panic("assertion failed") 19 } 20 } 21 22 func unreachable() { 23 panic("unreachable") 24 } 25 26 func (check *Checker) qualifier(pkg *Package) string { 27 if pkg != check.pkg { 28 return pkg.path 29 } 30 return "" 31 } 32 33 func (check *Checker) sprintf(format string, args ...interface{}) string { 34 for i, arg := range args { 35 switch a := arg.(type) { 36 case nil: 37 arg = "<nil>" 38 case operand: 39 panic("internal error: should always pass *operand") 40 case *operand: 41 arg = operandString(a, check.qualifier) 42 case token.Pos: 43 arg = check.fset.Position(a).String() 44 case ast.Expr: 45 arg = ExprString(a) 46 case Object: 47 arg = ObjectString(a, check.qualifier) 48 case Type: 49 arg = TypeString(a, check.qualifier) 50 } 51 args[i] = arg 52 } 53 return fmt.Sprintf(format, args...) 54 } 55 56 func (check *Checker) trace(pos token.Pos, format string, args ...interface{}) { 57 fmt.Printf("%s:\t%s%s\n", 58 check.fset.Position(pos), 59 strings.Repeat(". ", check.indent), 60 check.sprintf(format, args...), 61 ) 62 } 63 64 // dump is only needed for debugging 65 func (check *Checker) dump(format string, args ...interface{}) { 66 fmt.Println(check.sprintf(format, args...)) 67 } 68 69 func (check *Checker) err(pos token.Pos, msg string, soft bool) { 70 err := Error{check.fset, pos, msg, soft} 71 if check.firstErr == nil { 72 check.firstErr = err 73 } 74 f := check.conf.Error 75 if f == nil { 76 panic(bailout{}) // report only first error 77 } 78 f(err) 79 } 80 81 func (check *Checker) error(pos token.Pos, msg string) { 82 check.err(pos, msg, false) 83 } 84 85 func (check *Checker) errorf(pos token.Pos, format string, args ...interface{}) { 86 check.err(pos, check.sprintf(format, args...), false) 87 } 88 89 func (check *Checker) softErrorf(pos token.Pos, format string, args ...interface{}) { 90 check.err(pos, check.sprintf(format, args...), true) 91 } 92 93 func (check *Checker) invalidAST(pos token.Pos, format string, args ...interface{}) { 94 check.errorf(pos, "invalid AST: "+format, args...) 95 } 96 97 func (check *Checker) invalidArg(pos token.Pos, format string, args ...interface{}) { 98 check.errorf(pos, "invalid argument: "+format, args...) 99 } 100 101 func (check *Checker) invalidOp(pos token.Pos, format string, args ...interface{}) { 102 check.errorf(pos, "invalid operation: "+format, args...) 103 }