73 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package goanalysis
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"fmt"
 | |
| 
 | |
| 	"golang.org/x/tools/go/packages"
 | |
| 
 | |
| 	"github.com/golangci/golangci-lint/pkg/lint/linter"
 | |
| 	libpackages "github.com/golangci/golangci-lint/pkg/packages"
 | |
| 	"github.com/golangci/golangci-lint/pkg/result"
 | |
| )
 | |
| 
 | |
| type IllTypedError struct {
 | |
| 	Pkg *packages.Package
 | |
| }
 | |
| 
 | |
| func (e *IllTypedError) Error() string {
 | |
| 	return fmt.Sprintf("errors in package: %v", e.Pkg.Errors)
 | |
| }
 | |
| 
 | |
| func buildIssuesFromIllTypedError(errs []error, lintCtx *linter.Context) ([]result.Issue, error) {
 | |
| 	var issues []result.Issue
 | |
| 	uniqReportedIssues := map[string]bool{}
 | |
| 
 | |
| 	var other error
 | |
| 
 | |
| 	for _, err := range errs {
 | |
| 		err := err
 | |
| 
 | |
| 		var ill *IllTypedError
 | |
| 		if !errors.As(err, &ill) {
 | |
| 			if other == nil {
 | |
| 				other = err
 | |
| 			}
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		for _, err := range libpackages.ExtractErrors(ill.Pkg) {
 | |
| 			i, perr := parseError(err)
 | |
| 			if perr != nil { // failed to parse
 | |
| 				if uniqReportedIssues[err.Msg] {
 | |
| 					continue
 | |
| 				}
 | |
| 				uniqReportedIssues[err.Msg] = true
 | |
| 				lintCtx.Log.Errorf("typechecking error: %s", err.Msg)
 | |
| 			} else {
 | |
| 				i.Pkg = ill.Pkg // to save to cache later
 | |
| 				issues = append(issues, *i)
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if len(issues) == 0 && other != nil {
 | |
| 		return nil, other
 | |
| 	}
 | |
| 
 | |
| 	return issues, nil
 | |
| }
 | |
| 
 | |
| func parseError(srcErr packages.Error) (*result.Issue, error) {
 | |
| 	pos, err := libpackages.ParseErrorPosition(srcErr.Pos)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	return &result.Issue{
 | |
| 		Pos:        *pos,
 | |
| 		Text:       srcErr.Msg,
 | |
| 		FromLinter: "typecheck",
 | |
| 	}, nil
 | |
| }
 | 
