blob: a082af7052c68f4732993bbd57607e16760102ca [file] [log] [blame]
package org.eclipse.jdt.internal.compiler.flow;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import org.eclipse.jdt.internal.compiler.*;
import org.eclipse.jdt.internal.compiler.ast.*;
import org.eclipse.jdt.internal.compiler.lookup.*;
import org.eclipse.jdt.internal.compiler.problem.*;
/**
* 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;
}
}