'function' => $callable,
'signature' => $funcSigs['sigs'],
'docstring' => $funcDesc['desc'],
- 'signature_docs' => $funcSigs['pSigs'],
+ 'signature_docs' => $funcSigs['sigsDocs'],
'source' => $code
);
} elseif (strpos($doc, '@param') === 0) {
// syntax: @param type [$name] desc
if (preg_match('/@param\s+(\S+)(\s+\$\S+)?\s+(.+)/', $doc, $matches)) {
- if (strpos($matches[1], '|')) {
- //$paramDocs[$i]['type'] = explode('|', $matches[1]);
- $paramDocs[$i]['type'] = 'mixed';
+ if ($matches[2] == '' && substr($matches[3], 0, 1) == '$') {
+ // syntax: @param type $name
+ $name = strtolower(trim($matches[3]));
+ $paramDocs[$name]['name'] = trim($matches[3]);
+ $paramDocs[$name]['doc'] = '';
} else {
- $paramDocs[$i]['type'] = $matches[1];
+ $name = strtolower(trim($matches[2]));
+ $paramDocs[$name]['name'] = trim($matches[2]);
+ $paramDocs[$name]['doc'] = $matches[3];
}
- $paramDocs[$i]['name'] = trim($matches[2]);
- $paramDocs[$i]['doc'] = $matches[3];
+
+ $paramDocs[$name]['type'] = $matches[1];
}
$i++;
} elseif (strpos($doc, '@return') === 0) {
- // syntax: @return type desc
- //$returns = preg_split('/\s+/', $doc);
- if (preg_match('/@return\s+(\S+)\s+(.+)/', $doc, $matches)) {
- $returns = $this->php_2_xmlrpc_type($matches[1]);
+ // syntax: @return type [desc]
+ if (preg_match('/@return\s+(\S+)(\s+.+)?/', $doc, $matches)) {
+ $returns = $matches[1];
if (isset($matches[2])) {
- $returnsDocs = $matches[2];
+ $returnsDocs = trim($matches[2]);
}
}
}
'desc' => $desc,
'docs' => $docs,
'params' => $params,
- 'paramsDocs' => $paramDocs,
+ 'paramDocs' => $paramDocs,
'returns' => $returns,
'returnsDocs' =>$returnsDocs,
);
/**
* Given the method description given by introspection, create method signature data
*
+ * @todo support better docs with multiple types separated by pipes by creating multiple signatures
+ *
* @param array $funcDesc as generated by self::introspectFunction()
*
* @return array
$pars = array();
$pNum = count($funcDesc['params']);
foreach ($funcDesc['params'] as $param) {
- if (isset($funcDesc['paramDocs'][$i]['name']) && $funcDesc['paramDocs'][$i]['name'] &&
- strtolower($funcDesc['paramDocs'][$i]['name']) != strtolower($param['name'])) {
- // param name from phpdoc info does not match param definition!
- $funcDesc['paramDocs'][$i]['type'] = 'mixed';
+ /* // match by name real param and documented params
+ $name = strtolower($param['name']);
+ if (!isset($funcDesc['paramDocs'][$name])) {
+ $funcDesc['paramDocs'][$name] = array();
}
+ if (!isset($funcDesc['paramDocs'][$name]['type'])) {
+ $funcDesc['paramDocs'][$name]['type'] = 'mixed';
+ }*/
if ($param['isoptional']) {
// this particular parameter is optional. save as valid previous list of parameters
}
$sigs = array();
- $pSigs = array();
+ $sigsDocs = array();
foreach ($parsVariations as $pars) {
- // build a 'generic' signature (only use an appropriate return type)
- $sig = array($funcDesc['returns']);
+ // build a signature
+ $sig = array($this->php_2_xmlrpc_type($funcDesc['returns']));
$pSig = array($funcDesc['returnsDocs']);
for ($i = 0; $i < count($pars); $i++) {
- if (isset($funcDesc['paramDocs'][$i]['type'])) {
- $sig[] = $this->php_2_xmlrpc_type($funcDesc['paramDocs'][$i]['type']);
+ $name = strtolower($funcDesc['params'][$i]['name']);
+ if (isset($funcDesc['paramDocs'][$name]['type'])) {
+ $sig[] = $this->php_2_xmlrpc_type($funcDesc['paramDocs'][$name]['type']);
} else {
$sig[] = Value::$xmlrpcValue;
}
- $pSig[] = isset($funcDesc['paramDocs'][$i]['doc']) ? $funcDesc['paramDocs'][$i]['doc'] : '';
+ $pSig[] = isset($funcDesc['paramDocs'][$name]['doc']) ? $funcDesc['paramDocs'][$name]['doc'] : '';
}
$sigs[] = $sig;
- $pSigs[] = $pSig;
+ $sigsDocs[] = $pSig;
}
return array(
'sigs' => $sigs,
- 'pSigs' => $pSigs
+ 'sigsDocs' => $sigsDocs
);
}
}
$debug = isset($extraOptions['debug']) ? ($extraOptions['debug']) : 0;
- $msgClass = $namespace . 'Request';
+ $reqClass = $namespace . 'Request';
$valClass = $namespace . 'Value';
$decoderClass = $namespace . 'Encoder';
- $msg = new $msgClass('system.methodSignature');
- $msg->addparam(new $valClass($methodName));
+ $req = new $reqClass('system.methodSignature');
+ $req->addparam(new $valClass($methodName));
$client->setDebug($debug);
- $response = $client->send($msg, $timeout, $protocol);
+ $response = $client->send($req, $timeout, $protocol);
if ($response->faultCode()) {
error_log('XML-RPC: could not retrieve method signature from remote server for method ' . $methodName);
// if in 'offline' mode, get method description too.
// in online mode, favour speed of operation
if (!$buildIt) {
- $msg = new $msgClass('system.methodHelp');
- $msg->addparam(new $valClass($methodName));
- $response = $client->send($msg, $timeout, $protocol);
+ $req = new $reqClass('system.methodHelp');
+ $req->addparam(new $valClass($methodName));
+ $response = $client->send($req, $timeout, $protocol);
if (!$response->faultCode()) {
$mDesc = $response->value();
if ($client->return_type != 'phpvals') {
$prefix = isset($extraOptions['prefix']) ? $extraOptions['prefix'] : 'xmlrpc';
$namespace = '\\PhpXmlRpc\\';
- $msgClass = $namespace . 'Request';
+ $reqClass = $namespace . 'Request';
//$valClass = $prefix.'val';
$decoderClass = $namespace . 'Encoder';
- $msg = new $msgClass('system.listMethods');
- $response = $client->send($msg, $timeout, $protocol);
+ $req = new $reqClass('system.listMethods');
+ $response = $client->send($req, $timeout, $protocol);
if ($response->faultCode()) {
error_log('XML-RPC: could not retrieve method list from remote server');