1 package java.lang.reflect.code.type;
 2 
 3 import java.lang.reflect.code.TypeElement;
 4 import java.util.List;
 5 import java.util.Objects;
 6 
 7 /**
 8  * A variable type.
 9  */
10 public final class VarType implements TypeElement {
11     static final String NAME = "Var";
12 
13     final TypeElement variableType;
14 
15     VarType(TypeElement variableType) {
16         this.variableType = variableType;
17     }
18 
19     /**
20      * {@return the variable type's value type}
21      */
22     public TypeElement valueType() {
23         return variableType;
24     }
25 
26     @Override
27     public ExternalizedTypeElement externalize() {
28         return new ExternalizedTypeElement(NAME, List.of(variableType.externalize()));
29     }
30 
31     @Override
32     public String toString() {
33         return externalize().toString();
34     }
35 
36     @Override
37     public boolean equals(Object o) {
38         if (this == o) return true;
39         return o instanceof VarType that &&
40                 variableType.equals(that.variableType);
41     }
42 
43     @Override
44     public int hashCode() {
45         return variableType.hashCode();
46     }
47 
48     /**
49      * Constructs a variable type.
50      *
51      * @param valueType the variable's value type.
52      * @return a variable type.
53      */
54     public static VarType varType(TypeElement valueType) {
55         Objects.requireNonNull(valueType);
56         return new VarType(valueType);
57     }
58 }