X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ast/Block.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ast/Block.java index 2e00658..477ee09 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ast/Block.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ast/Block.java @@ -1,44 +1,48 @@ /******************************************************************************* - * 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.ast; -import net.sourceforge.phpdt.internal.compiler.IAbstractSyntaxTreeVisitor; -import net.sourceforge.phpdt.internal.compiler.codegen.*; -import net.sourceforge.phpdt.internal.compiler.flow.*; -import net.sourceforge.phpdt.internal.compiler.lookup.*; +import net.sourceforge.phpdt.internal.compiler.ASTVisitor; +import net.sourceforge.phpdt.internal.compiler.codegen.Label; +import net.sourceforge.phpdt.internal.compiler.flow.FlowContext; +import net.sourceforge.phpdt.internal.compiler.flow.FlowInfo; +import net.sourceforge.phpdt.internal.compiler.lookup.BlockScope; public class Block extends Statement { - - public Statement[] statements; + public Statement[] statements; // The array of statements found with this block + public int explicitDeclarations; - // the number of explicit declaration , used to create scope - public BlockScope scope; + + public BlockScope scope; // The number of explicit declaration , used to create scope + public static final Block None = new Block(0); - + public Block(int explicitDeclarations) { this.explicitDeclarations = explicitDeclarations; } - - public FlowInfo analyseCode( - BlockScope currentScope, - FlowContext flowContext, - FlowInfo flowInfo) { + + public FlowInfo analyseCode(BlockScope currentScope, + FlowContext flowContext, FlowInfo flowInfo) { // empty block if (statements == null) return flowInfo; + boolean didAlreadyComplain = false; for (int i = 0, max = statements.length; i < max; i++) { Statement stat; - if (!flowInfo.complainIfUnreachable((stat = statements[i]), scope)) { + if (!flowInfo.complainIfUnreachable(stat = statements[i], scope, + didAlreadyComplain)) { flowInfo = stat.analyseCode(scope, flowContext, flowInfo); + } else { + didAlreadyComplain = true; } } return flowInfo; @@ -46,7 +50,7 @@ public class Block extends Statement { public static final Block EmptyWith(int sourceStart, int sourceEnd) { - //return an empty block which position is s and e + // return an empty block which position is s and e Block bk = new Block(0); bk.sourceStart = sourceStart; bk.sourceEnd = sourceEnd; @@ -56,35 +60,52 @@ public class Block extends Statement { /** * Code generation for a block */ - public void generateCode(BlockScope currentScope, CodeStream codeStream) { + // public void generateCode(BlockScope currentScope, CodeStream codeStream) + // { + // + // if ((bits & IsReachableMASK) == 0) { + // return; + // } + // int pc = codeStream.position; + // if (statements != null) { + // for (int i = 0, max = statements.length; i < max; i++) { + // statements[i].generateCode(scope, codeStream); + // } + // } // for local variable debug attributes + // if (scope != currentScope) { // was really associated with its own scope + // codeStream.exitUserScope(scope); + // } + // codeStream.recordPositionsFrom(pc, this.sourceStart); + // } + public boolean isEmptyBlock() { - if ((bits & IsReachableMASK) == 0) { - return; - } - int pc = codeStream.position; - if (statements != null) { - for (int i = 0, max = statements.length; i < max; i++) { - statements[i].generateCode(scope, codeStream); - } - } // for local variable debug attributes - if (scope != currentScope) { // was really associated with its own scope - codeStream.exitUserScope(scope); + return statements == null; + } + + public StringBuffer printBody(int indent, StringBuffer output) { + + if (this.statements == null) + return output; + for (int i = 0; i < statements.length; i++) { + statements[i].printStatement(indent + 1, output); + output.append('\n'); } - codeStream.recordPositionsFrom(pc, this.sourceStart); + return output; } - public boolean isEmptyBlock() { + public StringBuffer printStatement(int indent, StringBuffer output) { - return statements == null; + printIndent(indent, output); + output.append("{\n"); //$NON-NLS-1$ + printBody(indent, output); + return printIndent(indent, output).append('}'); } public void resolve(BlockScope upperScope) { if (statements != null) { - scope = - explicitDeclarations == 0 - ? upperScope - : new BlockScope(upperScope, explicitDeclarations); + scope = explicitDeclarations == 0 ? upperScope : new BlockScope( + upperScope, explicitDeclarations); int i = 0, length = statements.length; while (i < length) statements[i++].resolve(scope); @@ -130,13 +151,12 @@ public class Block extends Statement { } else { buffer.append(";\n"); //$NON-NLS-1$ } - }; + } + ; return buffer.toString(); } - public void traverse( - IAbstractSyntaxTreeVisitor visitor, - BlockScope blockScope) { + public void traverse(ASTVisitor visitor, BlockScope blockScope) { if (visitor.visit(this, blockScope)) { if (statements != null) { @@ -147,14 +167,14 @@ public class Block extends Statement { } visitor.endVisit(this, blockScope); } - + /** * Dispatch the call on its last statement. */ public void branchChainTo(Label label) { - if (this.statements != null) { - this.statements[statements.length - 1].branchChainTo(label); - } + if (this.statements != null) { + this.statements[statements.length - 1].branchChainTo(label); + } } - -} \ No newline at end of file + +}