blob: ddf6b743679d2e525fb6accbd7232ac3ca80fcb7 [file] [log] [blame]
library;
import self as self;
import "dart:core" as core;
class C extends core::Object {
synthetic constructor •() self::C
: super core::Object::•()
;
method call() core::String
return "call from C";
}
class D extends core::Object {
synthetic constructor •() self::D
: super core::Object::•()
;
get getter1() core::Function
return self::Ext|get#call(self::Ext|constructor#(let final self::C #t1 = new self::C::•() in #t1 == null ?{() → core::String} null : #t1.{self::C::call}{() → core::String}));
get getter2() core::Function {
self::Ext% /* erasure=core::Function, declared=! */ result = self::Ext|constructor#(let final self::C #t2 = new self::C::•() in #t2 == null ?{() → core::String} null : #t2.{self::C::call}{() → core::String});
return self::Ext|get#call(result);
}
get getter3() core::Function
return let final self::Ext2 /* erasure=self::C */ #t3 = self::Ext2|constructor#(new self::C::•()) in #t3 == null ?{() → core::String} null : #t3.{self::C::call}{() → core::String};
get getter4() core::Function {
self::Ext2 /* erasure=self::C */ result = self::Ext2|constructor#(new self::C::•());
return let final self::Ext2 /* erasure=self::C */ #t4 = result in #t4 == null ?{() → core::String} null : #t4.{self::C::call}{() → core::String};
}
method method1<T extends self::C>(self::D::method1::T c) core::Function {
return let final self::D::method1::T #t5 = c in #t5 == null ?{() → core::String} null : #t5.{self::C::call}{() → core::String};
}
method method2<T extends self::C>(self::D::method2::T c) core::Function {
self::Ext% /* erasure=core::Function, declared=! */ result = self::Ext|constructor#(let final self::D::method2::T #t6 = c in #t6 == null ?{() → core::String} null : #t6.{self::C::call}{() → core::String});
return self::Ext|get#call(result);
}
method method3<T extends self::Ext% /* erasure=core::Function, declared=! */>(self::Ext% /* erasure=core::Function, declared=! */ e) core::Function {
return self::Ext|get#call(e);
}
method method4<T extends self::Ext2 /* erasure=self::C */>(self::Ext2 /* erasure=self::C */ e) core::Function {
return let final self::Ext2 /* erasure=self::C */ #t7 = e in #t7 == null ?{() → core::String} null : #t7.{self::C::call}{() → core::String};
}
method method5<T extends core::Object? = dynamic>(self::D::method5::T% c) core::Function {
if(c is self::C) {
return let final self::D::method5::T% & self::C /* '%' & '!' = '!' */ #t8 = c{self::D::method5::T% & self::C /* '%' & '!' = '!' */} in #t8 == null ?{() → core::String} null : #t8.{self::C::call}{() → core::String};
}
return () Null => null;
}
method method6<T extends core::Object? = dynamic, S extends self::C>(self::D::method6::T% c) core::Function {
if(c is self::D::method6::S) {
return let final self::D::method6::T% & self::D::method6::S /* '%' & '!' = '!' */ #t9 = c{self::D::method6::T% & self::D::method6::S /* '%' & '!' = '!' */} in #t9 == null ?{() → core::String} null : #t9.{self::C::call}{() → core::String};
}
return () Null => null;
}
}
class E extends core::Object {
synthetic constructor •() self::E
: super core::Object::•()
;
get getter1() core::String
return self::Ext|call(self::Ext|constructor#(let final self::C #t10 = new self::C::•() in #t10 == null ?{() → core::String} null : #t10.{self::C::call}{() → core::String}));
get getter2() core::String {
core::String result = self::Ext|call(self::Ext|constructor#(let final self::C #t11 = new self::C::•() in #t11 == null ?{() → core::String} null : #t11.{self::C::call}{() → core::String}));
return result;
}
get getter3() core::String
return self::Ext2|constructor#(new self::C::•()).{self::C::call}(){() → core::String};
get getter4() core::String {
core::String result = self::Ext2|constructor#(new self::C::•()).{self::C::call}(){() → core::String};
return result;
}
method method1<T extends self::C>(self::E::method1::T c) core::String {
return c.{self::C::call}(){() core::String};
}
method method2<T extends self::C>(self::E::method2::T c) core::String {
core::String result = self::Ext|call(self::Ext|constructor#(let final self::E::method2::T #t12 = c in #t12 == null ?{() → core::String} null : #t12.{self::C::call}{() → core::String}));
return result;
}
method method3<T extends self::Ext% /* erasure=core::Function, declared=! */>(self::Ext% /* erasure=core::Function, declared=! */ e) core::String {
return self::Ext|call(e);
}
method method4<T extends self::Ext2 /* erasure=self::C */>(self::Ext2 /* erasure=self::C */ e) core::String {
return e.{self::C::call}(){() core::String};
}
method method5<T extends core::Object? = dynamic>(self::E::method5::T% c) core::String {
if(c is self::C) {
return c{self::E::method5::T% & self::C /* '%' & '!' = '!' */}.{self::C::call}(){() core::String};
}
return "";
}
method method6<T extends core::Object? = dynamic, S extends self::C>(self::E::method6::T% c) core::String {
if(c is self::E::method6::S) {
return c{self::E::method6::T% & self::E::method6::S /* '%' & '!' = '!' */}.{self::C::call}(){() core::String};
}
return "";
}
}
extension type Ext(core::Function it) {
abstract extension-type-member representation-field get it() core::Function;
method call = self::Ext|call;
method tearoff call = self::Ext|get#call;
constructor = self::Ext|constructor#;
constructor tearoff = self::Ext|constructor#_#new#tearOff;
}
extension type Ext2(self::C c) implements self::C {
abstract extension-type-member representation-field get c() self::C;
constructor = self::Ext2|constructor#;
constructor tearoff = self::Ext2|constructor#_#new#tearOff;
}
static extension-type-member method Ext|constructor#(core::Function it) → self::Ext% /* erasure=core::Function, declared=! */ {
lowered final self::Ext% /* erasure=core::Function, declared=! */ #this = it;
return #this;
}
static extension-type-member method Ext|constructor#_#new#tearOff(core::Function it) → self::Ext% /* erasure=core::Function, declared=! */
return self::Ext|constructor#(it);
static extension-type-member method Ext|call(lowered final self::Ext% /* erasure=core::Function, declared=! */ #this) → core::String
return "call from Ext: ${(#this as{Unchecked} core::Function)()}";
static extension-type-member method Ext|get#call(lowered final self::Ext% /* erasure=core::Function, declared=! */ #this) → () → core::String
return () core::String => self::Ext|call(#this);
static extension-type-member method Ext2|constructor#(self::C c) → self::Ext2 /* erasure=self::C */ {
lowered final self::Ext2 /* erasure=self::C */ #this = c;
return #this;
}
static extension-type-member method Ext2|constructor#_#new#tearOff(self::C c) → self::Ext2 /* erasure=self::C */
return self::Ext2|constructor#(c);
static method main() void {
self::D d = new self::D::•();
core::print(d.{self::D::getter1}{core::Function}());
core::print(d.{self::D::getter2}{core::Function}());
core::print(d.{self::D::getter3}{core::Function}());
core::print(d.{self::D::getter4}{core::Function}());
core::print(d.{self::D::method1}<self::C>(new self::C::•()){(self::C) core::Function}());
core::print(d.{self::D::method2}<self::C>(new self::C::•()){(self::C) core::Function}());
core::print(d.{self::D::method3}<self::Ext% /* erasure=core::Function, declared=! */>(self::Ext|constructor#(let final self::C #t13 = new self::C::•() in #t13 == null ?{() → core::String} null : #t13.{self::C::call}{() → core::String})){(self::Ext% /* erasure=core::Function, declared=! */) → core::Function}());
core::print(d.{self::D::method4}<self::Ext2 /* erasure=self::C */>(self::Ext2|constructor#(new self::C::•())){(self::Ext2 /* erasure=self::C */) → core::Function}());
core::print(d.{self::D::method5}<self::C>(new self::C::•()){(self::C) core::Function}());
core::print(d.{self::D::method6}<self::C, self::C>(new self::C::•()){(self::C) core::Function}());
self::E e = new self::E::•();
core::print(e.{self::E::getter1}{core::String});
core::print(e.{self::E::getter2}{core::String});
core::print(e.{self::E::getter3}{core::String});
core::print(e.{self::E::getter4}{core::String});
core::print(e.{self::E::method1}<self::C>(new self::C::•()){(self::C) core::String});
core::print(e.{self::E::method2}<self::C>(new self::C::•()){(self::C) core::String});
core::print(e.{self::E::method3}<self::Ext% /* erasure=core::Function, declared=! */>(self::Ext|constructor#(let final self::C #t14 = new self::C::•() in #t14 == null ?{() → core::String} null : #t14.{self::C::call}{() → core::String})){(self::Ext% /* erasure=core::Function, declared=! */) → core::String});
core::print(e.{self::E::method4}<self::Ext2 /* erasure=self::C */>(self::Ext2|constructor#(new self::C::•())){(self::Ext2 /* erasure=self::C */) → core::String});
core::print(e.{self::E::method5}<self::C>(new self::C::•()){(self::C) core::String});
core::print(e.{self::E::method6}<self::C, self::C>(new self::C::•()){(self::C) core::String});
}