@Override protected Location locationForValueUpcast(Object value, Location oldLocation) { assert !(value instanceof Class); if (oldLocation instanceof DualLocation) { DualLocation dualLocation = (DualLocation) oldLocation; if (dualLocation.getType() == null) { if (value instanceof Integer) { return dualLocation.changeType(int.class); } else if (value instanceof Double) { return dualLocation.changeType(double.class); } else if (value instanceof Long) { return dualLocation.changeType(long.class); } else if (value instanceof Boolean) { return dualLocation.changeType(boolean.class); } else { return dualLocation.changeType(Object.class); } } else if (dualLocation.getType().isPrimitive()) { return dualLocation.changeType(Object.class); } else { throw new UnsupportedOperationException(); } } else if (oldLocation instanceof ConstantLocation) { return constantLocation(value); } else { throw new UnsupportedOperationException(); } }
@Override protected Location moveLocation(Location oldLocation) { if (oldLocation instanceof DeclaredDualLocation) { return advance(newDeclaredDualLocation(((DeclaredDualLocation) oldLocation).get(null, false))); } else if (oldLocation instanceof DualLocation) { return advance(newDualLocation(((DualLocation) oldLocation).getType())); } else if (oldLocation instanceof LongLocation) { return newLongLocation(oldLocation.isFinal()); } else if (oldLocation instanceof IntLocation) { return newIntLocation(oldLocation.isFinal()); } else if (oldLocation instanceof DoubleLocation) { return newDoubleLocation(oldLocation.isFinal()); } else if (oldLocation instanceof BooleanLocation) { return newBooleanLocation(oldLocation.isFinal()); } else if (oldLocation instanceof ObjectLocation) { return newObjectLocation(oldLocation.isFinal(), ((ObjectLocation) oldLocation).isNonNull()); } else { assert oldLocation instanceof ValueLocation; return advance(oldLocation); } }