]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Add support for [Experimental] attribute
authorMarco Trevisan (Treviño) <mail@3v1n0.net>
Tue, 15 Mar 2011 00:39:53 +0000 (01:39 +0100)
committerJürg Billeter <j@bitron.ch>
Tue, 15 Mar 2011 20:43:10 +0000 (21:43 +0100)
Report a warning when using experimental symbols. The GIDL parser has
been updated, too, and bindings have been regenerated.

Fixes bug 644779.

17 files changed:
vala/valaclass.vala
vala/valacodewriter.vala
vala/valaconstant.vala
vala/valadelegate.vala
vala/valaerrordomain.vala
vala/valafield.vala
vala/valainterface.vala
vala/valalambdaexpression.vala
vala/valamemberaccess.vala
vala/valamethod.vala
vala/valareport.vala
vala/valasignal.vala
vala/valastruct.vala
vala/valasymbol.vala
vapi/gtk+-2.0.vapi
vapi/gtk+-3.0.vapi
vapigen/valagidlparser.vala

index d38135ce18778ffdecbdca3e9d5b306fad8ca280..f9ec4fab97828528b7713fde7accf5a578601e7d 100644 (file)
@@ -747,6 +747,8 @@ public class Vala.Class : ObjectTypeSymbol {
                                process_deprecated_attribute (a);
                        } else if (a.name == "GIR") {
                                process_gir_attribute (a);
+                       } else if (a.name == "Experimental") {
+                               process_experimental_attribute (a);
                        }
                }
        }
