Skip to content

Commit

Permalink
Revert "[cfe] Support external inline class fields"
Browse files Browse the repository at this point in the history
This reverts commit 335d3af.

Reason for revert: Causes NPE in dart2js

Original change's description:
> [cfe] Support external inline class fields
>
> Change-Id: I0c16dc5c32aa8afb285b425c826eee8b8534c734
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/278507
> Commit-Queue: Johnni Winther <johnniwinther@google.com>
> Reviewed-by: Jens Johansen <jensj@google.com>

TBR=jensj@google.com,johnniwinther@google.com,dart-scoped@luci-project-accounts.iam.gserviceaccount.com

Change-Id: I0826daf1ee9f1eb4c1489a239b795b13028e6a11
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/278700
Reviewed-by: Jens Johansen <jensj@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Ivan Inozemtsev <iinozemtsev@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
  • Loading branch information
johnniwinther authored and Commit Queue committed Jan 9, 2023
1 parent 5b234e4 commit 28a3c47
Show file tree
Hide file tree
Showing 9 changed files with 265 additions and 202 deletions.
70 changes: 22 additions & 48 deletions pkg/front_end/lib/src/fasta/source/source_field_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ import '../type_inference/type_inference_engine.dart'
show IncludesTypeParametersNonCovariantly;
import '../util/helpers.dart' show DelayedActionPerformer;
import 'source_class_builder.dart';
import 'source_inline_class_builder.dart';
import 'source_member_builder.dart';

class SourceFieldBuilder extends SourceMemberBuilderImpl
Expand Down Expand Up @@ -1567,7 +1566,6 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
final bool isAbstract;
final bool isExternal;
final bool _isExtensionInstanceMember;
final bool _isInlineClassInstanceMember;

