package org.eclipse.jdt.internal.compiler.ast;

/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */
import org.eclipse.jdt.internal.compiler.IAbstractSyntaxTreeVisitor;
import org.eclipse.jdt.internal.compiler.codegen.*;
import org.eclipse.jdt.internal.compiler.flow.*;
import org.eclipse.jdt.internal.compiler.lookup.*;
import org.eclipse.jdt.internal.compiler.parser.*;

public class Initializer extends FieldDeclaration {
	//public boolean isStatic = false ;
	public Block block;
	public int lastFieldID;
	public int bodyStart;
public Initializer(Block block, int modifiers) {
	this.block = block;
	this.modifiers = modifiers;

	declarationSourceStart = sourceStart = block.sourceStart;
}
public FlowInfo analyseCode(MethodScope currentScope, FlowContext flowContext, FlowInfo flowInfo) {
	return block.analyseCode(currentScope, flowContext, flowInfo);
}
/**
 * Code generation for a non-static initializer
 *	i.e. normal block code gen
 *
 * @param currentScope org.eclipse.jdt.internal.compiler.lookup.BlockScope
 * @param codeStream org.eclipse.jdt.internal.compiler.codegen.CodeStream
 */
public void generateCode(BlockScope currentScope, CodeStream codeStream) {
	if ((bits & IsReachableMASK) == 0) {
		return;
	}
	int pc = codeStream.position;
	block.generateCode(currentScope, codeStream);
	codeStream.recordPositionsFrom(pc, this);
}
public boolean isField() {
	return false;
}
public boolean isStatic() {
	return (modifiers & AccStatic) != 0;
}
public void parseStatements(Parser parser, TypeDeclaration type, CompilationUnitDeclaration unit) {
	//fill up the method body with statement

	parser.parse(this, type, unit);
}
public void resolve(MethodScope scope) {
	int previous = scope.fieldDeclarationIndex;
	try {
		scope.fieldDeclarationIndex = lastFieldID;
		if (isStatic()) {
			ReferenceBinding declaringType = scope.enclosingSourceType();
			if (declaringType.isNestedType() && !declaringType.isStatic())
				scope.problemReporter().innerTypesCannotDeclareStaticInitializers(declaringType, this);
		}
		block.resolve(scope);
	} finally {
		scope.fieldDeclarationIndex = previous;
	}
}
public String toString(int tab){
	/*slow code */

	if (modifiers != 0){
		StringBuffer buffer = new StringBuffer();
		buffer.append(tabString(tab));
		buffer.append(modifiersString(modifiers));
		buffer.append("{\n"/*nonNLS*/);
		buffer.append(block.toStringStatements(tab));
		buffer.append(tabString(tab));
		buffer.append("}"/*nonNLS*/);
		return buffer.toString();
	} else {
		return block.toString(tab);
	}
}
public void traverse(IAbstractSyntaxTreeVisitor visitor, MethodScope scope) {
	visitor.visit(this, scope);
	block.traverse(visitor, scope);
}
}
