Skip to content

Commit a85054d

Browse files
johnniwinthercommit-bot@chromium.org
authored andcommitted
[cfe] Handle parser recovery in extension declarations
Closes #38600 Closes #38712 Change-Id: I875c55c49253066263bfe1c9cbe97debd1e81648 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/120583 Reviewed-by: Aske Simon Christensen <askesc@google.com>
1 parent bb04f14 commit a85054d

25 files changed

+354
-72
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ export 'procedure_builder.dart'
3939

4040
export 'function_type_builder.dart' show FunctionTypeBuilder;
4141

42-
export 'invalid_type_builder.dart' show InvalidTypeBuilder;
42+
export 'invalid_type_declaration_builder.dart'
43+
show InvalidTypeDeclarationBuilder;
4344

4445
export 'library_builder.dart' show LibraryBuilder;
4546

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright (c) 2016, 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:kernel/ast.dart' hide MapEntry;
6+
7+
import '../problems.dart';
8+
import 'library_builder.dart';
9+
import 'nullability_builder.dart';
10+
import 'type_builder.dart';
11+
12+
class FixedTypeBuilder extends TypeBuilder {
13+
final DartType type;
14+
15+
const FixedTypeBuilder(this.type);
16+
17+
TypeBuilder clone(List<TypeBuilder> newTypes) => this;
18+
19+
Object get name => null;
20+
21+
NullabilityBuilder get nullabilityBuilder =>
22+
new NullabilityBuilder.fromNullability(type.nullability);
23+
24+
String get debugName => 'FixedTypeBuilder';
25+
26+
StringBuffer printOn(StringBuffer buffer) {
27+
buffer.write('type=${type}');
28+
return buffer;
29+
}
30+
31+
DartType build(LibraryBuilder library) => type;
32+
33+
Supertype buildSupertype(
34+
LibraryBuilder library, int charOffset, Uri fileUri) {
35+
return unhandled('buildSupertype', 'FixedTypeBuilder', charOffset, fileUri);
36+
}
37+
38+
Supertype buildMixedInType(
39+
LibraryBuilder library, int charOffset, Uri fileUri) {
40+
return unhandled(
41+
'buildMixedInType', 'FixedTypeBuilder', charOffset, fileUri);
42+
}
43+
44+
TypeBuilder withNullabilityBuilder(NullabilityBuilder nullabilityBuilder) =>
45+
this;
46+
}

pkg/front_end/lib/src/fasta/builder/function_type_builder.dart

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@ import 'package:kernel/ast.dart'
1717
TypeParameter,
1818
TypedefType;
1919

20-
import '../fasta_codes.dart'
21-
show LocatedMessage, messageSupertypeIsFunction, noLength;
22-
23-
import '../problems.dart' show unsupported;
20+
import '../fasta_codes.dart' show messageSupertypeIsFunction, noLength;
2421

2522
import '../kernel/kernel_builder.dart'
2623
show
@@ -127,11 +124,6 @@ class FunctionTypeBuilder extends TypeBuilder {
127124
return buildSupertype(library, charOffset, fileUri);
128125
}
129126

