[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:
Johnni Winther 2020-09-08 08:11:24 +00:00 committed by commit-bot@chromium.org
parent bd2746189b
commit 9d6ee9ec5a
21 changed files with 160 additions and 7 deletions

View file

@ -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,

View file

@ -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,

View file

@ -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) {

View file

@ -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,

View file

@ -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

View file

@ -663,6 +663,7 @@ mi
migration
mime
min
misuse
mixers
mk
mm
@ -1250,6 +1251,7 @@ wind
with1
wn
worthwhile
worthy
writeln
wrt
wtf

View 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() {}

View file

@ -0,0 +1,5 @@
enum A {
a,
b,
}
main() {}

View file

@ -0,0 +1,5 @@
enum A {
a,
b,
}
main() {}

View file

@ -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]
}

View file

@ -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]
}

View file

@ -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) {

View file

@ -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);

View file

@ -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 =

View file

@ -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))

View file

@ -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))

View file

@ -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) {

View file

@ -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);

View file

@ -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 =

View file

@ -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))

View file

@ -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))