blob: bd4b1075d733610a0d65957d391429bb8cff95cc [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.*;
import org.eclipse.jdt.internal.compiler.util.*;
import java.util.*;
/**
* Reflects the context of code analysis, keeping track of enclosing
* try statements, exception handlers, etc...
*/
public class InitializationFlowContext extends ExceptionHandlingFlowContext {
public int exceptionCount;
public TypeBinding[] thrownExceptions = new TypeBinding[5];
public AstNode[] exceptionThrowers = new AstNode[5];
public UnconditionalFlowInfo initsOnReturn;
public InitializationFlowContext(
FlowContext parent,
AstNode associatedNode,
BlockScope scope) {
super(
parent,
associatedNode,
new ReferenceBinding[] { scope.getJavaLangThrowable()},
// tolerate any kind of exception, but record them
scope, FlowInfo.DeadEnd);
this.initsOnReturn = FlowInfo.DeadEnd;
}
public void checkInitializerExceptions(
BlockScope currentScope,
FlowContext initializerContext,
FlowInfo flowInfo) {
for (int i = 0; i < exceptionCount; i++) {
initializerContext.checkExceptionHandlers(
thrownExceptions[i],
exceptionThrowers[i],
flowInfo,
currentScope);
}
}
public void recordHandlingException(
ReferenceBinding exceptionType,
UnconditionalFlowInfo flowInfo,
TypeBinding raisedException,
AstNode invocationSite,
boolean wasMasked) {
int size = thrownExceptions.length;
if (exceptionCount == size) {
System.arraycopy(
thrownExceptions,
0,
(thrownExceptions = new TypeBinding[size * 2]),
0,
size);
System.arraycopy(
exceptionThrowers,
0,
(exceptionThrowers = new AstNode[size * 2]),
0,
size);
}
thrownExceptions[exceptionCount] = raisedException;
exceptionThrowers[exceptionCount++] = invocationSite;
}
public void recordReturnFrom(UnconditionalFlowInfo flowInfo) {
// record initializations which were performed at the return point
initsOnReturn = initsOnReturn.mergedWith(flowInfo);
}
}