1 package com.fasterxml.classmate.types;
2
3 import java.util.*;
4
5 import com.fasterxml.classmate.ResolvedType;
6 import com.fasterxml.classmate.TypeBindings;
7 import com.fasterxml.classmate.members.RawField;
8 import com.fasterxml.classmate.members.RawMethod;
9
10 public class ResolvedInterfaceType extends ResolvedType
11 {
12     /**
13      * List of interfaces this type implements; may be empty but never null
14      */

15     protected final ResolvedType[] _superInterfaces;
16
17     /**
18      * Interfaces can have static final (constant) fields.
19      */

20     protected RawField[] _constantFields;
21
22     /**
23      * Interface methods are all public and abstract.
24      */

25     protected RawMethod[] _memberMethods;
26     
27     /*
28     /**********************************************************************
29     /* Life cycle
30     /**********************************************************************
31      */

32
33     public ResolvedInterfaceType(Class<?> erased, TypeBindings bindings,
34             ResolvedType[] superInterfaces)
35     {
36         super(erased, bindings);
37         _superInterfaces = (superInterfaces == null ? NO_TYPES : superInterfaces);
38     }
39
40     @Override
41     public boolean canCreateSubtypes() {
42         return true;
43     }
44     
45     /*
46     /**********************************************************************
47     /* Accessors for related types
48     /**********************************************************************
49      */

50     
51     @Override
52     public ResolvedType getParentClass() {
53         // interfaces do not have parent class, just interfaces
54         return null;
55     }
56
57     @Override
58     public ResolvedType getSelfReferencedType() { return null; }
59     
60     @Override
61     public List<ResolvedType> getImplementedInterfaces() {
62         return (_superInterfaces.length == 0) ?
63                 Collections.<ResolvedType>emptyList() : Arrays.asList(_superInterfaces);
64     }
65     
66     @Override
67     public ResolvedType getArrayElementType() { // interfaces are never arrays, so:
68         return null;
69     }
70
71     /*
72     /**********************************************************************
73     /* Simple property accessors
74     /**********************************************************************
75      */

76
77     @Override
78     public boolean isInterface() { return true; }
79
80     @Override
81     public boolean isAbstract() { return true; }
82
83     @Override
84     public boolean isArray() { return false; }
85
86     @Override
87     public boolean isPrimitive() { return false; }
88
89     /*
90     /**********************************************************************
91     /* Accessors for raw (minimally procesed) members
92     /**********************************************************************
93      */

94
95     @Override
96     public synchronized List<RawField> getStaticFields()
97     {
98         // Interfaces can have static fields, but only as static constants...
99         if (_constantFields == null) {
100             _constantFields = _getFields(true);
101         }
102         if (_constantFields.length == 0) {
103             return Collections.emptyList();
104         }
105         return Arrays.asList(_constantFields);
106     }
107
108     @Override
109     public synchronized List<RawMethod> getMemberMethods()
110     {
111         if (_memberMethods == null) {
112             _memberMethods = _getMethods(false);
113         }
114         if (_memberMethods.length == 0) {
115             return Collections.emptyList();
116         }
117         return Arrays.asList(_memberMethods);
118     }
119     
120     /*
121     /**********************************************************************
122     /* String representations
123     /**********************************************************************
124      */

125
126     @Override
127     public StringBuilder appendSignature(StringBuilder sb) {
128         return _appendClassSignature(sb);
129     }
130
131     @Override
132     public StringBuilder appendErasedSignature(StringBuilder sb) {
133         return _appendErasedClassSignature(sb);
134     }
135
136     @Override
137     public StringBuilder appendBriefDescription(StringBuilder sb) {
138         return _appendClassDescription(sb);
139     }
140
141     @Override
142     public StringBuilder appendFullDescription(StringBuilder sb)
143     {
144         sb = _appendClassDescription(sb);
145         // interfaces 'extend' other interfaces...
146         int count = _superInterfaces.length;
147         if (count > 0) {
148             sb.append(extends ");
149             for (int i = 0; i < count; ++i) {
150                 if (i > 0) {
151                     sb.append(",");
152                 }
153                 sb = _superInterfaces[i].appendBriefDescription(sb);
154             }
155         }
156         return sb;
157     }
158 }
159
160
161
162