[vala] Add support for [Experimental] attribute



commit f197d7330bd2c0cf3c8c0b7ce419e411e354aac3
Author: Marco Trevisan (Treviño) <mail 3v1n0 net>
Date:   Tue Mar 15 01:39:53 2011 +0100

    Add support for [Experimental] attribute
    
    Report a warning when using experimental symbols. The GIDL parser has
    been updated, too, and bindings have been regenerated.
    
    Fixes bug 644779.

 vala/valaclass.vala            |    4 +++
 vala/valacodewriter.vala       |   19 +++++++++++++
 vala/valaconstant.vala         |    2 +
 vala/valadelegate.vala         |    2 +
 vala/valaerrordomain.vala      |    2 +
 vala/valafield.vala            |    2 +
 vala/valainterface.vala        |    2 +
 vala/valalambdaexpression.vala |    1 +
 vala/valamemberaccess.vala     |    1 +
 vala/valamethod.vala           |    2 +
 vala/valareport.vala           |    3 ++
 vala/valasignal.vala           |    2 +
 vala/valastruct.vala           |    2 +
 vala/valasymbol.vala           |   31 +++++++++++++++++++++
 vapi/gtk+-2.0.vapi             |    2 +
 vapi/gtk+-3.0.vapi             |    2 +
 vapigen/valagidlparser.vala    |   57 ++++++++++++++++++++++++++++++++++++++++
 17 files changed, 136 insertions(+), 0 deletions(-)
---
diff --git a/vala/valaclass.vala b/vala/valaclass.vala
index d38135c..f9ec4fa 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 e016c2f..b6e31c2 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 c9b880c..0c77d07 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 ede77a3..ebe5dae 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 a17e4f8..40dd9b1 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 28772d9..4a927d2 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 72e0f64..2c98426 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 3831033..7b9e03f 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 f7ebe5a..dfb0eb6 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 8ef46b0..82fca11 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 81b3aa7..8d3ece9 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 3c81870..246c113 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 cab1b82..c94bc0f 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 0ffd872..5b1ef12 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 70a08d9..4bd0541 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 79134a3..8dd6ce5 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 b188330..4a0f03f 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) {



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