/** * Determines the type of the given function-parameter * * @param PC_Obj_Method $func the function/method * @param string $varname the variable-name * @return PC_Obj_MultiType the type */ private function get_funcparam_type($func, $varname) { if ($func === null) { return null; } $param = $func->get_param($varname); if ($param === null) { return null; } return $param->get_mtype(); }
/** * Parses the given method-phpdoc * * @param PC_Obj_Method $func the method to which the phpdoc belongs */ public function parse_method_doc($func) { if (isset($this->funcComments[$func->get_name()])) { $doc = $this->funcComments[$func->get_name()]; // look for params $matches = array(); preg_match_all('/\\@param\\s+([^\\s]+)\\s+(&)?\\s*([^\\s]+)/', $doc, $matches); foreach ($matches[1] as $k => $match) { $param = substr($matches[3][$k], 1); // does the param exist? if (($fp = $func->get_param($param)) !== null) { $mtype = PC_Obj_MultiType::get_type_by_name($match); $fptype = $fp->get_mtype(); $isref = $matches[2][$k] != ''; // don't report that if we only know the type from the default value if ($fp->is_reference() != $isref || !$fp->is_mtype_default() && !$fptype->is_unknown() && !$fptype->equals($mtype)) { $docstr = ($isref ? '&' : '') . $mtype; $this->report_error('PHPDoc (' . $docstr . ') does not match the parameter $' . $param . ' (' . $fp . ')', PC_Obj_Error::E_T_PARAM_DIFFERS_FROM_DOC, $func->get_line()); } $fp->set_mtype($mtype); $fp->set_has_doc(true); } else { $this->report_error('Found PHPDoc for parameter "' . $param . '" (' . $match . '),' . ' but the parameter does not exist', PC_Obj_Error::E_T_DOC_WITHOUT_PARAM, $func->get_line()); } } // look for throws preg_match_all('/\\@throws\\s+([^\\s]+)/', $doc, $matches); foreach ($matches[1] as $k => $match) { $func->add_throw($match, PC_Obj_Method::THROW_SELF); } // look for return-type if (preg_match('/\\@return\\s+&?\\s*([^\\s]+)/', $doc, $matches)) { $mtype = PC_Obj_MultiType::get_type_by_name($matches[1]); if ($mtype !== null) { $rettype = $func->get_return_type(); if ($rettype && !$rettype->is_unknown() && !$rettype->equals($mtype)) { $this->report_error('PHPDoc (' . $mtype . ') does not match the return type (' . $rettype . ')', PC_Obj_Error::E_T_RETURN_DIFFERS_FROM_DOC, $func->get_line()); } if (!$rettype || $rettype->is_unknown()) { $func->set_return_type($mtype); } $func->set_has_return_doc(true); } } unset($this->funcComments[$func->get_name()]); } }