Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit ca28e2c

Browse files
Dan Rubelcommit-bot@chromium.org
authored andcommitted
forward "required" modifier to parser listeners
... and have each report an error by default Change-Id: If818a7bb207becbed95a97890632a1803917d285 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/99720 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
1 parent 250d931 commit ca28e2c

9 files changed

Lines changed: 73 additions & 52 deletions

File tree

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

Lines changed: 10 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -169,11 +169,12 @@ class AstBuilder extends StackListener {
169169
}
170170

171171
@override
172-
void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
173-
Token varFinalOrConst) {
172+
void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
173+
Token covariantToken, Token varFinalOrConst) {
174174
push(new _Modifiers()
175175
..covariantKeyword = covariantToken
176-
..finalConstOrVarKeyword = varFinalOrConst);
176+
..finalConstOrVarKeyword = varFinalOrConst
177+
..requiredToken = requiredToken);
177178
}
178179

179180
@override
@@ -791,6 +792,9 @@ class AstBuilder extends StackListener {
791792
_Modifiers modifiers = pop();
792793
Token keyword = modifiers?.finalConstOrVarKeyword;
793794
Token covariantKeyword = modifiers?.covariantKeyword;
795+
Token requiredKeyword = modifiers?.requiredToken;
796+
// TODO(danrubel): handle required token
797+
reportNonNullableModifierError(requiredKeyword);
794798
List<Annotation> metadata = pop();
795799
Comment comment = _findComment(metadata,
796800
thisKeyword ?? typeOrFunctionTypedParameter?.beginToken ?? nameToken);
@@ -3291,34 +3295,7 @@ class _Modifiers {
32913295
Token finalConstOrVarKeyword;
32923296
Token staticKeyword;
32933297
Token covariantKeyword;
3294-
3295-
_Modifiers([List<Token> modifierTokens]) {
3296-
// No need to check the order and uniqueness of the modifiers, or that
3297-
// disallowed modifiers are not used; the parser should do that.
3298-
// TODO(paulberry,ahe): implement the necessary logic in the parser.
3299-
if (modifierTokens != null) {
3300-
for (var token in modifierTokens) {
3301-
var s = token.lexeme;
3302-
if (identical('abstract', s)) {
3303-
abstractKeyword = token;
3304-
} else if (identical('const', s)) {
3305-
finalConstOrVarKeyword = token;
3306-
} else if (identical('external', s)) {
3307-
externalKeyword = token;
3308-
} else if (identical('final', s)) {
3309-
finalConstOrVarKeyword = token;
3310-
} else if (identical('static', s)) {
3311-
staticKeyword = token;
3312-
} else if (identical('var', s)) {
3313-
finalConstOrVarKeyword = token;
3314-
} else if (identical('covariant', s)) {
3315-
covariantKeyword = token;
3316-
} else {
3317-
unhandled("$s", "modifier", token.charOffset, null);
3318-
}
3319-
}
3320-
}
3321-
}
3298+
Token requiredToken;
33223299

33233300
/// Return the token that is lexically first.
33243301
Token get beginToken {
@@ -3328,7 +3305,8 @@ class _Modifiers {
33283305
externalKeyword,
33293306
finalConstOrVarKeyword,
33303307
staticKeyword,
3331-
covariantKeyword
3308+
covariantKeyword,
3309+
requiredToken,
33323310
]) {
33333311
if (firstToken == null) {
33343312
firstToken = token;

pkg/analyzer/test/generated/parser_fasta_listener.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,9 +244,10 @@ class ForwardingTestListener extends ForwardingListener {
244244
}
245245

246246
@override
247-
void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
248-
Token varFinalOrConst) {
249-
super.beginFormalParameter(token, kind, covariantToken, varFinalOrConst);
247+
void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
248+
Token covariantToken, Token varFinalOrConst) {
249+
super.beginFormalParameter(
250+
token, kind, requiredToken, covariantToken, varFinalOrConst);
250251
begin('FormalParameter');
251252
}
252253

pkg/front_end/lib/src/fasta/kernel/body_builder.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2862,8 +2862,10 @@ abstract class BodyBuilder extends ScopeListener<JumpTarget>
28622862
}
28632863

28642864
@override
2865-
void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
2866-
Token varFinalOrConst) {
2865+
void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
2866+
Token covariantToken, Token varFinalOrConst) {
2867+
// TODO(danrubel): handle required token
2868+
reportNonNullableModifierError(requiredToken);
28672869
push((covariantToken != null ? covariantMask : 0) |
28682870
Modifier.validateVarFinalOrConst(varFinalOrConst?.lexeme));
28692871
}

pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,10 +172,10 @@ class ForwardingListener implements Listener {
172172
}
173173

174174
@override
175-
void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
176-
Token varFinalOrConst) {
175+
void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
176+
Token covariantToken, Token varFinalOrConst) {
177177
listener?.beginFormalParameter(
178-
token, kind, covariantToken, varFinalOrConst);
178+
token, kind, requiredToken, covariantToken, varFinalOrConst);
179179
}
180180

