diff --git a/_admin.php b/_admin.php index d789ea9..c89bfa1 100644 --- a/_admin.php +++ b/_admin.php @@ -23,6 +23,7 @@ $core->addBehavior('improveAddAction', ['ImproveActionLicensefile', 'create']); $core->addBehavior('improveAddAction', ['ImproveActionNewline', 'create']); $core->addBehavior('improveAddAction', ['ImproveActionPhpcsfixer', 'create']); $core->addBehavior('improveAddAction', ['ImproveActionPhpheader', 'create']); +$core->addBehavior('improveAddAction', ['ImproveActionPhpstan', 'create']); $core->addBehavior('improveAddAction', ['ImproveActionTab', 'create']); $core->addBehavior('improveAddAction', ['ImproveActionZip', 'create']); diff --git a/_prepend.php b/_prepend.php index d30d2aa..1a8ad7d 100644 --- a/_prepend.php +++ b/_prepend.php @@ -26,6 +26,7 @@ $improve_libs = [ 'ImproveActionNewline' => 'lib.improve.action.php', 'ImproveActionPhpcsfixer' => 'lib.improve.action.phpcsfixer.php', 'ImproveActionPhpheader' => 'lib.improve.action.phpheader.php', + 'ImproveActionPhpstan' => 'lib.improve.action.phpstan.php', 'ImproveActionTab' => 'lib.improve.action.php', 'ImproveActionZip' => 'lib.improve.action.zip.php', 'ImproveZipFileZip' => 'lib.improve.action.zip.php' diff --git a/inc/lib.improve.action.phpstan.php b/inc/lib.improve.action.phpstan.php new file mode 100644 index 0000000..5b14193 --- /dev/null +++ b/inc/lib.improve.action.phpstan.php @@ -0,0 +1,131 @@ +setProperties([ + 'id' => 'phpstan', + 'name' => __('PHPStan'), + 'desc' => __('Analyse php code using PHPStan'), + 'priority' => 910, + 'config' => true, + 'types' => ['plugin'] + ]); + + return true; + } + + public function isConfigured(): bool + { + return true; + } + + public function configure($url): ?string + { + if (!empty($_POST['save'])) { + $this->setSettings([ + 'phpexe_path' => (!empty($_POST['phpexe_path']) ? $_POST['phpexe_path'] : ''), + 'run_level' => (integer) $_POST['run_level'] + ]); + $this->redirect($url); + } + + return + '

' . + '

' . + '

' . + __('If this module does not work you can try to put here directory to php executable (without executable file name).') . + ' C:\path_to\php

' . + '

' . + form::number('run_level', ['min' => 0, 'max' => 9, 'default' => (integer) $this->getSetting('run_level')]) . '

' . + '

' . __('You must enable improve details to view analyse results !') . '

'; + } + + public function closeModule(): ?bool + { + $phpexe_path = $this->getPhpPath(); + if (!empty($phpexe_path)) { + $phpexe_path .= '/'; + } + + if (!$this->writeConf()) { + $this->setError(__('Failed to write phpstan configuration')); + + return false; + } + + $command = sprintf( + '%sphp %s/libs/phpstan.phar analyse --configuration=%s', + $phpexe_path, + dirname(__FILE__), + DC_VAR . '/phpstan.neon' + ); + + try { + exec($command, $output, $error); + + if (!empty($error) && empty($output)) { + throw new Exception('oops'); + } + if (empty($output)) { + $output[] = __('No errors found'); + } + $this->setSuccess(sprintf('
%s
', implode('
', $output))); + + return true; + } catch (Exception $e) { + $this->setError(__('Failed to run phpstan')); + + return false; + } + } + + private function getPhpPath() + { + $phpexe_path = $this->getSetting('phpexe_path'); + if (empty($phpexe_path) && !empty(PHP_BINDIR)) { + $phpexe_path = PHP_BINDIR; + } + + return path::real($phpexe_path); + } + + private function writeConf() + { + $content = + "parameters:\n" . + " level: " . (integer) $this->getSetting('run_level') . "\n\n" . + " paths: \n" . + " - " . $this->module['sroot'] . "\n\n" . + " scanFiles:\n" . + " - " . DC_ROOT . "/index.php\n" . + " scanDirectories:\n" . + " - " . DC_ROOT . "\n" . + " excludePaths:\n" . + " - " . $this->module['sroot'] . "/*/libs/*\n\n" . + " bootstrapFiles:\n" . + " - " . dirname(__FILE__) . "/libs/dc.phpstan.bootstrap.php\n\n" . + " fileExtensions:\n" . + " - php\n" . + " - in\n\n" . + // extra + " checkMissingIterableValueType: false\n" . + " checkGenericClassInNonGenericObjectType: false\n"; + + return file_put_contents(DC_VAR . '/phpstan.neon', $content); + + } +} diff --git a/inc/libs/dc.phpstan.bootstrap.php b/inc/libs/dc.phpstan.bootstrap.php new file mode 100644 index 0000000..dbb01d4 --- /dev/null +++ b/inc/libs/dc.phpstan.bootstrap.php @@ -0,0 +1,41 @@ +