blob: 1d59e90aaba3eb0c160ec65d08fbd405ed3a757d [file] [log] [blame]
// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/*element: A.:[exact=A]*/
class A {}
/*element: B.:[exact=B]*/
class B extends A {}
/*element: C.:[exact=C]*/
class C {}
/*element: main:[null]*/
main() {
invokeFunctions();
invokeGenericClasses();
invokeGenericMethods();
}
/*element: invokeFunction1:[null|subclass=A]*/
invokeFunction1(A Function() /*[subclass=Closure]*/ f) {
return f();
}
/*element: invokeFunction2:[null|exact=B]*/
invokeFunction2(B Function() /*[subclass=Closure]*/ f) {
return f();
}
/*element: invokeFunction3:[null|exact=C]*/
invokeFunction3(C Function() /*[subclass=Closure]*/ f) {
return f();
}
/*element: genericFunction:[null|subclass=Object]*/
T genericFunction<T>(T Function() /*[subclass=Closure]*/ f) => f();
/*element: invokeGenericFunction1:[null|subclass=A]*/
invokeGenericFunction1() {
return genericFunction<A>(/*[exact=A]*/ () => new A());
}
/*element: invokeGenericFunction2:[null|exact=B]*/
invokeGenericFunction2() {
return genericFunction<B>(/*[exact=B]*/ () => new B());
}
/*element: invokeGenericFunction3:[null|exact=C]*/
invokeGenericFunction3() {
return genericFunction<C>(/*[exact=C]*/ () => new C());
}
/*element: invokeGenericLocalFunction1:[null|subclass=A]*/
invokeGenericLocalFunction1() {
/*[null|subclass=Object]*/
T local<T>(T Function() /*[subclass=Closure]*/ f) => f();
return local<A>(/*[exact=A]*/ () => new A());
}
/*element: invokeGenericLocalFunction2:[null|exact=B]*/
invokeGenericLocalFunction2() {
/*[null|subclass=Object]*/
T local<T>(T Function() /*[subclass=Closure]*/ f) => f();
return local<B>(/*[exact=B]*/ () => new B());
}
/*element: invokeGenericLocalFunction3:[null|exact=C]*/
invokeGenericLocalFunction3() {
/*[null|subclass=Object]*/
T local<T>(T Function() /*[subclass=Closure]*/ f) => f();
return local<C>(/*[exact=C]*/ () => new C());
}
/*element: invokeFunctions:[null]*/
invokeFunctions() {
invokeFunction1(/*[exact=A]*/ () => new A());
invokeFunction2(/*[exact=B]*/ () => new B());
invokeFunction3(/*[exact=C]*/ () => new C());
invokeGenericFunction1();
invokeGenericFunction2();
invokeGenericFunction3();
invokeGenericLocalFunction1();
invokeGenericLocalFunction2();
invokeGenericLocalFunction3();
}
class GenericClass<T> {
/*element: GenericClass.field:Union([exact=C], [subclass=A])*/
final T field;
/*element: GenericClass.functionTypedField:[subclass=Closure]*/
final T Function() functionTypedField;
/*element: GenericClass.:[exact=GenericClass]*/
GenericClass(this. /*Union([exact=C], [subclass=A])*/ field)
: functionTypedField = (/*Union([exact=C], [subclass=A])*/ () => field);
/*element: GenericClass.getter:Union([exact=C], [subclass=A])*/
T get getter => /*[subclass=GenericClass]*/ field;
/*element: GenericClass.functionTypedGetter:[subclass=Closure]*/
T Function()
get functionTypedGetter => /*[subclass=GenericClass]*/ functionTypedField;
/*element: GenericClass.method:Union([exact=C], [subclass=A])*/
T method() => /*[subclass=GenericClass]*/ field;
/*element: GenericClass.functionTypedMethod:[subclass=Closure]*/
T Function()
functionTypedMethod() => /*[subclass=GenericClass]*/ functionTypedField;
}
class GenericSubclass<T> extends GenericClass<T> {
/*element: GenericSubclass.:[exact=GenericSubclass]*/
GenericSubclass(T /*Union([exact=C], [subclass=A])*/ field) : super(field);
/*element: GenericSubclass.superField:Union([exact=C], [subclass=A])*/
superField() => super.field;
/*element: GenericSubclass.superGetter:Union([exact=C], [subclass=A])*/
superGetter() => super.getter;
/*element: GenericSubclass.superMethod:Union([exact=C], [subclass=A])*/
superMethod() => super.method();
/*element: GenericSubclass.superFieldInvoke:[null|subclass=Object]*/
superFieldInvoke() => super.functionTypedField();
/*element: GenericSubclass.superGetterInvoke:[null|subclass=Object]*/
superGetterInvoke() => super.functionTypedGetter();
/*element: GenericSubclass.superMethodInvoke:[null|subclass=Object]*/
superMethodInvoke() => super.functionTypedMethod()();
}
/*element: invokeInstanceMethod1:[subclass=A]*/
invokeInstanceMethod1(GenericClass<A> /*[exact=GenericClass]*/ c) =>
c. /*invoke: [exact=GenericClass]*/ method();
/*element: invokeInstanceMethod2:[exact=B]*/
invokeInstanceMethod2(GenericClass<B> /*[exact=GenericClass]*/ c) =>
c. /*invoke: [exact=GenericClass]*/ method();
/*element: invokeInstanceMethod3:[exact=C]*/
invokeInstanceMethod3(GenericClass<C> /*[exact=GenericClass]*/ c) =>
c. /*invoke: [exact=GenericClass]*/ method();
/*element: invokeInstanceGetter1:[subclass=A]*/
invokeInstanceGetter1(GenericClass<A> /*[exact=GenericClass]*/ c) =>
c. /*[exact=GenericClass]*/ getter;
/*element: invokeInstanceGetter2:[exact=B]*/
invokeInstanceGetter2(GenericClass<B> /*[exact=GenericClass]*/ c) =>
c. /*[exact=GenericClass]*/ getter;
/*element: invokeInstanceGetter3:[exact=C]*/
invokeInstanceGetter3(GenericClass<C> /*[exact=GenericClass]*/ c) =>
c. /*[exact=GenericClass]*/ getter;
/*element: accessInstanceField1:[subclass=A]*/
accessInstanceField1(GenericClass<A> /*[exact=GenericClass]*/ c) =>
c. /*[exact=GenericClass]*/ field;
/*element: accessInstanceField2:[exact=B]*/
accessInstanceField2(GenericClass<B> /*[exact=GenericClass]*/ c) =>
c. /*[exact=GenericClass]*/ field;
/*element: accessInstanceField3:[exact=C]*/
accessInstanceField3(GenericClass<C> /*[exact=GenericClass]*/ c) =>
c. /*[exact=GenericClass]*/ field;
/*element: invokeSuperMethod1:Union([exact=C], [subclass=A])*/
invokeSuperMethod1(GenericSubclass<A> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superMethod();
/*element: invokeSuperMethod2:Union([exact=C], [subclass=A])*/
invokeSuperMethod2(GenericSubclass<B> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superMethod();
/*element: invokeSuperMethod3:Union([exact=C], [subclass=A])*/
invokeSuperMethod3(GenericSubclass<C> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superMethod();
/*element: invokeSuperGetter1:Union([exact=C], [subclass=A])*/
invokeSuperGetter1(GenericSubclass<A> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superGetter();
/*element: invokeSuperGetter2:Union([exact=C], [subclass=A])*/
invokeSuperGetter2(GenericSubclass<B> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superGetter();
/*element: invokeSuperGetter3:Union([exact=C], [subclass=A])*/
invokeSuperGetter3(GenericSubclass<C> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superGetter();
/*element: accessSuperField1:Union([exact=C], [subclass=A])*/
accessSuperField1(GenericSubclass<A> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superField();
/*element: accessSuperField2:Union([exact=C], [subclass=A])*/
accessSuperField2(GenericSubclass<B> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superField();
/*element: accessSuperField3:Union([exact=C], [subclass=A])*/
accessSuperField3(GenericSubclass<C> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superField();
/*element: invokeFunctionTypedInstanceMethod1:[null|subclass=A]*/
invokeFunctionTypedInstanceMethod1(
GenericClass<A> /*[exact=GenericClass]*/ c) =>
c. /*invoke: [exact=GenericClass]*/ functionTypedMethod()();
/*element: invokeFunctionTypedInstanceMethod2:[null|exact=B]*/
invokeFunctionTypedInstanceMethod2(
GenericClass<B> /*[exact=GenericClass]*/ c) =>
c. /*invoke: [exact=GenericClass]*/ functionTypedMethod()();
/*element: invokeFunctionTypedInstanceMethod3:[null|exact=C]*/
invokeFunctionTypedInstanceMethod3(
GenericClass<C> /*[exact=GenericClass]*/ c) =>
c. /*invoke: [exact=GenericClass]*/ functionTypedMethod()();
/*element: invokeFunctionTypedInstanceGetter1:[null|subclass=A]*/
invokeFunctionTypedInstanceGetter1(
GenericClass<A> /*[exact=GenericClass]*/ c) =>
c. /*invoke: [exact=GenericClass]*/ functionTypedGetter();
/*element: invokeFunctionTypedInstanceGetter2:[null|exact=B]*/
invokeFunctionTypedInstanceGetter2(
GenericClass<B> /*[exact=GenericClass]*/ c) =>
c. /*invoke: [exact=GenericClass]*/ functionTypedGetter();
/*element: invokeFunctionTypedInstanceGetter3:[null|exact=C]*/
invokeFunctionTypedInstanceGetter3(
GenericClass<C> /*[exact=GenericClass]*/ c) =>
c. /*invoke: [exact=GenericClass]*/ functionTypedGetter();
/*element: invokeFunctionTypedInstanceField1:[null|subclass=A]*/
invokeFunctionTypedInstanceField1(GenericClass<A> /*[exact=GenericClass]*/ c) =>
c. /*invoke: [exact=GenericClass]*/ functionTypedField();
/*element: invokeFunctionTypedInstanceField2:[null|exact=B]*/
invokeFunctionTypedInstanceField2(GenericClass<B> /*[exact=GenericClass]*/ c) =>
c. /*invoke: [exact=GenericClass]*/ functionTypedField();
/*element: invokeFunctionTypedInstanceField3:[null|exact=C]*/
invokeFunctionTypedInstanceField3(GenericClass<C> /*[exact=GenericClass]*/ c) =>
c. /*invoke: [exact=GenericClass]*/ functionTypedField();
/*element: invokeFunctionTypedSuperMethod1:[null|subclass=Object]*/
invokeFunctionTypedSuperMethod1(
GenericSubclass<A> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superMethodInvoke();
/*element: invokeFunctionTypedSuperMethod2:[null|subclass=Object]*/
invokeFunctionTypedSuperMethod2(
GenericSubclass<B> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superMethodInvoke();
/*element: invokeFunctionTypedSuperMethod3:[null|subclass=Object]*/
invokeFunctionTypedSuperMethod3(
GenericSubclass<C> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superMethodInvoke();
/*element: invokeFunctionTypedSuperGetter1:[null|subclass=Object]*/
invokeFunctionTypedSuperGetter1(
GenericSubclass<A> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superGetterInvoke();
/*element: invokeFunctionTypedSuperGetter2:[null|subclass=Object]*/
invokeFunctionTypedSuperGetter2(
GenericSubclass<B> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superGetterInvoke();
/*element: invokeFunctionTypedSuperGetter3:[null|subclass=Object]*/
invokeFunctionTypedSuperGetter3(
GenericSubclass<C> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superGetterInvoke();
/*element: invokeFunctionTypedSuperField1:[null|subclass=Object]*/
invokeFunctionTypedSuperField1(
GenericSubclass<A> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superFieldInvoke();
/*element: invokeFunctionTypedSuperField2:[null|subclass=Object]*/
invokeFunctionTypedSuperField2(
GenericSubclass<B> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superFieldInvoke();
/*element: invokeFunctionTypedSuperField3:[null|subclass=Object]*/
invokeFunctionTypedSuperField3(
GenericSubclass<C> /*[exact=GenericSubclass]*/ c) =>
c. /*invoke: [exact=GenericSubclass]*/ superFieldInvoke();
/*element: invokeGenericClasses:[null]*/
invokeGenericClasses() {
invokeInstanceMethod1(new GenericClass<A>(new A()));
invokeInstanceMethod2(new GenericClass<B>(new B()));
invokeInstanceMethod3(new GenericClass<C>(new C()));
invokeInstanceGetter1(new GenericClass<A>(new A()));
invokeInstanceGetter2(new GenericClass<B>(new B()));
invokeInstanceGetter3(new GenericClass<C>(new C()));
accessInstanceField1(new GenericClass<A>(new A()));
accessInstanceField2(new GenericClass<B>(new B()));
accessInstanceField3(new GenericClass<C>(new C()));
invokeSuperMethod1(new GenericSubclass<A>(new A()));
invokeSuperMethod2(new GenericSubclass<B>(new B()));
invokeSuperMethod3(new GenericSubclass<C>(new C()));
invokeSuperGetter1(new GenericSubclass<A>(new A()));
invokeSuperGetter2(new GenericSubclass<B>(new B()));
invokeSuperGetter3(new GenericSubclass<C>(new C()));
accessSuperField1(new GenericSubclass<A>(new A()));
accessSuperField2(new GenericSubclass<B>(new B()));
accessSuperField3(new GenericSubclass<C>(new C()));
invokeFunctionTypedInstanceMethod1(new GenericClass<A>(new A()));
invokeFunctionTypedInstanceMethod2(new GenericClass<B>(new B()));
invokeFunctionTypedInstanceMethod3(new GenericClass<C>(new C()));
invokeFunctionTypedInstanceGetter1(new GenericClass<A>(new A()));
invokeFunctionTypedInstanceGetter2(new GenericClass<B>(new B()));
invokeFunctionTypedInstanceGetter3(new GenericClass<C>(new C()));
invokeFunctionTypedInstanceField1(new GenericClass<A>(new A()));
invokeFunctionTypedInstanceField2(new GenericClass<B>(new B()));
invokeFunctionTypedInstanceField3(new GenericClass<C>(new C()));
invokeFunctionTypedSuperMethod1(new GenericSubclass<A>(new A()));
invokeFunctionTypedSuperMethod2(new GenericSubclass<B>(new B()));
invokeFunctionTypedSuperMethod3(new GenericSubclass<C>(new C()));
invokeFunctionTypedSuperGetter1(new GenericSubclass<A>(new A()));
invokeFunctionTypedSuperGetter2(new GenericSubclass<B>(new B()));
invokeFunctionTypedSuperGetter3(new GenericSubclass<C>(new C()));
invokeFunctionTypedSuperField1(new GenericSubclass<A>(new A()));
invokeFunctionTypedSuperField2(new GenericSubclass<B>(new B()));
invokeFunctionTypedSuperField3(new GenericSubclass<C>(new C()));
}
/*element: genericMethod:Union([exact=C], [subclass=A])*/
T genericMethod<T>(T /*Union([exact=C], [subclass=A])*/ t) => t;
/*element: functionTypedGenericMethod:[subclass=Closure]*/
T Function() functionTypedGenericMethod<T>(
T /*Union([exact=C], [subclass=A])*/ t) =>
/*Union([exact=C], [subclass=A])*/ () => t;
/*element: Class.:[exact=Class]*/
class Class {
/*element: Class.genericMethod:Union([exact=C], [subclass=A])*/
T genericMethod<T>(T /*Union([exact=C], [subclass=A])*/ t) => t;
/*element: Class.functionTypedGenericMethod:[subclass=Closure]*/
T Function() functionTypedGenericMethod<T>(
T /*Union([exact=C], [subclass=A])*/ t) =>
/*Union([exact=C], [subclass=A])*/ () => t;
}
/*element: Subclass.:[exact=Subclass]*/
class Subclass extends Class {
/*element: Subclass.superMethod1:[subclass=A]*/
superMethod1() {
return super.genericMethod<A>(new A());
}
/*element: Subclass.superMethod2:[exact=B]*/
superMethod2() {
return super.genericMethod<B>(new B());
}
/*element: Subclass.superMethod3:[exact=C]*/
superMethod3() {
return super.genericMethod<C>(new C());
}
/*element: Subclass.functionTypedSuperMethod1:[null|subclass=A]*/
functionTypedSuperMethod1() {
return super.functionTypedGenericMethod<A>(new A())();
}
/*element: Subclass.functionTypedSuperMethod2:[null|exact=B]*/
functionTypedSuperMethod2() {
return super.functionTypedGenericMethod<B>(new B())();
}
/*element: Subclass.functionTypedSuperMethod3:[null|exact=C]*/
functionTypedSuperMethod3() {
return super.functionTypedGenericMethod<C>(new C())();
}
}
/*element: invokeGenericMethod1:[subclass=A]*/
invokeGenericMethod1(A /*[exact=A]*/ a) => genericMethod<A>(a);
/*element: invokeGenericMethod2:[exact=B]*/
invokeGenericMethod2(B /*[exact=B]*/ b) => genericMethod<B>(b);
/*element: invokeGenericMethod3:[exact=C]*/
invokeGenericMethod3(C /*[exact=C]*/ c) => genericMethod<C>(c);
/*element: invokeGenericInstanceMethod1:[subclass=A]*/
invokeGenericInstanceMethod1() =>
new Class(). /*invoke: [exact=Class]*/ genericMethod<A>(new A());
/*element: invokeGenericInstanceMethod2:[exact=B]*/
invokeGenericInstanceMethod2() =>
new Class(). /*invoke: [exact=Class]*/ genericMethod<B>(new B());
/*element: invokeGenericInstanceMethod3:[exact=C]*/
invokeGenericInstanceMethod3() =>
new Class(). /*invoke: [exact=Class]*/ genericMethod<C>(new C());
/*element: invokeGenericSuperMethod1:[subclass=A]*/
invokeGenericSuperMethod1() =>
new Subclass(). /*invoke: [exact=Subclass]*/ superMethod1();
/*element: invokeGenericSuperMethod2:[exact=B]*/
invokeGenericSuperMethod2() =>
new Subclass(). /*invoke: [exact=Subclass]*/ superMethod2();
/*element: invokeGenericSuperMethod3:[exact=C]*/
invokeGenericSuperMethod3() =>
new Subclass(). /*invoke: [exact=Subclass]*/ superMethod3();
/*element: invokeFunctionTypedGenericMethod1:[null|subclass=A]*/
invokeFunctionTypedGenericMethod1(A /*[exact=A]*/ a) =>
functionTypedGenericMethod<A>(a)();
/*element: invokeFunctionTypedGenericMethod2:[null|exact=B]*/
invokeFunctionTypedGenericMethod2(B /*[exact=B]*/ b) =>
functionTypedGenericMethod<B>(b)();
/*element: invokeFunctionTypedGenericMethod3:[null|exact=C]*/
invokeFunctionTypedGenericMethod3(C /*[exact=C]*/ c) =>
functionTypedGenericMethod<C>(c)();
/*element: invokeFunctionTypedGenericInstanceMethod1:[null|subclass=A]*/
invokeFunctionTypedGenericInstanceMethod1() => new Class()
. /*invoke: [exact=Class]*/ functionTypedGenericMethod<A>(new A())();
/*element: invokeFunctionTypedGenericInstanceMethod2:[null|exact=B]*/
invokeFunctionTypedGenericInstanceMethod2() => new Class()
. /*invoke: [exact=Class]*/ functionTypedGenericMethod<B>(new B())();
/*element: invokeFunctionTypedGenericInstanceMethod3:[null|exact=C]*/
invokeFunctionTypedGenericInstanceMethod3() => new Class()
. /*invoke: [exact=Class]*/ functionTypedGenericMethod<C>(new C())();
/*element: invokeFunctionTypedGenericSuperMethod1:[null|subclass=A]*/
invokeFunctionTypedGenericSuperMethod1() =>
new Subclass(). /*invoke: [exact=Subclass]*/ functionTypedSuperMethod1();
/*element: invokeFunctionTypedGenericSuperMethod2:[null|exact=B]*/
invokeFunctionTypedGenericSuperMethod2() =>
new Subclass(). /*invoke: [exact=Subclass]*/ functionTypedSuperMethod2();
/*element: invokeFunctionTypedGenericSuperMethod3:[null|exact=C]*/
invokeFunctionTypedGenericSuperMethod3() =>
new Subclass(). /*invoke: [exact=Subclass]*/ functionTypedSuperMethod3();
/*element: invokeGenericMethods:[null]*/
invokeGenericMethods() {
invokeGenericMethod1(new A());
invokeGenericMethod2(new B());
invokeGenericMethod3(new C());
invokeGenericInstanceMethod1();
invokeGenericInstanceMethod2();
invokeGenericInstanceMethod3();
invokeGenericSuperMethod1();
invokeGenericSuperMethod2();
invokeGenericSuperMethod3();
invokeFunctionTypedGenericMethod1(new A());
invokeFunctionTypedGenericMethod2(new B());
invokeFunctionTypedGenericMethod3(new C());
invokeFunctionTypedGenericInstanceMethod1();
invokeFunctionTypedGenericInstanceMethod2();
invokeFunctionTypedGenericInstanceMethod3();
invokeFunctionTypedGenericSuperMethod1();
invokeFunctionTypedGenericSuperMethod2();
invokeFunctionTypedGenericSuperMethod3();
}