Skip to content

Commit 5bed476

Browse files
authored
Merge pull request #6 from moznion/embedding
Add support for embedding
2 parents 8085fac + 103c8b0 commit 5bed476

File tree

4 files changed

+79
-3
lines changed

4 files changed

+79
-3
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/moznion/gonstructor
22

3-
go 1.14
3+
go 1.15
44

55
require (
66
github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334

internal/constructor/field_collector.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"go/ast"
66
"go/types"
77
"reflect"
8+
"strings"
89
)
910

1011
const gonstructorTag = "gonstructor"
@@ -51,9 +52,22 @@ func convertStructFieldsToConstructorOnes(fields []*ast.Field) []*Field {
5152
shouldIgnore = customTag.Get(gonstructorTag) == "-"
5253
}
5354

55+
fieldType := types.ExprString(field.Type)
56+
57+
var fieldName string
58+
if len(field.Names) > 0 {
59+
fieldName = field.Names[0].Name
60+
} else {
61+
// split 'mypackage.MyType'
62+
chunks := strings.Split(fieldType, ".")
63+
64+
// it could be a pointer: '*mypackage.MyType' or '*MyType'
65+
fieldName = strings.TrimPrefix(chunks[len(chunks)-1], "*")
66+
}
67+
5468
fs[i] = &Field{
55-
FieldName: field.Names[0].Name,
56-
FieldType: types.ExprString(field.Type),
69+
FieldName: fieldName,
70+
FieldType: fieldType,
5771
ShouldIgnore: shouldIgnore,
5872
}
5973
}

internal/test/structure.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,19 @@ type StructureWithInit struct {
2626
func (structure *StructureWithInit) initialize() {
2727
structure.status = "ok"
2828
}
29+
30+
type Embedded struct {
31+
Bar string
32+
}
33+
34+
//go:generate sh -c "$(cd ./\"$(git rev-parse --show-cdup)\" || exit; pwd)/dist/gonstructor_test --type=StructureWithEmbedding --constructorTypes=allArgs,builder --withGetter"
35+
type StructureWithEmbedding struct {
36+
Embedded
37+
foo string
38+
}
39+
40+
//go:generate sh -c "$(cd ./\"$(git rev-parse --show-cdup)\" || exit; pwd)/dist/gonstructor_test --type=StructureWithPointerEmbedding --constructorTypes=allArgs,builder --withGetter"
41+
type StructureWithPointerEmbedding struct {
42+
*Embedded
43+
foo string
44+
}

internal/test/structure_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,49 @@ func TestStructureWithInitBuilder(t *testing.T) {
8484
assert.EqualValues(t, "ok", got.status)
8585
assert.EqualValues(t, nil, got.qux)
8686
}
87+
88+
func TestStructureWithEmbeddingAllArgsConstructor(t *testing.T) {
89+
got := NewStructureWithEmbedding(Embedded{Bar: "bar"}, "foo")
90+
assert.IsType(t, &StructureWithEmbedding{}, got)
91+
92+
assert.EqualValues(t, "foo", got.foo)
93+
assert.EqualValues(t, "bar", got.Bar)
94+
assert.EqualValues(t, "bar", got.Embedded.Bar)
95+
96+
// test for getters
97+
assert.EqualValues(t, "foo", got.GetFoo())
98+
assert.EqualValues(t, "bar", got.GetEmbedded().Bar)
99+
}
100+
101+
func TestStructureWithEmbeddingBuilder(t *testing.T) {
102+
b := NewStructureWithEmbeddingBuilder()
103+
got := b.Foo("foo").Embedded(Embedded{Bar: "bar"}).Build()
104+
assert.IsType(t, &StructureWithEmbedding{}, got)
105+
106+
assert.EqualValues(t, "foo", got.foo)
107+
assert.EqualValues(t, "bar", got.Bar)
108+
assert.EqualValues(t, "bar", got.Embedded.Bar)
109+
}
110+
111+
func TestStructureWithPointerEmbeddingAllArgsConstructor(t *testing.T) {
112+
got := NewStructureWithPointerEmbedding(&Embedded{Bar: "bar"}, "foo")
113+
assert.IsType(t, &StructureWithPointerEmbedding{}, got)
114+
115+
assert.EqualValues(t, "foo", got.foo)
116+
assert.EqualValues(t, "bar", got.Bar)
117+
assert.EqualValues(t, "bar", got.Embedded.Bar)
118+
119+
// test for getters
120+
assert.EqualValues(t, "foo", got.GetFoo())
121+
assert.EqualValues(t, "bar", got.GetEmbedded().Bar)
122+
}
123+
124+
func TestStructureWithPointerEmbeddingBuilder(t *testing.T) {
125+
b := NewStructureWithPointerEmbeddingBuilder()
126+
got := b.Foo("foo").Embedded(&Embedded{Bar: "bar"}).Build()
127+
assert.IsType(t, &StructureWithPointerEmbedding{}, got)
128+
129+
assert.EqualValues(t, "foo", got.foo)
130+
assert.EqualValues(t, "bar", got.Bar)
131+
assert.EqualValues(t, "bar", got.Embedded.Bar)
132+
}

0 commit comments

Comments
 (0)