Add support for macros in override information

Change-Id: I308fd21becac53a6ad535b508749a119f8816709
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/353781
Reviewed-by: Keerti Parthasarathy <keertip@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Brian Wilkerson 2024-02-22 19:04:51 +00:00 committed by Commit Queue
parent 26e8244c2a
commit 5eeaf42939
2 changed files with 54 additions and 0 deletions

View file

@ -136,6 +136,7 @@ class _OverriddenElementsFinder {
/// Add the [OverriddenElements] for this element.
OverriddenElements find() {
_class = _class.augmented?.declaration ?? _class;
_visited.clear();
_addSuperOverrides(_class, withThisType: false);
_visited.clear();

View file

@ -7,6 +7,7 @@ import 'dart:async';
import 'package:analysis_server/protocol/protocol.dart';
import 'package:analysis_server/protocol/protocol_constants.dart';
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@ -60,6 +61,14 @@ class AnalysisNotificationOverridesTest extends PubPackageAnalysisServerTest {
expect(member!.element.location!.offset, offset);
}
/// Asserts that there is an overridden superclass [OverriddenMember] at the
/// offset of [search] in [override].
void assertHasSuperElementInFile(File file, String search) {
var offset = offsetInFile(file, search);
var member = overrideObject.superclassMember;
expect(member!.element.location!.offset, offset);
}
/// Asserts that there are no overridden members from interfaces.
void assertNoInterfaceMembers() {
expect(overrideObject.interfaceMembers, isNull);
@ -522,6 +531,50 @@ class C extends B {
assertNoInterfaceMembers();
}
Future<void> test_class_super_method_overriddenFromExtension() async {
var augmentation = newFile('$testPackageLibPath/a.dart', '''
library augment 'test.dart';
augment class A {
m() {} // in A
}
''');
addTestFile('''
import augment 'a.dart';
class A {}
class B extends A {
m() {} // in B
}
''');
await prepareOverrides();
assertHasOverride('m() {} // in B');
assertHasSuperElementInFile(augmentation, 'm() {} // in A');
assertNoInterfaceMembers();
}
Future<void> test_class_super_method_overrideFromExtension() async {
var augmented = newFile('$testPackageLibPath/b.dart', '''
import augment 'test.dart';
class A {
m() {} // in A
}
class B extends A {}
''');
addTestFile('''
library augment 'b.dart';
augment class B {
m() {} // in B
}
''');
await prepareOverrides();
assertHasOverride('m() {} // in B');
assertHasSuperElementInFile(augmented, 'm() {} // in A');
assertNoInterfaceMembers();
}
Future<void> test_class_super_method_privateByPrivate() async {
addTestFile('''
class A {