Skip to content

Truncate type display for long unions in some situations #1307

@AlexWaygood

Description

@AlexWaygood

Summary

One of the diagnostics in the ecosystem report for astral-sh/ruff#20368 is:

[error] invalid-argument-type - :1121:30 - Argument is incorrect: Expected `str`, found `Unknown | str | ((sd: @Todo | SpectralDistribution | MultiSpectralDistributions, cmfs: MultiSpectralDistributions | None = None, illuminant: SpectralDistribution | None = None, k: @Todo | None = None, method: str = str, **kwargs: Any) -> @Todo) | ((XYZ: @Todo, method: str = str, **kwargs: Any) -> SpectralDistribution) | ((sd: SpectralDistribution, lef: SpectralDistribution | None = None) -> int | float) | ((XYZ: @Todo) -> @Todo) | ((Y: @Todo) -> @Todo) | ((LV: @Todo, method: str = str, **kwargs: Any) -> @Todo) | partial[Unknown] | ((wavelength: @Todo, cmfs: MultiSpectralDistributions | None = None) -> @Todo) | ((xyY: @Todo) -> @Todo) | ((xy: @Todo) -> @Todo) | ((Lab: @Todo) -> @Todo) | ((Luv: @Todo, illuminant: @Todo = Any) -> @Todo) | ((uv: @Todo) -> @Todo) | ((UVW: @Todo) -> @Todo) | ((Lab_99: @Todo, illuminant: @Todo = Any, k_E: int | float = int, k_CH: int | float = int, method: str = str) -> @Todo) | ((Lab_hdr: @Todo, illuminant: @Todo = Any, Y_s: @Todo = float, Y_abs: @Todo = int, method: str = str) -> @Todo) | ((ICaCb: @Todo) -> @Todo) | ((ICtCp: @Todo, illuminant: @Todo = Any, chromatic_adaptation_transform: @Todo | str | None = str, method: str = str, L_p: int | float = int) -> @Todo) | ((IgPgTg: @Todo) -> @Todo) | ((IPT: @Todo) -> @Todo) | ((XYZ_D65: @Todo, constants: Structure = Structure) -> @Todo) | ((Jzazbz: @Todo, constants: Structure = Structure) -> @Todo) | ((IPT_hdr: @Todo, Y_s: @Todo = float, Y_abs: @Todo = int, method: str = str) -> @Todo) | ((Ljg: @Todo, optimisation_kwargs: dict[Unknown, Unknown] | None = None) -> @Todo) | ((ProLab: @Todo, illuminant: @Todo = Any) -> @Todo) | ((Iab: @Todo) -> @Todo) | ((Yrg: @Todo) -> @Todo) | ((uvV: @Todo) -> @Todo) | ((uvL: @Todo, illuminant: @Todo = Any) -> @Todo) | ((RGB: @Todo) -> @Todo) | ((HSV: @Todo) -> @Todo) | ((HSL: @Todo) -> @Todo) | ((HCL: @Todo, gamma: int | float = int, Y_0: int | float = int) -> @Todo) | ((HYS: @Todo) -> @Todo) | ((CMY: @Todo) -> @Todo) | ((CMYK: @Todo) -> @Todo) | ((Lrgb: @Todo) -> @Todo) | ((YCbCr: @Todo, K: @Todo = Any, in_bits: int = int, in_legal: bool = bool, in_int: bool = bool, out_bits: int = int, out_legal: bool = bool, out_int: bool = bool, clamp_int: bool = bool, **kwargs: Any) -> @Todo) | ((YcCbcCrc: @Todo, in_bits: int = int, in_legal: bool = bool, in_int: bool = bool, is_12_bits_system: bool = bool, **kwargs: Any) -> @Todo) | ((YCoCg: @Todo) -> @Todo) | ((value: @Todo, function: @Todo | str = str, **kwargs: Any) -> @Todo) | ((HEX: @Todo) -> @Todo) | ((keyword: str) -> @Todo) | ((xyY: @Todo, hue_decimals: int = int, value_decimals: int = int, chroma_decimals: int = int) -> str | @Todo) | ((munsell_colour: @Todo) -> @Todo) | (Overload[(sd_test: SpectralDistribution, additional_data: bool = bool, method: str = EllipsisType) -> ColourRendering_Specification_CRI, (sd_test: SpectralDistribution, *, additional_data: bool, method: str = EllipsisType) -> int | float, (sd_test: SpectralDistribution, additional_data: bool, method: str = EllipsisType) -> int | float]) | (Overload[(sd_test: SpectralDistribution, *, additional_data: bool, method: str = EllipsisType) -> int | float, (sd_test: SpectralDistribution, additional_data: bool = bool, method: str = EllipsisType) -> ColourRendering_Specification_CQS, (sd_test: SpectralDistribution, additional_data: bool, method: str = EllipsisType) -> int | float]) | ((CCT_D_uv: @Todo) -> @Todo) | ((mired: @Todo) -> @Todo) | ((specification: CAM_Specification_CIECAM02) -> @Todo) | ((JMh: @Todo) -> CAM_Specification_CIECAM02) | ((specification: CAM_Specification_CAM16) -> @Todo) | ((JMh: @Todo) -> CAM_Specification_CAM16) | ((specification: CAM_Specification_CIECAM16) -> @Todo) | ((JMh: @Todo) -> CAM_Specification_CIECAM16) | ((specification: CAM_Specification_Hellwig2022) -> @Todo) | ((JMh: @Todo) -> CAM_Specification_Hellwig2022) | ((specification: CAM_Specification_sCAM) -> @Todo) | ((JMh: @Todo) -> CAM_Specification_sCAM) | ((JMh: @Todo) -> @Todo) | ((Jpapbp: @Todo) -> @Todo)`

That's a ridiculously long display for a type, and it's needlessly long. The user has all the information they need after they're presented with the first union element that's not assignable to str. We should instead display something like:

[error] invalid-argument-type - :1121:30 - Argument is incorrect: Expected `str`, found `Unknown | str | ((sd: @Todo | SpectralDistribution | MultiSpectralDistributions, cmfs: MultiSpectralDistributions | None = None, illuminant: SpectralDistribution | None = None, k: @Todo | None = None, method: str = str, **kwargs: Any) -> @Todo) | (...30 union elements omitted)`

(I didn't actually count how many elements there are in that very long union, but you get the picture.)

Version

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    diagnosticsRelated to reporting of diagnostics.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions