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

typedef SourceLocation = core::int;
abstract class FieldRef extends core::Object {
  synthetic constructor •() → self::FieldRef
    : super core::Object::•()
    ;
  abstract get location() → core::int;
}
abstract class FuncRef extends core::Object {
  synthetic constructor •() → self::FuncRef
    : super core::Object::•()
    ;
  abstract get location() → core::int;
}
abstract class ClassRef extends core::Object {
  synthetic constructor •() → self::ClassRef
    : super core::Object::•()
    ;
  abstract get location() → core::int;
}
static method foo(core::Object object) → dynamic {
  final core::int? sourceLocation = block {
    core::int? #t1;
    final synthesized core::Object #0#0 = object;
    synthesized core::int #0#2;
    synthesized core::bool #0#2#isSet = false;
    #L1:
    {
      {
        final hoisted core::int location;
        if(#0#0 is self::FieldRef && (let final dynamic #t2 = location = #0#2#isSet ?{core::int} #0#2{core::int} : let final dynamic #t3 = #0#2#isSet = true in #0#2 = #0#0{self::FieldRef}.{self::FieldRef::location}{core::int} in true) || #0#0 is self::FuncRef && (let final dynamic #t4 = location = #0#2#isSet ?{core::int} #0#2{core::int} : let final dynamic #t5 = #0#2#isSet = true in #0#2 = #0#0{self::FuncRef}.{self::FuncRef::location}{core::int} in true) || #0#0 is self::ClassRef && (let final dynamic #t6 = location = #0#2#isSet ?{core::int} #0#2{core::int} : let final dynamic #t7 = #0#2#isSet = true in #0#2 = #0#0{self::ClassRef}.{self::ClassRef::location}{core::int} in true)) {
          #t1 = location;
          break #L1;
        }
      }
      {
        if(true) {
          #t1 = null;
          break #L1;
        }
      }
    }
  } =>#t1;
}
