]> Cypherpunks.ru repositories - gostls13.git/blob - src/go/types/errors.go
[dev.ssa] Merge remote-tracking branch 'origin/master' into ssamerge
[gostls13.git] / src / go / types / errors.go
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 }