Code Clean up, more testing

Remove unused code and classes.
Clean up code to remove all named constant from them and throw
deprecation alerts if used.
Add basic psalm setup in root folder and remove from www folder
This commit is contained in:
Clemens Schwaighofer
2023-03-09 15:55:57 +09:00
parent d952c5f774
commit 03fbcaecfb
149 changed files with 3406 additions and 1937 deletions

View File

@@ -0,0 +1,163 @@
<?php
// These stubs were generated by the phan stub generator.
// @phan-stub-for-extension zip@1.15.6
namespace {
class ZipArchive implements \Countable {
// constants
const CREATE = 1;
const EXCL = 2;
const CHECKCONS = 4;
const OVERWRITE = 8;
const RDONLY = 16;
const FL_NOCASE = 1;
const FL_NODIR = 2;
const FL_COMPRESSED = 4;
const FL_UNCHANGED = 8;
const FL_ENC_GUESS = 0;
const FL_ENC_RAW = 64;
const FL_ENC_STRICT = 128;
const FL_ENC_UTF_8 = 2048;
const FL_ENC_CP437 = 4096;
const CM_DEFAULT = -1;
const CM_STORE = 0;
const CM_SHRINK = 1;
const CM_REDUCE_1 = 2;
const CM_REDUCE_2 = 3;
const CM_REDUCE_3 = 4;
const CM_REDUCE_4 = 5;
const CM_IMPLODE = 6;
const CM_DEFLATE = 8;
const CM_DEFLATE64 = 9;
const CM_PKWARE_IMPLODE = 10;
const CM_BZIP2 = 12;
const CM_LZMA = 14;
const CM_LZMA2 = 33;
const CM_XZ = 95;
const CM_TERSE = 18;
const CM_LZ77 = 19;
const CM_WAVPACK = 97;
const CM_PPMD = 98;
const ER_OK = 0;
const ER_MULTIDISK = 1;
const ER_RENAME = 2;
const ER_CLOSE = 3;
const ER_SEEK = 4;
const ER_READ = 5;
const ER_WRITE = 6;
const ER_CRC = 7;
const ER_ZIPCLOSED = 8;
const ER_NOENT = 9;
const ER_EXISTS = 10;
const ER_OPEN = 11;
const ER_TMPOPEN = 12;
const ER_ZLIB = 13;
const ER_MEMORY = 14;
const ER_CHANGED = 15;
const ER_COMPNOTSUPP = 16;
const ER_EOF = 17;
const ER_INVAL = 18;
const ER_NOZIP = 19;
const ER_INTERNAL = 20;
const ER_INCONS = 21;
const ER_REMOVE = 22;
const ER_DELETED = 23;
const ER_ENCRNOTSUPP = 24;
const ER_RDONLY = 25;
const ER_NOPASSWD = 26;
const ER_WRONGPASSWD = 27;
const ER_OPNOTSUPP = 28;
const ER_INUSE = 29;
const ER_TELL = 30;
const ER_COMPRESSED_DATA = 31;
const ER_CANCELLED = 32;
const OPSYS_DOS = 0;
const OPSYS_AMIGA = 1;
const OPSYS_OPENVMS = 2;
const OPSYS_UNIX = 3;
const OPSYS_VM_CMS = 4;
const OPSYS_ATARI_ST = 5;
const OPSYS_OS_2 = 6;
const OPSYS_MACINTOSH = 7;
const OPSYS_Z_SYSTEM = 8;
const OPSYS_Z_CPM = 9;
const OPSYS_CPM = 9;
const OPSYS_WINDOWS_NTFS = 10;
const OPSYS_MVS = 11;
const OPSYS_VSE = 12;
const OPSYS_ACORN_RISC = 13;
const OPSYS_VFAT = 14;
const OPSYS_ALTERNATE_MVS = 15;
const OPSYS_BEOS = 16;
const OPSYS_TANDEM = 17;
const OPSYS_OS_400 = 18;
const OPSYS_OS_X = 19;
const OPSYS_DEFAULT = 3;
const EM_NONE = 0;
const EM_AES_128 = 257;
const EM_AES_192 = 258;
const EM_AES_256 = 259;
const LIBZIP_VERSION = '1.9.2';
// properties
public $comment;
public $filename;
public $numFiles;
public $status;
public $statusSys;
// methods
public function open($filename, $flags = null) {}
public function setPassword($password) {}
public function close() {}
public function count() {}
public function getStatusString() {}
public function addEmptyDir($dirname) {}
public function addFromString($name, $content) {}
public function addFile($filepath, $entryname = null, $start = null, $length = null) {}
public function addGlob($pattern, $flags = null, $options = null) {}
public function addPattern($pattern, $path = null, $options = null) {}
public function renameIndex($index, $new_name) {}
public function renameName($name, $new_name) {}
public function setArchiveComment($comment) {}
public function getArchiveComment($flags = null) {}
public function setCommentIndex($index, $comment) {}
public function setCommentName($name, $comment) {}
public function getCommentIndex($index, $flags = null) {}
public function getCommentName($name, $flags = null) {}
public function deleteIndex($index) {}
public function deleteName($name) {}
public function statName($filename, $flags = null) {}
public function statIndex($index, $flags = null) {}
public function locateName($filename, $flags = null) {}
public function getNameIndex($index, $flags = null) {}
public function unchangeArchive() {}
public function unchangeAll() {}
public function unchangeIndex($index) {}
public function unchangeName($name) {}
public function extractTo($pathto, $files = null) {}
public function getFromName($entryname, $len = null, $flags = null) {}
public function getFromIndex($index, $len = null, $flags = null) {}
public function getStream($entryname) {}
public function setExternalAttributesName($name, $opsys, $attr, $flags = null) {}
public function setExternalAttributesIndex($index, $opsys, $attr, $flags = null) {}
public function getExternalAttributesName($name, &$opsys, &$attr, $flags = null) {}
public function getExternalAttributesIndex($index, &$opsys, &$attr, $flags = null) {}
public function setCompressionName($name, $method, $compflags = null) {}
public function setCompressionIndex($index, $method, $compflags = null) {}
public function setEncryptionName($name, $method, $password = null) {}
public function setEncryptionIndex($index, $method, $password = null) {}
}
function zip_close($zip) {}
function zip_entry_close($zip_ent) {}
function zip_entry_compressedsize($zip_entry) {}
function zip_entry_compressionmethod($zip_entry) {}
function zip_entry_filesize($zip_entry) {}
function zip_entry_name($zip_entry) {}
function zip_entry_open($zip_dp, $zip_entry, $mode = null) {}
function zip_entry_read($zip_entry, $len = null) {}
function zip_open($filename) {}
function zip_read($zip) {}
}

