2024-02-21 18:14:29 +01:00
< ? php
2025-01-15 02:00:58 +01:00
/* Copyright ( C ) 2024 - 2025 MDW < mdeweerd @ users . noreply . github . com >
2024-03-11 22:14:39 +01:00
* Copyright ( C ) 2024 Frédéric France < frederic . france @ free . fr >
2024-02-21 18:14:29 +01:00
*/
define ( 'DOL_PROJECT_ROOT' , __DIR__ . '/../../..' );
define ( 'DOL_DOCUMENT_ROOT' , DOL_PROJECT_ROOT . '/htdocs' );
define ( 'PHAN_DIR' , __DIR__ );
2024-02-26 23:10:16 +01:00
$sanitizeRegex
= '/^(array:)?(?:' . implode (
'|' ,
array (
// Documented:
'none' ,
2024-07-23 19:19:27 +02:00
'password' ,
2024-02-26 23:10:16 +01:00
'array' ,
'int' ,
'intcomma' ,
'alpha' ,
'alphawithlgt' ,
'alphanohtml' ,
'MS' ,
'aZ' ,
'aZ09' ,
'aZ09arobase' ,
'aZ09comma' ,
2024-07-23 19:19:27 +02:00
'email' ,
2024-02-26 23:10:16 +01:00
'san_alpha' ,
'restricthtml' ,
'nohtml' ,
'custom' ,
// Not documented:
'restricthtmlallowclass' ,
'restricthtmlallowunvalid' ,
2024-08-21 13:13:35 +02:00
'restricthtmlnolink' ,
'restricthtmlallowlinkscript'
2024-02-26 23:10:16 +01:00
)
) . ')*$/' ;
/**
* Map deprecated module names to new module names
*/
$DEPRECATED_MODULE_MAPPING = array (
'actioncomm' => 'agenda' ,
'adherent' => 'member' ,
'adherent_type' => 'member_type' ,
'banque' => 'bank' ,
'categorie' => 'category' ,
'commande' => 'order' ,
'contrat' => 'contract' ,
'entrepot' => 'stock' ,
2024-03-12 11:21:42 +01:00
'expedition' => 'shipping' ,
2024-02-26 23:10:16 +01:00
'facture' => 'invoice' ,
'ficheinter' => 'intervention' ,
'product_fournisseur_price' => 'productsupplierprice' ,
'product_price' => 'productprice' ,
'projet' => 'project' ,
'propale' => 'propal' ,
'socpeople' => 'contact' ,
);
/**
* Map module names to the 'class' name ( the class is : mod < CLASSNAME > )
* Value is null when the module is not internal to the default
* Dolibarr setup .
*/
$VALID_MODULE_MAPPING = array (
'accounting' => 'Accounting' ,
'agenda' => 'Agenda' ,
'ai' => 'Ai' ,
'anothermodule' => null ,
'api' => 'Api' ,
'asset' => 'Asset' ,
'bank' => 'Banque' ,
'barcode' => 'Barcode' ,
'blockedlog' => 'BlockedLog' ,
'bom' => 'Bom' ,
'bookcal' => 'BookCal' ,
'bookmark' => 'Bookmark' ,
'cashdesk' => null , // TODO: fill in proper class
'category' => 'Categorie' ,
'clicktodial' => 'ClickToDial' ,
'collab' => 'Collab' ,
'comptabilite' => 'Comptabilite' ,
'contact' => null , // TODO: fill in proper class
'contract' => 'Contrat' ,
'cron' => 'Cron' ,
'datapolicy' => 'DataPolicy' ,
'dav' => 'Dav' ,
'debugbar' => 'DebugBar' ,
2024-03-12 11:21:42 +01:00
'shipping' => 'Expedition' ,
2024-02-26 23:10:16 +01:00
'deplacement' => 'Deplacement' ,
" documentgeneration " => 'DocumentGeneration' ,
'don' => 'Don' ,
'dynamicprices' => 'DynamicPrices' ,
'ecm' => 'ECM' ,
'ecotax' => null , // TODO: External module ?
'emailcollector' => 'EmailCollector' ,
'eventorganization' => 'EventOrganization' ,
'expensereport' => 'ExpenseReport' ,
'export' => 'Export' ,
'externalrss' => 'ExternalRss' ,
'externalsite' => 'ExternalSite' ,
'fckeditor' => 'Fckeditor' ,
'fournisseur' => 'Fournisseur' ,
'ftp' => 'FTP' ,
'geoipmaxmind' => 'GeoIPMaxmind' ,
'google' => null , // External ?
'gravatar' => 'Gravatar' ,
'holiday' => 'Holiday' ,
'hrm' => 'HRM' ,
'import' => 'Import' ,
'incoterm' => 'Incoterm' ,
'intervention' => 'Ficheinter' ,
'intracommreport' => 'Intracommreport' ,
'invoice' => 'Facture' ,
'knowledgemanagement' => 'KnowledgeManagement' ,
'label' => 'Label' ,
'ldap' => 'Ldap' ,
'loan' => 'Loan' ,
'mailing' => 'Mailing' ,
'mailman' => null , // Same module as mailmanspip -> MailmanSpip ??
'mailmanspip' => 'MailmanSpip' ,
'margin' => 'Margin' ,
'member' => 'Adherent' ,
'memcached' => null , // TODO: External module?
'modulebuilder' => 'ModuleBuilder' ,
'mrp' => 'Mrp' ,
'multicompany' => null , // Not provided by default, no module tests
'multicurrency' => 'MultiCurrency' ,
'mymodule' => null , // modMyModule - Name used in module builder (avoid false positives)
'notification' => 'Notification' ,
'numberwords' => null , // Not provided by default, no module tests
2024-08-19 02:05:27 +02:00
'oauth' => 'OAuth' ,
2024-02-26 23:10:16 +01:00
'openstreetmap' => null , // External module?
'opensurvey' => 'OpenSurvey' ,
'order' => 'Commande' ,
'partnership' => 'Partnership' ,
'paybox' => 'Paybox' ,
'paymentbybanktransfer' => 'PaymentByBankTransfer' ,
'paypal' => 'Paypal' ,
'paypalplus' => null ,
'prelevement' => 'Prelevement' ,
'printing' => 'Printing' ,
'product' => 'Product' ,
'productbatch' => 'ProductBatch' ,
'productprice' => null ,
'productsupplierprice' => null ,
'project' => 'Projet' ,
'propal' => 'Propale' ,
'receiptprinter' => 'ReceiptPrinter' ,
'reception' => 'Reception' ,
'recruitment' => 'Recruitment' ,
'resource' => 'Resource' ,
'salaries' => 'Salaries' ,
'service' => 'Service' ,
'socialnetworks' => 'SocialNetworks' ,
'societe' => 'Societe' ,
'stock' => 'Stock' ,
'stocktransfer' => 'StockTransfer' ,
'stripe' => 'Stripe' ,
'supplier_invoice' => null , // Special case, uses invoice
'supplier_order' => null , // Special case, uses invoice
'supplier_proposal' => 'SupplierProposal' ,
'syslog' => 'Syslog' ,
'takepos' => 'TakePos' ,
'tax' => 'Tax' ,
2024-03-17 19:19:29 +01:00
'theme_datacolor' => 'array{0:array{0:int,1:int,2:int},1:array{0:int,1:int,2:int},2:array{0:int,1:int,2:int},3:array{0:int,1:int,2:int}}' ,
2024-02-26 23:10:16 +01:00
'ticket' => 'Ticket' ,
'user' => 'User' ,
'variants' => 'Variants' ,
'webhook' => 'Webhook' ,
'webportal' => 'WebPortal' ,
'webservices' => 'WebServices' ,
'webservicesclient' => 'WebServicesClient' ,
2024-03-18 18:35:45 +01:00
'website' => 'Website' ,
2024-02-26 23:10:16 +01:00
'workflow' => 'Workflow' ,
'workstation' => 'Workstation' ,
'zapier' => 'Zapier' ,
);
2024-03-10 01:46:10 +01:00
// From ExtraFields class
$EXTRAFIELDS_TYPE2LABEL = array (
'varchar' => 'String1Line' ,
'text' => 'TextLongNLines' ,
'html' => 'HtmlText' ,
'int' => 'Int' ,
'double' => 'Float' ,
'date' => 'Date' ,
'datetime' => 'DateAndTime' ,
//'datetimegmt'=>'DateAndTimeUTC',
'boolean' => 'Boolean' , // Remove as test
'price' => 'ExtrafieldPrice' ,
'pricecy' => 'ExtrafieldPriceWithCurrency' ,
'phone' => 'ExtrafieldPhone' ,
'mail' => 'ExtrafieldMail' ,
'url' => 'ExtrafieldUrl' ,
'ip' => 'ExtrafieldIP' ,
'icon' => 'Icon' ,
'password' => 'ExtrafieldPassword' ,
'select' => 'ExtrafieldSelect' ,
'sellist' => 'ExtrafieldSelectList' ,
'radio' => 'ExtrafieldRadio' ,
'checkbox' => 'ExtrafieldCheckBox' ,
'chkbxlst' => 'ExtrafieldCheckBoxFromList' ,
'link' => 'ExtrafieldLink' ,
'separate' => 'ExtrafieldSeparator' ,
);
2024-02-26 23:10:16 +01:00
$moduleNameRegex = '/^(?:' . implode ( '|' , array_merge ( array_keys ( $DEPRECATED_MODULE_MAPPING ), array_keys ( $VALID_MODULE_MAPPING ), array ( '\$modulename' ))) . ')$/' ;
Qual: Enable detection of deprecated modulename & GETPOST(...,'int') (#28457)
* Qual: Enable detection of deprecated modulename & GETPOST(...,'int')
# Qual: Enable detection of deprecated modulename & GETPOST(...,'int')
Enable phan rules to verify deprecated modulename usage and GETPOST(...,'int')
usage in the code.
* Qual: Try type hint on to help avoid notification
* Qual: Accept 3 parameters for GETPOST to GETPOSTINT conversion
* Qual: Convert GETPOST(...,'int',VALUE) to GETPOSTINT(...,VALUE)
# Qual: Convert GETPOST(...,'int',VALUE) to GETPOSTINT(...,VALUE)
Following the update to the fixer to also convert GETPOST... with 3 parameters.
The files are now converted.
2024-02-28 23:25:16 +01:00
$deprecatedModuleNameRegex = '/^(?!(?:' . implode ( '|' , array_keys ( $DEPRECATED_MODULE_MAPPING )) . ')$).*/' ;
2024-02-26 23:10:16 +01:00
2024-03-10 01:46:10 +01:00
$extraFieldTypeRegex = '/^(?:' . implode ( '|' , array_keys ( $EXTRAFIELDS_TYPE2LABEL )) . ')$/' ;
2024-02-21 18:14:29 +01:00
/**
* This configuration will be read and overlaid on top of the
* default configuration . Command line arguments will be applied
* after this file is read .
*/
return [
// 'processes' => 6,
'backward_compatibility_checks' => false ,
'simplify_ast' => true ,
'analyzed_file_extensions' => [ 'php' , 'inc' ],
'globals_type_map' => [
2024-11-06 20:15:15 +01:00
'_Avery_Labels' => 'array<string,array{name:string,paper-size:string|array{0:float,1:float},orientation:string,metric:string,marginLeft:float,marginTop:float,NX:int,NY:int,SpaceX:float,SpaceY:float,width:float,height:float,font-size:float,custom_x:float,custom_y:float}>' ,
2024-03-11 12:55:44 +01:00
'action' => 'string' ,
'actioncode' => 'string' ,
'badgeStatus0' => 'string' ,
'badgeStatus1' => 'string' ,
'badgeStatus3' => 'string' ,
'badgeStatus4' => 'string' ,
2025-02-13 18:32:41 +01:00
'badgeStatus5' => 'string' ,
2024-03-11 12:55:44 +01:00
'badgeStatus6' => 'string' ,
2025-02-13 18:32:41 +01:00
'badgeStatus7' => 'string' ,
2024-03-11 12:55:44 +01:00
'badgeStatus8' => 'string' ,
'badgeStatus9' => 'string' ,
2025-02-13 18:32:41 +01:00
'badgeStatus10' => 'string' ,
'badgeStatus11' => 'string' ,
'badgeStatus4b' => 'string' ,
'badgeStatus8b' => 'string' ,
2024-03-11 12:55:44 +01:00
'classname' => 'string' ,
2024-02-21 18:14:29 +01:00
'conf' => '\Conf' ,
2024-03-11 12:55:44 +01:00
'conffile' => 'string' ,
'conffiletoshow' => 'string' ,
'conffiletoshowshort' => 'string' ,
'dateSelector' => 'int<0,1>' ,
2024-02-21 18:14:29 +01:00
'db' => '\DoliDB' ,
2024-03-11 12:55:44 +01:00
'disableedit' => 'int<0,1>' ,
'disablemove' => 'int<0,1>' ,
'disableremove' => 'int<0,1>' ,
'dolibarr_main_authentication' => 'string' ,
'dolibarr_main_data_root' => 'string' ,
'dolibarr_main_data_root' => 'string' ,
'dolibarr_main_db_encrypted_pass' => 'string' ,
'dolibarr_main_db_host' => 'string' ,
'dolibarr_main_db_pass' => 'string' ,
'dolibarr_main_demo' => 'string' ,
'dolibarr_main_document_root' => 'string' ,
'dolibarr_main_url_root' => 'string' ,
'errormsg' => 'string' ,
2024-02-21 18:14:29 +01:00
'extrafields' => '\ExtraFields' ,
2024-03-11 12:55:44 +01:00
'filter' => 'string' ,
'filtert' => 'int' ,
'forceall' => 'int<0,1>' ,
'form' => '\Form' ,
2024-08-17 19:32:52 +02:00
'formcompany' => '\FormCompany' ,
2024-02-21 18:14:29 +01:00
'hookmanager' => '\HookManager' ,
2024-03-11 12:55:44 +01:00
'inputalsopricewithtax' => 'int<0,1>' ,
2024-02-21 18:14:29 +01:00
'langs' => '\Translate' ,
2024-03-11 12:55:44 +01:00
'leftmenu' => 'string' ,
2024-08-17 19:32:52 +02:00
'linkedObjectBlock' => '\CommonObject[]' , // See htdocs/core/class/html.form.class.php
2024-03-11 12:55:44 +01:00
'mainmenu' => 'string' ,
2024-03-23 16:02:39 +01:00
'menumanager' => '\MenuManager' ,
2025-01-30 22:20:24 +01:00
'mysoc' => '\Societe' ,
2024-02-21 18:14:29 +01:00
'nblines' => '\int' ,
2024-03-11 12:55:44 +01:00
'objectoffield' => '\CommonObject' ,
2024-08-17 19:32:52 +02:00
'objsoc' => '\Societe' ,
2024-03-23 21:25:49 +01:00
'senderissupplier' => 'int<0,2>' ,
2024-11-04 12:32:13 +01:00
'shmkeys' => 'array<string,int>' , // memory.lib
'shmoffset' => 'int' , // memory.lib
2024-02-21 18:14:29 +01:00
'user' => '\User' ,
2024-03-18 18:35:45 +01:00
'website' => 'string' , // See discussion https://github.com/Dolibarr/dolibarr/pull/28891#issuecomment-2002268334 // Disable because Phan infers Website type
2024-03-11 12:55:44 +01:00
'websitepage' => '\WebSitePage' ,
'websitepagefile' => 'string' ,
// 'object' => '\CommonObject', // Deprecated, not enabled because conflicts with $object assignments
2024-02-21 18:14:29 +01:00
],
// Supported values: `'5.6'`, `'7.0'`, `'7.1'`, `'7.2'`, `'7.3'`, `'7.4'`, `null`.
// If this is set to `null`,
// then Phan assumes the PHP version which is closest to the minor version
// of the php executable used to execute Phan.
//"target_php_version" => null,
" target_php_version " => '8.2' ,
//"target_php_version" => '7.3',
//"target_php_version" => '5.6',
// 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' => [
'htdocs' ,
2025-02-18 16:08:09 +01:00
'scripts' ,
2024-02-21 18:14:29 +01:00
PHAN_DIR . '/stubs/' ,
],
// 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 `exclude_analysis_directory_list`.
" exclude_analysis_directory_list " => [
'htdocs/includes/' ,
2024-03-17 21:25:34 +01:00
'htdocs/install/doctemplates/websites/' ,
2024-02-21 18:14:29 +01:00
'htdocs/core/class/lessc.class.php' , // External library
PHAN_DIR . '/stubs/' ,
],
//'exclude_file_regex' => '@^vendor/.*/(tests?|Tests?)/@',
'exclude_file_regex' => '@^(' // @phpstan-ignore-line
. 'dummy' // @phpstan-ignore-line
2024-08-07 01:10:12 +02:00
// mymodule seen in cti, but not in git.
2024-10-19 01:21:41 +02:00
. '|htdocs/custom/.*' // Ignore all custom modules @phpstan-ignore-line
2024-02-21 18:14:29 +01:00
. '|htdocs/.*/canvas/.*/tpl/.*.tpl.php' // @phpstan-ignore-line
2024-11-14 00:03:31 +01:00
. '|htdocs/admin/tools/ui/.*' // @phpstan-ignore-line
2024-08-18 18:16:08 +02:00
//.'|htdocs/modulebuilder/template/.*' // @phpstan-ignore-line
2024-04-07 11:55:39 +02:00
// Included as stub (better analysis)
. '|htdocs/includes/nusoap/.*' // @phpstan-ignore-line
2024-02-21 18:14:29 +01:00
// Included as stub (old version + incompatible typing hints)
. '|htdocs/includes/restler/.*' // @phpstan-ignore-line
2024-08-18 18:16:08 +02:00
// Included as stub (did not seem properly analyzed by phan without it)
2024-02-21 18:14:29 +01:00
. '|htdocs/includes/stripe/.*' // @phpstan-ignore-line
2024-03-11 12:55:44 +01:00
. '|htdocs/conf/conf.php' // @phpstan-ignore-line
2024-02-26 23:10:16 +01:00
// .'|htdocs/[^h].*/.*' // For testing @phpstan-ignore-line
2024-02-21 18:14:29 +01:00
. ')@' , // @phpstan-ignore-line
// A list of plugin files to execute.
// Plugins which are bundled with Phan can be added here by providing their name
// (e.g. 'AlwaysReturnPlugin')
//
// Documentation about available bundled plugins can be found
// at https://github.com/phan/phan/tree/master/.phan/plugins
//
// Alternately, you can pass in the full path to a PHP file
// with the plugin's implementation (e.g. 'vendor/phan/phan/.phan/plugins/AlwaysReturnPlugin.php')
2024-02-26 23:10:16 +01:00
'ParamMatchRegexPlugin' => [
2024-03-11 12:55:44 +01:00
'/^GETPOST$/' => [ 1 , $sanitizeRegex , 'GetPostUnknownSanitizeType' ],
Qual: Enable detection of deprecated modulename & GETPOST(...,'int') (#28457)
* Qual: Enable detection of deprecated modulename & GETPOST(...,'int')
# Qual: Enable detection of deprecated modulename & GETPOST(...,'int')
Enable phan rules to verify deprecated modulename usage and GETPOST(...,'int')
usage in the code.
* Qual: Try type hint on to help avoid notification
* Qual: Accept 3 parameters for GETPOST to GETPOSTINT conversion
* Qual: Convert GETPOST(...,'int',VALUE) to GETPOSTINT(...,VALUE)
# Qual: Convert GETPOST(...,'int',VALUE) to GETPOSTINT(...,VALUE)
Following the update to the fixer to also convert GETPOST... with 3 parameters.
The files are now converted.
2024-02-28 23:25:16 +01:00
'/^isModEnabled$/' => [ 0 , $moduleNameRegex , 'UnknownModuleName' ],
// Note: trick to have different key for same regex:
'/^isModEnable[d]$/' => [ 0 , $deprecatedModuleNameRegex , " DeprecatedModuleName " ],
2024-03-10 01:46:10 +01:00
'/^sanitizeVal$/' => [ 1 , $sanitizeRegex , " UnknownSanitizeType " ],
2024-03-26 01:21:07 +01:00
'/^checkVal$/' => [ 1 , $sanitizeRegex , " UnknownCheckValSanitizeType " ],
2024-03-10 01:46:10 +01:00
'/^\\\\ExtraFields::addExtraField$/' => [ 2 , $extraFieldTypeRegex , " UnknownExtrafieldTypeBack " ],
2024-08-07 01:10:12 +02:00
'/^dol_now$/' => [ 0 , '{^(?:auto|gmt|tz(?:server|ref|user(?:rel)?))$}' , " InvalidDolNowArgument " ],
2024-03-26 00:57:32 +01:00
'/^dol_mktime$/' => [ 6 , '{^(?:|0|1|auto|gmt|tz(?:server|ref|user(?:rel)?|,[+a-zA-Z-/]+))$}' , " InvalidDolMktimeArgument " ], // '', 0, 1 match bool and int values
2024-08-07 01:10:12 +02:00
'/^dol_print_date$/' => [ 2 , '{^(?:|0|1|auto|gmt|tz(?:server|user(?:rel)?))$}' , " InvalidDolMktimeArgument " ], // '', 0, 1 match bool and int values
2024-03-26 01:21:07 +01:00
'/^GETPOSTFLOAT$/' => [ 1 , '{^(?:|M[UTS]|C[UT]|\d+)$}' , " InvalidGetPostFloatRounding " ],
'/^price2num$/' => [ 1 , '{^(?:|M[UTS]|C[UT]|\d+)$}' , " InvalidPrice2NumRounding " ],
2024-02-26 23:10:16 +01:00
],
2024-02-21 18:14:29 +01:00
'plugins' => [
2024-02-25 22:11:25 +01:00
__DIR__ . '/plugins/NoVarDumpPlugin.php' ,
2024-02-26 23:10:16 +01:00
__DIR__ . '/plugins/ParamMatchRegexPlugin.php' ,
2024-02-21 18:14:29 +01:00
// checks if a function, closure or method unconditionally returns.
// can also be written as 'vendor/phan/phan/.phan/plugins/AlwaysReturnPlugin.php'
2024-03-08 21:34:18 +01:00
'DeprecateAliasPlugin' ,
2024-02-21 18:14:29 +01:00
//'EmptyMethodAndFunctionPlugin',
2025-01-15 02:00:58 +01:00
'InvalidVariableIssetPlugin' ,
2024-02-21 18:14:29 +01:00
//'MoreSpecificElementTypePlugin',
'NoAssertPlugin' ,
'NotFullyQualifiedUsagePlugin' ,
//'PHPDocRedundantPlugin',
'PHPUnitNotDeadCodePlugin' ,
//'PossiblyStaticMethodPlugin',
'PreferNamespaceUsePlugin' ,
'PrintfCheckerPlugin' ,
'RedundantAssignmentPlugin' ,
'ConstantVariablePlugin' , // Warns about values that are actually constant
//'HasPHPDocPlugin', // Requires PHPDoc
2024-03-17 12:55:38 +01:00
// 'InlineHTMLPlugin', // html in PHP file, or at end of file
2024-02-21 18:14:29 +01:00
//'NonBoolBranchPlugin', // Requires test on bool, nont on ints
//'NonBoolInLogicalArithPlugin',
'NumericalComparisonPlugin' ,
//'PHPDocToRealTypesPlugin',
'PHPDocInWrongCommentPlugin' , // Missing /** (/* was used)
//'ShortArrayPlugin', // Checks that [] is used
//'StrictLiteralComparisonPlugin',
'UnknownClassElementAccessPlugin' ,
'UnknownElementTypePlugin' ,
'WhitespacePlugin' ,
//'RemoveDebugStatementPlugin', // Reports echo, print, ...
2024-08-07 03:05:02 +02:00
'SimplifyExpressionPlugin' ,
2024-02-21 18:14:29 +01:00
//'StrictComparisonPlugin', // Expects ===
'SuspiciousParamOrderPlugin' ,
'UnsafeCodePlugin' ,
//'UnusedSuppressionPlugin',
'AlwaysReturnPlugin' ,
//'DollarDollarPlugin',
'DuplicateArrayKeyPlugin' ,
'DuplicateExpressionPlugin' ,
'PregRegexCheckerPlugin' ,
'PrintfCheckerPlugin' ,
'SleepCheckerPlugin' ,
// Checks for syntactically unreachable statements in
// the global scope or function bodies.
'UnreachableCodePlugin' ,
'UseReturnValuePlugin' ,
'EmptyStatementListPlugin' ,
'LoopVariableReusePlugin' ,
],
// Add any issue types (such as 'PhanUndeclaredMethod')
// here to inhibit them from being reported
'suppress_issue_types' => [
// Dolibarr uses a lot of internal deprecated stuff, not reporting
'PhanDeprecatedProperty' ,
2024-04-07 11:55:39 +02:00
'PhanCompatibleNegativeStringOffset' , // return false positive
2024-05-10 11:48:27 +02:00
'PhanPluginConstantVariableBool' , // a lot of false positive, in most cases, we want to keep the code as it is
2024-11-06 23:57:45 +01:00
// 'PhanPluginUnknownArrayPropertyType', // Helps find missing array keys or mismatches, remaining occurrences are likely unused properties
2024-11-11 14:48:18 +01:00
'PhanTypeArraySuspiciousNullable' , // About 440 occurrences
2024-09-29 21:52:31 +02:00
// 'PhanTypeInvalidDimOffset', // Helps identify missing array indexes in types or reference to unset indexes
2024-05-13 12:49:14 +02:00
'PhanTypeObjectUnsetDeclaredProperty' ,
2024-06-21 17:27:52 +02:00
'PhanTypePossiblyInvalidDimOffset' , // a lot of false positive, in most cases, we want to keep the code as it is
2024-08-27 04:55:42 +02:00
// 'PhanPluginUnknownArrayFunctionReturnType', // a lot of false positive, in most cases, we want to keep the code as it is
2024-04-07 11:55:39 +02:00
2024-09-16 01:50:58 +02:00
'PhanPluginWhitespaceTab' , // Dolibarr uses tabs
2024-04-07 11:55:39 +02:00
'PhanPluginCanUsePHP71Void' , // Dolibarr is maintaining 7.0 compatibility
'PhanPluginShortArray' , // Dolibarr uses array()
'PhanPluginShortArrayList' , // Dolibarr uses array()
2024-02-25 22:11:25 +01:00
// Fixers From PHPDocToRealTypesPlugin:
'PhanPluginCanUseParamType' , // Fixer - Report/Add types in the function definition (function abc(string $var) (adds string)
'PhanPluginCanUseReturnType' , // Fixer - Report/Add return types in the function definition (function abc(string $var) (adds string)
'PhanPluginCanUseNullableParamType' , // Fixer - Report/Add nullable parameter types in the function definition
'PhanPluginCanUseNullableReturnType' , // Fixer - Report/Add nullable return types in the function definition
2024-04-07 11:55:39 +02:00
'PhanPluginNonBoolBranch' , // Not essential - 31240+ occurrences
'PhanPluginNumericalComparison' , // Not essential - 19870+ occurrences
2025-02-01 15:19:42 +01:00
// 'PhanTypeMismatchArgument', // Can detect missing array keys, invalid types, objects being passed when scalar expected - Not all reported by phpstan - <=3800 cases (was: 12300+ before)
2024-04-07 11:55:39 +02:00
'PhanPluginNonBoolInLogicalArith' , // Not essential - 11040+ occurrences
'PhanPluginConstantVariableScalar' , // Not essential - 5180+ occurrences
2024-02-21 18:14:29 +01:00
'PhanPluginDuplicateAdjacentStatement' ,
2024-04-07 11:55:39 +02:00
'PhanPluginDuplicateConditionalTernaryDuplication' , // 2750+ occurrences
'PhanPluginDuplicateConditionalNullCoalescing' , // Not essential - 990+ occurrences
'PhanPluginRedundantAssignmentInGlobalScope' , // Not essential, a lot of false warning
2024-05-30 13:37:17 +02:00
'PhanPluginRedundantAssignment' , // Not essential, useless
2024-04-07 11:55:39 +02:00
'PhanPluginDuplicateCatchStatementBody' , // Requires PHP7.1 - 50+ occurrences
2024-04-24 20:35:36 +02:00
2025-01-15 02:00:58 +01:00
// 'PhanPluginUnknownArrayMethodParamType', // All fixed, except in api_*
// 'PhanPluginUnknownArrayMethodReturnType', // All fixed, except in api_*
2024-09-16 01:50:58 +02:00
// 'PhanUndeclaredGlobalVariable', // Helps identify variables that are not set/defined - add '@phan-var-force TYPE $varname' in tpl or includes to help type the variable
2024-08-17 19:32:52 +02:00
// 'PhanPluginUnknownObjectMethodCall', // False positive for some class. Is enabled in config_extended only.
2024-10-17 01:54:19 +02:00
'PhanTypeSuspiciousNonTraversableForeach' , // Reports on `foreach ($object as $key => $value)` which works without php notices, so we ignore it because this is intentional in the code.
2024-02-21 18:14:29 +01:00
],
// You can put relative paths to internal stubs in this config option.
// Phan will continue using its detailed type annotations,
// but load the constants, classes, functions, and classes (and their Reflection types)
// from these stub files (doubling as valid php files).
// Use a different extension from php (and preferably a separate folder)
// to avoid accidentally parsing these as PHP (includes projects depending on this).
// The 'mkstubs' script can be used to generate your own stubs (compatible with php 7.0+ right now)
// Note: The array key must be the same as the extension name reported by `php -m`,
// so that phan can skip loading the stubs if the extension is actually available.
'autoload_internal_extension_signatures' => [
// Stubs may be available at https://github.com/JetBrains/phpstorm-stubs/tree/master
// Xdebug stubs are bundled with Phan 0.10.1+/0.8.9+ for usage,
// because Phan disables xdebug by default.
//'xdebug' => 'vendor/phan/phan/.phan/internal_stubs/xdebug.phan_php',
//'memcached' => PHAN_DIR . '/your_internal_stubs_folder_name/memcached.phan_php',
//'PDO' => PHAN_DIR . '/stubs/PDO.phan_php',
'brotli' => PHAN_DIR . '/stubs/brotli.phan_php' ,
'curl' => PHAN_DIR . '/stubs/curl.phan_php' ,
'calendar' => PHAN_DIR . '/stubs/calendar.phan_php' ,
'fileinfo' => PHAN_DIR . '/stubs/fileinfo.phan_php' ,
'ftp' => PHAN_DIR . '/stubs/ftp.phan_php' ,
'gd' => PHAN_DIR . '/stubs/gd.phan_php' ,
'geoip' => PHAN_DIR . '/stubs/geoip.phan_php' ,
2024-03-23 14:29:54 +01:00
'imagick' => PHAN_DIR . '/stubs/imagick.phan_php' ,
2024-02-21 18:14:29 +01:00
'imap' => PHAN_DIR . '/stubs/imap.phan_php' ,
'intl' => PHAN_DIR . '/stubs/intl.phan_php' ,
'ldap' => PHAN_DIR . '/stubs/ldap.phan_php' ,
'mcrypt' => PHAN_DIR . '/stubs/mcrypt.phan_php' ,
'memcache' => PHAN_DIR . '/stubs/memcache.phan_php' ,
2024-03-23 14:29:54 +01:00
'memcached' => PHAN_DIR . '/stubs/memcached.phan_php' ,
2024-02-21 18:14:29 +01:00
'mysqli' => PHAN_DIR . '/stubs/mysqli.phan_php' ,
'pdo_cubrid' => PHAN_DIR . '/stubs/pdo_cubrid.phan_php' ,
'pdo_mysql' => PHAN_DIR . '/stubs/pdo_mysql.phan_php' ,
'pdo_pgsql' => PHAN_DIR . '/stubs/pdo_pgsql.phan_php' ,
'pdo_sqlite' => PHAN_DIR . '/stubs/pdo_sqlite.phan_php' ,
'pgsql' => PHAN_DIR . '/stubs/pgsql.phan_php' ,
'session' => PHAN_DIR . '/stubs/session.phan_php' ,
'simplexml' => PHAN_DIR . '/stubs/SimpleXML.phan_php' ,
'soap' => PHAN_DIR . '/stubs/soap.phan_php' ,
'sockets' => PHAN_DIR . '/stubs/sockets.phan_php' ,
2024-03-23 14:29:54 +01:00
'tidy' => PHAN_DIR . '/stubs/tidy.phan_php' ,
2024-02-21 18:14:29 +01:00
'zip' => PHAN_DIR . '/stubs/zip.phan_php' ,
],
];