/*******************************************************************************
 * Copyright (c) 2000, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * 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-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.compiler.ast;

import org.eclipse.jdt.internal.compiler.ASTVisitor;
import org.eclipse.jdt.internal.compiler.lookup.BlockScope;

/**
 * Flatten string literal
 */
public class StringLiteralConcatenation extends StringLiteral {
	private static final int INITIAL_SIZE = 5;
	public StringLiteral[] literals;
	public int counter;
	/**	
	 * Build a two-strings literal
	 * */
	public StringLiteralConcatenation(StringLiteral str1, StringLiteral str2) {
		super(str1.sourceStart, str1.sourceEnd);
		this.source = str1.source;
		this.literals = new StringLiteral[INITIAL_SIZE];
		this.counter = 0;
		this.literals[this.counter++] = str1;
		extendsWith(str2);
	}

	/**
	 *  Add the lit source to mine, just as if it was mine
	 */
	public StringLiteralConcatenation extendsWith(StringLiteral lit) {
		this.sourceEnd = lit.sourceEnd;
		final int literalsLength = this.literals.length;
		if (this.counter == literalsLength) {
			// resize
			System.arraycopy(this.literals, 0, this.literals = new StringLiteral[literalsLength + INITIAL_SIZE], 0, literalsLength);
		}
		//uddate the source
		int length = source.length;
		System.arraycopy(
			source,
			0,
			source = new char[length + lit.source.length],
			0,
			length);
		System.arraycopy(lit.source, 0, source, length, lit.source.length);
		this.literals[this.counter++] = lit;		
		return this;
	}
	
	public StringBuffer printExpression(int indent, StringBuffer output) {
		output.append("StringLiteralConcatenation{"); //$NON-NLS-1$
		for (int i = 0, max = this.counter; i < max; i++) {
			this.literals[i].printExpression(indent, output);
			output.append("+\n");//$NON-NLS-1$
		}
		return output.append('}');
	}
	
	public char[] source() {
		return source;
	}

	public void traverse(ASTVisitor visitor, BlockScope scope) {
		if (visitor.visit(this, scope)) {
			for (int i = 0, max = this.counter; i < max; i++) {
				this.literals[i].traverse(visitor, scope);
			}			
		}
		visitor.endVisit(this, scope);
	}
}
