/**
* Copyright (c) 2006 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
*
* Contributors:
* IBM - Initial API and implementation
*/
package org.eclipse.emf.codegen.merge.java.facade.ast;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
import org.eclipse.jdt.core.dom.BodyDeclaration;
import org.eclipse.jdt.core.dom.ChildListPropertyDescriptor;
import org.eclipse.jdt.core.dom.FieldDeclaration;
import org.eclipse.jdt.core.dom.rewrite.ListRewrite;
import org.eclipse.emf.codegen.merge.java.facade.JAbstractType;
import org.eclipse.emf.codegen.merge.java.facade.JNode;
/**
*
* @param <T> wrapped AST AbstractType
*/
public abstract class ASTJAbstractType<T extends AbstractTypeDeclaration> extends ASTJMember<T> implements JAbstractType
{
protected ASTJAbstractType(T abstractTypeDeclaration)
{
super(abstractTypeDeclaration);
}
public String getName()
{
if (name == UNITIALIZED_STRING)
{
name = ASTFacadeHelper.toString(getASTNode().getName());
}
return name;
}
public void setName(String name)
{
this.name = name;
setNodeProperty(getASTNode(), name, getASTNode().getNameProperty(), ASTNode.SIMPLE_NAME);
}
/* (non-Javadoc)
* @see org.eclipse.emf.codegen.merge.java.facade.AbstractJNode#computeQualifiedName()
*/
@Override
protected String computeQualifiedName()
{
return computeQualifiedName(this);
}
/**
* Returns the list of children.
*
* @see ASTFacadeHelper#convertToNode(Object)
* @see org.eclipse.emf.codegen.merge.java.facade.AbstractJNode#getChildren()
*/
@Override
public List<JNode> getChildren()
{
if (!isDisposed())
{
List<JNode> children = new ArrayList<JNode>();
children.addAll(getAnnotationList());
children.addAll(getMembers());
if (!children.isEmpty())
{
return Collections.unmodifiableList(children);
}
}
return Collections.emptyList();
}
/* (non-Javadoc)
* @see org.eclipse.emf.codegen.merge.java.facade.ast.ASTJNode#addChild(org.eclipse.emf.codegen.merge.java.facade.JNode)
*/
@Override
public boolean addChild(ASTJNode<?> child)
{
if (child.getParent() != null)
{
return false;
}
if (child instanceof ASTJMember<?>)
{
insertLast(child, getASTNode().getBodyDeclarationsProperty());
return true;
}
return super.addChild(child);
}
/* (non-Javadoc)
* @see org.eclipse.emf.codegen.merge.java.facade.ast.ASTJNode#insertSibling(org.eclipse.emf.codegen.merge.java.facade.JNode, org.eclipse.emf.codegen.merge.java.facade.JNode, boolean)
*/
@Override
public boolean insertSibling(ASTJNode<?> node, ASTJNode<?> newSibling, boolean before)
{
if (newSibling.getParent() != null || node.getParent() != this)
{
return false;
}
if (newSibling instanceof ASTJMember<?>)
{
ChildListPropertyDescriptor property = getASTNode().getBodyDeclarationsProperty();
if (node instanceof ASTJMember<?>)
{
insert(newSibling, property, node, before);
}
else if (node instanceof ASTJAnnotation)
{
insertFirst(newSibling, property);
}
else
{
insertLast(newSibling, property);
}
return true;
}
return super.insertSibling(node, newSibling, before);
}
/**
* Removes the node. Node must be a child of ASTJType.
* <p>
* This implementation supports moving the nodes by calling {@link #remove(ASTJNode)} and
* then {@link #insertSibling(ASTJNode, ASTJNode, boolean)} or {@link #addChild(ASTJNode)}.
*
* @see org.eclipse.emf.codegen.merge.java.facade.ast.ASTJNode#remove(ASTJNode)
*/
@Override
public boolean remove(ASTJNode<?> node)
{
if (node.getParent() != this)
{
return false;
}
if (node instanceof ASTJMember<?>)
{
remove(node, getASTNode().getBodyDeclarationsProperty());
return true;
}
return super.remove(node);
}
protected List<JNode> getMembers()
{
List<JNode> members = new ArrayList<JNode>();
ListRewrite listRewrite = rewriter.getListRewrite(getASTNode(), getASTNode().getBodyDeclarationsProperty());
@SuppressWarnings("unchecked")
List<BodyDeclaration> bodyDeclarations = listRewrite.getRewrittenList();
for (BodyDeclaration declaration : bodyDeclarations)
{
// for field declarations use variable declaration fragments instead
if (declaration instanceof FieldDeclaration)
{
FieldDeclaration fieldDeclaration = (FieldDeclaration)declaration;
ListRewrite fragmentslistRewrite = rewriter.getListRewrite(fieldDeclaration, FieldDeclaration.FRAGMENTS_PROPERTY);
List<?> fragments = fragmentslistRewrite.getRewrittenList();
for (Object fragment : fragments)
{
JNode node = getFacadeHelper().convertToNode(fragment);
if (node != null)
{
members.add(node);
}
}
}
else
{
JNode node = getFacadeHelper().convertToNode(declaration);
if (node != null)
{
members.add(node);
}
}
}
return members;
}
}