Skip to content

Commit fe69bfe

Browse files
lvan100lianghuan
authored andcommitted
refactor(golang): optimize implementation
1 parent b53daba commit fe69bfe

File tree

19 files changed

+841
-664
lines changed

19 files changed

+841
-664
lines changed

gen/gen.go

Lines changed: 1 addition & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@ package gen
1818

1919
import (
2020
"fmt"
21-
"os"
22-
"path/filepath"
23-
"strings"
2421

2522
"github.com/go-spring/gs-http-gen/gen/generator"
2623
"github.com/go-spring/gs-http-gen/gen/generator/golang"
@@ -37,7 +34,7 @@ func Gen(language string, config *generator.Config) error {
3734
if !ok {
3835
return fmt.Errorf("unsupported language: %s", language)
3936
}
40-
files, meta, err := parse(config.IDLSrcDir)
37+
files, meta, err := tidl.ParseDir(config.IDLSrcDir)
4138
if err != nil {
4239
return err
4340
}
@@ -49,59 +46,3 @@ func Gen(language string, config *generator.Config) error {
4946
}
5047
return g.Gen(config, files, meta)
5148
}
52-
53-
// parse scans the given directory for IDL files and the meta.json file.
54-
func parse(dir string) (files map[string]tidl.Document, meta *tidl.MetaInfo, err error) {
55-
files = make(map[string]tidl.Document)
56-
entries, err := os.ReadDir(dir)
57-
if err != nil {
58-
return nil, nil, err
59-
}
60-
for _, e := range entries {
61-
if e.IsDir() {
62-
continue
63-
}
64-
fileName := e.Name()
65-
66-
// Parse meta.json file if found
67-
if fileName == "meta.json" {
68-
if meta, err = parseMeta(dir, fileName); err != nil {
69-
return nil, nil, err
70-
}
71-
continue
72-
}
73-
74-
// Skip non-IDL files
75-
if !strings.HasSuffix(fileName, ".idl") {
76-
continue
77-
}
78-
79-
var doc tidl.Document
80-
doc, err = parseFile(dir, fileName)
81-
if err != nil {
82-
return nil, nil, err
83-
}
84-
files[fileName] = doc
85-
}
86-
return
87-
}
88-
89-
// parseMeta reads and parses the meta.json file to extract service metadata.
90-
func parseMeta(dir string, fileName string) (*tidl.MetaInfo, error) {
91-
fileName = filepath.Join(dir, fileName)
92-
b, err := os.ReadFile(fileName)
93-
if err != nil {
94-
return nil, err
95-
}
96-
return tidl.ParseMeta(string(b))
97-
}
98-
99-
// parseFile reads and parses a single IDL file into a document.
100-
func parseFile(dir string, fileName string) (tidl.Document, error) {
101-
fileName = filepath.Join(dir, fileName)
102-
b, err := os.ReadFile(fileName)
103-
if err != nil {
104-
return tidl.Document{}, err
105-
}
106-
return tidl.Parse(string(b))
107-
}

gen/generator/generator.go

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package generator
1818

1919
import (
2020
"fmt"
21-
"strings"
2221

2322
"github.com/go-spring/gs-http-gen/lib/tidl"
2423
)
@@ -55,24 +54,3 @@ func RegisterGenerator(language string, g Generator) {
5554
}
5655
generators[language] = g
5756
}
58-
59-
// ToPascal converts a snake_case string to PascalCase.
60-
// For example: "hello_world" becomes "HelloWorld".
61-
func ToPascal(s string) string {
62-
var sb strings.Builder
63-
parts := strings.Split(s, "_")
64-
for _, part := range parts {
65-
if part == "" {
66-
continue
67-
}
68-
c := part[0]
69-
if 'a' <= c && c <= 'z' {
70-
c = c - 'a' + 'A'
71-
}
72-
sb.WriteByte(c)
73-
if len(part) > 1 {
74-
sb.WriteString(part[1:])
75-
}
76-
}
77-
return sb.String()
78-
}

gen/generator/golang/server.go

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gen/generator/golang/type.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"strings"
2525
"text/template"
2626