@@ -1193,6 +1195,7 @@ public class Vala.Class : ObjectTypeSymbol {
                                                        if (sym is Method) {
                                                                // method is used as interface implementation, so it is not unused
                                                                sym.check_deprecated (source_reference);
+                                                               sym.check_experimental (source_reference);
                                                                sym.used = true;
                                                        } else {
                                                                error = true;
@@ -1213,6 +1216,7 @@ public class Vala.Class : ObjectTypeSymbol {
                                                        if (sym is Property) {
                                                                // property is used as interface implementation, so it is not unused
                                                                sym.check_deprecated (source_reference);
+                                                               sym.check_experimental (source_reference);
                                                                sym.used = true;
                                                        } else {
                                                                error = true;
index e016c2f4b7719b7760c9a73b5ecc8cb013688fae..b6e31c27284b39e9a2fbb7e5617002ae6bb25e88 100644 (file)
@@ -226,6 +226,14 @@ public class Vala.CodeWriter : CodeVisitor {
                }
        }
 
+       private void emit_experimental_attribute (Symbol symbol) {
+               if (symbol.experimental) {
+                       write_indent ();
+                       write_string ("[Experimental]");
+                       write_newline ();
+               }
+       }
+
        public override void visit_class (Class cl) {
                if (cl.external_package) {
                        return;
@@ -248,6 +256,7 @@ public class Vala.CodeWriter : CodeVisitor {
                }
 
                emit_deprecated_attribute (cl);
+               emit_experimental_attribute (cl);
 
                write_indent ();
                
@@ -407,6 +416,7 @@ public class Vala.CodeWriter : CodeVisitor {
                }
 
                emit_deprecated_attribute (st);
+               emit_experimental_attribute (st);
 
                write_indent ();
 
@@ -490,6 +500,7 @@ public class Vala.CodeWriter : CodeVisitor {
                }
 
                emit_deprecated_attribute (iface);
+               emit_experimental_attribute (iface);
 
                write_indent ();
 
@@ -568,6 +579,7 @@ public class Vala.CodeWriter : CodeVisitor {
                }
 
                emit_deprecated_attribute (en);
+               emit_experimental_attribute (en);
 
                write_indent ();
 
@@ -644,6 +656,7 @@ public class Vala.CodeWriter : CodeVisitor {
                }
 
                emit_deprecated_attribute (edomain);
+               emit_experimental_attribute (edomain);
 
                write_indent ();
 
@@ -680,6 +693,7 @@ public class Vala.CodeWriter : CodeVisitor {
                }
 
                emit_deprecated_attribute (c);
+               emit_experimental_attribute (c);
 
                bool custom_cname = (c.get_cname () != c.get_default_cname ());
                bool custom_cheaders = (c.parent_symbol is Namespace);
@@ -728,6 +742,7 @@ public class Vala.CodeWriter : CodeVisitor {
                }
 
                emit_deprecated_attribute (f);
+               emit_experimental_attribute (f);
 
                bool custom_cname = (f.get_cname () != f.get_default_cname ());
                bool custom_ctype = (f.get_ctype () != null);
@@ -934,6 +949,7 @@ public class Vala.CodeWriter : CodeVisitor {
                }
 
                emit_deprecated_attribute (cb);
+               emit_experimental_attribute (cb);
 
                write_indent ();
 
@@ -1040,6 +1056,7 @@ public class Vala.CodeWriter : CodeVisitor {
                }
 
                emit_deprecated_attribute (m);
+               emit_experimental_attribute (m);
 
                var ccode_params = new StringBuilder ();
                var separator = "";
@@ -1192,6 +1209,7 @@ public class Vala.CodeWriter : CodeVisitor {
                }
 
                emit_deprecated_attribute (prop);
+               emit_experimental_attribute (prop);
 
                if (prop.no_accessor_method) {
                        write_indent ();
@@ -1290,6 +1308,7 @@ public class Vala.CodeWriter : CodeVisitor {
                }
 
                emit_deprecated_attribute (sig);
+               emit_experimental_attribute (sig);
                
                write_indent ();
                write_accessibility (sig);
index c9b880cb5562e05757cc84762319fbb5f52c8683..0c77d07bce2e467791b338b8199784035fc62821 100644 (file)
@@ -159,6 +159,8 @@ public class Vala.Constant : Symbol, Lockable {
                                process_ccode_attribute (a);
                        } else if (a.name == "Deprecated") {
                                process_deprecated_attribute (a);
+                       } else if (a.name == "Experimental") {
+                               process_experimental_attribute (a);
                        }
                }
        }
index ede77a38888733db6ee0f32b8e2d5c20d963a580..ebe5daeb30a35780382078e403ac978254e3db43 100644 (file)
@@ -313,6 +313,8 @@ public class Vala.Delegate : TypeSymbol {
                                process_ccode_attribute (a);
                        } else if (a.name == "Deprecated") {
                                process_deprecated_attribute (a);
+                       } else if (a.name == "Experimental") {
+                               process_experimental_attribute (a);
                        }
                }
        }
index a17e4f84d846181bde15f65fada4bb896e910c11..40dd9b1ff89d052fc4a63c8d02f085d0a891c7cd 100644 (file)
@@ -197,6 +197,8 @@ public class Vala.ErrorDomain : TypeSymbol {
                                process_ccode_attribute (a);
                        } else if (a.name == "Deprecated") {
                                process_deprecated_attribute (a);
+                       } else if (a.name == "Experimental") {
+                               process_experimental_attribute (a);
                        }
                }
        }
index 28772d921ada59aa1a6725d0d623ac1403eab6d3..4a927d2bda353ad71061c974b0f5aab080a6b1db 100644 (file)
@@ -142,6 +142,8 @@ public class Vala.Field : Variable, Lockable {
                                process_ccode_attribute (a);
                        } else if (a.name == "Deprecated") {
                                process_deprecated_attribute (a);
+                       } else if (a.name == "Experimental") {
+                               process_experimental_attribute (a);
                        }
                }
        }
index 72e0f64f71e89b2452f9383e788b56366a35e43d..2c98426d5b4fe890205bf5222666953a17a1d41f 100644 (file)
@@ -493,6 +493,8 @@ public class Vala.Interface : ObjectTypeSymbol {
                                process_ccode_attribute (a);
                        } else if (a.name == "Deprecated") {
                                process_deprecated_attribute (a);
+                       } else if (a.name == "Experimental") {
+                               process_experimental_attribute (a);
                        }
                }
        }
