/*******************************************************************************
 * Copyright (c) 2009, 2011 Andrew Gvozdev and others.
 * 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:
 *     Andrew Gvozdev - initial API and implementation
 *******************************************************************************/

package org.eclipse.cdt.core.language.settings.providers;

import java.util.List;

import org.eclipse.cdt.core.model.LanguageManager;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.cdt.core.settings.model.ICSettingEntry;
import org.eclipse.core.resources.IResource;

/**
 * Base interface to provide list of {@link ICLanguageSettingEntry}.
 * This interface is used to deliver additions to compiler options such as
 * include paths (-I) or preprocessor defines (-D) and others (see
 * {@link ICSettingEntry#INCLUDE_PATH} and other kinds).
 * <br><br>
 * To define a provider like that use extension point
 * {@code org.eclipse.cdt.core.LanguageSettingsProvider} and implement this
 * interface. The recommended way of implementing is to extend
 * {@link LanguageSettingsSerializableProvider} and implement {@link ILanguageSettingsEditableProvider}.
 * That will give the ability to persist and edit/clean entries by user in UI.
 * The clone methods defined by {@link ILanguageSettingsEditableProvider} should be
 * chained as done for example by {@link LanguageSettingsGenericProvider}.
 * <br><br>
 * CDT provides a few general use implementations in the core such as {@link LanguageSettingsBaseProvider}
 * or {@link LanguageSettingsSerializableProvider} or {@link LanguageSettingsGenericProvider}
 * which could be used out of the box or built upon. There are also abstract classes in build
 * plugins {@code AbstractBuildCommandParser} and {@code AbstractBuiltinSpecsDetector} which
 * serve as a base for output parsers and built-in compiler language settings detectors.
 * See also extension point schema description LanguageSettingsProvider.exsd.
 *
 * @since 5.4
 */
public interface ILanguageSettingsProvider {
	/**
	 * Id is used to keep track of the providers internally. Use unique id
	 * to represent the provider.
	 *
	 * @return Id of the provider.
	 */
	public String getId();

	/**
	 * Name is used to present the provider to the end user in UI.
	 *
	 * @return name of the provider.
	 */
	public String getName();

	/**
	 * Returns the list of setting entries for the given configuration description,
	 * resource and language.
	 * <br><br>
	 * Note to implementers - this method should not be used to do any long running
	 * operations such as extensive calculations or reading files. If you need to do
	 * so, the recommended way is to do the calculations outside of
	 * this function call - in advance and on appropriate event. For example, Build
	 * Output Parser prepares the list and stores it in internal cache while parsing output.
	 * {@link #getSettingEntries(ICConfigurationDescription, IResource, String)} will
	 * return cached entries when asked. You can also implement {@link ICListenerAgent}
	 * interface to get registered and listen to arbitrary events.
	 *
	 * @param cfgDescription - configuration description.
	 * @param rc - resource such as file or folder.
	 *    If {@code null}, the default entries for all resources are returned.
	 * @param languageId - language id.
	 *    If {@code null}, the default entries for all languages are returned.
	 *     (see {@link LanguageManager#getLanguageForFile(org.eclipse.core.resources.IFile, ICConfigurationDescription)}).
	 *
	 * @return the list of setting entries or {@code null} if no settings defined.
	 *    The list needs to be a pooled list created by {@link LanguageSettingsStorage#getPooledList(List)}
	 *    to save memory and avoid deep equality comparisons.
	 */
	public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId);
}
