@@ -407,21 +407,21 @@ bool equal_java_types(const typet &type1, const typet &type2);
407
407
// / Class to hold a Java generic type parameter (also called type variable),
408
408
// / e.g., `T` in `List<T>`.
409
409
// / The bound can specify type requirements.
410
- class java_generic_parametert : public reference_typet
410
+ class java_generic_parameter_tagt : public struct_tag_typet
411
411
{
412
412
public:
413
413
typedef struct_tag_typet type_variablet;
414
414
415
- java_generic_parametert (
415
+ java_generic_parameter_tagt (
416
416
const irep_idt &_type_var_name,
417
417
const struct_tag_typet &_bound)
418
- : reference_typet(java_reference_type( _bound) )
418
+ : struct_tag_typet( _bound)
419
419
{
420
420
set (ID_C_java_generic_parameter, true );
421
421
type_variables ().push_back (struct_tag_typet (_type_var_name));
422
422
}
423
423
424
- // / \return the type variable as symbol type
424
+ // / \return the type variable as struct tag type
425
425
const type_variablet &type_variable () const
426
426
{
427
427
PRECONDITION (!type_variables ().empty ());
@@ -431,7 +431,7 @@ class java_generic_parametert:public reference_typet
431
431
type_variablet &type_variable_ref ()
432
432
{
433
433
PRECONDITION (!type_variables ().empty ());
434
- return const_cast <type_variablet &>( type_variables ().front () );
434
+ return type_variables ().front ();
435
435
}
436
436
437
437
const irep_idt get_name () const
@@ -452,13 +452,72 @@ class java_generic_parametert:public reference_typet
452
452
}
453
453
};
454
454
455
+ // / Checks whether the type is a java generic parameter/variable, e.g., `T` in
456
+ // / `List<T>`.
457
+ // / \param type: the type to check
458
+ // / \return true if type is a generic Java parameter tag type
459
+ inline bool is_java_generic_parameter_tag (const typet &type)
460
+ {
461
+ return type.get_bool (ID_C_java_generic_parameter);
462
+ }
463
+
464
+ // / \param type: source type
465
+ // / \return cast of type into a java_generic_parametert
466
+ inline const java_generic_parameter_tagt &
467
+ to_java_generic_parameter_tag (const typet &type)
468
+ {
469
+ PRECONDITION (is_java_generic_parameter_tag (type));
470
+ return static_cast <const java_generic_parameter_tagt &>(type);
471
+ }
472
+
473
+ // / \param type: source type
474
+ // / \return cast of type into a java_generic_parameter_tag
475
+ inline java_generic_parameter_tagt &to_java_generic_parameter_tag (typet &type)
476
+ {
477
+ PRECONDITION (is_java_generic_parameter_tag (type));
478
+ return static_cast <java_generic_parameter_tagt &>(type);
479
+ }
480
+
481
+ // / Reference that points to a java_generic_parameter_tagt. All information is
482
+ // / stored on the underlying tag.
483
+ class java_generic_parametert : public reference_typet
484
+ {
485
+ public:
486
+ typedef struct_tag_typet type_variablet;
487
+
488
+ java_generic_parametert (
489
+ const irep_idt &_type_var_name,
490
+ const struct_tag_typet &_bound)
491
+ : reference_typet(java_reference_type(
492
+ java_generic_parameter_tagt (_type_var_name, _bound)))
493
+ {
494
+ }
495
+
496
+ // / \return the type variable as symbol type
497
+ const type_variablet &type_variable () const
498
+ {
499
+ return to_java_generic_parameter_tag (subtype ()).type_variable ();
500
+ }
501
+
502
+ type_variablet &type_variable_ref ()
503
+ {
504
+ return to_java_generic_parameter_tag (subtype ()).type_variable_ref ();
505
+ }
506
+
507
+ const irep_idt get_name () const
508
+ {
509
+ return to_java_generic_parameter_tag (subtype ()).get_name ();
510
+ }
511
+ };
512
+
455
513
// / Checks whether the type is a java generic parameter/variable, e.g., `T` in
456
514
// / `List<T>`.
457
515
// / \param type: the type to check
458
516
// / \return true if type is a generic Java parameter type
459
517
inline bool is_java_generic_parameter (const typet &type)
460
518
{
461
- return type.get_bool (ID_C_java_generic_parameter);
519
+ return type.id () == ID_pointer &&
520
+ is_java_generic_parameter_tag (type.subtype ());
462
521
}
463
522
464
523
// / \param type: source type
@@ -493,36 +552,92 @@ inline java_generic_parametert &to_java_generic_parameter(typet &type)
493
552
// / - in `HashMap<List<T>, V>` it would contain two elements, the first of
494
553
// / type `java_generic_typet` and the second of type
495
554
// / `java_generic_parametert`.
555
+ class java_generic_struct_tag_typet : public struct_tag_typet
556
+ {
557
+ public:
558
+ typedef std::vector<reference_typet> generic_typest;
559
+
560
+ explicit java_generic_struct_tag_typet (const struct_tag_typet &type)
561
+ : struct_tag_typet(type)
562
+ {
563
+ set (ID_C_java_generic_symbol, true );
564
+ }
565
+
566
+ java_generic_struct_tag_typet (
567
+ const struct_tag_typet &type,
568
+ const std::string &base_ref,
569
+ const std::string &class_name_prefix);
570
+
571
+ const generic_typest &generic_types () const
572
+ {
573
+ return (const generic_typest &)(find (ID_generic_types).get_sub ());
574
+ }
575
+
576
+ generic_typest &generic_types ()
577
+ {
578
+ return (generic_typest &)(add (ID_generic_types).get_sub ());
579
+ }
580
+
581
+ optionalt<size_t >
582
+ generic_type_index (const java_generic_parametert &type) const ;
583
+ };
584
+
585
+ // / \param type: the type to check
586
+ // / \return true if the type is a symbol type with generics
587
+ inline bool is_java_generic_struct_tag_type (const typet &type)
588
+ {
589
+ return type.get_bool (ID_C_java_generic_symbol);
590
+ }
591
+
592
+ // / \param type: the type to convert
593
+ // / \return the converted type
594
+ inline const java_generic_struct_tag_typet &
595
+ to_java_generic_struct_tag_type (const typet &type)
596
+ {
597
+ PRECONDITION (is_java_generic_struct_tag_type (type));
598
+ return static_cast <const java_generic_struct_tag_typet &>(type);
599
+ }
600
+
601
+ // / \param type: the type to convert
602
+ // / \return the converted type
603
+ inline java_generic_struct_tag_typet &
604
+ to_java_generic_struct_tag_type (typet &type)
605
+ {
606
+ PRECONDITION (is_java_generic_struct_tag_type (type));
607
+ return static_cast <java_generic_struct_tag_typet &>(type);
608
+ }
609
+
610
+ // / Reference that points to a java_generic_struct_tag_typet. All information is
611
+ // / stored on the underlying tag.
496
612
class java_generic_typet :public reference_typet
497
613
{
498
614
public:
499
- typedef std::vector<reference_typet> generic_type_argumentst;
615
+ typedef java_generic_struct_tag_typet::generic_typest generic_type_argumentst;
500
616
501
- explicit java_generic_typet (const typet &_type):
502
- reference_typet(java_reference_type(_type))
617
+ explicit java_generic_typet (const typet &_type)
618
+ : reference_typet(java_reference_type(
619
+ java_generic_struct_tag_typet (to_struct_tag_type(_type))))
503
620
{
504
- set (ID_C_java_generic_type, true );
505
621
}
506
622
507
623
// / \return vector of type variables
508
624
const generic_type_argumentst &generic_type_arguments () const
509
625
{
510
- return (const generic_type_argumentst &)(
511
- find (ID_type_variables).get_sub ());
626
+ return to_java_generic_struct_tag_type (subtype ()).generic_types ();
512
627
}
513
628
514
629
// / \return vector of type variables
515
630
generic_type_argumentst &generic_type_arguments ()
516
631
{
517
- return (generic_type_argumentst &)(
518
- add (ID_type_variables).get_sub ());
632
+ return to_java_generic_struct_tag_type (subtype ()).generic_types ();
519
633
}
520
634
};
521
635
522
636
template <>
523
637
inline bool can_cast_type<java_generic_typet>(const typet &type)
524
638
{
525
- return is_reference (type) && type.get_bool (ID_C_java_generic_type);
639
+ return is_reference (type) &&
640
+ type.subtype ().get_bool (ID_C_java_generic_symbol);
526
641
}
527
642
528
643
// / \param type: the type to check
@@ -761,58 +876,6 @@ void get_dependencies_from_generic_parameters(
761
876
const typet &,
762
877
std::set<irep_idt> &);
763
878
764
- // / Type for a generic symbol, extends struct_tag_typet with a
765
- // / vector of java generic types.
766
- // / This is used to store the type of generic superclasses and interfaces.
767
- class java_generic_struct_tag_typet : public struct_tag_typet
768
- {
769
- public:
770
- typedef std::vector<reference_typet> generic_typest;
771
-
772
- java_generic_struct_tag_typet (
773
- const struct_tag_typet &type,
774
- const std::string &base_ref,
775
- const std::string &class_name_prefix);
776
-
777
- const generic_typest &generic_types () const
778
- {
779
- return (const generic_typest &)(find (ID_generic_types).get_sub ());
780
- }
781
-
782
- generic_typest &generic_types ()
783
- {
784
- return (generic_typest &)(add (ID_generic_types).get_sub ());
785
- }
786
-
787
- optionalt<size_t >
788
- generic_type_index (const java_generic_parametert &type) const ;
789
- };
790
-
791
- // / \param type: the type to check
792
- // / \return true if the type is a symbol type with generics
793
- inline bool is_java_generic_struct_tag_type (const typet &type)
794
- {
795
- return type.get_bool (ID_C_java_generic_symbol);
796
- }
797
-
798
- // / \param type: the type to convert
799
- // / \return the converted type
800
- inline const java_generic_struct_tag_typet &
801
- to_java_generic_struct_tag_type (const typet &type)
802
- {
803
- PRECONDITION (is_java_generic_struct_tag_type (type));
804
- return static_cast <const java_generic_struct_tag_typet &>(type);
805
- }
806
-
807
- // / \param type: the type to convert
808
- // / \return the converted type
809
- inline java_generic_struct_tag_typet &
810
- to_java_generic_struct_tag_type (typet &type)
811
- {
812
- PRECONDITION (is_java_generic_struct_tag_type (type));
813
- return static_cast <java_generic_struct_tag_typet &>(type);
814
- }
815
-
816
879
// / Take a signature string and remove everything in angle brackets allowing for
817
880
// / the type to be parsed normally, for example
818
881
// / `java.util.HashSet<java.lang.Integer>` will be turned into
0 commit comments