index 38310334b778372a71dee04112040e636cc556e1..7b9e03f1db17076c448d91537ba2274be2eceb52 100644 (file)
@@ -138,6 +138,7 @@ public class Vala.LambdaExpression : Expression {
                // track usage for flow analyzer
                method.used = true;
                method.check_deprecated (source_reference);
+               method.check_experimental (source_reference);
 
                if (!cb.has_target || !context.analyzer.is_in_instance_method ()) {
                        method.binding = MemberBinding.STATIC;
index f7ebe5acedb76c76a4d378c121eba91cb5ca1db9..dfb0eb6eeb31f9584849e2cd7ee65904c798f594 100644 (file)
@@ -646,6 +646,7 @@ public class Vala.MemberAccess : Expression {
 
                member.used = true;
                member.check_deprecated (source_reference);
+               member.check_experimental (source_reference);
 
                if (access == SymbolAccessibility.PROTECTED) {
                        var target_type = (TypeSymbol) member.parent_symbol;
index 8ef46b0336a0107b6a3bd9f3d4871bcceff8752a..82fca11b4be73587ddd0c71285466b5cac17ccc3 100644 (file)
@@ -495,6 +495,8 @@ public class Vala.Method : Subroutine {
                                process_deprecated_attribute (a);
                        } else if (a.name == "NoThrow") {
                                get_error_types ().clear ();
+                       } else if (a.name == "Experimental") {
+                               process_experimental_attribute (a);
                        }
                }
        }
index 81b3aa73751dca27bd8c59b3495489787ca30ebc..8d3ece97c457c747df35dd67412770659ad90841 100644 (file)
@@ -179,6 +179,9 @@ public class Vala.Report : Object {
        public static void deprecated (SourceReference? source, string message) {
                CodeContext.get ().report.depr (source, message);
        }
+       public static void experimental (SourceReference? source, string message) {
+               CodeContext.get ().report.depr (source, message);
+       }
        public static void warning (SourceReference? source, string message) {
                CodeContext.get ().report.warn (source, message);
        }
index 3c8187051a1d117a7a11ca2eedfd839209d15d89..246c1135bd9e05bf35683cf395261bff7acedfbf 100644 (file)
@@ -271,6 +271,8 @@ public class Vala.Signal : Symbol, Lockable {
                                process_signal_attribute (a);
                        } else if (a.name == "Deprecated") {
                                process_deprecated_attribute (a);
+                       } else if (a.name == "Experimental") {
+                               process_experimental_attribute (a);
                        }
                }
        }
index cab1b820a54aae8d54150f1de8a04bfce826c5b4..c94bc0f4a5e3a064d857fab1b164f468820a010b 100644 (file)
@@ -511,6 +511,8 @@ public class Vala.Struct : TypeSymbol {
                                process_deprecated_attribute (a);
                        } else if (a.name == "GIR") {
                                process_gir_attribute (a);
+                       } else if (a.name == "Experimental") {
+                               process_experimental_attribute (a);
                        }
                }
        }
index 0ffd872066d95580241a0204d2fdc1bd5043f1c6..5b1ef12a979b0e7e88383c3a99849886e3d8018e 100644 (file)
@@ -94,6 +94,11 @@ public abstract class Vala.Symbol : CodeNode {
         */
        public string? replacement { get; set; default = null; }
 
+       /**
+        * Specifies whether this symbol is experimental.
+        */
+       public bool experimental { get; set; default = false; }
+
        /**
         * Specifies whether this symbol has been accessed.
         */
@@ -501,6 +506,32 @@ public abstract class Vala.Symbol : CodeNode {
                }
        }
 
