X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/flow/LoopingFlowContext.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/flow/LoopingFlowContext.java index 5034c03..487809b 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/flow/LoopingFlowContext.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/flow/LoopingFlowContext.java @@ -1,17 +1,16 @@ /******************************************************************************* - * Copyright (c) 2000, 2001, 2002 International Business Machines Corp. and others. + * Copyright (c) 2000, 2003 IBM Corporation and others. * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v0.5 + * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v05.html + * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation - ******************************************************************************/ + *******************************************************************************/ package net.sourceforge.phpdt.internal.compiler.flow; -import net.sourceforge.phpdt.internal.compiler.ast.AstNode; -import net.sourceforge.phpdt.internal.compiler.ast.NameReference; +import net.sourceforge.phpdt.internal.compiler.ast.ASTNode; import net.sourceforge.phpdt.internal.compiler.ast.Reference; import net.sourceforge.phpdt.internal.compiler.codegen.Label; import net.sourceforge.phpdt.internal.compiler.lookup.BlockScope; @@ -21,91 +20,105 @@ import net.sourceforge.phpdt.internal.compiler.lookup.Scope; import net.sourceforge.phpdt.internal.compiler.lookup.VariableBinding; /** - * Reflects the context of code analysis, keeping track of enclosing - * try statements, exception handlers, etc... + * Reflects the context of code analysis, keeping track of enclosing try + * statements, exception handlers, etc... */ public class LoopingFlowContext extends SwitchFlowContext { + public Label continueLabel; - public UnconditionalFlowInfo initsOnContinue = FlowInfo.DeadEnd; + + public UnconditionalFlowInfo initsOnContinue = FlowInfo.DEAD_END; + Reference finalAssignments[]; + VariableBinding finalVariables[]; + int assignCount = 0; + Scope associatedScope; - public LoopingFlowContext( - FlowContext parent, - AstNode associatedNode, - Label breakLabel, - Label continueLabel, - Scope associatedScope) { + + public LoopingFlowContext(FlowContext parent, ASTNode associatedNode, + Label breakLabel, Label continueLabel, Scope associatedScope) { super(parent, associatedNode, breakLabel); this.continueLabel = continueLabel; this.associatedScope = associatedScope; } - - public void complainOnFinalAssignmentsInLoop( - BlockScope scope, - FlowInfo flowInfo) { + + public void complainOnFinalAssignmentsInLoop(BlockScope scope, + FlowInfo flowInfo) { for (int i = 0; i < assignCount; i++) { - VariableBinding variable; - if ((variable = finalVariables[i]) != null) { - boolean complained; // remember if have complained on this final assignment - if (variable instanceof FieldBinding) { - if (complained = flowInfo.isPotentiallyAssigned((FieldBinding) variable)) { - scope.problemReporter().duplicateInitializationOfBlankFinalField( - (FieldBinding) variable, - (NameReference) finalAssignments[i]); - } - } else { - if (complained = - flowInfo.isPotentiallyAssigned((LocalVariableBinding) variable)) { - scope.problemReporter().duplicateInitializationOfFinalLocal( - (LocalVariableBinding) variable, - (NameReference) finalAssignments[i]); - } + VariableBinding variable = finalVariables[i]; + if (variable == null) + continue; + boolean complained = false; // remember if have complained on this + // final assignment + if (variable instanceof FieldBinding) { + if (flowInfo.isPotentiallyAssigned((FieldBinding) variable)) { + complained = true; + scope.problemReporter() + .duplicateInitializationOfBlankFinalField( + (FieldBinding) variable, + finalAssignments[i]); + } + } else { + if (flowInfo + .isPotentiallyAssigned((LocalVariableBinding) variable)) { + complained = true; + scope.problemReporter() + .duplicateInitializationOfFinalLocal( + (LocalVariableBinding) variable, + finalAssignments[i]); } - // any reference reported at this level is removed from the parent context where it - // could also be reported again - if (complained) { - FlowContext context = parent; - while (context != null) { - context.removeFinalAssignmentIfAny(finalAssignments[i]); - context = context.parent; - } + } + // any reference reported at this level is removed from the parent + // context where it + // could also be reported again + if (complained) { + FlowContext context = parent; + while (context != null) { + context.removeFinalAssignmentIfAny(finalAssignments[i]); + context = context.parent; } } } } - public Label continueLabel() { - return continueLabel; - } +// public Label continueLabel() { +// return continueLabel; +// } public String individualToString() { - return "Looping flow context"; //$NON-NLS-1$ + StringBuffer buffer = new StringBuffer("Looping flow context"); //$NON-NLS-1$ + buffer + .append("[initsOnBreak -").append(initsOnBreak.toString()).append(']'); //$NON-NLS-1$ + buffer + .append("[initsOnContinue -").append(initsOnContinue.toString()).append(']'); //$NON-NLS-1$ + return buffer.toString(); } - public boolean isContinuable() { - return true; - } +// public boolean isContinuable() { +// return true; +// } - public boolean isContinuedTo() { - return initsOnContinue != FlowInfo.DeadEnd; - } +// public boolean isContinuedTo() { +// return initsOnContinue != FlowInfo.DEAD_END; +// } - public void recordContinueFrom(FlowInfo flowInfo) { - if (initsOnContinue == FlowInfo.DeadEnd) { - initsOnContinue = flowInfo.copy().unconditionalInits(); - } else { - // ignore if not really reachable (1FKEKRP) - if (flowInfo.isFakeReachable()) - return; - initsOnContinue.mergedWith(flowInfo.unconditionalInits()); - }; - } +// public void recordContinueFrom(FlowInfo flowInfo) { +// +// if (!flowInfo.isReachable()) +// return; +// if (initsOnContinue == FlowInfo.DEAD_END) { +// initsOnContinue = flowInfo.copy().unconditionalInits(); +// } else { +// initsOnContinue = initsOnContinue.mergedWith(flowInfo +// .unconditionalInits()); +// } +// ; +// } - boolean recordFinalAssignment( - VariableBinding binding, - Reference finalAssignment) { + boolean recordFinalAssignment(VariableBinding binding, + Reference finalAssignment) { // do not consider variables which are defined inside this loop if (binding instanceof LocalVariableBinding) { Scope scope = ((LocalVariableBinding) binding).declaringScope; @@ -119,19 +132,14 @@ public class LoopingFlowContext extends SwitchFlowContext { finalVariables = new VariableBinding[5]; } else { if (assignCount == finalAssignments.length) - System.arraycopy( - finalAssignments, - 0, - (finalAssignments = new Reference[assignCount * 2]), - 0, + System.arraycopy(finalAssignments, 0, + (finalAssignments = new Reference[assignCount * 2]), 0, + assignCount); + System.arraycopy(finalVariables, 0, + (finalVariables = new VariableBinding[assignCount * 2]), 0, assignCount); - System.arraycopy( - finalVariables, - 0, - (finalVariables = new VariableBinding[assignCount * 2]), - 0, - assignCount); - }; + } + ; finalAssignments[assignCount] = finalAssignment; finalVariables[assignCount++] = binding; return true; @@ -146,4 +154,4 @@ public class LoopingFlowContext extends SwitchFlowContext { } } } -} \ No newline at end of file +}