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

# Reproduce weirdness with abstract member-signatures and forwarding stubs from
# https://github.com/flutter/flutter/issues/66122

type: newworld
target: DDC
trackWidgetCreation: true
worlds:
  - entry: main.dart
    skipClassHierarchyTest: true
    sources:
      main.dart: |
        import 'package:flutter/framework.dart';
        import 'after_layout.dart';
        class _HotReloadIssueState extends State<HotReloadIssue>
            with AfterLayoutMixin<HotReloadIssue> {
          Widget build(BuildContext context) {}
          void afterFirstLayout(BuildContext context) {}
        }
        class HotReloadIssue extends StatefulWidget {}

      after_layout.dart:
        import 'package:flutter/framework.dart';
        mixin AfterLayoutMixin<T extends StatefulWidget> on State<T> {}

      flutter/lib/framework.dart: |
        mixin Diagnosticable {
          String toString() {
            return "foo";
          }
        }
        abstract class State<T extends StatefulWidget> with Diagnosticable {
          T? _widget;
        }
        class State2 extends State {}
        class StatefulWidget {}
        class Widget {}
        class BuildContext {}
        final State<StatefulWidget> state = new State2();
        void foo() {
          state._widget = null;
        }
      .dart_tool/package_config.json: |
        {
          "configVersion": 2,
          "packages": [
            {
              "name": "flutter",
              "rootUri": "../flutter",
              "packageUri": "lib/"
            }
          ]
        }
    expectedLibraryCount: 3
  - entry: main.dart
    skipClassHierarchyTest: true
    worldType: updated
    invalidate:
      - main.dart
    expectInitializeFromDill: false
    expectedLibraryCount: 3
