main = <No Member>;
library from "package:flutter/src/widgets/framework.dart" as fra {

  abstract class Bar extends dart.core::Object /*hasConstConstructor*/  {
    const constructor •() → fra::Bar
      : super dart.core::Object::•()
      ;
  }
  abstract class Widget extends fra::Bar implements wid::_HasCreationLocation /*hasConstConstructor*/  {
    final field wid::_Location? _location /*isLegacy, from null */;
    const constructor •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → fra::Widget
      : super fra::Bar::•(), fra::Widget::_location = $creationLocationd_0dea112b090073317d4
      ;
  }
}
library from "package:flutter/src/widgets/widget_inspector.dart" as wid {

  abstract class _HasCreationLocation extends dart.core::Object {
    synthetic constructor •() → wid::_HasCreationLocation
      : super dart.core::Object::•()
      ;
    abstract get _location() → wid::_Location;
  }
  class _Location extends dart.core::Object /*hasConstConstructor*/  {
    final field dart.core::String file;
    final field dart.core::int line;
    final field dart.core::int column;
    final field dart.core::String name;
    final field dart.core::List<wid::_Location> parameterLocations;
    const constructor •({required dart.core::String file = #C1, required dart.core::int line = #C1, required dart.core::int column = #C1, required dart.core::String name = #C1, required dart.core::List<wid::_Location> parameterLocations = #C1}) → wid::_Location
      : wid::_Location::file = file, wid::_Location::line = line, wid::_Location::column = column, wid::_Location::name = name, wid::_Location::parameterLocations = parameterLocations, super dart.core::Object::•()
      ;
  }
}
library from "org-dartlang-test:///foo.dart" as foo {

  import "package:flutter/src/widgets/framework.dart";
  import "package:flutter/src/widgets/widget_inspector.dart";

  class Foo extends fra::Widget /*hasConstConstructor*/  {
    const constructor •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Foo
      : super fra::Widget::•($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4)
      ;
  }
}
library from "org-dartlang-test:///main.dart" as main {

  import "org-dartlang-test:///foo.dart";

  static field foo::Foo foo = #C7;
}
constants  {
  #C1 = null
  #C2 = "org-dartlang-test:///main.dart"
  #C3 = 3.0
  #C4 = 17.0
  #C5 = <wid::_Location*>[]
  #C6 = wid::_Location {file:#C2, line:#C3, column:#C4, name:#C1, parameterLocations:#C5}
  #C7 = foo::Foo {_location:#C6}
}
