[vala] Do not allow abstract properties in non-abstract classes



commit 0f168bc5102e8b46fcce174fd594be5a76c1a309
Author: Luca Bruno <lethalman88 gmail com>
Date:   Sat Jun 12 10:34:55 2010 +0200

    Do not allow abstract properties in non-abstract classes
    
    Fixes bug 621184.

 vala/valaproperty.vala |   42 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 42 insertions(+), 0 deletions(-)
---
diff --git a/vala/valaproperty.vala b/vala/valaproperty.vala
index ea9d2e1..d55b687 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;
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]