# Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE.md file.

# Recompiling with no change shouldn't change the initializer.
# In fact, this woukd (currently) print `[null]` when compiled once,
# but `[a1]` if recompiling main.dart first.
# http://dartbug.com/48895

type: newworld
worlds:
  - entry: main.dart
    sources:
      main.dart: |
        // @dart=2.9
        import 'lib.dart';
        class C extends C3 implements C4 {
          void noSuchMethod(Invocation invocation) {
            print(invocation.positionalArguments);
          }
        }
        main() {
          C c = new C();
          c.m();
        }
      lib.dart: |
        abstract class C1 {
          m();
        }
        abstract class C2 {
          m([String a = "a1"]);
        }
        abstract class C3 implements C1, C2 {}
        abstract class C4 {
          m([covariant String a = "a2"]);
        }

    expectedLibraryCount: 2

  - entry: main.dart
    worldType: updated
    compareToPrevious: true
    expectInitializeFromDill: false
    invalidate:
      - main.dart
    expectedLibraryCount: 2
