Code with Finding: |
class PeepholeFoldConstants {
/**
* Try to fold array-element. e.g [1, 2, 3][10];
*/
private Node tryFoldGetElem(Node n, Node left, Node right) {
Preconditions.checkArgument(n.getType() == Token.GETELEM);
if (left.getType() == Token.ARRAYLIT) {
if (right.getType() != Token.NUMBER) {
// Sometimes people like to use complex expressions to index into
// arrays, or strings to index into array methods.
return n;
}
double index = right.getDouble();
int intIndex = (int) index;
if (intIndex != index) {
error(INVALID_GETELEM_INDEX_ERROR, right);
return n;
}
if (intIndex < 0) {
error(INDEX_OUT_OF_BOUNDS_ERROR, right);
return n;
}
Node elem = left.getFirstChild();
for (int i = 0; elem != null && i < intIndex; i++) {
elem = elem.getNext();
}
if (elem == null) {
error(INDEX_OUT_OF_BOUNDS_ERROR, right);
return n;
}
// Replace the entire GETELEM with the value
left.removeChild(elem);
n.getParent().replaceChild(n, elem);
reportCodeChange();
return elem;
}
return n;
}
}
|