diff --git a/internal/annotation_test.go b/internal/annotation_test.go index 7c639fb..b07ba1e 100644 --- a/internal/annotation_test.go +++ b/internal/annotation_test.go @@ -29,31 +29,57 @@ func TestAnnotation(t *testing.T) { tests := []struct { name string fileName string + mode AnnotationMode wantResult *FileDesc wantErr bool }{ { name: "数组模式单接口测试", fileName: "test/data/arraymode/arraymode_single_interface.go", + mode: AnnotationModeArray, wantResult: get_arraymode_single_interface("test/data/arraymode/arraymode_single_interface.json"), wantErr: false, }, { name: "数组模式单结构体测试", fileName: "test/data/arraymode/arraymode_single_struct.go", + mode: AnnotationModeArray, wantResult: get_arraymode_single_interface("test/data/arraymode/arraymode_single_struct.json"), wantErr: false, }, { name: "数组模式混合测试", fileName: "test/data/arraymode/arraymode_mult.go", + mode: AnnotationModeArray, wantResult: get_arraymode_single_interface("test/data/arraymode/arraymode_mult.json"), wantErr: false, }, + { + name: "map模式单接口测试", + fileName: "test/data/mapmode/mapmode_single_interface.go", + mode: AnnotationModeMap, + wantResult: get_arraymode_single_interface("test/data/mapmode/mapmode_single_interface.json"), + wantErr: false, + }, + { + name: "map模式单结构体测试", + fileName: "test/data/mapmode/mapmode_single_struct.go", + mode: AnnotationModeMap, + wantResult: get_arraymode_single_interface("test/data/mapmode/mapmode_single_struct.json"), + wantErr: false, + }, + { + name: "map模式混合测试", + fileName: "test/data/mapmode/mapmode_mult.go", + mode: AnnotationModeMap, + wantResult: get_arraymode_single_interface("test/data/mapmode/mapmode_mult.json"), + wantErr: false, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + CurrentAnnotationMode = tt.mode fileParser := GetFileParser(tt.fileName) fileDesc, err := fileParser.Parse() if (err != nil) != tt.wantErr { @@ -114,34 +140,3 @@ func deepCompare(a, b interface{}, fieldName string) bool { } return equal } - -//{ -//name: "数组模式单结构体测试", -//fileName: "data/arraymode/arraymode_single_struct.go", -//wantResult: 1, -//wantErr: false, -//}, -//{ -//name: "数组模式混合测试", -//fileName: "data/arraymode/arraymode_mult.go", -//wantResult: 1, -//wantErr: false, -//}, -//{ -//name: "map模式单接口测试", -//fileName: "data/arraymode/mapmode_single_interface.go", -//wantResult: 1, -//wantErr: false, -//}, -//{ -//name: "map模式单结构体测试", -//fileName: "data/arraymode/mapmode_single_struct.go", -//wantResult: 1, -//wantErr: false, -//}, -//{ -//name: "map模式混合测试", -//fileName: "data/arraymode/mapmode_mult.go", -//wantResult: 1, -//wantErr: false, -//}, diff --git a/internal/astParser.go b/internal/astParser.go index bf410c2..7c888fa 100644 --- a/internal/astParser.go +++ b/internal/astParser.go @@ -127,6 +127,10 @@ func parseAnnotation(comments []string, mode AnnotationMode) (annotations map[st } attributeName := strings.TrimSpace(itemSlice[0]) attributeValue := strings.TrimSpace(itemSlice[1]) + // attributeValue去掉引号 + if strings.HasPrefix(attributeValue, "\"") && strings.HasSuffix(attributeValue, "\"") { + attributeValue = attributeValue[1 : len(attributeValue)-1] + } attribute[attributeName] = attributeValue } if _, ok := annotations[name]; ok { diff --git a/internal/test/data/mapmode/mapmode_mult.go b/internal/test/data/mapmode/mapmode_mult.go index 7c192f8..04fd060 100644 --- a/internal/test/data/mapmode/mapmode_mult.go +++ b/internal/test/data/mapmode/mapmode_mult.go @@ -1 +1,52 @@ package mapmode + +import "github.com/celt237/go-annotation/internal/test/data" + +// InterfaceTwo test +// @annotation(id="1", name="test") +type InterfaceTwo interface { + // Method1 test1 + // @annotation + Method1(a1 *data.A1, a2 *data.A2, a3 *data.A3) error + + // Method2 test2 + // @annotation(name="test") + Method2(a2 data.A2) (a3 *data.A3, err error) + + // Method3 test3 + // @annotation(name="test") + Method3() (data.A1, error) + + // Method4 test4 + // @annotation(name="test", des="test2") + Method4(a3 *data.A3) +} + +// StructTwo test +// @annotation(id="1", name="test") +type StructTwo struct { +} + +// Method1 test1 +// @annotation +func (s *StructTwo) Method1(a1 *data.A1, a2 *data.A2, a3 *data.A3) error { + return nil +} + +// Method2 test2 +// @annotation(name="test") +func (s *StructTwo) Method2(a2 data.A2) (a3 *data.A3, err error) { + return nil, nil +} + +// Method3 test3 +// @annotation(name="test") +func (s *StructTwo) Method3() (data.A1, error) { + return data.A1{}, nil +} + +// Method4 test4 +// @annotation(name="test", des="test2") +func (s *StructTwo) Method4(a3 *data.A3) { + return +} diff --git a/internal/test/data/mapmode/mapmode_mult.json b/internal/test/data/mapmode/mapmode_mult.json new file mode 100644 index 0000000..fd4001c --- /dev/null +++ b/internal/test/data/mapmode/mapmode_mult.json @@ -0,0 +1,332 @@ +{ + "PackageName": "mapmode", + "FullPackageName": "github.com/celt237/go-annotation/internal/test/data/mapmode", + "FileName": "mapmode_mult.go", + "Imports": { + "data": { + "Name": "data", + "HasAlias": false, + "Path": "github.com/celt237/go-annotation/internal/test/data" + } + }, + "Interfaces": [ + { + "Name": "InterfaceTwo", + "Imports": { + "data": { + "Name": "data", + "HasAlias": false, + "Path": "github.com/celt237/go-annotation/internal/test/data" + } + }, + "Comments": [ + "annotation(id=\"1\", name=\"test\")" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [{"id": "1", "name": "test"}] + } + }, + "Methods": [ + { + "Name": "Method1", + "Comments": [ + "annotation" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [] + } + }, + "Params": [ + { + "Name": "a1", + "DataType": "*data.A1", + "PackageName": "data", + "RealDataType": "data.A1", + "IsPtr": true + }, + { + "Name": "a2", + "DataType": "*data.A2", + "PackageName": "data", + "RealDataType": "data.A2", + "IsPtr": true + }, + { + "Name": "a3", + "DataType": "*data.A3", + "PackageName": "data", + "RealDataType": "data.A3", + "IsPtr": true + } + ], + "Results": [ + { + "Name": "", + "DataType": "error", + "PackageName": "error", + "RealDataType": "error", + "IsPtr": false + } + ], + "Description": "test1" + }, + { + "Name": "Method2", + "Comments": [ + "annotation(name=\"test\")" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [{"name": "test"}] + } + }, + "Params": [ + { + "Name": "a2", + "DataType": "data.A2", + "PackageName": "data", + "RealDataType": "data.A2", + "IsPtr": false + } + ], + "Results": [ + { + "Name": "a3", + "DataType": "*data.A3", + "PackageName": "data", + "RealDataType": "data.A3", + "IsPtr": true + }, + { + "Name": "err", + "DataType": "error", + "PackageName": "error", + "RealDataType": "error", + "IsPtr": false + } + ], + "Description": "test2" + }, + { + "Name": "Method3", + "Comments": [ + "annotation(name=\"test\")" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [{"name": "test"}] + } + }, + "Params": [], + "Results": [ + { + "Name": "", + "DataType": "data.A1", + "PackageName": "data", + "RealDataType": "data.A1", + "IsPtr": false + }, + { + "Name": "", + "DataType": "error", + "PackageName": "error", + "RealDataType": "error", + "IsPtr": false + } + ], + "Description": "test3" + }, + { + "Name": "Method4", + "Comments": [ + "annotation(name=\"test\", des=\"test2\")" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [{"name": "test", "des": "test2"}] + } + }, + "Params": [ + { + "Name": "a3", + "DataType": "*data.A3", + "PackageName": "data", + "RealDataType": "data.A3", + "IsPtr": true + } + ], + "Results": [], + "Description": "test4" + } + ], + "Description": "test" + } + ], + "Structs": [ + { + "Name": "StructTwo", + "Imports": { + "data": { + "Name": "data", + "HasAlias": false, + "Path": "github.com/celt237/go-annotation/internal/test/data" + } + }, + "Comments": [ + "annotation(id=\"1\", name=\"test\")" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [{"id": "1", "name": "test"}] + } + }, + "Methods": [ + { + "Name": "Method1", + "Comments": [ + "annotation" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [] + } + }, + "Params": [ + { + "Name": "a1", + "DataType": "*data.A1", + "PackageName": "data", + "RealDataType": "data.A1", + "IsPtr": true + }, + { + "Name": "a2", + "DataType": "*data.A2", + "PackageName": "data", + "RealDataType": "data.A2", + "IsPtr": true + }, + { + "Name": "a3", + "DataType": "*data.A3", + "PackageName": "data", + "RealDataType": "data.A3", + "IsPtr": true + } + ], + "Results": [ + { + "Name": "", + "DataType": "error", + "PackageName": "error", + "RealDataType": "error", + "IsPtr": false + } + ], + "Description": "test1" + }, + { + "Name": "Method2", + "Comments": [ + "annotation(name=\"test\")" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [{"name": "test"}] + } + }, + "Params": [ + { + "Name": "a2", + "DataType": "data.A2", + "PackageName": "data", + "RealDataType": "data.A2", + "IsPtr": false + } + ], + "Results": [ + { + "Name": "a3", + "DataType": "*data.A3", + "PackageName": "data", + "RealDataType": "data.A3", + "IsPtr": true + }, + { + "Name": "err", + "DataType": "error", + "PackageName": "error", + "RealDataType": "error", + "IsPtr": false + } + ], + "Description": "test2" + }, + { + "Name": "Method3", + "Comments": [ + "annotation(name=\"test\")" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [{"name": "test"}] + } + }, + "Params": [], + "Results": [ + { + "Name": "", + "DataType": "data.A1", + "PackageName": "data", + "RealDataType": "data.A1", + "IsPtr": false + }, + { + "Name": "", + "DataType": "error", + "PackageName": "error", + "RealDataType": "error", + "IsPtr": false + } + ], + "Description": "test3" + }, + { + "Name": "Method4", + "Comments": [ + "annotation(name=\"test\", des=\"test2\")" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [{"name": "test", "des": "test2"}] + } + }, + "Params": [ + { + "Name": "a3", + "DataType": "*data.A3", + "PackageName": "data", + "RealDataType": "data.A3", + "IsPtr": true + } + ], + "Results": [], + "Description": "test4" + } + ], + "Description": "test" + } + ] +} \ No newline at end of file diff --git a/internal/test/data/mapmode/mapmode_single_interface.go b/internal/test/data/mapmode/mapmode_single_interface.go index 7c192f8..d555d7f 100644 --- a/internal/test/data/mapmode/mapmode_single_interface.go +++ b/internal/test/data/mapmode/mapmode_single_interface.go @@ -1 +1,23 @@ package mapmode + +import "github.com/celt237/go-annotation/internal/test/data" + +// InterfaceOne test +// @annotation(id="1", name="test") +type InterfaceOne interface { + // Method1 test1 + // @annotation + Method1(a1 *data.A1, a2 *data.A2, a3 *data.A3) error + + // Method2 test2 + // @annotation(name="test") + Method2(a2 data.A2) (a3 *data.A3, err error) + + // Method3 test3 + // @annotation(name="test") + Method3() (data.A1, error) + + // Method4 test4 + // @annotation(name="test", des="test2") + Method4(a3 *data.A3) +} diff --git a/internal/test/data/mapmode/mapmode_single_interface.json b/internal/test/data/mapmode/mapmode_single_interface.json new file mode 100644 index 0000000..c9724c0 --- /dev/null +++ b/internal/test/data/mapmode/mapmode_single_interface.json @@ -0,0 +1,173 @@ +{ + "PackageName": "mapmode", + "FullPackageName": "github.com/celt237/go-annotation/internal/test/data/mapmode", + "FileName": "mapmode_single_interface.go", + "Imports": { + "data": { + "Name": "data", + "HasAlias": false, + "Path": "github.com/celt237/go-annotation/internal/test/data" + } + }, + "Interfaces": [ + { + "Name": "InterfaceOne", + "Imports": { + "data": { + "Name": "data", + "HasAlias": false, + "Path": "github.com/celt237/go-annotation/internal/test/data" + } + }, + "Comments": [ + "annotation(id=\"1\", name=\"test\")" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [{"id": "1", "name": "test"}] + } + }, + "Methods": [ + { + "Name": "Method1", + "Comments": [ + "annotation" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [] + } + }, + "Params": [ + { + "Name": "a1", + "DataType": "*data.A1", + "PackageName": "data", + "RealDataType": "data.A1", + "IsPtr": true + }, + { + "Name": "a2", + "DataType": "*data.A2", + "PackageName": "data", + "RealDataType": "data.A2", + "IsPtr": true + }, + { + "Name": "a3", + "DataType": "*data.A3", + "PackageName": "data", + "RealDataType": "data.A3", + "IsPtr": true + } + ], + "Results": [ + { + "Name": "", + "DataType": "error", + "PackageName": "error", + "RealDataType": "error", + "IsPtr": false + } + ], + "Description": "test1" + }, + { + "Name": "Method2", + "Comments": [ + "annotation(name=\"test\")" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [{"name": "test"}] + } + }, + "Params": [ + { + "Name": "a2", + "DataType": "data.A2", + "PackageName": "data", + "RealDataType": "data.A2", + "IsPtr": false + } + ], + "Results": [ + { + "Name": "a3", + "DataType": "*data.A3", + "PackageName": "data", + "RealDataType": "data.A3", + "IsPtr": true + }, + { + "Name": "err", + "DataType": "error", + "PackageName": "error", + "RealDataType": "error", + "IsPtr": false + } + ], + "Description": "test2" + }, + { + "Name": "Method3", + "Comments": [ + "annotation(name=\"test\")" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [{"name": "test"}] + } + }, + "Params": [], + "Results": [ + { + "Name": "", + "DataType": "data.A1", + "PackageName": "data", + "RealDataType": "data.A1", + "IsPtr": false + }, + { + "Name": "", + "DataType": "error", + "PackageName": "error", + "RealDataType": "error", + "IsPtr": false + } + ], + "Description": "test3" + }, + { + "Name": "Method4", + "Comments": [ + "annotation(name=\"test\", des=\"test2\")" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [{"name": "test", "des": "test2"}] + } + }, + "Params": [ + { + "Name": "a3", + "DataType": "*data.A3", + "PackageName": "data", + "RealDataType": "data.A3", + "IsPtr": true + } + ], + "Results": [], + "Description": "test4" + } + ], + "Description": "test" + } + ], + "Structs": [] +} \ No newline at end of file diff --git a/internal/test/data/mapmode/mapmode_single_struct.go b/internal/test/data/mapmode/mapmode_single_struct.go index 7c192f8..62b00c7 100644 --- a/internal/test/data/mapmode/mapmode_single_struct.go +++ b/internal/test/data/mapmode/mapmode_single_struct.go @@ -1 +1,32 @@ package mapmode + +import "github.com/celt237/go-annotation/internal/test/data" + +// StructOne test +// @annotation(id="1", name="test") +type StructOne struct { +} + +// Method1 test1 +// @annotation +func (s *StructOne) Method1(a1 *data.A1, a2 *data.A2, a3 *data.A3) error { + return nil +} + +// Method2 test2 +// @annotation(name="test") +func (s *StructOne) Method2(a2 data.A2) (a3 *data.A3, err error) { + return nil, nil +} + +// Method3 test3 +// @annotation(name="test") +func (s *StructOne) Method3() (data.A1, error) { + return data.A1{}, nil +} + +// Method4 test4 +// @annotation(name="test", des="test2") +func (s *StructOne) Method4(a3 *data.A3) { + return +} diff --git a/internal/test/data/mapmode/mapmode_single_struct.json b/internal/test/data/mapmode/mapmode_single_struct.json new file mode 100644 index 0000000..34b5662 --- /dev/null +++ b/internal/test/data/mapmode/mapmode_single_struct.json @@ -0,0 +1,173 @@ +{ + "PackageName": "mapmode", + "FullPackageName": "github.com/celt237/go-annotation/internal/test/data/mapmode", + "FileName": "mapmode_single_struct.go", + "Imports": { + "data": { + "Name": "data", + "HasAlias": false, + "Path": "github.com/celt237/go-annotation/internal/test/data" + } + }, + "Structs": [ + { + "Name": "StructOne", + "Imports": { + "data": { + "Name": "data", + "HasAlias": false, + "Path": "github.com/celt237/go-annotation/internal/test/data" + } + }, + "Comments": [ + "annotation(id=\"1\", name=\"test\")" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [{"id": "1", "name": "test"}] + } + }, + "Methods": [ + { + "Name": "Method1", + "Comments": [ + "annotation" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [] + } + }, + "Params": [ + { + "Name": "a1", + "DataType": "*data.A1", + "PackageName": "data", + "RealDataType": "data.A1", + "IsPtr": true + }, + { + "Name": "a2", + "DataType": "*data.A2", + "PackageName": "data", + "RealDataType": "data.A2", + "IsPtr": true + }, + { + "Name": "a3", + "DataType": "*data.A3", + "PackageName": "data", + "RealDataType": "data.A3", + "IsPtr": true + } + ], + "Results": [ + { + "Name": "", + "DataType": "error", + "PackageName": "error", + "RealDataType": "error", + "IsPtr": false + } + ], + "Description": "test1" + }, + { + "Name": "Method2", + "Comments": [ + "annotation(name=\"test\")" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [{"name": "test"}] + } + }, + "Params": [ + { + "Name": "a2", + "DataType": "data.A2", + "PackageName": "data", + "RealDataType": "data.A2", + "IsPtr": false + } + ], + "Results": [ + { + "Name": "a3", + "DataType": "*data.A3", + "PackageName": "data", + "RealDataType": "data.A3", + "IsPtr": true + }, + { + "Name": "err", + "DataType": "error", + "PackageName": "error", + "RealDataType": "error", + "IsPtr": false + } + ], + "Description": "test2" + }, + { + "Name": "Method3", + "Comments": [ + "annotation(name=\"test\")" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [{"name": "test"}] + } + }, + "Params": [], + "Results": [ + { + "Name": "", + "DataType": "data.A1", + "PackageName": "data", + "RealDataType": "data.A1", + "IsPtr": false + }, + { + "Name": "", + "DataType": "error", + "PackageName": "error", + "RealDataType": "error", + "IsPtr": false + } + ], + "Description": "test3" + }, + { + "Name": "Method4", + "Comments": [ + "annotation(name=\"test\", des=\"test2\")" + ], + "Annotations": { + "annotation": { + "Name": "annotation", + "Attributes": [{"name": "test", "des": "test2"}] + } + }, + "Params": [ + { + "Name": "a3", + "DataType": "*data.A3", + "PackageName": "data", + "RealDataType": "data.A3", + "IsPtr": true + } + ], + "Results": [], + "Description": "test4" + } + ], + "Description": "test" + } + ], + "Interfaces": [] +} \ No newline at end of file