// Copyright 2011 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
	"go/ast"
)

var httpFinalURLFix = fix{
	"httpfinalurl",
	httpfinalurl,
	`Adapt http Get calls to not have a finalURL result parameter.

http://codereview.appspot.com/4535056/
`,
}

func init() {
	register(httpFinalURLFix)
}

func httpfinalurl(f *ast.File) bool {
	if !imports(f, "http") {
		return false
	}

	fixed := false
	walk(f, func(n interface{}) {
		// Fix up calls to http.Get.
		//
		// If they have blank identifiers, remove them:
		//    resp, _, err := http.Get(url)
		// -> resp, err := http.Get(url)
		//
		// But if they're using the finalURL parameter, warn:
		//    resp, finalURL, err := http.Get(url)
		as, ok := n.(*ast.AssignStmt)
		if !ok || len(as.Lhs) != 3 || len(as.Rhs) != 1 {
			return
		}

		if !isCall(as.Rhs[0], "http", "Get") {
			return
		}

		if isBlank(as.Lhs[1]) {
			as.Lhs = []ast.Expr{as.Lhs[0], as.Lhs[2]}
			fixed = true
		} else {
			warn(as.Pos(), "call to http.Get records final URL")
		}
	})
	return fixed
}
