// 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 imagenewFix = fix{ "imagenew", imagenew, `Adapt image.NewXxx calls to pass an image.Rectangle instead of (w, h int). http://codereview.appspot.com/4964073 `, } func init() { register(imagenewFix) } var imagenewFuncs = map[string]bool{ "NewRGBA": true, "NewRGBA64": true, "NewNRGBA": true, "NewNRGBA64": true, "NewAlpha": true, "NewAlpha16": true, "NewGray": true, "NewGray16": true, } func imagenew(f *ast.File) bool { if !imports(f, "image") { return false } fixed := false walk(f, func(n interface{}) { call, ok := n.(*ast.CallExpr) if !ok { return } isNewFunc := false for newFunc := range imagenewFuncs { if len(call.Args) == 2 && isPkgDot(call.Fun, "image", newFunc) { isNewFunc = true break } } if len(call.Args) == 3 && isPkgDot(call.Fun, "image", "NewPaletted") { isNewFunc = true } if !isNewFunc { return } // Replace image.NewXxx(w, h) with image.NewXxx(image.Rect(0, 0, w, h)). rectArgs := []ast.Expr{ &ast.BasicLit{Value: "0"}, &ast.BasicLit{Value: "0"}, } rectArgs = append(rectArgs, call.Args[:2]...) rect := []ast.Expr{ &ast.CallExpr{ Fun: &ast.SelectorExpr{ X: &ast.Ident{ Name: "image", }, Sel: &ast.Ident{ Name: "Rect", }, }, Args: rectArgs, }, } call.Args = append(rect, call.Args[2:]...) fixed = true }) return fixed }