check method signatures of overriding methods support abstract classes add
authorJürg Billeter <j@bitron.ch>
Sat, 8 Jul 2006 14:09:42 +0000 (14:09 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Sat, 8 Jul 2006 14:09:42 +0000 (14:09 +0000)
2006-07-08  Jürg Billeter  <j@bitron.ch>

* vala/valasemanticanalyzer.vala: check method signatures of overriding
  methods
* vala/parser.y, vala/valaclassregisterfunction.vala,
  vala/valatyperegisterfunction.vala: support abstract classes
* vala/valamethod.vala: add equals method
* vala/valatypereference.vala: add equals method
* corrects overriding methods to match signatures of overridden methods
  to fix build with current compiler

svn path=/trunk/; revision=73

76 files changed:
vala/ChangeLog
vala/ccode/valaccodeassignment.vala
vala/ccode/valaccodebinaryexpression.vala
vala/ccode/valaccodeblock.vala
vala/ccode/valaccodebreakstatement.vala
vala/ccode/valaccodecasestatement.vala
vala/ccode/valaccodecommaexpression.vala
vala/ccode/valaccodecomment.vala
vala/ccode/valaccodeconditionalexpression.vala
vala/ccode/valaccodeconstant.vala
vala/ccode/valaccodecontinuestatement.vala
vala/ccode/valaccodedeclaration.vala
vala/ccode/valaccodeemptystatement.vala
vala/ccode/valaccodeenum.vala
vala/ccode/valaccodeexpressionstatement.vala
vala/ccode/valaccodeformalparameter.vala
vala/ccode/valaccodeforstatement.vala
vala/ccode/valaccodefragment.vala
vala/ccode/valaccodefunction.vala
vala/ccode/valaccodefunctiondeclarator.vala
vala/ccode/valaccodeidentifier.vala
vala/ccode/valaccodeifstatement.vala
vala/ccode/valaccodeincludedirective.vala
vala/ccode/valaccodeinitializerlist.vala
vala/ccode/valaccodemacroreplacement.vala
vala/ccode/valaccodememberaccess.vala
vala/ccode/valaccodenewline.vala
vala/ccode/valaccodeoncesection.vala
vala/ccode/valaccodeparenthesizedexpression.vala
vala/ccode/valaccodereturnstatement.vala
vala/ccode/valaccodestruct.vala
vala/ccode/valaccodeswitchstatement.vala
vala/ccode/valaccodetypedefinition.vala
vala/ccode/valaccodeunaryexpression.vala
vala/ccode/valaccodevariabledeclarator.vala
vala/ccode/valaccodewhilestatement.vala
vala/vala/parser.y
vala/vala/valacallback.vala
vala/vala/valacastexpression.vala
vala/vala/valaclass.vala
vala/vala/valaclassregisterfunction.vala
vala/vala/valaconstant.vala
vala/vala/valadatatype.vala
vala/vala/valaenum.vala
vala/vala/valaflags.vala
vala/vala/valaformalparameter.vala
vala/vala/valaifstatement.vala
vala/vala/valainitializerlist.vala
vala/vala/valainterface.vala
vala/vala/valainterfaceregisterfunction.vala
vala/vala/valainterfacewriter.vala
vala/vala/valainvocationexpression.vala
vala/vala/valaliteralexpression.vala
vala/vala/valalocalvariabledeclaration.vala
vala/vala/valamemberaccess.vala
vala/vala/valamemorymanager.vala
vala/vala/valamethod.vala
vala/vala/valanamedargument.vala
vala/vala/valanamespace.vala
vala/vala/valanamespacereference.vala
vala/vala/valaobjectcreationexpression.vala
vala/vala/valaparenthesizedexpression.vala
vala/vala/valaparser.vala
vala/vala/valapostfixexpression.vala
vala/vala/valaproperty.vala
vala/vala/valapropertyaccessor.vala
vala/vala/valareturnstatement.vala
vala/vala/valasemanticanalyzer.vala
vala/vala/valatypecheck.vala
vala/vala/valatypeofexpression.vala
vala/vala/valatypeparameter.vala
vala/vala/valatypereference.vala
vala/vala/valatyperegisterfunction.vala
vala/vala/valaunaryexpression.vala
vala/vala/valavariabledeclarator.vala
vala/vala/valawhilestatement.vala

index 2598ef5..cfda68d 100644 (file)
@@ -1,5 +1,16 @@
 2006-07-08  Jürg Billeter  <j@bitron.ch>
 
+       * vala/valasemanticanalyzer.vala: check method signatures of overriding
+         methods
+       * vala/parser.y, vala/valaclassregisterfunction.vala,
+         vala/valatyperegisterfunction.vala: support abstract classes
+       * vala/valamethod.vala: add equals method
+       * vala/valatypereference.vala: add equals method
+       * corrects overriding methods to match signatures of overridden methods
+         to fix build with current compiler
+
+2006-07-08  Jürg Billeter  <j@bitron.ch>
+
        * vala/parser.y, vala/valacodegenerator.vala: adapt to ForStatement API
          changes
        * vala/valaclass.vala: make {get,set}_lower_case_csuffix methods private
index 702c3cd..cb53c61 100644 (file)
@@ -41,7 +41,7 @@ public class Vala.CCodeAssignment : CCodeExpression {
         */
        public CCodeExpression right { get; construct; }
        
-       public override void write (CCodeWriter writer) {
+       public override void write (CCodeWriter! writer) {
                if (left != null) {
                        left.write (writer);
                }
index a733abf..894c8ea 100644 (file)
@@ -28,7 +28,7 @@ namespace Vala {
                public CCodeExpression left { get; construct; }
                public CCodeExpression right { get; construct; }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        if (left != null) {
                                left.write (writer);
                        }
index a310ca9..61819ab 100644 (file)
@@ -36,7 +36,7 @@ namespace Vala {
                        statements.append (statement);
                }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_begin_block ();
                        foreach (CCodeNode statement in statements) {
                                statement.write (writer);
index b38cb9b..22e1fd2 100644 (file)
@@ -24,7 +24,7 @@ using GLib;
 
 namespace Vala {
        public class CCodeBreakStatement : CCodeStatement {
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_indent ();
                        writer.write_string ("break;");
                        writer.write_newline ();
index 0f4ba3e..8ad468a 100644 (file)
@@ -27,11 +27,11 @@ namespace Vala {
                public CCodeExpression expression { get; construct; }
                List<CCodeStatement> statements;
                
-               public void add_statement (CCodeStatement stmt) {
+               public void add_statement (CCodeStatement! stmt) {
                        statements.append (stmt);
                }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_indent ();
                        writer.write_string ("case ");
                        expression.write (writer);
index fc507d9..a2bb424 100644 (file)
@@ -26,7 +26,7 @@ namespace Vala {
        public class CCodeCommaExpression : CCodeExpression {
                public List<CCodeExpression> inner;
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        bool first = true;
                
                        writer.write_string ("(");
index 37ca8cd..a1eeb14 100644 (file)
@@ -26,7 +26,7 @@ namespace Vala {
        public class CCodeComment : CCodeNode {
                public string text { get; construct; }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_comment (text);
                }
        }
index f1e2f3a..27a9b96 100644 (file)
@@ -28,7 +28,7 @@ namespace Vala {
                public CCodeExpression true_expression { get; construct; }
                public CCodeExpression false_expression { get; construct; }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_string ("(");
                        condition.write (writer);
                        writer.write_string (" ? ");
index 72fe06c..5142cbb 100644 (file)
@@ -26,7 +26,7 @@ namespace Vala {
        public class CCodeConstant : CCodeExpression {
                public string name { get; construct; }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_string (name);
                }
        }
index 7bf8d62..299b421 100644 (file)
@@ -24,7 +24,7 @@ using GLib;
 
 namespace Vala {
        public class CCodeContinueStatement : CCodeStatement {
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_indent ();
                        writer.write_string ("continue;");
                        writer.write_newline ();
index 06067e2..51d9c30 100644 (file)
@@ -28,11 +28,11 @@ namespace Vala {
                public CCodeModifiers modifiers;
                List<CCodeDeclarator> declarators;
                
-               public void add_declarator (CCodeDeclarator decl) {
+               public void add_declarator (CCodeDeclarator! decl) {
                        declarators.append (decl);
                }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_indent ();
                        if ((modifiers & CCodeModifiers.STATIC) == CCodeModifiers.STATIC) {
                                writer.write_string ("static ");
index 4b8df11..ecc76f8 100644 (file)
@@ -24,7 +24,7 @@ using GLib;
 
 namespace Vala {
        public class CCodeEmptyStatement : CCodeStatement {
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_indent ();
                        writer.write_string (";");
                        writer.write_newline ();
index 6ccd1ea..5b747da 100644 (file)
@@ -27,7 +27,7 @@ namespace Vala {
                public string name { get; construct; }
                List<string> values;
                
-               public void add_value (string name, string value) {
+               public void add_value (string! name, string value = null) {
                        if (value == null) {
                                values.append (name);
                        } else {
@@ -35,7 +35,7 @@ namespace Vala {
                        }
                }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        if (name != null) {
                                writer.write_string ("typedef ");
                        }
index 9ff35ad..a4703ba 100644 (file)
@@ -26,7 +26,7 @@ namespace Vala {
        public class CCodeExpressionStatement : CCodeStatement {
                public CCodeExpression expression { get; construct; }
        
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_indent ();
                        if (expression != null) {
                                expression.write (writer);
index 655728a..98bff02 100644 (file)
@@ -27,7 +27,7 @@ namespace Vala {
                public string name { get; construct; }
                public string type_name { get; construct; }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_string (type_name);
                        writer.write_string (" ");
                        writer.write_string (name);
index 32f9463..98ca104 100644 (file)
@@ -30,15 +30,15 @@ namespace Vala {
                List<CCodeExpression> initializer;
                List<CCodeExpression> iterator;
 
-               public void add_initializer (CCodeExpression expr) {
+               public void add_initializer (CCodeExpression! expr) {
                        initializer.append (expr);
                }
 
-               public void add_iterator (CCodeExpression expr) {
+               public void add_iterator (CCodeExpression! expr) {
                        iterator.append (expr);
                }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        bool first;
                        
                        writer.write_indent ();
index 52cc952..eb616d8 100644 (file)
@@ -26,11 +26,11 @@ namespace Vala {
        public class CCodeFragment : CCodeNode {
                public GLib.List<CCodeNode> children { get; construct; }
                
-               public void append (CCodeNode node) {
+               public void append (CCodeNode! node) {
                        _children.append (node);
                }
        
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        foreach (CCodeNode node in children) {
                                node.write (writer);
                        }
index cfaffcd..a590fc5 100644 (file)
@@ -30,11 +30,11 @@ namespace Vala {
                List<CCodeFormalParameter> parameters;
                public CCodeBlock block;
                
-               public void add_parameter (CCodeFormalParameter param) {
+               public void add_parameter (CCodeFormalParameter!param) {
                        parameters.append (param);
                }
                
-               public ref CCodeFunction copy () {
+               public ref CCodeFunction! copy () {
                        var func = new CCodeFunction (name = name, return_type = return_type);
                        func.modifiers = modifiers;
 
@@ -49,7 +49,7 @@ namespace Vala {
                        return func;
                }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_indent ();
                        if ((modifiers & CCodeModifiers.STATIC) == CCodeModifiers.STATIC) {
                                writer.write_string ("static ");
index a74011a..9699057 100644 (file)
@@ -27,11 +27,11 @@ namespace Vala {
                public string name { get; construct; }
                List<CCodeFormalParameter> parameters;
                
-               public void add_parameter (CCodeFormalParameter param) {
+               public void add_parameter (CCodeFormalParameter! param) {
                        parameters.append (param);
                }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_string ("(*");
                        writer.write_string (name);
                        writer.write_string (") (");
index e5f5647..c99f070 100644 (file)
@@ -26,7 +26,7 @@ namespace Vala {
        public class CCodeIdentifier : CCodeExpression {
                public string name { get; construct; }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_string (name);
                }
        }
index b5fc61d..7d47d29 100644 (file)
@@ -29,7 +29,7 @@ namespace Vala {
                public CCodeStatement false_statement { get; construct; }
                public bool else_if;
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        if (!else_if) {
                                writer.write_indent ();
                        } else {
index 9e59f3d..2bbaab0 100644 (file)
@@ -26,7 +26,7 @@ namespace Vala {
        public class CCodeIncludeDirective : CCodeNode {
                public string filename { get; construct; }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_indent ();
                        writer.write_string ("#include <");
                        writer.write_string (filename);
index 5d9b1cd..df9a0b4 100644 (file)
@@ -26,11 +26,11 @@ namespace Vala {
        public class CCodeInitializerList : CCodeExpression {
                List<CCodeExpression> initializers;
                
-               public void append (CCodeExpression expr) {
+               public void append (CCodeExpression! expr) {
                        initializers.append (expr);
                }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_string ("{");
 
                        bool first = true;
index afb128f..bdab833 100644 (file)
@@ -27,7 +27,7 @@ namespace Vala {
                public string name { get; construct; }
                public string replacement { get; construct; }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_indent ();
                        writer.write_string ("#define ");
                        writer.write_string (name);
index e24de21..2bd9176 100644 (file)
@@ -28,7 +28,7 @@ namespace Vala {
                public string member_name { get; construct; }
                public bool is_pointer { get; construct; }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        inner.write (writer);
                        if (is_pointer) {
                                writer.write_string ("->");
index 235d78b..81011d8 100644 (file)
@@ -24,7 +24,7 @@ using GLib;
 
 namespace Vala {
        public class CCodeNewline : CCodeNode {
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_newline ();
                }
        }
index 5280d4d..94ed831 100644 (file)
@@ -26,7 +26,7 @@ namespace Vala {
        public class CCodeOnceSection : CCodeFragment {
                public string define { get; construct; }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_indent ();
                        writer.write_string ("#ifndef ");
                        writer.write_string (define);
index d8c818e..a65c746 100644 (file)
@@ -26,7 +26,7 @@ namespace Vala {
        public class CCodeParenthesizedExpression : CCodeExpression {
                public CCodeExpression inner { get; construct; }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_string ("(");
                        
                        inner.write (writer);
index d087b2d..0460219 100644 (file)
@@ -26,7 +26,7 @@ namespace Vala {
        public class CCodeReturnStatement : CCodeStatement {
                public CCodeExpression return_expression { get; construct; }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_indent ();
                        writer.write_string ("return ");
                
index 6a0ab7a..f3bc01a 100644 (file)
@@ -27,17 +27,17 @@ namespace Vala {
                public string name { get; construct; }
                List<CCodeDeclaration> declarations;
                
-               public void add_declaration (CCodeDeclaration decl) {
+               public void add_declaration (CCodeDeclaration! decl) {
                        declarations.append (decl);
                }
                
-               public void add_field (string type_name, string name) {
+               public void add_field (string! type_name, string! name) {
                        var decl = new CCodeDeclaration (type_name = type_name);
                        decl.add_declarator (new CCodeVariableDeclarator (name = name));
                        add_declaration (decl);
                }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_string ("struct ");
                        writer.write_string (name);
                        writer.write_begin_block ();
index aede4e4..ad0ea23 100644 (file)
@@ -27,11 +27,11 @@ namespace Vala {
                public CCodeExpression expression { get; construct; }
                List<CCodeCaseStatement> case_statements;
                
-               public void add_case (CCodeCaseStatement case_stmt) {
+               public void add_case (CCodeCaseStatement! case_stmt) {
                        case_statements.append (case_stmt);
                }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_indent ();
                        writer.write_string ("switch (");
                        expression.write (writer);
index 6d8ee50..0eb9f3c 100644 (file)
@@ -36,7 +36,7 @@ public class Vala.CCodeTypeDefinition : CCodeNode {
         */
        public CCodeDeclarator declarator { get; set; }
        
-       public override void write (CCodeWriter writer) {
+       public override void write (CCodeWriter! writer) {
                writer.write_indent ();
                writer.write_string ("typedef ");
                
index eb7cd2b..d125441 100644 (file)
@@ -27,7 +27,7 @@ namespace Vala {
                public CCodeUnaryOperator operator { get; construct; }
                public CCodeExpression inner { get; construct; }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        if (operator == CCodeUnaryOperator.PLUS) {
                                writer.write_string ("+");
                        } else if (operator == CCodeUnaryOperator.MINUS) {
index e5ead17..c5cccae 100644 (file)
@@ -27,7 +27,7 @@ namespace Vala {
                public string name { get; construct; }
                public CCodeExpression initializer { get; construct; }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_string (name);
                        
                        if (initializer != null) {
index 57e62e4..bc1f1b3 100644 (file)
@@ -27,7 +27,7 @@ namespace Vala {
                public CCodeExpression condition { get; construct; }
                public CCodeStatement body { get; construct; }
                
-               public override void write (CCodeWriter writer) {
+               public override void write (CCodeWriter! writer) {
                        writer.write_indent ();
                        writer.write_string ("while (");
 
index 068ea6e..3d8f15e 100644 (file)
@@ -1525,6 +1525,9 @@ class_declaration
                if ($3 != 0) {
                        VALA_DATA_TYPE(current_class)->access = $3;
                }
+               if (($4 & VALA_MODIFIER_ABSTRACT) == VALA_MODIFIER_ABSTRACT) {
+                       vala_class_set_is_abstract (current_class, TRUE);
+               }
                for (l = $8; l != NULL; l = l->next) {
                        vala_class_add_type_parameter (current_class, l->data);
                        g_object_unref (l->data);
index ab4fed2..ce4462b 100644 (file)
@@ -119,7 +119,7 @@ public class Vala.Callback : DataType {
                visitor.visit_end_callback (this);
        }
 
-       public override string! get_cname () {
+       public override string get_cname () {
                if (cname == null) {
                        cname = "%s%s".printf (@namespace.get_cprefix (), name);
                }
index b961629..e70f9ee 100644 (file)
@@ -47,7 +47,7 @@ public class Vala.CastExpression : Expression {
                return (new CastExpression (inner = inner, type_reference = type, source_reference = source));
        }
        
-       public override void accept (CodeVisitor visitor) {
+       public override void accept (CodeVisitor! visitor) {
                inner.accept (visitor);
                type_reference.accept (visitor);
 
index 0534769..d101e3b 100644 (file)
@@ -279,7 +279,7 @@ public class Vala.Class : DataType {
                return "%s%s%s".printf (@namespace.get_lower_case_cprefix (), infix, get_lower_case_csuffix ());
        }
        
-       public override ref string get_upper_case_cname (string! infix) {
+       public override ref string get_upper_case_cname (string infix) {
                return get_lower_case_cname (infix).up ();
        }
 
index a2faf00..4213651 100644 (file)
@@ -55,6 +55,14 @@ public class Vala.ClassRegisterFunction : TypeRegisterFunction {
                return class_reference.base_class.get_upper_case_cname ("TYPE_");
        }
 
+       public override string get_type_flags () {
+               if (class_reference.is_abstract) {
+                       return "G_TYPE_FLAG_ABSTRACT";
+               } else {
+                       return "0";
+               }
+       }
+
        public override ref CCodeFragment! get_type_interface_init_statements () {
                var frag = new CCodeFragment ();
                
index ff19657..df336cc 100644 (file)
@@ -56,7 +56,7 @@ public class Vala.Constant : CodeNode {
                return (new Constant (name = name, type_reference = type, initializer = init, source_reference = source));
        }
        
-       public override void accept (CodeVisitor visitor) {
+       public override void accept (CodeVisitor! visitor) {
                type_reference.accept (visitor);
                
                initializer.accept (visitor);
index 7d61835..ad0383a 100644 (file)
@@ -152,7 +152,7 @@ public abstract class Vala.DataType : CodeNode {
         *              name or null
         * @return      the upper case name to be used in C code
         */
-       public abstract ref string! get_upper_case_cname (string infix);
+       public abstract ref string get_upper_case_cname (string infix);
        
        /**
         * Returns the C name of this data type in lower case. Words are
@@ -163,7 +163,7 @@ public abstract class Vala.DataType : CodeNode {
         *              name or null
         * @return      the lower case name to be used in C code
         */
-       public abstract ref string! get_lower_case_cname (string infix);
+       public abstract ref string get_lower_case_cname (string infix);
        
        /**
         * Returns a list of C header filenames users of this data type must
index dbf8391..4a9e38c 100644 (file)
@@ -50,7 +50,7 @@ public class Vala.Enum : DataType {
                values.append (value);
        }
        
-       public override void accept (CodeVisitor visitor) {
+       public override void accept (CodeVisitor! visitor) {
                visitor.visit_begin_enum (this);
                
                foreach (EnumValue value in values) {
index 19427a9..70aab5e 100644 (file)
@@ -59,14 +59,14 @@ public class Vala.Flags : DataType {
                visitor.visit_end_flags (this);
        }
 
-       public override string! get_cname () {
+       public override string get_cname () {
                if (cname == null) {
                        cname = "%s%s".printf (@namespace.get_cprefix (), name);
                }
                return cname;
        }
        
-       public override string! get_upper_case_cname (string infix) {
+       public override ref string get_upper_case_cname (string infix) {
                return "%s%s".printf (@namespace.get_lower_case_cprefix (), Namespace.camel_case_to_lower_case (name)).up ();
        }
 
index 103c7c1..ebaea26 100644 (file)
@@ -68,7 +68,7 @@ public class Vala.FormalParameter : CodeNode {
                return (new FormalParameter (ellipsis = true, source_reference = source));
        }
        
-       public override void accept (CodeVisitor visitor) {
+       public override void accept (CodeVisitor! visitor) {
                if (!ellipsis) {
                        type_reference.accept (visitor);
                }
index e47d1b0..ad92ae8 100644 (file)
@@ -32,7 +32,7 @@ namespace Vala {
                        return (new IfStatement (condition = cond, true_statement = true_stmt, false_statement = false_stmt, source_reference = source));
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        condition.accept (visitor);
                        
                        visitor.visit_end_full_expression (condition);
index 13da330..0b42076 100644 (file)
@@ -30,7 +30,7 @@ namespace Vala {
                        return (new InitializerList (initializers = initializers, source_reference = source));
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        foreach (Expression expr in initializers) {
                                expr.accept (visitor);
                        }
index 94473a7..0efedf4 100644 (file)
@@ -121,7 +121,7 @@ public class Vala.Interface : DataType {
        private string cname;
        private string lower_case_csuffix;
        
-       public override string! get_cname () {
+       public override string get_cname () {
                if (cname == null) {
                        cname = "%s%s".printf (@namespace.get_cprefix (), name);
                }
@@ -151,14 +151,14 @@ public class Vala.Interface : DataType {
                this.lower_case_csuffix = csuffix;
        }
        
-       public override ref string! get_lower_case_cname (string infix) {
+       public override ref string get_lower_case_cname (string infix) {
                if (infix == null) {
                        infix = "";
                }
                return "%s%s%s".printf (@namespace.get_lower_case_cprefix (), infix, get_lower_case_csuffix ());
        }
        
-       public override ref string! get_upper_case_cname (string infix) {
+       public override ref string get_upper_case_cname (string infix) {
                return get_lower_case_cname (infix).up ();
        }
        
index e9be8d1..a38f2f4 100644 (file)
@@ -31,27 +31,27 @@ public class Vala.InterfaceRegisterFunction : TypeRegisterFunction {
         */
        public Interface interface_reference { get; construct; }
        
-       public override DataType get_type_declaration () {
+       public override DataType! get_type_declaration () {
                return interface_reference;
        }
        
-       public override ref string get_type_struct_name () {
+       public override ref string! get_type_struct_name () {
                return "%sInterface".printf (interface_reference.get_cname ());
        }
        
-       public override ref string get_class_init_func_name () {
+       public override ref string! get_class_init_func_name () {
                return "NULL";
        }
        
-       public override ref string get_instance_struct_size () {
+       public override ref string! get_instance_struct_size () {
                return "0";
        }
        
-       public override ref string get_instance_init_func_name () {
+       public override ref string! get_instance_init_func_name () {
                return "NULL";
        }
        
-       public override ref string get_parent_type_name () {
+       public override ref string! get_parent_type_name () {
                return "G_TYPE_INTERFACE";
        }
 
index 0dacb68..977673a 100644 (file)
@@ -56,11 +56,11 @@ public class Vala.InterfaceWriter : CodeVisitor {
                stream = null;
        }
 
-       public override void visit_begin_source_file (SourceFile source_file) {
+       public override void visit_begin_source_file (SourceFile! source_file) {
                current_cheader_filename = source_file.get_cheader_filename ();
        }
 
-       public override void visit_begin_namespace (Namespace ns) {
+       public override void visit_begin_namespace (Namespace! ns) {
                if (ns.name == null)  {
                        return;
                }
@@ -75,7 +75,7 @@ public class Vala.InterfaceWriter : CodeVisitor {
                write_begin_block ();
        }
 
-       public override void visit_end_namespace (Namespace ns) {
+       public override void visit_end_namespace (Namespace! ns) {
                if (ns.name == null)  {
                        return;
                }
@@ -84,7 +84,7 @@ public class Vala.InterfaceWriter : CodeVisitor {
                write_newline ();
        }
 
-       public override void visit_begin_class (Class cl) {
+       public override void visit_begin_class (Class! cl) {
                if (cl.access != MemberAccessibility.PUBLIC) {
                        internal_scope = true;
                        return;
@@ -115,7 +115,7 @@ public class Vala.InterfaceWriter : CodeVisitor {
                write_begin_block ();
        }
 
-       public override void visit_end_class (Class cl) {
+       public override void visit_end_class (Class! cl) {
                if (cl.access != MemberAccessibility.PUBLIC) {
                        internal_scope = false;
                        return;
@@ -125,7 +125,7 @@ public class Vala.InterfaceWriter : CodeVisitor {
                write_newline ();
        }
 
-       public override void visit_begin_struct (Struct st) {
+       public override void visit_begin_struct (Struct! st) {
                if (st.access != MemberAccessibility.PUBLIC) {
                        internal_scope = true;
                        return;
@@ -137,7 +137,7 @@ public class Vala.InterfaceWriter : CodeVisitor {
                write_begin_block ();
        }
 
-       public override void visit_end_struct (Struct st) {
+       public override void visit_end_struct (Struct! st) {
                if (st.access != MemberAccessibility.PUBLIC) {
                        internal_scope = false;
                        return;
@@ -147,7 +147,7 @@ public class Vala.InterfaceWriter : CodeVisitor {
                write_newline ();
        }
 
-       public override void visit_begin_enum (Enum en) {
+       public override void visit_begin_enum (Enum! en) {
                if (en.access != MemberAccessibility.PUBLIC) {
                        internal_scope = true;
                        return;
@@ -159,7 +159,7 @@ public class Vala.InterfaceWriter : CodeVisitor {
                write_begin_block ();
        }
 
-       public override void visit_end_enum (Enum en) {
+       public override void visit_end_enum (Enum! en) {
                if (en.access != MemberAccessibility.PUBLIC) {
                        internal_scope = false;
                        return;
@@ -169,7 +169,7 @@ public class Vala.InterfaceWriter : CodeVisitor {
                write_newline ();
        }
 
-       public override void visit_enum_value (EnumValue ev) {
+       public override void visit_enum_value (EnumValue! ev) {
                if (internal_scope) {
                        return;
                }
@@ -180,10 +180,10 @@ public class Vala.InterfaceWriter : CodeVisitor {
                write_newline ();
        }
 
-       public override void visit_constant (Constant c) {
+       public override void visit_constant (Constant! c) {
        }
 
-       public override void visit_field (Field f) {
+       public override void visit_field (Field! f) {
                if (internal_scope || f.access != MemberAccessibility.PUBLIC) {
                        return;
                }
@@ -213,7 +213,7 @@ public class Vala.InterfaceWriter : CodeVisitor {
                write_newline ();
        }
 
-       public override void visit_begin_method (Method m) {
+       public override void visit_begin_method (Method! m) {
                if (internal_scope || m.access != MemberAccessibility.PUBLIC || m.overrides) {
                        return;
                }
@@ -278,7 +278,7 @@ public class Vala.InterfaceWriter : CodeVisitor {
                write_newline ();
        }
 
-       public override void visit_begin_property (Property prop) {
+       public override void visit_begin_property (Property! prop) {
                if (internal_scope) {
                        return;
                }
@@ -322,14 +322,14 @@ public class Vala.InterfaceWriter : CodeVisitor {
                bol = false;
        }
        
-       private void write_identifier (string s) {
+       private void write_identifier (string! s) {
                if (s == "namespace") {
                        stream.putc ('@');
                }
                write_string (s);
        }
        
-       private void write_string (string s) {
+       private void write_string (string! s) {
                stream.printf ("%s", s);
                bol = false;
        }
index fb9a836..b4a9746 100644 (file)
@@ -31,11 +31,11 @@ namespace Vala {
                        return (new InvocationExpression (call = call, argument_list = argument_list, source_reference = source));
                }
                
-               public void add_argument (Expression arg) {
+               public void add_argument (Expression! arg) {
                        _argument_list.append (arg);
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        call.accept (visitor);
 
                        visitor.visit_begin_invocation_expression (this);
index 4ce5d53..b04d2b0 100644 (file)
@@ -30,7 +30,7 @@ namespace Vala {
                        return (new LiteralExpression (literal = literal, source_reference = source));
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        literal.accept (visitor);
                
                        visitor.visit_literal_expression (this);
index ac926f6..c2226e3 100644 (file)
@@ -35,7 +35,7 @@ namespace Vala {
                        return (new LocalVariableDeclaration (variable_declarators = declarators, source_reference = source));
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        if (type_reference != null) {
                                type_reference.accept (visitor);
                        }
index 8c3adaf..bc77ad1 100644 (file)
@@ -48,7 +48,7 @@ public class Vala.MemberAccess : Expression {
                return new MemberAccess (inner = inner, member_name = member, source_reference = source);
        }
        
-       public override void accept (CodeVisitor visitor) {
+       public override void accept (CodeVisitor! visitor) {
                if (inner != null) {
                        inner.accept (visitor);
                }
index 91775d7..06736fa 100644 (file)
@@ -60,7 +60,7 @@ public class Vala.MemoryManager : CodeVisitor {
                current_symbol = m.symbol;
        }
        
-       public override void visit_begin_property (Property prop) {
+       public override void visit_begin_property (Property! prop) {
                current_symbol = prop.symbol;
        }
 
index 196cc72..2da57d5 100644 (file)
@@ -137,7 +137,7 @@ public class Vala.Method : CodeNode {
                return parameters.copy ();
        }
        
-       public override void accept (CodeVisitor visitor) {
+       public override void accept (CodeVisitor! visitor) {
                visitor.visit_begin_method (this);
                
                return_type.accept (visitor);
@@ -221,4 +221,40 @@ public class Vala.Method : CodeNode {
                        }
                }
        }
+       
+       /**
+        * Checks whether the arguments and return type of the specified method
+        * matches this method.
+        *
+        * @param m a method
+        * @return  true if the specified method is compatible to this method
+        */
+       public bool equals (Method! m2) {
+               if (!m2.return_type.equals (return_type)) {
+                       return false;
+               }
+               
+               var method_params = m2.get_parameters ();
+               var method_params_it = method_params;
+               foreach (FormalParameter param in parameters) {
+                       /* method may not expect less arguments */
+                       if (method_params_it == null) {
+                               return false;
+                       }
+                       
+                       var method_param = (FormalParameter) method_params_it.data;
+                       if (!method_param.type_reference.equals (param.type_reference)) {
+                               return false;
+                       }
+                       
+                       method_params_it = method_params_it.next;
+               }
+               
+               /* method may not expect more arguments */
+               if (method_params_it != null) {
+                       return false;
+               }
+               
+               return true;
+       }
 }
index 8399f01..9b5ecab 100644 (file)
@@ -31,7 +31,7 @@ namespace Vala {
                        return (new NamedArgument (name = name, argument = arg, source_reference = source));
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        argument.accept (visitor);
                
                        visitor.visit_named_argument (this);
index f7b519a..aa57041 100644 (file)
@@ -38,41 +38,41 @@ namespace Vala {
                public string cprefix;
                public string lower_case_cprefix;
                
-               public static ref Namespace new (string name, SourceReference source) {
+               public static ref Namespace! new (string! name, SourceReference source) {
                        return (new Namespace (name = name, source_reference = source));
                }
                
-               public void add_class (Class cl) {
+               public void add_class (Class! cl) {
                        classes.append (cl);
                        cl.@namespace = this;
                }
                
-               public void remove_class (Class cl) {
+               public void remove_class (Class! cl) {
                        classes.remove (cl);
                        cl.@namespace = null;
                }
                
-               public void add_interface (Interface iface) {
+               public void add_interface (Interface! iface) {
                        interfaces.append (iface);
                        iface.@namespace = this;
                }
                
-               public void add_struct (Struct st) {
+               public void add_struct (Struct! st) {
                        structs.append (st);
                        st.@namespace = this;
                }
                
-               public void remove_struct (Struct st) {
+               public void remove_struct (Struct! st) {
                        structs.remove (st);
                        st.@namespace = null;
                }
                                
-               public void add_enum (Enum en) {
+               public void add_enum (Enum! en) {
                        enums.append (en);
                        en.@namespace = this;
                }
                                
-               public void add_flags (Flags fl) {
+               public void add_flags (Flags! fl) {
                        flags_.append (fl);
                        fl.@namespace = this;
                }
@@ -90,15 +90,15 @@ namespace Vala {
                        return classes.copy ();
                }
                
-               public void add_field (Field f) {
+               public void add_field (Field! f) {
                        fields.append (f);
                }
                
-               public void add_method (Method m) {
+               public void add_method (Method! m) {
                        methods.append (m);
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        visitor.visit_begin_namespace (this);
 
                        foreach (Class cl in classes) {
@@ -210,7 +210,7 @@ namespace Vala {
                        return cheader_filenames.copy ();
                }
                
-               void process_ccode_attribute (Attribute a) {
+               void process_ccode_attribute (Attribute! a) {
                        foreach (NamedArgument arg in a.args) {
                                if (arg.name == "cprefix") {
                                        /* this will already be checked during semantic analysis */
index 89c7bcc..45ea525 100644 (file)
@@ -31,7 +31,7 @@ namespace Vala {
                        return (new NamespaceReference (name = name, source_reference = source));
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        visitor.visit_namespace_reference (this);
                }
        }
index d1499a1..e5f4917 100644 (file)
@@ -31,7 +31,7 @@ namespace Vala {
                        return (new ObjectCreationExpression (type_reference = type, named_argument_list = named_argument_list, source_reference = source));
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        type_reference.accept (visitor);
                        
                        foreach (NamedArgument arg in named_argument_list) {
index 32dbdb7..1d8f88c 100644 (file)
@@ -30,7 +30,7 @@ namespace Vala {
                        return (new ParenthesizedExpression (inner = inner, source_reference = source));
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        inner.accept (visitor);
                        
                        visitor.visit_parenthesized_expression (this);
index 6138965..9c2aa86 100644 (file)
@@ -27,16 +27,16 @@ namespace Vala {
                string comment;
                string _file_comment;
                
-               public void parse (CodeContext context) {
+               public void parse (CodeContext! context) {
                        context.accept (this);
                }
        
-               public override void visit_begin_source_file (SourceFile source_file) {
+               public override void visit_begin_source_file (SourceFile! source_file) {
                        parse_file (source_file);
                        source_file.comment = _file_comment;
                }
                
-               public void push_comment (string comment_item, bool file_comment) {
+               public void push_comment (string! comment_item, bool file_comment) {
                        if (comment == null) {
                                comment = comment_item;
                        } else {
@@ -65,6 +65,6 @@ namespace Vala {
                }
                
                [Import ()]
-               public void parse_file (SourceFile source_file);
+               public void parse_file (SourceFile! source_file);
        }
 }
index a96fdd3..4ac29ea 100644 (file)
 using GLib;
 
 namespace Vala {
-       public abstract class PostfixExpression : Expression {
-               public Expression inner { get; construct; }
-               public bool increment { get; construct; }
-       
-               public static ref PostfixExpression new (Expression inner, bool inc, SourceReference source) {
+       public class PostfixExpression : Expression {
+               public Expression! inner { get; set construct; }
+               public bool increment { get; set; }
+
+               public static ref PostfixExpression! new (Expression! inner, bool inc, SourceReference source) {
                        return (new PostfixExpression (inner = inner, increment = inc, source_reference = source));
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        inner.accept (visitor);
 
                        visitor.visit_postfix_expression (this);
index 343aa14..a0b6ee4 100644 (file)
@@ -36,7 +36,7 @@ namespace Vala {
                        return (new Property (name = name, type_reference = type, get_accessor = get_accessor, set_accessor = set_accessor, source_reference = source));
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        visitor.visit_begin_property (this);
 
                        type_reference.accept (visitor);
index 2fecd43..fecbd3d 100644 (file)
@@ -34,7 +34,7 @@ namespace Vala {
                        return (new PropertyAccessor (readable = readable, writable = writable, construct_ = construct_, body = body, source_reference = source));
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        visitor.visit_begin_property_accessor (this);
 
                        if (body != null) {
index b865013..5643249 100644 (file)
@@ -30,7 +30,7 @@ namespace Vala {
                        return (new ReturnStatement (return_expression = result, source_reference = source));
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        if (return_expression != null) {
                                return_expression.accept (visitor);
                        
index 73286ba..279b9e7 100644 (file)
@@ -148,6 +148,12 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                                        if (sym != null && sym.node is Method) {
                                                var base_method = (Method) sym.node;
                                                if (base_method.is_abstract || base_method.is_virtual) {
+                                                       if (!m.equals (base_method)) {
+                                                               m.error = true;
+                                                               Report.error (m.source_reference, "Return type and or parameters of overridding method `%s' do not match overridden method `%s'.".printf (m.symbol.get_full_name (), base_method.symbol.get_full_name ()));
+                                                               return;
+                                                       }
+                                                       
                                                        m.base_method = base_method;
                                                        break;
                                                }
@@ -398,7 +404,7 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                expr.static_type.type = (DataType) root_symbol.lookup ("int").node;
        }
 
-       public override void visit_real_literal (IntegerLiteral! expr) {
+       public override void visit_real_literal (RealLiteral! expr) {
                expr.static_type = new TypeReference ();
                expr.static_type.type = (DataType) root_symbol.lookup ("double").node;
        }
index 6ceac96..3ca4e11 100644 (file)
@@ -31,7 +31,7 @@ namespace Vala {
                        return (new TypeCheck (expression = expr, type_reference = type, source_reference = source));
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        expression.accept (visitor);
                        
                        type_reference.accept (visitor);
index 100a64d..26f5c03 100644 (file)
@@ -30,7 +30,7 @@ namespace Vala {
                        return (new TypeofExpression (type_reference = type, source_reference = source));
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        type_reference.accept (visitor);
                
                        visitor.visit_typeof_expression (this);
index 30bd35d..86adaf3 100644 (file)
@@ -31,7 +31,7 @@ namespace Vala {
                        return (new TypeParameter (name = name, source_reference = source));
                }
 
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        visitor.visit_type_parameter (this);
                }
        }
index b70392b..ba892f7 100644 (file)
@@ -61,7 +61,7 @@ namespace Vala {
                        return null;
                }
                
-               public void add_type_argument (TypeReference arg) {
+               public void add_type_argument (TypeReference! arg) {
                        type_argument_list.append (arg);
                }
                
@@ -69,7 +69,7 @@ namespace Vala {
                        return type_argument_list.copy ();
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        foreach (TypeReference type_arg in type_argument_list) {
                                type_arg.accept (visitor);
                        }
@@ -152,5 +152,40 @@ namespace Vala {
                        
                        return result;
                }
+               
+               public bool equals (TypeReference! type2) {
+                       if (type2.is_ref != is_ref) {
+                               return false;
+                       }
+                       if (type2.is_lvalue_ref != is_lvalue_ref) {
+                               return false;
+                       }
+                       if (type2.is_weak != is_weak) {
+                               return false;
+                       }
+                       if (type2.is_out != is_out) {
+                               return false;
+                       }
+                       if (type2.array != array) {
+                               return false;
+                       }
+                       if (type2.array_own != array_own) {
+                               return false;
+                       }
+                       if (type2.non_null != non_null) {
+                               return false;
+                       }
+                       if (type2.type != type) {
+                               return false;
+                       }
+                       if (type2.type_parameter != type_parameter) {
+                               return false;
+                       }
+                       if (type2.floating_reference != floating_reference) {
+                               return false;
+                       }
+               
+                       return true;
+               }
        }
 }
index 0173c62..3e946c8 100644 (file)
@@ -50,7 +50,7 @@ public abstract class Vala.TypeRegisterFunction : CCodeFunction {
                reg_call.add_argument (new CCodeIdentifier (name = get_parent_type_name ()));
                reg_call.add_argument (new CCodeConstant (name = "\"%s\"".printf (get_type_declaration ().get_cname ())));
                reg_call.add_argument (new CCodeIdentifier (name = "&g_define_type_info"));
-               reg_call.add_argument (new CCodeConstant (name = "0"));
+               reg_call.add_argument (new CCodeConstant (name = get_type_flags ()));
                type_init.add_statement (new CCodeExpressionStatement (expression = new CCodeAssignment (left = new CCodeIdentifier (name = "g_define_type_id"), right = reg_call)));
                
                type_init.add_statement (get_type_interface_init_statements ());
@@ -105,6 +105,15 @@ public abstract class Vala.TypeRegisterFunction : CCodeFunction {
        public abstract ref string! get_parent_type_name ();
 
        /**
+        * Returns the set of type flags to be applied when registering.
+        *
+        * @return type flags
+        */
+       public virtual string get_type_flags () {
+               return "0";
+       }
+
+       /**
         * Returns additional C initialization statements to setup interfaces.
         *
         * @return C statements
index 61ad00d..cbb168b 100644 (file)
@@ -31,7 +31,7 @@ namespace Vala {
                        return (new UnaryExpression (operator = op, inner = inner, source_reference = source));
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        inner.accept (visitor);
                
                        visitor.visit_unary_expression (this);
index dbfc20f..4da005c 100644 (file)
@@ -32,7 +32,7 @@ namespace Vala {
                        return (new VariableDeclarator (name = name, initializer = init, source_reference = source));
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        if (initializer != null) {
                                initializer.accept (visitor);
                        
index bda6034..c8724a1 100644 (file)
@@ -31,7 +31,7 @@ namespace Vala {
                        return (new WhileStatement (condition = cond, body = body, source_reference = source));
                }
                
-               public override void accept (CodeVisitor visitor) {
+               public override void accept (CodeVisitor! visitor) {
                        condition.accept (visitor);
                        
                        visitor.visit_end_full_expression (condition);