[vala/switch-to-gir] girparser: Report unused metadata and invalid arguments



commit d51506a79fdbd55f40f97fe2f7b122b6da90a950
Author: Luca Bruno <lethalman88 gmail com>
Date:   Wed Aug 25 13:24:27 2010 +0200

    girparser: Report unused metadata and invalid arguments

 vala/valagirparser.vala |   64 ++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 53 insertions(+), 11 deletions(-)
---
diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala
index 15f4094..3e5aeea 100644
--- a/vala/valagirparser.vala
+++ b/vala/valagirparser.vala
@@ -52,12 +52,14 @@ public class Vala.GirParser : CodeVisitor {
 	class Argument {
 		public Expression expression;
 		public SourceLocation source_location;
+		public SourceReference source_reference;
 
 		public bool used = false;
 
-		public Argument (Expression expression, SourceLocation source_location) {
+		public Argument (Expression expression, SourceLocation source_location, SourceReference? source_reference = null) {
 			this.expression = expression;
 			this.source_location = source_location;
+			this.source_reference = source_reference;
 		}
 	}
 
@@ -91,9 +93,19 @@ public class Vala.GirParser : CodeVisitor {
 			children.add (metadata);
 		}
 
-		public Metadata get_child (string name, MetadataType type = MetadataType.GENERIC) {
+		public Metadata? get_child (string pattern, MetadataType type = MetadataType.GENERIC) {
+			foreach (var metadata in children) {
+				if (metadata.type == type && metadata.pattern == pattern) {
+					return metadata;
+				}
+			}
+			return null;
+		}
+
+		public Metadata match_child (string name, MetadataType type = MetadataType.GENERIC) {
 			foreach (var metadata in children) {
 				if (metadata.type == type && metadata.pattern_spec.match_string (name)) {
+					metadata.used = true;
 					return metadata;
 				}
 			}
@@ -111,6 +123,7 @@ public class Vala.GirParser : CodeVisitor {
 		public Expression? get_expression (ArgumentType arg) {
 			var val = args.get (arg);
 			if (val != null) {
+				val.used = true;
 				return val.expression;
 			}
 			return null;
@@ -158,6 +171,7 @@ public class Vala.GirParser : CodeVisitor {
 		public DataType? get_data_type (ArgumentType arg, bool owned_by_default) {
 			var type_arg = args.get (arg);
 			if (type_arg != null && type_arg.expression is StringLiteral) {
+				type_arg.used = true;
 				var location = SourceLocation (type_arg.source_location.pos + 1, type_arg.source_location.line, type_arg.source_location.column + 1);
 				parser.seek (location);
 				var type = parser.parse_type (owned_by_default);
@@ -320,12 +334,15 @@ public class Vala.GirParser : CodeVisitor {
 				return null;
 			}
 
-			metadata = new Metadata (get_string (), type, this, get_current_src ());
 			if (parent_metadata == null) {
 				Report.error (get_current_src (), "cannot determinate parent namespace");
 				return null;
 			}
-			parent_metadata.add_child (metadata);
+			metadata = parent_metadata.get_child (get_string (), type);
+			if (metadata == null) {
+				metadata = new Metadata (get_string (), type, this, get_current_src ());
+				parent_metadata.add_child (metadata);
+			}
 
 			while (true) {
 				var old_end = end;
@@ -345,8 +362,12 @@ public class Vala.GirParser : CodeVisitor {
 					Report.error (get_current_src (), "expected identifier");
 					return null;
 				}
-				var child = new Metadata (get_string (), type, this, get_current_src ());
-				metadata.add_child (child);
+
+				var child = metadata.get_child (get_string (), type);
+				if (child == null) {
+					child = new Metadata (get_string (), type, this, get_current_src ());
+					metadata.add_child (child);
+				}
 				metadata = child;
 			}
 			if (!is_relative) {
@@ -430,8 +451,9 @@ public class Vala.GirParser : CodeVisitor {
 				}
 
 				var id = ArgumentType.from_string (get_string ());
+				var arg_src = get_current_src ();
 				if (id == null) {
-					Report.error (get_current_src (), "unknown argument");
+					Report.error (arg_src, "unknown argument");
 					return false;
 				}
 
@@ -441,12 +463,12 @@ public class Vala.GirParser : CodeVisitor {
 				}
 				next ();
 
-				var begin = this.begin;
+				var expr_begin = this.begin;
 				Expression expr = parse_literal ();
 				if (expr == null) {
 					return false;
 				}
-				metadata.add_argument (id, new Argument (expr, begin));
+				metadata.add_argument (id, new Argument (expr, expr_begin, arg_src));
 			} while (current == TokenType.IDENTIFIER);
 
 			return true;
@@ -540,6 +562,8 @@ public class Vala.GirParser : CodeVisitor {
 			}
 
 			parse_file (source_file);
+
+			report_unused_metadata (metadata);
 		}
 	}
 
@@ -599,7 +623,7 @@ public class Vala.GirParser : CodeVisitor {
 			type = MetadataType.PROPERTY;
 		}
 
-		return metadata.get_child (child_name, type);
+		return metadata.match_child (child_name, type);
 	}
 
 
@@ -725,7 +749,7 @@ public class Vala.GirParser : CodeVisitor {
 			gir_namespaces[gir_namespace] = namespace_name;
 		}
 
-		var ns_metadata = metadata.get_child (gir_namespace);
+		var ns_metadata = metadata.match_child (gir_namespace);
 
 		var ns = context.root.scope.lookup (namespace_name) as Namespace;
 		if (ns == null) {
@@ -1951,5 +1975,23 @@ public class Vala.GirParser : CodeVisitor {
 			}
 		}
 	}
+
+	void report_unused_metadata (Metadata metadata) {
+		foreach (var arg_type in metadata.args.get_keys ()) {
+			var arg = metadata.args[arg_type];
+			if (!arg.used) {
+				// if metadata is used and argument is not, then it's a unexpected argument
+				Report.error (arg.source_reference, "unexpected argument in this context %s %s".printf(metadata.pattern, arg_type.to_string()));
+			}
+		}
+
+		foreach (var child in metadata.children) {
+			if (!child.used) {
+				Report.warning (child.source_reference, "metadata never used");
+			} else {
+				report_unused_metadata (child);
+			}
+		}
+	}
 }
 



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