Parse static get/set with name of the enclosing class as getters/setters.
R=brianwilkerson@google.com, danrubel@google.com
Change-Id: I97015fbc3bc49c70a022a2edabf4fcdcc34405ad
Reviewed-on: https://dart-review.googlesource.com/73020
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index c9587ff..6d0da4f 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -2310,7 +2310,7 @@
@override
void beginMethod(Token externalToken, Token staticToken, Token covariantToken,
- Token varFinalOrConst, Token name) {
+ Token varFinalOrConst, Token getOrSet, Token name) {
_Modifiers modifiers = new _Modifiers();
if (externalToken != null) {
assert(externalToken.isModifier);
@@ -2321,7 +2321,7 @@
String className = classDeclaration != null
? classDeclaration.name.name
: mixinDeclaration.name.name;
- if (name?.lexeme == className) {
+ if (name?.lexeme == className && getOrSet == null) {
// This error is also reported in OutlineBuilder.beginMethod
handleRecoverableError(
messageStaticConstructor, staticToken, staticToken);
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index 1ade052..f6325f8 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -380,9 +380,9 @@
@override
void beginMethod(Token externalToken, Token staticToken, Token covariantToken,
- Token varFinalOrConst, Token name) {
- super.beginMethod(
- externalToken, staticToken, covariantToken, varFinalOrConst, name);
+ Token varFinalOrConst, Token getOrSet, Token name) {
+ super.beginMethod(externalToken, staticToken, covariantToken,
+ varFinalOrConst, getOrSet, name);
begin('Method');
}
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 11f98cc..2bbf423 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -946,6 +946,44 @@
expect(method.body, isNotNull);
}
+ void test_parseClassMember_method_get_static_namedAsClass() {
+ createParser('static int get C => 0;');
+ ClassMember member = parser.parseClassMember('C');
+ expect(member, isNotNull);
+ assertNoErrors();
+ expect(member, new TypeMatcher<MethodDeclaration>());
+ MethodDeclaration method = member;
+ expect(method.documentationComment, isNull);
+ expect(method.externalKeyword, isNull);
+ expect(method.modifierKeyword, isNotNull);
+ expect(method.propertyKeyword, isNotNull);
+ expect(method.returnType, isNotNull);
+ expect(method.name, isNotNull);
+ expect(method.operatorKeyword, isNull);
+ expect(method.typeParameters, isNull);
+ expect(method.parameters, isNull);
+ expect(method.body, isNotNull);
+ }
+
+ void test_parseClassMember_method_set_static_namedAsClass() {
+ createParser('static void set C(_) {}');
+ ClassMember member = parser.parseClassMember('C');
+ expect(member, isNotNull);
+ assertNoErrors();
+ expect(member, new TypeMatcher<MethodDeclaration>());
+ MethodDeclaration method = member;
+ expect(method.documentationComment, isNull);
+ expect(method.externalKeyword, isNull);
+ expect(method.modifierKeyword, isNotNull);
+ expect(method.propertyKeyword, isNotNull);
+ expect(method.returnType, isNotNull);
+ expect(method.name, isNotNull);
+ expect(method.operatorKeyword, isNull);
+ expect(method.typeParameters, isNull);
+ expect(method.parameters, isNotNull);
+ expect(method.body, isNotNull);
+ }
+
void test_parseClassMember_method_gftReturnType_noReturnType() {
createParser('''
Function<A>(core.List<core.int> x) m() => null;
diff --git a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
index cf58e4d..0a6ea11 100644
--- a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
@@ -285,9 +285,9 @@
@override
void beginMethod(Token externalToken, Token staticToken, Token covariantToken,
- Token varFinalOrConst, Token name) {
- listener?.beginMethod(
- externalToken, staticToken, covariantToken, varFinalOrConst, name);
+ Token varFinalOrConst, Token getOrSet, Token name) {
+ listener?.beginMethod(externalToken, staticToken, covariantToken,
+ varFinalOrConst, getOrSet, name);
}
@override
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index d480696..0d9dfb9 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -682,7 +682,7 @@
/// Handle the beginning of a method declaration. Substructures:
/// - metadata
void beginMethod(Token externalToken, Token staticToken, Token covariantToken,
- Token varFinalOrConst, Token name) {}
+ Token varFinalOrConst, Token getOrSet, Token name) {}
/// Handle the end of a method declaration. Substructures:
/// - metadata
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index ad479ed..30de904 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -2930,8 +2930,8 @@
// TODO(danrubel): Consider parsing the name before calling beginMethod
// rather than passing the name token into beginMethod.
- listener.beginMethod(
- externalToken, staticToken, covariantToken, varFinalOrConst, name);
+ listener.beginMethod(externalToken, staticToken, covariantToken,
+ varFinalOrConst, getOrSet, name);
Token token = typeInfo.parseType(beforeType, this);
assert(token.next == (getOrSet ?? name));
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index c3c9a85..be91582 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -589,8 +589,9 @@
@override
void beginMethod(Token externalToken, Token staticToken, Token covariantToken,
- Token varFinalOrConst, Token name) {
- inConstructor = name?.lexeme == library.currentDeclaration.name;
+ Token varFinalOrConst, Token getOrSet, Token name) {
+ inConstructor =
+ name?.lexeme == library.currentDeclaration.name && getOrSet == null;
List<Modifier> modifiers = <Modifier>[];
if (externalToken != null) {
modifiers.add(External);