From 0f168bc5102e8b46fcce174fd594be5a76c1a309 Mon Sep 17 00:00:00 2001 From: Luca Bruno Date: Sat, 12 Jun 2010 10:34:55 +0200 Subject: [PATCH] Do not allow abstract properties in non-abstract classes Fixes bug 621184. --- vala/valaproperty.vala | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/vala/valaproperty.vala b/vala/valaproperty.vala index ea9d2e12..d55b687f 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; -- 2.11.4.GIT