/*******************************************************************************
 * Copyright (c) 2000, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.core;

import org.eclipse.jdt.core.compiler.IProblem;

/**
 * A completion requestor accepts results as they are computed and is aware
 * of source positions to complete the various different results.
 * <p>
 * This interface may be implemented by clients.
 * </p>
 *
 * @see ICodeAssist
 * @since 2.0
 */
public interface ICompletionRequestor {
/**
 * Code assist notification of an anonymous type declaration completion.
 * @param superTypePackageName Name of the package that contains the super type of this 
 * 		new anonymous type declaration .
 * 
 * @param superTypeName Name of the super type of this new anonymous type declaration.
 * @param parameterPackageNames Names of the packages in which the parameter types are declared.
 *    	Should contain as many elements as parameterTypeNames.
 * @param parameterTypeNames Names of the parameter types. 
 * 		Should contain as many elements as parameterPackageNames.
 * @param parameterNames Names of the parameters. 
 * 		Should contain as many elements as parameterPackageNames.
 * @param completionName The completion for the anonymous type declaration.
 * 		Can include zero, one or two brackets. If the closing bracket is included,
 * 		then the cursor should be placed before it.
 * @param modifiers The modifiers of the constructor.
 * @param completionStart The start position of insertion of the name of this new anonymous type declaration.
 * @param completionEnd The end position of insertion of the name of this new anonymous type declaration.
 * @param relevance The relevance of the completion proposal
 * 		It is a positive integer which are used for determine if this proposal is more relevant than another proposal.
 * 		This value can only be used for compare relevance. A proposal is more relevant than another if his relevance
 * 		value is higher.
 * 
 * NOTE - All package and type names are presented in their readable form:
 *    Package names are in the form "a.b.c".
 *    Base types are in the form "int" or "boolean".
 *    Array types are in the qualified form "M[]" or "int[]".
 *    Nested type names are in the qualified form "A.M".
 *    The default package is represented by an empty array.
 *
 * NOTE: parameter names can be retrieved from the source model after the user selects a specific method.
 */
void acceptAnonymousType(
	char[] superTypePackageName,
	char[] superTypeName,
	char[][] parameterPackageNames,
	char[][] parameterTypeNames,
	char[][] parameterNames,
	char[] completionName,
	int modifiers,
	int completionStart,
	int completionEnd,
	int relevance);
/**
 * Code assist notification of a class completion.
 * 
 * @param packageName Declaring package name of the class.
 * @param className Name of the class.
 * @param completionName The completion for the class.	Can include ';' for imported classes.
 * @param modifiers The modifiers of the class.
 * @param completionStart The start position of insertion of the name of the class.
 * @param completionEnd The end position of insertion of the name of the class.
 * @param relevance The relevance of the completion proposal
 * 		It is a positive integer which are used for determine if this proposal is more relevant than another proposal.
 * 		This value can only be used for compare relevance. A proposal is more relevant than another if his relevance
 * 		value is higher.
 *
 * NOTE - All package and type names are presented in their readable form:
 *    Package names are in the form "a.b.c".
 *    Nested type names are in the qualified form "A.M".
 *    The default package is represented by an empty array.
 */
void acceptClass(
	char[] packageName,
	char[] className,
	char[] completionName,
	int modifiers,
	int completionStart,
	int completionEnd,
	int relevance);
/**
 * Code assist notification of a compilation error detected during completion.
 *  @param error Only problems which are categorized as non-syntax errors are notified to the 
 *     requestor, warnings are silently ignored.
 *		In case an error got signalled, no other completions might be available,
 *		therefore the problem message should be presented to the user.
 *		The source positions of the problem are related to the source where it was
 *		detected (might be in another compilation unit, if it was indirectly requested
 *		during the code assist process).
 *      Note: the problem knows its originating file name.
 */
void acceptError(IProblem error);
/**
 * Code assist notification of a field completion.
 * 
 * @param declaringTypePackageName Name of the package in which the type that contains this field is declared.
 * @param declaringTypeName Name of the type declaring this new field.
 * @param name Name of the field.
 * @param typePackageName Name of the package in which the type of this field is declared.
 * @param typeName Name of the type of this field.
 * @param completionName The completion for the field.
 * @param modifiers The modifiers of this field.
 * @param completionStart The start position of insertion of the name of this field.
 * @param completionEnd The end position of insertion of the name of this field.
 * @param relevance The relevance of the completion proposal
 * 		It is a positive integer which are used for determine if this proposal is more relevant than another proposal.
 * 		This value can only be used for compare relevance. A proposal is more relevant than another if his relevance
 * 		value is higher.
 * 
 * NOTE - All package and type names are presented in their readable form:
 *    Package names are in the form "a.b.c".
 *    Base types are in the form "int" or "boolean".
 *    Array types are in the qualified form "M[]" or "int[]".
 *    Nested type names are in the qualified form "A.M".
 *    The default package is represented by an empty array.
 */
void acceptField(
	char[] declaringTypePackageName,
	char[] declaringTypeName,
	char[] name,
	char[] typePackageName,
	char[] typeName,
	char[] completionName,
	int modifiers,
	int completionStart,
	int completionEnd,
	int relevance);
/**
 * Code assist notification of an interface completion.
 * 
 * @param packageName Declaring package name of the interface.
 * @param interfaceName Name of the interface.
 * @param completionName The completion for the interface.	Can include ';' for imported interfaces.
 * @param modifiers The modifiers of the interface.
 * @param completionStart The start position of insertion of the name of the interface.
 * @param completionEnd The end position of insertion of the name of the interface.
 * @param relevance The relevance of the completion proposal
 * 		It is a positive integer which are used for determine if this proposal is more relevant than another proposal.
 * 		This value can only be used for compare relevance. A proposal is more relevant than another if his relevance
 * 		value is higher.
 *
 * NOTE - All package and type names are presented in their readable form:
 *    Package names are in the form "a.b.c".
 *    Nested type names are in the qualified form "A.M".
 *    The default package is represented by an empty array.
 */
void acceptInterface(
	char[] packageName,
	char[] interfaceName,
	char[] completionName,
	int modifiers,
	int completionStart,
	int completionEnd,
	int relevance);
/**
 * Code assist notification of a keyword completion.
 * @param keywordName The keyword source.
 * @param completionStart The start position of insertion of the name of this keyword.
 * @param completionEnd The end position of insertion of the name of this keyword.
 * @param relevance The relevance of the completion proposal
 * 		It is a positive integer which are used for determine if this proposal is more relevant than another proposal.
 * 		This value can only be used for compare relevance. A proposal is more relevant than another if his relevance
 * 		value is higher.
 */
void acceptKeyword(char[] keywordName, int completionStart, int completionEnd, int relevance);
/**
 * Code assist notification of a label completion.
 * 
 * @param labelName The label source.
 * @param completionStart The start position of insertion of the name of this label.
 * @param completionEnd The end position of insertion of the name of this label.
 * @param relevance The relevance of the completion proposal
 * 		It is a positive integer which are used for determine if this proposal is more relevant than another proposal.
 * 		This value can only be used for compare relevance. A proposal is more relevant than another if his relevance
 * 		value is higher.
 */
void acceptLabel(char[] labelName, int completionStart, int completionEnd, int relevance);
/**
 * Code assist notification of a local variable completion.
 * 
 * @param name Name of the new local variable.
 * @param typePackageName Name of the package in which the type of this new local variable is declared.
 * @param typeName Name of the type of this new local variable.
 * @param modifiers The modifiers of this new local variable.
 * @param completionStart The start position of insertion of the name of this new local variable.
 * @param completionEnd The end position of insertion of the name of this new local variable.
 * @param relevance The relevance of the completion proposal
 * 		It is a positive integer which are used for determine if this proposal is more relevant than another proposal.
 * 		This value can only be used for compare relevance. A proposal is more relevant than another if his relevance
 * 		value is higher.
 *
 * NOTE - All package and type names are presented in their readable form:
 *    Package names are in the form "a.b.c".
 *    Base types are in the form "int" or "boolean".
 *    Array types are in the qualified form "M[]" or "int[]".
 *    Nested type names are in the qualified form "A.M".
 *    The default package is represented by an empty array.
 */
void acceptLocalVariable(
	char[] name,
	char[] typePackageName,
	char[] typeName,
	int modifiers,
	int completionStart,
	int completionEnd,
	int relevance);
/**
 * Code assist notification of a method completion.
 * 
 * @param declaringTypePackageName Name of the package in which the type that contains this new method is declared.
 * @param declaringTypeName Name of the type declaring this new method.
 * @param selector Name of the new method.
 * @param parameterPackageNames Names of the packages in which the parameter types are declared.
 *    	Should contain as many elements as parameterTypeNames.
 * @param parameterTypeNames Names of the parameter types.
 *    	Should contain as many elements as parameterPackageNames.
 * @param parameterNames Names of the parameters.
 *    	Should contain as many elements as parameterPackageNames.
 * @param returnTypePackageName Name of the package in which the return type is declared.
 * @param returnTypeName Name of the return type of this new method, should be <code>null</code> for a constructor.
 * @param completionName The completion for the method. Can include zero, one or two brackets. If the closing bracket is included, then the cursor should be placed before it.
 * @param modifiers The modifiers of this new method.
 * @param completionStart The start position of insertion of the name of this new method.
 * @param completionEnd The end position of insertion of the name of this new method.
 * @param relevance The relevance of the completion proposal
 * 		It is a positive integer which are used for determine if this proposal is more relevant than another proposal.
 * 		This value can only be used for compare relevance. A proposal is more relevant than another if his relevance
 * 		value is higher.
 *
 * NOTE - All package and type names are presented in their readable form:
 *    Package names are in the form "a.b.c".
 *    Base types are in the form "int" or "boolean".
 *    Array types are in the qualified form "M[]" or "int[]".
 *    Nested type names are in the qualified form "A.M".
 *    The default package is represented by an empty array.
 *
 * NOTE: parameter names can be retrieved from the source model after the user selects a specific method.
 */
void acceptMethod(
	char[] declaringTypePackageName,
	char[] declaringTypeName,
	char[] selector,
	char[][] parameterPackageNames,
	char[][] parameterTypeNames,
	char[][] parameterNames,
	char[] returnTypePackageName,
	char[] returnTypeName,
	char[] completionName,
	int modifiers,
	int completionStart,
	int completionEnd,
	int relevance);

/**
 * Code assist notification of a method completion.
 * 
 * @param declaringTypePackageName Name of the package in which the type that contains this new method is declared.
 * @param declaringTypeName Name of the type declaring this new method.
 * @param selector Name of the new method.
 * @param parameterPackageNames Names of the packages in which the parameter types are declared.
 *    	Should contain as many elements as parameterTypeNames.
 * @param parameterTypeNames Names of the parameter types.
 *    	Should contain as many elements as parameterPackageNames.
 * @param parameterNames Names of the parameters.
 *    	Should contain as many elements as parameterPackageNames.
 * @param returnTypePackageName Name of the package in which the return type is declared.
 * @param returnTypeName Name of the return type of this new method, should be <code>null</code> for a constructor.
 * @param completionName The completion for the method. Can include zero, one or two brackets. If the closing bracket is included, then the cursor should be placed before it.
 * @param modifiers The modifiers of this new method.
 * @param completionStart The start position of insertion of the name of this new method.
 * @param completionEnd The end position of insertion of the name of this new method.
 * @param relevance The relevance of the completion proposal
 * 		It is a positive integer which are used for determine if this proposal is more relevant than another proposal.
 * 		This value can only be used for compare relevance. A proposal is more relevant than another if his relevance
 * 		value is higher.
 *
 * NOTE - All package and type names are presented in their readable form:
 *    Package names are in the form "a.b.c".
 *    Base types are in the form "int" or "boolean".
 *    Array types are in the qualified form "M[]" or "int[]".
 *    Nested type names are in the qualified form "A.M".
 *    The default package is represented by an empty array.
 *
 * NOTE: parameter names can be retrieved from the source model after the user selects a specific method.
 */
void acceptMethodDeclaration(
	char[] declaringTypePackageName,
	char[] declaringTypeName,
	char[] selector,
	char[][] parameterPackageNames,
	char[][] parameterTypeNames,
	char[][] parameterNames,
	char[] returnTypePackageName,
	char[] returnTypeName,
	char[] completionName,
	int modifiers,
	int completionStart,
	int completionEnd,
	int relevance);
/**
 * Code assist notification of a modifier completion.
 * 
 * @param modifierName The new modifier.
 * @param completionStart The start position of insertion of the name of this new modifier.
 * @param completionEnd The end position of insertion of the name of this new modifier.
 * @param relevance The relevance of the completion proposal
 * 		It is a positive integer which are used for determine if this proposal is more relevant than another proposal.
 * 		This value can only be used for compare relevance. A proposal is more relevant than another if his relevance
 * 		value is higher.
 */
void acceptModifier(char[] modifierName, int completionStart, int completionEnd, int relevance);
/**
 * Code assist notification of a package completion.
 * 
 * @param packageName The package name.
 * @param completionName The completion for the package. Can include '.*;' for imports.
 * @param completionStart The start position of insertion of the name of this new package.
 * @param completionEnd The end position of insertion of the name of this new package.
 * @param relevance The relevance of the completion proposal
 * 		It is a positive integer which are used for determine if this proposal is more relevant than another proposal.
 * 		This value can only be used for compare relevance. A proposal is more relevant than another if his relevance
 * 		value is higher.
 *
 * NOTE - All package names are presented in their readable form:
 *    Package names are in the form "a.b.c".
 *    The default package is represented by an empty array.
 */
void acceptPackage(
	char[] packageName,
	char[] completionName,
	int completionStart,
	int completionEnd,
	int relevance);
/**
 * Code assist notification of a type completion.
 * 
 * @param packageName Declaring package name of the type.
 * @param typeName Name of the type.
 * @param completionName The completion for the type. Can include ';' for imported types.
 * @param completionStart The start position of insertion of the name of the type.
 * @param completionEnd The end position of insertion of the name of the type.
 * @param relevance The relevance of the completion proposal
 * 		It is a positive integer which are used for determine if this proposal is more relevant than another proposal.
 * 		This value can only be used for compare relevance. A proposal is more relevant than another if his relevance
 * 		value is higher.
 *
 * NOTE - All package and type names are presented in their readable form:
 *    Package names are in the form "a.b.c".
 *    Nested type names are in the qualified form "A.M".
 *    The default package is represented by an empty array.
 */
void acceptType(
	char[] packageName,
	char[] typeName,
	char[] completionName,
	int completionStart,
	int completionEnd,
	int relevance);
	
/**
 * Code assist notification of a variable name completion.
 * 
 * @param typePackageName Name of the package in which the type of this variable is declared.
 * @param typeName Name of the type of this variable.
 * @param name Name of the variable.
 * @param completionName The completion for the variable.
 * @param completionStart The start position of insertion of the name of this variable.
 * @param completionEnd The end position of insertion of the name of this variable.
 * @param relevance The relevance of the completion proposal
 * 		It is a positive integer which are used for determine if this proposal is more relevant than another proposal.
 * 		This value can only be used for compare relevance. A proposal is more relevant than another if his relevance
 * 		value is higher.
 *
 * NOTE - All package and type names are presented in their readable form:
 *    Package names are in the form "a.b.c".
 *    Base types are in the form "int" or "boolean".
 *    Array types are in the qualified form "M[]" or "int[]".
 *    Nested type names are in the qualified form "A.M".
 *    The default package is represented by an empty array.
 */
void acceptVariableName(
	char[] typePackageName,
	char[] typeName,
	char[] name,
	char[] completionName,
	int completionStart,
	int completionEnd,
	int relevance);
}
