[analysis_server] Remove interface, final, and sealed mixins from the analysis server.

Change-Id: Id774379c92904f27326f502299c67adb825a00b5
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/290914
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Kallen Tu <kallentu@google.com>
This commit is contained in:
Kallen Tu 2023-03-24 17:09:24 +00:00 committed by Commit Queue
parent 2e19faaec9
commit 2407f7338d
10 changed files with 15 additions and 299 deletions

View file

@ -1144,11 +1144,7 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {
@override
void visitMixinDeclaration(MixinDeclaration node) {
computer._addRegion_token(node.sealedKeyword, HighlightRegionType.BUILT_IN);
computer._addRegion_token(node.baseKeyword, HighlightRegionType.BUILT_IN);
computer._addRegion_token(
node.interfaceKeyword, HighlightRegionType.BUILT_IN);
computer._addRegion_token(node.finalKeyword, HighlightRegionType.BUILT_IN);
computer._addRegion_token(node.mixinKeyword, HighlightRegionType.BUILT_IN);
super.visitMixinDeclaration(node);
}

View file

@ -120,9 +120,6 @@ class LibraryElementSuggestionBuilder extends GeneralizingElementVisitor<void> {
if (node is ImplementsClause &&
!element.isImplementableIn(request.libraryElement)) {
return;
} else if (node is WithClause &&
!element.isMixableIn(request.libraryElement)) {
return;
}
_visitInterfaceElement(element);
}

View file

@ -30,6 +30,11 @@ class ConvertClassToMixin extends CorrectionProducer {
.any((member) => member is ConstructorDeclaration)) {
return;
}
if (classDeclaration.finalKeyword != null ||
classDeclaration.interfaceKeyword != null ||
classDeclaration.sealedKeyword != null) {
return;
}
var finder = _SuperclassReferenceFinder();
classDeclaration.accept(finder);
var referencedClasses = finder.referencedClasses;

View file

@ -225,9 +225,6 @@ class MoveTopLevelToFile extends RefactoringProducer {
validSelection(node.name)) {
name = node.name.lexeme;
} else if (node is MixinDeclaration && validSelection(node.name)) {
if (node.sealedKeyword != null) {
sealedDeclarations.add(node);
}
name = node.name.lexeme;
} else if (node is TopLevelVariableDeclaration) {
var variables = node.variables.variables;
@ -410,7 +407,7 @@ class _MembersToMove {
}
}
/// A helper to for matching sealed classes/mixins to their subclasses.
/// A helper to for matching sealed classes to their subclasses.
class _SealedSubclassIndex {
final CompilationUnit unit;
@ -499,9 +496,6 @@ class _SealedSubclassIndex {
return const [];
}
bool _isSealed(Element element) {
var isSealedClass = element is ClassElement && element.isSealed;
var isSealedMixin = element is MixinElement && element.isSealed;
return isSealedClass || isSealedMixin;
}
bool _isSealed(Element element) =>
element is ClassElement && element.isSealed;
}

View file

@ -1229,26 +1229,6 @@ base mixin A {}
expect(hover.propagatedType, isNull);
}
Future<void> test_mixin_declaration_final() async {
newFile(testFilePath, '''
final mixin A {}
''');
var hover = await prepareHover('A');
expect(hover.elementDescription, 'final mixin A on Object');
expect(hover.staticType, isNull);
expect(hover.propagatedType, isNull);
}
Future<void> test_mixin_declaration_interface() async {
newFile(testFilePath, '''
interface mixin A {}
''');
var hover = await prepareHover('A');
expect(hover.elementDescription, 'interface mixin A on Object');
expect(hover.staticType, isNull);
expect(hover.propagatedType, isNull);
}
@failingTest
Future<void> test_mixin_reference() async {
newFile(testFilePath, '''

View file

@ -242,7 +242,6 @@ void f() {
Future<void> test_BUILT_IN_final() async {
addTestFile('''
final class A {}
final mixin M {}
final class B = Object with M;
void f() {
var final = 42;
@ -250,7 +249,6 @@ void f() {
''');
await prepareHighlights();
assertHasRegion(HighlightRegionType.BUILT_IN, 'final class A');
assertHasRegion(HighlightRegionType.BUILT_IN, 'final mixin M');
assertHasRegion(HighlightRegionType.BUILT_IN, 'final class B');
assertNoRegion(HighlightRegionType.BUILT_IN, 'final = 42');
}
@ -319,7 +317,6 @@ void f() {
Future<void> test_BUILT_IN_interface() async {
addTestFile('''
interface class A {}
interface mixin M {}
interface class B = Object with M;
void f() {
var interface = 42;
@ -327,7 +324,6 @@ void f() {
''');
await prepareHighlights();
assertHasRegion(HighlightRegionType.BUILT_IN, 'interface class A');
assertHasRegion(HighlightRegionType.BUILT_IN, 'interface mixin M');
assertHasRegion(HighlightRegionType.BUILT_IN, 'interface class B');
assertNoRegion(HighlightRegionType.BUILT_IN, 'interface = 42');
}
@ -437,7 +433,6 @@ void f() {
Future<void> test_BUILT_IN_sealed() async {
addTestFile('''
sealed class A {}
sealed mixin M {}
sealed class B = Object with M;
void f() {
var sealed = 42;
@ -445,7 +440,6 @@ void f() {
''');
await prepareHighlights();
assertHasRegion(HighlightRegionType.BUILT_IN, 'sealed class A');
assertHasRegion(HighlightRegionType.BUILT_IN, 'sealed mixin M');
assertHasRegion(HighlightRegionType.BUILT_IN, 'sealed class B');
assertNoRegion(HighlightRegionType.BUILT_IN, 'sealed = 42');
}

View file

@ -143,9 +143,6 @@ suggestions
Future<void> test_mixin_inside() async {
await computeSuggestions('''
base mixin FooBase {}
interface mixin FooInterface {}
final mixin FooFinal {}
sealed mixin FooSealed {}
class A implements ^
''');
@ -153,12 +150,6 @@ class A implements ^
suggestions
FooBase
kind: mixin
FooFinal
kind: mixin
FooInterface
kind: mixin
FooSealed
kind: mixin
''');
}
@ -178,63 +169,6 @@ suggestions
} else {
assertResponse('''
suggestions
''');
}
}
Future<void> test_mixin_outside_final() async {
newFile('$testPackageLibPath/a.dart', 'final mixin Foo {}');
await computeSuggestions('''
lib B;
import 'a.dart';
class A implements ^
''');
if (isProtocolVersion1) {
assertResponse('''
suggestions
Foo
kind: mixin
''');
} else {
assertResponse('''
suggestions
''');
}
}
Future<void> test_mixin_outside_interface() async {
newFile('$testPackageLibPath/a.dart', 'interface mixin Foo {}');
await computeSuggestions('''
lib B;
import 'a.dart';
class A implements ^
''');
assertResponse('''
suggestions
Foo
kind: mixin
''');
}
Future<void> test_mixin_outside_sealed() async {
newFile('$testPackageLibPath/a.dart', 'sealed mixin Foo {}');
await computeSuggestions('''
lib B;
import 'a.dart';
class A implements ^
''');
if (isProtocolVersion1) {
assertResponse('''
suggestions
Foo
kind: mixin
''');
} else {
assertResponse('''
suggestions
''');
}
}

View file

@ -94,12 +94,9 @@ suggestions
}
}
Future<void> test_mixin_inside() async {
Future<void> test_mixin_base_inside() async {
await computeSuggestions('''
base mixin FooBase {}
interface mixin FooInterface {}
final mixin FooFinal {}
sealed mixin FooSealed {}
class A with ^
''');
@ -107,16 +104,10 @@ class A with ^
suggestions
FooBase
kind: mixin
FooFinal
kind: mixin
FooInterface
kind: mixin
FooSealed
kind: mixin
''');
}
Future<void> test_mixin_outside_base() async {
Future<void> test_mixin_base_outside() async {
newFile('$testPackageLibPath/a.dart', 'base mixin Foo {}');
await computeSuggestions('''
import 'a.dart';
@ -130,70 +121,7 @@ suggestions
''');
}
Future<void> test_mixin_outside_final() async {
newFile('$testPackageLibPath/a.dart', 'final mixin Foo {}');
await computeSuggestions('''
lib B;
import 'a.dart';
class A with ^
''');
if (isProtocolVersion1) {
assertResponse('''
suggestions
Foo
kind: mixin
''');
} else {
assertResponse('''
suggestions
''');
}
}
Future<void> test_mixin_outside_interface() async {
newFile('$testPackageLibPath/a.dart', 'interface mixin Foo {}');
await computeSuggestions('''
lib B;
import 'a.dart';
class A with ^
''');
if (isProtocolVersion1) {
assertResponse('''
suggestions
Foo
kind: mixin
''');
} else {
assertResponse('''
suggestions
''');
}
}
Future<void> test_mixin_outside_sealed() async {
newFile('$testPackageLibPath/a.dart', 'sealed mixin Foo {}');
await computeSuggestions('''
lib B;
import 'a.dart';
class A with ^
''');
if (isProtocolVersion1) {
assertResponse('''
suggestions
Foo
kind: mixin
''');
} else {
assertResponse('''
suggestions
''');
}
}
Future<void> test_mixinClass_inside() async {
Future<void> test_mixinClass_base_inside() async {
await computeSuggestions('''
base mixin class FooBaseMixinClass {}
mixin class FooMixinClass {}
@ -209,7 +137,7 @@ suggestions
''');
}
Future<void> test_mixinClass_outside() async {
Future<void> test_mixinClass_base_outside() async {
newFile('$testPackageLibPath/a.dart', '''
base mixin class FooBaseMixinClass {}
mixin class FooMixinClass {}

View file

@ -375,10 +375,7 @@ mixin D on B implements A, C {
class A {}
final class B implements A {}
''');
await assertHasAssistAt('B', '''
class A {}
final mixin B implements A {}
''');
await assertNoAssistAt('B');
}
Future<void> test_implements() async {
@ -422,10 +419,7 @@ mixin A {}
class A {}
sealed class B extends A {}
''');
await assertHasAssistAt('B', '''
class A {}
sealed mixin B implements A {}
''');
await assertNoAssistAt('B');
}
Future<void> test_sealed_extendsWith_super_extends() async {
@ -442,19 +436,7 @@ sealed class C extends A with B {
}
}
''');
await assertHasAssistAt('C', '''
class A {
a() {}
}
mixin class B {
b() {}
}
sealed mixin C on A implements B {
c() {
super.a();
}
}
''');
await assertNoAssistAt('C');
}
Future<void> test_typeParameters() async {

View file

@ -602,100 +602,6 @@ class SubSubclass extends SealedSubclass {}
newFileContent: newFileContent);
}
Future<void> test_sealedMixin_implements() async {
var originalSource = '''
sealed mixin [!Either!] {}
class Left implements Either {}
mixin Right implements Either {}
class Neither {}
''';
var modifiedSource = '''
class Neither {}
''';
var newFileName = 'either.dart';
var newFileContent = '''
sealed mixin Either {}
class Left implements Either {}
mixin Right implements Either {}
''';
await _multipleDeclarations(
originalSource: originalSource,
modifiedSource: modifiedSource,
count: 3,
newFileName: newFileName,
newFileContent: newFileContent);
}
Future<void> test_sealedMixin_on_subclass() async {
addTestSource('''
sealed mixin SealedMixin {}
mixin [!OtherMixin!] on SealedMixin {}
''');
await initializeServer();
await expectNoCodeAction(null);
}
Future<void> test_sealedMixin_on_superclass() async {
var originalSource = '''
sealed mixin [!SealedMixin!] {}
mixin MixinToMove on SealedMixin {}
mixin MixinToStay on MixinToMove {}
''';
var modifiedSource = '''
import 'package:test/sealed_mixin.dart';
mixin MixinToStay on MixinToMove {}
''';
var newFileName = 'sealed_mixin.dart';
var newFileContent = '''
sealed mixin SealedMixin {}
mixin MixinToMove on SealedMixin {}
''';
await _multipleDeclarations(
originalSource: originalSource,
modifiedSource: modifiedSource,
count: 2,
newFileName: newFileName,
newFileContent: newFileContent);
}
Future<void> test_sealedMixin_with() async {
var originalSource = '''
sealed mixin [!Either!] {}
class Left with Either {}
class Right with Either {}
class Neither {}
''';
var modifiedSource = '''
class Neither {}
''';
var newFileName = 'either.dart';
var newFileContent = '''
sealed mixin Either {}
class Left with Either {}
class Right with Either {}
''';
await _multipleDeclarations(
originalSource: originalSource,
modifiedSource: modifiedSource,
count: 3,
newFileName: newFileName,
newFileContent: newFileContent);
}
Future<void> test_single_class_withTypeParameters() async {
var originalSource = '''
class A {}