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

class Class extends core::Object {
  field core::int? field = null;
  synthetic constructor •() → self::Class
    : super core::Object::•()
    ;
}
extension /* unnamed */ _extension#0 on self::Class {
  get property1 = self::_extension#0|get#property1;
  set property1 = self::_extension#0|set#property1;
}
extension /* unnamed */ _extension#1 on self::Class {
  get property2 = self::_extension#1|get#property2;
  set property2 = self::_extension#1|set#property2;
}
static extension-member method _extension#0|get#property1(lowered final self::Class #this) → core::int?
  return self::_extension#1|get#property2(#this);
static extension-member method _extension#0|set#property1(lowered final self::Class #this, core::int? value) → void
  return #this.{self::Class::field} = value;
static extension-member method _extension#1|get#property2(lowered final self::Class #this) → core::int?
  return #this.{self::Class::field}{core::int?};
static extension-member method _extension#1|set#property2(lowered final self::Class #this, core::int? value) → void
  return let final core::int? #t1 = value in let final void #t2 = self::_extension#0|set#property1(#this, #t1) in #t1;
static method main() → dynamic {
  self::Class c = new self::Class::•();
  self::expect(null, self::_extension#0|get#property1(c));
  self::expect(null, self::_extension#1|get#property2(c));
  self::expect(42, let final core::int #t3 = 42 in let final void #t4 = self::_extension#0|set#property1(c, #t3) in #t3);
  self::expect(42, self::_extension#1|get#property2(c));
  self::expect(87, let final core::int #t5 = 87 in let final void #t6 = self::_extension#1|set#property2(c, #t5) in #t5);
  self::expect(87, self::_extension#0|get#property1(c));
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
    throw "Mismatch: expected=${expected}, actual=${actual}";
  }
}


Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///internal_resolution.dart:23:28 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///internal_resolution.dart:23:28 -> IntConstant(42)
Evaluated: VariableGet @ org-dartlang-testcase:///internal_resolution.dart:25:28 -> IntConstant(87)
Evaluated: VariableGet @ org-dartlang-testcase:///internal_resolution.dart:25:28 -> IntConstant(87)
Extra constant evaluation: evaluated: 49, effectively constant: 4
