Skip to content

Commit

Permalink
gopmod: Project/Class
Browse files Browse the repository at this point in the history
  • Loading branch information
visualfc committed Jun 12, 2023
1 parent d67bc8e commit 69cc13e
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 48 deletions.
47 changes: 26 additions & 21 deletions gopmod/classfile.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,16 @@ import (
"golang.org/x/mod/module"
)

type Class = modfile.Project
type WorkClass = modfile.WorkClass
type Project = modfile.Project
type Class = modfile.Class

var (
ClassSpx = &Class{
Ext: ".gmx",
Class: "Game",
WorkClass: []*WorkClass{&WorkClass{Ext: ".spx", Class: "Sprite"}},
PkgPaths: []string{"github.com/goplus/spx", "math"},
SpxProject = &Project{
Ext: ".gmx",
Class: "Game",
PkgPaths: []string{"github.com/goplus/spx", "math"},
}
SpxClasses = []*Class{&Class{Ext: ".spx", Class: "Sprite"}}
)

var (
Expand All @@ -46,26 +46,29 @@ var (
// -----------------------------------------------------------------------------

func (p *Module) IsClass(ext string) (isProj bool, ok bool) {
c, ok := p.classes[ext]
c, ok := p.projects[ext]
if ok {
isProj = (ext == c.Ext)
}
return
}

func (p *Module) LookupClass(ext string) (c *Class, ok bool) {
c, ok = p.classes[ext]
func (p *Module) LookupClass(ext string) (c *Project, class string, ok bool) {
c, ok = p.projects[ext]
if ok {
class, ok = p.classes[ext]
}
return
}

func (p *Module) RegisterClasses(registerClass ...func(c *Class)) (err error) {
var regcls func(c *Class)
func (p *Module) RegisterClasses(registerClass ...func(c *Project)) (err error) {
var regcls func(c *Project)
if registerClass != nil {
regcls = registerClass[0]
}
p.registerClass(ClassSpx, regcls)
p.registerClass(SpxProject, SpxClasses, regcls)
if c := p.Project; c != nil {
p.registerClass(c, regcls)
p.registerClass(c, p.Classes, regcls)
}
for _, r := range p.Register {
if err = p.registerMod(r.ClassfileMod, regcls); err != nil {
Expand All @@ -75,7 +78,7 @@ func (p *Module) RegisterClasses(registerClass ...func(c *Class)) (err error) {
return
}

func (p *Module) registerMod(modPath string, regcls func(c *Class)) (err error) {
func (p *Module) registerMod(modPath string, regcls func(c *Project)) (err error) {
mod, ok := p.LookupDepMod(modPath)
if !ok {
return syscall.ENOENT
Expand All @@ -91,7 +94,7 @@ func (p *Module) registerMod(modPath string, regcls func(c *Class)) (err error)
return p.registerClassFrom(mod, regcls)
}

func (p *Module) registerClassFrom(modVer module.Version, regcls func(c *Class)) (err error) {
func (p *Module) registerClassFrom(modVer module.Version, regcls func(c *Project)) (err error) {
dir, err := modcache.Path(modVer)
if err != nil {
return
Expand All @@ -104,14 +107,16 @@ func (p *Module) registerClassFrom(modVer module.Version, regcls func(c *Class))
if c == nil {
return ErrNotClassFileMod
}
p.registerClass(c, regcls)
p.registerClass(c, mod.Classes, regcls)
return
}

func (p *Module) registerClass(c *Class, regcls func(c *Class)) {
p.classes[c.Ext] = c
for _, w := range c.WorkClass {
p.classes[w.Ext] = c
func (p *Module) registerClass(c *Project, works []*Class, regcls func(c *Project)) {
p.projects[c.Ext] = c
p.classes[c.Ext] = c.Class
for _, w := range works {
p.projects[w.Ext] = c
p.classes[w.Ext] = c.Class
}
if regcls != nil {
regcls(c)
Expand Down
10 changes: 6 additions & 4 deletions gopmod/module.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,9 @@ type depmodInfo struct {

type Module struct {
modload.Module
classes map[string]*Class
depmods []depmodInfo
projects map[string]*Project // ext -> project
classes map[string]string // ext -> class
depmods []depmodInfo
}

// IsValid returns if this module exists or not.
Expand Down Expand Up @@ -175,9 +176,10 @@ func getDepMods(mod modload.Module) []depmodInfo {

// New creates a module from a modload.Module instance.
func New(mod modload.Module) *Module {
classes := make(map[string]*Class)
projects := make(map[string]*Project)
classes := make(map[string]string)
depmods := getDepMods(mod)
return &Module{classes: classes, depmods: depmods, Module: mod}
return &Module{projects: projects, classes: classes, depmods: depmods, Module: mod}
}

// Load loads a module from a local dir.
Expand Down
32 changes: 16 additions & 16 deletions modfile/gop_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,20 +113,20 @@ func TestParse1(t *testing.T) {
t.Errorf("project path expected be math, but %s got", f.Project.PkgPaths[1])
}

if len(f.Project.WorkClass) != 2 {
t.Errorf("project workclass length expected be 2, but %d got", len(f.Project.WorkClass))
if len(f.Classes) != 2 {
t.Errorf("project workclass length expected be 2, but %d got", len(f.Classes))
}
if f.Project.WorkClass[0].Ext != ".spx" {
t.Errorf("project class[0] exts expected be .spx, but %s got", f.Project.WorkClass[0].Ext)
if f.Classes[0].Ext != ".spx" {
t.Errorf("project class[0] exts expected be .spx, but %s got", f.Classes[0].Ext)
}
if f.Project.WorkClass[0].Class != "Sprite" {
t.Errorf("project class[0] class expected be Sprite, but %s got", f.Project.WorkClass[0].Class)
if f.Classes[0].Class != "Sprite" {
t.Errorf("project class[0] class expected be Sprite, but %s got", f.Classes[0].Class)
}
if f.Project.WorkClass[1].Ext != ".spx2" {
t.Errorf("project class[1] exts expected be .spx2, but %s got", f.Project.WorkClass[1].Ext)
if f.Classes[1].Ext != ".spx2" {
t.Errorf("project class[1] exts expected be .spx2, but %s got", f.Classes[1].Ext)
}
if f.Project.WorkClass[1].Class != "*Sprite2" {
t.Errorf("project class[1] class expected be Sprite, but %s got", f.Project.WorkClass[1].Class)
if f.Classes[1].Class != "*Sprite2" {
t.Errorf("project class[1] class expected be Sprite, but %s got", f.Classes[1].Class)
}
}

Expand Down Expand Up @@ -201,14 +201,14 @@ func TestParse2(t *testing.T) {
t.Errorf("project path expected be math, but %s got", f.Project.PkgPaths[1])
}

if len(f.Project.WorkClass) != 1 {
t.Errorf("project workclass length expected be 2, but %d got", len(f.Project.WorkClass))
if len(f.Classes) != 1 {
t.Errorf("project workclass length expected be 2, but %d got", len(f.Classes))
}
if f.Project.WorkClass[0].Ext != ".spx" {
t.Errorf("project class[0] exts expected be .spx, but %s got", f.Project.WorkClass[0].Ext)
if f.Classes[0].Ext != ".spx" {
t.Errorf("project class[0] exts expected be .spx, but %s got", f.Classes[0].Ext)
}
if f.Project.WorkClass[0].Class != "Sprite" {
t.Errorf("project class[0] class expected be Sprite, but %s got", f.Project.WorkClass[0].Class)
if f.Classes[0].Class != "Sprite" {
t.Errorf("project class[0] class expected be Sprite, but %s got", f.Classes[0].Class)
}
}

Expand Down
14 changes: 7 additions & 7 deletions modfile/rule.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ type File struct {
modfile.File
Gop *Gop
Project *Project
Classes []*Class
Register []*Register
}

Expand Down Expand Up @@ -66,15 +67,14 @@ type Register struct {

// A Project is the project statement.
type Project struct {
Ext string // ".gmx"
Class string // "Game"
PkgPaths []string // package paths of classfile
WorkClass []*WorkClass // work classes list
Syntax *Line
Ext string // ".gmx"
Class string // "Game"
PkgPaths []string // package paths of classfile
Syntax *Line
}

// A WorkClass is the project class statement.
type WorkClass struct {
type Class struct {
Ext string // ".spx"
Class string // "Sprite"
Syntax *Line
Expand Down Expand Up @@ -325,7 +325,7 @@ func (f *File) parseVerb(errs *ErrorList, verb string, line *Line, args []string
wrapError(err)
return
}
f.Project.WorkClass = append(f.Project.WorkClass, &WorkClass{
f.Classes = append(f.Classes, &Class{
Ext: workExt,
Class: class,
Syntax: line,
Expand Down

0 comments on commit 69cc13e

Please sign in to comment.