metrieke/main.go

101 lines
1.9 KiB
Go

package metrieke
import (
"flag"
"fmt"
"os"
"path/filepath"
"strings"
sitter "github.com/smacker/go-tree-sitter"
)
var lang Language
func main() {
var path string
flag.StringVar(&path, "path", "", "Path to the file or directory for metrics calculation")
flag.Parse()
if path == "" {
fmt.Printf("Need a path")
os.Exit(1)
}
// language detection
if strings.HasSuffix(path, ".py") {
fd := NewPythonFile(path)
fd.Parse()
fmt.Printf("metrics: %v\n", fd.Metrics)
} else if strings.HasSuffix(path, ".java") {
fd := NewJavaFile(path)
fd.Parse()
fmt.Printf("metrics: %v\n", fd.Metrics)
} else {
err := filepath.Walk(path,
func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
fmt.Println(path, info.Size())
if strings.HasSuffix(path, ".java") {
fd := NewJavaFile(path)
fd.Parse()
fmt.Printf("metrics: %v\n", fd.Metrics)
}
return nil
})
if err != nil {
fmt.Printf("problem walking directory %v: %v\n", path, err)
os.Exit(1)
}
}
//f, err := LoadFile(file, lang)
//if err != nil {
//fmt.Printf("error getting metrics %v\n", err)
//os.Exit(1)
//}
fmt.Printf("lang: %v\n", lang.Name)
//fmt.Printf("%v\n", f)
}
func queryChildNodes(pattern []byte, lang *sitter.Language, node *sitter.Node, callback func(*sitter.Node)) {
qc := sitter.NewQueryCursor()
defer qc.Close()
qry, err := sitter.NewQuery(pattern, lang)
defer qry.Close()
if err != nil {
fmt.Println("error querying", err)
return
}
qc.Exec(qry, node)
match, idx, found := qc.NextCapture()
for found == true {
node := match.Captures[idx].Node
callback(node)
match, idx, found = qc.NextCapture()
}
}
type Language struct {
Name string
Language *sitter.Language
}
type Metrics struct {
Name string
Language string
NumMethods int
LOC int
LLOC int
CLOC int
McCC int
NL int
}