in src/powerquery-parser/language/type/typeUtils/isCompatible.ts [14:78]
export function isCompatible(left: Type.TPowerQueryType, right: Type.TPowerQueryType): boolean | undefined {
if (
left.kind === Type.TypeKind.NotApplicable ||
left.kind === Type.TypeKind.Unknown ||
right.kind === Type.TypeKind.NotApplicable ||
right.kind === Type.TypeKind.Unknown
) {
return undefined;
} else if (
left.kind === Type.TypeKind.None ||
right.kind === Type.TypeKind.None ||
(left.isNullable && !right.isNullable)
) {
return false;
} else if (left.kind === Type.TypeKind.Null && right.isNullable) {
return true;
}
switch (right.kind) {
case Type.TypeKind.Action:
case Type.TypeKind.Binary:
case Type.TypeKind.Date:
case Type.TypeKind.DateTime:
case Type.TypeKind.DateTimeZone:
case Type.TypeKind.Duration:
case Type.TypeKind.Time:
return isEqualType(left, right);
case Type.TypeKind.Any:
return isCompatibleWithAny(left, right);
case Type.TypeKind.AnyNonNull:
return left.kind !== Type.TypeKind.Null && !left.isNullable;
case Type.TypeKind.Function:
return isCompatibleWithFunction(left, right);
case Type.TypeKind.List:
return isCompatibleWithList(left, right);
case Type.TypeKind.Logical:
return isCompatibleWithPrimitiveOrLiteral(left, right);
case Type.TypeKind.Number:
return isCompatibleWithPrimitiveOrLiteral(left, right);
case Type.TypeKind.Null:
return left.kind === Type.TypeKind.Null;
case Type.TypeKind.Record:
return isCompatibleWithRecord(left, right);
case Type.TypeKind.Table:
return isCompatibleWithTable(left, right);
case Type.TypeKind.Text:
return isCompatibleWithPrimitiveOrLiteral(left, right);
case Type.TypeKind.Type:
return isCompatibleWithType(left, right);
default:
throw Assert.isNever(right);
}
}