library;
import self as self;
import "dart:core" as core;

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;
        }
      }
    }
  } =>#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
}
