library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class Square extends core::Object /*hasConstConstructor*/  {
  final field (core::String) →? void logFunction;
  final field core::double length;
  const constructor •(core::double length, [has-declared-initializer (core::String) →? void logFunction = #C1]) → self::Square
    : self::Square::length = length, self::Square::logFunction = logFunction, super core::Object::•()
    ;
  method _log(core::String toLog) → void {
    (core::String) →? void _l = this.{self::Square::logFunction}{(core::String) →? void};
    if(!(_l == null)) {
      _l{(core::String) → void}(toLog){(core::String) → void};
    }
  }
  get area() → core::double {
    this.{self::Square::_log}("Square.area"){(core::String) → void};
    return this.{self::Square::length}{core::double}.{core::double::*}(this.{self::Square::length}{core::double}){(core::num) → core::double};
  }
}
static field core::String log = "";
static method logger(core::String s) → void {
  self::log = self::log.{core::String::+}(s){(core::String) → core::String};
}
static method main() → dynamic {
  {
    final synthesized dynamic #0#0 = new self::Square::•(2.0, #C2);
    if(!(let final dynamic #t1 = #0#0{self::Square}.{self::Square::area}{core::double} in true))
      throw new core::StateError::•("Pattern matching error");
  }
  self::expect("Square.area", self::log);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
    throw "Expected ${expected}, actual ${actual}";
  }
}

constants  {
  #C1 = null
  #C2 = static-tearoff self::logger
}
