func conductParsing(t *testing.T, test goldenTest, source []byte) (*parseTree, formatterNode) { parseTree := newParseTree(source) inputSource := compilercommon.InputSource(test.filename) rootNode := parser.Parse(parseTree.createAstNode, nil, inputSource, string(source)) if !assert.Empty(t, parseTree.errors, "Expected no parse errors for test %s", test.name) { return nil, formatterNode{} } return parseTree, rootNode.(formatterNode) }
// parseAndFormatSourceFile parses the source file at the given path (with associated file info), // formats it and, if changed, writes it back to that path. func parseAndFormatSourceFile(sourceFilePath string, info os.FileInfo, importHandling importHandlingInfo) error { // Load the source from the file. source, err := ioutil.ReadFile(sourceFilePath) if err != nil { return err } // Conduct the parsing. parseTree := newParseTree(source) inputSource := compilercommon.InputSource(sourceFilePath) rootNode := parser.Parse(parseTree.createAstNode, nil, inputSource, string(source)) // Report any errors found. if len(parseTree.errors) > 0 { for _, err := range parseTree.errors { startRune, _ := strconv.Atoi(err.properties[parser.NodePredicateStartRune]) sal := compilercommon.NewSourceAndLocation(inputSource, startRune) location := sal.Location() fmt.Printf("%v: line %v, column %v: %s\n", sourceFilePath, location.LineNumber()+1, location.ColumnPosition()+1, err.properties[parser.NodePredicateErrorMessage]) } return fmt.Errorf("Parsing errors found in file %s", sourceFilePath) } // Create the formatted source. formattedSource := buildFormattedSource(parseTree, rootNode.(formatterNode), importHandling) if string(formattedSource) == string(source) { // Nothing changed. return nil } // Overwrite the file with the formatted source. return ioutil.WriteFile(sourceFilePath, formattedSource, info.Mode()) }
func (sh *srgSourceHandler) Parse(source compilercommon.InputSource, input string, importHandler packageloader.ImportHandler) { parser.Parse(sh.buildASTNode, importHandler, source, input) }