mirror of
https://github.com/dart-lang/sdk
synced 2024-10-03 00:09:20 +00:00
[cfe] Don't lower instance fields
Closes #42956 Change-Id: I3d27c8601d835ecafa50dadcebca1493f64588ad Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/161700 Reviewed-by: Jens Johansen <jensj@google.com> Commit-Queue: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
parent
bd2746189b
commit
9d6ee9ec5a
|
@ -191,6 +191,7 @@ class EnumBuilder extends SourceClassBuilder {
|
|||
intType,
|
||||
"index",
|
||||
finalMask | hasInitializerMask,
|
||||
/* isTopLevel = */ false,
|
||||
parent,
|
||||
charOffset,
|
||||
charOffset,
|
||||
|
@ -203,6 +204,7 @@ class EnumBuilder extends SourceClassBuilder {
|
|||
stringType,
|
||||
"_name",
|
||||
finalMask | hasInitializerMask,
|
||||
/* isTopLevel = */ false,
|
||||
parent,
|
||||
charOffset,
|
||||
charOffset,
|
||||
|
@ -234,6 +236,7 @@ class EnumBuilder extends SourceClassBuilder {
|
|||
listType,
|
||||
"values",
|
||||
constMask | staticMask | hasInitializerMask,
|
||||
/* isTopLevel = */ false,
|
||||
parent,
|
||||
charOffset,
|
||||
charOffset,
|
||||
|
@ -308,6 +311,7 @@ class EnumBuilder extends SourceClassBuilder {
|
|||
selfType,
|
||||
name,
|
||||
constMask | staticMask | hasInitializerMask,
|
||||
/* isTopLevel = */ false,
|
||||
parent,
|
||||
enumConstantInfo.charOffset,
|
||||
enumConstantInfo.charOffset,
|
||||
|
|
|
@ -101,11 +101,18 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
|
|||
|
||||
bool hasBodyBeenBuilt = false;
|
||||
|
||||
// TODO(johnniwinther): [parent] is not trust-worthy for determining
|
||||
// properties since it is changed after the creation of the builder. For now
|
||||
// we require it has an argument here. A follow-up should clean up the
|
||||
// misuse of parent.
|
||||
final bool isTopLevel;
|
||||
|
||||
SourceFieldBuilder(
|
||||
this.metadata,
|
||||
this.type,
|
||||
this.name,
|
||||
this.modifiers,
|
||||
this.isTopLevel,
|
||||
SourceLibraryBuilder libraryBuilder,
|
||||
int charOffset,
|
||||
int charEndOffset,
|
||||
|
|
|
@ -1742,7 +1742,12 @@ class OutlineBuilder extends StackListenerImpl {
|
|||
if (fieldInfos == null) return;
|
||||
String documentationComment = getDocumentationComment(beginToken);
|
||||
libraryBuilder.addFields(
|
||||
documentationComment, metadata, modifiers, type, fieldInfos);
|
||||
documentationComment,
|
||||
metadata,
|
||||
modifiers,
|
||||
/* isTopLevel = */ true,
|
||||
type,
|
||||
fieldInfos);
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -1804,7 +1809,12 @@ class OutlineBuilder extends StackListenerImpl {
|
|||
if (fieldInfos == null) return;
|
||||
String documentationComment = getDocumentationComment(beginToken);
|
||||
libraryBuilder.addFields(
|
||||
documentationComment, metadata, modifiers, type, fieldInfos);
|
||||
documentationComment,
|
||||
metadata,
|
||||
modifiers,
|
||||
/* isTopLevel = */ false,
|
||||
type,
|
||||
fieldInfos);
|
||||
}
|
||||
|
||||
List<FieldInfo> popFieldInfos(int count) {
|
||||
|
|
|
@ -747,8 +747,13 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
}
|
||||
}
|
||||
|
||||
void addFields(String documentationComment, List<MetadataBuilder> metadata,
|
||||
int modifiers, TypeBuilder type, List<FieldInfo> fieldInfos) {
|
||||
void addFields(
|
||||
String documentationComment,
|
||||
List<MetadataBuilder> metadata,
|
||||
int modifiers,
|
||||
bool isTopLevel,
|
||||
TypeBuilder type,
|
||||
List<FieldInfo> fieldInfos) {
|
||||
for (FieldInfo info in fieldInfos) {
|
||||
bool isConst = modifiers & constMask != 0;
|
||||
bool isFinal = modifiers & finalMask != 0;
|
||||
|
@ -765,8 +770,17 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
new Token.eof(startToken.previous.offset).setNext(startToken);
|
||||
}
|
||||
bool hasInitializer = info.initializerToken != null;
|
||||
addField(documentationComment, metadata, modifiers, type, info.name,
|
||||
info.charOffset, info.charEndOffset, startToken, hasInitializer,
|
||||
addField(
|
||||
documentationComment,
|
||||
metadata,
|
||||
modifiers,
|
||||
isTopLevel,
|
||||
type,
|
||||
info.name,
|
||||
info.charOffset,
|
||||
info.charEndOffset,
|
||||
startToken,
|
||||
hasInitializer,
|
||||
constInitializerToken:
|
||||
potentiallyNeedInitializerInOutline ? startToken : null);
|
||||
}
|
||||
|
@ -1955,6 +1969,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
String documentationComment,
|
||||
List<MetadataBuilder> metadata,
|
||||
int modifiers,
|
||||
bool isTopLevel,
|
||||
TypeBuilder type,
|
||||
String name,
|
||||
int charOffset,
|
||||
|
@ -2054,6 +2069,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
|||
type,
|
||||
name,
|
||||
modifiers,
|
||||
isTopLevel,
|
||||
this,
|
||||
charOffset,
|
||||
charEndOffset,
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
library fasta.function_type_alias_builder;
|
||||
library fasta.source_type_alias_builder;
|
||||
|
||||
import 'package:kernel/ast.dart'
|
||||
show
|
||||
|
|
|
@ -663,6 +663,7 @@ mi
|
|||
migration
|
||||
mime
|
||||
min
|
||||
misuse
|
||||
mixers
|
||||
mk
|
||||
mm
|
||||
|
@ -1250,6 +1251,7 @@ wind
|
|||
with1
|
||||
wn
|
||||
worthwhile
|
||||
worthy
|
||||
writeln
|
||||
wrt
|
||||
wtf
|
||||
|
|
10
pkg/front_end/testcases/static_field_lowering/enum.dart
Normal file
10
pkg/front_end/testcases/static_field_lowering/enum.dart
Normal file
|
@ -0,0 +1,10 @@
|
|||
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
|
||||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
enum A {
|
||||
a,
|
||||
b,
|
||||
}
|
||||
|
||||
main() {}
|
|
@ -0,0 +1,5 @@
|
|||
enum A {
|
||||
a,
|
||||
b,
|
||||
}
|
||||
main() {}
|
|
@ -0,0 +1,5 @@
|
|||
enum A {
|
||||
a,
|
||||
b,
|
||||
}
|
||||
main() {}
|
|
@ -0,0 +1,27 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class A extends core::Object /*isEnum*/ {
|
||||
final field core::int index;
|
||||
final field core::String _name;
|
||||
static const field core::List<self::A> values = #C7;
|
||||
static const field self::A a = #C3;
|
||||
static const field self::A b = #C6;
|
||||
const constructor •(core::int index, core::String _name) → self::A
|
||||
: self::A::index = index, self::A::_name = _name, super core::Object::•()
|
||||
;
|
||||
method toString() → core::String
|
||||
return this.{=self::A::_name};
|
||||
}
|
||||
static method main() → dynamic {}
|
||||
|
||||
constants {
|
||||
#C1 = 0
|
||||
#C2 = "A.a"
|
||||
#C3 = self::A {index:#C1, _name:#C2}
|
||||
#C4 = 1
|
||||
#C5 = "A.b"
|
||||
#C6 = self::A {index:#C4, _name:#C5}
|
||||
#C7 = <self::A*>[#C3, #C6]
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class A extends core::Object /*isEnum*/ {
|
||||
final field core::int index;
|
||||
final field core::String _name;
|
||||
static const field core::List<self::A> values = #C7;
|
||||
static const field self::A a = #C3;
|
||||
static const field self::A b = #C6;
|
||||
const constructor •(core::int index, core::String _name) → self::A
|
||||
: self::A::index = index, self::A::_name = _name, super core::Object::•()
|
||||
;
|
||||
method toString() → core::String
|
||||
return this.{=self::A::_name};
|
||||
}
|
||||
static method main() → dynamic {}
|
||||
|
||||
constants {
|
||||
#C1 = 0
|
||||
#C2 = "A.a"
|
||||
#C3 = self::A {index:#C1, _name:#C2}
|
||||
#C4 = 1
|
||||
#C5 = "A.b"
|
||||
#C6 = self::A {index:#C4, _name:#C5}
|
||||
#C7 = <self::A*>[#C3, #C6]
|
||||
}
|
|
@ -38,6 +38,9 @@ class Class {
|
|||
|
||||
static int? staticFieldWithoutInitializer;
|
||||
|
||||
int nonNullableInstanceFieldWithInitializer = init(55);
|
||||
int? nullableInstanceFieldWithInitializer = init(17);
|
||||
|
||||
static int nonNullableStaticFieldWithInitializer1 = init(55);
|
||||
static int? nullableStaticFieldWithInitializer1 = init(17);
|
||||
|
||||
|
@ -121,6 +124,11 @@ main() {
|
|||
|
||||
throws(() => Class.nullableStaticFinalFieldWithInitializer2,
|
||||
'Read nullableStaticFinalFieldWithInitializer2');
|
||||
|
||||
var c = new Class();
|
||||
expect(17, lastInit);
|
||||
expect(55, c.nonNullableInstanceFieldWithInitializer);
|
||||
expect(17, c.nullableInstanceFieldWithInitializer);
|
||||
}
|
||||
|
||||
expect(expected, actual) {
|
||||
|
|
|
@ -22,6 +22,8 @@ final int? nullableFinalTopLevelFieldWithInitializer2 =
|
|||
class Class {
|
||||
static const int staticConstField = 123;
|
||||
static int? staticFieldWithoutInitializer;
|
||||
int nonNullableInstanceFieldWithInitializer = init(55);
|
||||
int? nullableInstanceFieldWithInitializer = init(17);
|
||||
static int nonNullableStaticFieldWithInitializer1 = init(55);
|
||||
static int? nullableStaticFieldWithInitializer1 = init(17);
|
||||
static int nonNullableStaticFieldWithInitializer2 = init(55);
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
T init<T>(T value) {}
|
||||
|
||||
class Class {
|
||||
int? nullableInstanceFieldWithInitializer = init(17);
|
||||
int nonNullableInstanceFieldWithInitializer = init(55);
|
||||
static const int staticConstField = 123;
|
||||
static final int? nullableStaticFinalFieldWithInitializer1 = init(19);
|
||||
static final int? nullableStaticFinalFieldWithInitializer2 =
|
||||
|
|
|
@ -6,6 +6,8 @@ import "dart:_internal" as _in;
|
|||
class Class extends core::Object {
|
||||
static const field core::int staticConstField = #C1;
|
||||
static field core::int? staticFieldWithoutInitializer = null;
|
||||
field core::int nonNullableInstanceFieldWithInitializer = self::init<core::int>(55);
|
||||
field core::int? nullableInstanceFieldWithInitializer = self::init<core::int?>(17);
|
||||
static field core::int? _#nonNullableStaticFieldWithInitializer1 = null;
|
||||
static field core::int? _#nullableStaticFieldWithInitializer1 = null;
|
||||
static field core::bool _#nullableStaticFieldWithInitializer1#isSet = false;
|
||||
|
@ -211,6 +213,10 @@ static method main() → dynamic {
|
|||
self::expect(19, self::lastInit);
|
||||
self::throws(() → core::int => self::Class::nonNullableStaticFinalFieldWithInitializer2, "Read nonNullableStaticFinalFieldWithInitializer2");
|
||||
self::throws(() → core::int? => self::Class::nullableStaticFinalFieldWithInitializer2, "Read nullableStaticFinalFieldWithInitializer2");
|
||||
self::Class c = new self::Class::•();
|
||||
self::expect(17, self::lastInit);
|
||||
self::expect(55, c.{self::Class::nonNullableInstanceFieldWithInitializer});
|
||||
self::expect(17, c.{self::Class::nullableInstanceFieldWithInitializer});
|
||||
}
|
||||
static method expect(dynamic expected, dynamic actual) → dynamic {
|
||||
if(!expected.{core::Object::==}(actual))
|
||||
|
|
|
@ -6,6 +6,8 @@ import "dart:_internal" as _in;
|
|||
class Class extends core::Object {
|
||||
static const field core::int staticConstField = #C1;
|
||||
static field core::int? staticFieldWithoutInitializer = null;
|
||||
field core::int nonNullableInstanceFieldWithInitializer = self::init<core::int>(55);
|
||||
field core::int? nullableInstanceFieldWithInitializer = self::init<core::int?>(17);
|
||||
static field core::int? _#nonNullableStaticFieldWithInitializer1 = null;
|
||||
static field core::int? _#nullableStaticFieldWithInitializer1 = null;
|
||||
static field core::bool _#nullableStaticFieldWithInitializer1#isSet = false;
|
||||
|
@ -211,6 +213,10 @@ static method main() → dynamic {
|
|||
self::expect(19, self::lastInit);
|
||||
self::throws(() → core::int => self::Class::nonNullableStaticFinalFieldWithInitializer2, "Read nonNullableStaticFinalFieldWithInitializer2");
|
||||
self::throws(() → core::int? => self::Class::nullableStaticFinalFieldWithInitializer2, "Read nullableStaticFinalFieldWithInitializer2");
|
||||
self::Class c = new self::Class::•();
|
||||
self::expect(17, self::lastInit);
|
||||
self::expect(55, c.{self::Class::nonNullableInstanceFieldWithInitializer});
|
||||
self::expect(17, c.{self::Class::nullableInstanceFieldWithInitializer});
|
||||
}
|
||||
static method expect(dynamic expected, dynamic actual) → dynamic {
|
||||
if(!expected.{core::Object::==}(actual))
|
||||
|
|
|
@ -30,6 +30,8 @@ final int finalTopLevelFieldWithInitializer2 =
|
|||
class Class {
|
||||
static const int staticConstField = 123;
|
||||
|
||||
int instanceFieldWithInitializer = init(55);
|
||||
|
||||
static int staticFieldWithoutInitializer;
|
||||
|
||||
static int staticFieldWithInitializer1 = init(55);
|
||||
|
@ -79,6 +81,10 @@ main() {
|
|||
|
||||
throws(() => Class.staticFinalFieldWithInitializer2,
|
||||
'Read staticFinalFieldWithInitializer2');
|
||||
|
||||
var c = new Class();
|
||||
expect(55, lastInit);
|
||||
expect(55, c.instanceFieldWithInitializer);
|
||||
}
|
||||
|
||||
expect(expected, actual) {
|
||||
|
|
|
@ -14,6 +14,7 @@ final int finalTopLevelFieldWithInitializer2 =
|
|||
|
||||
class Class {
|
||||
static const int staticConstField = 123;
|
||||
int instanceFieldWithInitializer = init(55);
|
||||
static int staticFieldWithoutInitializer;
|
||||
static int staticFieldWithInitializer1 = init(55);
|
||||
static int staticFieldWithInitializer2 = init(55);
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
T init<T>(T value) {}
|
||||
|
||||
class Class {
|
||||
int instanceFieldWithInitializer = init(55);
|
||||
static const int staticConstField = 123;
|
||||
static final int staticFinalFieldWithInitializer1 = init(73);
|
||||
static final int staticFinalFieldWithInitializer2 =
|
||||
|
|
|
@ -4,6 +4,7 @@ import "dart:core" as core;
|
|||
|
||||
class Class extends core::Object {
|
||||
static const field core::int* staticConstField = #C1;
|
||||
field core::int* instanceFieldWithInitializer = self::init<core::int*>(55);
|
||||
static field core::int* staticFieldWithoutInitializer = null;
|
||||
static field core::int* staticFieldWithInitializer1 = self::init<core::int*>(55);
|
||||
static field core::int* staticFieldWithInitializer2 = self::init<core::int*>(55);
|
||||
|
@ -60,6 +61,9 @@ static method main() → dynamic {
|
|||
self::expect(73, self::Class::staticFinalFieldWithInitializer1);
|
||||
self::expect(73, self::lastInit);
|
||||
self::throws(() → core::int* => self::Class::staticFinalFieldWithInitializer2, "Read staticFinalFieldWithInitializer2");
|
||||
self::Class* c = new self::Class::•();
|
||||
self::expect(55, self::lastInit);
|
||||
self::expect(55, c.{self::Class::instanceFieldWithInitializer});
|
||||
}
|
||||
static method expect(dynamic expected, dynamic actual) → dynamic {
|
||||
if(!expected.{core::Object::==}(actual))
|
||||
|
|
|
@ -4,6 +4,7 @@ import "dart:core" as core;
|
|||
|
||||
class Class extends core::Object {
|
||||
static const field core::int* staticConstField = #C1;
|
||||
field core::int* instanceFieldWithInitializer = self::init<core::int*>(55);
|
||||
static field core::int* staticFieldWithoutInitializer = null;
|
||||
static field core::int* staticFieldWithInitializer1 = self::init<core::int*>(55);
|
||||
static field core::int* staticFieldWithInitializer2 = self::init<core::int*>(55);
|
||||
|
@ -60,6 +61,9 @@ static method main() → dynamic {
|
|||
self::expect(73, self::Class::staticFinalFieldWithInitializer1);
|
||||
self::expect(73, self::lastInit);
|
||||
self::throws(() → core::int* => self::Class::staticFinalFieldWithInitializer2, "Read staticFinalFieldWithInitializer2");
|
||||
self::Class* c = new self::Class::•();
|
||||
self::expect(55, self::lastInit);
|
||||
self::expect(55, c.{self::Class::instanceFieldWithInitializer});
|
||||
}
|
||||
static method expect(dynamic expected, dynamic actual) → dynamic {
|
||||
if(!expected.{core::Object::==}(actual))
|
||||
|
|
Loading…
Reference in a new issue