From: Jürg Billeter Date: Thu, 10 Aug 2006 12:46:48 +0000 (+0000) Subject: use Invokable vala/valainvokable.vala implement Invokable update X-Git-Tag: VALA_0_0_3~13 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2e3d20edd3434bac30600f503a65ccc11f408339;p=thirdparty%2Fvala.git use Invokable vala/valainvokable.vala implement Invokable update 2006-08-10 Jürg Billeter * 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 --- diff --git a/vala/ChangeLog b/vala/ChangeLog index 37a90e846..f4748a695 100644 --- a/vala/ChangeLog +++ b/vala/ChangeLog @@ -1,3 +1,13 @@ +2006-08-10 Jürg Billeter + + * 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 * vala/parser.y: support constants in namespaces and constants without diff --git a/vala/vala/Makefile.am b/vala/vala/Makefile.am index 74eaff7a6..5dc590923 100644 --- a/vala/vala/Makefile.am +++ b/vala/vala/Makefile.am @@ -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 \ diff --git a/vala/vala/valacodegenerator.vala b/vala/vala/valacodegenerator.vala index c5f1df4d4..bf05988af 100644 --- a/vala/vala/valacodegenerator.vala +++ b/vala/vala/valacodegenerator.vala @@ -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 diff --git a/vala/vala/valafield.vala b/vala/vala/valafield.vala index d045d0a79..3d89c54cc 100644 --- a/vala/vala/valafield.vala +++ b/vala/vala/valafield.vala @@ -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 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/valaformalparameter.vala b/vala/vala/valaformalparameter.vala index bd8b8f1cb..d50ba3da9 100644 --- a/vala/vala/valaformalparameter.vala +++ b/vala/vala/valaformalparameter.vala @@ -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 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 index 000000000..de48be8ca --- /dev/null +++ b/vala/vala/valainvokable.vala @@ -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 + */ + +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 get_parameters (); +} diff --git a/vala/vala/valamethod.vala b/vala/vala/valamethod.vala index e11e5d0b0..66861ee5e 100644 --- a/vala/vala/valamethod.vala +++ b/vala/vala/valamethod.vala @@ -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 get_parameters () { + public override ref List 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); diff --git a/vala/vala/valasemanticanalyzer.vala b/vala/vala/valasemanticanalyzer.vala index b28ac7468..f7db01c53 100644 --- a/vala/vala/valasemanticanalyzer.vala +++ b/vala/vala/valasemanticanalyzer.vala @@ -729,42 +729,15 @@ public class Vala.SemanticAnalyzer : CodeVisitor { List 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 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; diff --git a/vala/vala/valasignal.vala b/vala/vala/valasignal.vala index 846bfc52f..61ae80bef 100644 --- a/vala/vala/valasignal.vala +++ b/vala/vala/valasignal.vala @@ -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 get_parameters () { + public override ref List 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. * diff --git a/vala/vala/valavariabledeclarator.vala b/vala/vala/valavariabledeclarator.vala index 811af5eda..78d92ba18 100644 --- a/vala/vala/valavariabledeclarator.vala +++ b/vala/vala/valavariabledeclarator.vala @@ -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 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); + } }