+2008-11-14 Jürg Billeter <j@bitron.ch>
+
+ * vala/valacfgbuilder.vala:
+ * vala/valamemberaccess.vala:
+ * vala/valamethod.vala:
+ * vala/valasymbol.vala:
+ * gobject/valaccodemethodmodule.vala:
+
+ Report unused fields, methods, and local variables
+
+ * vala/valacodecontext.vala:
+ * vala/valadynamicproperty.vala:
+ * vala/valaenum.vala:
+ * vala/valagenieparser.vala:
+ * vala/valainterfacewriter.vala:
+ * vala/valaparser.vala:
+ * vala/valastruct.vala:
+ * vala/valaunresolvedtype.vala:
+ * gobject/valaccodearraymodule.vala:
+ * gobject/valaccodeassignmentmodule.vala:
+ * gobject/valaccodebasemodule.vala:
+ * gobject/valaccodeinvocationexpressionmodule.vala:
+ * gobject/valaccodememberaccessmodule.vala:
+ * gobject/valadbusservermodule.vala:
+ * gobject/valagobjectmodule.vala:
+ * vapigen/valagirparser.vala:
+ * vapigen/valamarkupreader.vala:
+
+ Remove unused symbols
+
2008-11-14 Jürg Billeter <j@bitron.ch>
* tests/Makefile.am:
}
var length_cname = get_array_length_cname (field.name, dim);
- var instance_expression_type = get_data_type_for_symbol (base_type);
- var instance_target_type = get_data_type_for_symbol ((TypeSymbol) field.parent_symbol);
CCodeExpression typed_inst = (CCodeExpression) get_ccodenode (ma.inner);
CCodeExpression inst;
ccomma.append_expression (new CCodeAssignment (lhs_array_len, rhs_array_len));
}
} else if (instance_delegate) {
- var delegate_type = (DelegateType) assignment.left.value_type;
var lhs_delegate_target = get_delegate_target_cexpression (assignment.left);
var rhs_delegate_target = get_delegate_target_cexpression (assignment.right);
ccomma.append_expression (new CCodeAssignment (lhs_delegate_target, rhs_delegate_target));
var function = new CCodeFunction (destroy_func, "void");
function.modifiers = CCodeModifiers.STATIC;
- var cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
-
function.add_parameter (new CCodeFormalParameter ("self", list_type.get_cname ()));
// definition
Iterator<FormalParameter> params_it = params.iterator ();
foreach (Expression arg in expr.get_argument_list ()) {
CCodeExpression cexpr = (CCodeExpression) arg.ccodenode;
- Gee.List<CCodeExpression> extra_args = new ArrayList<CCodeExpression> ();
if (params_it.next ()) {
var param = params_it.get ();
ellipsis = param.ellipsis;
} else if (expr.symbol_reference is Field) {
var f = (Field) expr.symbol_reference;
if (f.binding == MemberBinding.INSTANCE) {
- var instance_expression_type = base_type;
var instance_target_type = get_data_type_for_symbol ((TypeSymbol) f.parent_symbol);
var cl = instance_target_type.data_type as Class;
var vfunc = new CCodeFunction (m.get_cname (), creturn_type.get_cname ());
vfunc.line = function.line;
- ReferenceType this_type = new ObjectType ((Class) m.parent_symbol);
-
cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
var carg_map = new HashMap<int,CCodeExpression> (direct_hash, direct_equal);
}
}
- bool return_value = true;
- bool args_parameter = true;
- if (is_possible_entry_point (m, ref return_value, ref args_parameter)) {
+ if (m.entry_point) {
// m is possible entry point, add appropriate startup code
var cmain = new CCodeFunction ("main", "int");
cmain.line = function.line;
main_block.add_statement (type_init_call);
var main_call = new CCodeFunctionCall (new CCodeIdentifier (function.name));
- if (args_parameter) {
+ if (m.get_parameters ().size == 1) {
main_call.add_argument (new CCodeIdentifier ("argv"));
main_call.add_argument (new CCodeIdentifier ("argc"));
}
- if (return_value) {
- var main_stmt = new CCodeReturnStatement (main_call);
- main_stmt.line = cmain.line;
- main_block.add_statement (main_stmt);
- } else {
+ if (m.return_type is VoidType) {
// method returns void, always use 0 as exit code
var main_stmt = new CCodeExpressionStatement (main_call);
main_stmt.line = cmain.line;
var ret_stmt = new CCodeReturnStatement (new CCodeConstant ("0"));
ret_stmt.line = cmain.line;
main_block.add_statement (ret_stmt);
+ } else {
+ var main_stmt = new CCodeReturnStatement (main_call);
+ main_stmt.line = cmain.line;
+ main_block.add_statement (main_stmt);
}
cmain.block = main_block;
source_type_member_definition.append (cmain);
return null;
}
- private bool is_possible_entry_point (Method m, ref bool return_value, ref bool args_parameter) {
- if (m.name == null || m.name != "main") {
- // method must be called "main"
- return false;
- }
-
- if (m.binding == MemberBinding.INSTANCE) {
- // method must be static
- return false;
- }
-
- if (m.return_type.data_type == null) {
- return_value = false;
- } else if (m.return_type.data_type == int_type.data_type) {
- return_value = true;
- } else {
- // return type must be void or int
- return false;
- }
-
- var params = m.get_parameters ();
- if (params.size == 0) {
- // method may have no parameters
- args_parameter = false;
- return true;
- }
-
- if (params.size > 1) {
- // method must not have more than one parameter
- return false;
- }
-
- Iterator<FormalParameter> params_it = params.iterator ();
- params_it.next ();
- var param = params_it.get ();
-
- if (param.direction == ParameterDirection.OUT) {
- // parameter must not be an out parameter
- return false;
- }
-
- if (!(param.parameter_type is ArrayType)) {
- // parameter must be an array
- return false;
- }
-
- var array_type = (ArrayType) param.parameter_type;
- if (array_type.element_type.data_type != string_type.data_type) {
- // parameter must be an array of strings
- return false;
- }
-
- args_parameter = true;
- return true;
- }
-
private void add_object_creation (CCodeBlock b, bool has_params) {
var cl = (Class) current_type_symbol;
} else if (param.parameter_type.get_type_signature ().has_prefix ("a{")) {
// hash table output parameter
var type_args = param.parameter_type.get_type_arguments ();
- var key_type = type_args.get (0);
var value_type = type_args.get (1);
if (value_type.get_type_signature ().has_prefix ("(")) {
// values are structs
} else if (m.return_type.get_type_signature ().has_prefix ("a{")) {
// hash table output parameter
var type_args = m.return_type.get_type_arguments ();
- var key_type = type_args.get (0);
var value_type = type_args.get (1);
if (value_type.get_type_signature ().has_prefix ("(")) {
// values are structs
} else if (param.parameter_type.get_type_signature ().has_prefix ("a{")) {
// hash table output parameter
var type_args = param.parameter_type.get_type_arguments ();
- var key_type = type_args.get (0);
var value_type = type_args.get (1);
if (value_type.get_type_signature ().has_prefix ("(")) {
// values are structs
} else if (m.return_type.get_type_signature ().has_prefix ("a{")) {
// hash table return value
var type_args = m.return_type.get_type_arguments ();
- var key_type = type_args.get (0);
var value_type = type_args.get (1);
if (value_type.get_type_signature ().has_prefix ("(")) {
// values are structs
} else if (param.parameter_type.get_type_signature ().has_prefix ("a{")) {
// hash table output parameter
var type_args = param.parameter_type.get_type_arguments ();
- var key_type = type_args.get (0);
var value_type = type_args.get (1);
if (value_type.get_type_signature ().has_prefix ("(")) {
// values are structs
} else if (m.return_type.get_type_signature ().has_prefix ("a{")) {
// hash table output parameter
var type_args = m.return_type.get_type_arguments ();
- var key_type = type_args.get (0);
var value_type = type_args.get (1);
if (value_type.get_type_signature ().has_prefix ("(")) {
// values are structs
} else if (param.parameter_type.get_type_signature ().has_prefix ("a{")) {
// hash table output parameter
var type_args = param.parameter_type.get_type_arguments ();
- var key_type = type_args.get (0);
var value_type = type_args.get (1);
if (value_type.get_type_signature ().has_prefix ("(")) {
// values are structs
} else if (m.return_type.get_type_signature ().has_prefix ("a{")) {
// hash table output parameter
var type_args = m.return_type.get_type_arguments ();
- var key_type = type_args.get (0);
var value_type = type_args.get (1);
if (value_type.get_type_signature ().has_prefix ("(")) {
// values are structs
source_type_member_definition.append (function);
}
+ current_symbol = old_symbol;
current_type_symbol = old_type_symbol;
current_class = old_class;
instance_struct = old_instance_struct;
+ param_spec_struct = old_param_spec_struct;
type_struct = old_type_struct;
instance_priv_struct = old_instance_priv_struct;
prop_enum = old_prop_enum;
ed.accept_children (this);
}
+ public override void visit_field (Field f) {
+ if (f.access != SymbolAccessibility.PUBLIC
+ && f.access != SymbolAccessibility.PROTECTED
+ && !f.used) {
+ Report.warning (f.source_reference, "field `%s' never used".printf (f.get_full_name ()));
+ }
+ }
+
public override void visit_method (Method m) {
+ if (m.access != SymbolAccessibility.PUBLIC
+ && m.access != SymbolAccessibility.PROTECTED
+ && !m.used && !m.entry_point) {
+ Report.warning (m.source_reference, "method `%s' never used".printf (m.get_full_name ()));
+ }
+
if (m.body == null) {
return;
}
return;
}
+ if (!stmt.declaration.used) {
+ Report.warning (stmt.declaration.source_reference, "local variable `%s' declared but never used".printf (stmt.declaration.name));
+ }
+
current_block.add_node (stmt);
var local = stmt.declaration as LocalVariable;
continue;
}
- if (cycle_file.cycle != null) {
+ if (ref_cycle_file_cycle != null) {
/* file already in a cycle */
if (cycle_file.cycle == cycle) {
public class Vala.DynamicProperty : Property {
public DataType dynamic_type { get; set; }
- private string cname;
-
public DynamicProperty (DataType dynamic_type, string name, SourceReference? source_reference = null) {
base (name, null, null, null, source_reference);
this.dynamic_type = dynamic_type;
public override bool is_reference_type () {
return false;
}
-
- private void set_cname (string cname) {
- this.cname = cname;
- }
-
+
/**
* Returns the string to be prepended to the name of members of this
* enum when used in C code.
return new SourceReference (scanner.source_file, tokens[index].begin.line, tokens[index].begin.column, tokens[index].end.line, tokens[index].end.column);
}
- SourceReference get_last_src () {
- int last_index = (index + BUFFER_SIZE - 1) % BUFFER_SIZE;
-
- return new SourceReference (scanner.source_file, tokens[last_index].begin.line, tokens[last_index].begin.column, tokens[last_index].end.line, tokens[last_index].end.column);
- }
-
void rollback (SourceLocation location) {
while (tokens[index].begin.pos != location.pos) {
prev ();
Block parse_block () throws ParseError {
var begin = get_location ();
- Gee.List<Statement> list = new ArrayList<Statement> ();
expect (TokenType.INDENT);
var block = new Block (get_src_com (begin));
parse_statements (block);
}
void parse_local_variable_declarations (Block block) throws ParseError {
- var begin = get_location ();
-
if (accept (TokenType.VAR)) {
/* support block vars */
if (accept (TokenType.EOL) && accept (TokenType.INDENT)) {
}
void parse_using_directives () throws ParseError {
- var begin = get_location ();
while (accept (TokenType.USES)) {
- var begin = get_location ();
-
if (accept_block ()) {
expect (TokenType.INDENT);
while (current () != TokenType.DEDENT) {
var accessor_begin = get_location ();
parse_attributes ();
- var accessor_access = SymbolAccessibility.PUBLIC;
if (accept (TokenType.GET)) {
if (prop.get_accessor != null) {
throw new ParseError.SYNTAX (get_error ("property get accessor already defined"));
expect (TokenType.CONSTRUCT);
- var flags = parse_member_declaration_modifiers ();
+ parse_member_declaration_modifiers ();
if (accept (TokenType.OPEN_PARENS)) {
} while (accept (TokenType.DOT));
return expr;
}
-
- bool is_declaration_keyword (TokenType type) {
- switch (type) {
- case TokenType.CLASS:
- case TokenType.CONST:
- case TokenType.DEF:
- case TokenType.DELEGATE:
- case TokenType.ENUM:
- case TokenType.ERRORDOMAIN:
- case TokenType.EVENT:
- case TokenType.FINAL:
- case TokenType.INIT:
- case TokenType.INTERFACE:
- case TokenType.NAMESPACE:
- case TokenType.OVERRIDE:
- case TokenType.PROP:
- case TokenType.STRUCT:
- return true;
- default:
- return false;
- }
- }
}
/* at begin of line */
bool bol = true;
- string current_cheader_filename;
-
Scope current_scope;
/**
instance = true;
}
+ member.used = true;
+
if (access == SymbolAccessibility.PRIVATE) {
var target_type = member.parent_symbol;
return _base_interface_method;
}
}
-
+
+ public bool entry_point { get; private set; }
+
/**
* Specifies the generated `this' parameter for instance methods.
*/
}
}
+ if (is_possible_entry_point (analyzer)) {
+ entry_point = true;
+ }
+
return !error;
}
+
+ bool is_possible_entry_point (SemanticAnalyzer analyzer) {
+ if (name == null || name != "main") {
+ // method must be called "main"
+ return false;
+ }
+
+ if (binding == MemberBinding.INSTANCE) {
+ // method must be static
+ return false;
+ }
+
+ if (return_type is VoidType) {
+ } else if (return_type.data_type == analyzer.int_type.data_type) {
+ } else {
+ // return type must be void or int
+ return false;
+ }
+
+ var params = get_parameters ();
+ if (params.size == 0) {
+ // method may have no parameters
+ return true;
+ }
+
+ if (params.size > 1) {
+ // method must not have more than one parameter
+ return false;
+ }
+
+ Iterator<FormalParameter> params_it = params.iterator ();
+ params_it.next ();
+ var param = params_it.get ();
+
+ if (param.direction == ParameterDirection.OUT) {
+ // parameter must not be an out parameter
+ return false;
+ }
+
+ if (!(param.parameter_type is ArrayType)) {
+ // parameter must be an array
+ return false;
+ }
+
+ var array_type = (ArrayType) param.parameter_type;
+ if (array_type.element_type.data_type != analyzer.string_type.data_type) {
+ // parameter must be an array of strings
+ return false;
+ }
+
+ return true;
+ }
}
Block parse_block () throws ParseError {
var begin = get_location ();
- Gee.List<Statement> list = new ArrayList<Statement> ();
expect (TokenType.OPEN_BRACE);
var block = new Block (get_src_com (begin));
parse_statements (block);
}
void parse_local_variable_declarations (Block block) throws ParseError {
- var begin = get_location ();
DataType variable_type;
if (accept (TokenType.VAR)) {
variable_type = null;
void parse_using_directives () throws ParseError {
while (accept (TokenType.USING)) {
- var begin = get_location ();
-
do {
var begin = get_location ();
var sym = parse_symbol_name ();
private string cname;
private string const_cname;
- private string dup_function;
- private string free_function;
private string type_id;
private string lower_case_cprefix;
private string lower_case_csuffix;
return "%s%s".printf (parent_symbol.get_cprefix (), name);
}
- private void set_cname (string cname) {
- this.cname = cname;
- }
-
private void set_const_cname (string cname) {
this.const_cname = cname;
}
*/
public bool active { get; set; default = true; }
+ /**
+ * Specifies whether this symbol has been accessed.
+ */
+ public bool used { get; set; }
+
/**
* Specifies the accessibility of this symbol. Public accessibility
* doesn't limit access. Default accessibility limits access to this
* @return newly created type reference
*/
public static UnresolvedType? new_from_expression (Expression expr) {
- string ns = null;
- string type_name = null;
if (expr is MemberAccess) {
UnresolvedType type_ref = null;
string name = reader.get_attribute ("name");
next ();
- var return_type = parse_return_value ();
+ parse_return_value ();
var m = new CreationMethod (null, name, get_current_src ());
m.access = SymbolAccessibility.PUBLIC;
return read_token (out token_begin, out token_end);
}
type = MarkupTokenType.TEXT;
- string text = ((string) text_begin).ndup (current - text_begin);
+ // string text = ((string) text_begin).ndup (current - text_begin);
}
column += (int) (current - begin);