]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
use Invokable vala/valainvokable.vala implement Invokable update
authorJürg Billeter <j@bitron.ch>
Thu, 10 Aug 2006 12:46:48 +0000 (12:46 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Thu, 10 Aug 2006 12:46:48 +0000 (12:46 +0000)
2006-08-10  Jürg Billeter  <j@bitron.ch>

* vala/valasemanticanalyzer.vala, vala/valacodegenerator.vala: use
  Invokable
* vala/valainvokable.vala
* vala/valafield.vala, vala/valaformalparameter.vala,
  vala/valamethod.vala, valasignal.vala,
  vala/valavariabledeclarator.vala: implement Invokable
* vala/Makefile.am: update

svn path=/trunk/; revision=96

vala/ChangeLog
vala/vala/Makefile.am
vala/vala/valacodegenerator.vala
vala/vala/valafield.vala
vala/vala/valaformalparameter.vala
vala/vala/valainvokable.vala [new file with mode: 0644]
vala/vala/valamethod.vala
vala/vala/valasemanticanalyzer.vala
vala/vala/valasignal.vala
vala/vala/valavariabledeclarator.vala

index 37a90e84638fc1bc519f83e7c89d8d6f1636c8b2..f4748a6958e0536445b7de822c800d135bc5106a 100644 (file)
@@ -1,3 +1,13 @@
+2006-08-10  Jürg Billeter  <j@bitron.ch>
+
+       * vala/valasemanticanalyzer.vala, vala/valacodegenerator.vala: use
+         Invokable
+       * vala/valainvokable.vala
+       * vala/valafield.vala, vala/valaformalparameter.vala,
+         vala/valamethod.vala, valasignal.vala,
+         vala/valavariabledeclarator.vala: implement Invokable
+       * vala/Makefile.am: update
+
 2006-08-10  Jürg Billeter  <j@bitron.ch>
 
        * vala/parser.y: support constants in namespaces and constants without
index 74eaff7a63072429592f215fbd6f4017dcd8f2f6..5dc59092315d4b921b58d67aa50ad75cb4f64dcc 100644 (file)
@@ -151,6 +151,9 @@ libvala_la_SOURCES = \
        valainvocationexpression.c \
        valainvocationexpression.h \
        valainvocationexpression.vala \
+       valainvokable.c \
+       valainvokable.h \
+       valainvokable.vala \
        valalambdaexpression.c \
        valalambdaexpression.h \
        valalambdaexpression.vala \
@@ -331,6 +334,7 @@ valainclude_HEADERS = \
        valainterfaceregisterfunction.h \
        valainterfacewriter.h \
        valainvocationexpression.h \
+       valainvokable.h \
        valalambdaexpression.h \
        valaliteral.h \
        valaliteralexpression.h \
index c5f1df4d45e856c103b817fba31c7abaaa958b49..bf05988af42ae65857484fb202e16160953ed3ba 100644 (file)
@@ -1887,26 +1887,15 @@ public class Vala.CodeGenerator : CodeVisitor {
                
                var ma = (MemberAccess) expr.call;
                
-               if (expr.call.symbol_reference.node is VariableDeclarator) {
-                       var decl = (VariableDeclarator) expr.call.symbol_reference.node;
-                       var cb = (Callback) decl.type_reference.data_type;
-                       params = cb.get_parameters ();
-               } else if (expr.call.symbol_reference.node is FormalParameter) {
-                       var param = (FormalParameter) expr.call.symbol_reference.node;
-                       var cb = (Callback) param.type_reference.data_type;
-                       params = cb.get_parameters ();
-               } else if (expr.call.symbol_reference.node is Field) {
-                       var f = (Field) expr.call.symbol_reference.node;
-                       var cb = (Callback) f.type_reference.data_type;
-                       params = cb.get_parameters ();
-               } else if (expr.call.symbol_reference.node is Method) {
-                       m = (Method) expr.call.symbol_reference.node;
-                       params = m.get_parameters ();
-               } else if (expr.call.symbol_reference.node is Signal) {
-                       var sig = (Signal) expr.call.symbol_reference.node;
-                       params = sig.get_parameters ();
-                       
-                       ccall = (CCodeFunctionCall) expr.call.ccodenode;
+               if (expr.call.symbol_reference.node is Invokable) {
+                       var i = (Invokable) expr.call.symbol_reference.node;
+                       params = i.get_parameters ();
+                       
+                       if (i is Method) {
+                               m = (Method) i;
+                       } else if (i is Signal) {
+                               ccall = (CCodeFunctionCall) expr.call.ccodenode;
+                       }
                }
                
                /* explicitly use strong reference as ccall gets unrefed
index d045d0a79d600c492b3618dca7e98bb4fc953684..3d89c54cc0bb24d90ceda83024a38a040dda60c3 100644 (file)
@@ -25,7 +25,7 @@ using GLib;
 /**
  * Represents a type or namespace field.
  */
-public class Vala.Field : CodeNode {
+public class Vala.Field : CodeNode, Invokable {
        /**
         * The symbol name of this field.
         */
@@ -136,4 +136,26 @@ public class Vala.Field : CodeNode {
                        }
                }
        }
+
+       public override ref List<FormalParameter> get_parameters () {
+               if (!is_invokable ()) {
+                       return null;
+               }
+               
+               var cb = (Callback) type_reference.data_type;
+               return cb.get_parameters ();
+       }
+       
+       public override TypeReference get_return_type () {
+               if (!is_invokable ()) {
+                       return null;
+               }
+               
+               var cb = (Callback) type_reference.data_type;
+               return cb.return_type;
+       }
+
+       public override bool is_invokable () {
+               return (type_reference.data_type is Callback);
+       }
 }
index bd8b8f1cb88b64d890e97b522db59454f97703b4..d50ba3da9af5d0ad73d1070eab14f6ab0fde2808 100644 (file)
@@ -25,7 +25,7 @@ using GLib;
 /**
  * Represents a formal parameter in method and callback signatures.
  */
-public class Vala.FormalParameter : CodeNode {
+public class Vala.FormalParameter : CodeNode, Invokable {
        /**
         * The parameter name.
         */
@@ -82,4 +82,26 @@ public class Vala.FormalParameter : CodeNode {
                
                visitor.visit_formal_parameter (this);
        }
+
+       public override ref List<FormalParameter> get_parameters () {
+               if (!is_invokable ()) {
+                       return null;
+               }
+               
+               var cb = (Callback) type_reference.data_type;
+               return cb.get_parameters ();
+       }
+       
+       public override TypeReference get_return_type () {
+               if (!is_invokable ()) {
+                       return null;
+               }
+               
+               var cb = (Callback) type_reference.data_type;
+               return cb.return_type;
+       }
+
+       public override bool is_invokable () {
+               return (type_reference.data_type is Callback);
+       }
 }
diff --git a/vala/vala/valainvokable.vala b/vala/vala/valainvokable.vala
new file mode 100644 (file)
index 0000000..de48be8
--- /dev/null
@@ -0,0 +1,49 @@
+/* valainvokable.vala
+ *
+ * Copyright (C) 2006  Jürg Billeter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+
+ * This library 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
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+ *
+ * Author:
+ *     Jürg Billeter <j@bitron.ch>
+ */
+
+using GLib;
+
+/**
+ * Represents a possibly invokable code object.
+ */
+public interface Vala.Invokable {
+       /**
+        * Returns whether this code object is invokable.
+        *
+        * @return true if invokable, false otherwise
+        */
+       public abstract bool is_invokable ();
+
+       /**
+        * Returns the return type of this invokable.
+        *
+        * @return return type
+        */
+       public abstract TypeReference get_return_type ();
+       
+       /**
+        * Returns copy of the list of invocation parameters.
+        *
+        * @return parameter list
+        */
+       public abstract ref List<FormalParameter> get_parameters ();
+}
index e11e5d0b054b70f99b393887deb363c986334bf7..66861ee5ea2986ba5ec15ddd7f7ca86dde650809 100644 (file)
@@ -25,7 +25,7 @@ using GLib;
 /**
  * Represents a type or namespace method.
  */
-public class Vala.Method : CodeNode {
+public class Vala.Method : CodeNode, Invokable {
        /**
         * The symbol name of this method.
         */
@@ -140,15 +140,18 @@ public class Vala.Method : CodeNode {
                parameters.append (param);
        }
        
-       /**
-        * Returns copy of the list of method parameters.
-        *
-        * @return parameter list
-        */
-       public ref List<FormalParameter> get_parameters () {
+       public override ref List<FormalParameter> get_parameters () {
                return parameters.copy ();
        }
        
+       public override TypeReference get_return_type () {
+               return return_type;
+       }
+
+       public override bool is_invokable () {
+               return true;
+       }
+       
        public override void accept (CodeVisitor! visitor) {
                visitor.visit_begin_method (this);
                
index b28ac7468757ab250534526367e7084277953760..f7db01c533d73c0f544e43d19b1054f50cbeaf53 100644 (file)
@@ -729,42 +729,15 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                
                List<FormalParameter> params;
                
-               if (msym.node is VariableDeclarator) {
-                       var decl = (VariableDeclarator) msym.node;
-                       if (decl.type_reference.data_type is Callback) {
-                               var cb = (Callback) decl.type_reference.data_type;
-                               params = cb.get_parameters ();
+               if (msym.node is Invokable) {
+                       var m = (Invokable) msym.node;
+                       if (m.is_invokable ()) {
+                               params = m.get_parameters ();
                        } else {
                                expr.error = true;
                                Report.error (expr.source_reference, "invocation not supported in this context");
                                return;
                        }
-               } else if (msym.node is FormalParameter) {
-                       var param = (FormalParameter) msym.node;
-                       if (param.type_reference.data_type is Callback) {
-                               var cb = (Callback) param.type_reference.data_type;
-                               params = cb.get_parameters ();
-                       } else {
-                               expr.error = true;
-                               Report.error (expr.source_reference, "invocation not supported in this context");
-                               return;
-                       }
-               } else if (msym.node is Field) {
-                       var f = (Field) msym.node;
-                       if (f.type_reference.data_type is Callback) {
-                               var cb = (Callback) f.type_reference.data_type;
-                               params = cb.get_parameters ();
-                       } else {
-                               expr.error = true;
-                               Report.error (expr.source_reference, "invocation not supported in this context");
-                               return;
-                       }
-               } else if (msym.node is Method) {
-                       var m = (Method) msym.node;
-                       params = m.get_parameters ();
-               } else if (msym.node is Signal) {
-                       var sig = (Signal) msym.node;
-                       params = sig.get_parameters ();
                } else {
                        expr.error = true;
                        Report.error (expr.source_reference, "invocation not supported in this context");
@@ -846,29 +819,10 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                TypeReference ret_type;
                List<FormalParameter> params;
                
-               if (msym.node is VariableDeclarator) {
-                       var decl = (VariableDeclarator) msym.node;
-                       var cb = (Callback) decl.type_reference.data_type;
-                       ret_type = cb.return_type;
-                       params = cb.get_parameters ();
-               } else if (msym.node is FormalParameter) {
-                       var param = (FormalParameter) msym.node;
-                       var cb = (Callback) param.type_reference.data_type;
-                       ret_type = cb.return_type;
-                       params = cb.get_parameters ();
-               } else if (msym.node is Field) {
-                       var f = (Field) msym.node;
-                       var cb = (Callback) f.type_reference.data_type;
-                       ret_type = cb.return_type;
-                       params = cb.get_parameters ();
-               } else if (msym.node is Method) {
-                       var m = (Method) msym.node;
-                       ret_type = m.return_type;
+               if (msym.node is Invokable) {
+                       var m = (Invokable) msym.node;
+                       ret_type = m.get_return_type ();
                        params = m.get_parameters ();
-               } else if (msym.node is Signal) {
-                       var sig = (Signal) msym.node;
-                       ret_type = sig.return_type;
-                       params = sig.get_parameters ();
                }
        
                expr.static_type = ret_type;
index 846bfc52fac310ba5fd1f33b59218ae05e9c9db6..61ae80bef1cfe8512b341652fe29776d3c537ffa 100644 (file)
@@ -25,7 +25,7 @@ using GLib;
 /**
  * Represents an object signal. Signals enable objects to provide notifications.
  */
-public class Vala.Signal : CodeNode {
+public class Vala.Signal : CodeNode, Invokable {
        /**
         * The symbol name of this signal.
         */
@@ -75,15 +75,18 @@ public class Vala.Signal : CodeNode {
                parameters.append (param);
        }
 
-       /**
-        * Returns copy of list of signal handler parameters.
-        *
-        * @return parameter list
-        */
-       public ref List<FormalParameter> get_parameters () {
+       public override ref List<FormalParameter> get_parameters () {
                return parameters.copy ();
        }
        
+       public override TypeReference get_return_type () {
+               return return_type;
+       }
+
+       public override bool is_invokable () {
+               return true;
+       }
+       
        /**
         * Returns generated callback to be used for signal handlers.
         *
index 811af5eda95e903346af607a068b43f3f150cc37..78d92ba18092a95cf4d2dd6eb4a670546b809163 100644 (file)
@@ -25,7 +25,7 @@ using GLib;
 /**
  * Represents a variable declarator in the source code.
  */
-public class Vala.VariableDeclarator : CodeNode {
+public class Vala.VariableDeclarator : CodeNode, Invokable {
        /**
         * The variable name.
         */
@@ -68,4 +68,26 @@ public class Vala.VariableDeclarator : CodeNode {
        
                visitor.visit_variable_declarator (this);
        }
+
+       public override ref List<FormalParameter> get_parameters () {
+               if (!is_invokable ()) {
+                       return null;
+               }
+               
+               var cb = (Callback) type_reference.data_type;
+               return cb.get_parameters ();
+       }
+       
+       public override TypeReference get_return_type () {
+               if (!is_invokable ()) {
+                       return null;
+               }
+               
+               var cb = (Callback) type_reference.data_type;
+               return cb.return_type;
+       }
+
+       public override bool is_invokable () {
+               return (type_reference.data_type is Callback);
+       }
 }