feature: refactor api parse to g4 (#365)
* feature: refactor api parse to g4 * new g4 parser * add CHANGE_LOG.MD * refactor * fix byte bug * refactor * optimized * optimized * revert * update readme.md * update readme.md * update readme.md * update readme.md * remove no need * fix java gen * add upgrade * resolve confilits Co-authored-by: anqiansong <anqiansong@xiaoheiban.cn>
This commit is contained in:
@@ -8,19 +8,30 @@ import (
|
||||
"strings"
|
||||
"text/template"
|
||||
|
||||
"github.com/tal-tech/go-zero/core/stringx"
|
||||
"github.com/tal-tech/go-zero/tools/goctl/api/spec"
|
||||
apiutil "github.com/tal-tech/go-zero/tools/goctl/api/util"
|
||||
"github.com/tal-tech/go-zero/tools/goctl/util"
|
||||
)
|
||||
|
||||
const getSetTemplate = `
|
||||
{{.indent}}{{.decorator}}
|
||||
{{.indent}}public {{.returnType}} get{{.property}}() {
|
||||
{{.indent}} return this.{{.propertyValue}};
|
||||
{{.indent}} return this.{{.tagValue}};
|
||||
{{.indent}}}
|
||||
|
||||
{{.indent}}public void set{{.property}}({{.type}} {{.propertyValue}}) {
|
||||
{{.indent}} this.{{.propertyValue}} = {{.propertyValue}};
|
||||
{{.indent}} this.{{.tagValue}} = {{.propertyValue}};
|
||||
{{.indent}}}
|
||||
`
|
||||
|
||||
const boolTemplate = `
|
||||
{{.indent}}{{.decorator}}
|
||||
{{.indent}}public {{.returnType}} is{{.property}}() {
|
||||
{{.indent}} return this.{{.tagValue}};
|
||||
{{.indent}}}
|
||||
|
||||
{{.indent}}public void set{{.property}}({{.type}} {{.propertyValue}}) {
|
||||
{{.indent}} this.{{.tagValue}} = {{.propertyValue}};
|
||||
{{.indent}}}
|
||||
`
|
||||
|
||||
@@ -31,22 +42,29 @@ func writeProperty(writer io.Writer, member spec.Member, indent int) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
name, err := member.GetPropertyName()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = fmt.Fprintf(writer, "private %s %s", ty, name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
writeDefaultValue(writer, member)
|
||||
fmt.Fprint(writer, ";\n")
|
||||
return err
|
||||
}
|
||||
|
||||
func writeDefaultValue(writer io.Writer, member spec.Member) error {
|
||||
switch member.Type {
|
||||
case "string":
|
||||
javaType, err := goTypeToJava(member.Type)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if javaType == "String" {
|
||||
_, err := fmt.Fprintf(writer, " = \"\"")
|
||||
return err
|
||||
}
|
||||
@@ -67,82 +85,84 @@ func indentString(indent int) string {
|
||||
return result
|
||||
}
|
||||
|
||||
func writeNewline(writer io.Writer) {
|
||||
fmt.Fprint(writer, util.NL)
|
||||
func goTypeToJava(tp spec.Type) (string, error) {
|
||||
switch v := tp.(type) {
|
||||
case spec.DefineStruct:
|
||||
return util.Title(tp.Name()), nil
|
||||
case spec.PrimitiveType:
|
||||
r, ok := primitiveType(tp.Name())
|
||||
if !ok {
|
||||
return "", errors.New("unsupported primitive type " + tp.Name())
|
||||
}
|
||||
return r, nil
|
||||
case spec.MapType:
|
||||
valueType, err := goTypeToJava(v.Value)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return fmt.Sprintf("java.util.HashMap<String, %s>", util.Title(valueType)), nil
|
||||
case spec.ArrayType:
|
||||
if tp.Name() == "[]byte" {
|
||||
return "byte[]", nil
|
||||
}
|
||||
|
||||
valueType, err := goTypeToJava(v.Value)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return fmt.Sprintf("java.util.ArrayList<%s>", util.Title(valueType)), nil
|
||||
case spec.InterfaceType:
|
||||
return "Object", nil
|
||||
case spec.PointerType:
|
||||
return goTypeToJava(v.Type)
|
||||
}
|
||||
|
||||
return "", errors.New("unsupported primitive type " + tp.Name())
|
||||
}
|
||||
|
||||
func isPrimitiveType(tp string) bool {
|
||||
switch tp {
|
||||
case "int", "int32", "int64":
|
||||
return true
|
||||
case "float", "float32", "float64":
|
||||
return true
|
||||
case "bool":
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func goTypeToJava(tp string) (string, error) {
|
||||
if len(tp) == 0 {
|
||||
return "", errors.New("property type empty")
|
||||
}
|
||||
|
||||
if strings.HasPrefix(tp, "*") {
|
||||
tp = tp[1:]
|
||||
}
|
||||
func primitiveType(tp string) (string, bool) {
|
||||
switch tp {
|
||||
case "string":
|
||||
return "String", nil
|
||||
case "int64":
|
||||
return "long", nil
|
||||
case "int", "int8", "int32":
|
||||
return "int", nil
|
||||
return "String", true
|
||||
case "int64", "uint64":
|
||||
return "long", true
|
||||
case "int", "int8", "int32", "uint", "uint8", "uint16", "uint32":
|
||||
return "int", true
|
||||
case "float", "float32", "float64":
|
||||
return "double", nil
|
||||
return "double", true
|
||||
case "bool":
|
||||
return "boolean", nil
|
||||
return "boolean", true
|
||||
}
|
||||
if strings.HasPrefix(tp, "[]") {
|
||||
tys, err := apiutil.DecomposeType(tp)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
if len(tys) == 0 {
|
||||
return "", fmt.Errorf("%s tp parse error", tp)
|
||||
}
|
||||
|
||||
return fmt.Sprintf("java.util.ArrayList<%s>", util.Title(tys[0])), nil
|
||||
} else if strings.HasPrefix(tp, "map") {
|
||||
tys, err := apiutil.DecomposeType(tp)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
if len(tys) == 2 {
|
||||
return "", fmt.Errorf("%s tp parse error", tp)
|
||||
}
|
||||
|
||||
return fmt.Sprintf("java.util.HashMap<String, %s>", util.Title(tys[1])), nil
|
||||
}
|
||||
return util.Title(tp), nil
|
||||
return "", false
|
||||
}
|
||||
|
||||
func genGetSet(writer io.Writer, members []spec.Member, indent int) error {
|
||||
t := template.Must(template.New("getSetTemplate").Parse(getSetTemplate))
|
||||
func genGetSet(writer io.Writer, defineStruct spec.DefineStruct, indent int) error {
|
||||
var members = defineStruct.GetBodyMembers()
|
||||
members = append(members, defineStruct.GetFormMembers()...)
|
||||
for _, member := range members {
|
||||
var tmplBytes bytes.Buffer
|
||||
|
||||
oty, err := goTypeToJava(member.Type)
|
||||
javaType, err := goTypeToJava(member.Type)
|
||||
if err != nil {
|
||||
return err
|
||||
return nil
|
||||
}
|
||||
|
||||
tyString := oty
|
||||
var property = util.Title(member.Name)
|
||||
var templateStr = getSetTemplate
|
||||
if javaType == "boolean" {
|
||||
templateStr = boolTemplate
|
||||
property = strings.TrimPrefix(property, "Is")
|
||||
property = strings.TrimPrefix(property, "is")
|
||||
}
|
||||
t := template.Must(template.New(templateStr).Parse(getSetTemplate))
|
||||
var tmplBytes bytes.Buffer
|
||||
|
||||
tyString := javaType
|
||||
decorator := ""
|
||||
if !isPrimitiveType(member.Type) {
|
||||
if member.IsOptional() {
|
||||
javaPrimitiveType := []string{"int", "long", "boolean", "float", "double", "short"}
|
||||
if !stringx.Contains(javaPrimitiveType, javaType) {
|
||||
if member.IsOptional() || member.IsOmitEmpty() {
|
||||
decorator = "@Nullable "
|
||||
} else {
|
||||
decorator = "@NotNull "
|
||||
@@ -150,12 +170,18 @@ func genGetSet(writer io.Writer, members []spec.Member, indent int) error {
|
||||
tyString = decorator + tyString
|
||||
}
|
||||
|
||||
tagName, err := member.GetPropertyName()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = t.Execute(&tmplBytes, map[string]string{
|
||||
"property": util.Title(member.Name),
|
||||
"property": property,
|
||||
"propertyValue": util.Untitle(member.Name),
|
||||
"tagValue": tagName,
|
||||
"type": tyString,
|
||||
"decorator": decorator,
|
||||
"returnType": oty,
|
||||
"returnType": javaType,
|
||||
"indent": indentString(indent),
|
||||
})
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user