From 1774bf22a26aa1203677a947092345d1e61e6e26 Mon Sep 17 00:00:00 2001
From: Denis Isaev <denis@golangci.com>
Date: Sun, 1 Jul 2018 21:19:32 +0300
Subject: [PATCH] Fix #148: fix false-positive from unused if cgo is used

---
 pkg/golinters/govet.go | 16 +++++++++++++++-
 pkg/lint/load.go       | 32 --------------------------------
 2 files changed, 15 insertions(+), 33 deletions(-)

diff --git a/pkg/golinters/govet.go b/pkg/golinters/govet.go
index 87f92843..80a86718 100644
--- a/pkg/golinters/govet.go
+++ b/pkg/golinters/govet.go
@@ -14,6 +14,7 @@ import (
 	"github.com/golangci/golangci-lint/pkg/lint/linter"
 	"github.com/golangci/golangci-lint/pkg/logutils"
 	"github.com/golangci/golangci-lint/pkg/result"
+	"github.com/golangci/golangci-lint/pkg/result/processors"
 	"github.com/golangci/golangci-lint/pkg/timeutils"
 	govetAPI "github.com/golangci/govet"
 )
@@ -216,6 +217,17 @@ func runGoCommand(ctx context.Context, log logutils.Log, args ...string) error {
 	return nil
 }
 
+func filterFiles(files []*ast.File, fset *token.FileSet) []*ast.File {
+	newFiles := make([]*ast.File, 0, len(files))
+	for _, f := range files {
+		if !processors.IsCgoFilename(fset.Position(f.Pos()).Filename) {
+			newFiles = append(newFiles, f)
+		}
+	}
+
+	return newFiles
+}
+
 func (g Govet) runOnSourcePackages(_ context.Context, lintCtx *linter.Context) ([]govetAPI.Issue, error) {
 	// TODO: check .S asm files: govet can do it if pass dirs
 	var govetIssues []govetAPI.Issue
@@ -223,7 +235,9 @@ func (g Govet) runOnSourcePackages(_ context.Context, lintCtx *linter.Context) (
 		if len(pkg.Files) == 0 {
 			continue
 		}
-		issues, err := govetAPI.Analyze(pkg.Files, lintCtx.Program.Fset, pkg,
+
+		filteredFiles := filterFiles(pkg.Files, lintCtx.Program.Fset)
+		issues, err := govetAPI.Analyze(filteredFiles, lintCtx.Program.Fset, pkg,
 			lintCtx.Settings().Govet.CheckShadowing)
 		if err != nil {
 			return nil, err
diff --git a/pkg/lint/load.go b/pkg/lint/load.go
index b6fdc82e..473619e1 100644
--- a/pkg/lint/load.go
+++ b/pkg/lint/load.go
@@ -2,10 +2,8 @@ package lint
 
 import (
 	"fmt"
-	"go/ast"
 	"go/build"
 	"go/parser"
-	"go/token"
 	"os"
 	"path/filepath"
 	"strings"
@@ -13,7 +11,6 @@ import (
 
 	"github.com/golangci/golangci-lint/pkg/goutils"
 	"github.com/golangci/golangci-lint/pkg/logutils"
-	"github.com/golangci/golangci-lint/pkg/result/processors"
 
 	"github.com/golangci/golangci-lint/pkg/config"
 	"github.com/golangci/golangci-lint/pkg/lint/astcache"
@@ -260,30 +257,6 @@ func separateNotCompilingPackages(lintCtx *linter.Context) {
 	}
 }
 
-func removeFakePkgFiles(info *loader.PackageInfo, fset *token.FileSet) {
-	newFiles := make([]*ast.File, 0, len(info.Files))
-	for _, f := range info.Files {
-		if !processors.IsCgoFilename(fset.Position(f.Pos()).Filename) {
-			newFiles = append(newFiles, f)
-		}
-	}
-	info.Files = newFiles
-}
-
-func removeFakePackages(prog *loader.Program) {
-	if prog.Created != nil {
-		for _, info := range prog.Created {
-			removeFakePkgFiles(info, prog.Fset)
-		}
-	}
-
-	if prog.Imported != nil {
-		for _, info := range prog.Imported {
-			removeFakePkgFiles(info, prog.Fset)
-		}
-	}
-}
-
 //nolint:gocyclo
 func LoadContext(linters []linter.Config, cfg *config.Config, log logutils.Log) (*linter.Context, error) {
 	// Set GOROOT to have working cross-compilation: cross-compiled binaries
@@ -322,11 +295,6 @@ func LoadContext(linters []linter.Config, cfg *config.Config, log logutils.Log)
 		ssaProg = buildSSAProgram(prog, log)
 	}
 
-	if prog != nil {
-		// It's important to do it after SSA building
-		removeFakePackages(prog)
-	}
-
 	astLog := log.Child("astcache")
 	var astCache *astcache.Cache
 	if prog != nil {