fix inner type generate error (#377)

* fix point type bug

* optimized

* fix inner type error
This commit is contained in:
kingxt
2021-01-13 11:54:53 +08:00
committed by GitHub
parent cf3a1020b0
commit 9cd2015661
8 changed files with 92 additions and 54 deletions

View File

@@ -122,15 +122,6 @@ func (c *componentsContext) createComponent(dir, packetName string, ty spec.Type
return err
}
fp, created, err := apiutil.MaybeCreateFile(dir, modelDir, modelFile)
if err != nil {
return err
}
if !created {
return nil
}
defer fp.Close()
propertiesString, err := c.buildProperties(defineStruct)
if err != nil {
return err
@@ -160,6 +151,15 @@ func (c *componentsContext) createComponent(dir, packetName string, ty spec.Type
return err
}
fp, created, err := apiutil.MaybeCreateFile(dir, modelDir, modelFile)
if err != nil {
return err
}
if !created {
return nil
}
defer fp.Close()
buffer := new(bytes.Buffer)
t := template.Must(template.New("componentType").Parse(componentTemplate))
err = t.Execute(buffer, map[string]interface{}{
@@ -192,7 +192,7 @@ func (c *componentsContext) buildProperties(defineStruct spec.DefineStruct) (str
func (c *componentsContext) buildGetterSetter(defineStruct spec.DefineStruct) (string, error) {
var builder strings.Builder
if err := c.genGetSet(&builder, defineStruct, 1); err != nil {
if err := c.genGetSet(&builder, 1); err != nil {
return "", apiutil.WrapErr(err, "Type "+defineStruct.Name()+" get or set generate error")
}
@@ -209,18 +209,23 @@ func (c *componentsContext) writeType(writer io.Writer, defineStruct spec.Define
return nil
}
func (c *componentsContext) writeMembers(writer io.Writer, defineStruct spec.DefineStruct, indent int) error {
for _, member := range defineStruct.Members {
func (c *componentsContext) writeMembers(writer io.Writer, tp spec.Type, indent int) error {
definedType, ok := tp.(spec.DefineStruct)
if !ok {
pointType, ok := tp.(spec.PointerType)
if ok {
return c.writeMembers(writer, pointType.Type, indent)
}
return errors.New(fmt.Sprintf("type %s not supported", tp.Name()))
}
for _, member := range definedType.Members {
if member.IsInline {
defineStruct, ok := member.Type.(spec.DefineStruct)
if ok {
err := c.writeMembers(writer, defineStruct, indent)
if err != nil {
return err
}
continue
err := c.writeMembers(writer, member.Type, indent)
if err != nil {
return err
}
return errors.New("unsupported inline type %s" + member.Type.Name())
continue
}
if member.IsBodyMember() || member.IsFormMember() {
@@ -263,9 +268,8 @@ func (c *componentsContext) buildConstructor() (string, string, error) {
return params.String(), constructorSetter.String(), nil
}
func (c *componentsContext) genGetSet(writer io.Writer, defineStruct spec.DefineStruct, indent int) error {
var members = defineStruct.GetBodyMembers()
members = append(members, defineStruct.GetFormMembers()...)
func (c *componentsContext) genGetSet(writer io.Writer, indent int) error {
var members = c.members
for _, member := range members {
javaType, err := specTypeToJava(member.Type)
if err != nil {

View File

@@ -1,10 +1,8 @@
package javagen
import (
"bufio"
"bytes"
"fmt"
"os"
"strings"
"text/template"
@@ -20,6 +18,7 @@ import com.xhb.core.packet.HttpPacket;
import com.xhb.core.network.HttpRequestClient;
{{.imports}}
{{.doc}}
public class {{.packetName}} extends HttpPacket<{{.responseType}}> {
{{.paramsDeclaration}}
@@ -101,14 +100,28 @@ func createWith(dir string, api *spec.ApiSpec, route spec.Route, packetName stri
"requestType": util.Title(route.RequestTypeName()),
"HasRequestBody": hasRequestBody,
"imports": imports,
"doc": doc(route),
})
if err != nil {
return err
}
formatFile(&tmplBytes, fp)
_, err = fp.WriteString(formatSource(tmplBytes.String()))
return nil
}
func doc(route spec.Route) string {
comment := route.JoinedDoc()
if len(comment) > 0 {
formatter := `
/*
%s
*/`
return fmt.Sprintf(formatter, comment)
}
return ""
}
func getImports(api *spec.ApiSpec, packetName string) string {
var builder strings.Builder
allTypes := api.Types
@@ -118,24 +131,6 @@ func getImports(api *spec.ApiSpec, packetName string) string {
return builder.String()
}
func formatFile(tmplBytes *bytes.Buffer, file *os.File) {
scanner := bufio.NewScanner(tmplBytes)
builder := bufio.NewWriter(file)
defer builder.Flush()
preIsBreakLine := false
for scanner.Scan() {
text := strings.TrimSpace(scanner.Text())
if text == "" && preIsBreakLine {
continue
}
preIsBreakLine = text == ""
builder.WriteString(scanner.Text() + "\n")
}
if err := scanner.Err(); err != nil {
fmt.Println(err)
}
}
func paramsSet(route spec.Route) string {
path := route.Path
cops := strings.Split(path, "/")

View File

@@ -11,6 +11,10 @@ import (
)
func writeProperty(writer io.Writer, member spec.Member, indent int) error {
if len(member.Comment) > 0 {
writeIndent(writer, indent)
fmt.Fprint(writer, member.Comment+util.NL)
}
writeIndent(writer, indent)
ty, err := specTypeToJava(member.Type)
ty = strings.Replace(ty, "*", "", 1)