/*******************************************************************************
* Copyright (c) 2000, 2011 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
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.core.model;
import java.util.Map;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTCompletionNode;
import org.eclipse.cdt.core.dom.ast.IASTDeclarationListOwner;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.parser.FileContent;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.internal.core.model.IBufferFactory;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
/**
* Represents an entire C translation unit (<code>.c</code> source file).
* The children are of type <code>IStructureElement</code>,
* <code>IInclude</code>, etc..
* and appear in the order in which they are declared in the source.
* If a <code>.c</code> file cannot be parsed, its structure remains unknown.
* Use <code>ICElement.isStructureKnown</code> to determine whether this is
* the case.
*
* @noimplement This interface is not intended to be implemented by clients.
* @noextend This interface is not intended to be extended by clients.
*/
public interface ITranslationUnit extends ICElement, IParent, IOpenable, ISourceReference, ISourceManipulation {
/**
* Style constant for {@link #getAST(IIndex, int)}.
* Meaning: Skip function and method bodies.
* @since 4.0
*/
public static final int AST_SKIP_FUNCTION_BODIES= 0x1;
/**
* Style constant for {@link #getAST(IIndex, int)}.
* Meaning: Skip over headers that are found in the index, parse all others.
* Macro definitions and bindings are taken from index for skipped files.
*/
public static final int AST_SKIP_INDEXED_HEADERS = 0x2;
/**
* Style constant for {@link #getAST(IIndex, int)}.
* Meaning: Skip headers even if they are not found in the index.
* Makes practically only sense in combination with {@link #AST_SKIP_INDEXED_HEADERS}.
*/
public static final int AST_SKIP_NONINDEXED_HEADERS = 0x4;
/**
* Style constant for {@link #getAST(IIndex, int)}.
* A combination of {@link #AST_SKIP_INDEXED_HEADERS} and {@link #AST_SKIP_NONINDEXED_HEADERS}.
* Meaning: Don't parse header files at all, be they indexed or not.
* Macro definitions and bindings are taken from the index if available.
*/
public static final int AST_SKIP_ALL_HEADERS = AST_SKIP_INDEXED_HEADERS | AST_SKIP_NONINDEXED_HEADERS;
/**
* Style constant for {@link #getAST(IIndex, int)}.
* Meaning: Don't parse the file if there is no build information for it.
*/
public static final int AST_SKIP_IF_NO_BUILD_INFO = 0x8;
/**
* @deprecated The option has no effect.
* @since 4.0
*/
@Deprecated
public static final int AST_CREATE_COMMENT_NODES = 0x10;
/**
* Style constant for {@link #getAST(IIndex, int)}.
* Meaning: Configure the parser with language and build-information taken from a source file
* that directly or indirectly includes this file. If no suitable file is found in the index,
* the flag is ignored.
* @since 4.0
*/
public static final int AST_CONFIGURE_USING_SOURCE_CONTEXT= 0x20;
/**
* Style constant for {@link #getAST(IIndex, int)}.
* Instructs the parser not to create ast nodes for expressions within aggregate initializers
* when they do not contain names.
* @since 5.1
*/
public final static int AST_SKIP_TRIVIAL_EXPRESSIONS_IN_AGGREGATE_INITIALIZERS= 0x40;
/**
* Style constant for {@link #getAST(IIndex, int)}.
* Instructs the parser to make an attempt to create ast nodes for inactive code branches. The parser
* makes its best effort to create ast for the inactive code branches but may decide to skip parts
* of the inactive code (e.g. function bodies, entire code branches, etc.).
* <p>
* The inactive nodes can be accessed via {@link IASTDeclarationListOwner#getDeclarations(boolean)} or
* by using a visitor with {@link ASTVisitor#includeInactiveNodes} set to <code>true</code>.
*
* @since 5.1
*/
public final static int AST_PARSE_INACTIVE_CODE= 0x80;
/**
* Creates and returns an include declaration in this translation unit
* with the given name.
* <p>
* Optionally, the new element can be positioned before the specified
* sibling. If no sibling is specified, the element will be inserted
* as the last import declaration in this translation unit.
* <p>
* If the translation unit already includes the specified include declaration,
* the import is not generated (it does not generate duplicates).
*
* @param name the name of the include declaration to add (For example: <code>"stdio.h"</code> or
* <code>"sys/types.h"</code>)
* @param sibling the existing element which the include declaration will be inserted immediately before (if
* <code> null </code>, then this include will be inserted as the last include declaration.
* @param monitor the progress monitor to notify
* @return the newly inserted include declaration (or the previously existing one in case attempting to create a duplicate)
*
* @exception CModelException if the element could not be created. Reasons include:
* <ul>
* <li> This C element does not exist or the specified sibling does not exist (ELEMENT_DOES_NOT_EXIST)</li>
* <li> A <code>CoreException</code> occurred while updating an underlying resource
* <li> The specified sibling is not a child of this translation unit (INVALID_SIBLING)
* <li> The name is not a valid import name (INVALID_NAME)
* </ul>
*/
IInclude createInclude(String name, boolean isStd, ICElement sibling, IProgressMonitor monitor) throws CModelException;
/**
* Creates and returns a using declaration/directive in this translation unit.
*
* @param name the name of the using
* @param monitor the progress monitor to notify
* @return the newly inserted namespace declaration (or the previously existing one in case attempting to create a duplicate)
*
* @exception CModelException if the element could not be created. Reasons include:
* <ul>
* <li>This C element does not exist (ELEMENT_DOES_NOT_EXIST)</li>
* <li> A <code>CoreException</code> occurred while updating an underlying resource
* <li> The name is not a valid package name (INVALID_NAME)
* </ul>
*/
IUsing createUsing(String name, boolean isDirective, ICElement sibling, IProgressMonitor monitor) throws CModelException;
/**
* Creates and returns a namespace in this translation unit
*
* @param name the name of the namespace
* @param monitor the progress monitor to notify
* @return the newly inserted namespace declaration (or the previously existing one in case
* attempting to create a duplicate)
*
* @exception CModelException if the element could not be created. Reasons include:
* <ul>
* <li>This C element does not exist (ELEMENT_DOES_NOT_EXIST)</li>
* <li> A <code>CoreException</code> occurred while updating an underlying resource
* <li> The name is not a valid package name (INVALID_NAME)
* </ul>
*/
INamespace createNamespace(String namespace, ICElement sibling, IProgressMonitor monitor) throws CModelException;
/**
* Returns the shared working copy for this element, using the default <code>IBuffer</code>
* factory, or <code>null</code>, if no working copy has been created for this element.
* <p>
* Users of this method must not destroy the resulting working copy.
*
* @param bufferFactory
* the given <code>IBuffer</code> factory
* @return the found shared working copy for this element, or <code>null</code> if none
* @see IBufferFactory
* @since 5.1
*/
IWorkingCopy findSharedWorkingCopy();
/**
* Returns the contents of a translation unit as a char[]
* @return char[]
*/
char[] getContents();
/**
* Returns the smallest element within this translation unit that
* includes the given source position (that is, a method, field, etc.), or
* <code>null</code> if there is no element other than the translation
* unit itself at the given position, or if the given position is not
* within the source range of this translation unit.
*
* @param line a position inside the translation unit
* @return the innermost C element enclosing a given source position or <code>null</code>
* if none (excluding the translation unit).
* @exception CModelException if the translation unit does not exist or if an
* exception occurs while accessing its corresponding resource
*/
ICElement getElementAtLine(int line) throws CModelException;
/**
* Returns the smallest element within this translation unit that
* includes the given source position (that is, a method, field, etc.), or
* <code>null</code> if there is no element other than the translation
* unit itself at the given position, or if the given position is not
* within the source range of this translation unit.
*
* @param position a source position inside the translation unit
* @return the innermost C element enclosing a given source position or <code>null</code>
* if none (excluding the translation unit).
* @exception CModelException if the translation unit does not exist or if an
* exception occurs while accessing its corresponding resource
*/
ICElement getElementAtOffset(int offset) throws CModelException;
/**
* Returns the elements within this translation unit that
* includes the given source position (that is, a method, field, etc.), or
* an empty array if there are no elements other than the translation
* unit itself at the given position, or if the given position is not
* within the source range of this translation unit.
* You have this behavior when at expansion of a macro.
*
* @param position a source position inside the translation unit
* @return the innermost C element enclosing a given source position or <code>null</code>
* if none (excluding the translation unit).
* @exception CModelException if the translation unit does not exist or if an
* exception occurs while accessing its corresponding resource
*/
ICElement[] getElementsAtOffset(int offset) throws CModelException;
ICElement getElement(String name) throws CModelException;
/**
* Returns the include declaration in this translation unit with the given name.
*
* @param the name of the include to find (For example: <code>"stdio.h"</code>
* or <code>"sys/types.h"</code>)
* @return a handle onto the corresponding include declaration. The include declaration may or
* may not exist.
*/
IInclude getInclude(String name) ;
/**
* Returns the include declarations in this translation unit
* in the order in which they appear in the source.
*
* @exception CModelException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
IInclude[] getIncludes() throws CModelException;
/**
* Returns a shared working copy on this element using the given factory to create the buffer, or this
* element if this element is already a working copy. This API can only answer an already existing working
* copy if it is based on the same original translation unit AND was using the same buffer factory (i.e.
* as defined by <code>Object#equals</code>).
* <p>
* The life time of a shared working copy is as follows:
* <ul>
* <li>The first call to <code>getSharedWorkingCopy(...)</code> creates a new working copy for this
* element</li>
* <li>Subsequent calls increment an internal counter.</li>
* <li>A call to <code>destroy()</code> decrements the internal counter.</li>
* <li>When this counter is 0, the working copy is destroyed.
* </ul>
* So users of this method must destroy exactly once the working copy.
* <p>
* Note that the buffer factory will be used for the life time of this working copy, i.e. if the working
* copy is closed then reopened, this factory will be used. The buffer will be automatically initialized
* with the original's compilation unit content upon creation.
* <p>
* When the shared working copy instance is created, an ADDED ICElementDelta is reported on this working
* copy.
*
* @param monitor
* a progress monitor used to report progress while opening this compilation unit or
* <code>null</code> if no progress should be reported
* @param requestor
* a requestor which will get notified of problems detected during reconciling as they are
* discovered. The requestor can be set to <code>null</code> indicating that the client is not
* interested in problems.
* @exception CModelException
* if the contents of this element can not be determined. Reasons include:
* <ul>
* <li> This C element does not exist (ELEMENT_DOES_NOT_EXIST)</li>
* </ul>
* @return a shared working copy on this element using the given factory to create the buffer, or this
* element if this element is already a working copy
* @see IBufferFactory
* @see IProblemRequestor
* @since 5.1
*/
IWorkingCopy getSharedWorkingCopy(IProgressMonitor monitor, IProblemRequestor requestor) throws CModelException;
/**
* Returns the first using in this translation unit with the name
* This is a handle-only method. The namespace declaration may or may not exist.
*
* @param name the name of the namespace declaration (For example, <code>"std"</code>)
*/
IUsing getUsing(String name);
/**
* Returns the usings in this translation unit
* in the order in which they appear in the source.
*
* @return an array of namespace declaration (normally of size one)
*
* @exception CModelException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
IUsing[] getUsings() throws CModelException;
/**
* Returns the first namespace declaration in this translation unit with the given name
* This is a handle-only method. The namespace declaration may or may not exist.
*
* @param name the name of the namespace declaration (For example, <code>"std"</code>)
*/
INamespace getNamespace(String name);
/**
* Returns the namespace declarations in this translation unit
* in the order in which they appear in the source.
*
* @return an array of namespace declaration (normally of size one)
*
* @exception CModelException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
INamespace[] getNamespaces() throws CModelException;
/**
* True if its a header.
* @return boolean
*/
boolean isHeaderUnit();
/**
* True it is a source file.
* @return boolean
*/
boolean isSourceUnit();
/**
* Returns <code>true</code> if the code is C
*/
boolean isCLanguage();
/**
* Returns <code>true</code> if the code is C++
*/
boolean isCXXLanguage();
/**
* Returns <code>true</code> if the code is assembly
*/
boolean isASMLanguage();
/**
* Returns a new working copy for the Translation Unit.
* @return IWorkingCopy
*/
IWorkingCopy getWorkingCopy() throws CModelException;
/**
* Returns a new working copy for the Translation Unit.
* @since 5.1
*/
IWorkingCopy getWorkingCopy(IProgressMonitor monitor) throws CModelException;
/**
* Return the contentType id for this file.
* @return String - contentType id
*/
String getContentTypeId();
/**
* Checks if this is a working copy.
* @return boolean
*/
boolean isWorkingCopy();
/**
* Return the language for this translation unit.
*/
ILanguage getLanguage() throws CoreException;
/**
* Used by contributed languages' model builders to indicate whether or
* not the parse of a translation unit was successful.
*
* @param wasSuccessful
*
* TODO (DS) I'm not sure it's a good idea to put a setter in this
* interface. We should revisit this.
*
*/
public void setIsStructureKnown(boolean wasSuccessful);
/**
* Returns the absolute path of the location of the translation unit. May be <code>null</code>, in
* case the location does not exist.
* @return an absolute path to the location, or <code>null</code>
* @since 4.0
*/
public IPath getLocation();
/**
* Returns the scanner info associated with this translation unit. May return <code>null</code> if no
* configuration is available.
* @param force if <code>true</code> a default info is returned, even if nothing is configured for this
* translation unit
* @return a scanner info for parsing the translation unit or <code>null</code> if none is configured
* @since 4.0
*/
public IScannerInfo getScannerInfo(boolean force);
/**
* Creates the full AST for this translation unit. May return <code>null</code> if the language
* of this translation unit does not support ASTs.
* @return the AST for the translation unit or <code>null</code>
* @throws CoreException
* @since 4.0
*/
public IASTTranslationUnit getAST() throws CoreException;
/**
* Creates an AST based on the requested style. May return <code>null</code> if the language of
* this translation unit does not support ASTs. If the index was supplied, the caller has to
* hold a read lock on it. The returned AST is valid only while the index read lock is being
* held and should not be accessed after releasing the lock.
* @param index index to back up the parsing of the AST, may be <code>null</code>
* @param style <code>0</code> or a combination of {@link #AST_SKIP_ALL_HEADERS},
* {@link #AST_SKIP_IF_NO_BUILD_INFO}, {@link #AST_SKIP_INDEXED_HEADERS}
* and {@link #AST_CONFIGURE_USING_SOURCE_CONTEXT}.
* @return the AST requested or <code>null</code>
* @throws CoreException
* @since 4.0
*/
public IASTTranslationUnit getAST(IIndex index, int style) throws CoreException;
/**
* Return the completion node using the given index and parsing style at the given offset.
*/
public IASTCompletionNode getCompletionNode(IIndex index, int style, int offset) throws CoreException;
/**
* @deprecated use {@link #getSharedWorkingCopy(IProgressMonitor, IProblemRequestor)},
* or CDTUITools.getWorkingCopyManager() instead.
* @noreference This method is not intended to be referenced by clients.
*/
@Deprecated IWorkingCopy getSharedWorkingCopy(IProgressMonitor monitor, IBufferFactory factory) throws CModelException;
/**
* @deprecated use {@link #getSharedWorkingCopy(IProgressMonitor, IProblemRequestor)},
* or CDTUITools.getWorkingCopyManager() instead.
* @noreference This method is not intended to be referenced by clients.
*/
@Deprecated IWorkingCopy getSharedWorkingCopy(IProgressMonitor monitor, IBufferFactory factory, IProblemRequestor requestor) throws CModelException;
/**
* @deprecated use {@link #findSharedWorkingCopy()},
* or CDTUITools.getWorkingCopyManager() instead.
* @noreference This method is not intended to be referenced by clients.
*/
@Deprecated IWorkingCopy findSharedWorkingCopy(IBufferFactory bufferFactory);
/**
* @deprecated use {@link #getWorkingCopy(IProgressMonitor)},
* or CDTUITools.getWorkingCopyManager() instead.
* @noreference This method is not intended to be referenced by clients.
*/
@Deprecated IWorkingCopy getWorkingCopy(IProgressMonitor monitor, IBufferFactory factory) throws CModelException;
/**
* @deprecated don't use this method.
*/
@Deprecated Map<?, ?> parse();
/**
* @deprecated, use {@link FileContent#create(ITranslationUnit)}, instead.
*/
@Deprecated
org.eclipse.cdt.core.parser.CodeReader getCodeReader();
}