Skip to content

Commit e6a1e70

Browse files
jensjohacommit-bot@chromium.org
authored andcommitted
[CFE] Error in outline and recover from type parameter in static field in class
Change-Id: I7127a6acd85c3133912d70abb28285989aeeae61 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/138809 Commit-Queue: Jens Johansen <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent 3753014 commit e6a1e70

18 files changed

+103
-18
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
252252

253253
void build(SourceLibraryBuilder libraryBuilder) {
254254
if (type != null) {
255-
fieldType = type.build(libraryBuilder);
255+
fieldType = type.build(libraryBuilder, null, isStatic);
256256
}
257257
_fieldEncoding.build(libraryBuilder, this);
258258
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ class FixedTypeBuilder extends TypeBuilder {
2828
return buffer;
2929
}
3030

31-
DartType build(LibraryBuilder library, [TypedefType origin]) => type;
31+
DartType build(LibraryBuilder library,
32+
[TypedefType origin, bool notInstanceContext]) {
33+
return type;
34+
}
3235

3336
Supertype buildSupertype(
3437
LibraryBuilder library, int charOffset, Uri fileUri) {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ class FunctionTypeBuilder extends TypeBuilder {
7171
return buffer;
7272
}
7373

74-
FunctionType build(LibraryBuilder library, [TypedefType origin]) {
74+
FunctionType build(LibraryBuilder library,
75+
[TypedefType origin, bool notInstanceContext]) {
7576
DartType builtReturnType =
7677
returnType?.build(library) ?? const DynamicType();
7778
List<DartType> positionalParameters = <DartType>[];

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ class MixinApplicationBuilder extends TypeBuilder {
4343
}
4444

4545
@override
46-
InterfaceType build(LibraryBuilder library, [TypedefType origin]) {
46+
InterfaceType build(LibraryBuilder library,
47+
[TypedefType origin, bool notInstanceContext]) {
4748
int charOffset = -1; // TODO(ahe): Provide these.
4849
Uri fileUri = null; // TODO(ahe): Provide these.
4950
return unsupported("build", charOffset, fileUri);

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

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,31 @@ library fasta.named_type_builder;
66

77
import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
88

9-
import 'package:kernel/ast.dart' show DartType, Supertype, TypedefType;
9+
import 'package:kernel/ast.dart'
10+
show
11+
Class,
12+
DartType,
13+
Extension,
14+
InvalidType,
15+
Supertype,
16+
TreeNode,
17+
TypeParameter,
18+
TypedefType;
1019

1120
import '../fasta_codes.dart'
1221
show
22+
LocatedMessage,
1323
Message,
24+
Severity,
1425
Template,
15-
noLength,
16-
templateMissingExplicitTypeArguments,
1726
messageNotATypeContext,
18-
LocatedMessage,
27+
messageTypeVariableInStaticContext,
28+
noLength,
1929
templateExtendingRestricted,
30+
templateMissingExplicitTypeArguments,
2031
templateNotAType,
32+
templateSupertypeIsIllegal,
33+
templateSupertypeIsTypeVariable,
2134
templateTypeArgumentMismatch,
2235
templateTypeArgumentsOnTypeVariable,
2336
templateTypeNotFound;
@@ -50,14 +63,18 @@ class NamedTypeBuilder extends TypeBuilder {
5063

5164
final NullabilityBuilder nullabilityBuilder;
5265

66+
final Uri fileUri;
67+
final int charOffset;
68+
5369
@override
5470
TypeDeclarationBuilder declaration;
5571

56-
NamedTypeBuilder(this.name, this.nullabilityBuilder, this.arguments);
72+
NamedTypeBuilder(this.name, this.nullabilityBuilder, this.arguments,
73+
[this.fileUri, this.charOffset]);
5774

5875
NamedTypeBuilder.fromTypeDeclarationBuilder(
5976
this.declaration, this.nullabilityBuilder,
60-
[this.arguments])
77+
[this.arguments, this.fileUri, this.charOffset])
6178
: this.name = declaration.name;
6279

6380
@override
@@ -218,8 +235,23 @@ class NamedTypeBuilder extends TypeBuilder {
218235
}
219236

220237
// TODO(johnniwinther): Store [origin] on the built type.
221-
DartType build(LibraryBuilder library, [TypedefType origin]) {
238+
DartType build(LibraryBuilder library,
239+
[TypedefType origin, bool notInstanceContext]) {
222240
assert(declaration != null, "Declaration has not been resolved on $this.");
241+
if (notInstanceContext == true && declaration.isTypeVariable) {
242+
TypeVariableBuilder typeParameterBuilder = declaration;
243+
TypeParameter typeParameter = typeParameterBuilder.parameter;
244+
if (typeParameter.parent is Class || typeParameter.parent is Extension) {
245+
messageTypeVariableInStaticContext;
246+
library.addProblem(
247+
messageTypeVariableInStaticContext,
248+
charOffset ?? TreeNode.noOffset,
249+
noLength,
250+
fileUri ?? library.fileUri);
251+
return const InvalidType();
252+
}
253+
}
254+
223255
return declaration.buildType(library, nullabilityBuilder, arguments);
224256
}
225257

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ abstract class TypeBuilder {
5555

5656
String get fullNameForErrors => "${printOn(new StringBuffer())}";
5757

58-
DartType build(LibraryBuilder library, [TypedefType origin]);
58+
DartType build(LibraryBuilder library,
59+
[TypedefType origin, bool notInstanceContext]);
5960

6061
Supertype buildSupertype(LibraryBuilder library, int charOffset, Uri fileUri);
6162

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ class TypeVariableBuilder extends TypeDeclarationBuilderImpl {
127127
}
128128

129129
TypeBuilder asTypeBuilder() {
130-
return new NamedTypeBuilder(name, const NullabilityBuilder.omitted(), null)
130+
return new NamedTypeBuilder(
131+
name, const NullabilityBuilder.omitted(), null, fileUri, charOffset)
131132
..bind(this);
132133
}
133134

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3090,8 +3090,12 @@ class BodyBuilder extends ScopeListener<JumpTarget>
30903090
libraryBuilder.addProblem(
30913091
message, offset, lengthOfSpan(beginToken, suffix), uri);
30923092
push(new UnresolvedType(
3093-
new NamedTypeBuilder(name,
3094-
libraryBuilder.nullableBuilderIfTrue(isMarkedAsNullable), null)
3093+
new NamedTypeBuilder(
3094+
name,
3095+
libraryBuilder.nullableBuilderIfTrue(isMarkedAsNullable),
3096+
null,
3097+
uri,
3098+
offset)
30953099
..bind(new InvalidTypeDeclarationBuilder(
30963100
name,
30973101
message.withLocation(
@@ -3180,7 +3184,8 @@ class BodyBuilder extends ScopeListener<JumpTarget>
31803184
int offset = offsetForToken(token);
31813185
// "void" is always nullable.
31823186
push(new UnresolvedType(
3183-
new NamedTypeBuilder("void", const NullabilityBuilder.nullable(), null)
3187+
new NamedTypeBuilder(
3188+
"void", const NullabilityBuilder.nullable(), null, uri, offset)
31843189
..bind(new VoidTypeBuilder(const VoidType(), libraryBuilder, offset)),
31853190
offset,
31863191
uri));

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1865,7 +1865,11 @@ class OutlineBuilder extends StackListenerImpl {
18651865
builder.name, via.join("', '"));
18661866
addProblem(message, builder.charOffset, builder.name.length);
18671867
builder.bound = new NamedTypeBuilder(
1868-
builder.name, const NullabilityBuilder.omitted(), null)
1868+
builder.name,
1869+
const NullabilityBuilder.omitted(),
1870+
null,
1871+
uri,
1872+
builder.charOffset)
18691873
..bind(new InvalidTypeDeclarationBuilder(
18701874
builder.name,
18711875
message.withLocation(

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1262,7 +1262,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
12621262
TypeBuilder addNamedType(Object name, NullabilityBuilder nullabilityBuilder,
12631263
List<TypeBuilder> arguments, int charOffset) {
12641264
return addType(
1265-
new NamedTypeBuilder(name, nullabilityBuilder, arguments), charOffset);
1265+
new NamedTypeBuilder(
1266+
name, nullabilityBuilder, arguments, fileUri, charOffset),
1267+
charOffset);
12661268
}
12671269

12681270
TypeBuilder addMixinApplication(

0 commit comments

Comments
 (0)