diff options
-rw-r--r-- | vala/valaclass.vala | 4 | ||||
-rw-r--r-- | vala/valacodewriter.vala | 19 | ||||
-rw-r--r-- | vala/valaconstant.vala | 2 | ||||
-rw-r--r-- | vala/valadelegate.vala | 2 | ||||
-rw-r--r-- | vala/valaerrordomain.vala | 2 | ||||
-rw-r--r-- | vala/valafield.vala | 2 | ||||
-rw-r--r-- | vala/valainterface.vala | 2 | ||||
-rw-r--r-- | vala/valalambdaexpression.vala | 1 | ||||
-rw-r--r-- | vala/valamemberaccess.vala | 1 | ||||
-rw-r--r-- | vala/valamethod.vala | 2 | ||||
-rw-r--r-- | vala/valareport.vala | 3 | ||||
-rw-r--r-- | vala/valasignal.vala | 2 | ||||
-rw-r--r-- | vala/valastruct.vala | 2 | ||||
-rw-r--r-- | vala/valasymbol.vala | 31 | ||||
-rw-r--r-- | vapi/gtk+-2.0.vapi | 2 | ||||
-rw-r--r-- | vapi/gtk+-3.0.vapi | 2 | ||||
-rw-r--r-- | vapigen/valagidlparser.vala | 57 |
17 files changed, 136 insertions, 0 deletions
diff --git a/vala/valaclass.vala b/vala/valaclass.vala index d38135ce1..f9ec4fab9 100644 --- a/vala/valaclass.vala +++ b/vala/valaclass.vala @@ -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; diff --git a/vala/valacodewriter.vala b/vala/valacodewriter.vala index e016c2f4b..b6e31c272 100644 --- a/vala/valacodewriter.vala +++ b/vala/valacodewriter.vala @@ -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); diff --git a/vala/valaconstant.vala b/vala/valaconstant.vala index c9b880cb5..0c77d07bc 100644 --- a/vala/valaconstant.vala +++ b/vala/valaconstant.vala @@ -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); } } } diff --git a/vala/valadelegate.vala b/vala/valadelegate.vala index ede77a388..ebe5daeb3 100644 --- a/vala/valadelegate.vala +++ b/vala/valadelegate.vala @@ -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); } } } diff --git a/vala/valaerrordomain.vala b/vala/valaerrordomain.vala index a17e4f84d..40dd9b1ff 100644 --- a/vala/valaerrordomain.vala +++ b/vala/valaerrordomain.vala @@ -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); } } } diff --git a/vala/valafield.vala b/vala/valafield.vala index 28772d921..4a927d2bd 100644 --- a/vala/valafield.vala +++ b/vala/valafield.vala @@ -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); } } } diff --git a/vala/valainterface.vala b/vala/valainterface.vala index 72e0f64f7..2c98426d5 100644 --- a/vala/valainterface.vala +++ b/vala/valainterface.vala @@ -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); } } } diff --git a/vala/valalambdaexpression.vala b/vala/valalambdaexpression.vala index 38310334b..7b9e03f1d 100644 --- a/vala/valalambdaexpression.vala +++ b/vala/valalambdaexpression.vala @@ -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; diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala index f7ebe5ace..dfb0eb6ee 100644 --- a/vala/valamemberaccess.vala +++ b/vala/valamemberaccess.vala @@ -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; diff --git a/vala/valamethod.vala b/vala/valamethod.vala index 8ef46b033..82fca11b4 100644 --- a/vala/valamethod.vala +++ b/vala/valamethod.vala @@ -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); } } } diff --git a/vala/valareport.vala b/vala/valareport.vala index 81b3aa737..8d3ece97c 100644 --- a/vala/valareport.vala +++ b/vala/valareport.vala @@ -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); } diff --git a/vala/valasignal.vala b/vala/valasignal.vala index 3c8187051..246c1135b 100644 --- a/vala/valasignal.vala +++ b/vala/valasignal.vala @@ -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); } } } diff --git a/vala/valastruct.vala b/vala/valastruct.vala index cab1b820a..c94bc0f4a 100644 --- a/vala/valastruct.vala +++ b/vala/valastruct.vala @@ -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); } } } diff --git a/vala/valasymbol.vala b/vala/valasymbol.vala index 0ffd87206..5b1ef12a9 100644 --- a/vala/valasymbol.vala +++ b/vala/valasymbol.vala @@ -95,6 +95,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. */ public bool used { get; set; } @@ -502,6 +507,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. * diff --git a/vapi/gtk+-2.0.vapi b/vapi/gtk+-2.0.vapi index 70a08d95c..4bd0541e3 100644 --- a/vapi/gtk+-2.0.vapi +++ b/vapi/gtk+-2.0.vapi @@ -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 (); diff --git a/vapi/gtk+-3.0.vapi b/vapi/gtk+-3.0.vapi index 79134a3d4..8dd6ce5fc 100644 --- a/vapi/gtk+-3.0.vapi +++ b/vapi/gtk+-3.0.vapi @@ -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] diff --git a/vapigen/valagidlparser.vala b/vapigen/valagidlparser.vala index b188330f8..4a0f03f39 100644 --- a/vapigen/valagidlparser.vala +++ b/vapigen/valagidlparser.vala @@ -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) { |