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

type: newworld
target: DDC
trackWidgetCreation: true
worlds:
  - entry: main.dart
    sources:
      main.dart: |
        import 'foo.dart';
      foo.dart:
        import 'package:flutter/src/widgets/framework.dart';
        import 'package:flutter/src/widgets/widget_inspector.dart';

        class Foo extends Widget {
          const Foo();
        }
      flutter/lib/src/widgets/framework.dart: |
        abstract class Bar {
          const Bar();
        }

        abstract class Widget extends Bar {
          const Widget();
        }
      flutter/lib/src/widgets/widget_inspector.dart: |
        abstract class _HasCreationLocation {
          _Location get _location;
        }

        /// A tuple with file, line, and column number, for displaying human-readable
        /// file locations.
        class _Location {
          const _Location({
            required this.file,
            required this.line,
            required this.column,
            required this.name,
            required this.parameterLocations,
          });

          /// File path of the location.
          final String file;

          /// 1-based line number.
          final int line;

          /// 1-based column number.
          final int column;

          /// Optional name of the parameter or function at this location.
          final String name;

          /// Optional locations of the parameters of the member at this location.
          final List<_Location> parameterLocations;
        }
      .dart_tool/package_config.json: |
        {
          "configVersion": 2,
          "packages": [
            {
              "name": "flutter",
              "rootUri": "../flutter",
              "packageUri": "lib/"
            }
          ]
        }
    expectedLibraryCount: 4
  - entry: main.dart
    worldType: updated
    invalidate:
      - main.dart
    expectInitializeFromDill: false
    sources:
      main.dart: |
        import 'foo.dart';

        Foo foo = const Foo();
    expectedLibraryCount: 4
