Skip to content

Commit 29c908a

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Migrate InstanceMemberInferrer to use elements.
Change-Id: I596abe285a05fec4f201b95ee0e3315c9d01b34a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/440260 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]>
1 parent dbe2d19 commit 29c908a

File tree

12 files changed

+182
-202
lines changed

12 files changed

+182
-202
lines changed

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

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

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

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

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2973,6 +2973,11 @@ class FormalParameterElementImpl extends PromotableElementImpl
29732973
@override
29742974
late TypeImpl type;
29752975

2976+
/// Whether this formal parameter inherits from a covariant formal parameter.
2977+
/// This happens when it overrides a method in a supertype that has a
2978+
/// corresponding covariant formal parameter.
2979+
bool inheritsCovariant = false;
2980+
29762981
FormalParameterElementImpl(this.wrappedElement) {
29772982
FormalParameterFragmentImpl? fragment = wrappedElement;
29782983
while (fragment != null) {
@@ -3033,8 +3038,12 @@ class FormalParameterElementImpl extends PromotableElementImpl
30333038
bool get isConst => wrappedElement.isConst;
30343039

30353040
@override
3036-
// TODO(augmentations): Implement the merge of formal parameters.
3037-
bool get isCovariant => wrappedElement.isCovariant;
3041+
bool get isCovariant {
3042+
if (firstFragment.isExplicitlyCovariant || inheritsCovariant) {
3043+
return true;
3044+
}
3045+
return false;
3046+
}
30383047

30393048
@override
30403049
// TODO(augmentations): Implement the merge of formal parameters.
@@ -3210,11 +3219,6 @@ class FormalParameterFragmentImpl extends VariableFragmentImpl
32103219
/// Prefer using `isXyz` instead, e.g. [isRequiredNamed].
32113220
final ParameterKind parameterKind;
32123221

3213-
/// True if this parameter inherits from a covariant parameter. This happens
3214-
/// when it overrides a method in a supertype that has a corresponding
3215-
/// covariant parameter.
3216-
bool inheritsCovariant = false;
3217-
32183222
/// The element corresponding to this fragment.
32193223
FormalParameterElementImpl? _element;
32203224

@@ -3277,15 +3281,6 @@ class FormalParameterFragmentImpl extends VariableFragmentImpl
32773281
@override
32783282
Fragment? get enclosingFragment => enclosingElement as Fragment?;
32793283

3280-
/// Whether the parameter is covariant, meaning it is allowed to have a
3281-
/// narrower type in an override.
3282-
bool get isCovariant {
3283-
if (isExplicitlyCovariant || inheritsCovariant) {
3284-
return true;
3285-
}
3286-
return false;
3287-
}
3288-
32893284
/// Return true if this parameter is explicitly marked as being covariant.
32903285
bool get isExplicitlyCovariant {
32913286
return hasModifier(Modifier.COVARIANT);
@@ -4829,6 +4824,10 @@ abstract class InterfaceElementImpl extends InstanceElementImpl
48294824

48304825
List<ConstructorElementImpl> _constructors = _Sentinel.constructorElement;
48314826

4827+
/// A flag indicating whether the types associated with the instance members
4828+
/// of this class have been inferred.
4829+
bool hasBeenInferred = false;
4830+
48324831
@override
48334832
List<InterfaceTypeImpl> get allSupertypes {
48344833
return _allSupertypes ??= library.session.classHierarchy
@@ -5185,10 +5184,6 @@ abstract class InterfaceFragmentImpl extends InstanceFragmentImpl
51855184

51865185
InterfaceTypeImpl? _supertype;
51875186

5188-
/// A flag indicating whether the types associated with the instance members
5189-
/// of this class have been inferred.
5190-
bool hasBeenInferred = false;
5191-
51925187
List<ConstructorFragmentImpl> _constructors = _Sentinel.constructorFragment;
51935188

51945189
/// Initialize a newly created class element to have the given [name] at the
@@ -7553,6 +7548,15 @@ class MethodElementImpl extends ExecutableElementImpl
75537548
@override
75547549
final MethodFragmentImpl firstFragment;
75557550

7551+
/// Is `true` if this method is `operator==`, and there is no explicit
7552+
/// type specified for its formal parameter, in this method or in any
7553+
/// overridden methods other than the one declared in `Object`.
7554+
bool isOperatorEqualWithParameterTypeFromObject = false;
7555+
7556+
/// The error reported during type inference for this variable, or `null` if
7557+
/// this variable is not a subject of type inference, or there was no error.
7558+
TopLevelInferenceError? typeInferenceError;
7559+
75567560
MethodElementImpl({
75577561
required this.name,
75587562
required this.reference,
@@ -7645,15 +7649,6 @@ class MethodFragmentImpl extends ExecutableFragmentImpl
76457649
@override
76467650
MethodFragmentImpl? nextFragment;
76477651

7648-
/// Is `true` if this method is `operator==`, and there is no explicit
7649-
/// type specified for its formal parameter, in this method or in any
7650-
/// overridden methods other than the one declared in `Object`.
7651-
bool isOperatorEqualWithParameterTypeFromObject = false;
7652-
7653-
/// The error reported during type inference for this variable, or `null` if
7654-
/// this variable is not a subject of type inference, or there was no error.
7655-
TopLevelInferenceError? typeInferenceError;
7656-
76577652
/// Initialize a newly created method element to have the given [name] at the
76587653
/// given [offset].
76597654
MethodFragmentImpl({required this.name, required super.firstTokenOffset});

pkg/analyzer/lib/src/error/inheritance_override.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -937,7 +937,7 @@ class _ClassVerifier {
937937
bool _reportNoCombinedSuperSignature(MethodDeclarationImpl node) {
938938
var fragment = node.declaredFragment;
939939
if (fragment is MethodFragmentImpl) {
940-
var inferenceError = fragment.typeInferenceError;
940+
var inferenceError = fragment.element.typeInferenceError;
941941
if (inferenceError?.kind ==
942942
TopLevelInferenceErrorKind.overrideNoCombinedSuperSignature) {
943943
reporter.atToken(

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1217,7 +1217,6 @@ class AstBinaryReader {
12171217
AstBinaryFlags.isRequired(flags) ? Tokens.required_() : null,
12181218
);
12191219
var actualType = _reader.readRequiredType();
1220-
_reader.readByte(); // TODO(scheglov): inherits covariant
12211220

12221221
var fragment = FormalParameterFragmentImpl(
12231222
firstTokenOffset: null,

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -751,9 +751,6 @@ class AstBinaryWriter extends ThrowingAstVisitor<void> {
751751

752752
_writeOptionalNode(node.type);
753753
_storeNormalFormalParameter(node, node.keyword);
754-
755-
var element = node.declaredFragment!;
756-
_sink.writeByte(element.inheritsCovariant ? 1 : 0);
757754
}
758755

759756
@override

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -746,6 +746,7 @@ class LibraryReader {
746746
parameter.metadata = reader._readMetadata(unitElement: unitElement);
747747
_readTypeParameters2(unitElement, reader, parameter.typeParameters);
748748
_readFormalParameters2(unitElement, reader, parameter.parameters);
749+
parameter.element.inheritsCovariant = reader.readBool();
749750
var type = reader.readType() ?? InvalidTypeImpl.instance;
750751
parameter.element.type = type;
751752
parameter.constantInitializer = reader.readOptionalExpression();
@@ -916,6 +917,7 @@ class LibraryReader {
916917
reference: reference,
917918
firstFragment: fragments.first,
918919
);
920+
element.typeInferenceError = _readTopLevelInferenceError();
919921

920922
// TODO(scheglov): type parameters
921923
// TODO(scheglov): formal parameters
@@ -943,7 +945,6 @@ class LibraryReader {
943945
var fragment = MethodFragmentImpl(name: name, firstTokenOffset: null);
944946

945947
fragment.readModifiers(_reader);
946-
fragment.typeInferenceError = _readTopLevelInferenceError();
947948
fragment.typeParameters = _readTypeParameters();
948949
fragment.parameters = _readParameters();
949950
return fragment;

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,7 @@ class BundleWriter {
545545
_sink.writeList(elements, (element) {
546546
_writeReference(element.reference);
547547
_sink.writeList(element.fragments, _writeFragmentId);
548+
_sink._writeTopLevelInferenceError(element.typeInferenceError);
548549

549550
_writeElementResolution(() {
550551
// TODO(scheglov): avoid cast
@@ -558,7 +559,6 @@ class BundleWriter {
558559

559560
void _writeMethodFragment(MethodFragmentImpl fragment) {
560561
_writeTemplateFragment(fragment, () {
561-
_sink._writeTopLevelInferenceError(fragment.typeInferenceError);
562562
_writeTypeParameters(fragment.typeParameters, () {
563563
_sink.writeList(fragment.formalParameters, _writeParameterElement);
564564
_resolutionSink._writeMetadata(fragment.metadata);
@@ -643,6 +643,7 @@ class BundleWriter {
643643

644644
_writeTypeParameters(element.typeParameters, () {
645645
_writeList(element.parameters, _writeParameterElement);
646+
_resolutionSink.writeBool(element.element.inheritsCovariant);
646647
_resolutionSink.writeType(element.element.type);
647648
_resolutionSink._writeOptionalNode(element.constantInitializer);
648649

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -332,25 +332,22 @@ class MixinElementFlags {
332332

333333
class ParameterElementFlags {
334334
static const int _hasImplicitType = 1 << 0;
335-
static const int _inheritsCovariant = 1 << 1;
336-
static const int _isExplicitlyCovariant = 1 << 2;
337-
static const int _isFinal = 1 << 3;
335+
static const int _isExplicitlyCovariant = 1 << 1;
336+
static const int _isFinal = 1 << 2;
338337

339338
static void read(
340339
SummaryDataReader reader,
341340
FormalParameterFragmentImpl element,
342341
) {
343342
var byte = reader.readByte();
344343
element.hasImplicitType = (byte & _hasImplicitType) != 0;
345-
element.inheritsCovariant = (byte & _inheritsCovariant) != 0;
346344
element.isExplicitlyCovariant = (byte & _isExplicitlyCovariant) != 0;
347345
element.isFinal = (byte & _isFinal) != 0;
348346
}
349347

350348
static void write(BufferedSink sink, FormalParameterFragmentImpl element) {
351349
var result = 0;
352350
result |= element.hasImplicitType ? _hasImplicitType : 0;
353-
result |= element.inheritsCovariant ? _inheritsCovariant : 0;
354351
result |= element.isExplicitlyCovariant ? _isExplicitlyCovariant : 0;
355352
result |= element.isFinal ? _isFinal : 0;
356353
sink.writeByte(result);

0 commit comments

Comments
 (0)