1
0
mirror of https://github.com/danog/psalm.git synced 2024-11-26 20:34:47 +01:00

Use a more fault-tolerant version of php-parser

This commit is contained in:
Matthew Brown 2017-02-10 21:27:12 -05:00
parent 3c3224591a
commit 1d6c441d16
2 changed files with 71 additions and 1 deletions

View File

@ -577,8 +577,16 @@ class FileChecker extends SourceChecker implements StatementsSource
$parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7, $lexer);
$error_handler = new \PhpParser\ErrorHandler\Collecting();
/** @var array<int, \PhpParser\Node\Stmt> */
$stmts = $parser->parse($file_contents);
$stmts = $parser->parse($file_contents, $error_handler);
if (!$stmts && $error_handler->hasErrors()) {
foreach ($error_handler->getErrors() as $error) {
throw $error;
}
}
}
if ($parser_cache_directory && $cache_location) {

62
tests/BadFormatTest.php Normal file
View File

@ -0,0 +1,62 @@
<?php
namespace Psalm\Tests;
use PhpParser\ParserFactory;
use PHPUnit_Framework_TestCase;
use Psalm\Checker\FileChecker;
use Psalm\Config;
use Psalm\Context;
class BadFormatTest extends PHPUnit_Framework_TestCase
{
/** @var \PhpParser\Parser */
protected static $parser;
/** @var TestConfig */
protected static $config;
/** @var \Psalm\Checker\ProjectChecker */
protected $project_checker;
/**
* @return void
*/
public static function setUpBeforeClass()
{
self::$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
self::$config = new TestConfig();
}
/**
* @return void
*/
public function setUp()
{
FileChecker::clearCache();
$this->project_checker = new \Psalm\Checker\ProjectChecker();
$this->project_checker->setConfig(self::$config);
}
/**
* @return void
*/
public function testMissingSemicolon()
{
$this->project_checker->registerFile(
getcwd() . '/somefile.php',
'<?php
class A {
/** @var int|null */
protected $hello;
/** @return void */
function foo() {
$this->hello = 5
}
}'
);
$file_checker = new FileChecker(getcwd() . '/somefile.php', $this->project_checker);
$file_checker->visitAndAnalyzeMethods();
}
}