func errorSummary(error *revel.Error) string { var message = fmt.Sprintf("%4sStatus: %s\n%4sIn %s", "", error.Description, "", error.Path) if error.Line != 0 { message += fmt.Sprintf(" (around line %d): ", error.Line) for _, line := range error.ContextSource() { if line.IsError { message += line.Source } } } return message }
// errorSummary gets an error and returns its summary in human readable format. func errorSummary(err *revel.Error) (message string) { message = fmt.Sprintf("%4sStatus: %s\n%4sIn %s", "", err.Description, "", err.Path) // If line of error isn't known return the message as is. if err.Line == 0 { return } // Otherwise, include info about the line number and the relevant // source code lines. message += fmt.Sprintf(" (around line %d): ", err.Line) for _, line := range err.ContextSource() { if line.IsError { message += line.Source } } return }
// Parse the app controllers directory and return a list of the controller types found. // Returns a CompileError if the parsing fails. func ProcessSource(roots []string) (*SourceInfo, *revel.Error) { var ( srcInfo *SourceInfo compileError *revel.Error ) for _, root := range roots { rootImportPath := importPathFromPath(root) if rootImportPath == "" { revel.WARN.Println("Skipping code path", root) continue } // Start walking the directory tree. filepath.Walk(root, func(path string, info os.FileInfo, err error) error { if err != nil { log.Println("Error scanning app source:", err) return nil } if !info.IsDir() || info.Name() == "tmp" { return nil } // Get the import path of the package. pkgImportPath := rootImportPath if root != path { pkgImportPath = rootImportPath + "/" + filepath.ToSlash(path[len(root)+1:]) } // Parse files within the path. var pkgs map[string]*ast.Package fset := token.NewFileSet() pkgs, err = parser.ParseDir(fset, path, func(f os.FileInfo) bool { return !f.IsDir() && !strings.HasPrefix(f.Name(), ".") && strings.HasSuffix(f.Name(), ".go") }, 0) if err != nil { if errList, ok := err.(scanner.ErrorList); ok { var pos token.Position = errList[0].Pos compileError = &revel.Error{ SourceType: ".go source", Title: "Go Compilation Error", Path: pos.Filename, Description: errList[0].Msg, Line: pos.Line, Column: pos.Column, SourceLines: revel.MustReadLines(pos.Filename), } errorLink := revel.Config.StringDefault("error.link", "") if errorLink != "" { compileError.SetLink(errorLink) } return compileError } ast.Print(nil, err) log.Fatalf("Failed to parse dir: %s", err) } // Skip "main" packages. delete(pkgs, "main") // If there is no code in this directory, skip it. if len(pkgs) == 0 { return nil } // There should be only one package in this directory. if len(pkgs) > 1 { log.Println("Most unexpected! Multiple packages in a single directory:", pkgs) } var pkg *ast.Package for _, v := range pkgs { pkg = v } srcInfo = appendSourceInfo(srcInfo, processPackage(fset, pkgImportPath, path, pkg)) return nil }) } return srcInfo, compileError }