mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-12-29 00:40:57 +01:00
141 lines
3.6 KiB
PHP
141 lines
3.6 KiB
PHP
|
#!/usr/bin/env php
|
||
|
<?php
|
||
|
|
||
|
require_once dirname(__FILE__).'/__init_script__.php';
|
||
|
|
||
|
$target = 'resources/php_compat_info.json';
|
||
|
echo phutil_console_format(
|
||
|
"%s\n",
|
||
|
pht(
|
||
|
'Purpose: Updates %s used by %s.',
|
||
|
$target,
|
||
|
'ArcanistXHPASTLinter'));
|
||
|
|
||
|
// PHP CompatInfo is installed via Composer.
|
||
|
//
|
||
|
// You should symlink the Composer vendor directory to
|
||
|
// libphutil/externals/includes/vendor`.
|
||
|
require_once 'vendor/autoload.php';
|
||
|
|
||
|
$output = array();
|
||
|
$output['@'.'generated'] = true;
|
||
|
$output['params'] = array();
|
||
|
$output['functions'] = array();
|
||
|
$output['classes'] = array();
|
||
|
$output['interfaces'] = array();
|
||
|
$output['constants'] = array();
|
||
|
|
||
|
/**
|
||
|
* Transform compatibility info into a slightly different format.
|
||
|
*
|
||
|
* The data returned by PHP CompatInfo is slightly odd in that null data is
|
||
|
* represented by an empty string.
|
||
|
*
|
||
|
* @param map<string, string>
|
||
|
* @return map<string, string | null>
|
||
|
*/
|
||
|
function parse_compat_info(array $compat) {
|
||
|
return array(
|
||
|
'ext.name' => $compat['ext.name'],
|
||
|
'ext.min' => nonempty($compat['ext.min'], null),
|
||
|
'ext.max' => nonempty($compat['ext.max'], null),
|
||
|
'php.min' => nonempty($compat['php.min'], null),
|
||
|
'php.max' => nonempty($compat['php.max'], null),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
$client = new \Bartlett\Reflect\Client();
|
||
|
$api = $client->api('reference');
|
||
|
|
||
|
foreach ($api->dir() as $extension) {
|
||
|
$result = $api->show(
|
||
|
$extension->name,
|
||
|
false,
|
||
|
false,
|
||
|
false,
|
||
|
true,
|
||
|
true,
|
||
|
true,
|
||
|
true,
|
||
|
true);
|
||
|
|
||
|
foreach ($result['constants'] as $constant => $compat) {
|
||
|
$output['constants'][$constant] = parse_compat_info($compat);
|
||
|
}
|
||
|
|
||
|
foreach ($result['functions'] as $function => $compat) {
|
||
|
$output['functions'][$function] = parse_compat_info($compat);
|
||
|
|
||
|
if (idx($compat, 'parameters')) {
|
||
|
$output['params'][$function] = explode(', ', $compat['parameters']);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
foreach ($result['classes'] as $class => $compat) {
|
||
|
$output['classes'][$class] = parse_compat_info($compat);
|
||
|
}
|
||
|
|
||
|
foreach ($result['interfaces'] as $interface => $compat) {
|
||
|
$output['interfaces'][$interface] = parse_compat_info($compat);
|
||
|
}
|
||
|
|
||
|
foreach ($result['methods'] as $class => $methods) {
|
||
|
$output['methods'][$class] = array();
|
||
|
|
||
|
foreach ($methods as $method => $compat) {
|
||
|
$output['methods'][$class][$method] = parse_compat_info($compat);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
foreach ($result['static methods'] as $class => $methods) {
|
||
|
$output['static_methods'][$class] = array();
|
||
|
|
||
|
foreach ($methods as $method => $compat) {
|
||
|
$output['static_methods'][$class][$method] = parse_compat_info($compat);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ksort($output['params']);
|
||
|
ksort($output['functions']);
|
||
|
ksort($output['classes']);
|
||
|
ksort($output['interfaces']);
|
||
|
ksort($output['constants']);
|
||
|
|
||
|
// Grepped from PHP Manual.
|
||
|
// TODO: Can we get this from PHP CompatInfo?
|
||
|
// See https://github.com/llaville/php-compat-info/issues/185.
|
||
|
$output['functions_windows'] = array(
|
||
|
'apache_child_terminate' => false,
|
||
|
'chroot' => false,
|
||
|
'getrusage' => false,
|
||
|
'imagecreatefromxpm' => false,
|
||
|
'lchgrp' => false,
|
||
|
'lchown' => false,
|
||
|
'nl_langinfo' => false,
|
||
|
'strptime' => false,
|
||
|
'sys_getloadavg' => false,
|
||
|
'checkdnsrr' => '5.3.0',
|
||
|
'dns_get_record' => '5.3.0',
|
||
|
'fnmatch' => '5.3.0',
|
||
|
'getmxrr' => '5.3.0',
|
||
|
'getopt' => '5.3.0',
|
||
|
'imagecolorclosesthwb' => '5.3.0',
|
||
|
'inet_ntop' => '5.3.0',
|
||
|
'inet_pton' => '5.3.0',
|
||
|
'link' => '5.3.0',
|
||
|
'linkinfo' => '5.3.0',
|
||
|
'readlink' => '5.3.0',
|
||
|
'socket_create_pair' => '5.3.0',
|
||
|
'stream_socket_pair' => '5.3.0',
|
||
|
'symlink' => '5.3.0',
|
||
|
'time_nanosleep' => '5.3.0',
|
||
|
'time_sleep_until' => '5.3.0',
|
||
|
);
|
||
|
|
||
|
Filesystem::writeFile(
|
||
|
phutil_get_library_root('phutil').'/../'.$target,
|
||
|
id(new PhutilJSON())->encodeFormatted($output));
|
||
|
|
||
|
echo pht('Done.')."\n";
|