# 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 file.

# Use multiple entry points, try for force the class hierarchy not to contain
# all the entry point libraries, then try to force using it via expression
# compilation. This used to crash.

type: newworld
worlds:
  - entry:
    - a.dart
    - b.dart
    sources:
      a.dart: |
        class A {
          void foo() {}
        }
        class B extends A {
          void foo() {
            super.foo();
          }
        }
      b.dart: |
        class C {
          void foo() {}
        }
        class D extends C {
          void foo() {
            super.foo();
          }
        }
    expectedLibraryCount: 2

  - entry:
    - a.dart
    - b.dart
    expectInitializeFromDill: true
    invalidate:
      - a.dart
    sources:
      a.dart: |
        class A {
          void bar() {}
        }
        class B extends A {
          void bar() {
            super.bar();
          }
        }
      b.dart: |
        class C {
          void foo() {}
        }
        class D extends C {
          void foo() {
            super.foo();
          }
        }
    advancedInvalidation: outlineChange
    expectedLibraryCount: 2
    expressionCompilation:
      uri: b.dart
      expression: super.foo()
      className: D