View File

@@ -114,7 +114,7 @@ final class EmptyStatementListVisitor extends PluginAwarePostAnalysisVisitor
$this->code_base,
(clone $this->context)->withLineNumberStart($last_if_elem->children['stmts']->lineno ?? $last_if_elem->lineno),
'PhanPluginEmptyStatementIf',
'Empty statement list statement detected for the last if/elseif statement',
'Empty statement list detected for the last if/elseif statement',
[]
);
}
@@ -191,7 +191,7 @@ final class EmptyStatementListVisitor extends PluginAwarePostAnalysisVisitor
$this->code_base,
(clone $this->context)->withLineNumberStart($stmts_node->lineno ?? $node->lineno),
'PhanPluginEmptyStatementForLoop',
'Empty statement list statement detected for the for loop',
'Empty statement list detected for the for loop',
[]
);
}
@@ -219,7 +219,7 @@ final class EmptyStatementListVisitor extends PluginAwarePostAnalysisVisitor
$this->code_base,
(clone $this->context)->withLineNumberStart($stmts_node->lineno ?? $node->lineno),
'PhanPluginEmptyStatementWhileLoop',
'Empty statement list statement detected for the while loop',
'Empty statement list detected for the while loop',
[]
);
}
@@ -247,7 +247,7 @@ final class EmptyStatementListVisitor extends PluginAwarePostAnalysisVisitor
$this->code_base,
(clone $this->context)->withLineNumberStart($stmts_node->lineno),
'PhanPluginEmptyStatementDoWhileLoop',
'Empty statement list statement detected for the do-while loop',
'Empty statement list detected for the do-while loop',
[]
);
}
@@ -276,7 +276,7 @@ final class EmptyStatementListVisitor extends PluginAwarePostAnalysisVisitor
$this->code_base,
(clone $this->context)->withLineNumberStart($stmts_node->lineno),
'PhanPluginEmptyStatementForeachLoop',
'Empty statement list statement detected for the foreach loop',
'Empty statement list detected for the foreach loop',
[]
);
}
@@ -295,7 +295,7 @@ final class EmptyStatementListVisitor extends PluginAwarePostAnalysisVisitor
$this->code_base,
(clone $this->context)->withLineNumberStart($try_node->lineno),
'PhanPluginEmptyStatementTryBody',
'Empty statement list statement detected for the try statement\'s body',
'Empty statement list detected for the try statement\'s body',
[]
);
}
@@ -315,7 +315,7 @@ final class EmptyStatementListVisitor extends PluginAwarePostAnalysisVisitor
$this->code_base,
(clone $this->context)->withLineNumberStart($finally_node->lineno),
'PhanPluginEmptyStatementTryFinally',
'Empty statement list statement detected for the try\'s finally body',
'Empty statement list detected for the try\'s finally body',
[]
);
}

View File

@@ -216,15 +216,15 @@ By default, this plugin won't warn if it can find a TODO/FIXME/"Deliberately emp
(This may miss some TODOs due to `php-ast` not providing the end line numbers)
The setting `'plugin_config' => ['empty_statement_list_ignore_todos' => true]` can be used to make it unconditionally warn about empty statement lists.
- **PhanPluginEmptyStatementDoWhileLoop** `Empty statement list statement detected for the do-while loop`
- **PhanPluginEmptyStatementForLoop** `Empty statement list statement detected for the for loop`
- **PhanPluginEmptyStatementForeachLoop** `Empty statement list statement detected for the foreach loop`
- **PhanPluginEmptyStatementIf**: `Empty statement list statement detected for the last if/elseif statement`
- **PhanPluginEmptyStatementDoWhileLoop** `Empty statement list detected for the do-while loop`
- **PhanPluginEmptyStatementForLoop** `Empty statement list detected for the for loop`
- **PhanPluginEmptyStatementForeachLoop** `Empty statement list detected for the foreach loop`
- **PhanPluginEmptyStatementIf**: `Empty statement list detected for the last if/elseif statement`
- **PhanPluginEmptyStatementSwitch** `No side effects seen for any cases of this switch statement`
- **PhanPluginEmptyStatementTryBody** `Empty statement list statement detected for the try statement's body`
- **PhanPluginEmptyStatementTryBody** `Empty statement list detected for the try statement's body`
- **PhanPluginEmptyStatementPossiblyNonThrowingTryBody**: `Found a try block that looks like it might not throw. Note that this check is a heuristic prone to false positives, especially because error handlers, signal handlers, destructors, and other things may all lead to throwing.`
- **PhanPluginEmptyStatementTryFinally** `Empty statement list statement detected for the try's finally body`
- **PhanPluginEmptyStatementWhileLoop** `Empty statement list statement detected for the while loop`
- **PhanPluginEmptyStatementTryFinally** `Empty statement list detected for the try's finally body`
- **PhanPluginEmptyStatementWhileLoop** `Empty statement list detected for the while loop`
### LoopVariableReusePlugin.php

