/*******************************************************************************
 * Copyright (c) 2014 itemis AG (http://www.itemis.eu) and others.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
package org.eclipse.xtend.lib.macro.services;

import org.eclipse.xtend.lib.macro.declaration.AnnotationReference;
import org.eclipse.xtend.lib.macro.declaration.Type;
import org.eclipse.xtext.xbase.lib.Procedures;

import com.google.common.annotations.Beta;

/**
 * Creates {@link AnnotationReference} instances.
 * 
 * @author Anton Kosyakov
 * @since 2.6
 * @noimplement This interface is not intended to be implemented by clients.
 */
@Beta
public interface AnnotationReferenceProvider {
	
	/**
	 * Creates a new annotation reference for the given name.
	 *  
	 * @param annotationTypeName the name of the annotation type to point to, must be a valid java identifier
	 * @return a {@link AnnotationReference} pointing to the type with the give name, or <code>null</code> if no such annotation type could be found.
	 * @throws IllegalArgumentException if the <code>name</code> is not a valid java identifier
	 */
	AnnotationReference newAnnotationReference(String annotationTypeName);

	/**
	 * Creates a new annotation reference for the given type declaration.
	 *  
	 * @param annotationTypeDelcaration the annotation type to point to, must not be <code>null</code>.
	 * @return a {@link AnnotationReference} pointing to the given type, or <code>null</code> if the given type is not an annotation type.
	 * @throws IllegalArgumentException if the given type declaration is null
	 */
	AnnotationReference newAnnotationReference(Type annotationTypeDelcaration);

	/**
	 * Creates a new annotation reference for the given {@link Class}.
	 *  
	 * @param annotationClass the {@link Class} to point to, must not be <code>null</code>.
	 * @return a {@link AnnotationReference} pointing to the given type, or <code>null</code> if the given type is not on the class path of the compiled project or an annotation type.
	 * @throws IllegalArgumentException if the given {@link Class} is null
	 */
	AnnotationReference newAnnotationReference(Class<?> annotationClass);
	
	/**
	 * Create a new annotation reference base on the given annotation reference.
	 * 
	 * @param annotationReference an annotation reference which is used as a base for a new annotation reference, must not be <code>null</code> or detached.  
	 * @return a {@link AnnotationReference} constructed based on the given annotation reference, can be <code>null</code>
	 * @throws IllegalArgumentException if the given annotation reference is <code>null</code> or detached
	 */
	AnnotationReference newAnnotationReference(AnnotationReference annotationReference);
	
	/**
	 * Creates a new annotation reference for the given name.
	 *  
	 * @param annotationTypeName the name of the annotation type to point to
	 * @param initializer a callback for further initialization of the create annotation reference, must not be <code>null</code>.
	 * @return a {@link AnnotationReference} pointing to the type with the give name, or <code>null</code> if no such annotation type could be found.
	 * @throws IllegalArgumentException if the <code>name</code> is not a valid java identifier or the <code>initializer</code> is <code>null</code>
	 */
	AnnotationReference newAnnotationReference(String annotationTypeName, Procedures.Procedure1<AnnotationReferenceBuildContext> initializer);
	
	/**
	 * Creates a new annotation reference for the given type declaration.
	 *  
	 * @param annotationTypeDelcaration the annotation type to point to, must not be <code>null</code>.
	 * @param initializer a callback for further initialization of the create annotation reference, must not be <code>null</code>.
	 * @return a {@link AnnotationReference} pointing to the given type, or <code>null</code> if the given type is not an annotation type.
	 * @throws IllegalArgumentException if the given type declaration is <code>null</code> or the <code>initializer</code> is <code>null</code>
	 */
	AnnotationReference newAnnotationReference(Type annotationTypeDelcaration, Procedures.Procedure1<AnnotationReferenceBuildContext> initializer);
	
	/**
	 * Creates a new annotation reference for the given {@link Class}.
	 *  
	 * @param annotationClass the {@link Class} to point to, must not be <code>null</code>.
	 * @param initializer a callback for further initialization of the create annotation reference, must not be <code>null</code>.
	 * @return a {@link AnnotationReference} pointing to the given type, or <code>null</code> if the given type is not on the class path of the compiled project or an annotation type.
	 * @throws IllegalArgumentException if the given {@link Class} is <code>null</code> or the <code>initializer</code> is <code>null</code>
	 */
	AnnotationReference newAnnotationReference(Class<?> annotationClass, Procedures.Procedure1<AnnotationReferenceBuildContext> initializer);
	
	/**
	 * Create a new annotation reference base on the given annotation reference.
	 * 
	 * @param annotationReference an annotation reference which is used as a base for a new annotation reference, must not be <code>null</code> or detached. 
	 * @param initializer a callback for further initialization of the create annotation reference, must not be <code>null</code>.
	 * @return a {@link AnnotationReference} constructed based on the given annotation reference, can be <code>null</code> 
	 * @throws IllegalArgumentException if the given annotation reference is <code>null</code> or detached; or the <code>initializer</code> is <code>null</code>
	 */
	AnnotationReference newAnnotationReference(AnnotationReference annotationReference, Procedures.Procedure1<AnnotationReferenceBuildContext> initializer);
	
}
