@@ -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,73 @@ 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 &to_java_generic_parameter_tag (
467
+ 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(
492
+ java_reference_type (
493
+ java_generic_parameter_tagt (_type_var_name, _bound)))
494
+ {
495
+ }
496
+
497
+ // / \return the type variable as symbol type
498
+ const type_variablet &type_variable () const
499
+ {
500
+ return to_java_generic_parameter_tag (subtype ()).type_variable ();
501
+ }
502
+
503
+ type_variablet &type_variable_ref ()
504
+ {
505
+ return to_java_generic_parameter_tag (subtype ()).type_variable_ref ();
506
+ }
507
+
508
+ const irep_idt get_name () const
509
+ {
510
+ return to_java_generic_parameter_tag (subtype ()).get_name ();
511
+ }
512
+ };
513
+
455
514
// / Checks whether the type is a java generic parameter/variable, e.g., `T` in
456
515
// / `List<T>`.
457
516
// / \param type: the type to check
458
517
// / \return true if type is a generic Java parameter type
459
518
inline bool is_java_generic_parameter (const typet &type)
460
519
{
461
- return type.get_bool (ID_C_java_generic_parameter);
520
+ return type.id () == ID_pointer &&
521
+ is_java_generic_parameter_tag (type.subtype ());
462
522
}
463
523
464
524
// / \param type: source type
@@ -493,36 +553,94 @@ inline java_generic_parametert &to_java_generic_parameter(typet &type)
493
553
// / - in `HashMap<List<T>, V>` it would contain two elements, the first of
494
554
// / type `java_generic_typet` and the second of type
495
555
// / `java_generic_parametert`.
556
+ class java_generic_struct_tag_typet : public struct_tag_typet
557
+ {
558
+ public:
559
+ typedef std::vector<reference_typet> generic_typest;
560
+
561
+ explicit java_generic_struct_tag_typet (
562
+ const struct_tag_typet &type) :
563
+ struct_tag_typet(type)
564
+ {
565
+ set (ID_C_java_generic_symbol, true );
566
+ }
567
+
568
+ java_generic_struct_tag_typet (
569
+ const struct_tag_typet &type,
570
+ const std::string &base_ref,
571
+ const std::string &class_name_prefix);
572
+
573
+ const generic_typest &generic_types () const
574
+ {
575
+ return (const generic_typest &)(find (ID_generic_types).get_sub ());
576
+ }
577
+
578
+ generic_typest &generic_types ()
579
+ {
580
+ return (generic_typest &)(add (ID_generic_types).get_sub ());
581
+ }
582
+
583
+ optionalt<size_t >
584
+ generic_type_index (const java_generic_parametert &type) const ;
585
+ };
586
+
587
+ // / \param type: the type to check
588
+ // / \return true if the type is a symbol type with generics
589
+ inline bool is_java_generic_struct_tag_type (const typet &type)
590
+ {
591
+ return type.get_bool (ID_C_java_generic_symbol);
592
+ }
593
+
594
+ // / \param type: the type to convert
595
+ // / \return the converted type
596
+ inline const java_generic_struct_tag_typet &
597
+ to_java_generic_struct_tag_type (const typet &type)
598
+ {
599
+ PRECONDITION (is_java_generic_struct_tag_type (type));
600
+ return static_cast <const java_generic_struct_tag_typet &>(type);
601
+ }
602
+
603
+ // / \param type: the type to convert
604
+ // / \return the converted type
605
+ inline java_generic_struct_tag_typet &
606
+ to_java_generic_struct_tag_type (typet &type)
607
+ {
608
+ PRECONDITION (is_java_generic_struct_tag_type (type));
609
+ return static_cast <java_generic_struct_tag_typet &>(type);
610
+ }
611
+
612
+ // / Reference that points to a java_generic_struct_tag_typet. All information is
613
+ // / stored on the underlying tag.
496
614
class java_generic_typet :public reference_typet
497
615
{
498
616
public:
499
- typedef std::vector<reference_typet> generic_type_argumentst;
617
+ typedef java_generic_struct_tag_typet::generic_typest generic_type_argumentst;
500
618
501
- explicit java_generic_typet (const typet &_type):
502
- reference_typet(java_reference_type(_type))
619
+ explicit java_generic_typet (const typet &_type) :
620
+ reference_typet(
621
+ java_reference_type (
622
+ java_generic_struct_tag_typet (to_struct_tag_type(_type))))
503
623
{
504
- set (ID_C_java_generic_type, true );
505
624
}
506
625
507
626
// / \return vector of type variables
508
627
const generic_type_argumentst &generic_type_arguments () const
509
628
{
510
- return (const generic_type_argumentst &)(
511
- find (ID_type_variables).get_sub ());
629
+ return to_java_generic_struct_tag_type (subtype ()).generic_types ();
512
630
}
513
631
514
632
// / \return vector of type variables
515
633
generic_type_argumentst &generic_type_arguments ()
516
634
{
517
- return (generic_type_argumentst &)(
518
- add (ID_type_variables).get_sub ());
635
+ return to_java_generic_struct_tag_type (subtype ()).generic_types ();
519
636
}
520
637
};
521
638
522
639
template <>
523
640
inline bool can_cast_type<java_generic_typet>(const typet &type)
524
641
{
525
- return is_reference (type) && type.get_bool (ID_C_java_generic_type);
642
+ return
643
+ is_reference (type) && type.subtype ().get_bool (ID_C_java_generic_symbol);
526
644
}
527
645
528
646
// / \param type: the type to check
@@ -761,58 +879,6 @@ void get_dependencies_from_generic_parameters(
761
879
const typet &,
762
880
std::set<irep_idt> &);
763
881
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
882
// / Take a signature string and remove everything in angle brackets allowing for
817
883
// / the type to be parsed normally, for example
818
884
// / `java.util.HashSet<java.lang.Integer>` will be turned into
0 commit comments