<?xml version="1.0"?>
<psalm
    errorLevel="2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="https://getpsalm.org/schema/config"
    xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
>
    <projectFiles>
        <directory name="lib/Doctrine/DBAL" />
        <directory name="tests/Doctrine/StaticAnalysis" />
        <directory name="tests/Doctrine/Tests" />
        <ignoreFiles>
            <directory name="vendor" />

            <!-- See https://github.com/doctrine/dbal/pull/3906 -->
            <directory name="lib/Doctrine/DBAL/Sharding" />
            <directory name="tests/Doctrine/Tests/DBAL/Sharding" />
        </ignoreFiles>
    </projectFiles>
    <stubs>
        <file name="vendor/jetbrains/phpstorm-stubs/PDO/PDO.php" />
        <file name="vendor/jetbrains/phpstorm-stubs/ibm_db2/ibm_db2.php" />
        <file name="vendor/jetbrains/phpstorm-stubs/mysqli/mysqli.php" />
        <file name="vendor/jetbrains/phpstorm-stubs/oci8/oci8.php" />
        <file name="vendor/jetbrains/phpstorm-stubs/pgsql/pgsql.php" />
        <file name="vendor/jetbrains/phpstorm-stubs/sqlsrv/sqlsrv.php" />
    </stubs>
    <issueHandlers>
        <ConflictingReferenceConstraint>
            <errorLevel type="suppress">
                <!--
                    This one is just too convoluted for Psalm to figure out, by
                    its author's own admission
                -->
                <file name="lib/Doctrine/DBAL/Driver/OCI8/OCI8Statement.php"/>
            </errorLevel>
        </ConflictingReferenceConstraint>
        <!--
            The library uses its own deprecated APIs for backward compatibility.
            This list of suppressed issues should be revisited each major release.
        -->
        <DeprecatedClass>
            <errorLevel type="suppress">
                <directory name="lib"/>
                <directory name="tests"/>
            </errorLevel>
        </DeprecatedClass>
        <DeprecatedConstant>
            <errorLevel type="suppress">
                <!--
                    This suppression should be removed in 3.0.x
                    See https://github.com/doctrine/dbal/pull/4082
                -->
                <file name="lib/Doctrine/DBAL/Driver/SQLSrv/SQLSrvStatement.php"/>
                <!--
                    These suppressions should be removed in 3.0.x
                    See https://github.com/doctrine/dbal/pull/4082
                -->
                <file name="lib/Doctrine/DBAL/Schema/PostgreSqlSchemaManager.php"/>
                <file name="lib/Doctrine/DBAL/Types/JsonArrayType.php"/>
                <file name="lib/Doctrine/DBAL/Types/Type.php"/>
                <file name="tests/Doctrine/Tests/DBAL/Functional/Schema/PostgreSqlSchemaManagerTest.php"/>
                <file name="tests/Doctrine/Tests/DBAL/Types/JsonArrayTest.php"/>
            </errorLevel>
        </DeprecatedConstant>
        <DeprecatedInterface>
            <errorLevel type="suppress">
                <directory name="lib"/>
                <directory name="tests"/>
            </errorLevel>
        </DeprecatedInterface>
        <DeprecatedMethod>
            <errorLevel type="suppress">
                <directory name="lib"/>
                <directory name="tests"/>
            </errorLevel>
        </DeprecatedMethod>
        <DocblockTypeContradiction>
            <errorLevel type="suppress">
                <!--
                    These issues can be mostly divided in the following categories:
                      1. Union types not supported at the language level (require dropping PHP 7 support)
                      2. Associative arrays with typed elements used instead of classes (require breaking API changes)
                -->
                <file name="lib/Doctrine/DBAL/Connection.php"/>
                <file name="lib/Doctrine/DBAL/Driver/IBMDB2/DB2Statement.php"/>
                <file name="lib/Doctrine/DBAL/Driver/Mysqli/MysqliStatement.php"/>
                <file name="lib/Doctrine/DBAL/Driver/SQLAnywhere/SQLAnywhereStatement.php"/>
                <file name="lib/Doctrine/DBAL/DriverManager.php"/>
                <file name="lib/Doctrine/DBAL/Platforms/AbstractPlatform.php"/>
                <file name="lib/Doctrine/DBAL/Platforms/DrizzlePlatform.php"/>
                <file name="lib/Doctrine/DBAL/Platforms/MySqlPlatform.php"/>
                <file name="lib/Doctrine/DBAL/Platforms/SQLAnywherePlatform.php"/>
                <file name="lib/Doctrine/DBAL/Platforms/SQLServerPlatform.php"/>
                <file name="lib/Doctrine/DBAL/Platforms/SqlitePlatform.php"/>
                <file name="lib/Doctrine/DBAL/Schema/Column.php"/>
                <!--
                    These issues are fixed in 3.0
                -->
                <file name="tests/Doctrine/Tests/DBAL/Driver/PDO/ExceptionTest.php"/>
                <file name="tests/Doctrine/Tests/DBAL/Functional/PortabilityTest.php"/>
                <!--
                    This issue is fixed in 4.0
                -->
                <file name="lib/Doctrine/DBAL/Schema/Index.php"/>
            </errorLevel>
        </DocblockTypeContradiction>
        <DuplicateClass>
            <errorLevel type="suppress">
                <!-- These files contain a php 7 and a php 8 version of the same trait -->
                <file name="lib/Doctrine/DBAL/Driver/PDOQueryImplementation.php"/>
                <file name="lib/Doctrine/DBAL/Driver/PDOStatementImplementations.php"/>
            </errorLevel>
        </DuplicateClass>
        <FalsableReturnStatement>
            <errorLevel type="suppress">
                <!--
                    Fixing these issues requires an API change
                -->
                <file name="lib/Doctrine/DBAL/Driver/PDOSqlsrv/Connection.php"/>
                <file name="lib/Doctrine/DBAL/Driver/SQLAnywhere/SQLAnywhereConnection.php"/>
                <file name="lib/Doctrine/DBAL/Driver/SQLSrv/SQLSrvConnection.php"/>
            </errorLevel>
        </FalsableReturnStatement>
        <ForbiddenCode>
            <errorLevel type="suppress">
                <!-- See https://github.com/doctrine/dbal/pull/3934 -->
                <file name="lib/Doctrine/DBAL/Logging/EchoSQLLogger.php"/>

                <!-- The call to var_dump() here is by design -->
                <file name="lib/Doctrine/DBAL/Tools/Dumper.php"/>
            </errorLevel>
        </ForbiddenCode>
        <ImplicitToStringCast>
            <errorLevel type="suppress">
                <!-- See https://github.com/doctrine/dbal/pull/4082 -->
                <file name="lib/Doctrine/DBAL/Schema/Visitor/Graphviz.php"/>
            </errorLevel>
        </ImplicitToStringCast>
        <ImplementedReturnTypeMismatch>
            <errorLevel type="suppress">
                <!-- See https://github.com/doctrine/dbal/pull/3906 -->
                <file name="lib/Doctrine/DBAL/Driver/DrizzlePDOMySql/Driver.php"/>

                <!-- See https://github.com/doctrine/dbal/pull/4030 -->
                <file name="lib/Doctrine/DBAL/Driver/Mysqli/MysqliConnection.php"/>
                <file name="lib/Doctrine/DBAL/Driver/Mysqli/MysqliStatement.php"/>

                <!-- See https://github.com/doctrine/dbal/pull/3080 -->
                <file name="lib/Doctrine/DBAL/Driver/PDOConnection.php"/>
                <file name="lib/Doctrine/DBAL/Driver/PDOQueryImplementation.php"/>
                <file name="lib/Doctrine/DBAL/Driver/PDOStatementImplementations.php"/>

                <!-- See https://github.com/doctrine/dbal/issues/4156 -->
                <file name="lib/Doctrine/DBAL/Portability/Connection.php"/>

                <!-- Fixing this issue requires an API change -->
                <file name="lib/Doctrine/DBAL/Driver/OCI8/OCI8Connection.php"/>
            </errorLevel>
        </ImplementedReturnTypeMismatch>
        <InvalidNullableReturnType>
            <errorLevel type="suppress">
                <!-- See https://github.com/doctrine/dbal/pull/4082 -->
                <file name="lib/Doctrine/DBAL/Driver/AbstractSQLiteDriver.php"/>
                <!-- See https://github.com/doctrine/dbal/issues/4503 -->
                <file name="lib/Doctrine/DBAL/Schema/PostgreSqlSchemaManager.php"/>
            </errorLevel>
        </InvalidNullableReturnType>
        <InvalidPropertyAssignmentValue>
            <errorLevel type="suppress">
                <!-- Fixing this issue requires an API change -->
                <file name="lib/Doctrine/DBAL/Driver/PDOException.php"/>

                <!-- See https://github.com/doctrine/dbal/pull/3548 -->
                <file name="lib/Doctrine/DBAL/Connection.php"/>
            </errorLevel>
        </InvalidPropertyAssignmentValue>
        <MethodSignatureMismatch>
            <errorLevel type="suppress">
                <!--
                    This one is clearly deliberate; it's a hack to adapt \PDO to
                    Doctrine\DBAL\Driver\Connection
                -->
                <file name="lib/Doctrine/DBAL/Driver/PDOConnection.php"/>
                <file name="lib/Doctrine/DBAL/Driver/PDOQueryImplementation.php"/>
                <file name="lib/Doctrine/DBAL/Driver/PDOStatementImplementations.php"/>
            </errorLevel>
        </MethodSignatureMismatch>
        <MissingConstructor>
            <errorLevel type="suppress">
                <!--
                    This suppression should be removed in 3.1.x
                    See https://github.com/doctrine/dbal/issues/4512
                -->
                <file name="lib/Doctrine/DBAL/Driver/SQLSrv/LastInsertId.php"/>
                <!--
                    This suppression should be removed in 4.0.x
                    See https://github.com/doctrine/dbal/pull/3712
                -->
                <file name="lib/Doctrine/DBAL/Schema/SchemaConfig.php"/>
            </errorLevel>
        </MissingConstructor>
        <NonInvariantDocblockPropertyType>
            <errorLevel type="suppress">
                <!--
                   This suppression should be removed in 3.0.x
                   https://github.com/doctrine/dbal/pull/4007
                -->
                <file name="tests/Doctrine/Tests/DBAL/Functional/Connection/BackwardCompatibility/Statement.php"/>
            </errorLevel>
        </NonInvariantDocblockPropertyType>
        <NullableReturnStatement>
            <errorLevel type="suppress">
                <!--
                    Fixing this issue requires an API change
                -->
                <file name="lib/Doctrine/DBAL/Driver/AbstractSQLiteDriver.php"/>
                <!-- See https://github.com/doctrine/dbal/issues/4503 -->
                <file name="lib/Doctrine/DBAL/Schema/PostgreSqlSchemaManager.php"/>
            </errorLevel>
        </NullableReturnStatement>
        <ParamNameMismatch>
            <errorLevel type="suppress">
                <!--
                    These traits contain implementations for different PHP versions in order to handle a signature
                    change. At least one of the implementations won't match the signature expected by Psalm.
                -->
                <file name="lib/Doctrine/DBAL/Driver/PDOQueryImplementation.php"/>
                <file name="lib/Doctrine/DBAL/Driver/PDOStatementImplementations.php"/>
            </errorLevel>
        </ParamNameMismatch>
        <PossiblyInvalidOperand>
            <errorLevel type="suppress">
                <!--
                    This code relies on certain elements of a mixed-type array to be of a certain type.
                -->
                <file name="lib/Doctrine/DBAL/SQLParserUtils.php"/>
            </errorLevel>
        </PossiblyInvalidOperand>
        <PossiblyUndefinedArrayOffset>
            <errorLevel type="suppress">
                <!-- See https://github.com/doctrine/dbal/pull/3606 -->
                <file name="lib/Doctrine/DBAL/Driver/AbstractDB2Driver.php"/>
                <file name="lib/Doctrine/DBAL/Driver/AbstractOracleDriver.php"/>

                <!-- See https://github.com/psalm/psalm-plugin-phpunit/pull/82 -->
                <file name="tests/Doctrine/Tests/DBAL/Connections/MasterSlaveConnectionTest.php"/>
                <file name="tests/Doctrine/Tests/DBAL/Functional/MasterSlaveConnectionTest.php"/>
                <file name="tests/Doctrine/Tests/DBAL/Functional/PrimaryReadReplicaConnectionTest.php"/>
                <file name="tests/Doctrine/Tests/DBAL/Functional/Schema/PostgreSqlSchemaManagerTest.php"/>
            </errorLevel>
        </PossiblyUndefinedArrayOffset>
        <PossiblyNullArgument>
            <errorLevel type="suppress">
                <!--
                    This suppression should be removed in 3.0.x
                    See https://github.com/doctrine/dbal/pull/3488
                -->
                <file name="lib/Doctrine/DBAL/Schema/AbstractSchemaManager.php"/>
                <!--
                    This suppression should be removed in 3.0.x
                    See https://github.com/doctrine/dbal/pull/4157
                -->
                <file name="lib/Doctrine/DBAL/Portability/Statement.php"/>
            </errorLevel>
        </PossiblyNullArgument>
        <PossiblyNullIterator>
            <errorLevel type="suppress">
                <!--
                    This suppression should be removed in 4.0.x
                    See https://github.com/doctrine/dbal/pull/3712
                -->
                <file name="lib/Doctrine/DBAL/Driver/Mysqli/MysqliStatement.php"/>
            </errorLevel>
        </PossiblyNullIterator>
        <PossiblyFalseReference>
            <errorLevel type="suppress">
                <!--
                    oci_new_descriptor() returns OCI-Lob|false on PHP 7 and OCILob|null on PHP 8
                -->
                <file name="lib/Doctrine/DBAL/Driver/OCI8/OCI8Statement.php"/>
            </errorLevel>
        </PossiblyFalseReference>
        <PropertyNotSetInConstructor>
            <errorLevel type="suppress">
                <!-- See https://github.com/psalm/psalm-plugin-phpunit/issues/107 -->
                <!-- See https://github.com/sebastianbergmann/phpunit/pull/4610 -->
                <directory name="tests"/>
                <!-- See https://github.com/doctrine/dbal/issues/4506 -->
                <file name="lib/Doctrine/DBAL/Schema/ForeignKeyConstraint.php"/>
                <!--
                    This suppression should be removed in 3.0.x
                    See https://github.com/doctrine/dbal/pull/3803
                -->
                <file name="lib/Doctrine/DBAL/Driver/PDO/SQLSrv/Statement.php"/>
                <file name="lib/Doctrine/DBAL/Driver/PDO/Statement.php"/>
                <file name="lib/Doctrine/DBAL/Driver/PDOSqlsrv/Statement.php"/>
                <file name="lib/Doctrine/DBAL/Driver/PDOStatement.php"/>
                <!--
                    This suppression should be removed in 4.0.x
                    See https://github.com/doctrine/dbal/pull/3712
                -->
                <file name="lib/Doctrine/DBAL/Schema/Column.php"/>
                <file name="lib/Doctrine/DBAL/Schema/Identifier.php"/>
                <file name="lib/Doctrine/DBAL/Schema/Index.php"/>
                <file name="lib/Doctrine/DBAL/Schema/Schema.php"/>
                <file name="lib/Doctrine/DBAL/Schema/Sequence.php"/>
                <file name="lib/Doctrine/DBAL/Schema/Table.php"/>
                <file name="lib/Doctrine/DBAL/Schema/View.php"/>
            </errorLevel>
        </PropertyNotSetInConstructor>
        <!-- This is necessary pre 4.0  -->
        <RedundantCastGivenDocblockType>
            <errorLevel type="suppress">
                <!--
                    This suppression should be removed in 4.0.x
                    where we have scalar argument types enforced
                -->
                <directory name="lib"/>
            </errorLevel>
        </RedundantCastGivenDocblockType>
        <RedundantConditionGivenDocblockType>
            <errorLevel type="suppress">
                <!--
                    Fixing these issues requires support of union types at the language level
                    or breaking API changes.
                -->
                <file name="lib/Doctrine/DBAL/Platforms/DrizzlePlatform.php"/>
                <file name="lib/Doctrine/DBAL/Platforms/MySqlPlatform.php"/>
                <!--
                    These issues are fixed in 3.0
                -->
                <file name="lib/Doctrine/DBAL/Tools/Console/ConsoleRunner.php"/>
                <file name="tests/Doctrine/Tests/DBAL/Functional/PortabilityTest.php"/>
            </errorLevel>
        </RedundantConditionGivenDocblockType>
        <ReferenceConstraintViolation>
            <errorLevel type="suppress">
                <!--
                    This suppression should be removed in 4.0.x
                    See https://github.com/doctrine/dbal/pull/3836
                -->
                <file name="lib/Doctrine/DBAL/Query/QueryBuilder.php"/>
            </errorLevel>
        </ReferenceConstraintViolation>
        <ReservedWord>
            <errorLevel type="suppress">
                <!-- This file uses the mixed type in a PHP 8 forward compatibility layer. -->
                <file name="lib/Doctrine/DBAL/Driver/PDOQueryImplementation.php"/>
            </errorLevel>
        </ReservedWord>
        <TooManyArguments>
            <errorLevel type="suppress">
                <!-- See https://github.com/doctrine/dbal/pull/3080 -->
                <file name="lib/Doctrine/DBAL/Connection.php"/>
                <file name="tests/Doctrine/Tests/DBAL/Functional/Driver/PDOPgSql/DriverTest.php"/>

                <!-- See https://github.com/doctrine/dbal/pull/3562 -->
                <file name="lib/Doctrine/DBAL/Schema/AbstractSchemaManager.php"/>
                <file name="lib/Doctrine/DBAL/Schema/SqliteSchemaManager.php"/>
            </errorLevel>
        </TooManyArguments>
        <UndefinedConstant>
            <errorLevel type="suppress">
                <directory name="lib/Doctrine/DBAL/Driver/SQLAnywhere"/>
            </errorLevel>
        </UndefinedConstant>
        <UndefinedFunction>
            <errorLevel type="suppress">
                <directory name="lib/Doctrine/DBAL/Driver/SQLAnywhere"/>
            </errorLevel>
        </UndefinedFunction>
        <UndefinedClass>
            <errorLevel type="suppress">
                <!-- Contains references to optional dependencies -->
                <file name="lib/Doctrine/DBAL/Tools/Dumper.php"/>
            </errorLevel>
        </UndefinedClass>
        <UnimplementedInterfaceMethod>
            <errorLevel type="suppress">
                <!--
                    Psalm doesn't support the proprietary annotations used in JeBrains PhpStorm stubs
                    like #[PhpStormStubsElementAvailable(...)]. This suppression should be removed in 3.0.x,
                    where https://github.com/doctrine/dbal/pull/4347 is no longer effective
                -->
                <file name="lib/Doctrine/DBAL/Driver/PDO/SQLSrv/Statement.php"/>
                <file name="lib/Doctrine/DBAL/Driver/PDO/Statement.php"/>
                <file name="lib/Doctrine/DBAL/Driver/PDOSqlsrv/Statement.php"/>
                <file name="lib/Doctrine/DBAL/Driver/PDOStatement.php"/>
            </errorLevel>
        </UnimplementedInterfaceMethod>
        <UnsafeInstantiation>
            <errorLevel type="suppress">
                <!-- See https://github.com/doctrine/dbal/issues/4510 -->
                <file name="lib/Doctrine/DBAL/Platforms/AbstractPlatform.php"/>
                <file name="lib/Doctrine/DBAL/Tools/Console/Command/ReservedWordsCommand.php"/>
                <!-- See https://github.com/doctrine/dbal/issues/4511 -->
                <file name="lib/Doctrine/DBAL/DriverManager.php"/>
            </errorLevel>
        </UnsafeInstantiation>
        <InvalidArgument>
            <errorLevel type="suppress">
                <!-- See https://github.com/doctrine/dbal/pull/3803 -->
                <file name="tests/Doctrine/Tests/DBAL/ConnectionTest.php"/>
                <file name="tests/Doctrine/Tests/DBAL/DriverManagerTest.php"/>
            </errorLevel>
        </InvalidArgument>
        <InvalidReturnType>
            <errorLevel type="suppress">
                <!-- lastInsertId has a return type that does not match the one defined in the interface-->
                <file name="lib/Doctrine/DBAL/Driver/Mysqli/MysqliConnection.php"/>
            </errorLevel>
        </InvalidReturnType>
        <InvalidScalarArgument>
            <errorLevel type="suppress">
                <!-- See https://github.com/doctrine/dbal/pull/3498 -->
                <file name="tests/Doctrine/Tests/DBAL/Functional/DataAccessTest.php"/>
                <file name="tests/Doctrine/Tests/DBAL/Platforms/AbstractPlatformTestCase.php"/>
                <file name="tests/Doctrine/Tests/DBAL/Platforms/DB2PlatformTest.php"/>
                <file name="tests/Doctrine/Tests/DBAL/Platforms/OraclePlatformTest.php"/>
                <file name="tests/Doctrine/Tests/DBAL/Platforms/SQLAnywherePlatformTest.php"/>
                <file name="tests/Doctrine/Tests/DBAL/Platforms/SqlitePlatformTest.php"/>

                <!-- See https://github.com/doctrine/dbal/pull/3574 -->
                <file name="tests/Doctrine/Tests/DBAL/Query/Expression/ExpressionBuilderTest.php"/>

                <!-- See https://github.com/doctrine/dbal/pull/4007 -->
                <file name="lib/Doctrine/DBAL/Driver/PDOStatement.php"/>

                <!-- See https://github.com/doctrine/dbal/pull/3906 -->
                <file name="tests/Doctrine/Tests/DBAL/Sharding/PoolingShardManagerTest.php"/>
                <file name="tests/Doctrine/Tests/DBAL/Sharding/SQLAzure/FunctionalTest.php"/>
                <file name="tests/Doctrine/Tests/DBAL/Sharding/SQLAzure/SQLAzureShardManagerTest.php"/>

                <!-- See https://github.com/doctrine/dbal/pull/3241 -->
                <file name="lib/Doctrine/DBAL/Tools/Console/Command/ImportCommand.php"/>

                <!-- See https://github.com/doctrine/dbal/issues/4318 -->
                <file name="lib/Doctrine/DBAL/Types/ConversionException.php"/>

                <!-- See https://bugs.php.net/bug.php?id=77591 -->
                <referencedFunction name="db2_autocommit"/>
            </errorLevel>
        </InvalidScalarArgument>
        <InvalidReturnStatement>
            <errorLevel type="suppress">
                <!-- lastInsertId has a return type that does not match the one defined in the interface-->
                <file name="lib/Doctrine/DBAL/Driver/Mysqli/MysqliConnection.php"/>
            </errorLevel>
        </InvalidReturnStatement>
    </issueHandlers>
</psalm>
