/*******************************************************************************
 * Copyright (c) 2000, 2010 QNX Software Systems 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:
 *     QNX Software Systems - Initial API and implementation
 *******************************************************************************/
package org.eclipse.linuxtools.internal.cdt.autotools.ui.editors.automake;

import java.io.IOException;
import java.io.Reader;
import java.net.URI;


/**
 * IMakefile:
 *
 * Makefile : ( directive ) *
 * directive :   rule | macro_definition | comments | empty
 * rule :  inference_rule | target_rule | special_rule
 * inference_rule : target ':' [ ';' command ] <nl>
 *		 [ ( command ) * ]
 * target_rule : [ ( target ) + ] ':' [ ( prerequisite ) * ] [ ';' command ] <nl> 
 *               [ ( command ) *  ]
 * macro_definition : string '=' ( string )* 
 * comments : ('#' ( string ) <nl>) *
 * empty : <nl>
 * command : <tab> prefix_command string <nl>
 * target : string
 * prefix_command : '-' | '@' | '+'
 * internal_macro :  "$<" | "$*" | "$@" | "$?" | "$%" 
 * 
 * @noextend This class is not intended to be subclassed by clients.
 * @noimplement This interface is not intended to be implemented by clients.
 */
public interface IMakefile extends IParent {

	/**
	 * ITargetRule | IInferenceRule | ISpecialRule
	 */
	IRule[] getRules();

	/**
	 * @return the IRule for target.
	 */
	IRule[] getRules(String target);

	/**
	 * @return IInferenceRule
	 * 
	 */
	IInferenceRule[] getInferenceRules();

	/**
	 * @return the IInferenceRules for target.
	 */
	IInferenceRule[] getInferenceRules(String target);

	/**
	 * @return ITargetRule
	 */
	ITargetRule[] getTargetRules();

	/**
	 * @return the ITargetRules for name.
	 */
	ITargetRule[] getTargetRules(String target);

	/**
	 * @return the IMacroDefinitions.
	 */
	IMacroDefinition[] getMacroDefinitions();

	/**
	 * @return the IMacroDefinitions for name.
	 */
	IMacroDefinition[] getMacroDefinitions(String name);

	/**
	 * @return all the built-in directives.
	 */
	IDirective[] getBuiltins();

	/**
	 * @return all the built-in MacroDefintions
	 */
	IMacroDefinition[] getBuiltinMacroDefinitions();

	/**
	 * @return the built-in macro definition for name.
	 */
	IMacroDefinition[] getBuiltinMacroDefinitions(String name);

	/**
	 * @return line after expanding any macros.
	 */
	String expandString(String line);

	/**
	 * @return line after expanding any macros.
	 * 
	 * @param line - line to expand
	 * @param recursive -  if true recursively expand.
	 */
	String expandString(String line, boolean recursive);

	/**
	 * @return  the makefile Reader provider used to create this makefile or <code>null</code>
	 */
	IMakefileReaderProvider getMakefileReaderProvider();
	
	/**
	 * Clear all statements and (re)parse the Makefile
	 */
	void parse(String filePath, Reader makefile) throws IOException;
	
	/**
	 * Clear all statements and (re)parse the Makefile
	 */
	void parse(URI fileURI, Reader makefile) throws IOException;
	
	/**
	 * Clear the all statements and (re)parse the Makefile
	 * using the given makefile Reader provider
	 * 
	 * @param makefileReaderProvider provider, or <code>null</code> to use a FileReader
	 */
	void parse(URI fileURI, IMakefileReaderProvider makefileReaderProvider) throws IOException;
	

	/**
	 * @return the <code>URI</code> of this makefile
	 */
	URI getFileURI();
}
