@@ -157,20 +157,29 @@ func (r *Resolver) getContainerTypeName(g *Scope, t *parser.Type) (name string,
157
157
// getIDValue returns the literal representation of a const value.
158
158
// The extra must be associated with g and from a const value that has
159
159
// type parser.ConstType_ConstIdentifier.
160
- func (r * Resolver ) getIDValue (g * Scope , extra * parser.ConstValueExtra ) (v string , ok bool ) {
160
+ func (r * Resolver ) getIDValue (g * Scope , extra * parser.ConstValueExtra ) (v string , t * parser. Type , ok bool ) {
161
161
if extra .Index == - 1 {
162
162
if extra .IsEnum {
163
163
enum , ok := g .ast .GetEnum (extra .Sel )
164
164
if ! ok {
165
- return "" , false
165
+ return "" , t , false
166
166
}
167
167
if en := g .Enum (enum .Name ); en != nil {
168
168
if ev := en .Value (extra .Name ); ev != nil {
169
169
v = ev .GoName ().String ()
170
+ t = & parser.Type {
171
+ Name : enum .Name ,
172
+ Category : parser .Category_Enum ,
173
+ }
170
174
}
171
175
}
172
176
} else {
173
177
v = g .globals .Get (extra .Name )
178
+ con , ok := g .ast .GetConstant (extra .Name )
179
+ if ! ok {
180
+ return "" , t , false
181
+ }
182
+ t = con .Type
174
183
}
175
184
} else {
176
185
g = g .includes [extra .Index ].Scope
@@ -186,7 +195,7 @@ func (r *Resolver) getIDValue(g *Scope, extra *parser.ConstValueExtra) (v string
186
195
pkg := r .root .includeIDL (r .util , g .ast )
187
196
v = pkg + "." + v
188
197
}
189
- return v , v != ""
198
+ return v , t , v != ""
190
199
}
191
200
192
201
// ResolveConst returns the initialization code for a constant or a default value.
@@ -239,10 +248,14 @@ func (r *Resolver) onBool(g *Scope, name string, t *parser.Type, v *parser.Const
239
248
return s , nil
240
249
}
241
250
242
- if val , ok := r .getIDValue (g , v .Extra ); ok {
243
- return val , nil
251
+ val , cate , ok := r .getIDValue (g , v .Extra )
252
+ if ! ok {
253
+ return "" , fmt .Errorf ("undefined value: %q" , s )
244
254
}
245
- return "" , fmt .Errorf ("undefined value: %q" , s )
255
+ if err := r .typeMatch (t , cate , name ); err != nil {
256
+ return "" , err
257
+ }
258
+ return val , nil
246
259
}
247
260
return "" , errTypeMissMatch (name , t , v )
248
261
}
@@ -260,12 +273,16 @@ func (r *Resolver) onInt(g *Scope, name string, t *parser.Type, v *parser.ConstV
260
273
if s == "false" {
261
274
return "0" , nil
262
275
}
263
- if val , ok := r .getIDValue (g , v .Extra ); ok {
264
- goType , _ := r .getTypeName (g , t )
265
- val = fmt .Sprintf ("%s(%s)" , goType , val )
266
- return val , nil
276
+ val , cate , ok := r .getIDValue (g , v .Extra )
277
+ if ! ok {
278
+ return "" , fmt .Errorf ("undefined value: %q" , s )
267
279
}
268
- return "" , fmt .Errorf ("undefined value: %q" , s )
280
+ if err := r .typeMatch (t , cate , name ); err != nil {
281
+ return "" , err
282
+ }
283
+ goType , _ := r .getTypeName (g , t )
284
+ val = fmt .Sprintf ("%s(%s)" , goType , val )
285
+ return val , nil
269
286
}
270
287
return "" , errTypeMissMatch (name , t , v )
271
288
}
@@ -286,10 +303,14 @@ func (r *Resolver) onDouble(g *Scope, name string, t *parser.Type, v *parser.Con
286
303
if s == "false" {
287
304
return "0.0" , nil
288
305
}
289
- if val , ok := r .getIDValue (g , v .Extra ); ok {
290
- return val , nil
306
+ val , cate , ok := r .getIDValue (g , v .Extra )
307
+ if ! ok {
308
+ return "" , fmt .Errorf ("undefined value: %q" , s )
309
+ }
310
+ if err := r .typeMatch (t , cate , name ); err != nil {
311
+ return "" , err
291
312
}
292
- return "" , fmt . Errorf ( "undefined value: %q" , s )
313
+ return val , nil
293
314
}
294
315
return "" , errTypeMissMatch (name , t , v )
295
316
}
@@ -310,10 +331,14 @@ func (r *Resolver) onStrBin(g *Scope, name string, t *parser.Type, v *parser.Con
310
331
break
311
332
}
312
333
313
- if val , ok := r .getIDValue (g , v .Extra ); ok {
314
- return val , nil
334
+ val , cate , ok := r .getIDValue (g , v .Extra )
335
+ if ! ok {
336
+ return "" , fmt .Errorf ("undefined value: %q" , s )
315
337
}
316
- return "" , fmt .Errorf ("undefined value: %q" , s )
338
+ if err := r .typeMatch (t , cate , name ); err != nil {
339
+ return "" , err
340
+ }
341
+ return val , nil
317
342
default :
318
343
}
319
344
return "" , errTypeMissMatch (name , t , v )
@@ -324,10 +349,14 @@ func (r *Resolver) onEnum(g *Scope, name string, t *parser.Type, v *parser.Const
324
349
case parser .ConstType_ConstInt :
325
350
return fmt .Sprintf ("%d" , v .TypedValue .GetInt ()), nil
326
351
case parser .ConstType_ConstIdentifier :
327
- val , ok := r .getIDValue (g , v .Extra )
328
- if ok {
329
- return val , nil
352
+ val , cate , ok := r .getIDValue (g , v .Extra )
353
+ if ! ok {
354
+ return "" , fmt .Errorf ("undefined value: %q" , v .TypedValue .GetIdentifier ())
355
+ }
356
+ if err := r .typeMatch (t , cate , name ); err != nil {
357
+ return "" , err
330
358
}
359
+ return val , nil
331
360
}
332
361
return "" , fmt .Errorf ("expect const value for %q is a int or enum, got %+v" , name , v )
333
362
}
@@ -354,8 +383,14 @@ func (r *Resolver) onSetOrList(g *Scope, name string, t *parser.Type, v *parser.
354
383
return fmt .Sprintf ("%s{\n %s\n }" , goType , strings .Join (ss , "\n " )), nil
355
384
356
385
case parser .ConstType_ConstIdentifier :
357
- val , ok := r .getIDValue (g , v .Extra )
358
- if ok && val != "true" && val != "false" {
386
+ val , cate , ok := r .getIDValue (g , v .Extra )
387
+ if ! ok {
388
+ return "" , fmt .Errorf ("undefined value: %q" , v .TypedValue .GetIdentifier ())
389
+ }
390
+ if err := r .typeMatch (t , cate , name ); err != nil {
391
+ return "" , err
392
+ }
393
+ if val != "true" && val != "false" {
359
394
return val , nil
360
395
}
361
396
@@ -391,8 +426,14 @@ func (r *Resolver) onMap(g *Scope, name string, t *parser.Type, v *parser.ConstV
391
426
return fmt .Sprintf ("%s{\n %s\n }" , goType , strings .Join (kvs , "\n " )), nil
392
427
393
428
case parser .ConstType_ConstIdentifier :
394
- val , ok := r .getIDValue (g , v .Extra )
395
- if ok && val != "true" && val != "false" {
429
+ val , cate , ok := r .getIDValue (g , v .Extra )
430
+ if ! ok {
431
+ return "" , fmt .Errorf ("undefined value: %q" , v .TypedValue .GetIdentifier ())
432
+ }
433
+ if err := r .typeMatch (t , cate , name ); err != nil {
434
+ return "" , err
435
+ }
436
+ if val != "true" && val != "false" {
396
437
return val , nil
397
438
}
398
439
}
@@ -406,8 +447,14 @@ func (r *Resolver) onStructLike(g *Scope, name string, t *parser.Type, v *parser
406
447
return "" , err
407
448
}
408
449
if v .Type == parser .ConstType_ConstIdentifier {
409
- val , ok := r .getIDValue (g , v .Extra )
410
- if ok && val != "true" && val != "false" {
450
+ val , cate , ok := r .getIDValue (g , v .Extra )
451
+ if ! ok {
452
+ return "" , fmt .Errorf ("undefined value: %q" , v .TypedValue .GetIdentifier ())
453
+ }
454
+ if err := r .typeMatch (t , cate , name ); err != nil {
455
+ return "" , err
456
+ }
457
+ if val != "true" && val != "false" {
411
458
return val , nil
412
459
}
413
460
}
@@ -450,7 +497,7 @@ func (r *Resolver) onStructLike(g *Scope, name string, t *parser.Type, v *parser
450
497
}
451
498
452
499
if NeedRedirect (f ) {
453
- if f .Type . Category . IsBaseType ( ) {
500
+ if IsBaseType ( f .Type ) {
454
501
// a trick to create pointers without temporary variables
455
502
val = fmt .Sprintf ("(&struct{x %s}{%s}).x" , typ , val )
456
503
}
@@ -493,6 +540,97 @@ func (r *Resolver) getStructLike(g *Scope, t *parser.Type) (f *Scope, s *parser.
493
540
return
494
541
}
495
542
543
+ func (r * Resolver ) typeMatch (field * parser.Type , value * parser.Type , name string ) error {
544
+ if field .Category .IsBool () {
545
+ if ! value .Category .IsBool () {
546
+ return fmt .Errorf ("type of %s is not bool type" , name )
547
+ }
548
+ return nil
549
+ }
550
+ if field .Category .IsInteger () {
551
+ if ! value .Category .IsDigital () {
552
+ return fmt .Errorf ("type of %s is not digital type" , name )
553
+ }
554
+ return nil
555
+ }
556
+ if field .Category .IsDouble () {
557
+ if ! value .Category .IsDouble () {
558
+ return fmt .Errorf ("type of %s is not double type" , name )
559
+ }
560
+ return nil
561
+ }
562
+ if field .Category .IsString () {
563
+ if ! value .Category .IsString () {
564
+ return fmt .Errorf ("type of %s is not string type" , name )
565
+ }
566
+ return nil
567
+ }
568
+ if field .Category .IsBinary () {
569
+ if ! value .Category .IsString () && ! value .Category .IsBinary () {
570
+ return fmt .Errorf ("type of %s is not string or binary type" , name )
571
+ }
572
+ return nil
573
+ }
574
+ if field .Category .IsEnum () {
575
+ if ! value .Category .IsEnum () {
576
+ return fmt .Errorf ("type of %s is not enum type" , name )
577
+ }
578
+ if field .NameWithReference () != value .NameWithReference () {
579
+ return fmt .Errorf ("enum type of %s is not %s, %s" , name , field .NameWithReference (), value .NameWithReference ())
580
+ }
581
+ return nil
582
+ }
583
+ if field .Category .IsSet () {
584
+ if ! value .Category .IsSet () {
585
+ return fmt .Errorf ("type of %s is not set type" , name )
586
+ }
587
+ return r .typeMatch (field .ValueType , value .ValueType , name )
588
+ }
589
+ if field .Category .IsList () {
590
+ if ! value .Category .IsList () && ! value .Category .IsSet () {
591
+ return fmt .Errorf ("type of %s is not set or list type" , name )
592
+ }
593
+ return r .typeMatch (field .ValueType , value .ValueType , name )
594
+ }
595
+ if field .Category .IsMap () {
596
+ if ! value .Category .IsMap () {
597
+ return fmt .Errorf ("type of %s is not map type" , name )
598
+ }
599
+ if err := r .typeMatch (field .KeyType , value .KeyType , name ); err != nil {
600
+ return err
601
+ }
602
+ return r .typeMatch (field .ValueType , value .ValueType , name )
603
+ }
604
+ if field .Category .IsStruct () {
605
+ if ! value .Category .IsStruct () {
606
+ return fmt .Errorf ("type of %s is not struct type" , name )
607
+ }
608
+ if field .NameWithReference () != value .NameWithReference () {
609
+ return fmt .Errorf ("type of %s is not %s" , name , field .NameWithReference ())
610
+ }
611
+ return nil
612
+ }
613
+ if field .Category .IsUnion () {
614
+ if ! value .Category .IsUnion () {
615
+ return fmt .Errorf ("type of %s is not union type" , name )
616
+ }
617
+ if field .NameWithReference () != value .NameWithReference () {
618
+ return fmt .Errorf ("type of %s is not %s" , name , field .NameWithReference ())
619
+ }
620
+ return nil
621
+ }
622
+ if field .Category .IsException () {
623
+ if ! value .Category .IsException () {
624
+ return fmt .Errorf ("type of %s is not exception type" , name )
625
+ }
626
+ if field .NameWithReference () != value .NameWithReference () {
627
+ return fmt .Errorf ("type of %s is not %s" , name , field .NameWithReference ())
628
+ }
629
+ return nil
630
+ }
631
+ return fmt .Errorf ("type of %s not matched %s" , name , field .NameWithReference ())
632
+ }
633
+
496
634
func (r * Resolver ) bin2str (t * parser.Type ) * parser.Type {
497
635
if t .Category == parser .Category_Binary {
498
636
r := * t
0 commit comments