summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2019-11-24 22:42:18 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2019-11-24 22:42:18 +0100
commite722f7640e01b405cc600f8a3b164dce3407d321 (patch)
tree14422087a2d13ff3ad6fa31547fb39bd2e704d2e
parent6962b8d5440c9a0359d6a7860d386c0928170066 (diff)
downloadvala-e722f7640e01b405cc600f8a3b164dce3407d321.tar.gz
vala: Let the parser have set namespace members as static
... and move error reporting for invalid members into check()
-rw-r--r--vala/valagenieparser.vala4
-rw-r--r--vala/valagirparser.vala12
-rw-r--r--vala/valanamespace.vala63
-rw-r--r--vala/valaparser.vala6
-rw-r--r--vapigen/valagidlparser.vala12
5 files changed, 57 insertions, 40 deletions
diff --git a/vala/valagenieparser.vala b/vala/valagenieparser.vala
index 05c300723..668c40428 100644
--- a/vala/valagenieparser.vala
+++ b/vala/valagenieparser.vala
@@ -2587,13 +2587,13 @@ public class Vala.Genie.Parser : CodeVisitor {
} else if (sym is Delegate) {
ns.add_delegate ((Delegate) sym);
} else if (sym is Method) {
- var method = (Method) sym;
+ unowned Method method = (Method) sym;
if (method.binding == MemberBinding.INSTANCE) {
method.binding = MemberBinding.STATIC;
}
ns.add_method (method);
} else if (sym is Field) {
- var field = (Field) sym;
+ unowned Field field = (Field) sym;
if (field.binding == MemberBinding.INSTANCE) {
field.binding = MemberBinding.STATIC;
}
diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala
index 3f2025093..17b41b1e5 100644
--- a/vala/valagirparser.vala
+++ b/vala/valagirparser.vala
@@ -1522,11 +1522,19 @@ public class Vala.GirParser : CodeVisitor {
} else if (sym is ErrorDomain) {
ns.add_error_domain ((ErrorDomain) sym);
} else if (sym is Field) {
- ns.add_field ((Field) sym);
+ unowned Field field = (Field) sym;
+ if (field.binding == MemberBinding.INSTANCE) {
+ field.binding = MemberBinding.STATIC;
+ }
+ ns.add_field (field);
} else if (sym is Interface) {
ns.add_interface ((Interface) sym);
} else if (sym is Method) {
- ns.add_method ((Method) sym);
+ unowned Method method = (Method) sym;
+ if (method.binding == MemberBinding.INSTANCE) {
+ method.binding = MemberBinding.STATIC;
+ }
+ ns.add_method (method);
} else if (sym is Struct) {
ns.add_struct ((Struct) sym);
}
diff --git a/vala/valanamespace.vala b/vala/valanamespace.vala
index a413f07f6..56a905bb4 100644
--- a/vala/valanamespace.vala
+++ b/vala/valanamespace.vala
@@ -380,26 +380,11 @@ public class Vala.Namespace : Symbol {
* @param f a field
*/
public override void add_field (Field f) {
- if (f.binding == MemberBinding.INSTANCE) {
- // default to static member binding
- f.binding = MemberBinding.STATIC;
- }
-
// namespaces do not support private memebers
if (f.access == SymbolAccessibility.PRIVATE) {
f.access = SymbolAccessibility.INTERNAL;
}
- 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;
- }
-
if (f.owner == null) {
f.source_reference.file.add_node (f);
}
@@ -414,30 +399,11 @@ public class Vala.Namespace : Symbol {
* @param m a method
*/
public override void add_method (Method m) {
- if (m.binding == MemberBinding.INSTANCE) {
- // default to static member binding
- m.binding = MemberBinding.STATIC;
- }
-
// namespaces do not support private memebers
if (m.access == SymbolAccessibility.PRIVATE) {
m.access = SymbolAccessibility.INTERNAL;
}
- 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 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;
- }
if (!(m.return_type is VoidType) && m.get_postconditions ().size > 0) {
m.result_var = new LocalVariable (m.return_type.copy (), "result", null, source_reference);
m.result_var.is_result = true;
@@ -517,6 +483,35 @@ public class Vala.Namespace : Symbol {
source_reference.file.gir_version = a.get_string ("gir_version");
}
+ foreach (Field f in fields) {
+ if (f.binding == MemberBinding.INSTANCE) {
+ Report.error (f.source_reference, "instance fields are not allowed outside of data types");
+ f.error = true;
+ error = true;
+ } else if (f.binding == MemberBinding.CLASS) {
+ Report.error (f.source_reference, "class fields are not allowed outside of classes");
+ f.error = true;
+ error = true;
+ }
+ }
+
+ foreach (Method m in methods) {
+ if (m is CreationMethod) {
+ Report.error (m.source_reference, "construction methods may only be declared within classes and structs");
+ m.error = true;
+ error = true;
+ }
+ if (m.binding == MemberBinding.INSTANCE) {
+ Report.error (m.source_reference, "instance methods are not allowed outside of data types");
+ m.error = true;
+ error = true;
+ } else if (m.binding == MemberBinding.CLASS) {
+ Report.error (m.source_reference, "class methods are not allowed outside of classes");
+ m.error = true;
+ error = true;
+ }
+ }
+
foreach (Namespace ns in namespaces) {
ns.check (context);
}
diff --git a/vala/valaparser.vala b/vala/valaparser.vala
index e6c667bca..45a420955 100644
--- a/vala/valaparser.vala
+++ b/vala/valaparser.vala
@@ -2683,6 +2683,9 @@ public class Vala.Parser : CodeVisitor {
f.binding = MemberBinding.STATIC;
} else if (ModifierFlags.CLASS in flags) {
f.binding = MemberBinding.CLASS;
+ } else if (parent is Namespace) {
+ // default to static member binding in namespace
+ f.binding = MemberBinding.STATIC;
}
if (!parent.external_package && parent is Struct
@@ -2748,6 +2751,9 @@ public class Vala.Parser : CodeVisitor {
method.binding = MemberBinding.STATIC;
} else if (ModifierFlags.CLASS in flags) {
method.binding = MemberBinding.CLASS;
+ } else if (parent is Namespace) {
+ // default to static member binding in namespace
+ method.binding = MemberBinding.STATIC;
}
if (ModifierFlags.ASYNC in flags) {
method.coroutine = true;
diff --git a/vapigen/valagidlparser.vala b/vapigen/valagidlparser.vala
index 82f4b12cc..d4c70d8a2 100644
--- a/vapigen/valagidlparser.vala
+++ b/vapigen/valagidlparser.vala
@@ -384,11 +384,19 @@ public class Vala.GIdlParser : CodeVisitor {
} else if (sym is ErrorDomain) {
ns.add_error_domain ((ErrorDomain) sym);
} else if (sym is Field) {
- ns.add_field ((Field) sym);
+ unowned Field field = (Field) sym;
+ if (field.binding == MemberBinding.INSTANCE) {
+ field.binding = MemberBinding.STATIC;
+ }
+ ns.add_field (field);
} else if (sym is Interface) {
ns.add_interface ((Interface) sym);
} else if (sym is Method) {
- ns.add_method ((Method) sym);
+ unowned Method method = (Method) sym;
+ if (method.binding == MemberBinding.INSTANCE) {
+ method.binding = MemberBinding.STATIC;
+ }
+ ns.add_method (method);
} else if (sym is Namespace) {
ns.add_namespace ((Namespace) sym);
} else if (sym is Struct) {