Thanks to visit codestin.com
Credit goes to github.com

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)