X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ast/MethodDeclaration.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ast/MethodDeclaration.java index 93b8758..424ca3b 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ast/MethodDeclaration.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ast/MethodDeclaration.java @@ -23,7 +23,7 @@ import test.PHPParserSuperclass; public class MethodDeclaration extends Statement implements OutlineableWithChildren { /** The name of the method. */ - public char[] name; + public String name; public Hashtable arguments; @@ -44,16 +44,20 @@ public class MethodDeclaration extends Statement implements OutlineableWithChild private Position position; public MethodDeclaration(final Object parent, - final char[] name, + final String name, final Hashtable arguments, final boolean reference, final int sourceStart, - final int sourceEnd) { + final int sourceEnd, + final int bodyStart, + final int bodyEnd) { super(sourceStart, sourceEnd); this.name = name; this.arguments = arguments; this.parent = parent; this.reference = reference; + this.bodyStart = bodyStart; + this.bodyEnd = bodyEnd; position = new Position(sourceStart, sourceEnd); } @@ -152,17 +156,11 @@ public class MethodDeclaration extends Statement implements OutlineableWithChild } /** - * Get the variables from outside (parameters, globals ...) + * Get global variables (not parameters) * @return the variables from outside */ public List getOutsideVariable() { final ArrayList list = new ArrayList(); - if (arguments != null) { - final Enumeration vars = arguments.keys(); - while (vars.hasMoreElements()) { - list.add(new VariableUsage((String) vars.nextElement(), sourceStart)); - } - } if (statements != null) { for (int i = 0; i < statements.length; i++) { @@ -172,6 +170,16 @@ public class MethodDeclaration extends Statement implements OutlineableWithChild return list; } + private List getParameters(final List list) { + if (arguments != null) { + final Enumeration vars = arguments.keys(); + while (vars.hasMoreElements()) { + list.add(new VariableUsage((String) vars.nextElement(), sourceStart)); + } + } + return list; + } + /** * get the modified variables. * @return the variables from we change value @@ -226,26 +234,72 @@ public class MethodDeclaration extends Statement implements OutlineableWithChild * This method will analyze the code. */ public void analyzeCode() { - final List outsideVars = getOutsideVariable(); + final List globalsVars = getOutsideVariable(); final List modifiedVars = getModifiedVariable(); + final List parameters = getParameters(new ArrayList()); - final List declaredVars = new ArrayList(outsideVars.size() + modifiedVars.size()); - declaredVars.addAll(outsideVars); + final List declaredVars = new ArrayList(globalsVars.size() + modifiedVars.size()); + declaredVars.addAll(globalsVars); declaredVars.addAll(modifiedVars); + declaredVars.addAll(parameters); final List usedVars = getUsedVariable(); - -/* dumpList(outsideVars, "outside"); + final List readOrWriteVars = new ArrayList(modifiedVars.size()+usedVars.size()); + readOrWriteVars.addAll(modifiedVars); + readOrWriteVars.addAll(usedVars); +/* dumpList(globalsVars, "outside"); dumpList(modifiedVars, "modified"); dumpList(usedVars, "used"); */ //look for used variables that were not declared before + findUnusedParameters(readOrWriteVars,parameters); + findUnknownUsedVars(usedVars, declaredVars); + } + + /** + * This method will add a warning on all unused parameters. + * @param vars the used variable list + * @param parameters the declared variable list + */ + private void findUnusedParameters(final List vars, final List parameters) { + for (int i = 0; i < parameters.size(); i++) { + VariableUsage param = ((VariableUsage)parameters.get(i)); + if (!isVariableInList(param.getName(),vars)) { + try { + PHPParserSuperclass.setMarker("warning, the parameter "+param.getName() +" seems to be never used in your method", + param.getStartOffset(), + param.getStartOffset() + param.getName().length(), + PHPParserSuperclass.WARNING, + ""); + } catch (CoreException e) { + PHPeclipsePlugin.log(e); + } + } + } + } + + private boolean isVariableInList(final String name, final List list) { + for (int i = 0; i < list.size(); i++) { + if (((VariableUsage) list.get(i)).getName().equals(name)) { + return true; + } + } + return false; + } + + /** + * This method will add a warning on all used variables in a method that aren't declared before. + * @param usedVars the used variable list + * @param declaredVars the declared variable list + */ + private void findUnknownUsedVars(final List usedVars, final List declaredVars) { for (int i = 0; i < usedVars.size(); i++) { VariableUsage variableUsage = (VariableUsage) usedVars.get(i); + if (variableUsage.getName().equals("this")) continue; // this is a special variable if (!isVariableDeclaredBefore(declaredVars, variableUsage)) { try { - PHPParserSuperclass.setMarker("warning, usage of an unknown : " + variableUsage.getName(), + PHPParserSuperclass.setMarker("warning, usage of a variable that seems to be unassigned yet : " + variableUsage.getName(), variableUsage.getStartOffset(), variableUsage.getStartOffset() + variableUsage.getName().length(), PHPParserSuperclass.WARNING, @@ -254,7 +308,6 @@ public class MethodDeclaration extends Statement implements OutlineableWithChild PHPeclipsePlugin.log(e); } } - } } }