|  | library; | 
|  | import self as self; | 
|  | import "dart:core" as core; | 
|  | import "dart:_internal" as _in; | 
|  |  | 
|  | import "dart:math" as math; | 
|  |  | 
|  | abstract sealed class Shape extends core::Object { | 
|  | synthetic constructor •() → self::Shape | 
|  | : super core::Object::•() | 
|  | ; | 
|  | abstract method calculateArea() → core::double; | 
|  | } | 
|  | class Square extends core::Object implements self::Shape { | 
|  | final field core::double length; | 
|  | constructor •(core::double length) → self::Square | 
|  | : self::Square::length = length, super core::Object::•() | 
|  | ; | 
|  | method calculateArea() → core::double | 
|  | return this.{self::Square::length}{core::double}.{core::double::*}(this.{self::Square::length}{core::double}){(core::num) → core::double}; | 
|  | } | 
|  | class Circle extends core::Object implements self::Shape { | 
|  | final field core::double radius; | 
|  | constructor •(core::double radius) → self::Circle | 
|  | : self::Circle::radius = radius, super core::Object::•() | 
|  | ; | 
|  | method calculateArea() → core::double | 
|  | return #C1.{core::double::*}(this.{self::Circle::radius}{core::double}){(core::num) → core::double}.{core::double::*}(this.{self::Circle::radius}{core::double}){(core::num) → core::double}; | 
|  | } | 
|  | static method calculateArea(self::Shape shape) → core::double | 
|  | return block { | 
|  | core::double #t1; | 
|  | final synthesized self::Shape #0#0 = shape; | 
|  | #L1: | 
|  | { | 
|  | { | 
|  | hoisted core::double l; | 
|  | if(#0#0 is self::Square) { | 
|  | l = #0#0{self::Square}.{self::Square::length}{core::double}; | 
|  | #t1 = l.{core::double::*}(l){(core::num) → core::double}; | 
|  | break #L1; | 
|  | } | 
|  | } | 
|  | { | 
|  | hoisted core::double r; | 
|  | if(#0#0 is self::Circle) { | 
|  | r = #0#0{self::Circle}.{self::Circle::radius}{core::double}; | 
|  | #t1 = #C1.{core::double::*}(r){(core::num) → core::double}.{core::double::*}(r){(core::num) → core::double}; | 
|  | break #L1; | 
|  | } | 
|  | } | 
|  | throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable type."); | 
|  | } | 
|  | } =>#t1; | 
|  | static method main() → dynamic { | 
|  | self::Square s1 = new self::Square::•(2.0); | 
|  | self::expect(s1.{self::Square::calculateArea}(){() → core::double}, self::calculateArea(s1)); | 
|  | self::Circle s2 = new self::Circle::•(3.0); | 
|  | self::expect(s2.{self::Circle::calculateArea}(){() → core::double}, self::calculateArea(s2)); | 
|  | } | 
|  | static method expect(dynamic expected, dynamic actual) → dynamic { | 
|  | if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) | 
|  | throw "Expected ${expected}, actual ${actual}"; | 
|  | } | 
|  |  | 
|  | constants  { | 
|  | #C1 = 3.141592653589793 | 
|  | } |