[vala/switch-to-gir] girparser: Parse glob-style patterns
- From: Luca Bruno <lucabru src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/switch-to-gir] girparser: Parse glob-style patterns
- Date: Thu, 26 Aug 2010 16:41:29 +0000 (UTC)
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]