Skip to content

Commit 3b44616

Browse files
author
zhourenjian
committed
Fixing bug that anonymous class with final variables may be compiled with unnecessary variables which result in script errors.
1 parent 8aaa55a commit 3b44616

File tree

2 files changed

+75
-1
lines changed

2 files changed

+75
-1
lines changed

src/net/sf/j2s/core/astvisitors/ASTFinalVariable.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,46 @@ public ASTFinalVariable(int blockLevel, String variableName, String methodScope)
4040
public String toString() {
4141
return variableName + ":" + variableName;
4242
}
43+
44+
public int hashCode() {
45+
final int prime = 31;
46+
int result = 1;
47+
result = prime * result + blockLevel;
48+
result = prime * result
49+
+ ((methodScope == null) ? 0 : methodScope.hashCode());
50+
result = prime * result
51+
+ ((toVariableName == null) ? 0 : toVariableName.hashCode());
52+
result = prime * result
53+
+ ((variableName == null) ? 0 : variableName.hashCode());
54+
return result;
55+
}
56+
57+
public boolean equals(Object obj) {
58+
if (this == obj)
59+
return true;
60+
if (obj == null)
61+
return false;
62+
if (getClass() != obj.getClass())
63+
return false;
64+
final ASTFinalVariable other = (ASTFinalVariable) obj;
65+
if (blockLevel != other.blockLevel)
66+
return false;
67+
if (methodScope == null) {
68+
if (other.methodScope != null)
69+
return false;
70+
} else if (!methodScope.equals(other.methodScope))
71+
return false;
72+
if (toVariableName == null) {
73+
if (other.toVariableName != null)
74+
return false;
75+
} else if (!toVariableName.equals(other.toVariableName))
76+
return false;
77+
if (variableName == null) {
78+
if (other.variableName != null)
79+
return false;
80+
} else if (!variableName.equals(other.variableName))
81+
return false;
82+
return true;
83+
}
84+
4385
}

src/net/sf/j2s/core/astvisitors/ASTKeywordVisitor.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.eclipse.jdt.core.dom.FieldDeclaration;
3838
import org.eclipse.jdt.core.dom.ForStatement;
3939
import org.eclipse.jdt.core.dom.IBinding;
40+
import org.eclipse.jdt.core.dom.IMethodBinding;
4041
import org.eclipse.jdt.core.dom.IPackageBinding;
4142
import org.eclipse.jdt.core.dom.ITypeBinding;
4243
import org.eclipse.jdt.core.dom.IVariableBinding;
@@ -45,6 +46,7 @@
4546
import org.eclipse.jdt.core.dom.InfixExpression;
4647
import org.eclipse.jdt.core.dom.InstanceofExpression;
4748
import org.eclipse.jdt.core.dom.LabeledStatement;
49+
import org.eclipse.jdt.core.dom.MethodDeclaration;
4850
import org.eclipse.jdt.core.dom.MethodInvocation;
4951
import org.eclipse.jdt.core.dom.Modifier;
5052
import org.eclipse.jdt.core.dom.Name;
@@ -57,6 +59,7 @@
5759
import org.eclipse.jdt.core.dom.QualifiedName;
5860
import org.eclipse.jdt.core.dom.ReturnStatement;
5961
import org.eclipse.jdt.core.dom.SimpleName;
62+
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
6063
import org.eclipse.jdt.core.dom.StringLiteral;
6164
import org.eclipse.jdt.core.dom.SuperFieldAccess;
6265
import org.eclipse.jdt.core.dom.SuperMethodInvocation;
@@ -442,7 +445,36 @@ public void endVisit(Block node) {
442445
blockLevel--;
443446
super.endVisit(node);
444447
}
445-
448+
449+
public void endVisit(MethodDeclaration node) {
450+
List finalVars = ((ASTVariableVisitor) getAdaptable(ASTVariableVisitor.class)).finalVars;
451+
List visitedVars = ((ASTVariableVisitor) getAdaptable(ASTVariableVisitor.class)).visitedVars;
452+
List normalVars = ((ASTVariableVisitor) getAdaptable(ASTVariableVisitor.class)).normalVars;
453+
List parameters = node.parameters();
454+
String methodSig = null;
455+
IMethodBinding resolveBinding = node.resolveBinding();
456+
if (resolveBinding != null) {
457+
methodSig = resolveBinding.getKey();
458+
}
459+
for (int i = parameters.size() - 1; i >= 0; i--) {
460+
SingleVariableDeclaration varDecl = (SingleVariableDeclaration) parameters.get(i);
461+
462+
SimpleName name = varDecl.getName();
463+
IBinding binding = name.resolveBinding();
464+
if (binding != null) {
465+
String identifier = name.getIdentifier();
466+
ASTFinalVariable f = new ASTFinalVariable(blockLevel + 1, identifier, methodSig);
467+
f.toVariableName = getIndexedVarName(identifier, normalVars.size());
468+
normalVars.remove(f);
469+
if ((binding.getModifiers() & Modifier.FINAL) != 0) {
470+
finalVars.remove(f);
471+
}
472+
visitedVars.remove(f);
473+
}
474+
}
475+
super.endVisit(node);
476+
}
477+
446478
public boolean visit(BooleanLiteral node) {
447479
buffer.append(node.booleanValue());
448480
return false;

0 commit comments

Comments
 (0)