# Copyright (c) 2019, 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.

# Compile an application, change a file, but don't change the outline.
# Extensions and exports.

type: newworld
worlds:
  - entry: main.dart
    experiments: alternative-invalidation-strategy
    sources:
      main.dart: |
        // @dart=2.9
        import "lib1.dart";
        import "lib1.dart" as l1;
        import "lib2.dart";
        import "lib2.dart" as l2;
        class Class {}
        extension Extension on Class {
          void method() {}
        }
        main() {
          Class a = new Class();
          a.method();
          a.method2();
          lib1();
        }
      lib1.dart: |
        // @dart=2.9
        export "main.dart";
        import "main.dart";
        import "main.dart" as m;
        extension Extension2 on Class {
          void method2() {}
        }
        lib1() {
          Class a = new Class();
          a.method();
          a.method2();
        }
      lib2.dart: |
        // @dart=2.9
        import "lib1.dart";
        import "lib1.dart" as l1;
        extension Extension3 on Class {
          void method3() {}
        }
        lib2() {
          Class a = new Class();
          a.method();
          a.method2();
        }
    expectedLibraryCount: 3
  - entry: main.dart
    experiments: alternative-invalidation-strategy
    worldType: updated
    expectInitializeFromDill: false
    invalidate:
      - main.dart
    sources:
      main.dart: |
        // @dart=2.9
        import "lib1.dart";
        import "lib1.dart" as l1;
        import "lib2.dart";
        import "lib2.dart" as l2;
        class Class {}
        extension Extension on Class {
          void method() {}
        }
        main() {
          Class a = new Class();
          a.method();
          a.method2();
          lib1();
          print("Done");
        }
    expectedLibraryCount: 3
    expectsRebuildBodiesOnly: true
  - entry: main.dart
    experiments: alternative-invalidation-strategy
    worldType: updated
    expectInitializeFromDill: false
    invalidate:
      - lib2.dart
    sources:
      lib2.dart: |
        // @dart=2.9
        import "lib1.dart";
        import "lib1.dart" as l1;
        extension Extension3 on Class {
          void method3() {}
        }
        lib2() {
          Class a = new Class();
          a.method();
          a.method2();
          print("done");
        }
    expectedLibraryCount: 3
    expectsRebuildBodiesOnly: true
  - entry: main.dart
    experiments: alternative-invalidation-strategy
    worldType: updated
    expectInitializeFromDill: false
    invalidate:
      - lib1.dart
    sources:
      lib1.dart: |
        // @dart=2.9
        export "main.dart";
        import "main.dart";
        import "main.dart" as m;
        extension Extension2 on Class {
          void method2() {}
        }
        lib1() {
          Class a = new Class();
          a.method();
          a.method2();
          print("done");
        }
    expectedLibraryCount: 3
    expectsRebuildBodiesOnly: true
