[vala/staging] vala: Let the parser have set namespace members as static



commit e722f7640e01b405cc600f8a3b164dce3407d321
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Sun Nov 24 22:42:18 2019 +0100

    vala: Let the parser have set namespace members as static
    
    ... and move error reporting for invalid members into check()

 vala/valagenieparser.vala   |  4 +--
 vala/valagirparser.vala     | 12 +++++++--
 vala/valanamespace.vala     | 63 +++++++++++++++++++++------------------------
 vala/valaparser.vala        |  6 +++++
 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) {


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