<?xml version="1.0"?>
<psalm
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="https://getpsalm.org/schema/config"
    name="Psalm for Psalm"
    useDocblockTypes="true"
    errorLevel="1"
    strictBinaryOperands="false"
    rememberPropertyAssignmentsAfterCall="true"
    checkForThrowsDocblock="false"
    throwExceptionOnError="0"
    findUnusedCode="true"
    ensureArrayStringOffsetsExist="true"
    ensureArrayIntOffsetsExist="false"
    resolveFromConfigFile="true"
    xsi:schemaLocation="https://getpsalm.org/schema/config config.xsd"
>
    <projectFiles>
        <directory name="src"/>
        <directory name="tests"/>
        <directory name="examples"/>
        <ignoreFiles>
            <file name="src/Psalm/Internal/CallMap.php"/>
            <file name="src/Psalm/Internal/PhpTraverser/CustomTraverser.php"/>
            <file name="tests/ErrorBaselineTest.php"/>
            <file name="vendor/symfony/console/Command/Command.php"/>
            <file name="src/spl_object_id.php"/>
            <file name="src/Psalm/Internal/Stubs/*.php"/>
            <file name="src/Psalm/Internal/Stubs/*.phpstub"/>
            <directory name="tests/fixtures"/>
            <file name="vendor/felixfbecker/advanced-json-rpc/lib/Dispatcher.php" />
            <directory name="vendor/netresearch/jsonmapper" />
            <directory name="vendor/phpunit" />
        </ignoreFiles>
    </projectFiles>

    <ignoreExceptions>
        <class name="UnexpectedValueException"/>
        <class name="InvalidArgumentException"/>
        <class name="LogicException"/>
    </ignoreExceptions>

    <plugins>
        <plugin filename="examples/plugins/FunctionCasingChecker.php"/>
        <pluginClass class="Psalm\PhpUnitPlugin\Plugin"/>
    </plugins>

    <issueHandlers>
        <PossiblyNullOperand errorLevel="suppress"/>

        <DeprecatedMethod>
            <errorLevel type="suppress">
                <directory name="tests" />
                <referencedMethod name="PhpParser\Comment::getFilePos" />
                <referencedMethod name="PhpParser\Comment::getLine" />
            </errorLevel>
        </DeprecatedMethod>
        <DeprecatedClass>
            <errorLevel type="suppress">
                <referencedClass name="PackageVersions\Versions"/>
            </errorLevel>
        </DeprecatedClass>

        <UnusedParam>
            <errorLevel type="suppress">
                <directory name="examples"/>
            </errorLevel>
        </UnusedParam>

        <PossiblyUnusedParam>
            <errorLevel type="suppress">
                <directory name="examples"/>
            </errorLevel>
            <errorLevel type="info">
                <directory name="src/Psalm/Type/Atomic"/>
            </errorLevel>
        </PossiblyUnusedParam>

        <UnusedClass>
            <errorLevel type="suppress">
                <directory name="examples"/>
                <directory name="src/Psalm/Internal/Fork" />
                <file name="src/Psalm/Plugin/Shepherd.php" />
                <file name="src/Psalm/Plugin/Hook/MethodReturnTypeProviderInterface.php"/>
            </errorLevel>
        </UnusedClass>

        <UnusedProperty>
            <errorLevel type="info">
                <file name="src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php"/>
            </errorLevel>
        </UnusedProperty>

        <PossiblyUnusedProperty>
            <errorLevel type="info">
                <file name="src/Psalm/Internal/LanguageServer/LanguageClient.php"/>
                <file name="src/Psalm/Storage/FunctionLikeStorage.php"/>
                <file name="src/Psalm/Type/Atomic/TCallableArray.php"/>
                <file name="src/Psalm/Type/Atomic/TNonEmptyArray.php"/>
                <file name="src/Psalm/Storage/PropertyStorage.php"/>
            </errorLevel>
        </PossiblyUnusedProperty>

        <MissingConstructor>
            <errorLevel type="suppress">
                <directory name="tests"/>
            </errorLevel>
        </MissingConstructor>

        <MissingThrowsDocblock errorLevel="info"/>

        <PossiblyUnusedMethod>
            <errorLevel type="info">
                <file name="src/Psalm/Internal/Provider/FileReferenceProvider.php" />
            </errorLevel>
            <errorLevel type="suppress">
                <directory name="src/Psalm/Plugin"/>
                <directory name="src/Psalm/SourceControl/Git/"/>
                <file name="src/Psalm/Internal/LanguageServer/Client/TextDocument.php"/>
                <file name="src/Psalm/Internal/LanguageServer/Server/TextDocument.php"/>
                <referencedMethod name="Psalm\Codebase::getParentInterfaces"/>
                <referencedMethod name="Psalm\Codebase::getMethodParams"/>
                <referencedMethod name="Psalm\Codebase::getMethodReturnType"/>
                <referencedMethod name="Psalm\Codebase::getMethodReturnTypeLocation"/>
                <referencedMethod name="Psalm\Codebase::getDeclaringMethodId"/>
                <referencedMethod name="Psalm\Codebase::getAppearingMethodId"/>
                <referencedMethod name="Psalm\Codebase::getOverriddenMethodIds"/>
                <referencedMethod name="Psalm\Codebase::getCasedMethodId"/>
                <referencedMethod name="Psalm\Codebase::createClassLikeStorage"/>
                <referencedMethod name="Psalm\Codebase::isVariadic"/>
                <referencedMethod name="Psalm\Codebase::getMethodReturnsByRef"/>
            </errorLevel>
        </PossiblyUnusedMethod>

        <InternalMethod>
            <errorLevel type="suppress">
                <directory name="tests"/>
            </errorLevel>
        </InternalMethod>

        <PossiblyUndefinedStringArrayOffset>
            <errorLevel type="suppress">
                <directory name="src/Psalm/Internal/Provider/ReturnTypeProvider" />
                <file name="src/Psalm/Internal/Type/AssertionReconciler.php" />
                <file name="src/Psalm/Internal/Type/NegatedAssertionReconciler.php" />
                <file name="src/Psalm/Internal/Type/SimpleAssertionReconciler.php" />
                <file name="src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php" />
                <directory name="tests"/>
            </errorLevel>
        </PossiblyUndefinedStringArrayOffset>
    </issueHandlers>
</psalm>