late Procedure _getter;
Procedure? _setter;
Expand Down Expand Up @@ -1599,11 +1597,8 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
assert(isNonNullableByDefault != null),
_isExtensionInstanceMember = isExternal &&
nameScheme.isExtensionMember &&
nameScheme.isInstanceMember,
_isInlineClassInstanceMember = isExternal &&
nameScheme.isInlineClassMember &&
nameScheme.isInstanceMember {
if (_isExtensionInstanceMember || _isInlineClassInstanceMember) {
if (_isExtensionInstanceMember) {
_getter = new Procedure(
dummyName,
ProcedureKind.Method,
Expand Down Expand Up @@ -1695,26 +1690,17 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
"Type has already been computed for field ${_fieldBuilder.name}.");
_type = value;
if (value is! InferredType) {
if (_isExtensionInstanceMember || _isInlineClassInstanceMember) {
DartType thisParameterType;
List<TypeParameter> typeParameters;
if (_isExtensionInstanceMember) {
SourceExtensionBuilder extensionBuilder =
_fieldBuilder.parent as SourceExtensionBuilder;
thisParameterType = extensionBuilder.extension.onType;
typeParameters = extensionBuilder.extension.typeParameters;
} else {
SourceInlineClassBuilder inlineClassBuilder =
_fieldBuilder.parent as SourceInlineClassBuilder;
thisParameterType =
inlineClassBuilder.inlineClass.declaredRepresentationType;
typeParameters = inlineClassBuilder.inlineClass.typeParameters;
}
if (_isExtensionInstanceMember) {
SourceExtensionBuilder extensionBuilder =
_fieldBuilder.parent as SourceExtensionBuilder;
DartType onType = extensionBuilder.extension.onType;
List<TypeParameter> typeParameters =
extensionBuilder.extension.typeParameters;
if (typeParameters.isNotEmpty) {
FreshTypeParameters getterTypeParameters =
getFreshTypeParameters(typeParameters);
_getter.function.positionalParameters.first.type =
getterTypeParameters.substitute(thisParameterType);
getterTypeParameters.substitute(onType);
_getter.function.returnType = getterTypeParameters.substitute(value);
_getter.function.typeParameters =
getterTypeParameters.freshTypeParameters;
Expand All @@ -1726,7 +1712,7 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
FreshTypeParameters setterTypeParameters =
getFreshTypeParameters(typeParameters);
setter.function.positionalParameters.first.type =
setterTypeParameters.substitute(thisParameterType);
setterTypeParameters.substitute(onType);
setter.function.positionalParameters[1].type =
setterTypeParameters.substitute(value);
setter.function.typeParameters =
Expand All @@ -1737,8 +1723,8 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
} else {
_getter.function.returnType = value;
_setter?.function.positionalParameters[1].type = value;
_getter.function.positionalParameters.first.type = thisParameterType;
_setter?.function.positionalParameters.first.type = thisParameterType;
_getter.function.positionalParameters.first.type = onType;
_setter?.function.positionalParameters.first.type = onType;
}
} else {
_getter.function.returnType = value;
Expand Down Expand Up @@ -1769,24 +1755,20 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
void build(
SourceLibraryBuilder libraryBuilder, SourceFieldBuilder fieldBuilder) {
bool isExtensionMember = fieldBuilder.isExtensionMember;
bool isInlineClassMember = fieldBuilder.isInlineClassMember;
bool isInstanceMember = !isExtensionMember &&
!isInlineClassMember &&
bool isInstanceMember = !fieldBuilder.isExtensionMember &&
!fieldBuilder.isStatic &&
!fieldBuilder.isTopLevel;
_getter..isConst = fieldBuilder.isConst;
_getter
..isStatic = !isInstanceMember
..isExtensionMember = isExtensionMember
..isInlineClassMember = isInlineClassMember
..isAbstract = isAbstract && !isExternal
..isExternal = isExternal;

if (_setter != null) {
_setter!
..isStatic = !isInstanceMember
..isExtensionMember = isExtensionMember
..isInlineClassMember = isInlineClassMember
..isAbstract = isAbstract && !isExternal
..isExternal = isExternal;
}
Expand All @@ -1797,25 +1779,17 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
SourceLibraryBuilder library,
SourceFieldBuilder fieldBuilder,
void Function(Member, BuiltMemberKind) f) {
BuiltMemberKind getterMemberKind;
if (fieldBuilder.isExtensionMember) {
getterMemberKind = BuiltMemberKind.ExtensionGetter;
} else if (fieldBuilder.isInlineClassMember) {
getterMemberKind = BuiltMemberKind.InlineClassGetter;
} else {
getterMemberKind = BuiltMemberKind.Method;
}
f(_getter, getterMemberKind);
f(
_getter,
fieldBuilder.isExtensionMember
? BuiltMemberKind.ExtensionGetter
: BuiltMemberKind.Method);
if (_setter != null) {
BuiltMemberKind setterMemberKind;
if (fieldBuilder.isExtensionMember) {
setterMemberKind = BuiltMemberKind.ExtensionSetter;
} else if (fieldBuilder.isInlineClassMember) {
setterMemberKind = BuiltMemberKind.InlineClassSetter;
} else {
setterMemberKind = BuiltMemberKind.Method;
}
f(_setter!, setterMemberKind);
f(
_setter!,
fieldBuilder.isExtensionMember
? BuiltMemberKind.ExtensionSetter
: BuiltMemberKind.Method);
}
}

Expand Down
27 changes: 9 additions & 18 deletions pkg/front_end/testcases/inline_class/external.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ inline class B {

external B.named(int i);

external A field;

external A method();

external T genericMethod<T>(T t);
Expand All @@ -21,36 +19,29 @@ inline class B {

external void set setter(B b);

external static A staticField;
// TODO(johnniwinther): Support static fields.
//static external A staticField;

external static A staticMethod();
static external A staticMethod();

external static T staticGenericMethod<T>(T t);
static external T staticGenericMethod<T>(T t);

external static B get staticGetter;
static external B get staticGetter;

external static void set staticSetter(B b);
static external void set staticGetter(B b);
}

void method(A a) {
B b1 = new B(a);
B b2 = new B.named(0);
a = b1.field;
b1.field = a;
a = b1.method();
var f1 = b1.method;
b2 = b2.genericMethod(b2);
var f2 = b2.genericMethod;
int Function(int) f3 = b2.genericMethod;
b1 = b2.getter;
b1.setter = b2;
a = B.staticField;
B.staticField = a;
a = B.staticMethod();
var f4 = B.staticMethod;
//a = B.staticField;
//B.staticField = a;
a = B.staticMethod;
b2 = B.staticGenericMethod(b2);
var f5 = B.staticGenericMethod;
String Function(String) f6 = B.staticGenericMethod;
b1 = B.staticGetter;
B.staticSetter = b2;
}
65 changes: 41 additions & 24 deletions pkg/front_end/testcases/inline_class/external.dart.strong.expect
Original file line number Diff line number Diff line change
@@ -1,4 +1,36 @@
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/inline_class/external.dart:25:10: Error: The modifier 'external' should be before the modifier 'static'.
// Try re-ordering the modifiers.
// static external A staticMethod();
// ^^^^^^^^
//
// pkg/front_end/testcases/inline_class/external.dart:27:10: Error: The modifier 'external' should be before the modifier 'static'.
// Try re-ordering the modifiers.
// static external T staticGenericMethod<T>(T t);
// ^^^^^^^^
//
// pkg/front_end/testcases/inline_class/external.dart:29:10: Error: The modifier 'external' should be before the modifier 'static'.
// Try re-ordering the modifiers.
// static external B get staticGetter;
// ^^^^^^^^
//
// pkg/front_end/testcases/inline_class/external.dart:31:10: Error: The modifier 'external' should be before the modifier 'static'.
// Try re-ordering the modifiers.
// static external void set staticGetter(B b);
// ^^^^^^^^
//
// pkg/front_end/testcases/inline_class/external.dart:46:5: Error: Setter not found: 'staticSetter'.
// B.staticSetter = b2;
// ^^^^^^^^^^^^
//
// pkg/front_end/testcases/inline_class/external.dart:43:9: Error: A value of type 'A Function()' can't be assigned to a variable of type 'A'.
// - 'A' is from 'pkg/front_end/testcases/inline_class/external.dart'.
// a = B.staticMethod;
// ^
//
import self as self;
import "dart:core" as core;

Expand All @@ -8,27 +40,21 @@ abstract class A extends core::Object {
;
}
inline class B /* declaredRepresentationType = self::A */ {
get field = self::B|get#field;
set field = self::B|set#field;
method method = self::B|method;
tearoff method = self::B|get#method;
method genericMethod = self::B|genericMethod;
tearoff genericMethod = self::B|get#genericMethod;
get getter = self::B|get#getter;
static get staticField = get self::B|staticField;
static set staticField = set self::B|staticField;
static method staticMethod = self::B|staticMethod;
static method staticGenericMethod = self::B|staticGenericMethod;
static get staticGetter = get self::B|staticGetter;
set setter = self::B|set#setter;
static set staticSetter = set self::B|staticSetter;
static set staticGetter = set self::B|staticGetter;
constructor • = self::B|;
constructor named = self::B|named;
}
external static method B|(self::A a) → self::B;
external static method B|named(core::int i) → self::B;
external static method B|get#field(self::A #this) → self::A;
external static method B|set#field(self::A #this, self::A #externalFieldValue) → void;
external static method B|method(lowered final self::B #this) → self::A;
static method B|get#method(lowered final self::B #this) → () → self::A
return () → self::A => self::B|method(#this);
Expand All @@ -37,37 +63,28 @@ static method B|get#genericMethod(lowered final self::B #this) → <T extends co
return <T extends core::Object? = dynamic>(T% t) → T% => self::B|genericMethod<T%>(#this, t);
external static method B|get#getter(lowered final self::B #this) → self::B;
external static method B|set#setter(lowered final self::B #this, self::B b) → void;
external static get B|staticField() → self::A;
external static set B|staticField(self::A #externalFieldValue) → void;
external static method B|staticMethod() → self::A;
external static method B|staticGenericMethod<T extends core::Object? = dynamic>(self::B|staticGenericMethod::T% t) → self::B|staticGenericMethod::T%;
external static get B|staticGetter() → self::B;
external static set B|staticSetter(self::B b) → void;
external static set B|staticGetter(self::B b) → void;
static method method(self::A a) → void {
self::B b1 = self::B|(a);
self::B b2 = self::B|named(0);
a = self::B|get#field(b1);
self::B|set#field(b1, a);
a = self::B|method(b1);
() → self::A f1 = self::B|get#method(b1);
b2 = self::B|genericMethod<self::B>(b2, b2);
<T extends core::Object? = dynamic>(T%) → T% f2 = self::B|get#genericMethod(b2);
(core::int) → core::int f3 = self::B|get#genericMethod(b2)<core::int>;
b1 = self::B|get#getter(b2);
self::B|set#setter(b1, b2);
a = self::B|staticField;
self::B|staticField = a;
a = self::B|staticMethod();
() → self::A f4 = #C1;
a = invalid-expression "pkg/front_end/testcases/inline_class/external.dart:43:9: Error: A value of type 'A Function()' can't be assigned to a variable of type 'A'.
- 'A' is from 'pkg/front_end/testcases/inline_class/external.dart'.
a = B.staticMethod;
^" in #C1 as{TypeError,ForNonNullableByDefault} self::A;
b2 = self::B|staticGenericMethod<self::B>(b2);
<T extends core::Object? = dynamic>(T%) → T% f5 = #C2;
(core::String) → core::String f6 = #C3;
b1 = self::B|staticGetter;
self::B|staticSetter = b2;
invalid-expression "pkg/front_end/testcases/inline_class/external.dart:46:5: Error: Setter not found: 'staticSetter'.
B.staticSetter = b2;
^^^^^^^^^^^^";
}

constants {
#C1 = static-tearoff self::B|staticMethod
#C2 = static-tearoff self::B|staticGenericMethod
#C3 = instantiation #C2 <core::String>
}
Loading

0 comments on commit 28a3c47

Please # to comment.