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

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

        class Foo extends Widget {}
        method(o) {
          switch (o) {
            case 1:
              return new Foo();
          }
          return null;
        }
      flutter/lib/src/widgets/framework.dart: |
        abstract class Bar {}

        abstract class Widget extends Bar {}
      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/lib"
            }
          ]
        }
    expectedLibraryCount: 3
  - entry: main.dart
    worldType: updated
    invalidate:
      - main.dart
    expectInitializeFromDill: false
    sources:
      main.dart: |
        import 'package:flutter/src/widgets/framework.dart';
        import 'package:flutter/src/widgets/widget_inspector.dart';

        class Foo extends Widget {}
        method(o) {
          switch (o) {
            case 1:
              return new Foo();
          }
          return null;
        }
    expectedLibraryCount: 3
    advancedInvalidation: bodiesOnly
