Skip to content

Commit af8729c

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Support implict this access to external extension fields
Closes #60270 Change-Id: Ic842740c8812a04a95f53556555a4f5c360eab55 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/413783 Reviewed-by: Jens Johansen <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 0309919 commit af8729c

9 files changed

+106
-4
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3333,11 +3333,12 @@ class BodyBuilder extends StackListenerImpl
33333333
declaration.parent as ExtensionBuilder;
33343334
MemberBuilder? setterBuilder =
33353335
_getCorrespondingSetterBuilder(scope, declaration, name, nameOffset);
3336-
if (declaration.isField) {
3336+
if (declaration.isField && !declaration.isExternal) {
33373337
declaration = null;
33383338
}
33393339
if (setterBuilder != null &&
3340-
(setterBuilder.isField || setterBuilder.isStatic)) {
3340+
((setterBuilder.isField && !setterBuilder.isExternal) ||
3341+
setterBuilder.isStatic)) {
33413342
setterBuilder = null;
33423343
}
33433344
if ((declaration == null && setterBuilder == null) ||

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1648,7 +1648,10 @@ class ExtensionInstanceAccessGenerator extends Generator {
16481648
Procedure? readTarget;
16491649
Procedure? invokeTarget;
16501650
if (getterBuilder != null) {
1651-
if (getterBuilder.isGetter) {
1651+
if (getterBuilder.isField) {
1652+
assert(!getterBuilder.isStatic && getterBuilder.isExternal);
1653+
readTarget = getterBuilder.readTarget as Procedure?;
1654+
} else if (getterBuilder.isGetter) {
16521655
assert(!getterBuilder.isStatic);
16531656
readTarget = getterBuilder.readTarget as Procedure?;
16541657
} else if (getterBuilder.isRegularMethod) {
@@ -1670,7 +1673,10 @@ class ExtensionInstanceAccessGenerator extends Generator {
16701673
}
16711674
Procedure? writeTarget;
16721675
if (setterBuilder != null) {
1673-
if (setterBuilder.isSetter) {
1676+
if (setterBuilder.isField) {
1677+
assert(!setterBuilder.isStatic && setterBuilder.isExternal);
1678+
writeTarget = setterBuilder.writeTarget as Procedure?;
1679+
} else if (setterBuilder.isSetter) {
16741680
assert(!setterBuilder.isStatic);
16751681
writeTarget = setterBuilder.writeTarget as Procedure?;
16761682
// Coverage-ignore-block(suite): Not run.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Copyright (c) 2025, 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 on int {
6+
external int field;
7+
8+
bool get getter {
9+
return field.isEven;
10+
}
11+
12+
set setter(bool value) {
13+
field = value ? 0 : 1;
14+
}
15+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
library;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
extension /* unnamed */ _extension#0 on core::int {
6+
get field = self::_extension#0|get#field;
7+
set field = self::_extension#0|set#field;
8+
get getter = self::_extension#0|get#getter;
9+
set setter = self::_extension#0|set#setter;
10+
}
11+
external static extension-member method _extension#0|get#field(lowered core::int #this) → core::int;
12+
external static extension-member method _extension#0|set#field(lowered core::int #this, synthesized core::int #externalFieldValue) → void;
13+
static extension-member method _extension#0|get#getter(lowered final core::int #this) → core::bool {
14+
return self::_extension#0|get#field(#this).{core::int::isEven}{core::bool};
15+
}
16+
static extension-member method _extension#0|set#setter(lowered final core::int #this, core::bool value) → void {
17+
self::_extension#0|set#field(#this, value ?{core::int} 0 : 1);
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
library;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
extension /* unnamed */ _extension#0 on core::int {
6+
get field = self::_extension#0|get#field;
7+
set field = self::_extension#0|set#field;
8+
get getter = self::_extension#0|get#getter;
9+
set setter = self::_extension#0|set#setter;
10+
}
11+
external static extension-member method _extension#0|get#field(lowered core::int #this) → core::int;
12+
external static extension-member method _extension#0|set#field(lowered core::int #this, synthesized core::int #externalFieldValue) → void;
13+
static extension-member method _extension#0|get#getter(lowered final core::int #this) → core::bool {
14+
return self::_extension#0|get#field(#this).{core::int::isEven}{core::bool};
15+
}
16+
static extension-member method _extension#0|set#setter(lowered final core::int #this, core::bool value) → void {
17+
self::_extension#0|set#field(#this, value ?{core::int} 0 : 1);
18+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
library;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
extension /* unnamed */ _extension#0 on core::int {
6+
get field = self::_extension#0|get#field;
7+
set field = self::_extension#0|set#field;
8+
get getter = self::_extension#0|get#getter;
9+
set setter = self::_extension#0|set#setter;
10+
}
11+
external static extension-member method _extension#0|get#field(lowered core::int #this) → core::int;
12+
external static extension-member method _extension#0|set#field(lowered core::int #this, synthesized core::int #externalFieldValue) → void;
13+
static extension-member method _extension#0|get#getter(lowered final core::int #this) → core::bool
14+
;
15+
static extension-member method _extension#0|set#setter(lowered final core::int #this, core::bool value) → void
16+
;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
library;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
extension /* unnamed */ _extension#0 on core::int {
6+
get field = self::_extension#0|get#field;
7+
set field = self::_extension#0|set#field;
8+
get getter = self::_extension#0|get#getter;
9+
set setter = self::_extension#0|set#setter;
10+
}
11+
external static extension-member method _extension#0|get#field(lowered core::int #this) → core::int;
12+
external static extension-member method _extension#0|set#field(lowered core::int #this, synthesized core::int #externalFieldValue) → void;
13+
static extension-member method _extension#0|get#getter(lowered final core::int #this) → core::bool {
14+
return self::_extension#0|get#field(#this).{core::int::isEven}{core::bool};
15+
}
16+
static extension-member method _extension#0|set#setter(lowered final core::int #this, core::bool value) → void {
17+
self::_extension#0|set#field(#this, value ?{core::int} 0 : 1);
18+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
extension on int {
2+
external int field;
3+
bool get getter {}
4+
set setter(bool value) {}
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
extension on int {
2+
bool get getter {}
3+
external int field;
4+
set setter(bool value) {}
5+
}

0 commit comments

Comments
 (0)