Refactor class/type

This commit is contained in:
2024-09-12 15:47:30 +02:00
parent 3577ecfaaf
commit a5d6fa15a3
3 changed files with 164 additions and 162 deletions

91
main.go
View File

@@ -6,11 +6,9 @@ import (
"io"
"log"
"os"
"strings"
"sync"
"text/template"
"github.com/PuerkitoBio/goquery"
"github.com/davecgh/go-spew/spew"
_ "embed"
@@ -65,7 +63,7 @@ func main() {
wg.Add(1)
go func(file string) {
defer wg.Done()
class, err := ParseFile(file)
class, err := ParseClass(file)
if err != nil {
Error.Printf("Error parsing file: %v", err)
return
@@ -76,93 +74,6 @@ func main() {
wg.Wait()
}
func ParseFile(filename string) (*Class, error) {
log.Printf("Parsing file: '%s'", filename)
res := Class{
Fields: []Field{},
Methods: []Method{},
Constructors: []Constructor{},
}
file, err := os.Open(filename)
if err != nil {
return nil, fmt.Errorf("error opening file: %w", err)
}
defer file.Close()
doc, err := goquery.NewDocumentFromReader(file)
if err != nil {
return nil, fmt.Errorf("error parsing file: %w", err)
}
class := doc.Find("div.floatright > h1")
if class.Length() == 0 {
return nil, fmt.Errorf("no class found")
}
res.ClassName = strings.TrimSpace(class.Text())
codeblocks := doc.Find("div.floatright > div.codecontainer")
if codeblocks.Length() == 0 {
return nil, fmt.Errorf("no codeblocks found")
}
// The first code block should be the constructor
// So far I have not found any classes with overloaded constructors...
// So I can not handle that case yet
constructorBlock := codeblocks.Eq(0)
constructor := constructorBlock.Find("div.function")
paramTypes := constructor.Find("span.type")
paramNames := constructor.Find("span.parameter")
resConstructor := Constructor{}
paramTypes.Each(func(i int, s *goquery.Selection) {
pname := strings.TrimSpace(paramNames.Eq(i).Text())
ptype := strings.TrimSpace(paramTypes.Eq(i).Text())
ptype = MapType(ptype)
resConstructor.Params = append(resConstructor.Params, Param{
Name: pname,
Type: ptype,
Comment: "",
})
})
res.Constructors = append(res.Constructors, resConstructor)
properties := doc.Find("div.floatright > div.codecontainer#Properties")
properties.ChildrenFiltered("div").Each(func(i int, s *goquery.Selection) {
property := Field{}
property.Name = strings.TrimSpace(s.Find("span.property").Text())
property.Type = strings.TrimSpace(s.Find("span.type").Text())
property.Type = MapType(property.Type)
comment := s.Find("td[align='right']").Text()
if comment != "" {
property.Comment = strings.TrimSpace(comment)
}
res.Fields = append(res.Fields, property)
})
codeblocks.ChildrenFiltered("div.function").Each(func(i int, s *goquery.Selection) {
method := Method{}
method.Name = strings.TrimSpace(s.AttrOr("id", ""))
method.Comment = strings.TrimSpace(s.Find("span.comment").Text())
types := s.Find("span.type")
parameters := s.Find("span.parameter")
types.Each(func(i int, s *goquery.Selection) {
param := Param{}
param.Name = strings.TrimSpace(parameters.Eq(i).Text())
param.Type = strings.TrimSpace(types.Eq(i).Text())
param.Type = MapType(param.Type)
method.Params = append(method.Params, param)
})
res.Methods = append(res.Methods, method)
})
spew.Dump(res)
return &res, nil
}
func MapType(t string) string {
switch t {
case "var":