blob: 132211214c5005ae0d2f2549a4cb15e7ec265502 [file] [log] [blame]
import java.util.Random;
import org.checkerframework.checker.guieffect.qual.PolyUI;
import org.checkerframework.checker.guieffect.qual.PolyUIEffect;
import org.checkerframework.checker.guieffect.qual.PolyUIType;
import org.checkerframework.checker.guieffect.qual.SafeEffect;
import org.checkerframework.checker.guieffect.qual.UI;
import org.checkerframework.checker.guieffect.qual.UIEffect;
import org.checkerframework.checker.guieffect.qual.UIType;
public class AnonInnerDefaults {
private static Random random;
private static boolean maybe() {
return random.nextBoolean();
}
public static interface SafeIface {
public void doStuff();
}
public static interface ExplicitUIIface {
@UIEffect
public void doStuff();
}
@UIType
public static interface UITypeIface {
public void doStuff();
}
@PolyUIType
public static interface PolyIface {
@PolyUIEffect
public void doStuff();
}
@PolyUIType
public static interface ParlyPolyIface {
@PolyUIEffect
public void doPolyUIStuff();
public void doSafeStuff();
}
public static interface IndirectPolyIface extends PolyIface {}
@PolyUIType
public static interface IPolyIfaceCaller {
@PolyUIEffect
public void call(final @PolyUI PolyIface p);
}
public PolyIface getSafePolyIface(final UIElement e) {
// :: error: (return)
return new PolyIface() { // Anonymous inner class inference for @UI
@Override
public void doStuff() {
// Safe due to anonymous inner class effect inference
e.dangerous(); // should be okay
}
};
}
public @UI PolyIface getUIPolyIface(final UIElement e) {
return new PolyIface() { // Anonymous inner class inference for @UI
@Override
public void doStuff() {
// Safe due to anonymous inner class effect inference
e.dangerous(); // should be okay
}
};
}
public void callSafePolyIface(final PolyIface p) {
p.doStuff();
}
@UIEffect
public void callUIPolyIface(final @UI PolyIface p) {
p.doStuff();
}
@UIEffect
public void tryStuff(final UIElement e) {
SafeIface s =
new SafeIface() {
@Override
public void doStuff() {
// :: error: (call.ui)
e.dangerous();
}
};
ExplicitUIIface ex =
new ExplicitUIIface() {
@Override
public void doStuff() {
e.dangerous(); // should be okay
}
};
UITypeIface u =
new UITypeIface() {
@Override
public void doStuff() {
e.dangerous(); // should be okay
}
};
@UI PolyIface p =
new @UI PolyIface() {
@Override
public void doStuff() {
e.dangerous(); // should be okay
}
};
@UI PolyIface p2 =
new PolyIface() {
@Override
public void doStuff() {
// Safe due to anonymous inner class effect inference
e.dangerous(); // should be okay
}
};
PolyIface p3 =
// :: error: (assignment)
new PolyIface() { // Anonymous inner class inference for @UI
@Override
public void doStuff() {
// Safe due to anonymous inner class effect inference
e.dangerous(); // should be okay
}
};
@UI PolyIface p4 =
new IndirectPolyIface() {
@Override
public void doStuff() {
// Safe due to anonymous inner class effect inference
e.dangerous(); // should be okay
}
};
@UI ParlyPolyIface p5 =
new ParlyPolyIface() {
@Override
public void doPolyUIStuff() {
// Safe due to anonymous inner class effect inference
e.dangerous(); // should be okay
}
@Override
@SafeEffect
public void doSafeStuff() {
e.repaint();
}
};
ParlyPolyIface p6 =
new ParlyPolyIface() {
@Override
public void doPolyUIStuff() {
e.repaint(); // Safe
}
@Override
public void doSafeStuff() {
// :: error: (call.ui)
e.dangerous(); // No inference here, just as an invalid call
}
};
@UI ParlyPolyIface p7 =
new ParlyPolyIface() {
@Override
public void doPolyUIStuff() {
// Safe due to anonymous inner class effect inference
e.dangerous(); // should be okay
}
@Override
@SafeEffect
public void doSafeStuff() {
// :: error: (call.ui)
e.dangerous(); // No inference here, just as an invalid call
}
};
callSafePolyIface(
// :: error: (argument)
new PolyIface() { // Anonymous inner class inference for @UI
@Override
public void doStuff() {
// Safe due to anonymous inner class effect inference
e.dangerous(); // should be okay
}
});
callUIPolyIface(
new PolyIface() { // Anonymous inner class inference for @UI
@Override
public void doStuff() {
// Safe due to anonymous inner class effect inference
e.dangerous(); // should be okay
}
});
callSafePolyIface(getSafePolyIface(e));
callUIPolyIface(getUIPolyIface(e));
(new IPolyIfaceCaller() { // Anonymous inner class inference for @UI
@Override
public void call(final @UI PolyIface p) { // No global inference
p.doStuff();
}
})
.call(
new PolyIface() { // Anonymous inner class inference for @UI
@Override
public void doStuff() {
// Safe due to anonymous inner class effect inference
e.dangerous(); // should be okay
}
});
PolyIface maybeUIInstance =
// :: error: (assignment)
(maybe()
? new PolyIface() { // Anonymous inner class inference for @UI
@Override
public void doStuff() {
// Safe due to anonymous inner class effect inference
e.dangerous(); // should be okay
}
}
: new PolyIface() {
@Override
public void doStuff() {}
});
}
}