下面列出了com.sun.source.tree.ArrayAccessTree#getExpression ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* Returns all array indices for the given expression, e.g. given {@code foo[0][0]} returns the
* expressions for {@code [0][0]}.
*/
private Deque<ExpressionTree> getArrayIndices(ExpressionTree expression) {
Deque<ExpressionTree> indices = new ArrayDeque<>();
while (expression instanceof ArrayAccessTree) {
ArrayAccessTree array = (ArrayAccessTree) expression;
indices.addLast(array.getIndex());
expression = array.getExpression();
}
return indices;
}
/**
* Index in array access must be int
*/
@Override
public List<? extends TypeMirror> visitArrayAccess(ArrayAccessTree node, Object p) {
if (theExpression == null) {
return null;
}
// for now we do not guess array type, just the indexes.
if (theExpression == node.getExpression()) {
return null;
}
return Collections.singletonList(info.getTypes().getPrimitiveType(TypeKind.INT));
}
/**
* Returns all array indices for the given expression, e.g. given {@code foo[0][0]} returns the
* expressions for {@code [0][0]}.
*/
private Deque<ExpressionTree> getArrayIndices(ExpressionTree expression) {
Deque<ExpressionTree> indices = new ArrayDeque<>();
while (expression instanceof ArrayAccessTree) {
ArrayAccessTree array = (ArrayAccessTree) expression;
indices.addLast(array.getIndex());
expression = array.getExpression();
}
return indices;
}
/**
* Returns all array indices for the given expression, e.g. given {@code foo[0][0]} returns the
* expressions for {@code [0][0]}.
*/
private Deque<ExpressionTree> getArrayIndices(ExpressionTree expression) {
Deque<ExpressionTree> indices = new ArrayDeque<>();
while (expression instanceof ArrayAccessTree) {
ArrayAccessTree array = (ArrayAccessTree) expression;
indices.addLast(array.getIndex());
expression = array.getExpression();
}
return indices;
}
private static List<? extends TypeMirror> computeArrayAccess(Set<ElementKind> types, CompilationInfo info, TreePath parent, Tree error, int offset) {
ArrayAccessTree aat = (ArrayAccessTree) parent.getLeaf();
if (aat.getExpression() == error) {
TreePath parentParent = parent.getParentPath();
List<? extends TypeMirror> upperTypes = resolveType(types, info, parentParent, aat, offset, null, null);
if (upperTypes == null) {
return null;
}
List<TypeMirror> arrayTypes = new ArrayList<TypeMirror>();
for (TypeMirror tm : upperTypes) {
if (tm == null)
continue;
switch (tm.getKind()) {
case VOID:
case EXECUTABLE:
case WILDCARD:
case PACKAGE:
continue;
}
arrayTypes.add(info.getTypes().getArrayType(tm));
}
if (arrayTypes.isEmpty())
return null;
return arrayTypes;
}
if (aat.getIndex() == error) {
types.add(ElementKind.PARAMETER);
types.add(ElementKind.LOCAL_VARIABLE);
types.add(ElementKind.FIELD);
return Collections.singletonList(info.getTypes().getPrimitiveType(TypeKind.INT));
}
return null;
}
private static List<? extends TypeMirror> computeArrayAccess(Set<ElementKind> types, CompilationInfo info, TreePath parent, Tree error, int offset) {
ArrayAccessTree aat = (ArrayAccessTree) parent.getLeaf();
if (aat.getExpression() == error) {
TreePath parentParent = parent.getParentPath();
List<? extends TypeMirror> upperTypes = resolveType(types, info, parentParent, aat, offset, null, null);
if (upperTypes == null) {
return null;
}
List<TypeMirror> arrayTypes = new ArrayList<TypeMirror>();
for (TypeMirror tm : upperTypes) {
if (tm == null)
continue;
switch (tm.getKind()) {
case VOID:
case EXECUTABLE:
case WILDCARD:
case PACKAGE:
continue;
}
arrayTypes.add(info.getTypes().getArrayType(tm));
}
if (arrayTypes.isEmpty())
return null;
return arrayTypes;
}
if (aat.getIndex() == error) {
types.add(ElementKind.PARAMETER);
types.add(ElementKind.LOCAL_VARIABLE);
types.add(ElementKind.FIELD);
return Collections.singletonList(info.getTypes().getPrimitiveType(TypeKind.INT));
}
return null;
}