181181
@override
@@ -1470,6 +1470,11 @@ class ForwardingListener implements Listener {
14701470
listener?.reportNonNullAssertExpressionNotEnabled(bang);
14711471
}
14721472

1473+
@override
1474+
void reportNonNullableModifierError(Token modifierToken) {
1475+
listener?.reportNonNullableModifierError(modifierToken);
1476+
}
1477+
14731478
@override
14741479
set suppressParseErrors(bool value) {
14751480
listener?.suppressParseErrors = value;

pkg/front_end/lib/src/fasta/parser/listener.dart

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,8 +272,8 @@ class Listener implements UnescapeErrorListener {
272272
logEvent("FactoryMethod");
273273
}
274274

275-
void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
276-
Token varFinalOrConst) {}
275+
void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
276+
Token covariantToken, Token varFinalOrConst) {}
277277

278278
void endFormalParameter(Token thisKeyword, Token periodAfterThis,
279279
Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
@@ -967,6 +967,17 @@ class Listener implements UnescapeErrorListener {
967967
}
968968
}
969969

970+
// TODO(danrubel): Remove this once all listeners have been updated
971+
// to properly handle nullable types
972+
void reportNonNullableModifierError(Token modifierToken) {
973+
if (modifierToken != null) {
974+
handleRecoverableError(
975+
templateExperimentNotEnabled.withArguments('non-nullable'),
976+
modifierToken,
977+
modifierToken);
978+
}
979+
}
980+
970981
// TODO(danrubel): Remove this once all listeners have been updated
971982
// to properly handle non-null assert expressions
972983
void reportNonNullAssertExpressionNotEnabled(Token bang) {

pkg/front_end/lib/src/fasta/parser/modifier_context.dart

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import '../../scanner/token.dart' show Token;
66
import '../messages.dart' as fasta;
7+
import 'formal_parameter_kind.dart';
78
import 'member_kind.dart' show MemberKind;
89
import 'parser.dart' show Parser;
910
import 'util.dart' show optional;
@@ -117,9 +118,13 @@ class ModifierRecoveryContext {
117118
}
118119

119120
/// Parse modifiers for formal parameters.
120-
Token parseFormalParameterModifiers(Token token, MemberKind memberKind) {
121+
Token parseFormalParameterModifiers(
122+
Token token, FormalParameterKind parameterKind, MemberKind memberKind) {
121123
token = parseModifiers(token);
122124

125+
if (parameterKind != FormalParameterKind.optionalNamed) {
126+
reportExtraneousModifier(requiredToken);
127+
}
123128
if (memberKind == MemberKind.StaticMethod ||
124129
memberKind == MemberKind.TopLevelMethod) {
125130
reportExtraneousModifier(this.covariantToken);
@@ -136,7 +141,6 @@ class ModifierRecoveryContext {
136141
reportExtraneousModifier(abstractToken);
137142
reportExtraneousModifier(externalToken);
138143
reportExtraneousModifier(lateToken);
139-
reportExtraneousModifier(requiredToken);
140144
reportExtraneousModifier(staticToken);
141145
return token;
142146
}
@@ -248,8 +252,7 @@ class ModifierRecoveryContext {
248252
constToken = next;
249253

250254
if (afterFactory) {
251-
parser.reportRecoverableError(next,
252-
fasta.templateModifierOutOfOrder.withArguments('const', 'factory'));
255+
reportModifierOutOfOrder(next, 'factory');
253256
}
254257
return next;
255258
}
@@ -368,6 +371,16 @@ class ModifierRecoveryContext {
368371
assert(optional('required', next));
369372
if (requiredToken == null) {
370373
requiredToken = next;
374+
375+
if (constToken != null) {
376+
reportModifierOutOfOrder(requiredToken, constToken.lexeme);
377+
} else if (covariantToken != null) {
378+
reportModifierOutOfOrder(requiredToken, covariantToken.lexeme);
379+
} else if (finalToken != null) {
380+
reportModifierOutOfOrder(requiredToken, finalToken.lexeme);
381+
} else if (varToken != null) {
382+
reportModifierOutOfOrder(requiredToken, varToken.lexeme);
383+
}
371384
return next;
372385
}
373386

@@ -437,4 +450,11 @@ class ModifierRecoveryContext {
437450
token, fasta.templateExtraneousModifier);
438451
}
439452
}
453+
454+
void reportModifierOutOfOrder(Token modifier, String beforeModifier) {
455+
parser.reportRecoverableError(
456+
modifier,
457+
fasta.templateModifierOutOfOrder
458+
.withArguments(modifier.lexeme, beforeModifier));
459+
}
440460
}

pkg/front_end/lib/src/fasta/parser/parser.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1417,7 +1417,8 @@ class Parser {
14171417
..requiredToken = requiredToken
14181418
..varFinalOrConst = varFinalOrConst;
14191419

1420-
token = context.parseFormalParameterModifiers(token, memberKind);
1420+
token = context.parseFormalParameterModifiers(
1421+
token, parameterKind, memberKind);
14211422
next = token.next;
14221423

14231424
covariantToken = context.covariantToken;
@@ -1431,7 +1432,7 @@ class Parser {
14311432
}
14321433

14331434
listener.beginFormalParameter(
1434-
start, memberKind, covariantToken, varFinalOrConst);
1435+
start, memberKind, requiredToken, covariantToken, varFinalOrConst);
14351436

14361437
// Type is required in a generalized function type, but optional otherwise.
14371438
final Token beforeType = token;

pkg/front_end/lib/src/fasta/source/outline_builder.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,8 +1017,10 @@ class OutlineBuilder extends StackListener {
10171017
}
10181018

10191019
@override
1020-
void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
1021-
Token varFinalOrConst) {
1020+
void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
1021+
Token covariantToken, Token varFinalOrConst) {
1022+
// TODO(danrubel): handle required token
1023+
reportNonNullableModifierError(requiredToken);
10221024
push((covariantToken != null ? covariantMask : 0) |
10231025
Modifier.validateVarFinalOrConst(varFinalOrConst?.lexeme));
10241026
}

pkg/front_end/test/fasta/parser/type_info_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2768,8 +2768,9 @@ class TypeInfoListener implements Listener {
27682768
}
27692769

27702770
@override
2771-
void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
2772-
Token varFinalOrConst) {
2771+
void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
2772+
Token covariantToken, Token varFinalOrConst) {
2773+
// TODO(danrubel): Update tests to include required and covariant
27732774
calls.add('beginFormalParameter $token $kind');
27742775
}
27752776

0 commit comments

Comments
 (0)