]> granicus.if.org Git - php/commitdiff
* start using the source tokenizer
authorStig Bakken <ssb@php.net>
Mon, 3 Feb 2003 02:54:39 +0000 (02:54 +0000)
committerStig Bakken <ssb@php.net>
Mon, 3 Feb 2003 02:54:39 +0000 (02:54 +0000)
pear/PEAR/Common.php

index 560dff893f469c7b3ff7f3b45fb19947f1fec041..83c8d20f3903fb02fe958b6bf869d91c53b5afaa 100644 (file)
@@ -472,6 +472,13 @@ class PEAR_Common extends PEAR
                     $this->pkginfo['configure_options'][] = $attribs;
                 }
                 break;
+            case 'provides':
+                if (empty($attribs['type']) || empty($attribs['name'])) {
+                    break;
+                }
+                $attribs['explicit'] = true;
+                $this->pkginfo['provides']["$attribs[type];$attribs[name]"] = $attribs;
+                break;
         }
     }
 
@@ -925,6 +932,12 @@ class PEAR_Common extends PEAR
             }
             $ret .= "$indent    </configureoptions>\n";
         }
+        if (isset($pkginfo['provides'])) {
+            foreach ($pkginfo['provides'] as $key => $what) {
+                $ret .= "$indent    <provides type=\"$what[type]\" ";
+                $ret .= "name=\"$what[name]\" />\n";
+            }
+        }
         if (isset($pkginfo['filelist'])) {
             $ret .= "$indent    <filelist>\n";
             foreach ($pkginfo['filelist'] as $file => $fa) {
@@ -1087,17 +1100,101 @@ class PEAR_Common extends PEAR
             foreach ($info['filelist'] as $file => $fa) {
                 if (empty($fa['role'])) {
                     $errors[] = "file $file: missing role";
+                    continue;
                 } elseif (!in_array($fa['role'], $_PEAR_Common_file_roles)) {
                     $errors[] = "file $file: invalid role, should be one of: ".implode(' ', $_PEAR_Common_file_roles);
                 }
+                if ($fa['role'] == 'php') {
+                    $srcinfo = $this->analyzeSourceCode($file);
+                    $this->buildProvidesArray($srcinfo);
+                }
                 // (ssb) Any checks we can do for baseinstalldir?
                 // (cox) Perhaps checks that either the target dir and
                 //       baseInstall doesn't cointain "../../"
             }
         }
+        $pn = $info['package'];
+        $pnl = strlen($pn);
+        foreach ($this->pkginfo['provides'] as $key => $what) {
+            if (isset($what['explicit'])) {
+                // skip conformance checks if the provides entry is
+                // specified in the package.xml file
+                continue;
+            }
+            extract($what);
+            if ($type == 'class') {
+                if (!strncasecmp($name, $pn, $pnl)) {
+                    continue;
+                }
+                $warnings[] = "in $file: class \"$name\" not prefixed with package name \"$pn\"";
+            } elseif ($type == 'function') {
+                if (strstr($name, '::') || !strncasecmp($name, $pn, $pnl)) {
+                    continue;
+                }
+                $warnings[] = "in $file: function \"$name\" not prefixed with package name \"$pn\"";
+            }
+            //print "$file: provides $what[type] $what[name]\n";
+        }
         return true;
     }
 
+    // }}}
+    // {{{ buildProvidesArray()
+
+    /**
+     * Build a "provides" array from data returned by
+     * analyzeSourceCode().  The format of the built array is like
+     * this:
+     * 
+     *  array(
+     *    'class;MyClass' => 'array('type' => 'class', 'name' => 'MyClass'),
+     *    ...
+     *  )
+     *
+     *
+     * @param array $srcinfo array with information about a source file
+     * as returned by the analyzeSourceCode() method.
+     *
+     * @return void
+     *
+     * @access public
+     * 
+     */
+    function buildProvidesArray($srcinfo)
+    {
+        foreach ($srcinfo['declared_classes'] as $class) {
+            $key = "class;$class";
+            if (isset($this->pkginfo['provides'][$key])) {
+                continue;
+            }
+            $this->pkginfo['provides'][$key] =
+                array('type' => 'class', 'name' => $class);
+            //var_dump($key, $this->pkginfo['provides'][$key]);
+        }
+        foreach ($srcinfo['declared_methods'] as $class => $methods) {
+            foreach ($methods as $method) {
+                $function = "$class::$method";
+                $key = "function;$function";
+                if ($method{0} == '_' || !strcasecmp($method, $class) ||
+                    isset($this->pkginfo['provides'][$key])) {
+                    continue;
+                }
+                $this->pkginfo['provides'][$key] =
+                    array('type' => 'function', 'name' => $function);
+                //var_dump($key, $this->pkginfo['provides'][$key]);
+            }
+        }
+        foreach ($srcinfo['declared_functions'] as $function) {
+            $key = "function;$function";
+            if ($function{0} == '_' || isset($this->pkginfo['provides'][$key])) {
+                continue;
+            }
+            $this->pkginfo['provides'][$key] =
+                array('type' => 'function', 'name' => $function);
+            //var_dump($key, $this->pkginfo['provides'][$key]);
+        }
+    }
+
     // }}}
     // {{{ analyzeSourceCode()
 
@@ -1120,7 +1217,7 @@ class PEAR_Common extends PEAR
         $tokens = token_get_all($contents);
 /*
         for ($i = 0; $i < sizeof($tokens); $i++) {
-            list($token, $data) = $tokens[$i];
+            @list($token, $data) = $tokens[$i];
             if (is_string($token)) {
                 var_dump($token);
             } else {
@@ -1145,8 +1242,15 @@ class PEAR_Common extends PEAR
         $used_functions = array();
         $nodeps = array();
         for ($i = 0; $i < sizeof($tokens); $i++) {
-            list($token, $data) = $tokens[$i];
+            if (is_array($tokens[$i])) {
+                list($token, $data) = $tokens[$i];
+            } else {
+                $token = $tokens[$i];
+                $data = '';
+            }
             switch ($token) {
+                case T_CURLY_OPEN:
+                case T_DOLLAR_OPEN_CURLY_BRACES:
                 case '{': $brace_level++; continue 2;
                 case '}':
                     $brace_level--;