[vala/switch-to-gir] girparser: Parse glob-style patterns



commit ec5e6e566604d87e9d93d98726f5aa08a96ccbe1
Author: Luca Bruno <lethalman88 gmail com>
Date:   Thu Aug 26 10:12:46 2010 +0200

    girparser: Parse glob-style patterns

 vala/valagirparser.vala |   87 +++++++++++++++++++++++++++++-----------------
 1 files changed, 55 insertions(+), 32 deletions(-)
---
diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala
index 0932737..f0dc8f5 100644
--- a/vala/valagirparser.vala
+++ b/vala/valagirparser.vala
@@ -195,6 +195,7 @@ public class Vala.GirParser : CodeVisitor {
 		private Scanner scanner;
 		private SourceLocation begin;
 		private SourceLocation end;
+		private SourceLocation old_end;
 		private TokenType current;
 		private Metadata parent_metadata;
 
@@ -286,10 +287,19 @@ public class Vala.GirParser : CodeVisitor {
 		}
 
 		TokenType next () {
+			old_end = end;
 			current = scanner.read_token (out begin, out end);
 			return current;
 		}
 
+		bool has_space () {
+			return old_end.pos != begin.pos;
+		}
+
+		bool has_newline () {
+			return old_end.line != begin.line;
+		}
+
 		string get_string () {
 			return ((string) begin.pos).ndup ((end.pos - begin.pos));
 		}
@@ -318,11 +328,35 @@ public class Vala.GirParser : CodeVisitor {
 			}
 		}
 
+		string? parse_glob (out SourceReference source_reference) {
+			if (current != TokenType.IDENTIFIER && current != TokenType.STAR) {
+				return null;
+			}
+
+			var begin = this.begin;
+			var builder = new StringBuilder ();
+			do {
+				if (current == TokenType.IDENTIFIER) {
+					builder.append (get_string ());
+					source_reference = get_src (begin);
+					next ();
+				} else if (current == TokenType.STAR) {
+					builder.append_c ('*');
+					source_reference = get_src (begin);
+					next ();
+				} else {
+					break;
+				}
+			} while (!has_space ());
+			return builder.str;
+		}
+
 		Metadata? parse_pattern () {
 			Metadata metadata;
 			bool is_relative = false;
 			MetadataType? type = MetadataType.GENERIC;
-			if (current == TokenType.IDENTIFIER) {
+			if (current == TokenType.IDENTIFIER || current == TokenType.STAR) {
+				// absolute pattern
 				parent_metadata = tree;
 			} else {
 				// relative pattern
@@ -331,7 +365,7 @@ public class Vala.GirParser : CodeVisitor {
  			}
 
 			if (type == null) {
-				Report.error (get_current_src (), "expected identifier, `.', `:' or `::'");
+				Report.error (get_current_src (), "expected pattern, `.', `:' or `::'");
 				return null;
 			}
 
@@ -339,34 +373,32 @@ public class Vala.GirParser : CodeVisitor {
 				Report.error (get_current_src (), "cannot determinate parent metadata");
 				return null;
 			}
-			metadata = parent_metadata.get_child (get_string (), type);
+
+			SourceReference src;
+			var pattern = parse_glob (out src);
+			if (pattern == null) {
+				return null;
+			}
+			metadata = parent_metadata.get_child (pattern, type);
 			if (metadata == null) {
-				metadata = new Metadata (get_string (), type, this, get_current_src ());
+				metadata = new Metadata (pattern, type, this, src);
 				parent_metadata.add_child (metadata);
 			}
 
-			while (true) {
-				var old_end = end;
-				next ();
-				if (current == TokenType.EOF || old_end.pos != begin.pos) {
-					// eof or spaces in the middle
-					break;
-				}
-
+			while (current != TokenType.EOF && !has_space ()) {
 				type = parse_metadata_access ();
 				if (type == null) {
 					Report.error (get_current_src (), "expected `.', `:' or `::'");
 					return null;
 				}
 
-				if (current != TokenType.IDENTIFIER) {
-					Report.error (get_current_src (), "expected identifier");
+				pattern = parse_glob (out src);
+				if (pattern == null) {
 					return null;
 				}
-
-				var child = metadata.get_child (get_string (), type);
+				var child = metadata.get_child (pattern, type);
 				if (child == null) {
-					child = new Metadata (get_string (), type, this, get_current_src ());
+					child = new Metadata (pattern, type, this, src);
 					metadata.add_child (child);
 				}
 				metadata = child;
@@ -439,18 +471,11 @@ public class Vala.GirParser : CodeVisitor {
 		}
 
 		bool parse_args (Metadata metadata) {
-			var old_end = end;
-			if (current != TokenType.IDENTIFIER) {
-				Report.error (get_current_src (), "expected argument name");
-				return false;
-			}
-
-			do {
-				if (current == TokenType.EOF || begin.line != old_end.line) {
-					// eof or new line
-					break;
+			while (current != TokenType.EOF && !has_newline ()) {
+				if (current != TokenType.IDENTIFIER) {
+					Report.error (get_current_src (), "expected argument name");
+					return false;
 				}
-
 				var id = ArgumentType.from_string (get_string ());
 				var arg_src = get_current_src ();
 				if (id == null) {
@@ -470,7 +495,7 @@ public class Vala.GirParser : CodeVisitor {
 					return false;
 				}
 				metadata.add_argument (id, new Argument (expr, expr_begin, arg_src));
-			} while (current == TokenType.IDENTIFIER);
+			}
 
 			return true;
 		}
@@ -569,7 +594,6 @@ public class Vala.GirParser : CodeVisitor {
 		string metadata_filename = "%s.metadata".printf (source_file.filename.ndup (source_file.filename.length - ".gir".length));
 		if (FileUtils.test (metadata_filename, FileTest.EXISTS)) {
 			var metadata_parser = new MetadataParser ();
-			metadata_stack.add (metadata);
 			metadata = metadata_parser.parse_metadata (new SourceFile (context, metadata_filename, true));
 		}
 
@@ -632,14 +656,13 @@ public class Vala.GirParser : CodeVisitor {
 		return metadata.match_child (child_name, type);
 	}
 
-
 	bool push_metadata () {
 		// hidden?
 		if (reader.get_attribute ("introspectable") == "0") {
 			return false;
 		}
 		var new_metadata = get_metadata_from_element ();
-		if (new_metadata.has_argument (ArgumentType.HIDDEN) && new_metadata.get_bool (ArgumentType.HIDDEN)) {
+		if (new_metadata.get_bool (ArgumentType.HIDDEN)) {
 			return false;
 		}
 



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