mirror of
https://github.com/danog/psalm.git
synced 2024-11-26 12:24:49 +01:00
This commit is contained in:
parent
eaeb979222
commit
db7bdd81ac
@ -40,13 +40,17 @@ final class DocComment
|
||||
/**
|
||||
* Parse a docblock comment into its parts.
|
||||
*/
|
||||
public static function parsePreservingLength(Doc $docblock): ParsedDocblock
|
||||
public static function parsePreservingLength(Doc $docblock, bool $no_psalm_error = false): ParsedDocblock
|
||||
{
|
||||
$parsed_docblock = DocblockParser::parse(
|
||||
$docblock->getText(),
|
||||
$docblock->getStartFilePos(),
|
||||
);
|
||||
|
||||
if ($no_psalm_error) {
|
||||
return $parsed_docblock;
|
||||
}
|
||||
|
||||
foreach ($parsed_docblock->tags as $special_key => $_) {
|
||||
if (strpos($special_key, 'psalm-') === 0) {
|
||||
$special_key = substr($special_key, 6);
|
||||
|
@ -802,6 +802,14 @@ final class StatementsAnalyzer extends SourceAnalyzer
|
||||
$this->parsed_docblock = null;
|
||||
}
|
||||
|
||||
if ($this->parsed_docblock === null) {
|
||||
try {
|
||||
$this->parsed_docblock = DocComment::parsePreservingLength($docblock, true);
|
||||
} catch (DocblockParseException $e) {
|
||||
// already reported above
|
||||
}
|
||||
}
|
||||
|
||||
$comments = $this->parsed_docblock;
|
||||
|
||||
if (isset($comments->tags['psalm-scope-this'])) {
|
||||
|
@ -53,7 +53,8 @@ final class FunctionLikeDocblockParser
|
||||
CodeLocation $code_location,
|
||||
string $cased_function_id
|
||||
): FunctionDocblockComment {
|
||||
$parsed_docblock = DocComment::parsePreservingLength($comment);
|
||||
// invalid @psalm annotations are already reported by the StatementsAnalyzer
|
||||
$parsed_docblock = DocComment::parsePreservingLength($comment, true);
|
||||
|
||||
$comment_text = $comment->getText();
|
||||
|
||||
|
@ -535,6 +535,45 @@ class AnnotationTest extends TestCase
|
||||
'$_===' => 'list<array{href: string, lang: string}>',
|
||||
],
|
||||
],
|
||||
'invalidPsalmForMethodShouldNotBreakDocblock' => [
|
||||
'code' => '<?php
|
||||
class A {
|
||||
/**
|
||||
* @psalm-impure
|
||||
* @param string $arg
|
||||
* @return non-falsy-string
|
||||
*/
|
||||
public function foo($arg) {
|
||||
return $arg . "bar";
|
||||
}
|
||||
}
|
||||
|
||||
$a = new A();
|
||||
$_ = $a->foo("hello");
|
||||
',
|
||||
'assertions' => [
|
||||
'$_===' => 'non-falsy-string',
|
||||
],
|
||||
'ignored_issues' => ['InvalidDocblock'],
|
||||
],
|
||||
'invalidPsalmForFunctionShouldNotBreakDocblock' => [
|
||||
'code' => '<?php
|
||||
/**
|
||||
* @psalm-impure
|
||||
* @param string $arg
|
||||
* @return non-falsy-string
|
||||
*/
|
||||
function foo($arg) {
|
||||
return $arg . "bar";
|
||||
}
|
||||
|
||||
$_ = foo("hello");
|
||||
',
|
||||
'assertions' => [
|
||||
'$_===' => 'non-falsy-string',
|
||||
],
|
||||
'ignored_issues' => ['InvalidDocblock'],
|
||||
],
|
||||
'builtInClassInAShape' => [
|
||||
'code' => '<?php
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user