+       /**
+        * Process a [Experimental] attribute
+        */
+       public virtual void process_experimental_attribute (Attribute attr) {
+               if (attr.name != "Experimental") {
+                       return;
+               }
+
+               experimental = true;
+       }
+
+       /**
+        * Check to see if the symbol is experimental, and emit a warning
+        * if it is.
+        */
+       public bool check_experimental (SourceReference? source_ref = null) {
+               if (experimental) {
+                       if (!CodeContext.get ().experimental) {
+                               Report.experimental (source_ref, "%s is experimental".printf (get_full_name ()));
+                       }
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+
        /**
         * Sets the C header filename of this namespace to the specified
         * filename.
index 70a08d95cd581bb377f6532bbaf1fdc94aff55bf..4bd0541e34c53ba93dbe2a67c79b883b03736a4c 100644 (file)
@@ -5930,7 +5930,9 @@ namespace Gtk {
                public bool urgency_hint { get; set; }
                [NoAccessorMethod]
                public Gtk.WindowPosition window_position { get; set; }
+               [Experimental]
                public virtual signal void default_activated ();
+               [Experimental]
                public virtual signal void focus_activated ();
                public virtual signal bool frame_event (Gdk.Event event);
                public virtual signal void keys_changed ();
index 79134a3d4d82e9156a3b3fc788d4613d6aa6a8f1..8dd6ce5fc18ceb50c97248c6b311d8145469d33e 100644 (file)
@@ -5745,7 +5745,9 @@ namespace Gtk {
                public bool urgency_hint { get; set; }
                [NoAccessorMethod]
                public Gtk.WindowPosition window_position { get; set; }
+               [Experimental]
                public virtual signal void default_activated ();
+               [Experimental]
                public virtual signal void focus_activated ();
                public virtual signal void keys_changed ();
                [HasEmitter]
index b188330f8ad11b36656154a6d69dbad77f06176a..4a0f03f39e57228c1e3a56b800b68ffdd30677f6 100644 (file)
@@ -489,6 +489,10 @@ public class Vala.GIdlParser : CodeVisitor {
                                        foreach (string type_param_name in eval (nv[1]).split (",")) {
                                                cb.add_type_parameter (new TypeParameter (type_param_name, current_source_reference));
                                        }
+                               } else if (nv[0] == "experimental") {
+                                       if (eval (nv[1]) == "1") {
+                                               cb.experimental = true;
+                                       }
                                }
                        }
                }
@@ -667,6 +671,10 @@ public class Vala.GIdlParser : CodeVisitor {
                                                        if (eval (nv[1]) == "0") {
                                                                st.has_destroy_function = false;
                                                        }
+                                               } else if (nv[0] == "experimental") {
+                                                       if (eval (nv[1]) == "1") {
+                                                               st.experimental = true;
+                                                       }
                                                }
                                        }
                                }
@@ -757,6 +765,10 @@ public class Vala.GIdlParser : CodeVisitor {
                                                        foreach (string type_param_name in eval (nv[1]).split (",")) {
                                                                cl.add_type_parameter (new TypeParameter (type_param_name, current_source_reference));
                                                        }
+                                               } else if (nv[0] == "experimental") {
+                                                       if (eval (nv[1]) == "1") {
+                                                               cl.experimental = true;
+                                                       }
                                                }
                                        }
                                }
@@ -848,6 +860,10 @@ public class Vala.GIdlParser : CodeVisitor {
                                                        if (eval (nv[1]) == "1") {
                                                                return;
                                                        }
+                                               } else if (nv[0] == "experimental") {
+                                                       if (eval (nv[1]) == "1") {
+                                                               st.experimental = true;
+                                                       }
                                                }
                                        }
                                }
@@ -996,6 +1012,10 @@ public class Vala.GIdlParser : CodeVisitor {
                                                        if (eval (nv[1]) == "0") {
                                                                st.has_destroy_function = false;
                                                        }
+                                               } else if (nv[0] == "experimental") {
+                                                       if (eval (nv[1]) == "1") {
+                                                               st.experimental = true;
+                                                       }
                                                }
                                        }
                                }
@@ -1071,6 +1091,10 @@ public class Vala.GIdlParser : CodeVisitor {
                                                        if (eval (nv[1]) == "1") {
                                                                ref_function_void = true;
                                                        }
+                                               } else if (nv[0] == "experimental") {
+                                                       if (eval (nv[1]) == "1") {
+                                                               cl.experimental = true;
+                                                       }
                                                }
                                        }
                                }
@@ -1227,6 +1251,10 @@ public class Vala.GIdlParser : CodeVisitor {
                                        m.access = SymbolAccessibility.PUBLIC;
                                        m.set_cname (eval(nv[1]));
                                        en.add_method (m);
+                               } else if (nv[0] == "experimental") {
+                                       if (eval (nv[1]) == "1") {
+                                               en.experimental = true;
+                                       }
                                }
                        }
                }
@@ -1315,6 +1343,10 @@ public class Vala.GIdlParser : CodeVisitor {
                                                if (eval (nv[1]) == "1") {
                                                        cl.is_abstract = true;
                                                }
+                                       } else if (nv[0] == "experimental") {
+                                               if (eval (nv[1]) == "1") {
+                                                       cl.experimental = true;
+                                               }
                                        }
                                }
                        }
@@ -2065,6 +2097,10 @@ public class Vala.GIdlParser : CodeVisitor {
                                                m.set_cname (m.name);
                                                m.name = symbol.substring (prefix.length);
                                        }
+                               } else if (nv[0] == "experimental") {
+                                       if (eval (nv[1]) == "1") {
+                                               m.experimental = true;
+                                       }
                                }
                        }
                }
@@ -2439,6 +2475,10 @@ public class Vala.GIdlParser : CodeVisitor {
                                        }
                                } else if (nv[0] == "type_name") {
                                        prop.property_type = parse_type_from_string (eval (nv[1]), false);
+                               } else if (nv[0] == "experimental") {
+                                       if (eval (nv[1]) == "1") {
+                                               prop.experimental = true;
+                                       }
                                }
                        }
                }
@@ -2479,6 +2519,10 @@ public class Vala.GIdlParser : CodeVisitor {
                                        if (eval (nv[1]) == "1") {
                                                return null;
                                        }
+                               } else if (nv[0] == "experimental") {
+                                       if (eval (nv[1]) == "1") {
+                                               c.experimental = true;
+                                       }
                                }
                        }
                }
@@ -2505,6 +2549,7 @@ public class Vala.GIdlParser : CodeVisitor {
                bool deprecated = false;
                string deprecated_since = null;
                string replacement = null;
+               bool experimental = false;
 
                var attributes = get_attributes ("%s.%s".printf (current_data_type.get_cname (), node.name));
                if (attributes != null) {
@@ -2554,6 +2599,10 @@ public class Vala.GIdlParser : CodeVisitor {
                                        array_length_cname = eval (nv[1]);
                                } else if (nv[0] == "array_length_type") {
                                        array_length_type = eval (nv[1]);
+                               } else if (nv[0] == "experimental") {
+                                       if (eval (nv[1]) == "1") {
+                                               experimental = true;
+                                       }
                                }
                        }
                }
@@ -2591,6 +2640,10 @@ public class Vala.GIdlParser : CodeVisitor {
                        }
                }
 
+               if (experimental) {
+                       field.experimental = true;
+               }
+
                if (ctype != null) {
                        field.set_ctype (ctype);
                }
@@ -2730,6 +2783,10 @@ public class Vala.GIdlParser : CodeVisitor {
                                        sig.return_type = parse_type_from_string (eval (nv[1]), false);
                                } else if (nv[0] == "type_arguments") {
                                        parse_type_arguments_from_string (sig.return_type, eval (nv[1]));
+                               } else if (nv[0] == "experimental") {
+                                       if (eval (nv[1]) == "1") {
+                                               sig.experimental = true;
+                                       }
                                }
                        }
                        if (ns_name != null) {