130-
@override
131-
buildInvalidType(LocatedMessage message, {List<LocatedMessage> context}) {
132-
return unsupported("buildInvalidType", message.charOffset, message.uri);
133-
}
134-
135127
FunctionTypeBuilder clone(List<TypeBuilder> newTypes) {
136128
List<TypeVariableBuilder> clonedTypeVariables;
137129
if (typeVariables != null) {

pkg/front_end/lib/src/fasta/builder/invalid_type_builder.dart renamed to pkg/front_end/lib/src/fasta/builder/invalid_type_declaration_builder.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import '../kernel/kernel_builder.dart' show TypeBuilder, LibraryBuilder;
1414

1515
import 'type_declaration_builder.dart';
1616

17-
class InvalidTypeBuilder extends TypeDeclarationBuilderImpl {
17+
class InvalidTypeDeclarationBuilder extends TypeDeclarationBuilderImpl {
1818
String get debugName => "InvalidTypeBuilder";
1919

2020
final LocatedMessage message;
@@ -23,7 +23,7 @@ class InvalidTypeBuilder extends TypeDeclarationBuilderImpl {
2323

2424
final bool suppressMessage;
2525

26-
InvalidTypeBuilder(String name, this.message,
26+
InvalidTypeDeclarationBuilder(String name, this.message,
2727
{this.context, this.suppressMessage: true})
2828
: super(null, 0, name, null, message.charOffset, message.uri);
2929

pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import 'builder.dart'
99

1010
import 'package:kernel/ast.dart' show InterfaceType, Supertype;
1111

12-
import '../fasta_codes.dart' show LocatedMessage;
13-
1412
import '../problems.dart' show unsupported;
1513

1614
class MixinApplicationBuilder extends TypeBuilder {
@@ -61,11 +59,6 @@ class MixinApplicationBuilder extends TypeBuilder {
6159
return unsupported("buildMixedInType", charOffset, fileUri);
6260
}
6361

64-
@override
65-
buildInvalidType(LocatedMessage message, {List<LocatedMessage> context}) {
66-
return unsupported("buildInvalidType", message.charOffset, message.uri);
67-
}
68-
6962
@override
7063
MixinApplicationBuilder withNullabilityBuilder(
7164
NullabilityBuilder nullabilityBuilder) {

pkg/front_end/lib/src/fasta/builder/named_type_builder.dart

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import 'builder.dart'
4343
import '../kernel/kernel_builder.dart'
4444
show
4545
ClassBuilder,
46-
InvalidTypeBuilder,
46+
InvalidTypeDeclarationBuilder,
4747
LibraryBuilder,
4848
TypeBuilder,
4949
TypeDeclarationBuilder,
@@ -105,7 +105,7 @@ class NamedTypeBuilder extends TypeBuilder {
105105
Message message =
106106
templateTypeArgumentsOnTypeVariable.withArguments(typeName);
107107
library.addProblem(message, typeNameOffset, typeName.length, fileUri);
108-
declaration = buildInvalidType(
108+
declaration = buildInvalidTypeDeclarationBuilder(
109109
message.withLocation(fileUri, typeNameOffset, typeName.length));
110110
}
111111
return;
@@ -146,7 +146,7 @@ class NamedTypeBuilder extends TypeBuilder {
146146
name is Identifier ? name.endCharOffset - charOffset : flatName.length;
147147
Message message = template.withArguments(flatName);
148148
library.addProblem(message, charOffset, length, fileUri, context: context);
149-
declaration = buildInvalidType(
149+
declaration = buildInvalidTypeDeclarationBuilder(
150150
message.withLocation(fileUri, charOffset, length),
151151
context: context);
152152
}
@@ -158,8 +158,8 @@ class NamedTypeBuilder extends TypeBuilder {
158158
Message message = templateTypeArgumentMismatch
159159
.withArguments(declaration.typeVariablesCount);
160160
library.addProblem(message, charOffset, noLength, fileUri);
161-
declaration =
162-
buildInvalidType(message.withLocation(fileUri, charOffset, noLength));
161+
declaration = buildInvalidTypeDeclarationBuilder(
162+
message.withLocation(fileUri, charOffset, noLength));
163163
}
164164
}
165165

@@ -189,11 +189,12 @@ class NamedTypeBuilder extends TypeBuilder {
189189
return buffer;
190190
}
191191

192-
InvalidTypeBuilder buildInvalidType(LocatedMessage message,
192+
InvalidTypeDeclarationBuilder buildInvalidTypeDeclarationBuilder(
193+
LocatedMessage message,
193194
{List<LocatedMessage> context}) {
194195
// TODO(ahe): Consider if it makes sense to pass a QualifiedName to
195196
// InvalidTypeBuilder?
196-
return new InvalidTypeBuilder(
197+
return new InvalidTypeDeclarationBuilder(
197198
flattenName(name, message.charOffset, message.uri), message,
198199
context: context);
199200
}
@@ -222,7 +223,7 @@ class NamedTypeBuilder extends TypeBuilder {
222223
TypeDeclarationBuilder declaration = this.declaration;
223224
if (declaration is ClassBuilder) {
224225
return declaration.buildSupertype(library, arguments);
225-
} else if (declaration is InvalidTypeBuilder) {
226+
} else if (declaration is InvalidTypeDeclarationBuilder) {
226227
library.addProblem(
227228
declaration.message.messageObject,
228229
declaration.message.charOffset,
@@ -240,7 +241,7 @@ class NamedTypeBuilder extends TypeBuilder {
240241
TypeDeclarationBuilder declaration = this.declaration;
241242
if (declaration is ClassBuilder) {
242243
return declaration.buildMixedInType(library, arguments);
243-
} else if (declaration is InvalidTypeBuilder) {
244+
} else if (declaration is InvalidTypeDeclarationBuilder) {
244245
library.addProblem(
245246
declaration.message.messageObject,
246247
declaration.message.charOffset,

pkg/front_end/lib/src/fasta/builder/type_builder.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ library fasta.type_builder;
66

77
import 'package:kernel/ast.dart' show DartType, Supertype;
88

9-
import '../fasta_codes.dart' show LocatedMessage;
10-
119
import '../scope.dart';
1210
import 'library_builder.dart';
1311
import 'nullability_builder.dart';
@@ -58,8 +56,6 @@ abstract class TypeBuilder {
5856
/// resolved later.
5957
TypeBuilder clone(List<TypeBuilder> newTypes);
6058

61-
buildInvalidType(LocatedMessage message, {List<LocatedMessage> context});
62-
6359
String get fullNameForErrors => "${printOn(new StringBuffer())}";
6460

6561
DartType build(LibraryBuilder library);

pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import '../builder/member_builder.dart';
4343
import '../builder/type_alias_builder.dart';
4444

4545
import '../kernel/kernel_builder.dart'
46-
show Builder, DynamicTypeBuilder, InvalidTypeBuilder, Scope;
46+
show Builder, DynamicTypeBuilder, InvalidTypeDeclarationBuilder, Scope;
4747

4848
import '../kernel/redirecting_factory_body.dart' show RedirectingFactoryBody;
4949

@@ -230,15 +230,15 @@ class DillLibraryBuilder extends LibraryBuilderImpl {
230230
String name, Builder builder, Builder other, int charOffset,
231231
{bool isExport: false, bool isImport: false}) {
232232
if (builder == other) return builder;
233-
if (builder is InvalidTypeBuilder) return builder;
234-
if (other is InvalidTypeBuilder) return other;
233+
if (builder is InvalidTypeDeclarationBuilder) return builder;
234+
if (other is InvalidTypeDeclarationBuilder) return other;
235235
// For each entry mapping key `k` to declaration `d` in `NS` an entry
236236
// mapping `k` to `d` is added to the exported namespace of `L` unless a
237237
// top-level declaration with the name `k` exists in `L`.
238238
if (builder.parent == this) return builder;
239239
Message message = templateDuplicatedDeclaration.withArguments(name);
240240
addProblem(message, charOffset, name.length, fileUri);
241-
return new InvalidTypeBuilder(
241+
return new InvalidTypeDeclarationBuilder(
242242
name, message.withLocation(fileUri, charOffset, name.length));
243243
}
244244

@@ -271,7 +271,8 @@ class DillLibraryBuilder extends LibraryBuilderImpl {
271271
? templateTypeNotFound.withArguments(name)
272272
: templateUnspecified.withArguments(messageText);
273273
addProblem(message, -1, noLength, null);
274-
declaration = new InvalidTypeBuilder(name, message.withoutLocation());
274+
declaration = new InvalidTypeDeclarationBuilder(
275+
name, message.withoutLocation());
275276
}
276277
exportScopeBuilder.addMember(name, declaration);
277278
});

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2816,7 +2816,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
28162816
push(new UnresolvedType(
28172817
new NamedTypeBuilder(name,
28182818
libraryBuilder.nullableBuilderIfTrue(isMarkedAsNullable), null)
2819-
..bind(new InvalidTypeBuilder(
2819+
..bind(new InvalidTypeDeclarationBuilder(
28202820
name,
28212821
message.withLocation(
28222822
uri, offset, lengthOfSpan(beginToken, suffix)))),
@@ -2838,7 +2838,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
28382838
name.message, name.charOffset, name.name.length, name.fileUri);
28392839
result = new NamedTypeBuilder(name.name,
28402840
libraryBuilder.nullableBuilderIfTrue(isMarkedAsNullable), null)
2841-
..bind(new InvalidTypeBuilder(
2841+
..bind(new InvalidTypeDeclarationBuilder(
28422842
name.name,
28432843
name.message.withLocation(
28442844
name.fileUri, name.charOffset, name.name.length)));
@@ -3809,7 +3809,7 @@ class BodyBuilder extends ScopeListener<JumpTarget>
38093809
} else {
38103810
errorName ??= debugName(type.name, name);
38113811
}
3812-
} else if (type is InvalidTypeBuilder) {
3812+
} else if (type is InvalidTypeDeclarationBuilder) {
38133813
LocatedMessage message = type.message;
38143814
return evaluateArgumentsBefore(
38153815
arguments,
@@ -5195,7 +5195,8 @@ class BodyBuilder extends ScopeListener<JumpTarget>
51955195
return new UnresolvedType(
51965196
new NamedTypeBuilder(
51975197
typeParameter.name, builder.nullabilityBuilder, null)
5198-
..bind(new InvalidTypeBuilder(typeParameter.name, message)),
5198+
..bind(
5199+
new InvalidTypeDeclarationBuilder(typeParameter.name, message)),
51995200
unresolved.charOffset,
52005201
unresolved.fileUri);
52015202
}

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

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ import 'kernel_builder.dart'
7373
show
7474
AccessErrorBuilder,
7575
Builder,
76-
InvalidTypeBuilder,
76+
InvalidTypeDeclarationBuilder,
7777
LoadLibraryBuilder,
7878
NamedTypeBuilder,
7979
TypeBuilder,
@@ -257,7 +257,7 @@ abstract class Generator {
257257
Message message = templateNotAType.withArguments(token.lexeme);
258258
_helper.libraryBuilder
259259
.addProblem(message, fileOffset, lengthForToken(token), _uri);
260-
result.bind(result.buildInvalidType(
260+
result.bind(result.buildInvalidTypeDeclarationBuilder(
261261
message.withLocation(_uri, fileOffset, lengthForToken(token))));
262262
return result;
263263
}
@@ -2834,8 +2834,9 @@ class DeferredAccessGenerator extends Generator {
28342834
TypeBuilder type = suffixGenerator.buildTypeWithResolvedArguments(
28352835
nullabilityBuilder, arguments);
28362836
LocatedMessage message;
2837-
if (type is NamedTypeBuilder && type.declaration is InvalidTypeBuilder) {
2838-
InvalidTypeBuilder declaration = type.declaration;
2837+
if (type is NamedTypeBuilder &&
2838+
type.declaration is InvalidTypeDeclarationBuilder) {
2839+
InvalidTypeDeclarationBuilder declaration = type.declaration;
28392840
message = declaration.message;
28402841
} else {
28412842
int charOffset = offsetForToken(prefixGenerator.token);
@@ -2850,7 +2851,7 @@ class DeferredAccessGenerator extends Generator {
28502851
new NamedTypeBuilder(name, nullabilityBuilder, null);
28512852
_helper.libraryBuilder.addProblem(
28522853
message.messageObject, message.charOffset, message.length, message.uri);
2853-
result.bind(result.buildInvalidType(message));
2854+
result.bind(result.buildInvalidTypeDeclarationBuilder(message));
28542855
return result;
28552856
}
28562857

@@ -2993,8 +2994,8 @@ class TypeUseGenerator extends ReadOnlyAccessGenerator {
29932994
@override
29942995
Expression get expression {
29952996
if (super.expression == null) {
2996-
if (declaration is InvalidTypeBuilder) {
2997-
InvalidTypeBuilder declaration = this.declaration;
2997+
if (declaration is InvalidTypeDeclarationBuilder) {
2998+
InvalidTypeDeclarationBuilder declaration = this.declaration;
29982999
super.expression = _helper.buildProblemErrorIfConst(
29993000
declaration.message.messageObject, fileOffset, token.length);
30003001
} else {
@@ -3930,7 +3931,7 @@ class UnexpectedQualifiedUseGenerator extends Generator {
39303931
offsetForToken(prefixGenerator.token),
39313932
lengthOfSpan(prefixGenerator.token, token),
39323933
_uri);
3933-
result.bind(result.buildInvalidType(message.withLocation(
3934+
result.bind(result.buildInvalidTypeDeclarationBuilder(message.withLocation(
39343935
_uri,
39353936
offsetForToken(prefixGenerator.token),
39363937
lengthOfSpan(prefixGenerator.token, token))));
@@ -4027,8 +4028,8 @@ class ParserErrorGenerator extends Generator {
40274028
NamedTypeBuilder result =
40284029
new NamedTypeBuilder(token.lexeme, nullabilityBuilder, null);
40294030
_helper.libraryBuilder.addProblem(message, fileOffset, noLength, _uri);
4030-
result.bind(result
4031-
.buildInvalidType(message.withLocation(_uri, fileOffset, noLength)));
4031+
result.bind(result.buildInvalidTypeDeclarationBuilder(
4032+
message.withLocation(_uri, fileOffset, noLength)));
40324033
return result;
40334034
}
40344035

0 commit comments

Comments
 (0)