122122import org .eclipse .jdt .core .dom .WhileStatement ;
123123import org .eclipse .jdt .core .dom .WildcardType ;
124124
125+ // BH 7/3/2018 -- adds effectively final -- FINAL keyword no longer necessary
125126// BH 6/27/2018 -- fix for a[Integer] not becoming a[Integer.valueOf]
126127// BH 6/26/2018 -- method logging via j2s.log.methods.called and j2s.log.methods.declared
127128// BH 6/24/2018 -- synchronized(a = new Object()) {...} ---> ...; only if an assignment or not a simple function call to Object.getTreeLock()
@@ -745,12 +746,23 @@ private void acceptVariableFinal(SimpleName name, int offset) {
745746 int level = blockLevel + offset ;
746747 VariableAdapter .FinalVariable f = new VariableAdapter .FinalVariable (level , identifier ,
747748 methodDeclareNameStack .size () == 0 ? null : methodDeclareNameStack .peek ());
748- addVariable (f , identifier , binding );
749+ List <VariableAdapter .FinalVariable > finalVars = getVariableList ('f' );
750+ List <VariableAdapter .FinalVariable > normalVars = getVariableList ('n' );
751+ f .toVariableName = identifier ;
752+ normalVars .add (f );
753+ if (isFinalOrEffectivelyFinal (binding )) {
754+ finalVars .add (f );
755+ }
749756 //buffer.append("/*blockLevel " + blockLevel + " level " + level + "*/");
750757 }
751758 name .accept (this );
752759 }
753760
761+ private static boolean isFinalOrEffectivelyFinal (IBinding binding ) {
762+ return Modifier .isFinal (binding .getModifiers ())
763+ || binding instanceof IVariableBinding && ((IVariableBinding )binding ).isEffectivelyFinal ();
764+ }
765+
754766 private void removeVariableFinals (MethodDeclaration node ) {
755767 IMethodBinding mBinding = node .resolveBinding ();
756768 if (mBinding != null )
@@ -771,7 +783,7 @@ private void removeVariableFinals(MethodDeclaration node) {
771783 f .toVariableName = identifier ;
772784 normalVars .remove (f );
773785 //buffer.append("/*remNorm " + f.variableName + "/to/" + f.toVariableName + "*/");
774- if (Modifier . isFinal (binding . getModifiers () )) {
786+ if (isFinalOrEffectivelyFinal (binding )) {
775787 finalVars .remove (f );
776788 //buffer.append("/*remFinal " + f.variableName + "/to/" + f.toVariableName + "*/");
777789 }
@@ -1670,7 +1682,7 @@ private boolean addFieldDeclaration(FieldDeclaration field, int mode) {
16701682 : ((PrimitiveType ) nodeType ).getPrimitiveTypeCode ());
16711683 ITypeBinding classBinding = resolveAbstractOrAnonymousBinding (field );
16721684 // have to check here for final Object = "foo", as that must not be ignored.
1673- boolean checkFinalConstant = (isStatic && Modifier .isFinal (field .getModifiers ())
1685+ boolean checkFinalConstant = (isStatic && Modifier .isFinal (field .getModifiers ())
16741686 && var != null && !var .getType ().getQualifiedName ().equals ("java.lang.Object" ));
16751687 if (needDefault )
16761688 preVisit2 (field );
@@ -2903,7 +2915,7 @@ private String simpleNameInVarBinding(SimpleName node, char ch, IVariableBinding
29032915 }
29042916 }
29052917 String fieldVar = null ;
2906- if (isAnonymousClass () && Modifier . isFinal (varBinding . getModifiers () )
2918+ if (isAnonymousClass () && isFinalOrEffectivelyFinal (varBinding )
29072919 && varBinding .getDeclaringMethod () != null ) {
29082920 String key = varBinding .getDeclaringMethod ().getKey ();
29092921 if (methodDeclareNameStack .size () == 0 || !key .equals (methodDeclareNameStack .peek ())) {
@@ -3036,6 +3048,9 @@ public boolean visit(VariableDeclarationExpression node) {
30363048 }
30373049
30383050 public boolean visit (VariableDeclarationFragment node ) {
3051+
3052+
3053+
30393054 SimpleName name = node .getName ();
30403055 IBinding binding = name .resolveBinding ();
30413056 if (binding == null )
@@ -3690,18 +3705,6 @@ private void addQualifiedNameFromBinding(IVariableBinding varBinding, boolean is
36903705 isStatic (varBinding ), true );
36913706 }
36923707
3693- private void addVariable (VariableAdapter .FinalVariable f , String identifier , IBinding binding ) {
3694- List <VariableAdapter .FinalVariable > finalVars = getVariableList ('f' );
3695- List <VariableAdapter .FinalVariable > normalVars = getVariableList ('n' );
3696- f .toVariableName = identifier ;
3697- normalVars .add (f );
3698- //buffer.append("/*addVar n " + identifier + " */");
3699- if (Modifier .isFinal (binding .getModifiers ())) {
3700- finalVars .add (f );
3701- //buffer.append("/*addVar f " + identifier + " */");
3702- }
3703- }
3704-
37053708 /**
37063709 * Determine the qualifier for a method or variable.
37073710 *
0 commit comments