Lines 50-55
Link Here
|
50 |
import com.sun.source.tree.ParameterizedTypeTree; |
50 |
import com.sun.source.tree.ParameterizedTypeTree; |
51 |
import com.sun.source.tree.Scope; |
51 |
import com.sun.source.tree.Scope; |
52 |
import com.sun.source.tree.Tree; |
52 |
import com.sun.source.tree.Tree; |
|
|
53 |
import com.sun.source.tree.Tree.Kind; |
53 |
import com.sun.source.util.TreePath; |
54 |
import com.sun.source.util.TreePath; |
54 |
import java.io.IOException; |
55 |
import java.io.IOException; |
55 |
import java.util.EnumSet; |
56 |
import java.util.EnumSet; |
Lines 59-67
Link Here
|
59 |
import javax.lang.model.SourceVersion; |
60 |
import javax.lang.model.SourceVersion; |
60 |
import javax.lang.model.element.Element; |
61 |
import javax.lang.model.element.Element; |
61 |
import javax.lang.model.element.ElementKind; |
62 |
import javax.lang.model.element.ElementKind; |
|
|
63 |
import javax.lang.model.element.ExecutableElement; |
62 |
import javax.lang.model.element.TypeElement; |
64 |
import javax.lang.model.element.TypeElement; |
63 |
import javax.lang.model.type.ArrayType; |
65 |
import javax.lang.model.type.ArrayType; |
64 |
import javax.lang.model.type.DeclaredType; |
66 |
import javax.lang.model.type.DeclaredType; |
|
|
67 |
import javax.lang.model.type.ExecutableType; |
65 |
import javax.lang.model.type.TypeKind; |
68 |
import javax.lang.model.type.TypeKind; |
66 |
import javax.lang.model.type.TypeMirror; |
69 |
import javax.lang.model.type.TypeMirror; |
67 |
import javax.lang.model.type.WildcardType; |
70 |
import javax.lang.model.type.WildcardType; |
Lines 154-159
Link Here
|
154 |
return sb.toString(); |
157 |
return sb.toString(); |
155 |
} |
158 |
} |
156 |
|
159 |
|
|
|
160 |
// true if tp is an IDENTIFIER in a VARIABLE in an ENHANCED_FOR_LOOP |
161 |
public static boolean isEnhancedForLoopIdentifier(TreePath tp) { |
162 |
if (tp == null || tp.getLeaf().getKind() != Kind.IDENTIFIER) |
163 |
return false; |
164 |
TreePath parent = tp.getParentPath(); |
165 |
if (parent == null || parent.getLeaf().getKind() != Kind.VARIABLE) |
166 |
return false; |
167 |
TreePath context = parent.getParentPath(); |
168 |
if (context == null || context.getLeaf().getKind() != Kind.ENHANCED_FOR_LOOP) |
169 |
return false; |
170 |
return true; |
171 |
} |
172 |
|
173 |
// return the generic type of an Iterable (or ArrayType) at a TreePath |
174 |
public static TypeMirror getIterableGenericType(CompilationInfo info, TreePath iterable) { |
175 |
TypeElement iterableElement = info.getElements().getTypeElement("java.lang.Iterable"); //NOI18N |
176 |
if (iterableElement == null) { |
177 |
return null; |
178 |
} |
179 |
TypeMirror iterableType = info.getTrees().getTypeMirror(iterable); |
180 |
if (iterableType == null) { |
181 |
return null; |
182 |
} |
183 |
TypeMirror designedType = null; |
184 |
if (iterableType.getKind() == TypeKind.DECLARED) { |
185 |
DeclaredType declaredType = (DeclaredType) iterableType; |
186 |
if (!info.getTypes().isSubtype(info.getTypes().erasure(declaredType), info.getTypes().erasure(iterableElement.asType()))) { |
187 |
return null; |
188 |
} |
189 |
ExecutableElement iteratorMethod = (ExecutableElement) iterableElement.getEnclosedElements().get(0); |
190 |
ExecutableType iteratorMethodType = (ExecutableType) info.getTypes().asMemberOf(declaredType, iteratorMethod); |
191 |
designedType = ((DeclaredType) iteratorMethodType.getReturnType()).getTypeArguments().get(0); |
192 |
} else if (iterableType.getKind() == TypeKind.ARRAY) { |
193 |
designedType = ((ArrayType) iterableType).getComponentType(); |
194 |
} |
195 |
if (designedType == null) { |
196 |
return null; |
197 |
} |
198 |
return resolveCapturedType(info, designedType); |
199 |
} |
200 |
|
157 |
public static String getName(TypeMirror tm) { |
201 |
public static String getName(TypeMirror tm) { |
158 |
if (tm.getKind().isPrimitive()) { |
202 |
if (tm.getKind().isPrimitive()) { |
159 |
return "" + Character.toLowerCase(tm.getKind().name().charAt(0)); |
203 |
return "" + Character.toLowerCase(tm.getKind().name().charAt(0)); |