blob: ad7c2901a70366fdd17b10000f6da0f077e229d6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2007 BEA Systems, Inc.
* 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:
* tyeung@bea.com - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.apt.core.internal.declaration;
import org.eclipse.core.resources.IFile;
import org.eclipse.jdt.apt.core.internal.env.BaseProcessorEnv;
import org.eclipse.jdt.apt.core.internal.util.Factory;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.SimpleName;
import org.eclipse.jdt.core.dom.Type;
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
import com.sun.mirror.declaration.FieldDeclaration;
import com.sun.mirror.type.TypeMirror;
import com.sun.mirror.util.DeclarationVisitor;
/**
* This field declaration implementation is based on the variable declaration
* fragment ast node in the parse tree.
* The most common scenario where such implementation is required is when
* the type of the field cannot be resolved. In this case, the jdt will not
* create the field binding. Information such as the declaring type as well
* as the name of the field will still be captured and make available to clients.
*/
public class ASTBasedFieldDeclarationImpl
extends ASTBasedMemberDeclarationImpl
implements FieldDeclaration {
public ASTBasedFieldDeclarationImpl(
final VariableDeclarationFragment astNode,
final IFile file,
final BaseProcessorEnv env)
{
super(astNode, file, env);
assert astNode.getParent() != null &&
astNode.getParent().getNodeType() == ASTNode.FIELD_DECLARATION :
"parent isn't a field declaration"; //$NON-NLS-1$
}
public void accept(DeclarationVisitor visitor)
{
visitor.visitFieldDeclaration(this);
}
public String getConstantExpression()
{
final Object constant = getConstantValue();
if( constant == null ) return null;
return constant.toString();
}
public Object getConstantValue()
{
final VariableDeclarationFragment fragment = getAstNode();
final Expression initializer = fragment.getInitializer();
if( initializer == null ) return null;
return initializer.resolveConstantExpressionValue();
}
public String getSimpleName() {
final VariableDeclarationFragment fragment = getAstNode();
final SimpleName nameNode = fragment.getName();
return nameNode == null ? EMPTY_STRING : nameNode.getIdentifier();
}
public TypeMirror getType()
{
final org.eclipse.jdt.core.dom.FieldDeclaration fieldASTNode = getFieldDeclarationAstNode();
final Type type = fieldASTNode.getType();
if( type == null )
return null;
final ITypeBinding typeBinding = type.resolveBinding();
// This is probably why we end up with an ast based implementation.
if( typeBinding == null )
return Factory.createErrorClassType(type.toString());
else{
TypeMirror typeMirror = Factory.createTypeMirror( typeBinding, _env );
if( typeMirror == null )
typeMirror = Factory.createErrorClassType(typeBinding);
return typeMirror;
}
}
public String toString()
{
/*
final org.eclipse.jdt.core.dom.FieldDeclaration fieldASTNode = getFieldDeclarationAstNode();
StringBuilder buffer = new StringBuilder();
final Type type = fieldASTNode.getType();
if( type != null ){
buffer.append(type);
buffer.append(' ');
}
buffer.append( getSimpleName() );
return buffer.toString();
*/
return getSimpleName();
}
public MirrorKind kind(){ return MirrorKind.FIELD; }
VariableDeclarationFragment getAstNode()
{
return (VariableDeclarationFragment)_astNode;
}
org.eclipse.jdt.core.dom.FieldDeclaration getFieldDeclarationAstNode()
{
return (org.eclipse.jdt.core.dom.FieldDeclaration)_astNode.getParent();
}
}