Como lidar com o aviso “método não encontrado na aula” para métodos implementados magicamente?

Estou sentado em uma grande base de código que contém várias classes que expõem a funcionalidade através de métodos implementados magicamente (usando__call e__callStatic). Por exemplo:

class Foo {
    public function __call($name, $parameters) {
        echo "You called $name().\n";
    }
}

$f = new Foo;
$f->test();   // runs fine, but PhpStorm flags as a warning

O problema é que o PhpStorm acha que otest() método não existe, por isso, dá um aviso no site de chamada. Isso é um pouco irritante, pois é claro que o código será executado e se comportará como esperado.

Eu já ajustei a gravidade, marcando a opção "downgrade severity if __magic methods is present in class", mas eu preferiria:

desabilitar completamente essa funcionalidade para classes específicassóoutrabalhar com o IDE e não contra ele - fornecer as informações que eu já tenho, então nossas visões concordam

Alguma das alternativas acima é possível? Se sim, como?

Pergunta de bônus adicional: considere o caso em que as chamadas de método estão sendo encadeadas.

$f = new Foo;
$f->test()->chain()->moreChain();   // potentially runs fine

Assumindo que a magia chama$f->test() retorna algo apropriado as chamadas subsequentes (possivelmente, mas não necessariamente, também mágicas) funcionarão bem. No entanto, desde que não há nenhuma maneira que eu conheço para dizer ao IDE o quetest() A devolve sinaliza o restante da cadeia de chamadas como cheia de métodos ausentes também. E, para piorar a situação, a configuração "downgrade severity" não se aplica a esses avisos, pois o IDE não sabe qual classe esses objetos intermediários devem ser.

Existe uma solução que também pode cobrir este caso?

Atualizar

Mesmo documentando os métodos mágicos com@method as anotações parecem funcionar, eu tenho que assumir que atualmente existem vários problemas com essa abordagem, porque só me levou um pouco de trabalho para encontrar esses erros relacionados:

Sugestão de tipo para os argumentos do método não funciona corretamente com primitivosAnotações funcionam para uma chamada, mas não para chamadas encadeadas

Eu espero que eles consertem eles em um prazo razoável.

questionAnswers(4)

yourAnswerToTheQuestion