[vala/staging: 4/7] vala: Report error for public creation methods of abstract classes



commit 2caef4facc1da5c390b94fa11ae52f51d6fc8d6d
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Tue Mar 12 10:29:46 2019 +0100

    vala: Report error for public creation methods of abstract classes
    
    Only report a warning for external creation methods to reduce the initial
    fallout.
    
    Fixes https://gitlab.gnome.org/GNOME/vala/issues/766

 tests/Makefile.am                              |  1 +
 tests/objects/constructor-abstract-public.test |  9 +++++++++
 vala/valaclass.vala                            | 10 ++++++++++
 3 files changed, 20 insertions(+)
---
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 6c1653bda..41481e7e8 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -279,6 +279,7 @@ TESTS = \
        objects/classes-implicit-implementation.vala \
        objects/compact-class.vala \
        objects/compact-class-destructor.vala \
+       objects/constructor-abstract-public.test \
        objects/constructor-variadic.test \
        objects/constructors.vala \
        objects/destructors.vala \
diff --git a/tests/objects/constructor-abstract-public.test b/tests/objects/constructor-abstract-public.test
new file mode 100644
index 000000000..4058ccf9c
--- /dev/null
+++ b/tests/objects/constructor-abstract-public.test
@@ -0,0 +1,9 @@
+Invalid Code
+
+abstract class Foo {
+       public Foo () {
+       }
+}
+
+void main () {
+}
diff --git a/vala/valaclass.vala b/vala/valaclass.vala
index 51e8fbade..933a67c26 100644
--- a/vala/valaclass.vala
+++ b/vala/valaclass.vala
@@ -296,6 +296,16 @@ public class Vala.Class : ObjectTypeSymbol {
                                m.error = true;
                                return;
                        }
+                       if (is_abstract && cm.access == SymbolAccessibility.PUBLIC) {
+                               //TODO Report an error for external constructors too
+                               if (external_package) {
+                                       Report.warning (m.source_reference, "Creation method of abstract 
class cannot be public.");
+                               } else {
+                                       Report.error (m.source_reference, "Creation method of abstract class 
cannot be public.");
+                                       error = true;
+                                       return;
+                               }
+                       }
                }
 
                base.add_method (m);


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