Skip to content

Commit e2db967

Browse files
Dan Rubelcommit-bot@chromium.org
Dan Rubel
authored andcommitted
add asNonNullable() to existing type infos
This adds code to ignore trailing `?` in `as` and `is` expressions because the trailing `?` may be part of the larger expression. At the moment, this change is a no-op, but will become active when a subsequent CL lands support for nullable types as part of dart-lang/language#110 Change-Id: I829d6aee0f11957ca9b5e143000005031649449f Reviewed-on: https://dart-review.googlesource.com/c/86960 Reviewed-by: Brian Wilkerson <[email protected]>
1 parent ca70671 commit e2db967

File tree

3 files changed

+30
-2
lines changed

3 files changed

+30
-2
lines changed

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -4875,7 +4875,9 @@ class Parser {
48754875
if (optional('!', token.next)) {
48764876
not = token = token.next;
48774877
}
4878-
token = computeType(token, true).ensureTypeNotVoid(token, this);
4878+
// Ignore trailing `?` if there is one as it may be part of an expression
4879+
TypeInfo typeInfo = computeType(token, true).asNonNullableType();
4880+
token = typeInfo.ensureTypeNotVoid(token, this);
48794881
listener.handleIsOperator(operator, not);
48804882
return skipChainedAsIsOperators(token);
48814883
}
@@ -4888,7 +4890,9 @@ class Parser {
48884890
Token parseAsOperatorRest(Token token) {
48894891
Token operator = token = token.next;
48904892
assert(optional('as', operator));
4891-
token = computeType(token, true).ensureTypeNotVoid(token, this);
4893+
// Ignore trailing `?` if there is one as it may be part of an expression
4894+
TypeInfo typeInfo = computeType(token, true).asNonNullableType();
4895+
token = typeInfo.ensureTypeNotVoid(token, this);
48924896
listener.handleAsOperator(operator);
48934897
return skipChainedAsIsOperators(token);
48944898
}

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

+4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ import 'util.dart' show isOneOf, optional;
1717
/// [TypeInfo] provides information collected by [computeType]
1818
/// about a particular type reference.
1919
abstract class TypeInfo {
20+
/// Return type info representing the receiver without the trailing `?`
21+
/// or the receiver if the receiver does not represent a nullable type.
22+
TypeInfo asNonNullableType();
23+
2024
/// Return `true` if the tokens comprising the type represented by the
2125
/// receiver could be interpreted as a valid standalone expression.
2226
/// For example, `A` or `A.b` could be interpreted as a type references

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

+20
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ class NoType implements TypeInfo {
8484
@override
8585
bool get couldBeExpression => false;
8686

87+
@override
88+
TypeInfo asNonNullableType() => this;
89+
8790
@override
8891
Token ensureTypeNotVoid(Token token, Parser parser) {
8992
parser.reportRecoverableErrorWithToken(
@@ -119,6 +122,9 @@ class PrefixedType implements TypeInfo {
119122
@override
120123
bool get couldBeExpression => true;
121124

125+
@override
126+
TypeInfo asNonNullableType() => this;
127+
122128
@override
123129
Token ensureTypeNotVoid(Token token, Parser parser) =>
124130
parseType(token, parser);
@@ -167,6 +173,9 @@ class SimpleTypeWith1Argument implements TypeInfo {
167173
@override
168174
bool get couldBeExpression => false;
169175

176+
@override
177+
TypeInfo asNonNullableType() => this;
178+
170179
@override
171180
Token ensureTypeNotVoid(Token token, Parser parser) =>
172181
parseType(token, parser);
@@ -208,6 +217,9 @@ class SimpleType implements TypeInfo {
208217
@override
209218
bool get couldBeExpression => true;
210219

220+
@override
221+
TypeInfo asNonNullableType() => this;
222+
211223
@override
212224
Token ensureTypeNotVoid(Token token, Parser parser) =>
213225
parseType(token, parser);
@@ -247,6 +259,9 @@ class VoidType implements TypeInfo {
247259
@override
248260
bool get couldBeExpression => false;
249261

262+
@override
263+
TypeInfo asNonNullableType() => this;
264+
250265
@override
251266
Token ensureTypeNotVoid(Token token, Parser parser) {
252267
// Report an error, then parse `void` as if it were a type name.
@@ -324,6 +339,11 @@ class ComplexTypeInfo implements TypeInfo {
324339
@override
325340
bool get couldBeExpression => false;
326341

342+
@override
343+
TypeInfo asNonNullableType() {
344+
return this;
345+
}
346+
327347
@override
328348
Token ensureTypeNotVoid(Token token, Parser parser) =>
329349
parseType(token, parser);

0 commit comments

Comments
 (0)