//!!! ugly test case

public class HierarchyIntroductions {
    public static void main(String[] args) { test(); } 

    static public void test() {
	C1 c1 = new C1();
	I1 i1 = c1;
	C2 c2 = new C2();
	c2.foo();
	c1 = c2;
	I4 i4 = c2;
	I2 i2 = c1;
    }
}


aspect Hierarchy {
    //introduction C1 {
    declare parents: C1 implements I1;
    declare parents: C1 implements I2;
    //}

    //introduction C2 {
    declare parents: C2 extends C1;
    //}

    //introduction C4 {
    declare parents: C4 extends C3;
    //}
    //introduction C5 {
    declare parents: C5 extends C3a;
    //}

    //introduction I2 {
    declare parents: I2 extends I3, I4, I5;
    //}
}


class C1 { public void foo() { } }
class C2 {}
class C3 {}
class C3a extends C3 {}
class C4 extends C3 {}
class C5 extends C3 {}

interface I1 {}
interface I2 {}
interface I3 {}
interface I4 {}
interface I5 {}