示例#1
0
 function run()
 {
     global $classes, $interfaces;
     $p = new CodeParser();
     OutputWriter::Object()->setNativeInterfaces($interfaces);
     OutputWriter::Object()->setNativeClasses($classes);
     OutputWriter::Object()->setOutputGran($this->gran);
     OutputWriter::Object()->setOutputTarget($this->out);
     //if ($this->gran == OutputWriter::OUTPUT_GRAN_CLASS || $this->gran == OutputWriter::OUTPUT_GRAN_FILE) {
     if (is_dir($this->tgt)) {
         $p->parseRecursive($this->tgt);
     } else {
         $p->parse($this->tgt);
     }
 }
 /** Extract and output a class (or interface) definition from $accum, write the elements name as $tag_name */
 private function parseClassDef($accum, $tag_name)
 {
     //Step 1 - strip crap from the beginning of $accum
     for ($i = count($accum) - 1; $i >= 0; $i--) {
         if ($accum[$i] == ';' || $accum[$i] == '}') {
             $accum = array_slice($accum, count($accum) - $i);
             break;
         }
     }
     //Parse forwards!
     $flag = '';
     $name = '';
     $ext = '';
     $impl = array();
     $abstract_flag = false;
     $commstack = array();
     $line_num = 0;
     $decl = '';
     //YO
     foreach ($accum as $tok) {
         if (is_array($tok)) {
             list($tid, $val, $lnum) = $tok;
             if (!in_array($tid, array(T_COMMENT, T_DOC_COMMENT, T_OPEN_TAG))) {
                 $decl .= $val;
             }
             switch ($tid) {
                 case T_CLASS:
                 case T_INTERFACE:
                     $flag = 'class';
                     break;
                 case T_EXTENDS:
                     $flag = 'ext';
                     break;
                 case T_IMPLEMENTS:
                     $flag = 'impl';
                     break;
                 case T_ABSTRACT:
                     $abstract_flag = true;
                     break;
                 case T_COMMENT:
                 case T_DOC_COMMENT:
                     $commstack[] = $tok;
                     break;
                 case T_STRING:
                     if ($flag == 'class') {
                         $name = $val;
                         $line_num = $lnum;
                     } else {
                         if ($flag == 'ext') {
                             $ext = $val;
                             if (OutputWriter::Object()->isNativeClass($val)) {
                                 $this->accumulateNative($val);
                             }
                         } else {
                             if ($flag == 'impl') {
                                 $impl[] = $val;
                                 if (OutputWriter::Object()->isNativeInterface($val)) {
                                     $this->accumulateNative($val);
                                 }
                             }
                         }
                     }
             }
         } else {
             $decl .= $tok;
         }
     }
     $data = new stdClass();
     $data->comments = $commstack;
     $data->line_number = $line_num;
     $data->name = $name;
     $data->is_native = false;
     $data->abstract_flag = $abstract_flag;
     $data->ext = $ext;
     $data->decl = $decl;
     if ($impl) {
         $data->impl = $impl;
     } else {
         $data->impl = array();
     }
     switch ($tag_name) {
         case 'class':
             $this->ow->startClass($data);
             break;
         case 'interface':
             $this->ow->startInterface($data);
             break;
         default:
             throw new Exception("Unknown tag '{$tag_name}'", 967765);
     }
 }
 function testRecursiveInputClassOutput(&$output)
 {
     echo "\n\ttestRecursiveInputClassOutput\n";
     $p = new CodeParser();
     $tgt = $this->mybase . '/testRecursiveInputClassOutput';
     mkdir($tgt);
     OutputWriter::Object()->setOutputGran(OutputWriter::OUTPUT_GRAN_CLASS);
     OutputWriter::Object()->setOutputTarget($tgt);
     $p->parseRecursive($this->recursive_base);
 }