From 5533f24536e78841f28215599ae0e6551c9c768b Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Wed, 29 Jun 2022 20:52:53 +0200 Subject: [PATCH] added php 7.3 support (#369) Co-authored-by: Markus Staab --- .github/workflows/tests.yml | 4 +++ composer.json | 2 +- src/Ast/ExpressionFinder.php | 5 +++- src/DbSchema/SchemaHasherMysql.php | 5 +++- ...tatementExecuteTypeSpecifyingExtension.php | 5 +++- ...entSetFetchModeTypeSpecifyingExtension.php | 5 +++- src/PdoReflection/PdoStatementObjectType.php | 5 +++- src/QueryReflection/BasePdoQueryReflector.php | 21 ++++++++++----- src/QueryReflection/MysqliQueryReflector.php | 12 ++++++--- .../ReplayAndRecordingQueryReflector.php | 27 ++++++++++++++----- src/TypeMapping/MysqliTypeMapper.php | 9 ++++--- ...eparedStatementMethodRuleReflectorTest.php | 4 +++ ...ntMethodSubclassedRulePdoReflectorTest.php | 8 ++++++ ...rorInQueryFunctionRulePdoReflectorTest.php | 4 +++ .../SyntaxErrorInQueryMethodRuleTest.php | 4 +++ ...ryMethodSubclassedRulePdoReflectorTest.php | 4 +++ 16 files changed, 100 insertions(+), 24 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 17a5f676c..438cf3787 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -16,6 +16,10 @@ jobs: fail-fast: false matrix: include: + - php-version: "7.3" + db-image: 'mysql:5.7' + reflector: "pdo-mysql" + mode: "recording" - php-version: "7.4" db-image: 'mysql:8.0' reflector: "pdo-mysql" diff --git a/composer.json b/composer.json index 090234e4b..6066e8e0a 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,7 @@ "type": "phpstan-extension", "license": "MIT", "require": { - "php": "^7.4 || ^8.0", + "php": "^7.3 || ^8.0", "composer-runtime-api": "^2.0", "composer/semver": "^3.2", "phpstan/phpstan": "^1.5.6" diff --git a/src/Ast/ExpressionFinder.php b/src/Ast/ExpressionFinder.php index 97bfcd0ec..9904d029d 100644 --- a/src/Ast/ExpressionFinder.php +++ b/src/Ast/ExpressionFinder.php @@ -15,7 +15,10 @@ final class ExpressionFinder { - private NodeFinder $nodeFinder; + /** + * @var NodeFinder + */ + private $nodeFinder; public function __construct() { diff --git a/src/DbSchema/SchemaHasherMysql.php b/src/DbSchema/SchemaHasherMysql.php index 7e098c97f..214810977 100644 --- a/src/DbSchema/SchemaHasherMysql.php +++ b/src/DbSchema/SchemaHasherMysql.php @@ -15,7 +15,10 @@ final class SchemaHasherMysql */ private $connection; - private ?string $hash = null; + /** + * @var string|null + */ + private $hash = null; /** * @param PDO|mysqli $connection diff --git a/src/Extensions/PdoStatementExecuteTypeSpecifyingExtension.php b/src/Extensions/PdoStatementExecuteTypeSpecifyingExtension.php index e6b1c487f..577f56e45 100644 --- a/src/Extensions/PdoStatementExecuteTypeSpecifyingExtension.php +++ b/src/Extensions/PdoStatementExecuteTypeSpecifyingExtension.php @@ -20,7 +20,10 @@ final class PdoStatementExecuteTypeSpecifyingExtension implements MethodTypeSpecifyingExtension, TypeSpecifierAwareExtension { - private TypeSpecifier $typeSpecifier; + /** + * @var TypeSpecifier + */ + private $typeSpecifier; public function getClass(): string { diff --git a/src/Extensions/PdoStatementSetFetchModeTypeSpecifyingExtension.php b/src/Extensions/PdoStatementSetFetchModeTypeSpecifyingExtension.php index 724f5a7c9..c4101b5cc 100644 --- a/src/Extensions/PdoStatementSetFetchModeTypeSpecifyingExtension.php +++ b/src/Extensions/PdoStatementSetFetchModeTypeSpecifyingExtension.php @@ -18,7 +18,10 @@ final class PdoStatementSetFetchModeTypeSpecifyingExtension implements MethodTypeSpecifyingExtension, TypeSpecifierAwareExtension { - private TypeSpecifier $typeSpecifier; + /** + * @var TypeSpecifier + */ + private $typeSpecifier; public function getClass(): string { diff --git a/src/PdoReflection/PdoStatementObjectType.php b/src/PdoReflection/PdoStatementObjectType.php index 14952f923..2654606c0 100644 --- a/src/PdoReflection/PdoStatementObjectType.php +++ b/src/PdoReflection/PdoStatementObjectType.php @@ -25,7 +25,10 @@ class PdoStatementObjectType extends GenericObjectType { - private Type $bothType; + /** + * @var Type + */ + private $bothType; /** * @param QueryReflector::FETCH_TYPE* $fetchType diff --git a/src/QueryReflection/BasePdoQueryReflector.php b/src/QueryReflection/BasePdoQueryReflector.php index ce874df97..67ece09c2 100644 --- a/src/QueryReflection/BasePdoQueryReflector.php +++ b/src/QueryReflection/BasePdoQueryReflector.php @@ -50,18 +50,27 @@ abstract class BasePdoQueryReflector implements QueryReflector, RecordingReflect /** * @var array|null> */ - protected array $cache = []; + protected $cache = []; - protected TypeMapper $typeMapper; + /** + * @var TypeMapper + */ + protected $typeMapper; - // @phpstan-ignore-next-line - protected ?PDOStatement $stmt = null; + /** + * @var PDOStatement|null + * @phpstan-ignore-next-line + */ + protected $stmt = null; /** * @var array>> */ - protected array $emulatedFlags = []; + protected $emulatedFlags = []; - protected PDO $pdo; + /** + * @var PDO + */ + protected $pdo; public function __construct(PDO $pdo, TypeMapper $typeMapper) { diff --git a/src/QueryReflection/MysqliQueryReflector.php b/src/QueryReflection/MysqliQueryReflector.php index 584d24588..630ccf5fd 100644 --- a/src/QueryReflection/MysqliQueryReflector.php +++ b/src/QueryReflection/MysqliQueryReflector.php @@ -32,11 +32,17 @@ final class MysqliQueryReflector implements QueryReflector, RecordingReflector private const MAX_CACHE_SIZE = 50; /** @var array|null> */ - private array $cache = []; + private $cache = []; - private mysqli $db; + /** + * @var mysqli + */ + private $db; - private MysqliTypeMapper $typeMapper; + /** + * @var MysqliTypeMapper + */ + private $typeMapper; public function __construct(mysqli $mysqli) { diff --git a/src/QueryReflection/ReplayAndRecordingQueryReflector.php b/src/QueryReflection/ReplayAndRecordingQueryReflector.php index 7acc3a6c3..66fe01769 100644 --- a/src/QueryReflection/ReplayAndRecordingQueryReflector.php +++ b/src/QueryReflection/ReplayAndRecordingQueryReflector.php @@ -11,12 +11,27 @@ final class ReplayAndRecordingQueryReflector implements QueryReflector, RecordingReflector { - private ReplayQueryReflector $replayReflector; - - private ?RecordingQueryReflector $recordingReflector = null; - private QueryReflector $queryReflector; - private ReflectionCache $reflectionCache; - private SchemaHasherMysql $schemaHasher; + /** + * @var ReplayQueryReflector + */ + private $replayReflector; + + /** + * @var RecordingQueryReflector|null + */ + private $recordingReflector = null; + /** + * @var QueryReflector + */ + private $queryReflector; + /** + * @var ReflectionCache + */ + private $reflectionCache; + /** + * @var SchemaHasherMysql + */ + private $schemaHasher; public function __construct(ReflectionCache $reflectionCache, QueryReflector $queryReflector, SchemaHasherMysql $schemaHasher) { diff --git a/src/TypeMapping/MysqliTypeMapper.php b/src/TypeMapping/MysqliTypeMapper.php index 557d9665a..8cb448a9f 100644 --- a/src/TypeMapping/MysqliTypeMapper.php +++ b/src/TypeMapping/MysqliTypeMapper.php @@ -10,12 +10,15 @@ final class MysqliTypeMapper { /** @var array */ - private array $nativeTypes = []; + private $nativeTypes = []; /** @var array */ - private array $nativeFlags = []; + private $nativeFlags = []; - private MysqlTypeMapper $typeMapper; + /** + * @var MysqlTypeMapper + */ + private $typeMapper; public function __construct() { diff --git a/tests/rules/SyntaxErrorInPreparedStatementMethodRuleReflectorTest.php b/tests/rules/SyntaxErrorInPreparedStatementMethodRuleReflectorTest.php index 952b16f7f..961755102 100644 --- a/tests/rules/SyntaxErrorInPreparedStatementMethodRuleReflectorTest.php +++ b/tests/rules/SyntaxErrorInPreparedStatementMethodRuleReflectorTest.php @@ -25,6 +25,10 @@ public static function getAdditionalConfigFiles(): array public function testSyntaxErrorInQueryRule(): void { + if (\PHP_VERSION_ID < 70400) { + self::markTestSkipped('Test requires PHP 7.4.'); + } + if ('mysqli' === getenv('DBA_REFLECTOR')) { $expectedErrors = [ [ diff --git a/tests/rules/SyntaxErrorInPreparedStatementMethodSubclassedRulePdoReflectorTest.php b/tests/rules/SyntaxErrorInPreparedStatementMethodSubclassedRulePdoReflectorTest.php index fb9482027..bf72aceca 100644 --- a/tests/rules/SyntaxErrorInPreparedStatementMethodSubclassedRulePdoReflectorTest.php +++ b/tests/rules/SyntaxErrorInPreparedStatementMethodSubclassedRulePdoReflectorTest.php @@ -25,6 +25,10 @@ public static function getAdditionalConfigFiles(): array public function testSyntaxErrorInQueryRule(): void { + if (\PHP_VERSION_ID < 70400) { + self::markTestSkipped('Test requires PHP 7.4.'); + } + if ('pdo-mysql' !== getenv('DBA_REFLECTOR')) { $this->markTestSkipped('Only works with PdoMysqlQueryReflector'); } @@ -49,6 +53,10 @@ public function testSyntaxErrorInQueryRule(): void public function testSyntaxErrorInPgsqlQueryRule(): void { + if (\PHP_VERSION_ID < 70400) { + self::markTestSkipped('Test requires PHP 7.4.'); + } + if ('pdo-pgsql' !== getenv('DBA_REFLECTOR')) { $this->markTestSkipped('Only works with PdoPgsqlQueryReflector'); } diff --git a/tests/rules/SyntaxErrorInQueryFunctionRulePdoReflectorTest.php b/tests/rules/SyntaxErrorInQueryFunctionRulePdoReflectorTest.php index 563b5624b..6ec9d3f9d 100644 --- a/tests/rules/SyntaxErrorInQueryFunctionRulePdoReflectorTest.php +++ b/tests/rules/SyntaxErrorInQueryFunctionRulePdoReflectorTest.php @@ -25,6 +25,10 @@ public static function getAdditionalConfigFiles(): array public function testSyntaxErrorInQueryRule(): void { + if (\PHP_VERSION_ID < 70400) { + self::markTestSkipped('Test requires PHP 7.4.'); + } + if ('pdo-mysql' !== getenv('DBA_REFLECTOR')) { $this->markTestSkipped('Only works with PdoMysqlQueryReflector'); } diff --git a/tests/rules/SyntaxErrorInQueryMethodRuleTest.php b/tests/rules/SyntaxErrorInQueryMethodRuleTest.php index 8015963d6..3388ac18c 100644 --- a/tests/rules/SyntaxErrorInQueryMethodRuleTest.php +++ b/tests/rules/SyntaxErrorInQueryMethodRuleTest.php @@ -25,6 +25,10 @@ public static function getAdditionalConfigFiles(): array public function testSyntaxErrorInQueryRule(): void { + if (\PHP_VERSION_ID < 70400) { + self::markTestSkipped('Test requires PHP 7.4.'); + } + if ('mysqli' === getenv('DBA_REFLECTOR')) { $expected = [ [ diff --git a/tests/rules/SyntaxErrorInQueryMethodSubclassedRulePdoReflectorTest.php b/tests/rules/SyntaxErrorInQueryMethodSubclassedRulePdoReflectorTest.php index 263186963..8fb82b802 100644 --- a/tests/rules/SyntaxErrorInQueryMethodSubclassedRulePdoReflectorTest.php +++ b/tests/rules/SyntaxErrorInQueryMethodSubclassedRulePdoReflectorTest.php @@ -25,6 +25,10 @@ public static function getAdditionalConfigFiles(): array public function testSyntaxErrorInQueryRule(): void { + if (\PHP_VERSION_ID < 70400) { + self::markTestSkipped('Test requires PHP 7.4.'); + } + if ('pdo-mysql' !== getenv('DBA_REFLECTOR')) { $this->markTestSkipped('Only works with PdoMysqlQueryReflector'); }