Skip to content

Commit ef2c721

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Store TopLevelVariableElementImpl.type, not get it from the fragment.
Change-Id: I2fac98ec5b7bfc9c5f5a58400ccf6773158bc543 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/438860 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Paul Berry <[email protected]>
1 parent 1ca9050 commit ef2c721

File tree

9 files changed

+65
-6
lines changed

9 files changed

+65
-6
lines changed

pkg/analyzer/lib/src/dart/analysis/driver.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ testFineAfterLibraryAnalyzerHook;
110110
// TODO(scheglov): Clean up the list of implicitly analyzed files.
111111
class AnalysisDriver {
112112
/// The version of data format, should be incremented on every format change.
113-
static const int DATA_VERSION = 488;
113+
static const int DATA_VERSION = 491;
114114

115115
/// The number of exception contexts allowed to write. Once this field is
116116
/// zero, we stop writing any new exception contexts in this process.

pkg/analyzer/lib/src/dart/element/element.dart

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9118,14 +9118,17 @@ class TopLevelVariableElementImpl extends PropertyInducingElementImpl
91189118
with
91199119
FragmentedAnnotatableElementMixin<TopLevelVariableFragmentImpl>,
91209120
FragmentedElementMixin<TopLevelVariableFragmentImpl>,
9121-
_HasSinceSdkVersionMixin
9121+
_HasSinceSdkVersionMixin,
9122+
DeferredResolutionReadingMixin
91229123
implements TopLevelVariableElement {
91239124
@override
91249125
final Reference reference;
91259126

91269127
@override
91279128
final TopLevelVariableFragmentImpl firstFragment;
91289129

9130+
TypeImpl? _type;
9131+
91299132
TopLevelVariableElementImpl(this.reference, this.firstFragment) {
91309133
reference.element = this;
91319134
firstFragment.element = this;
@@ -9185,7 +9188,41 @@ class TopLevelVariableElementImpl extends PropertyInducingElementImpl
91859188
String? get name3 => firstFragment.name2;
91869189

91879190
@override
9188-
TypeImpl get type => firstFragment.type;
9191+
TypeImpl get type {
9192+
_ensureReadResolution();
9193+
if (_type != null) return _type!;
9194+
9195+
// We must be linking, and the type has not been set yet.
9196+
var type = firstFragment.typeInference?.perform();
9197+
type ??= InvalidTypeImpl.instance;
9198+
_type = type;
9199+
firstFragment._type = type;
9200+
firstFragment.shouldUseTypeForInitializerInference = false;
9201+
9202+
// TODO(scheglov): We repeat this code.
9203+
var element = this;
9204+
if (element.getter2 case var getterElement?) {
9205+
getterElement.returnType = type;
9206+
getterElement.firstFragment.returnType = type;
9207+
}
9208+
if (element.setter2 case var setterElement?) {
9209+
if (setterElement.isSynthetic) {
9210+
setterElement.returnType = VoidTypeImpl.instance;
9211+
setterElement.firstFragment.returnType = VoidTypeImpl.instance;
9212+
(setterElement.formalParameters.single as FormalParameterElementImpl)
9213+
.type = type;
9214+
(setterElement.formalParameters.single as FormalParameterElementImpl)
9215+
.firstFragment
9216+
.type = type;
9217+
}
9218+
}
9219+
9220+
return _type!;
9221+
}
9222+
9223+
set type(TypeImpl value) {
9224+
_type = value;
9225+
}
91899226

91909227
@override
91919228
T? accept<T>(ElementVisitor2<T> visitor) {

pkg/analyzer/lib/src/summary2/bundle_reader.dart

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1254,7 +1254,15 @@ class LibraryReader {
12541254
var reference = _readReference();
12551255
var fragments = _readFragmentsById<TopLevelVariableFragmentImpl>();
12561256
// TODO(scheglov): link fragments.
1257-
return TopLevelVariableElementImpl(reference, fragments.first);
1257+
var element = TopLevelVariableElementImpl(reference, fragments.first);
1258+
1259+
element.deferReadResolution(
1260+
_createDeferredReadResolutionCallback((reader) {
1261+
element.type = reader.readRequiredType();
1262+
}),
1263+
);
1264+
1265+
return element;
12581266
});
12591267
}
12601268

pkg/analyzer/lib/src/summary2/bundle_writer.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,13 @@ class BundleWriter {
119119
_writeMixinElements(libraryElement.mixins);
120120
_writeTypeAliasElements(libraryElement.typeAliases);
121121

122+
// TODO(scheglov): extract
122123
_sink.writeList(libraryElement.topLevelVariables, (element) {
123124
_writeReference(element.reference);
124125
_sink.writeList(element.fragments, _writeFragmentId);
126+
_writeElementResolution(() {
127+
_resolutionSink.writeType(element.type);
128+
});
125129
});
126130

127131
_writeGetterElements(libraryElement.getters);

pkg/analyzer/lib/src/summary2/top_level_inference.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ class _InitializerInference {
146146
void perform() {
147147
for (var element in _toInfer) {
148148
// Will perform inference, if not done yet.
149-
element.type;
149+
element.element.type;
150150
}
151151
}
152152

pkg/analyzer/lib/src/summary2/types_builder.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ class TypesBuilder {
183183
switch (element) {
184184
case GetterElementImpl():
185185
element.returnType = returnType;
186+
(element.variable3 as TopLevelVariableElementImpl).type = returnType;
186187
element.variable3!.firstFragment.type = returnType;
187188
case SetterElementImpl():
188189
element.returnType = returnType;
@@ -194,8 +195,10 @@ class TypesBuilder {
194195
var valueNodeType = valueNode?.declaredFragment!.type;
195196
valueElement?.type = valueNodeType ?? InvalidTypeImpl.instance;
196197

197-
var variableElement = element.variable3!;
198+
var variableElement =
199+
element.variable3 as TopLevelVariableElementImpl;
198200
if (variableElement.isSynthetic && valueElement != null) {
201+
variableElement.type = valueElement.type;
199202
variableElement.firstFragment.type = valueElement.type;
200203
}
201204
case TopLevelFunctionElementImpl():
@@ -254,6 +257,9 @@ class TypesBuilder {
254257
var variableFragment = variable.declaredFragment!;
255258
var variableElement = variableFragment.element;
256259
variableFragment.type = type;
260+
if (variableElement is TopLevelVariableElementImpl) {
261+
variableElement.type = type;
262+
}
257263
if (variableElement is PropertyInducingElementImpl) {
258264
if (variableElement.getter2 case var getterElement?) {
259265
getterElement.returnType = type;

pkg/linter/test/rules/avoid_field_initializers_in_non_const_classes_test.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ augment class A {
6363
);
6464
}
6565

66+
@SkippedTest() // TODO(scheglov): implement augmentation
6667
test_augmentedClass_augmentedField() async {
6768
newFile('$testPackageLibPath/a.dart', r'''
6869
part 'test.dart';

pkg/linter/test/rules/overridden_fields_test.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ augment class A {
4040
await assertDiagnosticsInFile(b.path, [lint(45, 1)]);
4141
}
4242

43+
@SkippedTest() // TODO(scheglov): implement augmentation
4344
test_augmentedField() async {
4445
var a = newFile('$testPackageLibPath/a.dart', r'''
4546
part 'b.dart';

pkg/linter/test/rules/prefer_typing_uninitialized_variables_test.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class PreferTypingUninitializedVariablesTest extends LintRuleTest {
1717
@override
1818
String get lintRule => LintNames.prefer_typing_uninitialized_variables;
1919

20+
@SkippedTest() // TODO(scheglov): implement augmentation
2021
test_field_augmented() async {
2122
var a = newFile('$testPackageLibPath/a.dart', r'''
2223
part 'b.dart';
@@ -132,6 +133,7 @@ void f() {
132133
);
133134
}
134135

136+
@SkippedTest() // TODO(scheglov): implement augmentation
135137
test_topLevelVariable_augmented() async {
136138
var a = newFile('$testPackageLibPath/a.dart', r'''
137139
part 'b.dart';

0 commit comments

Comments
 (0)