| package org.eclipse.jdt.internal.compiler.flow; |
| |
| /* |
| * (c) Copyright IBM Corp. 2000, 2001. |
| * All Rights Reserved. |
| */ |
| import org.eclipse.jdt.internal.compiler.ast.*; |
| import org.eclipse.jdt.internal.compiler.lookup.*; |
| |
| /** |
| * Reflects the context of code analysis, keeping track of enclosing |
| * try statements, exception handlers, etc... |
| */ |
| public class FinallyFlowContext extends FlowContext { |
| Reference finalAssignments[]; |
| int assignCount; |
| public FinallyFlowContext(FlowContext parent, AstNode associatedNode) { |
| super(parent, associatedNode); |
| } |
| /** |
| * Given some contextual initialization info (derived from a try block or a catch block), this |
| * code will check that the subroutine context does not also initialize a final variable potentially set |
| * redundantly. |
| */ |
| |
| public void complainOnRedundantFinalAssignments(FlowInfo flowInfo, BlockScope scope) { |
| for (int i = 0; i < assignCount; i++) { |
| Reference ref; |
| if (((ref = finalAssignments[i]).bits & BindingIds.FIELD) != 0) { |
| // final field |
| if (flowInfo.isPotentiallyAssigned(ref.fieldBinding())) { |
| scope.problemReporter().duplicateInitializationOfBlankFinalField(ref.fieldBinding(), ref); |
| } |
| } else { |
| // final local variable |
| if (flowInfo.isPotentiallyAssigned((LocalVariableBinding)((NameReference)ref).binding)) { |
| scope.problemReporter().duplicateInitializationOfFinalLocal((LocalVariableBinding)((NameReference)ref).binding,(NameReference)ref); |
| } |
| } |
| // any reference reported at this level is removed from the parent context |
| // where it could also be reported again |
| FlowContext currentContext = parent; |
| while (currentContext != null) { |
| if (currentContext.isSubRoutine()) { |
| currentContext.removeFinalAssignmentIfAny(ref); |
| } |
| currentContext = currentContext.parent; |
| } |
| } |
| } |
| public boolean isSubRoutine() { |
| return true; |
| } |
| boolean recordFinalAssignment(VariableBinding binding, Reference finalAssignment) { |
| if (assignCount == 0) { |
| finalAssignments = new Reference[5]; |
| } else { |
| if (assignCount == finalAssignments.length) |
| System.arraycopy(finalAssignments, 0, (finalAssignments = new Reference[assignCount * 2]), 0, assignCount); |
| }; |
| finalAssignments[assignCount++] = finalAssignment; |
| return true; |
| } |
| } |