summaryrefslogtreecommitdiff
path: root/vala
diff options
context:
space:
mode:
authorRaffaele Sandrini <raffaele@sandrini.ch>2007-08-16 09:21:55 +0000
committerRaffaele Sandrini <rasa@src.gnome.org>2007-08-16 09:21:55 +0000
commitb9895f6d843d2df8fac8dc1d3d6fd6cbf9a9631f (patch)
treebd318a402221612bac4b5a4010384295ffd00ecd /vala
parent444d84be75abdd2159ca6a765223e49dfbdb58d0 (diff)
downloadvala-b9895f6d843d2df8fac8dc1d3d6fd6cbf9a9631f.tar.gz
adapt visit initializer and visit array creation to external visitor check
2007-08-16 Raffaele Sandrini <raffaele@sandrini.ch> * gobject/valacodegenerator.vala, vala/valacodevisitor.vala, vala/valasemanticanalyzer.vala, vala/valasymbolresolver.vala: adapt visit initializer and visit array creation to external visitor * vala/valamemorymanager.vala: check initializers of array creation expressions for missing ref * vala/valaarraycreationexpression.vala, vala/valainitializerlist.vala: change to external visitor svn path=/trunk/; revision=469
Diffstat (limited to 'vala')
-rw-r--r--vala/valaarraycreationexpression.vala22
-rw-r--r--vala/valacodevisitor.vala22
-rw-r--r--vala/valainitializerlist.vala15
-rw-r--r--vala/valamemorymanager.vala12
-rw-r--r--vala/valasemanticanalyzer.vala59
-rw-r--r--vala/valasymbolresolver.vala11
6 files changed, 73 insertions, 68 deletions
diff --git a/vala/valaarraycreationexpression.vala b/vala/valaarraycreationexpression.vala
index 6c6d6293b..c92ee30ed 100644
--- a/vala/valaarraycreationexpression.vala
+++ b/vala/valaarraycreationexpression.vala
@@ -64,24 +64,22 @@ public class Vala.ArrayCreationExpression : Expression {
public ArrayCreationExpression (construct TypeReference element_type, construct int rank, construct InitializerList initializer_list, construct SourceReference source_reference) {
}
-
- public override void accept (CodeVisitor! visitor) {
+
+ public override void accept_children (CodeVisitor! visitor) {
if (element_type != null) {
element_type.accept (visitor);
}
-
- if (sizes != null) {
- foreach (Expression e in sizes) {
- e.accept (visitor);
- }
+
+ foreach (Expression e in sizes) {
+ e.accept (visitor);
}
-
- visitor.visit_begin_array_creation_expression (this);
-
+
if (initializer_list != null) {
initializer_list.accept (visitor);
}
-
- visitor.visit_end_array_creation_expression (this);
+ }
+
+ public override void accept (CodeVisitor! visitor) {
+ visitor.visit_array_creation_expression (this);
}
}
diff --git a/vala/valacodevisitor.vala b/vala/valacodevisitor.vala
index 9a92c4d45..809fa3948 100644
--- a/vala/valacodevisitor.vala
+++ b/vala/valacodevisitor.vala
@@ -264,15 +264,7 @@ public abstract class Vala.CodeVisitor {
*
* @param list an initializer list
*/
- public virtual void visit_begin_initializer_list (InitializerList! list) {
- }
-
- /**
- * Visit operation called for initializer lists
- *
- * @param list an initializer list
- */
- public virtual void visit_end_initializer_list (InitializerList! list) {
+ public virtual void visit_initializer_list (InitializerList! list) {
}
/**
@@ -418,21 +410,13 @@ public abstract class Vala.CodeVisitor {
*/
public virtual void visit_lock_statement (LockStatement! stmt) {
}
-
- /**
- * Visit operations called for array creation expresions.
- *
- * @param expr an array creation expression
- */
- public virtual void visit_begin_array_creation_expression (ArrayCreationExpression! expr) {
- }
-
+
/**
* Visit operations called for array creation expresions.
*
* @param expr an array creation expression
*/
- public virtual void visit_end_array_creation_expression (ArrayCreationExpression! expr) {
+ public virtual void visit_array_creation_expression (ArrayCreationExpression! expr) {
}
/**
diff --git a/vala/valainitializerlist.vala b/vala/valainitializerlist.vala
index 6793c10b5..2cfe08830 100644
--- a/vala/valainitializerlist.vala
+++ b/vala/valainitializerlist.vala
@@ -1,6 +1,6 @@
/* valainitializerlist.vala
*
- * Copyright (C) 2006-2007 Jürg Billeter
+ * Copyright (C) 2006-2007 Jürg Billeter, Raffaele Sandrini
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -18,6 +18,7 @@
*
* Author:
* Jürg Billeter <j@bitron.ch>
+ * Raffaele Sandrini <raffaele@sandrini.ch>
*/
using GLib;
@@ -55,14 +56,14 @@ public class Vala.InitializerList : Expression {
*/
public InitializerList (construct SourceReference source_reference) {
}
-
- public override void accept (CodeVisitor! visitor) {
- visitor.visit_begin_initializer_list (this);
-
+
+ public override void accept_children (CodeVisitor! visitor) {
foreach (Expression expr in initializers) {
expr.accept (visitor);
}
-
- visitor.visit_end_initializer_list (this);
+ }
+
+ public override void accept (CodeVisitor! visitor) {
+ visitor.visit_initializer_list (this);
}
}
diff --git a/vala/valamemorymanager.vala b/vala/valamemorymanager.vala
index 7cf7e9fbd..afd02128d 100644
--- a/vala/valamemorymanager.vala
+++ b/vala/valamemorymanager.vala
@@ -134,6 +134,10 @@ public class Vala.MemoryManager : CodeVisitor {
}
}
+ public override void visit_initializer_list (InitializerList! list) {
+ list.accept_children (this);
+ }
+
public override void visit_expression_statement (ExpressionStatement! stmt) {
visit_possibly_leaked_expression (stmt.expression);
}
@@ -167,6 +171,14 @@ public class Vala.MemoryManager : CodeVisitor {
clause.accept_children (this);
}
+ public override void visit_array_creation_expression (ArrayCreationExpression! e) {
+ if (e.initializer_list != null) {
+ foreach (Expression init in e.initializer_list.get_initializers ()) {
+ visit_possibly_missing_copy_expression (init);
+ }
+ }
+ }
+
public override void visit_member_access (MemberAccess! expr) {
if (expr.inner != null) {
visit_possibly_leaked_expression (expr.inner);
diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala
index c474f9bf2..50ba0647c 100644
--- a/vala/valasemanticanalyzer.vala
+++ b/vala/valasemanticanalyzer.vala
@@ -750,7 +750,7 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
*
* @param list an initializer list
*/
- public override void visit_begin_initializer_list (InitializerList! list) {
+ public override void visit_initializer_list (InitializerList! list) {
if (list.expected_type != null && list.expected_type.data_type is Array) {
/* initializer is used as array initializer */
Array edt = (Array)list.expected_type.data_type;
@@ -768,14 +768,9 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
e.expected_type = child_type.copy ();
}
}
- }
- /**
- * Visit operation called for initializer lists
- *
- * @param list an initializer list
- */
- public override void visit_end_initializer_list (InitializerList! list) {
+ list.accept_children (this);
+
if (list.expected_type != null && list.expected_type.data_type is Array) {
Array edt = (Array)list.expected_type.data_type;
var inits = list.get_initializers ();
@@ -993,39 +988,45 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
((Lockable) stmt.resource.symbol_reference).set_lock_used (true);
}
- public override void visit_begin_array_creation_expression (ArrayCreationExpression! expr) {
- if (expr.initializer_list != null) {
- expr.initializer_list.expected_type = expr.element_type.copy ();
- expr.initializer_list.expected_type.data_type = expr.initializer_list.expected_type.data_type.get_array (expr.rank);
- // FIXME: add element type to type_argument
- }
- }
-
/**
* Visit operations called for array creation expresions.
*
* @param expr an array creation expression
*/
- public override void visit_end_array_creation_expression (ArrayCreationExpression! expr) {
+ public override void visit_array_creation_expression (ArrayCreationExpression! expr) {
Collection<Expression> size = expr.get_sizes ();
- /* check for errors in the size list */
- if (size != null) {
- foreach (Expression e in size) {
- if (e.static_type == null) {
- /* return on previous error */
- return;
- } else if (!(e.static_type.data_type is Struct) || !((Struct) e.static_type.data_type).is_integer_type ()) {
- expr.error = true;
- Report.error (e.source_reference, "Expression of integer type expected");
- }
- }
+ if (expr.element_type != null) {
+ expr.element_type.accept (this);
+ }
+
+ foreach (Expression e in size) {
+ e.accept (this);
+ }
+
+ if (expr.initializer_list != null) {
+ expr.initializer_list.expected_type = expr.element_type.copy ();
+ expr.initializer_list.expected_type.data_type = expr.initializer_list.expected_type.data_type.get_array (expr.rank);
+ // FIXME: add element type to type_argument
+
+ expr.initializer_list.accept (this);
+ }
- if (expr.error) {
+ /* check for errors in the size list */
+ foreach (Expression e in size) {
+ if (e.static_type == null) {
+ /* return on previous error */
return;
+ } else if (!(e.static_type.data_type is Struct) || !((Struct) e.static_type.data_type).is_integer_type ()) {
+ expr.error = true;
+ Report.error (e.source_reference, "Expression of integer type expected");
}
}
+ if (expr.error) {
+ return;
+ }
+
/* check for wrong elements inside the initializer */
if (expr.initializer_list != null && expr.initializer_list.static_type == null) {
return;
diff --git a/vala/valasymbolresolver.vala b/vala/valasymbolresolver.vala
index e16c2d407..598ee0160 100644
--- a/vala/valasymbolresolver.vala
+++ b/vala/valasymbolresolver.vala
@@ -1,6 +1,6 @@
/* valasymbolresolver.vala
*
- * Copyright (C) 2006-2007 Jürg Billeter
+ * Copyright (C) 2006-2007 Jürg Billeter, Raffaele Sandrini
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -18,6 +18,7 @@
*
* Author:
* Jürg Billeter <j@bitron.ch>
+ * Raffaele Sandrini <raffaele@sandrini.ch>
*/
using GLib;
@@ -290,6 +291,10 @@ public class Vala.SymbolResolver : CodeVisitor {
decl.accept_children (this);
}
+ public override void visit_initializer_list (InitializerList! list) {
+ list.accept_children (this);
+ }
+
public override void visit_throw_statement (ThrowStatement! stmt) {
stmt.accept_children (this);
}
@@ -301,4 +306,8 @@ public class Vala.SymbolResolver : CodeVisitor {
public override void visit_catch_clause (CatchClause! clause) {
clause.accept_children (this);
}
+
+ public override void visit_array_creation_expression (ArrayCreationExpression! e) {
+ e.accept_children (this);
+ }
}