diff --git a/pkg/concepts/type.go b/pkg/concepts/type.go index f155455..2679619 100644 --- a/pkg/concepts/type.go +++ b/pkg/concepts/type.go @@ -17,7 +17,6 @@ limitations under the License. package concepts import ( - "log" "sort" "github.com/openshift-online/ocm-api-metamodel/pkg/names" @@ -193,7 +192,6 @@ func (t *Type) RemoveAttribute(name *names.Name) { } for i, attribute := range t.attributes { if attribute.Name().Equals(name) { - log.Printf("---------- Deleting attribute %s", name.String()) t.attributes = append(t.attributes[:i], t.attributes[i+1:]...) } } diff --git a/pkg/concepts/version.go b/pkg/concepts/version.go index 603548d..3681c45 100644 --- a/pkg/concepts/version.go +++ b/pkg/concepts/version.go @@ -106,6 +106,13 @@ func (v *Version) AddType(typ *Type) { } } +// AddType adds the given type to the version. +func (v *Version) AddTypeWithoutOwner(typ *Type) { + if typ != nil { + v.types[typ.Name().String()] = typ + } +} + // AddTypes adds the given types to the version. func (v *Version) AddTypes(types []*Type) { for _, typ := range types { diff --git a/pkg/generators/golang/builders_generator.go b/pkg/generators/golang/builders_generator.go index ebec888..0e62e27 100644 --- a/pkg/generators/golang/builders_generator.go +++ b/pkg/generators/golang/builders_generator.go @@ -189,6 +189,7 @@ func (g *BuildersGenerator) generateStructBuilderFile(typ *concepts.Type) error Function("builderName", g.builderName). Function("fieldName", g.fieldName). Function("fieldType", g.fieldType). + Function("selectorType", g.selectorType). Function("objectName", g.objectName). Function("setterName", g.setterName). Function("setterType", g.setterType). @@ -685,6 +686,11 @@ func (g *BuildersGenerator) fieldType(attribute *concepts.Attribute) *TypeRefere return ref } +func (g *BuildersGenerator) selectorType(attribute *concepts.Attribute) string { + ref := g.fieldType(attribute) + return ref.selector +} + func (g *BuildersGenerator) setterName(attribute *concepts.Attribute) string { name := annotations.GoName(attribute) if name == "" { diff --git a/pkg/generators/golang/types_calculator.go b/pkg/generators/golang/types_calculator.go index 7b0fdcb..f960174 100644 --- a/pkg/generators/golang/types_calculator.go +++ b/pkg/generators/golang/types_calculator.go @@ -248,10 +248,14 @@ func (c *TypesCalculator) ValueReference(typ *concepts.Type) *TypeReference { // the nil value. func (c *TypesCalculator) NullableReference(typ *concepts.Type) *TypeReference { switch { - case (typ.IsScalar() && !typ.IsInterface()) || typ.IsStruct(): + case (typ.IsScalar() && !typ.IsInterface()): ref := c.ValueReference(typ) ref.text = fmt.Sprintf("*%s", ref.text) return ref + case typ.IsStruct(): + ref := c.ValueReference(typ) + ref.text = fmt.Sprintf("*%s.%s", ref.selector, ref.name) + return ref default: return c.ValueReference(typ) } diff --git a/pkg/language/checks.go b/pkg/language/checks.go index e3cbe4b..31fc7f9 100644 --- a/pkg/language/checks.go +++ b/pkg/language/checks.go @@ -520,8 +520,8 @@ func (r *Reader) checkParameter(parameter *concepts.Parameter) { } if typ != nil && typ != parameter.Type() { r.reporter.Errorf( - "Type of default value of parameter '%s' should be '%s', instead it was %s", - parameter, parameter.Type(), typ.Name().String(), + "Type of default value of parameter '%s' should be '%s'", + parameter, parameter.Type(), ) } } diff --git a/pkg/language/reader.go b/pkg/language/reader.go index 8836f66..f59b789 100644 --- a/pkg/language/reader.go +++ b/pkg/language/reader.go @@ -22,6 +22,7 @@ package language import ( "fmt" "io/ioutil" + "log" "os" "path/filepath" "strconv" @@ -440,12 +441,11 @@ func (r *Reader) ExitClassDecl(ctx *ClassDeclContext) { } input := r.inputs[0] - currVersion := r.service.Versions()[0] path = strings.TrimPrefix(path, "/") components := strings.Split(path, "/") referencedServiceName := components[0] referencedVersion := components[1] - referencedType := components[2] + referencedTypeName := components[2] // Create an ad-hoc reader and model for the specific referenced service. refReader := NewReader(). @@ -462,31 +462,31 @@ func (r *Reader) ExitClassDecl(ctx *ClassDeclContext) { refVersion := refReader.service.FindVersion(names.ParseUsingSeparator(referencedVersion, "_")) // Once loading the service, we find the reference type // then recursively iterate the type tree and add the types to the current version. - for _, currType := range refVersion.Types() { - if strings.Compare(currType.Name().String(), referencedType) == 0 { - r.recursivelyAddTypeToVersion(currVersion, currType) + for _, referencedType := range refVersion.Types() { + if strings.Compare(referencedType.Name().String(), referencedTypeName) == 0 { + r.recursivelyAddTypeToVersion(typ, referencedType) } } } } // A helper function to recursively add types to a version -func (r *Reader) recursivelyAddTypeToVersion(version *concepts.Version, typ *concepts.Type) { - var attributesToRemove concepts.AttributeSlice - for _, attribute := range typ.Attributes() { - // We wish to define links explicitly and not inherint them - // only the attribute fields. - if version.FindType(attribute.Type().Name()) == nil && !attribute.Link() { - r.recursivelyAddTypeToVersion(version, attribute.Type()) - } +func (r *Reader) recursivelyAddTypeToVersion(currType *concepts.Type, + referencedType *concepts.Type) { + log.Printf("Adding type %s from version %s to version %s", + referencedType.Name().String(), + referencedType.Owner().Name().String(), + r.version.Name().String(), + ) + for _, attribute := range referencedType.Attributes() { if attribute.Link() { - attributesToRemove = append(attributesToRemove, attribute) + r.version.AddTypeWithoutOwner(attribute.Type()) + } + if r.version.FindType(attribute.Type().Name()) == nil && !attribute.Link() { + r.recursivelyAddTypeToVersion(currType, attribute.Type()) } } - for _, attribute := range attributesToRemove { - typ.RemoveAttribute(attribute.Name()) - } - version.AddType(typ) + r.version.AddType(referencedType) } func (r *Reader) ExitStructDecl(ctx *StructDeclContext) {