blob: 1b6259fa7920b3f8f0f3de4a7816d1934ace0877 [file]
// 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.
import 'package:analyzer/src/binary/binary_reader.dart';
import 'package:analyzer/src/binary/binary_writer.dart';
import 'package:collection/collection.dart';
/// The top-level type inference error.
sealed class TopLevelInferenceError {
factory TopLevelInferenceError.read(BinaryReader reader) {
switch (TopLevelInferenceErrorKind.values[reader.readByte()]) {
case TopLevelInferenceErrorKind.dependencyCycle:
return TopLevelInferenceErrorDependencyCycle(
cycle: reader.readStringUtf8List(),
);
case TopLevelInferenceErrorKind.overrideNoCombinedSuperSignature:
return TopLevelInferenceErrorNoCombinedSuperSignature(
candidateSignatures: reader.readStringUtf8(),
);
case TopLevelInferenceErrorKind.differentGetterAndSetterTypes:
return TopLevelInferenceErrorDifferentGetterAndSetterTypes(
getterType: reader.readStringUtf8(),
setterType: reader.readStringUtf8(),
);
}
}
void write(BinaryWriter writer);
static TopLevelInferenceError? readOptional(BinaryReader reader) {
return reader.readOptionalObject(() => TopLevelInferenceError.read(reader));
}
}
class TopLevelInferenceErrorDependencyCycle implements TopLevelInferenceError {
/// The names of the elements in the cycle (sorted).
final List<String> cycle;
TopLevelInferenceErrorDependencyCycle({required this.cycle});
@override
bool operator ==(Object other) =>
other is TopLevelInferenceErrorDependencyCycle &&
const ListEquality<String>().equals(other.cycle, cycle);
@override
void write(BinaryWriter writer) {
writer.writeEnum(TopLevelInferenceErrorKind.dependencyCycle);
writer.writeStringUtf8Iterable(cycle);
}
}
class TopLevelInferenceErrorDifferentGetterAndSetterTypes
implements TopLevelInferenceError {
/// The return type of the combined getter signature.
final String getterType;
/// The parameter type of the combined setter signature.
final String setterType;
TopLevelInferenceErrorDifferentGetterAndSetterTypes({
required this.getterType,
required this.setterType,
});
@override
bool operator ==(Object other) =>
other is TopLevelInferenceErrorDifferentGetterAndSetterTypes &&
other.getterType == getterType &&
other.setterType == setterType;
@override
void write(BinaryWriter writer) {
writer.writeEnum(TopLevelInferenceErrorKind.differentGetterAndSetterTypes);
writer.writeStringUtf8(getterType);
writer.writeStringUtf8(setterType);
}
}
/// Enum used to indicate the kind of the error during top-level inference.
enum TopLevelInferenceErrorKind {
dependencyCycle,
overrideNoCombinedSuperSignature,
differentGetterAndSetterTypes,
}
class TopLevelInferenceErrorNoCombinedSuperSignature
implements TopLevelInferenceError {
/// The list of candidate signatures which cannot be combined.
final String candidateSignatures;
TopLevelInferenceErrorNoCombinedSuperSignature({
required this.candidateSignatures,
});
@override
bool operator ==(Object other) =>
other is TopLevelInferenceErrorNoCombinedSuperSignature &&
other.candidateSignatures == candidateSignatures;
@override
void write(BinaryWriter writer) {
writer.writeEnum(
TopLevelInferenceErrorKind.overrideNoCombinedSuperSignature,
);
writer.writeStringUtf8(candidateSignatures);
}
}
extension TopLevelInferenceErrorExtension on TopLevelInferenceError? {
void writeOptional(BinaryWriter writer) {
writer.writeOptionalObject(this, (it) => it.write(writer));
}
}