From: Luca Bruno Date: Sat, 12 Jun 2010 08:34:55 +0000 (+0200) Subject: Do not allow abstract properties in non-abstract classes X-Git-Tag: 0.9.2~36 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0f168bc5102e8b46fcce174fd594be5a76c1a309;p=thirdparty%2Fvala.git Do not allow abstract properties in non-abstract classes Fixes bug 621184. --- diff --git a/vala/valaproperty.vala b/vala/valaproperty.vala index ea9d2e123..d55b687f5 100644 --- a/vala/valaproperty.vala +++ b/vala/valaproperty.vala @@ -430,6 +430,48 @@ public class Vala.Property : Member, Lockable { process_attributes (); + if (is_abstract) { + if (parent_symbol is Class) { + var cl = (Class) parent_symbol; + if (!cl.is_abstract) { + error = true; + Report.error (source_reference, "Abstract properties may not be declared in non-abstract classes"); + return false; + } + } else if (!(parent_symbol is Interface)) { + error = true; + Report.error (source_reference, "Abstract properties may not be declared outside of classes and interfaces"); + return false; + } + } else if (is_virtual) { + if (!(parent_symbol is Class) && !(parent_symbol is Interface)) { + error = true; + Report.error (source_reference, "Virtual properties may not be declared outside of classes and interfaces"); + return false; + } + + if (parent_symbol is Class) { + var cl = (Class) parent_symbol; + if (cl.is_compact) { + error = true; + Report.error (source_reference, "Virtual properties may not be declared in compact classes"); + return false; + } + } + } else if (overrides) { + if (!(parent_symbol is Class)) { + error = true; + Report.error (source_reference, "Properties may not be overridden outside of classes"); + return false; + } + } else if (access == SymbolAccessibility.PROTECTED) { + if (!(parent_symbol is Class) && !(parent_symbol is Interface)) { + error = true; + Report.error (source_reference, "Protected properties may not be declared outside of classes and interfaces"); + return false; + } + } + var old_source_file = analyzer.current_source_file; var old_symbol = analyzer.current_symbol;