includes:
     - 'vendor/symplify/phpstan-extensions/config/config.neon'
     - 'vendor/thecodingmachine/phpstan-strict-rules/phpstan-strict-rules.neon'
     - 'vendor/thecodingmachine/phpstan-safe-rule/phpstan-safe-rule.neon'

parameters:
    # to allow intalling with various phsptan versions without reporting old errors here
    reportUnmatchedIgnoredErrors: false

    excludes_analyse:
        # test files
        - '*packages/NodeTypeResolver/tests/Source/AnotherClass.php'
        - '*tests/Rector/MethodCall/MethodNameReplacerRector/**/SomeClass.php'
        - '*packages/BetterReflection/tests/Reflector/NotLoadedSource/SomeClass.php'
        - 'packages/NodeTypeResolver/tests/PerNodeTypeResolver/VariableTypeResolver/Source/NewClass.php'
        # tests files
        - '*tests/**/Fixture/*'
        - '*tests/**/Source/*'
        # intetionally original
        - 'packages/Php/src/EregToPcreTransformer.php'
        - '*/packages/ContributorTools/templates/*'
        # part of composer
        - 'tests/Composer/AutoloadWrongCasesEventSubscriber.php'

    ignoreErrors:
        # missuse of interface and class
        - '#Parameter \#1 (.*?) expects Symfony\\Component\\DependencyInjection\\ContainerBuilder, Symfony\\Component\\DependencyInjection\\ContainerInterface given#' # 2
        - '#Method Rector\\Symfony\\Bridge\\DefaultAnalyzedSymfonyApplicationContainer::getContainer\(\) should return Symfony\\Component\\DependencyInjection\\ContainerBuilder but returns Symfony\\Component\\DependencyInjection\\Container#' # 1
        - '#(.*?)\(\) should return Psr\\Container\\ContainerInterface but returns Symfony\\Component\\DependencyInjection\\ContainerInterface\|null#'

        # false positives
        - '#Offset string does not exist on string#' # 1
        - '#Array \(array<array<PhpParser\\Node\\Stmt>>\) does not accept array<PhpParser\\Node\\Stmt|null>#'
        - '#Property Rector\\DependencyInjection\\Loader\\RectorServiceParametersShifter::\$serviceKeywords \(array<string>\) does not accept ReflectionProperty#'
        - '#Strict comparison using === between string and null will always evaluate to false#'
        # false positive
        - '#Access to an undefined property PhpParser\\Node::\$expr#'

        # nette container
        - '#Method Rector\\NodeTypeResolver\\DependencyInjection\\PHPStanServicesFactory::create(.*?)() should return (.*?) but returns object#'

        # false postive - type is set by annotation above
        - '#Array \(array<PhpParser\\Node\\Stmt>\) does not accept PhpParser\\Node#'
        - '#Method Rector\\Php\\Rector\\TryCatch\\MultiExceptionCatchRector\:\:collectCatchKeysByContent\(\) should return array<array<int\>\> but returns array<string, array<int, int\|string\>\>#'
        - '#Method Rector\\NodeTypeResolver\\PhpDoc\\NodeAnalyzer\\DocBlockAnalyzer::getTagByName\(\) should return PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagNode but returns PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagNode\|null#'
        - '#Parameter \#1 \$expr of class PhpParser\\Node\\Expr\\BooleanNot constructor expects PhpParser\\Node\\Expr, PhpParser\\Node given#'
        - '#Parameter \#1 \$binaryOpNode of method Rector\\CodeQuality\\Rector\\Identical\\SimplifyConditionsRector::createInversedBooleanOp\(\) expects PhpParser\\Node\\Expr\\BinaryOp, PhpParser\\Node given#'

        # irelevant
        - '#Call to function in_array\(\) with arguments string, (.*?) and true will always evaluate to false#'

        # known values
        - '#Property Rector\\Configuration\\Configuration::\$source \(array<string>\) does not accept array<bool\|string>#'
        - '#Method Rector\\ContributorTools\\Configuration\\ConfigurationFactory::resolveCategoryFromFqnNodeTypes\(\) should return string but returns string\|false#'
        - '#Array \(array<PhpParser\\Node\\Expr\\MethodCall>\) does not accept PhpParser\\Node\\Expr#'
        - '#Cannot access property \$expr on PhpParser\\Node\\Stmt\|null#'
        - '#Access to an undefined property PhpParser\\Node\\Expr\\MethodCall\|PhpParser\\Node\\Stmt\\ClassMethod::\$params#'
        - '#Cannot call method getName\(\) on PHPStan\\Reflection\\ClassReflection\|null#' # 1
        - '#Parameter \#1 \$classReflection of method Rector\\NodeTypeResolver\\Reflection\\ClassReflectionTypesResolver::resolve\(\) expects PHPStan\\Reflection\\ClassReflection, PHPStan\\Reflection\\ClassReflection|null given#'
        - '#Cannot call method getAttribute\(\) on PhpParser\\Node\\Name\|null#'
        - '#Cannot call method getText\(\) on PhpParser\\Comment\\Doc\|null#'

        # buggy
        - '#Array \(array<Symplify\\PackageBuilder\\FileSystem\\SmartFileInfo>\) does not accept array<string, Symplify\\PackageBuilder\\FileSystem\\SmartFileInfo>#'

        # false positive, has annotation type above
        - '#Method Rector\\CodeQuality\\Rector\\Foreach_\\SimplifyForeachToCoalescingRector\:\:matchReturnOrAssignNode\(\) should return PhpParser\\Node\\Expr\\Assign\|PhpParser\\Node\\Stmt\\Return_\|null but returns PhpParser\\Node\|null#'
        - '#Access to an undefined property PhpParser\\Node::\$(\w+)#'
        - '#Parameter \#2 \$boolConstFetchNode of method Rector\\CodeQuality\\Rector\\Identical\\SimplifyArraySearchRector::resolveIsNot\(\) expects PhpParser\\Node\\Expr\\ConstFetch, PhpParser\\Node given#'
        - '#Method Rector\\PhpParser\\Node\\BetterNodeFinder::findFirstAncestorInstanceOf\(\) should return PhpParser\\Node\|null but returns object#'

        # false positive, resolved in previous method
        - '#Parameter (.*?) of method Rector\\PhpParser\\Node\\Maintainer\\IdentifierMaintainer\:\:(.*?)\(\) expects PhpParser\\Node\\Expr\\ClassConstFetch\|PhpParser\\Node\\Expr\\MethodCall\|PhpParser\\Node\\Expr\\PropertyFetch\|PhpParser\\Node\\Expr\\StaticCall\|PhpParser\\Node\\Stmt\\ClassMethod, PhpParser\\Node given#'

        # subtype
        - '#Property PhpParser\\Node\\Param::\$type \(PhpParser\\Node\\Name|PhpParser\\Node\\NullableType\|string\|null\) does not accept PhpParser\\Node\\Identifier|PhpParser\\Node\\Name\|PhpParser\\Node\\NullableType#' # 3
        - '#Parameter \#2 \$ifCondition of method Rector\\CodeQuality\\Rector\\Foreach_\\ForeachToInArrayRector::createInArrayFunction() expects PhpParser\\Node\\Expr\\BinaryOp\\Equal|PhpParser\\Node\\Expr\\BinaryOp\\Identical, PhpParser\\Node\\Expr\\BinaryOp given#'

        # intentionally incorrect - part of the test
        - '#Parameter \#2 \$codeSamples of class Rector\\RectorDefinition\\RectorDefinition constructor expects array<Rector\\Contract\\RectorDefinition\\CodeSampleInterface>, array<int, stdClass> given#' # 1

        # invalid interface type resolution
        - '#Method Rector\\PhpParser\\NodeTraverser\\RectorNodeTraverser::getRectors\(\) should return array<Rector\\Contract\\Rector\\PhpRectorInterface> but returns array<PhpParser\\NodeVisitor>#' # 1

        # known values
        - '#Access to an undefined property PHPStan\\PhpDocParser\\Ast\\Node::\$name#' # 2
        - '#Cannot access property \$value on PhpParser\\Node\\Expr\\ArrayItem\|null#'
        - '#Method Rector\\Symfony\\Rector\\New_\\StringToArrayArgumentProcessRector::findPreviousNodeAssign\(\) should return PhpParser\\Node\\Expr\\Assign\|null but returns PhpParser\\Node\|null#'

        # use of 3rd party factory that returns general type
        - '#Property Rector\\NodeTypeResolver\\NodeVisitor\\NamespaceNodeVisitor::\$useNodes \(array<PhpParser\\Node\\Stmt\\Use_>\) does not accept array<PhpParser\\Node>#' # 1

        # ...variadic false positive
        - '#In method (.*?) type is "array". Please provide a \@(param|return) annotation to further specify the type of the array. For instance: \@(param|return) int\[\]#'

        # not really needed, empty
        - '#Rector\\PhpParser\\NodeTraverser\\RectorNodeTraverser::__construct\(\) does not call parent constructor from PhpParser\\NodeTraverser#'

services:
    -
        class: Symplify\PHPStanExtensions\Type\SplFileInfoTolerantDynamicMethodReturnTypeExtension
        tags:
            - phpstan.broker.dynamicMethodReturnTypeExtension
