library /*isNonNullableByDefault*/;
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{ForNonNullableByDefault} self::Square && (let final dynamic #t2 = l = #0#0{self::Square}.{self::Square::length}{core::double} in true)) {
          #t1 = l.{core::double::*}(l){(core::num) → core::double};
          break #L1;
        }
      }
      {
        hoisted core::double r;
        if(#0#0 is{ForNonNullableByDefault} self::Circle && (let final dynamic #t3 = r = #0#0{self::Circle}.{self::Circle::radius}{core::double} in true)) {
          #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
}
