diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2019-11-24 22:42:18 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2019-11-24 22:42:18 +0100 |
commit | e722f7640e01b405cc600f8a3b164dce3407d321 (patch) | |
tree | 14422087a2d13ff3ad6fa31547fb39bd2e704d2e | |
parent | 6962b8d5440c9a0359d6a7860d386c0928170066 (diff) | |
download | vala-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.vala | 4 | ||||
-rw-r--r-- | vala/valagirparser.vala | 12 | ||||
-rw-r--r-- | vala/valanamespace.vala | 63 | ||||
-rw-r--r-- | vala/valaparser.vala | 6 | ||||
-rw-r--r-- | vapigen/valagidlparser.vala | 12 |
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) { |