diff --git a/generics.go b/generics.go index d17cfd4ff..6eefb33a8 100644 --- a/generics.go +++ b/generics.go @@ -56,6 +56,7 @@ func (pkgDefs *PackagesDefinitions) parametrizeStruct(original *TypeSpecDef, ful return spec } + pkgName := strings.Split(fullGenericForm, ".")[0] genericTypeName, genericParams := splitStructName(fullGenericForm) if genericParams == nil { return nil @@ -112,7 +113,7 @@ func (pkgDefs *PackagesDefinitions) parametrizeStruct(original *TypeSpecDef, ful genericTypeName = strings.Split(genericTypeName, ".")[1] } - var typeName = []string{TypeDocName(genericTypeName, parametrizedTypeSpec.TypeSpec)} + var typeName = []string{TypeDocName(fullTypeName(pkgName, genericTypeName), parametrizedTypeSpec.TypeSpec)} for _, def := range original.TypeSpec.TypeParams.List { if specDef, ok := genericParamTypeDefs[def.Names[0].Name]; ok { @@ -128,7 +129,7 @@ func (pkgDefs *PackagesDefinitions) parametrizeStruct(original *TypeSpecDef, ful } ident.Name = strings.Join(typeName, "-") - ident.Name = strings.Replace(ident.Name, ".", "_", -1) + ident.Name = string(IgnoreNameOverridePrefix) + strings.Replace(strings.Replace(ident.Name, ".", "_", -1), "_", ".", 1) parametrizedTypeSpec.TypeSpec.Name = ident origStructType := original.TypeSpec.Type.(*ast.StructType) diff --git a/parser.go b/parser.go index 8520721f0..ec78bb55b 100644 --- a/parser.go +++ b/parser.go @@ -1066,7 +1066,7 @@ func (parser *Parser) ParseDefinition(typeSpecDef *TypeSpecDef) (*Schema, error) } func fullTypeName(pkgName, typeName string) string { - if pkgName != "" { + if pkgName != "" && !ignoreNameOverride(typeName) { return pkgName + "." + typeName } diff --git a/schema.go b/schema.go index c7f2ec416..59dbc6fe6 100644 --- a/schema.go +++ b/schema.go @@ -34,6 +34,9 @@ const ( ANY = "any" // NIL represent a empty value. NIL = "nil" + + // IgnoreNameOverridePrefix Prepend to model to avoid renaming based on comment. + IgnoreNameOverridePrefix = '$' ) // CheckSchemaType checks if typeName is not a name of primitive type. @@ -132,7 +135,7 @@ func TransToValidCollectionFormat(format string) string { // TypeDocName get alias from comment '// @name ', otherwise the original type name to display in doc. func TypeDocName(pkgName string, spec *ast.TypeSpec) string { - if spec != nil { + if spec != nil && !ignoreNameOverride(pkgName) { if spec.Comment != nil { for _, comment := range spec.Comment.List { texts := strings.Split(strings.TrimSpace(strings.TrimLeft(comment.Text, "/")), " ") @@ -147,9 +150,17 @@ func TypeDocName(pkgName string, spec *ast.TypeSpec) string { } } + if ignoreNameOverride(pkgName) { + return pkgName[1:] + } + return pkgName } +func ignoreNameOverride(name string) bool { + return len(name) != 0 && name[0] == IgnoreNameOverridePrefix +} + // RefSchema build a reference schema. func RefSchema(refType string) *spec.Schema { return spec.RefSchema("#/definitions/" + refType)