[vala/switch-to-gir] girparser: Report unused metadata and invalid arguments
- From: Luca Bruno <lucabru src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/switch-to-gir] girparser: Report unused metadata and invalid arguments
- Date: Wed, 25 Aug 2010 11:28:53 +0000 (UTC)
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]