blob: 8555fcec90d5e2868fd641989f57802e8327f996 [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(),
);
}
}
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);
}
}
/// Enum used to indicate the kind of the error during top-level inference.
enum TopLevelInferenceErrorKind {
dependencyCycle,
overrideNoCombinedSuperSignature,
}
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));
}
}