<?php
/*
Copyright 2008 Josh Heidenreich
This file is part of Pelzini.
Pelzini is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pelzini is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pelzini. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* Contains the {@link ParserFunction} class
*
* @package Parser model
* @author Josh Heidenreich
* @since 0.1
**/
/**
* Represents a function
**/
class ParserFunction extends CodeParserItem {
public $name;
public $args;
public $throws;
public $visibility;
public $abstract;
public $description;
public $returns;
public $static;
public $final;
public $has_return_stmt;
public function __construct()
{
parent::__construct();
$this->returns = array(); $this->visibility = 'public';
$this->static = false;
$this->final = false;
$this->has_return_stmt = false;
}
/**
* Processes Javadoc tags that are specific to this PaserItem
**/
protected function processSpecificDocblockTags($docblock_tags)
{
$this->description = htmlify_text(@$docblock_tags['@summary']);
if (count($this->returns) == 0 and
!$this->has_return_stmt) { $void_return = new ParserReturn();
$void_return->type = 'void';
$this->returns[] = $void_return;
}
}
/**
* Does post-pasing processing of this ParserFunction.
* Specifically, loads types for the function arguments
**/
public function post_load()
{
foreach ($this->args as $arg) {
$args[$arg->name] = $arg;
}
// Do arguments
$params = @$this->docblock_tags['@param'];
if ($params != null) {
foreach ($params as $idx => $param_tag) {
if (isset($args[$parts[0]])) { // name type desc
$arg = $args[$parts[0]];
if (!$arg->type) $arg->type = $parts[1];
unset($parts[0], $parts[1]);
} else if (isset($args[$parts[1]])) { // type name desc
$arg = $args[$parts[1]];
if (!$arg->type) $arg->type = $parts[0];
unset($parts[0], $parts[1]);
} else {
// type desc
$arg = @$this->args[$idx];
if (!$arg) continue;
if (!$arg->type) $arg->type = $parts[0];
}
$arg->description = htmlify_text
(implode(' ', $parts)); }
}
// Combine @throw and @throws docblock tags
if (isset($this->docblock_tags['@throw'])) { $throws = $this->docblock_tags['@throw'];
}
if (isset($this->docblock_tags['@throws'])) { $throws = array_merge($throws, $this->docblock_tags['@throws']); }
// Process throws
foreach ($throws as $throws_tag) {
if ($throws_tag == '') $throws_tag = 'Exception';
$throw = new ParserThrow();
$throw->exception = $parts[0];
$throw->description = htmlify_text(@$parts[1]);
$this->throws[] = $throw;
}
// Do return value
if (isset($this->docblock_tags['@return'])) { $this->returns = array(); foreach ($this->docblock_tags['@return'] as $return_tag) {
foreach ($types as $t) {
$return = new ParserReturn();
$return->type = trim($t); $return->description = htmlify_text(@$parts[1]);
$this->returns[] = $return;
}
}
}
// If there is only one return tag, and the type ends in ?
// Nuke the ? and create a new return tag called "null"
if (count($this->returns) == 1) { if (substr($this->returns[0]->type, -1) == '?') { $this->returns[0]->type = substr($this->returns[0]->type, 0, -1); $null_return = new ParserReturn();
$null_return->type = 'null';
$this->returns[] = $null_return;
}
}
}
/**
* Debugging use only
**/
public function dump()
{
echo '<div style="border: 1px red solid;">';
echo $this->visibility . ' ';
echo $this->name;
if ($this->abstract) echo '<br>abstract';
if ($this->static) echo '<br>static';
if ($this->final) echo '<br>static';
echo '<br>' . $this->description;
foreach ($this->args as $a) $a->dump();
foreach ($this->throws as $t) $t->dump();
foreach ($this->returns as $r) $r->dump();
parent::dump();
echo '</div>';
}
}
?>