diff options
| -rw-r--r-- | ast.go | 80 | ||||
| -rw-r--r-- | main.go | 143 | ||||
| -rw-r--r-- | native.go | 77 | 
3 files changed, 157 insertions, 143 deletions
| @@ -0,0 +1,80 @@ +package main + +import ( +	"bytes" +	"fmt" +	"go/parser" +	"go/printer" +	"go/token" +	"io/ioutil" +	"os" +	"path" +	"strings" + +	"github.com/mgutz/ansi" +	"golang.org/x/tools/go/ast/astutil" +) + +func ProcessFileAST(filePath string, from string, to string) { + +	//Colors to be used on the console +	red := ansi.ColorCode("red+bh") +	white := ansi.ColorCode("white+bh") +	greenUnderline := ansi.ColorCode("green+buh") +	blackOnWhite := ansi.ColorCode("black+b:white+h") +	//Reset the color +	reset := ansi.ColorCode("reset") + +	// If the file is a go file scan it +	if path.Ext(filePath) == ".go" { +		// New FileSet to parse the go file to +		fSet := token.NewFileSet() + +		// Parse the file +		file, err := parser.ParseFile(fSet, filePath, nil, 0) +		if err != nil { +			fmt.Println(err) +		} + +		// Get the list of imports from the ast +		imports := astutil.Imports(fSet, file) + +		// Keep track of number of changes +		numChanges := 0 + +		// Iterate through the imports array +		for _, mPackage := range imports { +			for _, mImport := range mPackage { +				// Since astutil returns the path string with quotes, remove those +				importString := mImport.Path.Value + +				// If the path matches the oldpath, replace it with the new one +				if strings.Contains(importString, from) { +					//If it needs to be replaced, increase numChanges so we can write the file later +					numChanges++ + +					// Join the path of the import package with the remainder from the old one after removing the old import package +					replacePackage := strings.Replace(importString, from, to, -1) + +					fmt.Println(red + "Updating import " + importString + " from file " + reset + white + filePath + reset + red + " to " + reset + white + replacePackage + reset) + +					// Remove the old import and replace it with the replacement +					astutil.DeleteImport(fSet, file, importString) +					astutil.AddImport(fSet, file, replacePackage) +				} +			} +		} + +		// If the number of changes are more than 0, write file +		if numChanges > 0 { +			// Print the new AST tree to a new output buffer +			var outputBuffer bytes.Buffer +			printer.Fprint(&outputBuffer, fSet, file) + +			ioutil.WriteFile(filePath, outputBuffer.Bytes(), os.ModePerm) +			fmt.Printf(blackOnWhite+"File "+filePath+" saved after %d changes."+reset+"\n", numChanges) +		} else { +			fmt.Println(greenUnderline + "No changes needed on file " + filePath + reset) +		} +	} +} @@ -1,22 +1,10 @@  package main  import ( -	"bufio" -	"bytes" -	"fmt" -	"go/parser" -	"go/printer" -	"go/token" -	"io/ioutil"  	"os" -	"path"  	"path/filepath" -	"strings"  	"github.com/codegangsta/cli" -	"github.com/mgutz/ansi" - -	"golang.org/x/tools/go/ast/astutil"  )  func main() { @@ -69,134 +57,3 @@ func RunApp(dir string, from string, to string, c *cli.Context) {  	}  } - -func ProcessFileNative(filePath string, from string, to string) { - -	// Open file to read -	fileContent, err := ioutil.ReadFile(filePath) -	if err != nil { -		fmt.Println(err) -	} - -	// Scan file line by line -	scanner := bufio.NewScanner(bytes.NewReader(fileContent)) - -	// Track line that is being scanned -	scanLine := 0 -	// Track number of changes in file -	numChages := 0 - -	// Control variables -	isImportLine := false - -	// Store final output text -	output := "" - -	// Scan through the lines of go file -	for scanner.Scan() { - -		scanLine++ -		line := scanner.Text() -		bareLine := strings.Replace(line, " ", "", -1) - -		// If it is a single import statement, replace the path in that line -		if strings.Contains(bareLine, "import\"") { -			fmt.Println("Found Import On Line", scanLine) -			newImport := strings.Replace(line, from, to, -1) -			output += newImport + "\n" -			numChages++ -			continue -		} - -		// Change isImportLine accordingly if import statements are detected -		if strings.Contains(bareLine, "import(") { -			fmt.Println("Found Multiple Imports Starting On Line", scanLine) -			isImportLine = true -		} else if isImportLine && strings.Contains(bareLine, ")") { -			fmt.Println("Imports Finish On Line", scanLine) -			isImportLine = false -		} - -		// If it is a import line, replace the import -		if isImportLine { -			newImport := strings.Replace(line, from, to, -1) -			fmt.Println("Replacing", line, "to", newImport, "on line", scanLine) -			output += newImport + "\n" -			numChages++ -			continue -		} - -		// Just copy the rest of the lines to the output -		output += line + "\n" - -	} - -	// Only write if changes were made -	if numChages > 0 { -		ioutil.WriteFile(filePath, []byte(output), os.ModePerm) -	} -} - -func ProcessFileAST(filePath string, from string, to string) { - -	//Colors to be used on the console -	red := ansi.ColorCode("red+bh") -	white := ansi.ColorCode("white+bh") -	greenUnderline := ansi.ColorCode("green+buh") -	blackOnWhite := ansi.ColorCode("black+b:white+h") -	//Reset the color -	reset := ansi.ColorCode("reset") - -	// If the file is a go file scan it -	if path.Ext(filePath) == ".go" { -		// New FileSet to parse the go file to -		fSet := token.NewFileSet() - -		// Parse the file -		file, err := parser.ParseFile(fSet, filePath, nil, 0) -		if err != nil { -			fmt.Println(err) -		} - -		// Get the list of imports from the ast -		imports := astutil.Imports(fSet, file) - -		// Keep track of number of changes -		numChanges := 0 - -		// Iterate through the imports array -		for _, mPackage := range imports { -			for _, mImport := range mPackage { -				// Since astutil returns the path string with quotes, remove those -				importString := mImport.Path.Value - -				// If the path matches the oldpath, replace it with the new one -				if strings.Contains(importString, from) { -					//If it needs to be replaced, increase numChanges so we can write the file later -					numChanges++ - -					// Join the path of the import package with the remainder from the old one after removing the old import package -					replacePackage := strings.Replace(importString, from, to, -1) - -					fmt.Println(red + "Updating import " + importString + " from file " + reset + white + filePath + reset + red + " to " + reset + white + replacePackage + reset) - -					// Remove the old import and replace it with the replacement -					astutil.DeleteImport(fSet, file, importString) -					astutil.AddImport(fSet, file, replacePackage) -				} -			} -		} - -		// If the number of changes are more than 0, write file -		if numChanges > 0 { -			// Print the new AST tree to a new output buffer -			var outputBuffer bytes.Buffer -			printer.Fprint(&outputBuffer, fSet, file) - -			ioutil.WriteFile(filePath, outputBuffer.Bytes(), os.ModePerm) -			fmt.Printf(blackOnWhite+"File "+filePath+" saved after %d changes."+reset+"\n", numChanges) -		} else { -			fmt.Println(greenUnderline + "No changes needed on file " + filePath + reset) -		} -	} -} diff --git a/native.go b/native.go new file mode 100644 index 0000000..92e35fe --- /dev/null +++ b/native.go @@ -0,0 +1,77 @@ +package main + +import ( +	"bufio" +	"bytes" +	"fmt" +	"io/ioutil" +	"os" +	"strings" +) + +func ProcessFileNative(filePath string, from string, to string) { + +	// Open file to read +	fileContent, err := ioutil.ReadFile(filePath) +	if err != nil { +		fmt.Println(err) +	} + +	// Scan file line by line +	scanner := bufio.NewScanner(bytes.NewReader(fileContent)) + +	// Track line that is being scanned +	scanLine := 0 +	// Track number of changes in file +	numChages := 0 + +	// Control variables +	isImportLine := false + +	// Store final output text +	output := "" + +	// Scan through the lines of go file +	for scanner.Scan() { + +		scanLine++ +		line := scanner.Text() +		bareLine := strings.Replace(line, " ", "", -1) + +		// If it is a single import statement, replace the path in that line +		if strings.Contains(bareLine, "import\"") { +			fmt.Println("Found Import On Line", scanLine) +			newImport := strings.Replace(line, from, to, -1) +			output += newImport + "\n" +			numChages++ +			continue +		} + +		// Change isImportLine accordingly if import statements are detected +		if strings.Contains(bareLine, "import(") { +			fmt.Println("Found Multiple Imports Starting On Line", scanLine) +			isImportLine = true +		} else if isImportLine && strings.Contains(bareLine, ")") { +			fmt.Println("Imports Finish On Line", scanLine) +			isImportLine = false +		} + +		// If it is a import line, replace the import +		if isImportLine { +			newImport := strings.Replace(line, from, to, -1) +			fmt.Println("Replacing", line, "to", newImport, "on line", scanLine) +			output += newImport + "\n" +			numChages++ +			continue +		} + +		// Just copy the rest of the lines to the output +		output += line + "\n" + +	} + +	// Only write if changes were made +	if numChages > 0 { +		ioutil.WriteFile(filePath, []byte(output), os.ModePerm) +	} +} | 
