github.com/rsc/go@v0.0.0-20150416155037-e040fd465409/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) sprintf(format string, args ...interface{}) string {
    27  	for i, arg := range args {
    28  		switch a := arg.(type) {
    29  		case nil:
    30  			arg = "<nil>"
    31  		case operand:
    32  			panic("internal error: should always pass *operand")
    33  		case *operand:
    34  			arg = operandString(check.pkg, a)
    35  		case token.Pos:
    36  			arg = check.fset.Position(a).String()
    37  		case ast.Expr:
    38  			arg = ExprString(a)
    39  		case Object:
    40  			arg = ObjectString(check.pkg, a)
    41  		case Type:
    42  			arg = TypeString(check.pkg, a)
    43  		}
    44  		args[i] = arg
    45  	}
    46  	return fmt.Sprintf(format, args...)
    47  }
    48  
    49  func (check *Checker) trace(pos token.Pos, format string, args ...interface{}) {
    50  	fmt.Printf("%s:\t%s%s\n",
    51  		check.fset.Position(pos),
    52  		strings.Repeat(".  ", check.indent),
    53  		check.sprintf(format, args...),
    54  	)
    55  }
    56  
    57  // dump is only needed for debugging
    58  func (check *Checker) dump(format string, args ...interface{}) {
    59  	fmt.Println(check.sprintf(format, args...))
    60  }
    61  
    62  func (check *Checker) err(pos token.Pos, msg string, soft bool) {
    63  	err := Error{check.fset, pos, msg, soft}
    64  	if check.firstErr == nil {
    65  		check.firstErr = err
    66  	}
    67  	f := check.conf.Error
    68  	if f == nil {
    69  		panic(bailout{}) // report only first error
    70  	}
    71  	f(err)
    72  }
    73  
    74  func (check *Checker) error(pos token.Pos, msg string) {
    75  	check.err(pos, msg, false)
    76  }
    77  
    78  func (check *Checker) errorf(pos token.Pos, format string, args ...interface{}) {
    79  	check.err(pos, check.sprintf(format, args...), false)
    80  }
    81  
    82  func (check *Checker) softErrorf(pos token.Pos, format string, args ...interface{}) {
    83  	check.err(pos, check.sprintf(format, args...), true)
    84  }
    85  
    86  func (check *Checker) invalidAST(pos token.Pos, format string, args ...interface{}) {
    87  	check.errorf(pos, "invalid AST: "+format, args...)
    88  }
    89  
    90  func (check *Checker) invalidArg(pos token.Pos, format string, args ...interface{}) {
    91  	check.errorf(pos, "invalid argument: "+format, args...)
    92  }
    93  
    94  func (check *Checker) invalidOp(pos token.Pos, format string, args ...interface{}) {
    95  	check.errorf(pos, "invalid operation: "+format, args...)
    96  }