Skip to content

Commit 7a59caa

Browse files
authored
Merge pull request #1852 from visualfc/classtype
export GetFileClassType
2 parents 5192883 + 38adad7 commit 7a59caa

File tree

3 files changed

+108
-0
lines changed

3 files changed

+108
-0
lines changed

cl/builtin_test.go

+74
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,80 @@ func TestClassNameAndExt(t *testing.T) {
314314
}
315315
}
316316

317+
func TestFileClassType(t *testing.T) {
318+
type testData struct {
319+
isClass bool
320+
isNormalGox bool
321+
isProj bool
322+
fileName string
323+
classType string
324+
isTest bool
325+
found bool
326+
}
327+
tests := []*testData{
328+
{false, false, false, "abc.gop", "", false, false},
329+
{false, false, false, "abc_test.gop", "", true, false},
330+
331+
{true, true, false, "abc.gox", "abc", false, true},
332+
{true, true, false, "Abc.gox", "Abc", false, true},
333+
{true, true, false, "abc_demo.gox", "abc", false, true},
334+
{true, true, false, "Abc_demo.gox", "Abc", false, true},
335+
336+
{true, true, false, "main.gox", "_main", false, true},
337+
{true, true, false, "main_demo.gox", "_main", false, true},
338+
{true, true, false, "abc_xtest.gox", "abc", false, true},
339+
{true, true, false, "main_xtest.gox", "_main", false, true},
340+
341+
{true, true, false, "abc_test.gox", "case_abc", true, true},
342+
{true, true, false, "Abc_test.gox", "caseAbc", true, true},
343+
{true, true, false, "main_test.gox", "case_main", true, true},
344+
345+
{true, false, false, "get.yap", "get", false, true},
346+
{true, false, false, "get_p_#id.yap", "get_p_id", false, true},
347+
{true, false, true, "main.yap", "AppV2", false, true},
348+
349+
{true, false, false, "abc_yap.gox", "abc", false, true},
350+
{true, false, false, "Abc_yap.gox", "Abc", false, true},
351+
{true, false, true, "main_yap.gox", "App", false, true},
352+
353+
{true, false, false, "abc_ytest.gox", "case_abc", true, true},
354+
{true, false, false, "Abc_ytest.gox", "caseAbc", true, true},
355+
{true, false, true, "main_ytest.gox", "App", true, true},
356+
}
357+
lookupClass := func(ext string) (c *Project, ok bool) {
358+
switch ext {
359+
case ".yap":
360+
return &modfile.Project{
361+
Ext: ".yap", Class: "AppV2",
362+
Works: []*modfile.Class{{Ext: ".yap", Class: "Handler"}},
363+
PkgPaths: []string{"github.com/goplus/yap"}}, true
364+
case "_yap.gox":
365+
return &modfile.Project{
366+
Ext: "_yap.gox", Class: "App",
367+
PkgPaths: []string{"github.com/goplus/yap"}}, true
368+
case "_ytest.gox":
369+
return &modfile.Project{
370+
Ext: "_ytest.gox", Class: "App",
371+
Works: []*modfile.Class{{Ext: "_ytest.gox", Class: "Case"}},
372+
PkgPaths: []string{"github.com/goplus/yap/ytest", "testing"}}, true
373+
}
374+
return
375+
}
376+
for _, test := range tests {
377+
f := &ast.File{IsClass: test.isClass, IsNormalGox: test.isNormalGox, IsProj: test.isProj}
378+
classType, isTest, found := GetFileClassType(f, test.fileName, lookupClass)
379+
if found != test.found {
380+
t.Fatalf("%v found classType want %v, got %v.", test.fileName, test.found, found)
381+
}
382+
if isTest != test.isTest {
383+
t.Fatalf("%v check classType isTest want %v, got %v.", test.fileName, test.isTest, isTest)
384+
}
385+
if classType != test.classType {
386+
t.Fatalf("%v getClassType want %v, got %v.", test.fileName, test.classType, classType)
387+
}
388+
}
389+
}
390+
317391
func TestErrMultiStarRecv(t *testing.T) {
318392
defer func() {
319393
if e := recover(); e == nil {

cl/classfile.go

+27
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,33 @@ func ClassNameAndExt(file string) (name, clsfile, ext string) {
9696
return
9797
}
9898

99+
// GetFileClassType get ast.File classType
100+
func GetFileClassType(file *ast.File, filename string, lookupClass func(ext string) (c *Project, ok bool)) (classType string, isTest bool, ok bool) {
101+
if file.IsClass {
102+
var ext string
103+
classType, _, ext = ClassNameAndExt(filename)
104+
ok = true
105+
if file.IsNormalGox {
106+
isTest = strings.HasSuffix(ext, "_test.gox")
107+
if !isTest && classType == "main" {
108+
classType = "_main"
109+
}
110+
} else {
111+
isTest = strings.HasSuffix(ext, "test.gox")
112+
}
113+
if file.IsProj {
114+
if gt, ok := lookupClass(ext); ok {
115+
classType = gt.Class
116+
}
117+
} else if isTest {
118+
classType = casePrefix + testNameSuffix(classType)
119+
}
120+
} else if strings.HasSuffix(filename, "_test.gop") {
121+
isTest = true
122+
}
123+
return
124+
}
125+
99126
func isGoxTestFile(ext string) bool {
100127
return strings.HasSuffix(ext, "test.gox")
101128
}

load.go

+7
Original file line numberDiff line numberDiff line change
@@ -403,3 +403,10 @@ var (
403403
)
404404

405405
// -----------------------------------------------------------------------------
406+
407+
// GetFileClassType get gop module file classType.
408+
func GetFileClassType(mod *gopmod.Module, file *ast.File, filename string) (classType string, isTest bool, ok bool) {
409+
return cl.GetFileClassType(file, filename, mod.LookupClass)
410+
}
411+
412+
// -----------------------------------------------------------------------------

0 commit comments

Comments
 (0)