com gtk/php-gtk: Allowing adding extra programmatic fields (properties).: generator/generator.php generator/override.php

[email protected] (David Soria Parra) Fri, 10 Mar 2006 05:26:44 +0000
Newsgroups php.gtk.cvs
Message-ID <[email protected]>
Commit:    bf1db4b37dad390fa7b1787cf91962e161bc15dd
Author:    Andrei Zmievski <[email protected]>         Fri, 10 Mar 2006 05:26:44 +0000
Parents:   ee088d85b464ff80dbc1cf933bb012a130854d3a
Branches:  master

Link:       http://git.php.net/?p=gtk/php-gtk.git;a=commitdiff;h=bf1db4b37dad390fa7b1787cf91962e161bc15dd

Log:
Allowing adding extra programmatic fields (properties).

Changed paths:
  M  generator/generator.php
  M  generator/override.php


Diff:
bf1db4b37dad390fa7b1787cf91962e161bc15dd
diff --git a/generator/generator.php b/generator/generator.php
index 3da1815..fc914ba 100644
--- a/generator/generator.php
+++ b/generator/generator.php
@@ -534,7 +534,7 @@ class Generator {
     {
         global $matcher;
 
-        if (!$object->fields) {
+        if (!$object->fields && !$this->overrides->have_extra_props($object->c_name)) {
             return 'NULL';
         }
 
@@ -578,7 +578,7 @@ class Generator {
                     }
                     if (isset($overrides['write'])) {
                         $write_override = preg_replace('!^.*(PHPG_PROP_WRITER).*$!m', "static $1($object->c_name, $field_name)", $overrides['write']);
-                        $this->write_override($overrides['read'], $object->c_name, $field_name, 'write');
+                        $this->write_override($overrides['write'], $object->c_name, $field_name, 'write');
                         $this->divert("gen ", "%%%%  %-11s %s->%s\n", "writer for", $object->c_name, $field_name);
                     }
                 } else {
@@ -604,6 +604,35 @@ class Generator {
             } catch (Exception $e) {
                 $this->divert("notgen", "  %-11s %s->%s: %s\n", "reader for", $object->c_name, $field_name, $e->getMessage());
                 $num_skipped++;
+                $this->cover["props"]->skipped();
+            }
+        }
+
+        if ($this->overrides->have_extra_props($object->c_name)) {
+            foreach ($this->overrides->get_extra_props($object->c_name) as $prop_name => $overrides) {
+
+                $read_func = "PHPG_PROP_READ_FN($object->c_name, $prop_name)";
+                $write_func = 'NULL';
+                $info = new Wrapper_Info();
+
+                if (isset($overrides['read'])) {
+                    $read_override = preg_replace('!^.*(PHPG_PROP_READER).*$!m', "$1($object->c_name, $prop_name)", $overrides['read']);
+                    $this->write_override($read_override, $object->c_name, $prop_name, 'read', 'extra');
+                    $this->divert("gen", "%%%%  %-11s %s->%s\n", "reader for", $object->c_name, $prop_name);
+                    $this->cover["props"]->written();
+                } else {
+                    $read_func = 'NULL';
+                }
+
+                if (isset($overrides['write'])) {
+                    $write_override = preg_replace('!^.*(PHPG_PROP_WRITER).*$!m', "static $1($object->c_name, $prop_name)", $overrides['write']);
+                    $this->write_override($overrides['write'], $object->c_name, $prop_name, 'write', 'extra');
+                    $this->divert("gen ", "%%%%  %-11s %s->%s\n", "writer for", $object->c_name, $prop_name);
+                }
+
+                $prop_defs[] = sprintf(Templates::prop_info_entry, 
+                                       $prop_name, $read_func, $write_func);
+                $num_written++;
                 $this->cover["props"]->written();
             }
         }
diff --git a/generator/override.php b/generator/override.php
index 5e2666c..10dadf6 100644
--- a/generator/override.php
+++ b/generator/override.php
@@ -28,9 +28,9 @@ class Overrides {
     var $prop_overrides       = array();
     var $handler_overrides    = array();
     var $extra_methods        = array();
+    var $extra_props          = array();
     var $extra_arginfo        = array();//reflection information
     var $unused_extra_arginfo = array();//which reflection information has not been used
-    var $getprops             = array();
     var $register_classes     = array();
     var $headers              = '';
     var $constants            = '';
@@ -190,6 +190,17 @@ class Overrides {
                 $this->lineinfo["$class.$method"] = array($blocklineno + 1, $file_name);
                 break;
 
+            case 'add-prop':
+                $class = $words[0];
+                $prop = $words[1];
+                if (isset($words[2]))
+                    $type = $words[2];
+                else
+                    $type = 'read';
+                $this->extra_props[$class][$prop][$type] = $rest;
+                $this->lineinfo["$class.$prop.$type.extra"] = array($blocklineno + 1, $file_name);
+                break;
+
             case 'add-arginfo':
                 $class  = $words[0];
                 $method = $words[1];
@@ -263,14 +274,14 @@ class Overrides {
         return $this->extra_methods[$class];
     }
 
-    function have_get_prop($class_name, $prop_name)
+    function have_extra_props($class)
     {
-        return isset($this->getprops[$class_name][$prop_name]);
+        return isset($this->extra_props[$class]);
     }
 
-    function get_prop($class_name, $prop_name)
+    function get_extra_props($class)
     {
-        return $this->getprops[$class_name][$prop_name];
+        return $this->extra_props[$class];
     }
 
     function have_post_registration($class)