View File

@@ -1,5 +1,20 @@
Phan NEWS
Mar 03 2023, Phan 5.4.2
-----------------------
Miscellaneous:
- Fix wording in EmptyStatementListPlugin issue messages.
- Add a few more functions where the return value should be used.
- Fix signature of exif_read_data() #4759
- Make allow_missing_properties setting aware of AllowDynamicProperties attribute for PHP 8.2
Maintenance:
- Require php-ast 1.1.0 or newer in PHP 8.2+ if php-ast is installed.
This release of php-ast makes the parsing of `AST_ARROW_FUNC` in php 8.2 match older php versions.
- Support parsing of PHP 8.2 syntax such as disjunctive normal form types and `readonly` classes in the polyfill/fallback parser.
- Fix bugs parsing `__halt_compiler()` in the polyfill/fallback parser.
Aug 25 2022, Phan 5.4.1
-----------------------
@@ -14,6 +29,11 @@ New Features(Analysis):
Miscellaneous:
- Allow `array_filter` `$callback` to be null (#4715)
Bug fixes:
- Fix false positive warning in PHP < 8.0 for inferring the method signature of `new SoapFault`. (#4724)
(The constructor was internally declared in reflection as `SoapFault::SoapFault` until php 8.0)
Adjust the method signature of `SoapFault::__construct` to match the documentation/implementation.
Aug 08 2022, Phan 5.4.0
-----------------------

View File

@@ -29,7 +29,7 @@
"composer/semver": "^1.4|^2.0|^3.0",
"composer/xdebug-handler": "^2.0|^3.0",
"felixfbecker/advanced-json-rpc": "^3.0.4",
"microsoft/tolerant-php-parser": "0.1.1",
"microsoft/tolerant-php-parser": "0.1.2",
"netresearch/jsonmapper": "^1.6.0|^2.0|^3.0|^4.0",
"sabre/event": "^5.1.3",
"symfony/console": "^3.2|^4.0|^5.0|^6.0",

232
vendor/phan/phan/composer.lock generated vendored
View File

@@ -4,20 +4,20 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "62f4c0f1a6e50535b7c03182832d5c4e",
"content-hash": "301a32dbdfef414765074fc7e60effbb",
"packages": [
{
"name": "composer/pcre",
"version": "2.0.0",
"version": "2.1.0",
"source": {
"type": "git",
"url": "https://github.com/composer/pcre.git",
"reference": "c8e9d27cfc5ed22643c19c160455b473ffd8aabe"
"reference": "3fdb2807b31a78a40ad89570e30ec77466c98717"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/pcre/zipball/c8e9d27cfc5ed22643c19c160455b473ffd8aabe",
"reference": "c8e9d27cfc5ed22643c19c160455b473ffd8aabe",
"url": "https://api.github.com/repos/composer/pcre/zipball/3fdb2807b31a78a40ad89570e30ec77466c98717",
"reference": "3fdb2807b31a78a40ad89570e30ec77466c98717",
"shasum": ""
},
"require": {
@@ -59,7 +59,7 @@
],
"support": {
"issues": "https://github.com/composer/pcre/issues",
"source": "https://github.com/composer/pcre/tree/2.0.0"
"source": "https://github.com/composer/pcre/tree/2.1.0"
},
"funding": [
{
@@ -75,7 +75,7 @@
"type": "tidelift"
}
],
"time": "2022-02-25T20:05:29+00:00"
"time": "2022-11-16T18:32:04+00:00"
},
{
"name": "composer/semver",
@@ -271,16 +271,16 @@
},
{
"name": "microsoft/tolerant-php-parser",
"version": "v0.1.1",
"version": "v0.1.2",
"source": {
"type": "git",
"url": "https://github.com/microsoft/tolerant-php-parser.git",
"reference": "6a965617cf484355048ac6d2d3de7b6ec93abb16"
"reference": "3eccfd273323aaf69513e2f1c888393f5947804b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/microsoft/tolerant-php-parser/zipball/6a965617cf484355048ac6d2d3de7b6ec93abb16",
"reference": "6a965617cf484355048ac6d2d3de7b6ec93abb16",
"url": "https://api.github.com/repos/microsoft/tolerant-php-parser/zipball/3eccfd273323aaf69513e2f1c888393f5947804b",
"reference": "3eccfd273323aaf69513e2f1c888393f5947804b",
"shasum": ""
},
"require": {
@@ -310,22 +310,22 @@
"description": "Tolerant PHP-to-AST parser designed for IDE usage scenarios",
"support": {
"issues": "https://github.com/microsoft/tolerant-php-parser/issues",
"source": "https://github.com/microsoft/tolerant-php-parser/tree/v0.1.1"
"source": "https://github.com/microsoft/tolerant-php-parser/tree/v0.1.2"
},
"time": "2021-07-16T21:28:12+00:00"
"time": "2022-10-05T17:30:19+00:00"
},
{
"name": "netresearch/jsonmapper",
"version": "v4.0.0",
"version": "v4.1.0",
"source": {
"type": "git",
"url": "https://github.com/cweiske/jsonmapper.git",
"reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d"
"reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d",
"reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d",
"url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/cfa81ea1d35294d64adb9c68aa4cb9e92400e53f",
"reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f",
"shasum": ""
},
"require": {
@@ -361,9 +361,9 @@
"support": {
"email": "cweiske@cweiske.de",
"issues": "https://github.com/cweiske/jsonmapper/issues",
"source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0"
"source": "https://github.com/cweiske/jsonmapper/tree/v4.1.0"
},
"time": "2020-12-01T19:48:11+00:00"
"time": "2022-12-08T20:46:14+00:00"
},
{
"name": "phpdocumentor/reflection-common",
@@ -691,16 +691,16 @@
},
{
"name": "symfony/console",
"version": "v5.4.11",
"version": "v5.4.21",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "535846c7ee6bc4dd027ca0d93220601456734b10"
"reference": "c77433ddc6cdc689caf48065d9ea22ca0853fbd9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/535846c7ee6bc4dd027ca0d93220601456734b10",
"reference": "535846c7ee6bc4dd027ca0d93220601456734b10",
"url": "https://api.github.com/repos/symfony/console/zipball/c77433ddc6cdc689caf48065d9ea22ca0853fbd9",
"reference": "c77433ddc6cdc689caf48065d9ea22ca0853fbd9",
"shasum": ""
},
"require": {
@@ -770,7 +770,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v5.4.11"
"source": "https://github.com/symfony/console/tree/v5.4.21"
},
"funding": [
{
@@ -786,7 +786,7 @@
"type": "tidelift"
}
],
"time": "2022-07-22T10:42:43+00:00"
"time": "2023-02-25T16:59:41+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -857,16 +857,16 @@
},
{
"name": "symfony/polyfill-ctype",
"version": "v1.26.0",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
"reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4"
"reference": "5bbc823adecdae860bb64756d639ecfec17b050a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
"reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a",
"reference": "5bbc823adecdae860bb64756d639ecfec17b050a",
"shasum": ""
},
"require": {
@@ -881,7 +881,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -919,7 +919,7 @@
"portable"
],
"support": {
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0"
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
},
"funding": [
{
@@ -935,20 +935,20 @@
"type": "tidelift"
}
],
"time": "2022-05-24T11:49:31+00:00"
"time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-intl-grapheme",
"version": "v1.26.0",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
"reference": "433d05519ce6990bf3530fba6957499d327395c2"
"reference": "511a08c03c1960e08a883f4cffcacd219b758354"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2",
"reference": "433d05519ce6990bf3530fba6957499d327395c2",
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354",
"reference": "511a08c03c1960e08a883f4cffcacd219b758354",
"shasum": ""
},
"require": {
@@ -960,7 +960,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1000,7 +1000,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0"
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0"
},
"funding": [
{
@@ -1016,20 +1016,20 @@
"type": "tidelift"
}
],
"time": "2022-05-24T11:49:31+00:00"
"time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.26.0",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "219aa369ceff116e673852dce47c3a41794c14bd"
"reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd",
"reference": "219aa369ceff116e673852dce47c3a41794c14bd",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6",
"reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6",
"shasum": ""
},
"require": {
@@ -1041,7 +1041,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1084,7 +1084,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0"
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0"
},
"funding": [
{
@@ -1100,20 +1100,20 @@
"type": "tidelift"
}
],
"time": "2022-05-24T11:49:31+00:00"
"time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.26.0",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
"reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"shasum": ""
},
"require": {
@@ -1128,7 +1128,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1167,7 +1167,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0"
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
},
"funding": [
{
@@ -1183,20 +1183,20 @@
"type": "tidelift"
}
],
"time": "2022-05-24T11:49:31+00:00"
"time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-php73",
"version": "v1.26.0",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php73.git",
"reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85"
"reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85",
"reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85",
"url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9",
"reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9",
"shasum": ""
},
"require": {
@@ -1205,7 +1205,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1246,7 +1246,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0"
"source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0"
},
"funding": [
{
@@ -1262,20 +1262,20 @@
"type": "tidelift"
}
],
"time": "2022-05-24T11:49:31+00:00"
"time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-php80",
"version": "v1.26.0",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
"reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace"
"reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace",
"reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
"reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
"shasum": ""
},
"require": {
@@ -1284,7 +1284,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.26-dev"
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1329,7 +1329,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0"
"source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0"
},
"funding": [
{
@@ -1345,7 +1345,7 @@
"type": "tidelift"
}
],
"time": "2022-05-10T07:21:04+00:00"
"time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/service-contracts",
@@ -1432,16 +1432,16 @@
},
{
"name": "symfony/string",
"version": "v5.4.11",
"version": "v5.4.21",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "5eb661e49ad389e4ae2b6e4df8d783a8a6548322"
"reference": "edac10d167b78b1d90f46a80320d632de0bd9f2f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/5eb661e49ad389e4ae2b6e4df8d783a8a6548322",
"reference": "5eb661e49ad389e4ae2b6e4df8d783a8a6548322",
"url": "https://api.github.com/repos/symfony/string/zipball/edac10d167b78b1d90f46a80320d632de0bd9f2f",
"reference": "edac10d167b78b1d90f46a80320d632de0bd9f2f",
"shasum": ""
},
"require": {
@@ -1498,7 +1498,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v5.4.11"
"source": "https://github.com/symfony/string/tree/v5.4.21"
},
"funding": [
{
@@ -1514,34 +1514,42 @@
"type": "tidelift"
}
],
"time": "2022-07-24T16:15:25+00:00"
"time": "2023-02-22T08:00:55+00:00"
},
{
"name": "tysonandre/var_representation_polyfill",
"version": "0.1.2",
"version": "0.1.3",
"source": {
"type": "git",
"url": "https://github.com/TysonAndre/var_representation_polyfill.git",
"reference": "e925b7b0806b39f26aa899202ee065decbabafdb"
"reference": "e9116c2c352bb0835ca428b442dde7767c11ad32"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/TysonAndre/var_representation_polyfill/zipball/e925b7b0806b39f26aa899202ee065decbabafdb",
"reference": "e925b7b0806b39f26aa899202ee065decbabafdb",
"url": "https://api.github.com/repos/TysonAndre/var_representation_polyfill/zipball/e9116c2c352bb0835ca428b442dde7767c11ad32",
"reference": "e9116c2c352bb0835ca428b442dde7767c11ad32",
"shasum": ""
},
"require": {
"ext-tokenizer": "*",
"php": "^7.2.0|^8.0.0"
},
"provide": {
"ext-var_representation": "*"
},
"require-dev": {
"phan/phan": "^5.1",
"phan/phan": "^5.4.1",
"phpunit/phpunit": "^8.5.0"
},
"suggest": {
"ext-var_representation": "*"
"ext-var_representation": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "0.1.3-dev"
}
},
"autoload": {
"files": [
"src/var_representation.php"
@@ -1566,9 +1574,9 @@
],
"support": {
"issues": "https://github.com/TysonAndre/var_representation_polyfill/issues",
"source": "https://github.com/TysonAndre/var_representation_polyfill/tree/0.1.2"
"source": "https://github.com/TysonAndre/var_representation_polyfill/tree/0.1.3"
},
"time": "2022-08-11T12:33:19+00:00"
"time": "2022-08-31T12:59:22+00:00"
},
{
"name": "webmozart/assert",
@@ -1632,30 +1640,30 @@
"packages-dev": [
{
"name": "doctrine/instantiator",
"version": "1.4.1",
"version": "1.5.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/instantiator.git",
"reference": "10dcfce151b967d20fde1b34ae6640712c3891bc"
"reference": "0a0fa9780f5d4e507415a065172d26a98d02047b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc",
"reference": "10dcfce151b967d20fde1b34ae6640712c3891bc",
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b",
"reference": "0a0fa9780f5d4e507415a065172d26a98d02047b",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"doctrine/coding-standard": "^9",
"doctrine/coding-standard": "^9 || ^11",
"ext-pdo": "*",
"ext-phar": "*",
"phpbench/phpbench": "^0.16 || ^1",
"phpstan/phpstan": "^1.4",
"phpstan/phpstan-phpunit": "^1",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"vimeo/psalm": "^4.22"
"vimeo/psalm": "^4.30 || ^5.4"
},
"type": "library",
"autoload": {
@@ -1682,7 +1690,7 @@
],
"support": {
"issues": "https://github.com/doctrine/instantiator/issues",
"source": "https://github.com/doctrine/instantiator/tree/1.4.1"
"source": "https://github.com/doctrine/instantiator/tree/1.5.0"
},
"funding": [
{
@@ -1698,7 +1706,7 @@
"type": "tidelift"
}
],
"time": "2022-03-03T08:28:38+00:00"
"time": "2022-12-30T00:15:36+00:00"
},
{
"name": "myclabs/deep-copy",
@@ -2169,16 +2177,16 @@
},
{
"name": "phpunit/phpunit",
"version": "8.5.29",
"version": "8.5.33",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "e8c563c47a9a303662955518ca532b022b337f4d"
"reference": "7d1ff0e8c6b35db78ff13e3e05517d7cbf7aa32e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e8c563c47a9a303662955518ca532b022b337f4d",
"reference": "e8c563c47a9a303662955518ca532b022b337f4d",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7d1ff0e8c6b35db78ff13e3e05517d7cbf7aa32e",
"reference": "7d1ff0e8c6b35db78ff13e3e05517d7cbf7aa32e",
"shasum": ""
},
"require": {
@@ -2197,10 +2205,10 @@
"phpunit/php-file-iterator": "^2.0.4",
"phpunit/php-text-template": "^1.2.1",
"phpunit/php-timer": "^2.1.2",
"sebastian/comparator": "^3.0.2",
"sebastian/comparator": "^3.0.5",
"sebastian/diff": "^3.0.2",
"sebastian/environment": "^4.2.3",
"sebastian/exporter": "^3.1.2",
"sebastian/exporter": "^3.1.5",
"sebastian/global-state": "^3.0.0",
"sebastian/object-enumerator": "^3.0.3",
"sebastian/resource-operations": "^2.0.1",
@@ -2246,7 +2254,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.29"
"source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.33"
},
"funding": [
{
@@ -2256,9 +2264,13 @@
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
"type": "tidelift"
}
],
"time": "2022-08-22T13:59:39+00:00"
"time": "2023-02-27T13:04:50+00:00"
},
{
"name": "sebastian/code-unit-reverse-lookup",
@@ -2317,16 +2329,16 @@
},
{
"name": "sebastian/comparator",
"version": "3.0.3",
"version": "3.0.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
"reference": "1071dfcef776a57013124ff35e1fc41ccd294758"
"reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1071dfcef776a57013124ff35e1fc41ccd294758",
"reference": "1071dfcef776a57013124ff35e1fc41ccd294758",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dc7ceb4a24aede938c7af2a9ed1de09609ca770",
"reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770",
"shasum": ""
},
"require": {
@@ -2379,7 +2391,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
"source": "https://github.com/sebastianbergmann/comparator/tree/3.0.3"
"source": "https://github.com/sebastianbergmann/comparator/tree/3.0.5"
},
"funding": [
{
@@ -2387,7 +2399,7 @@
"type": "github"
}
],
"time": "2020-11-30T08:04:30+00:00"
"time": "2022-09-14T12:31:48+00:00"
},
{
"name": "sebastian/diff",
@@ -2520,16 +2532,16 @@
},
{
"name": "sebastian/exporter",
"version": "3.1.4",
"version": "3.1.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
"reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db"
"reference": "73a9676f2833b9a7c36968f9d882589cd75511e6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0c32ea2e40dbf59de29f3b49bf375176ce7dd8db",
"reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db",
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/73a9676f2833b9a7c36968f9d882589cd75511e6",
"reference": "73a9676f2833b9a7c36968f9d882589cd75511e6",
"shasum": ""
},
"require": {
@@ -2585,7 +2597,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
"source": "https://github.com/sebastianbergmann/exporter/tree/3.1.4"
"source": "https://github.com/sebastianbergmann/exporter/tree/3.1.5"
},
"funding": [
{
@@ -2593,7 +2605,7 @@
"type": "github"
}
],
"time": "2021-11-11T13:51:24+00:00"
"time": "2022-09-14T06:00:17+00:00"
},
{
"name": "sebastian/global-state",
@@ -3055,5 +3067,5 @@
"platform-overrides": {
"php": "7.2.24"
},
"plugin-api-version": "2.3.0"
"plugin-api-version": "2.0.0"
}

