/*******************************************************************************
 * Copyright (c) 2005, 2016 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 *******************************************************************************/
package org.eclipse.dltk.ruby.ast;

import java.util.Collections;
import java.util.List;

import org.eclipse.dltk.ast.ASTNode;
import org.eclipse.dltk.ast.ASTVisitor;
import org.eclipse.dltk.ast.statements.Block;

public class RubyClassDeclaration extends RubyModuleDeclaration {

	private static final String OBJECT = "Object"; //$NON-NLS-1$
	private static final List<String> OBJECT_SUPER_CLASS = Collections
			.singletonList(OBJECT);

	public RubyClassDeclaration(ASTNode superClass, ASTNode name, Block body,
			int start, int end) {
		super(name, body, start, end);
		this.setNameStart(name.sourceStart());
		this.setNameEnd(name.sourceEnd());
		this.addSuperClass(superClass);
	}

	@Override
	public void traverse(ASTVisitor visitor) throws Exception {

		if (visitor.visit(this)) {
			if (this.getSuperClasses() != null) {
				this.getSuperClasses().traverse(visitor);
			}
			final ASTNode className = this.getClassName();
			if (className != null) {
				if (visitor instanceof IRubyASTVisitor) {
					((IRubyASTVisitor) visitor).visitTypeName(className);
				} else {
					className.traverse(visitor);
				}
			}
			if (this.getBody() != null) {
				getBody().traverse(visitor);
			}
			visitor.endvisit(this);
		}
	}

	@Override
	public List<String> getSuperClassNames() {
		List<String> names = super.getSuperClassNames();
		if (names == null || names.isEmpty()) {
			if (!OBJECT.equals(getName()))
				names = OBJECT_SUPER_CLASS;
		}
		return names;
	}

}
