+2008-05-28 Jürg Billeter <j@bitron.ch>
+
+ * vala/valanamespace.vala:
+ * vala/valaparser.vala:
+
+ Report error when using invalid modifiers for methods and fields,
+ based on patch by Jared Moore, fixes bug 534018
+
2008-05-28 Jürg Billeter <j@bitron.ch>
* gobject/valaccodeclassbinding.vala:
* @param f a field
*/
public void add_field (Field f) {
+ if (f.binding == MemberBinding.INSTANCE) {
+ Report.error (f.source_reference, "instance members are not allowed outside of data types");
+ f.error = true;
+ return;
+ } else if (f.binding == MemberBinding.CLASS) {
+ Report.error (f.source_reference, "class members are not allowed outside of classes");
+ f.error = true;
+ return;
+ }
+
fields.add (f);
scope.add (f.name, f);
}
public void add_method (Method m) {
if (m is CreationMethod) {
Report.error (m.source_reference, "construction methods may only be declared within classes and structs");
-
m.error = true;
return;
}
if (m.binding == MemberBinding.INSTANCE) {
- Report.error (m.source_reference, "instance methods not allowed outside of data types");
-
+ Report.error (m.source_reference, "instance members are not allowed outside of data types");
+ m.error = true;
+ return;
+ } else if (m.binding == MemberBinding.CLASS) {
+ Report.error (m.source_reference, "class members are not allowed outside of classes");
m.error = true;
return;
}
ns.add_delegate ((Delegate) sym);
} else if (sym is Method) {
var method = (Method) sym;
- method.binding = MemberBinding.STATIC;
+ if (method.binding == MemberBinding.INSTANCE) {
+ // default to static member binding
+ method.binding = MemberBinding.STATIC;
+ }
ns.add_method (method);
} else if (sym is Field) {
var field = (Field) sym;
- field.binding = MemberBinding.STATIC;
+ if (field.binding == MemberBinding.INSTANCE) {
+ // default to static member binding
+ field.binding = MemberBinding.STATIC;
+ }
ns.add_field (field);
} else if (sym is Constant) {
ns.add_constant ((Constant) sym);
} else if (ModifierFlags.CLASS in flags) {
f.binding = MemberBinding.CLASS;
}
+ if (ModifierFlags.ABSTRACT in flags
+ || ModifierFlags.VIRTUAL in flags
+ || ModifierFlags.OVERRIDE in flags) {
+ Report.error (f.source_reference, "abstract, virtual, and override modifiers are not applicable to fields");
+ }
if (accept (TokenType.ASSIGN)) {
f.initializer = parse_expression ();
}