27-
"github.com/go-spring/gs-http-gen/gen/generator"
2827
"github.com/go-spring/gs-http-gen/lib/tidl"
2928
"github.com/go-spring/gs-http-gen/lib/vidl"
3029
)
@@ -240,11 +239,14 @@ func (g *Generator) genType(ctx Context, fileName string, doc tidl.Document) err
240239
// genComment generates the comment string
241240
func genComment(c tidl.Comments) string {
242241
var comment string
243-
for _, s := range c.Top {
244-
comment += s.Text
242+
for _, s := range c.Above {
243+
comment += s.Text[0]
245244
}
246245
if c.Right != nil {
247-
comment += "\n" + c.Right.Text
246+
if c.Above != nil {
247+
comment += "\n"
248+
}
249+
comment += strings.Join(c.Right.Text, "\n")
248250
}
249251
return comment
250252
}
@@ -304,7 +306,7 @@ func convertEnums(ctx Context, doc tidl.Document) ([]Enum, error) {
304306
})
305307
}
306308
ret = append(ret, Enum{
307-
Name: tidl.CapitalizeASCII(e.Name),
309+
Name: e.Name,
308310
Fields: fields,
309311
Comment: genComment(e.Comments),
310312
})
@@ -313,11 +315,11 @@ func convertEnums(ctx Context, doc tidl.Document) ([]Enum, error) {
313315
if !t.OneOf {
314316
continue
315317
}
316-
name := tidl.CapitalizeASCII(t.Name) + "Type"
318+
name := t.Name + "Type"
317319
var fields []EnumField
318320
for i, f := range t.Fields {
319321
fields = append(fields, EnumField{
320-
Name: generator.ToPascal(f.Name),
322+
Name: tidl.ToPascal(f.Name),
321323
Value: int64(i),
322324
})
323325
}
@@ -423,9 +425,7 @@ func convertResponseType(ctx Context, rpcName string, respType tidl.RespType) (T
423425
return Type{}, fmt.Errorf("type %s not found", respType.TypeName)
424426
}
425427

426-
typeName := tidl.CapitalizeASCII(rpcName)
427-
typeName += tidl.CapitalizeASCII(t.Name)
428-
typeName += tidl.CapitalizeASCII(respType.UserType.Name)
428+
typeName := rpcName + t.Name + respType.UserType.Name
429429

430430
r := tidl.Type{
431431
Name: typeName,
@@ -488,7 +488,7 @@ func resolveGenericType(t tidl.TypeDefinition, genericName string, r *tidl.Redef
488488
// convertType converts an IDL struct type to a Go struct type
489489
func convertType(ctx Context, t tidl.Type) (Type, error) {
490490
r := Type{
491-
Name: tidl.CapitalizeASCII(t.Name),
491+
Name: t.Name,
492492
}
493493

494494
if t.OneOf {
@@ -518,7 +518,7 @@ func convertType(ctx Context, t tidl.Type) (Type, error) {
518518
}
519519

520520
// Get field name and Go type
521-
fieldName := generator.ToPascal(f.Name)
521+
fieldName := tidl.ToPascal(f.Name)
522522
typeName, err := getTypeName(ctx, f.FieldType, f.Annotations)
523523
if err != nil {
524524
return Type{}, err
@@ -574,7 +574,7 @@ func convertType(ctx Context, t tidl.Type) (Type, error) {
574574
func getTypeName(ctx Context, t tidl.TypeDefinition, arr []tidl.Annotation) (string, error) {
575575

576576
// Handle go.type annotation
577-
if a, ok := tidl.GetOneOfAnnotation(arr, "go.type"); ok && a.Value != nil {
577+
if a, ok := tidl.GetAnnotation(arr, "go.type"); ok && a.Value != nil {
578578
s := strings.Trim(strings.TrimSpace(*a.Value), "\"")
579579
return s, nil
580580
}
@@ -601,13 +601,13 @@ func getTypeName(ctx Context, t tidl.TypeDefinition, arr []tidl.Annotation) (str
601601
}
602602
return typeName, nil
603603
case tidl.UserType:
604-
typeName := tidl.CapitalizeASCII(ft.Name)
604+
typeName := ft.Name
605605
if ft.Optional {
606606
typeName = "*" + typeName
607607
}
608608

609609
// Handle enum_as_string annotation
610-
if _, ok := tidl.GetOneOfAnnotation(arr, "enum_as_string"); ok {
610+
if _, ok := tidl.GetAnnotation(arr, "enum_as_string"); ok {
611611
if _, ok := tidl.GetEnum(ctx.files, ft.Name); !ok {
612612
return "", fmt.Errorf("enum %s not found", ft.Name)
613613
}
@@ -713,7 +713,7 @@ func parseDefault(ctx Context, typeName string, v *string) (*string, error) {
713713
if _, ok := tidl.GetEnum(ctx.files, typeNameTrimmed); !ok {
714714
return v, nil // Treat as a regular string
715715
}
716-
s := tidl.CapitalizeASCII(parts[0]) + "_" + parts[1]
716+
s := parts[0] + "_" + parts[1]
717717
if asString {
718718
s = fmt.Sprintf("%sAsString(%s)", typeNameTrimmed, s)
719719
}
@@ -727,7 +727,7 @@ func parseDefault(ctx Context, typeName string, v *string) (*string, error) {
727727
// parseBinding parses a field's binding information from annotations.
728728
// It supports "header", "path", or "query" annotations.
729729
func parseBinding(arr []tidl.Annotation) (*Binding, error) {
730-
a, ok := tidl.GetOneOfAnnotation(arr, "header", "path", "query")
730+
a, ok := tidl.GetAnnotation(arr, "header", "path", "query")
731731
if !ok {
732732
return nil, nil
733733
}
@@ -745,7 +745,7 @@ func genFieldTag(fieldName, typeName string, arr []tidl.Annotation, binding *Bin
745745

746746
// Generate JSON tag
747747
jsonTag := fieldName
748-
if a, ok := tidl.GetOneOfAnnotation(arr, "json"); ok {
748+
if a, ok := tidl.GetAnnotation(arr, "json"); ok {
749749
if a.Value == nil {
750750
return "", fmt.Errorf("annotation json value is nil")
751751
}
@@ -801,7 +801,7 @@ var builtinFuncs = map[string]struct{}{
801801
// It returns a Go code snippet for validating the field.
802802
func genValidate(receiverType, fieldName, fieldType string, arr []tidl.Annotation, funcs map[string]ValidateFunc) (*string, error) {
803803
optional := strings.HasPrefix(fieldType, "*")
804-
a, ok := tidl.GetOneOfAnnotation(arr, "validate")
804+
a, ok := tidl.GetAnnotation(arr, "validate")
805805
if !ok {
806806
return nil, nil
807807
}

lib/tidl/TLexer.g4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ RIGHT_BRACE : '}';
4646
EQUAL : '=';
4747
COMMA : ',';
4848
QUESTION : '?';
49-
SEMI : ';' ;
49+
SEMICOLON : ';' ;
5050

5151
// --------------------
5252
// String literal

lib/tidl/TParser.g4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,5 +197,5 @@ const_value
197197
// This provides flexibility for both newline-based and semicolon-based syntax.
198198
// --------------------
199199
terminator
200-
: (NEWLINE | SEMI)+
200+
: (NEWLINE | SEMICOLON)+
201201
;

0 commit comments

Comments
 (0)