View File

@@ -1269,6 +1269,9 @@ class TolerantASTConverter
$variableName !== null ? self::getStartLine($variableName) : $start_line
);
},
'Microsoft\PhpParser\Node\Statement\HaltCompilerStatement' => static function (PhpParser\Node\Statement\HaltCompilerStatement $n, int $start_line): ast\Node {
return new ast\Node(ast\AST_HALT_COMPILER, 0, ['offset' => $n->getHaltCompilerOffset()], $start_line);
},
'Microsoft\PhpParser\Node\Statement\InterfaceDeclaration' => static function (PhpParser\Node\Statement\InterfaceDeclaration $n, int $start_line): ast\Node {
if ($n->interfaceKeyword) {
$start_line = self::getStartLine($n->interfaceKeyword);
@@ -1294,7 +1297,7 @@ class TolerantASTConverter
$end_line = static::getEndLine($n);
$base_class = $n->classBaseClause->baseClass ?? null;
return static::astStmtClass(
static::phpParserClassModifierToAstClassFlags($n->abstractOrFinalModifier),
static::phpParserClassModifiersToAstClassFlags($n->abstractOrFinalModifier, $n->modifiers),
static::tokenToString($n->name),
static::phpParserAttributeGroupsToAstAttributeList($n->attributes),
$base_class !== null ? static::phpParserNonValueNodeToAstNode($base_class) : null,
@@ -1940,6 +1943,23 @@ class TolerantASTConverter
return new ast\Node($is_intersection ? ast\AST_TYPE_INTERSECTION : ast\AST_TYPE_UNION, 0, $types, $types[0]->lineno);
}
protected static function phpParserParenthesizedIntersectionTypeToAstNode(PhpParser\Node\ParenthesizedIntersectionType $n, int $start_line): ?ast\Node {
$children = [];
foreach ($n->children->children ?? [] as $c) {
if ($c instanceof Token && $c->kind === TokenKind::AmpersandToken) {
continue;
}
$result = self::phpParserTypeToAstNode($c, $start_line);
if ($result) {
$children[] = $result;
}
}
if (count($children) <= 1) {
return $children[0] ?? null;
}
return new ast\Node(ast\AST_TYPE_INTERSECTION, 0, $children, $start_line);
}
/**
* @param PhpParser\Node\QualifiedName|Token|null $type
*/
@@ -1951,7 +1971,12 @@ class TolerantASTConverter
$original_type = $type;
if ($type instanceof PhpParser\Node\QualifiedName) {
$type = static::phpParserNameToString($type);
} elseif ($type instanceof PhpParser\Node\ParenthesizedIntersectionType) {
return static::phpParserParenthesizedIntersectionTypeToAstNode($type, $line);
} elseif ($type instanceof Token) {
if (get_class($type) !== Token::class) {
return null;
}
$type = static::tokenToString($type);
}
if (\is_string($type)) {
@@ -2283,24 +2308,35 @@ class TolerantASTConverter
);
}
/**
* @param ?Token $flags
* @throws InvalidArgumentException if the class flags were unexpected
*/
private static function phpParserClassModifierToAstClassFlags(?Token $flags): int
private static function phpParserClassModifierToAstClassFlags(?Token $modifier): int
{
if ($flags === null) {
if ($modifier === null) {
return 0;
}
switch ($flags->kind) {
switch ($modifier->kind) {
case TokenKind::AbstractKeyword:
return flags\CLASS_ABSTRACT;
case TokenKind::FinalKeyword:
return flags\CLASS_FINAL;
case TokenKind::ReadonlyKeyword:
return flags\CLASS_READONLY;
default:
throw new InvalidArgumentException("Unexpected kind '" . Token::getTokenKindNameFromValue($flags->kind) . "'");
throw new InvalidArgumentException("Unexpected kind '" . Token::getTokenKindNameFromValue($modifier->kind) . "'");
}
}
/**
* @param ?Token $modifier
* @param list<Token> $modifiers
* @throws InvalidArgumentException if the class flags were unexpected
*/
private static function phpParserClassModifiersToAstClassFlags(?Token $modifier, array $modifiers): int
{
$flags = self::phpParserClassModifierToAstClassFlags($modifier);
foreach ($modifiers as $extra_modifier) {
$flags |= self::phpParserClassModifierToAstClassFlags($extra_modifier);
}
return $flags;
}
private static function interfaceBaseClauseToNode(?\Microsoft\PhpParser\Node\InterfaceBaseClause $node): ?\ast\Node
{

View File

@@ -146,8 +146,8 @@ if (extension_loaded('ast')) {
exit(1);
};
if (PHP_VERSION_ID >= 80200 && version_compare($ast_version, '1.0.15') < 0) {
$phan_output_ast_too_old_and_exit('1.0.15', '8.2');
if (PHP_VERSION_ID >= 80200 && version_compare($ast_version, '1.1.0') < 0) {
$phan_output_ast_too_old_and_exit('1.1.0', '8.2');
} elseif (PHP_VERSION_ID >= 80100 && version_compare($ast_version, '1.0.14') < 0) {
$phan_output_ast_too_old_and_exit('1.0.14', '8.1');
} elseif (PHP_VERSION_ID >= 80000 && version_compare($ast_version, '1.0.11') < 0) {
@@ -360,6 +360,7 @@ function phan_error_handler(int $errno, string $errstr, string $errfile, int $er
}
if ($errno === E_DEPRECATED) {
// Because php 7.2 is used in CI we're stuck on an unmaintained paratest version.
// NOTE: Known issues with dynamic properties in tolerant-php-parser are fixed in `main` (but not 0.1.1) but there may be remaining unknown ones.
if (preg_match('/^Creation of dynamic property (ParaTest\\\\Runners|Microsoft\\\\PhpParser|Phan\\\\LanguageServer\\\\LanguageServer::)/', $errstr)) {
return true;
}

View File

@@ -84,7 +84,7 @@ class CLI
/**
* This should be updated to x.y.z-dev after every release, and x.y.z before a release.
*/
public const PHAN_VERSION = '5.4.1';
public const PHAN_VERSION = '5.4.2';
/**
* List of short flags passed to getopt

View File

@@ -488,6 +488,10 @@ class Clazz extends AddressableElement
foreach ($method_list as $method) {
$clazz->addMethod($code_base, $method, None::instance());
}
if (\PHP_VERSION_ID < 80000 && $reflection_method->isConstructor() && \strcasecmp($reflection_method->name, '__construct') !== 0) {
// E.g. SoapFault::SoapFault and other soap classes before PHP 8.0
$clazz->addMethod($code_base, Method::defaultConstructorForClass($clazz, $code_base), None::instance());
}
}
return $clazz;
@@ -2298,6 +2302,11 @@ class Clazz extends AddressableElement
*/
public function hasDynamicProperties(CodeBase $code_base): bool
{
foreach($this->attribute_list as $attr) {
if ((string)$attr === '\AllowDynamicProperties') {
return true;
}
}
return $this->hasFlagsRecursive($code_base, Flags::CLASS_HAS_DYNAMIC_PROPERTIES);
}
@@ -2979,6 +2988,16 @@ class Clazz extends AddressableElement
$this->warnAboutAmbiguousInheritance($code_base, $class, $next_class_fqsen);
}
if ($attribute_list = $class->getAttributeList()) {
foreach($attribute_list as $attr) {
if ((string)$attr === "\AllowDynamicProperties") {
$new_attribute_list = $this->getAttributeList();
$new_attribute_list[] = $attr;
$this->setAttributeList($new_attribute_list);
break;
}
}
}
// Constants should have been imported earlier, but call it again just in case
$this->importConstantsFromAncestorClass($code_base, $class);

View File

@@ -3074,7 +3074,7 @@ return [
'Exception::getTraceAsString' => ['string'],
'exec' => ['string', 'command'=>'string', '&w_output='=>'array', '&w_result_code='=>'int'],
'exif_imagetype' => ['int|false', 'filename'=>'string'],
'exif_read_data' => ['array<string,mixed>|false', 'file'=>'string', 'required_sections='=>'string', 'as_arrays='=>'bool', 'read_thumbnail='=>'bool'],
'exif_read_data' => ['array<string,mixed>|false', 'file'=>'resource|string', 'required_sections='=>'string', 'as_arrays='=>'bool', 'read_thumbnail='=>'bool'],
'exif_tagname' => ['string|false', 'index'=>'int'],
'exif_thumbnail' => ['string|false', 'file'=>'string', '&w_width='=>'int', '&w_height='=>'int', '&w_image_type='=>'int'],
'exit' => ['', 'status'=>'string|int'],
@@ -13136,7 +13136,7 @@ return [
'SoapClient::__soapCall' => ['', 'name'=>'string', 'args'=>'array', 'options='=>'array', 'inputHeaders='=>'SoapHeader|array', '&w_outputHeaders='=>'array'],
'SoapClient::SoapClient' => ['object', 'wsdl'=>'mixed', 'options='=>'array'],
'SoapFault::__clone' => ['void'],
'SoapFault::__construct' => ['void', 'code'=>'string', 'string'=>'string', 'actor='=>'string', 'details='=>'string', 'name='=>'string', 'headerFault='=>'string'],
'SoapFault::__construct' => ['void', 'code'=>'?string|?array{0:string,1:string}', 'string'=>'string', 'actor='=>'string', 'details='=>'mixed', 'name='=>'string', 'headerFault='=>'string'],
'SoapFault::__toString' => ['string'],
'SoapFault::__wakeup' => ['void'],
'SoapFault::getCode' => ['int'],
@@ -13146,7 +13146,7 @@ return [
'SoapFault::getPrevious' => ['?Exception|?Throwable'],
'SoapFault::getTrace' => ['array'],
'SoapFault::getTraceAsString' => ['string'],
'SoapFault::SoapFault' => ['object', 'faultcode'=>'string', 'faultstring'=>'string', 'faultactor='=>'string', 'detail='=>'string', 'faultname='=>'string', 'headerfault='=>'string'],
'SoapFault::SoapFault' => ['void', 'code'=>'?string|?array{0:string,1:string}', 'string'=>'string', 'actor='=>'string', 'details='=>'mixed', 'name='=>'string', 'headerFault='=>'string'],
'SoapHeader::__construct' => ['void', 'namespace'=>'string', 'name'=>'string', 'data='=>'mixed', 'mustUnderstand='=>'bool', 'actor='=>'string'],
'SoapHeader::SoapHeader' => ['object', 'namespace'=>'string', 'name'=>'string', 'data='=>'mixed', 'mustunderstand='=>'bool', 'actor='=>'string'],
'SoapParam::__construct' => ['void', 'data'=>'mixed', 'name'=>'string'],

View File

@@ -131,6 +131,10 @@ return [
'ZipArchive::setEncryptionName' => ['bool', 'name'=>'string', 'method'=>'int', 'password='=>'string'],
],
'changed' => [
'exif_read_data' => [
'old' => ['array<string,mixed>|false', 'file'=>'string', 'required_sections='=>'string', 'as_arrays='=>'bool', 'read_thumbnail='=>'bool'],
'new' => ['array<string,mixed>|false', 'file'=>'resource|string', 'required_sections='=>'string', 'as_arrays='=>'bool', 'read_thumbnail='=>'bool'],
],
'hash_copy' => [
'old' => ['resource', 'context'=>'resource'],
'new' => ['HashContext', 'context'=>'HashContext'],

View File

@@ -417,6 +417,7 @@ class UseReturnValuePlugin extends PluginV3 implements PostAnalyzeNodeCapability
'gethostname' => true,
'getimagesize' => true,
'get_include_path' => true,
'get_mangled_object_vars' => true,
'get_magic_quotes_gpc' => true,
'get_magic_quotes_gpc_runtime' => true,
'getmypid' => true,
@@ -457,7 +458,9 @@ class UseReturnValuePlugin extends PluginV3 implements PostAnalyzeNodeCapability
'hypot' => true,
'iconv_strlen' => true,
'iconv' => true,
'imagecreate' => self::MUST_USE_WITH_SIDE_EFFECTS,
'imagecreatetruecolor' => self::MUST_USE_WITH_SIDE_EFFECTS,
'imagecreatefromtga' => self::MUST_USE_WITH_SIDE_EFFECTS,
'imagetypes' => true,
'implode' => true,
'in_array' => true,
@@ -624,10 +627,12 @@ class UseReturnValuePlugin extends PluginV3 implements PostAnalyzeNodeCapability
'openssl_encrypt' => true,
'openssl_error_string' => true,
'openssl_random_pseudo_bytes' => true,
'openssl_x509_verify' => true,
'ord' => true,
'pack' => true,
'parse_ini_file' => true,
'parse_url' => true,
'password_algos' => true,
'pathinfo' => true,
'pdo::getattribute' => true,
'pdo::prepare' => true,
@@ -742,6 +747,8 @@ class UseReturnValuePlugin extends PluginV3 implements PostAnalyzeNodeCapability
'reflectionproperty::getvalue' => true,
'reflectionproperty::ispublic' => true,
'reflectionproperty::isstatic' => true,
'reflectionreference::fromarrayelement' => true,
'reflectionreference::getid' => true,
'reflectiontype::__tostring' => true,
'resourcebundle::geterrorcode' => true,
'round' => true,

View File

@@ -15,6 +15,7 @@
# The resulting tags file may be combined with tags for JS, CSS, etc.
function usage() {
echo "Usage: $0 [options for phpctags]" 1>&2
echo "You may wish to run ./phan --dump-ctags=basic instead" 1>&2
}
if ! type phpctags ; then