@@ -12,9 +12,15 @@ import (
12
12
const accessorSliceTemplate = `// {{ .fieldName }} returns the {{ .fieldName }} associated with this {{ .structName }}.
13
13
func (ms {{ .structName }}) {{ .fieldName }}() {{ .packageName }}{{ .returnType }} {
14
14
{{- if .isCommon }}
15
- return {{ .packageName }}{{ .returnType }}(internal.New{{ .returnType }}(&ms.{{ .origAccessor }}.{{ .fieldName }}))
15
+ return {{ .packageName }}{{ .returnType }}(internal.New{{ .returnType }}(&ms.{{ .origAccessor }}.{{ .fieldName }}
16
+ {{- if .isBaseStructCommon -}}
17
+ , internal.Get{{ .structName }}State(internal.{{ .structName }}(ms))
18
+ {{- else -}}
19
+ , ms.state
20
+ {{- end -}}
21
+ ))
16
22
{{- else }}
17
- return new{{ .returnType }}(&ms.{{ .origAccessor }}.{{ .fieldName }})
23
+ return new{{ .returnType }}(&ms.{{ .origAccessor }}.{{ .fieldName }}, ms.state )
18
24
{{- end }}
19
25
}`
20
26
@@ -36,14 +42,14 @@ const setTestValueTemplate = `{{ if .isCommon -}}
36
42
{{- else -}}
37
43
fillTest{{ .returnType }}(new
38
44
{{- end -}}
39
- {{ .returnType }}(&tv.orig.{{ .fieldName }}))`
45
+ {{ .returnType }}(&tv.orig.{{ .fieldName }}, tv.state ))`
40
46
41
47
const accessorsMessageValueTemplate = `// {{ .fieldName }} returns the {{ .lowerFieldName }} associated with this {{ .structName }}.
42
48
func (ms {{ .structName }}) {{ .fieldName }}() {{ .packageName }}{{ .returnType }} {
43
49
{{- if .isCommon }}
44
- return {{ .packageName }}{{ .returnType }}(internal.New{{ .returnType }}(&ms.{{ .origAccessor }}.{{ .fieldName }}))
50
+ return {{ .packageName }}{{ .returnType }}(internal.New{{ .returnType }}(&ms.{{ .origAccessor }}.{{ .fieldName }}, ms.state ))
45
51
{{- else }}
46
- return new{{ .returnType }}(&ms.{{ .origAccessor }}.{{ .fieldName }})
52
+ return new{{ .returnType }}(&ms.{{ .origAccessor }}.{{ .fieldName }}, ms.state )
47
53
{{- end }}
48
54
}`
49
55
@@ -65,12 +71,13 @@ func (ms {{ .structName }}) {{ .fieldName }}() {{ .packageName }}{{ .returnType
65
71
66
72
// Set{{ .fieldName }} replaces the {{ .lowerFieldName }} associated with this {{ .structName }}.
67
73
func (ms {{ .structName }}) Set{{ .fieldName }}(v {{ .returnType }}) {
74
+ ms.{{ .stateAccessor }}.AssertMutable()
68
75
ms.{{ .origAccessor }}.{{ .fieldName }} = v
69
76
}`
70
77
71
78
const accessorsPrimitiveSliceTemplate = `// {{ .fieldName }} returns the {{ .lowerFieldName }} associated with this {{ .structName }}.
72
79
func (ms {{ .structName }}) {{ .fieldName }}() {{ .packageName }}{{ .returnType }} {
73
- return {{ .packageName }}{{ .returnType }}(internal.New{{ .returnType }}(&ms.{{ .origAccessor }}.{{ .fieldName }}))
80
+ return {{ .packageName }}{{ .returnType }}(internal.New{{ .returnType }}(&ms.{{ .origAccessor }}.{{ .fieldName }}, ms.state ))
74
81
}`
75
82
76
83
const oneOfTypeAccessorTemplate = `// {{ .typeFuncName }} returns the type of the {{ .lowerOriginFieldName }} for this {{ .structName }}.
@@ -108,7 +115,7 @@ func (ms {{ .structName }}) {{ .fieldName }}() {{ .returnType }} {
108
115
if !ok {
109
116
return {{ .returnType }}{}
110
117
}
111
- return new{{ .returnType }}(v.{{ .fieldName }})
118
+ return new{{ .returnType }}(v.{{ .fieldName }}, ms.state )
112
119
}
113
120
114
121
// SetEmpty{{ .fieldName }} sets an empty {{ .lowerFieldName }} to this {{ .structName }}.
@@ -117,16 +124,19 @@ func (ms {{ .structName }}) {{ .fieldName }}() {{ .returnType }} {
117
124
//
118
125
// Calling this function on zero-initialized {{ .structName }} will cause a panic.
119
126
func (ms {{ .structName }}) SetEmpty{{ .fieldName }}() {{ .returnType }} {
127
+ ms.state.AssertMutable()
120
128
val := &{{ .originFieldPackageName }}.{{ .fieldName }}{}
121
129
ms.orig.{{ .originOneOfFieldName }} = &{{ .originStructType }}{{ "{" }}{{ .fieldName }}: val}
122
- return new{{ .returnType }}(val)
130
+ return new{{ .returnType }}(val, ms.state )
123
131
}`
124
132
125
133
const accessorsOneOfMessageTestTemplate = `func Test{{ .structName }}_{{ .fieldName }}(t *testing.T) {
126
134
ms := New{{ .structName }}()
127
135
fillTest{{ .returnType }}(ms.SetEmpty{{ .fieldName }}())
128
136
assert.Equal(t, {{ .typeName }}, ms.{{ .originOneOfTypeFuncName }}())
129
137
assert.Equal(t, generateTest{{ .returnType }}(), ms.{{ .fieldName }}())
138
+ sharedState := internal.StateReadOnly
139
+ assert.Panics(t, func() { new{{ .structName }}(&{{ .originStructName }}{}, &sharedState).SetEmpty{{ .fieldName }}() })
130
140
}
131
141
132
142
func Test{{ .structName }}_CopyTo_{{ .fieldName }}(t *testing.T) {
@@ -135,6 +145,8 @@ func Test{{ .structName }}_CopyTo_{{ .fieldName }}(t *testing.T) {
135
145
dest := New{{ .structName }}()
136
146
ms.CopyTo(dest)
137
147
assert.Equal(t, ms, dest)
148
+ sharedState := internal.StateReadOnly
149
+ assert.Panics(t, func() { ms.CopyTo(new{{ .structName }}(&{{ .originStructName }}{}, &sharedState)) })
138
150
}`
139
151
140
152
const copyToValueOneOfMessageTemplate = ` case {{ .typeName }}:
@@ -147,6 +159,7 @@ func (ms {{ .structName }}) {{ .accessorFieldName }}() {{ .returnType }} {
147
159
148
160
// Set{{ .accessorFieldName }} replaces the {{ .lowerFieldName }} associated with this {{ .structName }}.
149
161
func (ms {{ .structName }}) Set{{ .accessorFieldName }}(v {{ .returnType }}) {
162
+ ms.state.AssertMutable()
150
163
ms.orig.{{ .originOneOfFieldName }} = &{{ .originStructType }}{
151
164
{{ .originFieldName }}: v,
152
165
}
@@ -158,13 +171,17 @@ const accessorsOneOfPrimitiveTestTemplate = `func Test{{ .structName }}_{{ .acce
158
171
ms.Set{{ .accessorFieldName }}({{ .testValue }})
159
172
assert.Equal(t, {{ .testValue }}, ms.{{ .accessorFieldName }}())
160
173
assert.Equal(t, {{ .typeName }}, ms.{{ .originOneOfTypeFuncName }}())
174
+ sharedState := internal.StateReadOnly
175
+ assert.Panics(t, func() { new{{ .structName }}(&{{ .originStructName }}{}, &sharedState).Set{{ .accessorFieldName }}({{ .testValue }}) })
161
176
}`
162
177
163
178
const accessorsPrimitiveTestTemplate = `func Test{{ .structName }}_{{ .fieldName }}(t *testing.T) {
164
179
ms := New{{ .structName }}()
165
180
assert.Equal(t, {{ .defaultVal }}, ms.{{ .fieldName }}())
166
181
ms.Set{{ .fieldName }}({{ .testValue }})
167
182
assert.Equal(t, {{ .testValue }}, ms.{{ .fieldName }}())
183
+ sharedState := internal.StateReadOnly
184
+ assert.Panics(t, func() { new{{ .structName }}(&{{ .originStructName }}{}, &sharedState).Set{{ .fieldName }}({{ .testValue }}) })
168
185
}`
169
186
170
187
const accessorsPrimitiveTypedTemplate = `// {{ .fieldName }} returns the {{ .lowerFieldName }} associated with this {{ .structName }}.
@@ -174,6 +191,7 @@ func (ms {{ .structName }}) {{ .fieldName }}() {{ .packageName }}{{ .returnType
174
191
175
192
// Set{{ .fieldName }} replaces the {{ .lowerFieldName }} associated with this {{ .structName }}.
176
193
func (ms {{ .structName }}) Set{{ .fieldName }}(v {{ .packageName }}{{ .returnType }}) {
194
+ ms.state.AssertMutable()
177
195
ms.orig.{{ .originFieldName }} = {{ .rawType }}(v)
178
196
}`
179
197
@@ -205,11 +223,13 @@ func (ms {{ .structName }}) Has{{ .fieldName }}() bool {
205
223
206
224
// Set{{ .fieldName }} replaces the {{ .lowerFieldName }} associated with this {{ .structName }}.
207
225
func (ms {{ .structName }}) Set{{ .fieldName }}(v {{ .returnType }}) {
226
+ ms.state.AssertMutable()
208
227
ms.orig.{{ .fieldName }}_ = &{{ .originStructType }}{{ "{" }}{{ .fieldName }}: v}
209
228
}
210
229
211
230
// Remove{{ .fieldName }} removes the {{ .lowerFieldName }} associated with this {{ .structName }}.
212
231
func (ms {{ .structName }}) Remove{{ .fieldName }}() {
232
+ ms.state.AssertMutable()
213
233
ms.orig.{{ .fieldName }}_ = nil
214
234
}`
215
235
@@ -281,6 +301,7 @@ func (sf *sliceField) templateFields(ms *messageValueStruct) map[string]any {
281
301
}(),
282
302
"returnType" : sf .returnSlice .getName (),
283
303
"origAccessor" : origAccessor (ms ),
304
+ "stateAccessor" : stateAccessor (ms ),
284
305
"isCommon" : usedByOtherDataTypes (sf .returnSlice .getPackageName ()),
285
306
"isBaseStructCommon" : usedByOtherDataTypes (ms .packageName ),
286
307
}
@@ -337,7 +358,8 @@ func (mf *messageValueField) templateFields(ms *messageValueStruct) map[string]a
337
358
}
338
359
return ""
339
360
}(),
340
- "origAccessor" : origAccessor (ms ),
361
+ "origAccessor" : origAccessor (ms ),
362
+ "stateAccessor" : stateAccessor (ms ),
341
363
}
342
364
}
343
365
@@ -378,14 +400,16 @@ func (pf *primitiveField) GenerateCopyToValue(_ *messageValueStruct) string {
378
400
379
401
func (pf * primitiveField ) templateFields (ms * messageValueStruct ) map [string ]any {
380
402
return map [string ]any {
381
- "structName" : ms .getName (),
382
- "packageName" : "" ,
383
- "defaultVal" : pf .defaultVal ,
384
- "fieldName" : pf .fieldName ,
385
- "lowerFieldName" : strings .ToLower (pf .fieldName ),
386
- "testValue" : pf .testVal ,
387
- "returnType" : pf .returnType ,
388
- "origAccessor" : origAccessor (ms ),
403
+ "structName" : ms .getName (),
404
+ "packageName" : "" ,
405
+ "defaultVal" : pf .defaultVal ,
406
+ "fieldName" : pf .fieldName ,
407
+ "lowerFieldName" : strings .ToLower (pf .fieldName ),
408
+ "testValue" : pf .testVal ,
409
+ "returnType" : pf .returnType ,
410
+ "origAccessor" : origAccessor (ms ),
411
+ "stateAccessor" : stateAccessor (ms ),
412
+ "originStructName" : ms .originFullName ,
389
413
}
390
414
}
391
415
@@ -513,6 +537,7 @@ func (psf *primitiveSliceField) templateFields(ms *messageValueStruct) map[strin
513
537
"lowerFieldName" : strings .ToLower (psf .fieldName ),
514
538
"testValue" : psf .testVal ,
515
539
"origAccessor" : origAccessor (ms ),
540
+ "stateAccessor" : stateAccessor (ms ),
516
541
}
517
542
}
518
543
@@ -576,6 +601,7 @@ func (of *oneOfField) templateFields(ms *messageValueStruct) map[string]any {
576
601
"originFieldName" : of .originFieldName ,
577
602
"lowerOriginFieldName" : strings .ToLower (of .originFieldName ),
578
603
"origAccessor" : origAccessor (ms ),
604
+ "stateAccessor" : stateAccessor (ms ),
579
605
"values" : of .values ,
580
606
"originTypePrefix" : ms .originFullName + "_" ,
581
607
}
@@ -653,6 +679,7 @@ func (opv *oneOfPrimitiveValue) templateFields(ms *messageValueStruct, of *oneOf
653
679
"returnType" : opv .returnType ,
654
680
"originFieldName" : opv .originFieldName ,
655
681
"originOneOfFieldName" : of .originFieldName ,
682
+ "originStructName" : ms .originFullName ,
656
683
"originStructType" : ms .originFullName + "_" + opv .originFieldName ,
657
684
}
658
685
}
@@ -687,7 +714,7 @@ func (omv *oneOfMessageValue) GenerateTests(ms *messageValueStruct, of *oneOfFie
687
714
func (omv * oneOfMessageValue ) GenerateSetWithTestValue (ms * messageValueStruct , of * oneOfField ) string {
688
715
return "\t tv.orig." + of .originFieldName + " = &" + ms .originFullName + "_" + omv .fieldName + "{" + omv .
689
716
fieldName + ": &" + omv .originFieldPackageName + "." + omv .fieldName + "{}}\n " +
690
- "\t fillTest" + omv .returnMessage .structName + "(new" + omv .fieldName + "(tv.orig.Get" + omv .fieldName + "()))"
717
+ "\t fillTest" + omv .returnMessage .structName + "(new" + omv .fieldName + "(tv.orig.Get" + omv .fieldName + "(), tv.state ))"
691
718
}
692
719
693
720
func (omv * oneOfMessageValue ) GenerateCopyToValue (ms * messageValueStruct , of * oneOfField , sb * bytes.Buffer ) {
@@ -713,6 +740,7 @@ func (omv *oneOfMessageValue) templateFields(ms *messageValueStruct, of *oneOfFi
713
740
"originOneOfTypeFuncName" : of .typeFuncName (),
714
741
"lowerFieldName" : strings .ToLower (omv .fieldName ),
715
742
"originFieldPackageName" : omv .originFieldPackageName ,
743
+ "originStructName" : ms .originFullName ,
716
744
"originStructType" : ms .originFullName + "_" + omv .fieldName ,
717
745
}
718
746
}
@@ -764,6 +792,7 @@ func (opv *optionalPrimitiveValue) templateFields(ms *messageValueStruct) map[st
764
792
"lowerFieldName" : strings .ToLower (opv .fieldName ),
765
793
"testValue" : opv .testVal ,
766
794
"returnType" : opv .returnType ,
795
+ "originStructName" : ms .originFullName ,
767
796
"originStructType" : ms .originFullName + "_" + opv .fieldName ,
768
797
}
769
798
}
@@ -776,3 +805,10 @@ func origAccessor(bs *messageValueStruct) string {
776
805
}
777
806
return "orig"
778
807
}
808
+
809
+ func stateAccessor (bs * messageValueStruct ) string {
810
+ if usedByOtherDataTypes (bs .packageName ) {
811
+ return "getState()"
812
+ }
813
+ return "state"
814
+ }
0 commit comments