/*******************************************************************************
 * 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();
    }
}
