]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Move setting of default defines for VALA_0_XX and GLIB_2_XX to Context 3d926c1288b3ec4fd692dd1de6b91fb6c2090183
authorRico Tzschichholz <ricotz@ubuntu.com>
Sat, 24 Nov 2018 12:43:21 +0000 (13:43 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sat, 24 Nov 2018 18:40:31 +0000 (19:40 +0100)
This avoids duplicated code and reduces the setup burden for library users.

Also start to warn about redefinitions, especially for our default defines.

compiler/valacompiler.vala
vala/valacodecontext.vala
valadoc/treebuilder.vala

index 405a4965e0d4c5e4a3cc5d6ae32c9cd88e238c51..e0b02060e075f4e3b13a9721a910640c25d42397 100644 (file)
@@ -300,30 +300,14 @@ class Vala.Compiler {
                        }
                }
 
-               for (int i = 2; i <= 44; i += 2) {
-                       context.add_define ("VALA_0_%d".printf (i));
-               }
-
                if (context.profile == Profile.POSIX) {
                        if (!nostdpkg) {
                                /* default package */
                                context.add_external_package ("posix");
                        }
                } else if (context.profile == Profile.GOBJECT) {
-                       int glib_major = 2;
-                       int glib_minor = 40;
-                       if (target_glib != null && target_glib.scanf ("%d.%d", out glib_major, out glib_minor) != 2) {
-                               Report.error (null, "Invalid format for --target-glib");
-                       }
-
-                       context.target_glib_major = glib_major;
-                       context.target_glib_minor = glib_minor;
-                       if (context.target_glib_major != 2) {
-                               Report.error (null, "This version of valac only supports GLib 2");
-                       }
-
-                       for (int i = 16; i <= glib_minor; i += 2) {
-                               context.add_define ("GLIB_2_%d".printf (i));
+                       if (target_glib != null) {
+                               context.set_target_glib_version (target_glib);
                        }
 
                        if (!nostdpkg) {
index 65a5e2ab9adea13762197dcc2971a4cea71f3bf2..815899ceef06115a5aa806ab8acfd552e8f83eb7 100644 (file)
@@ -165,16 +165,6 @@ public class Vala.CodeContext {
 
        public Profile profile { get; set; }
 
-       /**
-        * Target major version number of glib for code generation.
-        */
-       public int target_glib_major { get; set; }
-
-       /**
-        * Target minor version number of glib for code generation.
-        */
-       public int target_glib_minor { get; set; }
-
        public bool verbose_mode { get; set; }
 
        public bool version_header { get; set; }
@@ -222,6 +212,9 @@ public class Vala.CodeContext {
 
        static StaticPrivate context_stack_key = StaticPrivate ();
 
+       int target_glib_major;
+       int target_glib_minor;
+
        /**
         * The root namespace of the symbol tree.
         */
@@ -246,6 +239,8 @@ public class Vala.CodeContext {
        public UsedAttr used_attr { get; set; }
 
        public CodeContext () {
+               add_default_defines ();
+
                resolver = new SymbolResolver ();
                analyzer = new SemanticAnalyzer ();
                flow_analyzer = new FlowAnalyzer ();
@@ -511,6 +506,14 @@ public class Vala.CodeContext {
        }
 
        public void add_define (string define) {
+               if (is_defined (define)) {
+                       Report.warning (null, "`%s' is already defined".printf (define));
+                       if (/VALA_0_\d+/.match_all (define)) {
+                               Report.warning (null, "`VALA_0_XX' defines are automatically added up to current compiler version in use");
+                       } else if (/GLIB_2_\d+/.match_all (define)) {
+                               Report.warning (null, "`GLIB_2_XX' defines are automatically added up to targeted glib version");
+                       }
+               }
                defines.add (define);
        }
 
@@ -518,6 +521,62 @@ public class Vala.CodeContext {
                return (define in defines);
        }
 
+       void add_default_defines () {
+               int api_major = 0;
+               int api_minor = 0;
+
+               if (API_VERSION.scanf ("%d.%d", out api_major, out api_minor) != 2
+                   || api_major > 0
+                   || api_minor % 2 != 0) {
+                       Report.error (null, "Invalid format for Vala.API_VERSION");
+                       return;
+               }
+
+               for (int i = 2; i <= api_minor; i += 2) {
+                       defines.add ("VALA_0_%d".printf (i));
+               }
+
+               target_glib_major = 2;
+               target_glib_minor = 40;
+
+               for (int i = 16; i <= target_glib_minor; i += 2) {
+                       defines.add ("GLIB_2_%d".printf (i));
+               }
+       }
+
+       /**
+        * Set the target version of glib for code generation.
+        *
+        * This may be called once or not at all.
+        *
+        * @param target_glib a string of the format "%d.%d"
+        */
+       public void set_target_glib_version (string target_glib) {
+               int glib_major = target_glib_major;
+               int glib_minor = target_glib_minor;
+
+               if (target_glib != null && target_glib.scanf ("%d.%d", out glib_major, out glib_minor) != 2
+                   || glib_minor % 2 != 0) {
+                       Report.error (null, "Invalid format or version for target GLib");
+               }
+
+               if (glib_major != 2) {
+                       Report.error (null, "This version of valac only supports GLib 2");
+               }
+
+               if (glib_minor <= target_glib_minor) {
+                       // no additional defines needed
+                       return;
+               }
+
+               for (int i = target_glib_major + 2; i <= glib_minor; i += 2) {
+                       defines.add ("GLIB_2_%d".printf (i));
+               }
+
+               target_glib_major = glib_minor;
+               target_glib_minor = glib_major;
+       }
+
        public string? get_vapi_path (string pkg) {
                var path = get_file_path (pkg + ".vapi", "vala" + Config.PACKAGE_SUFFIX + "/vapi", "vala/vapi", vapi_directories);
 
index 5c76aafcc4f99ce6655e595e67489709a82450da..7c35905dcaa73a5cbc9ebbf408d2302aad1d29a7 100644 (file)
@@ -898,32 +898,9 @@ public class Valadoc.Drivers.TreeBuilder : Vala.CodeVisitor {
                        }
                }
 
-               for (int i = 2; i <= 44; i += 2) {
-                       context.add_define ("VALA_0_%d".printf (i));
-               }
-
                if (context.profile == Vala.Profile.GOBJECT) {
-                       int glib_major = 2;
-                       int glib_minor = 40;
-
-                       context.target_glib_major = glib_major;
-                       context.target_glib_minor = glib_minor;
-                       if (context.target_glib_major != 2) {
-                               Vala.Report.error (null, "This version of valac only supports GLib 2");
-                       }
-
-                       if (settings.target_glib != null && settings.target_glib.scanf ("%d.%d", out glib_major, out glib_minor) != 2) {
-                               Vala.Report.error (null, "Invalid format for --target-glib");
-                       }
-
-                       context.target_glib_major = glib_major;
-                       context.target_glib_minor = glib_minor;
-                       if (context.target_glib_major != 2) {
-                               Vala.Report.error (null, "This version of valac only supports GLib 2");
-                       }
-
-                       for (int i = 16; i <= glib_minor; i += 2) {
-                               context.add_define ("GLIB_2_%d".printf (i));
+                       if (settings.target_glib != null) {
+                               context.set_target_glib_version (settings.target_glib);
                        }
 
                        // default packages