From 741f49236aae4d22cd53cb18f62304a30b3f17c0 Mon Sep 17 00:00:00 2001 From: "notzippy@gmail.com" Date: Fri, 8 May 2020 15:41:20 -0700 Subject: [PATCH] Updated scanner Removed scanning all the import statements, this is not needed Added recursive scan for revel import path to pick up testunits --- model/command_config.go | 4 +- model/source_info.go | 2 +- parser2/source_info_processor.go | 3 +- parser2/source_processor.go | 87 ++------------------------------ 4 files changed, 11 insertions(+), 85 deletions(-) diff --git a/model/command_config.go b/model/command_config.go index 08f0b90..aa172f3 100644 --- a/model/command_config.go +++ b/model/command_config.go @@ -174,8 +174,10 @@ func (c *CommandConfig) initAppFolder() (err error) { // Use app folder to read the go.mod if it exists and extract the package information goModFile := filepath.Join(appFolder, "go.mod") + utils.Logger.Info("Checking gomod, extracting from file", "path", goModFile,"exists", utils.Exists(goModFile)) if utils.Exists(goModFile) { c.Vendored = true + utils.Logger.Info("Found go mod, extracting from file", "path", goModFile) file, err := ioutil.ReadFile(goModFile) if err != nil { return err @@ -220,7 +222,7 @@ func (c *CommandConfig) initAppFolder() (err error) { c.AppPath = appFolder } - utils.Logger.Info("Set application path", "path", c.AppPath) + utils.Logger.Info("Set application path", "path", c.AppPath, "vendored",c.Vendored, "importpath",c.ImportPath) return nil } diff --git a/model/source_info.go b/model/source_info.go index 836f004..2fbaaf5 100644 --- a/model/source_info.go +++ b/model/source_info.go @@ -57,7 +57,6 @@ func (s *SourceInfo) TypesThatEmbed(targetType, packageFilter string) (filtered // Look through the embedded types to see if the current type is among them. for _, embeddedType := range spec.EmbeddedTypes { - // If so, add this type's simple name to the nodeQueue, and its spec to // the filtered list. if typeSimpleName == embeddedType.String() { @@ -111,6 +110,7 @@ func (s *SourceInfo) TypesThatEmbed(targetType, packageFilter string) (filtered // ControllerSpecs returns the all the controllers that embeds // `revel.Controller` func (s *SourceInfo) ControllerSpecs() []*TypeInfo { + utils.Logger.Infof("Scanning controller specifications for types ","typePath",RevelImportPath + ".Controller", "speclen",len(s.controllerSpecs)) if s.controllerSpecs == nil { s.controllerSpecs = s.TypesThatEmbed(RevelImportPath + ".Controller", "controllers") } diff --git a/parser2/source_info_processor.go b/parser2/source_info_processor.go index e0e4141..2862ef7 100644 --- a/parser2/source_info_processor.go +++ b/parser2/source_info_processor.go @@ -282,6 +282,7 @@ func (s *SourceInfoProcessor) getControllerSpec(spec *ast.TypeSpec, p *packages. ImportPath: p.PkgPath, PackageName: p.Name, } + log := s.sourceProcessor.log.New("file", p.Fset.Position(spec.Pos()).Filename,"position", p.Fset.Position(spec.Pos()).Line) for _, field := range structType.Fields.List { // If field.Names is set, it's not an embedded type. if field.Names != nil { @@ -330,7 +331,7 @@ func (s *SourceInfoProcessor) getControllerSpec(spec *ast.TypeSpec, p *packages. } else { var ok bool if importPath, ok = s.sourceProcessor.importMap[pkgName]; !ok { - s.sourceProcessor.log.Error("Error: Failed to find import path for ", "package", pkgName, "type", typeName, "map", s.sourceProcessor.importMap) + log.Error("Error: Failed to find import path for ", "package", pkgName, "type", typeName, "map", s.sourceProcessor.importMap, "usedin", ) continue } } diff --git a/parser2/source_processor.go b/parser2/source_processor.go index d7499ee..9ea6366 100644 --- a/parser2/source_processor.go +++ b/parser2/source_processor.go @@ -1,8 +1,6 @@ package parser2 import ( - "go/ast" - "go/token" "github.com/revel/cmd/model" "golang.org/x/tools/go/packages" "github.com/revel/cmd/utils" @@ -74,7 +72,7 @@ func (s *SourceProcessor) parse() (compileError error) { return } func (s *SourceProcessor) addPackages() (err error) { - allPackages := []string{s.revelContainer.ImportPath + "/...", model.RevelImportPath} + allPackages := []string{s.revelContainer.ImportPath + "/...", model.RevelImportPath + "/..."} for _, module := range s.revelContainer.ModulePathMap { allPackages = append(allPackages, module.ImportPath + "/...") // +"/app/controllers/...") } @@ -105,6 +103,9 @@ func (s *SourceProcessor) addPackages() (err error) { s.log.Info("Loaded packages ", "len results", len(s.packageList), "error", err) return } + +// This function is used to populate a map so that we can lookup controller embedded types in order to determine +// if a Struct inherits from from revel.Controller func (s *SourceProcessor) addImportMap() (err error) { s.importMap = map[string]string{} s.packageMap = map[string]string{} @@ -119,35 +120,7 @@ func (s *SourceProcessor) addImportMap() (err error) { } } for _, tree := range p.Syntax { - for _, decl := range tree.Decls { - genDecl, ok := decl.(*ast.GenDecl) - if !ok { - continue - } - - if genDecl.Tok == token.IMPORT { - for _, spec := range genDecl.Specs { - importSpec := spec.(*ast.ImportSpec) - //fmt.Printf("*** import specification %#v\n", importSpec) - var pkgAlias string - if importSpec.Name != nil { - pkgAlias = importSpec.Name.Name - if pkgAlias == "_" { - continue - } - } - quotedPath := importSpec.Path.Value // e.g. "\"sample/app/models\"" - fullPath := quotedPath[1 : len(quotedPath) - 1] // Remove the quotes - if pkgAlias == "" { - pkgAlias = fullPath - if index := strings.LastIndex(pkgAlias, "/"); index > 0 { - pkgAlias = pkgAlias[index + 1:] - } - } - s.importMap[pkgAlias] = fullPath - } - } - } + s.importMap[tree.Name.Name] = p.PkgPath } } return @@ -165,53 +138,3 @@ func (s *SourceProcessor) addSourceInfo() (err error) { } return } - -// Add imports to the map from the source dir -//func addImports(imports map[string]string, decl ast.Decl, srcDir string) { -// genDecl, ok := decl.(*ast.GenDecl) -// if !ok { -// return -// } -// -// if genDecl.Tok != token.IMPORT { -// return -// } -// -// for _, spec := range genDecl.Specs { -// importSpec := spec.(*ast.ImportSpec) -// var pkgAlias string -// if importSpec.Name != nil { -// pkgAlias = importSpec.Name.Name -// if pkgAlias == "_" { -// continue -// } -// } -// quotedPath := importSpec.Path.Value // e.g. "\"sample/app/models\"" -// fullPath := quotedPath[1 : len(quotedPath)-1] // Remove the quotes -// -// // If the package was not aliased (common case), we have to import it -// // to see what the package name is. -// // TODO: Can improve performance here a lot: -// // 1. Do not import everything over and over again. Keep a cache. -// // 2. Exempt the standard library; their directories always match the package name. -// // 3. Can use build.FindOnly and then use parser.ParseDir with mode PackageClauseOnly -// if pkgAlias == "" { -// -// utils.Logger.Debug("Reading from build", "path", fullPath, "srcPath", srcDir, "gopath", build.Default.GOPATH) -// pkg, err := build.Import(fullPath, srcDir, 0) -// if err != nil { -// // We expect this to happen for apps using reverse routing (since we -// // have not yet generated the routes). Don't log that. -// if !strings.HasSuffix(fullPath, "/app/routes") { -// utils.Logger.Warn("Could not find import:", "path", fullPath, "srcPath", srcDir, "error", err) -// } -// continue -// } else { -// utils.Logger.Debug("Found package in dir", "dir", pkg.Dir, "name", pkg.ImportPath) -// } -// pkgAlias = pkg.Name -// } -// -// imports[pkgAlias] = fullPath -// } -//} \ No newline at end of file