library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/issue31767.dart:7:14: Error: Field 'sb' should be initialized because its type 'StringBuffer' doesn't allow null.
//  - 'StringBuffer' is from 'dart:core'.
// StringBuffer sb;
//              ^^
//
import self as self;
import "dart:core" as core;
import "issue31767_lib.dart" as iss;

import "org-dartlang-testcase:///issue31767_lib.dart";

class C extends core::Object {
  final field core::int w;
  constructor foo(core::int x, [core::int y = #C1, core::int z = #C1]) → self::C
    : self::C::w = self::p("x", x).{core::num::+}(self::p("y", y)){(core::num) → core::int}.{core::num::+}(self::p("z", z)){(core::num) → core::int}, super core::Object::•()
    ;
}
abstract class M extends self::C /*isMixinDeclaration*/  {
  get w2() → core::int
    return this.{self::C::w}{core::int}.{core::num::*}(this.{self::C::w}{core::int}){(core::num) → core::int};
}
class D = self::C with self::M {
  synthetic constructor foo(core::int x, [core::int y = #C1, core::int z = #C1]) → self::D
    : super self::C::foo(x, y, z)
    ;
  synthetic mixin-super-stub get w2() → core::int
    return super.{self::M::w2};
}
abstract class N extends iss::A /*isMixinDeclaration*/  {
  get w2() → core::int
    return this.{iss::A::w}{core::int}.{core::num::*}(this.{iss::A::w}{core::int}){(core::num) → core::int};
}
class E = iss::A with self::N {
  synthetic constructor foo(core::int x, [core::int y = #C2, core::int z = #C2, iss::_A a = #C4]) → self::E
    : super iss::A::foo(x, y, z, a)
    ;
  synthetic mixin-super-stub get w2() → core::int
    return super.{self::N::w2};
}
static field core::StringBuffer sb;
static method p(core::String name, core::int value) → core::int {
  self::sb.{core::StringBuffer::write}("${name} = ${value}, "){(core::Object?) → void};
  return value;
}
static method main() → dynamic {
  self::sb = new core::StringBuffer::•();
  iss::A a = new iss::A::foo(1, 2);
  self::expect("x = 1, y = 2, z = 3, ", self::sb.{core::StringBuffer::toString}(){() → core::String});
  self::expect(6, a.{iss::A::w}{core::int});
  self::expect(5, a.{iss::A::a}{iss::_A}.{iss::_A::field}{core::int});
  self::sb = new core::StringBuffer::•();
  self::C c = new self::C::foo(1, 2);
  self::expect("x = 1, y = 2, z = 0, ", self::sb.{core::StringBuffer::toString}(){() → core::String});
  self::expect(3, c.{self::C::w}{core::int});
  self::sb = new core::StringBuffer::•();
  self::D d = new self::D::foo(1, 2);
  self::expect("x = 1, y = 2, z = 0, ", self::sb.{core::StringBuffer::toString}(){() → core::String});
  self::expect(3, d.{self::C::w}{core::int});
  self::expect(9, d.{self::D::w2}{core::int});
  self::sb = new core::StringBuffer::•();
  self::E e = new self::E::foo(1, 2);
  self::expect("x = 1, y = 2, z = 3, ", self::sb.{core::StringBuffer::toString}(){() → core::String});
  self::expect(6, e.{iss::A::w}{core::int});
  self::expect(36, e.{self::E::w2}{core::int});
  self::expect(5, e.{iss::A::a}{iss::_A}.{iss::_A::field}{core::int});
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}

library;
import self as iss;
import "dart:core" as core;
import "issue31767.dart" as self;

import "org-dartlang-testcase:///issue31767.dart";

class A extends core::Object {
  final field core::int w;
  final field iss::_A a;
  constructor foo(core::int x, [core::int y = #C2, core::int z = #C2, iss::_A a = #C4]) → iss::A
    : iss::A::a = a, iss::A::w = self::p("x", x).{core::num::+}(self::p("y", y)){(core::num) → core::int}.{core::num::+}(self::p("z", z)){(core::num) → core::int}, super core::Object::•()
    ;
}
class _A extends core::Object /*hasConstConstructor*/  {
  final field core::int field;
  const constructor •(core::int field) → iss::_A
    : iss::_A::field = field, super core::Object::•()
    ;
}
static const field core::int _private = #C2;

constants  {
  #C1 = 0
  #C2 = 3
  #C3 = 5
  #C4 = iss::_A {field:#C3}
}


Constructor coverage from constants:
org-dartlang-testcase:///issue31767.dart:
- _A. (from org-dartlang-testcase:///issue31767_lib.dart:18:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)

org-dartlang-testcase:///issue31767_lib.dart:
- _A. (from org-dartlang-testcase:///issue31767_lib.dart:18:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
