psalm icon indicating copy to clipboard operation
psalm copied to clipboard

How to test against class-string<Foo> if the class might not exist yet?

Open Hanmac opened this issue 1 year ago • 1 comments

In newer Dbal4 Version, InvalidType extends ConversionException

but the test against older version fails

https://psalm.dev/r/32dcca1a1b

using this causes even more problems because it now thinks that class_exists doesn't apply if (class_exists(InvalidType::class) && is_a(InvalidType::class, \Throwable::class, true)) {

https://psalm.dev/r/5a6e7e25e5

with this, it's fewer problems again, but we are back at the start

if (class_exists(InvalidType::class))
    if (is_a(InvalidType::class, \Throwable::class, true)) {
        expectException(InvalidType::class);
}

https://psalm.dev/r/8b557386cf

Hanmac avatar Jun 04 '24 15:06 Hanmac

I found these snippets:

https://psalm.dev/r/32dcca1a1b
<?php

/**
 * @param class-string<Throwable> $class
 */
function expectException(string $class): string {return $class;}

class ConversionException extends Exception
{
}

/**
 * class InvalidType extends ConversionException {
    }
 */


expectException(ConversionException::class);
if (class_exists(InvalidType::class)) {
  expectException(InvalidType::class);
}
Psalm output (using commit 16b24bd):

ERROR: InvalidArgument - 20:19 - Argument 1 of expectException expects class-string<Throwable>, but InvalidType::class provided
https://psalm.dev/r/5a6e7e25e5
<?php

/**
 * @param class-string<Throwable> $class
 */
function expectException(string $class): string {return $class;}

class ConversionException extends Exception
{
}

/**
 * class InvalidType extends ConversionException {
    }
 */


expectException(ConversionException::class);
if (class_exists(InvalidType::class) && is_a(InvalidType::class, \Throwable::class, true)) {
   expectException(InvalidType::class);
}
Psalm output (using commit 16b24bd):

ERROR: UndefinedClass - 19:46 - Class, interface or enum named InvalidType does not exist

ERROR: UndefinedClass - 20:20 - Class, interface or enum named InvalidType does not exist

INFO: MixedArgument - 20:20 - Argument 1 of expectException cannot be mixed, expecting class-string<Throwable>
https://psalm.dev/r/8b557386cf
<?php

/**
 * @param class-string<Throwable> $class
 */
function expectException(string $class): string {return $class;}

class ConversionException extends Exception
{
}

/**
 * class InvalidType extends ConversionException {
    }
 */


expectException(ConversionException::class);
if (class_exists(InvalidType::class))
    if (is_a(InvalidType::class, \Throwable::class, true)) {
        expectException(InvalidType::class);
}
Psalm output (using commit 16b24bd):

ERROR: InvalidArgument - 21:25 - Argument 1 of expectException expects class-string<Throwable>, but InvalidType::class provided

psalm-github-bot[bot] avatar Jun 04 '24 15:06 psalm-github-bot[bot]