Skip to content

Commit 72a5e9f

Browse files
committed
Merge pull request #3348 from morozov/types
Enforce parameter and return value types in the codebase
2 parents 07abf93 + 7ff15cb commit 72a5e9f

22 files changed

+100
-186
lines changed

UPGRADE.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Upgrade to 3.0
22

3+
## BC BREAK: Changes in the `Doctrine\DBAL\Schema` API
4+
5+
- Column precision no longer defaults to 10. The default value is NULL.
6+
- Asset names are no longer nullable. An empty asset name should be represented as an empty string.
7+
- `Doctrine\DBAL\Schema\AbstractSchemaManager::_getPortableTriggersList()` and `::_getPortableTriggerDefinition()` have been removed.
8+
39
## BC BREAK: Changes in the `Doctrine\DBAL\Event` API
410

511
- `SchemaAlterTableAddColumnEventArgs::addSql()` and the same method in other `SchemaEventArgs`-based classes no longer accept an array of SQL statements. They accept a variadic string.

lib/Doctrine/DBAL/Schema/AbstractAsset.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
abstract class AbstractAsset
2626
{
2727
/** @var string */
28-
protected $_name;
28+
protected $_name = '';
2929

3030
/**
3131
* Namespace of the asset. If none isset the default namespace is assumed.
@@ -138,7 +138,7 @@ public function getName() : string
138138
return $this->_namespace . '.' . $this->_name;
139139
}
140140

141-
return $this->_name ?? '';
141+
return $this->_name;
142142
}
143143

144144
/**
@@ -167,7 +167,7 @@ public function getQuotedName(AbstractPlatform $platform) : string
167167
*/
168168
protected function _generateIdentifierName(array $columnNames, string $prefix = '', int $maxSize = 30) : string
169169
{
170-
$hash = implode('', array_map(static function ($column) {
170+
$hash = implode('', array_map(static function ($column) : string {
171171
return dechex(crc32($column));
172172
}, $columnNames));
173173

lib/Doctrine/DBAL/Schema/AbstractSchemaManager.php

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ public function listTableNames() : array
223223
*
224224
* @return array<int, mixed>
225225
*/
226-
protected function filterAssetNames(array $assetNames)
226+
protected function filterAssetNames(array $assetNames) : array
227227
{
228228
$filter = $this->_conn->getConfiguration()->getSchemaAssetsFilter();
229229
if (! $filter) {
@@ -605,35 +605,6 @@ protected function getPortableNamespaceDefinition(array $namespace) : string
605605
return array_shift($namespace);
606606
}
607607

608-
/**
609-
* @param array<int, array<int, mixed>> $triggers
610-
*
611-
* @return array<int, string>
612-
*/
613-
protected function _getPortableTriggersList(array $triggers)
614-
{
615-
$list = [];
616-
foreach ($triggers as $value) {
617-
$value = $this->_getPortableTriggerDefinition($value);
618-
619-
if (! $value) {
620-
continue;
621-
}
622-
623-
$list[] = $value;
624-
}
625-
626-
return $list;
627-
}
628-
629-
/**
630-
* @param array<string|int, mixed> $trigger
631-
*/
632-
protected function _getPortableTriggerDefinition(array $trigger) : string
633-
{
634-
return array_shift($trigger);
635-
}
636-
637608
/**
638609
* @param array<int, array<string, mixed>> $sequences
639610
*

lib/Doctrine/DBAL/Schema/Column.php

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class Column extends AbstractAsset
2323
protected $_length;
2424

2525
/** @var int|null */
26-
protected $_precision = 10;
26+
protected $_precision;
2727

2828
/** @var int */
2929
protected $_scale = 0;
@@ -106,10 +106,6 @@ public function setLength(?int $length) : self
106106

107107
public function setPrecision(?int $precision) : self
108108
{
109-
if ($precision === null) {
110-
$precision = 10; // defaults to 10 when no precision is given.
111-
}
112-
113109
$this->_precision = $precision;
114110

115111
return $this;
@@ -195,7 +191,7 @@ public function getPrecision() : ?int
195191
return $this->_precision;
196192
}
197193

198-
public function getScale() : ?int
194+
public function getScale() : int
199195
{
200196
return $this->_scale;
201197
}

lib/Doctrine/DBAL/Schema/ForeignKeyConstraint.php

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,12 @@ class ForeignKeyConstraint extends AbstractAsset implements Constraint
5959
* @param array<int, string> $localColumnNames Names of the referencing table columns.
6060
* @param Table|string $foreignTableName Referenced table.
6161
* @param array<int, string> $foreignColumnNames Names of the referenced table columns.
62-
* @param string|null $name Name of the foreign key constraint.
62+
* @param string $name Name of the foreign key constraint.
6363
* @param array<string, mixed> $options Options associated with the foreign key constraint.
6464
*/
65-
public function __construct(array $localColumnNames, $foreignTableName, array $foreignColumnNames, $name = null, array $options = [])
65+
public function __construct(array $localColumnNames, $foreignTableName, array $foreignColumnNames, string $name = '', array $options = [])
6666
{
67-
if ($name !== null) {
68-
$this->_setName($name);
69-
}
67+
$this->_setName($name);
7068

7169
$this->_localColumnNames = $this->createIdentifierMap($localColumnNames);
7270

lib/Doctrine/DBAL/Schema/PostgreSqlSchemaManager.php

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public function determineExistingSchemaSearchPaths() : void
9292
$names = $this->getSchemaNames();
9393
$paths = $this->getSchemaSearchPaths();
9494

95-
$this->existingSchemaPaths = array_filter($paths, static function ($v) use ($names) {
95+
$this->existingSchemaPaths = array_filter($paths, static function ($v) use ($names) : bool {
9696
return in_array($v, $names);
9797
});
9898
}
@@ -161,14 +161,6 @@ protected function _getPortableTableForeignKeyDefinition(array $tableForeignKey)
161161
);
162162
}
163163

164-
/**
165-
* {@inheritdoc}
166-
*/
167-
protected function _getPortableTriggerDefinition(array $trigger) : string
168-
{
169-
return $trigger['trigger_name'];
170-
}
171-
172164
/**
173165
* {@inheritdoc}
174166
*/

lib/Doctrine/DBAL/Schema/SQLAnywhereSchemaManager.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ public function dropDatabase(string $database) : void
4545
parent::dropDatabase($database);
4646
}
4747

48-
public function startDatabase(string $database)
48+
public function startDatabase(string $database) : void
4949
{
5050
assert($this->_platform instanceof SQLAnywherePlatform);
5151
$this->_execSql($this->_platform->getStartDatabaseSQL($database));
5252
}
5353

54-
public function stopDatabase(string $database)
54+
public function stopDatabase(string $database) : void
5555
{
5656
assert($this->_platform instanceof SQLAnywherePlatform);
5757
$this->_execSql($this->_platform->getStopDatabaseSQL($database));

lib/Doctrine/DBAL/Schema/Schema.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -408,8 +408,6 @@ public function visit(Visitor $visitor) : void
408408

409409
/**
410410
* Cloning a Schema triggers a deep clone of all related assets.
411-
*
412-
* @return void
413411
*/
414412
public function __clone()
415413
{

lib/Doctrine/DBAL/Schema/SchemaDiff.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ protected function _toSql(AbstractPlatform $platform, bool $saveMode = false) :
120120
}
121121
}
122122

123-
if ($platform->supportsSequences() === true) {
123+
if ($platform->supportsSequences()) {
124124
foreach ($this->changedSequences as $sequence) {
125125
$sql[] = $platform->getAlterSequenceSQL($sequence);
126126
}

lib/Doctrine/DBAL/Schema/Table.php

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -462,8 +462,8 @@ public function getColumns() : array
462462

463463
$colNames = array_unique(array_merge($pkCols, $fkCols, array_keys($columns)));
464464

465-
uksort($columns, static function ($a, $b) use ($colNames) {
466-
return array_search($a, $colNames) >= array_search($b, $colNames);
465+
uksort($columns, static function ($a, $b) use ($colNames) : int {
466+
return array_search($a, $colNames) <=> array_search($b, $colNames);
467467
});
468468

469469
return $columns;
@@ -580,7 +580,7 @@ public function getUniqueConstraints() : array
580580
*
581581
* @return array<string, ForeignKeyConstraint>
582582
*/
583-
public function getForeignKeys()
583+
public function getForeignKeys() : array
584584
{
585585
return $this->_fkConstraints;
586586
}
@@ -625,8 +625,6 @@ public function visit(Visitor $visitor) : void
625625

626626
/**
627627
* Clone of a Table triggers a deep clone of all affected assets.
628-
*
629-
* @return void
630628
*/
631629
public function __clone()
632630
{

lib/Doctrine/DBAL/Schema/Visitor/SchemaDiffVisitor.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,25 @@ interface SchemaDiffVisitor
1717
/**
1818
* Visit an orphaned foreign key whose table was deleted.
1919
*/
20-
public function visitOrphanedForeignKey(ForeignKeyConstraint $foreignKey);
20+
public function visitOrphanedForeignKey(ForeignKeyConstraint $foreignKey) : void;
2121

2222
/**
2323
* Visit a sequence that has changed.
2424
*/
25-
public function visitChangedSequence(Sequence $sequence);
25+
public function visitChangedSequence(Sequence $sequence) : void;
2626

2727
/**
2828
* Visit a sequence that has been removed.
2929
*/
30-
public function visitRemovedSequence(Sequence $sequence);
30+
public function visitRemovedSequence(Sequence $sequence) : void;
3131

32-
public function visitNewSequence(Sequence $sequence);
32+
public function visitNewSequence(Sequence $sequence) : void;
3333

34-
public function visitNewTable(Table $table);
34+
public function visitNewTable(Table $table) : void;
3535

36-
public function visitNewTableForeignKey(Table $table, ForeignKeyConstraint $foreignKey);
36+
public function visitNewTableForeignKey(Table $table, ForeignKeyConstraint $foreignKey) : void;
3737

38-
public function visitRemovedTable(Table $table);
38+
public function visitRemovedTable(Table $table) : void;
3939

40-
public function visitChangedTable(TableDiff $tableDiff);
40+
public function visitChangedTable(TableDiff $tableDiff) : void;
4141
}

phpcs.xml.dist

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,6 @@
2020
<exclude name="SlevomatCodingStandard.Classes.DisallowLateStaticBindingForConstants.DisallowedLateStaticBindingForConstant"/>
2121
</rule>
2222

23-
<rule ref="SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingParameterTypeHint">
24-
<exclude-pattern>*/lib/*</exclude-pattern>
25-
</rule>
26-
27-
<rule ref="SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingReturnTypeHint">
28-
<exclude-pattern>*/lib/*</exclude-pattern>
29-
</rule>
30-
3123
<rule ref="PSR1.Classes.ClassDeclaration.MultipleClasses">
3224
<exclude-pattern>*/tests/*</exclude-pattern>
3325
</rule>

tests/Doctrine/Tests/DBAL/Driver/AbstractOracleDriver/EasyConnectStringTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public function testFromConnectionParameters(array $params, string $expected) :
2222
}
2323

2424
/**
25-
* @return mixed[]
25+
* @return iterable<string, array<int, mixed>>
2626
*/
2727
public static function connectionParametersProvider() : iterable
2828
{

tests/Doctrine/Tests/DBAL/Functional/ConnectionTest.php

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -285,17 +285,6 @@ public function testTransactionalReturnValue() : void
285285
self::assertEquals(42, $res);
286286
}
287287

288-
/**
289-
* Tests that the quote function accepts DBAL and PDO types.
290-
*/
291-
public function testQuote() : void
292-
{
293-
self::assertEquals(
294-
$this->connection->quote('foo'),
295-
$this->connection->quote('foo')
296-
);
297-
}
298-
299288
public function testPingDoesTriggersConnect() : void
300289
{
301290
$this->connection->close();

tests/Doctrine/Tests/DBAL/Functional/DataAccessTest.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -512,11 +512,9 @@ public function testNativeArrayListSupport() : void
512512
}
513513

514514
/**
515-
* @param string|false $char
516-
*
517515
* @dataProvider getTrimExpressionData
518516
*/
519-
public function testTrimExpression(string $value, int $position, $char, string $expectedResult) : void
517+
public function testTrimExpression(string $value, int $position, ?string $char, string $expectedResult) : void
520518
{
521519
$sql = 'SELECT ' .
522520
$this->connection->getDatabasePlatform()->getTrimExpression($value, $position, $char) . ' AS trimmed ' .

tests/Doctrine/Tests/DBAL/Functional/Schema/SchemaManagerFunctionalTestCase.php

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -293,54 +293,54 @@ public function testListTableColumns() : void
293293

294294
self::assertArrayHasKey('test', $columns);
295295
self::assertEquals(1, array_search('test', $columnsKeys));
296-
self::assertEquals('test', strtolower($columns['test']->getname()));
297-
self::assertInstanceOf(StringType::class, $columns['test']->gettype());
298-
self::assertEquals(255, $columns['test']->getlength());
299-
self::assertEquals(false, $columns['test']->getfixed());
300-
self::assertEquals(false, $columns['test']->getnotnull());
301-
self::assertEquals('expected default', $columns['test']->getdefault());
296+
self::assertEquals('test', strtolower($columns['test']->getName()));
297+
self::assertInstanceOf(StringType::class, $columns['test']->getType());
298+
self::assertEquals(255, $columns['test']->getLength());
299+
self::assertEquals(false, $columns['test']->getFixed());
300+
self::assertEquals(false, $columns['test']->getNotnull());
301+
self::assertEquals('expected default', $columns['test']->getDefault());
302302
self::assertIsArray($columns['test']->getPlatformOptions());
303303

304-
self::assertEquals('foo', strtolower($columns['foo']->getname()));
304+
self::assertEquals('foo', strtolower($columns['foo']->getName()));
305305
self::assertEquals(2, array_search('foo', $columnsKeys));
306-
self::assertInstanceOf(TextType::class, $columns['foo']->gettype());
307-
self::assertEquals(false, $columns['foo']->getunsigned());
308-
self::assertEquals(false, $columns['foo']->getfixed());
309-
self::assertEquals(true, $columns['foo']->getnotnull());
310-
self::assertEquals(null, $columns['foo']->getdefault());
306+
self::assertInstanceOf(TextType::class, $columns['foo']->getType());
307+
self::assertEquals(false, $columns['foo']->getUnsigned());
308+
self::assertEquals(false, $columns['foo']->getFixed());
309+
self::assertEquals(true, $columns['foo']->getNotnull());
310+
self::assertEquals(null, $columns['foo']->getDefault());
311311
self::assertIsArray($columns['foo']->getPlatformOptions());
312312

313-
self::assertEquals('bar', strtolower($columns['bar']->getname()));
313+
self::assertEquals('bar', strtolower($columns['bar']->getName()));
314314
self::assertEquals(3, array_search('bar', $columnsKeys));
315-
self::assertInstanceOf(DecimalType::class, $columns['bar']->gettype());
316-
self::assertEquals(null, $columns['bar']->getlength());
317-
self::assertEquals(10, $columns['bar']->getprecision());
318-
self::assertEquals(4, $columns['bar']->getscale());
319-
self::assertEquals(false, $columns['bar']->getunsigned());
320-
self::assertEquals(false, $columns['bar']->getfixed());
321-
self::assertEquals(false, $columns['bar']->getnotnull());
322-
self::assertEquals(null, $columns['bar']->getdefault());
315+
self::assertInstanceOf(DecimalType::class, $columns['bar']->getType());
316+
self::assertEquals(null, $columns['bar']->getLength());
317+
self::assertEquals(10, $columns['bar']->getPrecision());
318+
self::assertEquals(4, $columns['bar']->getScale());
319+
self::assertEquals(false, $columns['bar']->getUnsigned());
320+
self::assertEquals(false, $columns['bar']->getFixed());
321+
self::assertEquals(false, $columns['bar']->getNotnull());
322+
self::assertEquals(null, $columns['bar']->getDefault());
323323
self::assertIsArray($columns['bar']->getPlatformOptions());
324324

325-
self::assertEquals('baz1', strtolower($columns['baz1']->getname()));
325+
self::assertEquals('baz1', strtolower($columns['baz1']->getName()));
326326
self::assertEquals(4, array_search('baz1', $columnsKeys));
327-
self::assertInstanceOf(DateTimeType::class, $columns['baz1']->gettype());
328-
self::assertEquals(true, $columns['baz1']->getnotnull());
329-
self::assertEquals(null, $columns['baz1']->getdefault());
327+
self::assertInstanceOf(DateTimeType::class, $columns['baz1']->getType());
328+
self::assertEquals(true, $columns['baz1']->getNotnull());
329+
self::assertEquals(null, $columns['baz1']->getDefault());
330330
self::assertIsArray($columns['baz1']->getPlatformOptions());
331331

332-
self::assertEquals('baz2', strtolower($columns['baz2']->getname()));
332+
self::assertEquals('baz2', strtolower($columns['baz2']->getName()));
333333
self::assertEquals(5, array_search('baz2', $columnsKeys));
334-
self::assertContains($columns['baz2']->gettype()->getName(), ['time', 'date', 'datetime']);
335-
self::assertEquals(true, $columns['baz2']->getnotnull());
336-
self::assertEquals(null, $columns['baz2']->getdefault());
334+
self::assertContains($columns['baz2']->getType()->getName(), ['time', 'date', 'datetime']);
335+
self::assertEquals(true, $columns['baz2']->getNotnull());
336+
self::assertEquals(null, $columns['baz2']->getDefault());
337337
self::assertIsArray($columns['baz2']->getPlatformOptions());
338338

339-
self::assertEquals('baz3', strtolower($columns['baz3']->getname()));
339+
self::assertEquals('baz3', strtolower($columns['baz3']->getName()));
340340
self::assertEquals(6, array_search('baz3', $columnsKeys));
341-
self::assertContains($columns['baz3']->gettype()->getName(), ['time', 'date', 'datetime']);
342-
self::assertEquals(true, $columns['baz3']->getnotnull());
343-
self::assertEquals(null, $columns['baz3']->getdefault());
341+
self::assertContains($columns['baz3']->getType()->getName(), ['time', 'date', 'datetime']);
342+
self::assertEquals(true, $columns['baz3']->getNotnull());
343+
self::assertEquals(null, $columns['baz3']->getDefault());
344344
self::assertIsArray($columns['baz3']->getPlatformOptions());
345345
}
346346

0 commit comments

Comments
 (0)