Skip to content

Commit 254e33e

Browse files
jensjohaCommit Queue
authored andcommitted
[CFE] Fix crash if trying to compile extension with missing on
Change-Id: I2c0dd97faba95d97d88452ae29421c7f85a7714f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/394481 Commit-Queue: Jens Johansen <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent 8e0198f commit 254e33e

9 files changed

+94
-5
lines changed

pkg/front_end/lib/src/source/builder_factory.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ abstract class BuilderFactory {
123123
void beginExtensionDeclaration(String? name, int charOffset,
124124
List<NominalParameterBuilder>? typeParameters);
125125

126-
void beginExtensionBody(TypeBuilder? extensionThisType);
126+
void beginExtensionBody(TypeBuilder extensionThisType);
127127

128128
void endExtensionDeclaration(String? name);
129129

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1110,11 +1110,14 @@ class OutlineBuilder extends StackListenerImpl {
11101110
assert(checkState(token, [
11111111
unionOfKinds([ValueKinds.ParserRecovery, ValueKinds.TypeBuilder])
11121112
]));
1113-
11141113
Object? extensionThisType = peek();
1115-
// TODO(johnniwinther): Supply an invalid type as the extension on type.
1116-
_builderFactory.beginExtensionBody(
1117-
extensionThisType is TypeBuilder ? extensionThisType : null);
1114+
_builderFactory.beginExtensionBody(extensionThisType is TypeBuilder
1115+
? extensionThisType
1116+
: new InvalidTypeBuilderImpl(
1117+
uri,
1118+
extensionThisType is ParserRecovery
1119+
? extensionThisType.charOffset
1120+
: TreeNode.noOffset));
11181121
break;
11191122
case DeclarationKind.ExtensionType:
11201123
declarationContext = DeclarationContext.ExtensionTypeBody;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// Copyright (c) 2024, 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+
extension bar {
6+
get foo { }
7+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
library;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/regress/extension_on_missing.dart:5:11: Error: Expected 'on' after this.
6+
// extension bar {
7+
// ^^^
8+
//
9+
// pkg/front_end/testcases/regress/extension_on_missing.dart:5:15: Error: Expected a type, but got '{'.
10+
// extension bar {
11+
// ^
12+
//
13+
import self as self;
14+
15+
extension bar on invalid-type {
16+
get foo = self::bar|get#foo;
17+
}
18+
static extension-member method bar|get#foo(lowered final invalid-type #this) → dynamic {}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
library;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/regress/extension_on_missing.dart:5:11: Error: Expected 'on' after this.
6+
// extension bar {
7+
// ^^^
8+
//
9+
// pkg/front_end/testcases/regress/extension_on_missing.dart:5:15: Error: Expected a type, but got '{'.
10+
// extension bar {
11+
// ^
12+
//
13+
import self as self;
14+
15+
extension bar on invalid-type {
16+
get foo = self::bar|get#foo;
17+
}
18+
static extension-member method bar|get#foo(lowered final invalid-type #this) → dynamic {}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
library;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/regress/extension_on_missing.dart:5:11: Error: Expected 'on' after this.
6+
// extension bar {
7+
// ^^^
8+
//
9+
// pkg/front_end/testcases/regress/extension_on_missing.dart:5:15: Error: Expected a type, but got '{'.
10+
// extension bar {
11+
// ^
12+
//
13+
import self as self;
14+
15+
extension bar on invalid-type {
16+
get foo = self::bar|get#foo;
17+
}
18+
static extension-member method bar|get#foo(lowered final invalid-type #this) → dynamic
19+
;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
library;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/regress/extension_on_missing.dart:5:11: Error: Expected 'on' after this.
6+
// extension bar {
7+
// ^^^
8+
//
9+
// pkg/front_end/testcases/regress/extension_on_missing.dart:5:15: Error: Expected a type, but got '{'.
10+
// extension bar {
11+
// ^
12+
//
13+
import self as self;
14+
15+
extension bar on invalid-type {
16+
get foo = self::bar|get#foo;
17+
}
18+
static extension-member method bar|get#foo(lowered final invalid-type #this) → dynamic {}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
extension bar on{
2+
get foo {}
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
extension bar on{
2+
get foo {}
3+
}

0 commit comments

Comments
 (0)