/*******************************************************************************
 * Copyright (c) 2005 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 java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.jdt.apt.core.internal.env.BaseProcessorEnv;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.IBinding;

import com.sun.mirror.declaration.Modifier;

public abstract class DeclarationImpl extends EclipseDeclarationImpl {
	
	/** the type binding corresponding to this declaration */
	protected final IBinding _binding;
	DeclarationImpl(final IBinding binding, final BaseProcessorEnv env )
	{
		super(env);
		assert binding != null : "binding cannot be null"; //$NON-NLS-1$
		_binding = binding;
	}
	
	public boolean equals(Object obj)
    {
        if(obj instanceof DeclarationImpl)
            return _binding.isEqualTo( ((DeclarationImpl)obj)._binding );
            
        return false;
    }
	
	public int hashCode(){ 
    	final String key = getDeclarationBinding().getKey();
    	return key == null ? 0 : key.hashCode(); 
    }
	
	 /**
     * @return the binding that corresponds to the original declaration. 
     * For parameterized type or raw type, return the generic type declaration binding.
     * For parameterized method, return the method declaration binding that has the 
     * type parameters not the one with the parameters substituted with type arguments.
     * In other cases, simply return the same binding. 
     */
    public abstract IBinding getDeclarationBinding();
    
    public Collection<Modifier> getModifiers()
    {
        final int modBits = getDeclarationBinding().getModifiers();
        final List<Modifier> mods = new ArrayList<Modifier>(4);
        if( org.eclipse.jdt.core.dom.Modifier.isAbstract(modBits) )		
        	mods.add(Modifier.ABSTRACT);
        if( org.eclipse.jdt.core.dom.Modifier.isFinal(modBits) ) 		
        	mods.add(Modifier.FINAL);
        if( org.eclipse.jdt.core.dom.Modifier.isNative(modBits) ) 		
        	mods.add(Modifier.NATIVE);
        if( org.eclipse.jdt.core.dom.Modifier.isPrivate(modBits) ) 		
        	mods.add(Modifier.PRIVATE);
        if( org.eclipse.jdt.core.dom.Modifier.isProtected(modBits) ) 
        	mods.add(Modifier.PROTECTED);
        if( org.eclipse.jdt.core.dom.Modifier.isPublic(modBits) ) 	
        	mods.add(Modifier.PUBLIC);
        if( org.eclipse.jdt.core.dom.Modifier.isStatic(modBits) ) 	
        	mods.add(Modifier.STATIC);
        if( org.eclipse.jdt.core.dom.Modifier.isStrictfp(modBits) ) 
        	mods.add(Modifier.STRICTFP);
        if( org.eclipse.jdt.core.dom.Modifier.isSynchronized(modBits) ) 
        	mods.add(Modifier.SYNCHRONIZED);
        if( org.eclipse.jdt.core.dom.Modifier.isTransient(modBits) ) 
        	mods.add(Modifier.TRANSIENT);
        if( org.eclipse.jdt.core.dom.Modifier.isVolatile(modBits) ) 	
        	mods.add(Modifier.VOLATILE);
        return mods;
    }
    
    public boolean isBindingBased(){ return true; }
 
    ASTNode getAstNode(){
        if( !isFromSource() ) return null;
        return _env.getASTNodeForBinding(getDeclarationBinding());      
    }

    CompilationUnit getCompilationUnit(){
        if( !isFromSource() ) return null;
        return _env.getCompilationUnitForBinding(getDeclarationBinding());
    }

	public IFile getResource(){
        if( isFromSource() ){
            final IBinding binding = getDeclarationBinding();
			return _env.getDeclaringFileForBinding(binding);            
        }
        return null;
    }

}
