fix: package name
This commit is contained in:
+1
-16
@@ -1,18 +1,15 @@
|
||||
package generator
|
||||
|
||||
import (
|
||||
"edmand46/arpack/parser"
|
||||
"github.com/edmand46/arpack/parser"
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// GenerateCSharp генерирует C# unsafe код для списка сообщений.
|
||||
// namespace — пространство имён (например, "Ragono.Messages").
|
||||
func GenerateCSharp(messages []parser.Message, namespace string) ([]byte, error) {
|
||||
return GenerateCSharpSchema(parser.Schema{Messages: messages}, namespace)
|
||||
}
|
||||
|
||||
// GenerateCSharpSchema генерирует C# код для полной схемы, включая enum-ы.
|
||||
func GenerateCSharpSchema(schema parser.Schema, namespace string) ([]byte, error) {
|
||||
messages := schema.Messages
|
||||
var b strings.Builder
|
||||
@@ -34,11 +31,9 @@ func GenerateCSharpSchema(schema parser.Schema, namespace string) ([]byte, error
|
||||
enumNames[enum.Name] = struct{}{}
|
||||
}
|
||||
|
||||
wroteSection := false
|
||||
for _, enum := range schema.Enums {
|
||||
writeCSharpEnum(&b, enum)
|
||||
b.WriteString("\n")
|
||||
wroteSection = true
|
||||
}
|
||||
|
||||
for i, msg := range messages {
|
||||
@@ -47,8 +42,6 @@ func GenerateCSharpSchema(schema parser.Schema, namespace string) ([]byte, error
|
||||
}
|
||||
if i < len(messages)-1 {
|
||||
b.WriteString("\n")
|
||||
} else if wroteSection {
|
||||
// leave a single blank line between the last enum and the first struct only
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,13 +68,11 @@ func writeCSharpMessage(b *strings.Builder, msg parser.Message, enumNames map[st
|
||||
b.WriteString(msg.Name)
|
||||
b.WriteString("\n {\n")
|
||||
|
||||
// Поля
|
||||
for _, f := range msg.Fields {
|
||||
fmt.Fprintf(b, " public %s %s;\n", csharpTypeName(f, enumNames), f.Name)
|
||||
}
|
||||
b.WriteString("\n")
|
||||
|
||||
// Serialize
|
||||
b.WriteString(" public int Serialize(byte* buffer)\n")
|
||||
b.WriteString(" {\n")
|
||||
b.WriteString(" byte* ptr = buffer;\n")
|
||||
@@ -97,7 +88,6 @@ func writeCSharpMessage(b *strings.Builder, msg parser.Message, enumNames map[st
|
||||
b.WriteString(" return (int)(ptr - buffer);\n")
|
||||
b.WriteString(" }\n\n")
|
||||
|
||||
// Deserialize
|
||||
fmt.Fprintf(b, " public static int Deserialize(byte* buffer, out %s msg)\n", msg.Name)
|
||||
b.WriteString(" {\n")
|
||||
b.WriteString(" byte* ptr = buffer;\n")
|
||||
@@ -135,8 +125,6 @@ func writeCSharpBoolGroupDeserialize(b *strings.Builder, recv string, bools []pa
|
||||
}
|
||||
}
|
||||
|
||||
// --- Serialize ---
|
||||
|
||||
func writeCSharpSerializeField(b *strings.Builder, f parser.Field, indent string, enumNames map[string]struct{}) error {
|
||||
switch f.Kind {
|
||||
case parser.KindPrimitive:
|
||||
@@ -220,7 +208,6 @@ func writeCSharpSerializePrimitive(
|
||||
case parser.KindUint64:
|
||||
fmt.Fprintf(b, "%s*(ulong*)ptr = %s; ptr += 8;\n", indent, valueExpr)
|
||||
case parser.KindString:
|
||||
// UTF-8: uint16 byteCount + bytes
|
||||
lenVar := "_slen" + sanitizeVarName(access)
|
||||
fmt.Fprintf(b, "%sint %s = %s != null ? Encoding.UTF8.GetByteCount(%s) : 0;\n",
|
||||
indent, lenVar, valueExpr, valueExpr)
|
||||
@@ -250,8 +237,6 @@ func writeCSharpSerializeQuant(b *strings.Builder, access string, f parser.Field
|
||||
return nil
|
||||
}
|
||||
|
||||
// --- Deserialize ---
|
||||
|
||||
func writeCSharpDeserializeField(
|
||||
b *strings.Builder,
|
||||
recv string,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package generator
|
||||
|
||||
import (
|
||||
"edmand46/arpack/parser"
|
||||
"github.com/edmand46/arpack/parser"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
|
||||
+1
-11
@@ -1,19 +1,16 @@
|
||||
package generator
|
||||
|
||||
import (
|
||||
"edmand46/arpack/parser"
|
||||
"github.com/edmand46/arpack/parser"
|
||||
"fmt"
|
||||
"go/format"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// GenerateGo генерирует Go-код сериализации для списка сообщений.
|
||||
// pkgName — имя пакета в котором будет сгенерированный файл.
|
||||
func GenerateGo(messages []parser.Message, pkgName string) ([]byte, error) {
|
||||
return GenerateGoSchema(parser.Schema{Messages: messages}, pkgName)
|
||||
}
|
||||
|
||||
// GenerateGoSchema генерирует Go-код сериализации для полной схемы.
|
||||
func GenerateGoSchema(schema parser.Schema, pkgName string) ([]byte, error) {
|
||||
messages := schema.Messages
|
||||
var b strings.Builder
|
||||
@@ -46,7 +43,6 @@ func GenerateGoSchema(schema parser.Schema, pkgName string) ([]byte, error) {
|
||||
func writeGoMessage(b *strings.Builder, msg parser.Message) error {
|
||||
segs := segmentFields(msg.Fields)
|
||||
|
||||
// Marshal
|
||||
fmt.Fprintf(b, "func (m *%s) Marshal(buf []byte) []byte {\n", msg.Name)
|
||||
for i, seg := range segs {
|
||||
if seg.single != nil {
|
||||
@@ -59,7 +55,6 @@ func writeGoMessage(b *strings.Builder, msg parser.Message) error {
|
||||
}
|
||||
b.WriteString("\treturn buf\n}\n\n")
|
||||
|
||||
// Unmarshal — возвращает кол-во потреблённых байт
|
||||
fmt.Fprintf(b, "func (m *%s) Unmarshal(data []byte) (int, error) {\n", msg.Name)
|
||||
minSize := packedMinWireSize(msg.Fields)
|
||||
fmt.Fprintf(b, "\tif len(data) < %d {\n", minSize)
|
||||
@@ -99,8 +94,6 @@ func writeGoBoolGroupUnmarshal(b *strings.Builder, recv string, bools []parser.F
|
||||
}
|
||||
}
|
||||
|
||||
// --- Marshal ---
|
||||
|
||||
func writeGoMarshalField(b *strings.Builder, recv string, f parser.Field, indent string) error {
|
||||
access := recv + "." + f.Name
|
||||
switch f.Kind {
|
||||
@@ -197,8 +190,6 @@ func writeGoMarshalQuant(b *strings.Builder, access string, f parser.Field, inde
|
||||
return nil
|
||||
}
|
||||
|
||||
// --- Unmarshal ---
|
||||
|
||||
func writeGoUnmarshalField(b *strings.Builder, recv string, f parser.Field, indent string) error {
|
||||
access := recv + "." + f.Name
|
||||
switch f.Kind {
|
||||
@@ -361,7 +352,6 @@ func goUnmarshalValueExpr(expr string, f parser.Field) string {
|
||||
return f.NamedType + "(" + expr + ")"
|
||||
}
|
||||
|
||||
// sanitizeVarName превращает "m.Pos[_i]" в "_mPos_i".
|
||||
func sanitizeVarName(s string) string {
|
||||
var b strings.Builder
|
||||
for _, c := range s {
|
||||
|
||||
+3
-10
@@ -1,20 +1,16 @@
|
||||
package generator
|
||||
|
||||
import "edmand46/arpack/parser"
|
||||
import "github.com/edmand46/arpack/parser"
|
||||
|
||||
// segment — либо группа bool (1–8 полей → 1 байт), либо одиночное поле.
|
||||
type segment struct {
|
||||
bools []parser.Field // non-empty: bool-группа
|
||||
single *parser.Field // non-nil: любое не-bool поле
|
||||
bools []parser.Field
|
||||
single *parser.Field
|
||||
}
|
||||
|
||||
// isBoolField возвращает true если поле — нативный bool (не массив, не слайс).
|
||||
func isBoolField(f parser.Field) bool {
|
||||
return f.Kind == parser.KindPrimitive && f.Primitive == parser.KindBool
|
||||
}
|
||||
|
||||
// segmentFields разбивает поля структуры на сегменты.
|
||||
// Последовательные bool-поля группируются по 8 в один сегмент.
|
||||
func segmentFields(fields []parser.Field) []segment {
|
||||
var segs []segment
|
||||
i := 0
|
||||
@@ -25,7 +21,6 @@ func segmentFields(fields []parser.Field) []segment {
|
||||
i++
|
||||
continue
|
||||
}
|
||||
// Собираем последовательные bool-поля группами по 8
|
||||
for i < len(fields) && isBoolField(fields[i]) {
|
||||
var group []parser.Field
|
||||
for i < len(fields) && isBoolField(fields[i]) && len(group) < 8 {
|
||||
@@ -38,7 +33,6 @@ func segmentFields(fields []parser.Field) []segment {
|
||||
return segs
|
||||
}
|
||||
|
||||
// packedMinWireSize вычисляет минимальный размер буфера с учётом упаковки bool.
|
||||
func packedMinWireSize(fields []parser.Field) int {
|
||||
total := 0
|
||||
for _, seg := range segmentFields(fields) {
|
||||
@@ -50,7 +44,6 @@ func packedMinWireSize(fields []parser.Field) int {
|
||||
total += s
|
||||
}
|
||||
} else {
|
||||
// Группа bool → 1 байт
|
||||
total += 1
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user