blob: 3931f3d6a5ecc52416234b60dd2f806db7618ad5 [file] [log] [blame]
// Copyright (c) 2024, 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.
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/services/top_level_declarations.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(TopLevelDeclarationsTest);
});
}
@reflectiveTest
class TopLevelDeclarationsTest extends PubPackageResolutionTest {
/// Verifies that the located public export for [element] is the library with
/// URI [libraryUri].
Future<void> expectPublicExport(Element2 element, String libraryUri) async {
var publicLibrary = await TopLevelDeclarations(
result,
).publiclyExporting(element);
expect(publicLibrary?.firstFragment.source.uri.toString(), libraryUri);
}
test_publiclyExporting_getter() async {
await resolveFileCode('$testPackageLibPath/src/x.dart', "var x = 1;");
newFile('$testPackageLibPath/x.dart', "export 'src/x.dart';");
var element = findElement2.topGet('x');
await expectPublicExport(element, 'package:test/x.dart');
}
test_publiclyExporting_lib() async {
await resolveFileCode('$testPackageLibPath/x.dart', "class X {}");
var element = findElement2.class_('X');
await expectPublicExport(element, 'package:test/x.dart');
}
/// Verify we pick a library with the correct element and not just an element
/// of the same name.
test_publiclyExporting_matchingElement() async {
// Create a class x in src and some public files where the middle one
// exports X and the others declare their own elements with the same name.
await resolveFileCode('$testPackageLibPath/src/x.dart', "class X {}");
newFile('$testPackageLibPath/x1.dart', "class X {}");
newFile('$testPackageLibPath/x2.dart', "export 'src/x.dart';");
newFile('$testPackageLibPath/x3.dart', "class X {}");
var element = findElement2.class_('X');
await expectPublicExport(element, 'package:test/x2.dart');
}
test_publiclyExporting_setter() async {
await resolveFileCode('$testPackageLibPath/src/x.dart', "var x = 1;");
newFile('$testPackageLibPath/x.dart', "export 'src/x.dart';");
var element = findElement2.topSet('x');
await expectPublicExport(element, 'package:test/x.dart');
}
test_publiclyExporting_src() async {
await resolveFileCode('$testPackageLibPath/src/x.dart', "class X {}");
newFile('$testPackageLibPath/x.dart', "export 'src/x.dart';");
var element = findElement2.class_('X');
await expectPublicExport(element, 'package:test/x.dart');
}
}