.phan/config.php
<?php
/**
* This configuration will be read and overlaid on top of the
* default configuration. Command line arguments will be applied
* after this file is read.
*
* @see src/Phan/Config.php
* See Config for all configurable options.
*/
return [
// A list of individual files to include in analysis
// with a path relative to the root directory of the
// project
'file_list' => [
'phplib/411bootstrap.php',
],
// A list of directories that should be parsed for class and
// method information. After excluding the directories
// defined in exclude_analysis_directory_list, the remaining
// files will be statically analyzed for errors.
//
// Thus, both first-party and third-party code being used by
// your application should be included in this list.
'directory_list' => [
'bin',
'phplib',
'vendor',
],
// A file list that defines files that will be excluded
// from parsing and analysis and will not be read at all.
//
// This is useful for excluding hopelessly unanalyzable
// files that can't be removed for whatever reason.
'exclude_file_list' => [],
// A directory list that defines files that will be excluded
// from static analysis, but whose class and method
// information should be included.
//
// Generally, you'll want to include the directories for
// third-party code (such as "vendor/") in this list.
//
// n.b.: If you'd like to parse but not analyze 3rd
// party code, directories containing that code
// should be added to the `directory_list` as
// to `excluce_analysis_directory_list`.
'exclude_analysis_directory_list' => [
'vendor'
],
// Backwards Compatibility Checking. This is slow
// and expensive, but you should consider running
// it before upgrading your version of PHP to a
// new version that has backward compatibility
// breaks.
'backward_compatibility_checks' => true,
// A set of fully qualified class-names for which
// a call to parent::__construct() is required.
'parent_constructor_required' => [],
// Run a quick version of checks that takes less
// time at the cost of not running as thorough
// an analysis. You should consider setting this
// to true only when you wish you had more issues
// to fix in your code base.
//
// In quick-mode the scanner doesn't rescan a function
// or a method's code block every time a call is seen.
// This means that the problem here won't be detected:
//
// ```php
// <?php
// function test($arg):int {
// return $arg;
// }
// test("abc");
// ```
//
// This would normally generate:
//
// ```sh
// test.php:3 TypeError return string but `test()` is declared to return int
// ```
//
// The initial scan of the function's code block has no
// type information for `$arg`. It isn't until we see
// the call and rescan test()'s code block that we can
// detect that it is actually returning the passed in
// `string` instead of an `int` as declared.
'quick_mode' => false,
// By default, Phan will not analyze all node types
// in order to save time. If this config is set to true,
// Phan will dig deeper into the AST tree and do an
// analysis on all nodes, possibly finding more issues.
//
// See \Phan\Analysis::shouldVisit for the set of skipped
// nodes.
'should_visit_all_nodes' => true,
// If enabled, check all methods that override a
// parent method to make sure its signature is
// compatible with the parent's. This check
// can add quite a bit of time to the analysis.
'analyze_signature_compatibility' => true,
// The minimum severity level to report on. This can be
// set to Issue::SEVERITY_LOW, Issue::SEVERITY_NORMAL or
// Issue::SEVERITY_CRITICAL. Setting it to only
// critical issues is a good place to start on a big
// sloppy mature code base.
'minimum_severity' => 0,
// If true, missing properties will be created when
// they are first seen. If false, we'll report an
// error message if there is an attempt to write
// to a class property that wasn't explicitly
// defined.
'allow_missing_properties' => false,
// Allow null to be cast as any type and for any
// type to be cast to null. Setting this to false
// will cut down on false positives.
'null_casts_as_any_type' => true,
// If enabled, scalars (int, float, bool, string, null)
// are treated as if they can cast to each other.
'scalar_implicit_cast' => true,
// If true, seemingly undeclared variables in the global
// scope will be ignored. This is useful for projects
// with complicated cross-file globals that you have no
// hope of fixing.
'ignore_undeclared_variables_in_global_scope' => true,
// Set to true in order to attempt to detect dead
// (unreferenced) code. Keep in mind that the
// results will only be a guess given that classes,
// properties, constants and methods can be referenced
// as variables (like `$class->$property` or
// `$class->$method()`) in ways that we're unable
// to make sense of.
'dead_code_detection' => false,
// If true, the dead code detection rig will
// prefer false negatives (not report dead code) to
// false positives (report dead code that is not
// actually dead) which is to say that the graph of
// references will create too many edges rather than
// too few edges when guesses have to be made about
// what references what.
'dead_code_detection_prefer_false_negative' => true,
// If true (and if stored_state_file_path is set) we'll
// look at the list of files passed in and expand the list
// to include files that depend on the given files
'expand_file_list' => false,
// Include a progress bar in the output
'progress_bar' => true,
// The probability of actually emitting any progress
// bar update. Setting this to something very low
// is good for reducing network IO and filling up
// your terminal's buffer when running phan on a
// remote host.
'progress_bar_sample_rate' => 0.005,
// The number of processes to fork off during the analysis
// phase.
'processes' => 4,
// Add any issue types (such as 'PhanUndeclaredMethod')
// to this black-list to inhibit them from being reported.
'suppress_issue_types' => [
'PhanUnanalyzable',
// 'PhanUndeclaredMethod',
],
// If empty, no filter against issues types will be applied.
// If this white-list is non-empty, only issues within the list
// will be emitted by Phan.
'whitelist_issue_types' => [
// 'PhanAccessMethodPrivate',
// 'PhanAccessMethodProtected',
// 'PhanAccessNonStaticToStatic',
// 'PhanAccessPropertyPrivate',
// 'PhanAccessPropertyProtected',
// 'PhanAccessSignatureMismatch',
// 'PhanAccessSignatureMismatchInternal',
// 'PhanAccessStaticToNonStatic',
// 'PhanCompatibleExpressionPHP7',
// 'PhanCompatiblePHP7',
// 'PhanContextNotObject',
// 'PhanDeprecatedClass',
// 'PhanDeprecatedFunction',
// 'PhanDeprecatedProperty',
// 'PhanEmptyFile',
// 'PhanNonClassMethodCall',
// 'PhanNoopArray',
// 'PhanNoopClosure',
// 'PhanNoopConstant',
// 'PhanNoopProperty',
// 'PhanNoopVariable',
// 'PhanParamRedefined',
// 'PhanParamReqAfterOpt',
// 'PhanParamSpecial1',
// 'PhanParamSpecial2',
// 'PhanParamSpecial3',
// 'PhanParamSpecial4',
// 'PhanParamTooFew',
// 'PhanParamTooFewInternal',
// 'PhanParamTooMany',
// 'PhanParamTooManyInternal',
// 'PhanParamTypeMismatch',
// 'PhanParentlessClass',
// 'PhanRedefineClass',
// 'PhanRedefineClassInternal',
// 'PhanRedefineFunction',
// 'PhanRedefineFunctionInternal',
// 'PhanSignatureMismatch',
// 'PhanSignatureMismatchInternal',
// 'PhanStaticCallToNonStatic',
// 'PhanSyntaxError',
// 'PhanTraitParentReference',
// 'PhanTypeArrayOperator',
// 'PhanTypeArraySuspicious',
// 'PhanTypeComparisonFromArray',
// 'PhanTypeComparisonToArray',
// 'PhanTypeConversionFromArray',
// 'PhanTypeInstantiateAbstract',
// 'PhanTypeInstantiateInterface',
// 'PhanTypeInvalidLeftOperand',
// 'PhanTypeInvalidRightOperand',
// 'PhanTypeMismatchArgument',
// 'PhanTypeMismatchArgumentInternal',
// 'PhanTypeMismatchDefault',
// 'PhanTypeMismatchForeach',
// 'PhanTypeMismatchProperty',
// 'PhanTypeMismatchReturn',
// 'PhanTypeMissingReturn',
// 'PhanTypeNonVarPassByRef',
// 'PhanTypeParentConstructorCalled',
// 'PhanTypeVoidAssignment',
// 'PhanUnanalyzable',
// 'PhanUndeclaredClass',
// 'PhanUndeclaredClassCatch',
// 'PhanUndeclaredClassConstant',
// 'PhanUndeclaredClassInstanceof',
// 'PhanUndeclaredClassMethod',
// 'PhanUndeclaredClassReference',
// 'PhanUndeclaredConstant',
// 'PhanUndeclaredExtendedClass',
// 'PhanUndeclaredFunction',
// 'PhanUndeclaredInterface',
// 'PhanUndeclaredMethod',
// 'PhanUndeclaredProperty',
// 'PhanUndeclaredStaticMethod',
// 'PhanUndeclaredStaticProperty',
// 'PhanUndeclaredTrait',
// 'PhanUndeclaredTypeParameter',
// 'PhanUndeclaredTypeProperty',
// 'PhanUndeclaredVariable',
// 'PhanUnreferencedClass',
// 'PhanUnreferencedConstant',
// 'PhanUnreferencedMethod',
// 'PhanUnreferencedProperty',
// 'PhanVariableUseClause',
],
// Emit issue messages with markdown formatting
'markdown_issue_messages' => true,
// Enable or disable support for generic templated
// class types.
'generic_types_enabled' => true,
];