Skip to content

Commit 1e4b799

Browse files
bwilkersoncommit-bot@chromium.org
authored andcommitted
It is an error for an extension to declare an abstract method
Change-Id: I66f708dbe1f42b905b626b105a87c30325eb5c77 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/108900 Reviewed-by: Konstantin Shcheglov <[email protected]> Reviewed-by: Phil Quitslund <[email protected]> Commit-Queue: Brian Wilkerson <[email protected]>
1 parent 28962e1 commit 1e4b799

File tree

5 files changed

+87
-0
lines changed

5 files changed

+87
-0
lines changed

pkg/analyzer/lib/error/error.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ const List<ErrorCode> errorCodeValues = const [
135135
CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS,
136136
CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
137137
CompileTimeErrorCode.EXTENDS_NON_CLASS,
138+
CompileTimeErrorCode.EXTENSION_DECLARES_ABSTRACT_METHOD,
138139
CompileTimeErrorCode.EXTENSION_DECLARES_CONSTRUCTOR,
139140
CompileTimeErrorCode.EXTENSION_DECLARES_INSTANCE_FIELD,
140141
CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS,

pkg/analyzer/lib/src/error/codes.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1174,6 +1174,14 @@ class CompileTimeErrorCode extends ErrorCode {
11741174
correction: "Try specifying a different superclass, or "
11751175
"removing the extends clause.");
11761176

1177+
/**
1178+
* No parameters.
1179+
*/
1180+
static const CompileTimeErrorCode EXTENSION_DECLARES_ABSTRACT_METHOD =
1181+
const CompileTimeErrorCode('EXTENSION_DECLARES_ABSTRACT_METHOD',
1182+
"Extensions can't declare abstract methods.",
1183+
correction: "Try providing an implementation for the method.");
1184+
11771185
/**
11781186
* No parameters.
11791187
*/

pkg/analyzer/lib/src/fasta/ast_builder.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1571,6 +1571,11 @@ class AstBuilder extends StackListener {
15711571
messageConstMethod, modifiers.constKeyword, modifiers.constKeyword);
15721572
}
15731573
checkFieldFormalParameters(parameters);
1574+
if (extensionDeclaration != null && body is EmptyFunctionBody) {
1575+
errorReporter.errorReporter.reportErrorForNode(
1576+
CompileTimeErrorCode.EXTENSION_DECLARES_ABSTRACT_METHOD, name);
1577+
return;
1578+
}
15741579
currentDeclarationMembers.add(ast.methodDeclaration(
15751580
comment,
15761581
metadata,
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:analyzer/dart/analysis/features.dart';
6+
import 'package:analyzer/src/error/codes.dart';
7+
import 'package:analyzer/src/generated/engine.dart';
8+
import 'package:test_reflective_loader/test_reflective_loader.dart';
9+
10+
import '../dart/resolution/driver_resolution.dart';
11+
12+
main() {
13+
defineReflectiveSuite(() {
14+
defineReflectiveTests(ExtensionDeclaresAbstractMethodTest);
15+
});
16+
}
17+
18+
@reflectiveTest
19+
class ExtensionDeclaresAbstractMethodTest extends DriverResolutionTest {
20+
@override
21+
AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
22+
..contextFeatures = new FeatureSet.forTesting(
23+
sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
24+
25+
test_getter() {
26+
assertErrorsInCode('''
27+
extension E on String {
28+
bool get isPalindrome;
29+
}
30+
''', [
31+
error(CompileTimeErrorCode.EXTENSION_DECLARES_ABSTRACT_METHOD, 35, 12),
32+
]);
33+
}
34+
35+
test_method() {
36+
assertErrorsInCode('''
37+
extension E on String {
38+
String reversed();
39+
}
40+
''', [
41+
error(CompileTimeErrorCode.EXTENSION_DECLARES_ABSTRACT_METHOD, 33, 8),
42+
]);
43+
}
44+
45+
test_none() {
46+
assertNoErrorsInCode('''
47+
extension E on String {}
48+
''');
49+
}
50+
51+
test_operator() {
52+
assertErrorsInCode('''
53+
extension E on String {
54+
String operator -(String otherString);
55+
}
56+
''', [
57+
error(CompileTimeErrorCode.EXTENSION_DECLARES_ABSTRACT_METHOD, 42, 1),
58+
]);
59+
}
60+
61+
test_setter() {
62+
assertErrorsInCode('''
63+
extension E on String {
64+
set length(int newLength);
65+
}
66+
''', [
67+
error(CompileTimeErrorCode.EXTENSION_DECLARES_ABSTRACT_METHOD, 30, 6),
68+
]);
69+
}
70+
}

pkg/analyzer/test/src/diagnostics/test_all.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ import 'equal_elements_in_const_set_test.dart' as equal_elements_in_const_set;
4040
import 'equal_keys_in_const_map_test.dart' as equal_keys_in_const_map;
4141
import 'expression_in_map_test.dart' as expression_in_map;
4242
import 'extends_non_class_test.dart' as extends_non_class;
43+
import 'extension_declares_abstract_method_test.dart'
44+
as extension_declares_abstract_method;
4345
import 'extension_declares_constructor_test.dart'
4446
as extension_declares_constructor;
4547
import 'extension_declares_field_test.dart' as extension_declares_field;
@@ -223,6 +225,7 @@ main() {
223225
equal_keys_in_const_map.main();
224226
expression_in_map.main();
225227
extends_non_class.main();
228+
extension_declares_abstract_method.main();
226229
extension_declares_constructor.main();
227230
extension_declares_field.main();
228231
final_not_initialized.main();

0 commit comments

Comments
 (0)