[vala/switch-to-gir] girparser: Support multiple pattern matches



commit 53efb89cb52d3e13492abc0f739e60728411f6e0
Author: Luca Bruno <lethalman88 gmail com>
Date:   Sat Aug 28 17:32:57 2010 +0200

    girparser: Support multiple pattern matches

 vala/valagirparser.vala |   35 ++++++++++++++++++++++++++++++++---
 1 files changed, 32 insertions(+), 3 deletions(-)
---
diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala
index 7bfc443..4dea2d9 100644
--- a/vala/valagirparser.vala
+++ b/vala/valagirparser.vala
@@ -89,6 +89,22 @@ public class Vala.GirParser : CodeVisitor {
 		}
 	}
 
+	class MetadataSet : Metadata {
+		public MetadataSet (MetadataType type) {
+			base ("", type);
+		}
+
+		public void add_sibling (Metadata metadata) {
+			foreach (var child in metadata.children) {
+				add_child (child);
+			}
+			// merge arguments and take precedence
+			foreach (var key in metadata.args.get_keys ()) {
+				args[key] = metadata.args[key];
+			}
+		}
+	}
+
 	class Metadata {
 		private static Metadata _empty = null;
 		public static Metadata empty {
@@ -130,13 +146,26 @@ public class Vala.GirParser : CodeVisitor {
 		}
 
 		public Metadata match_child (string name, MetadataType type = MetadataType.GENERIC) {
+			var result = Metadata.empty;
 			foreach (var metadata in children) {
 				if (metadata.type == type && metadata.pattern_spec.match_string (name)) {
 					metadata.used = true;
-					return metadata;
+					if (result == Metadata.empty) {
+						// first match
+						result = metadata;
+					} else {
+						var ms = result as MetadataSet;
+						if (ms == null) {
+							// second match
+							ms = new MetadataSet (type);
+						}
+						ms.add_sibling (result);
+						ms.add_sibling (metadata);
+						result = ms;
+					}
 				}
 			}
-			return Metadata.empty;
+			return result;
 		}
 
 		public void add_argument (ArgumentType key, Argument value) {
@@ -2573,7 +2602,7 @@ public class Vala.GirParser : CodeVisitor {
 			var arg = metadata.args[arg_type];
 			if (!arg.used) {
 				// if metadata is used and argument is not, then it's a unexpected argument
-				Report.warning (arg.source_reference, "argument not used in this context");
+				Report.warning (arg.source_reference, "argument never used");
 			}
 		}
 



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