blob: abaea7098897f5ca07879e63f48f72ec8f24c18b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2016 IBM Corporation 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
*
*******************************************************************************/
package org.eclipse.dltk.core;
import org.eclipse.core.runtime.IProgressMonitor;
/**
* Represents an entire source module (source file). Source module elements need
* to be opened before they can be navigated or manipulated.
*
* The children are of type {@link IPackageDeclaration},
* {@link IImportContainer}, {@link IType}, {@link IMethod} and {@link IField}
* and appear in the order in which they are declared in the source.
*
* The children appear in the order in which they are declared in the source. If
* a file cannot be parsed, its structure remains unknown. Use
* {@link IModelElement#isStructureKnown} to determine whether this is the case.
* <p>
* This interface is not intended to be implemented by clients.
* </p>
*/
public interface ISourceModule extends IModule, ISourceReference,
ISourceManipulation, ICodeAssist {
/**
* Commits the contents of this working copy to its underlying resource.
*
* <p>
* It is possible that the contents of the original resource have changed
* since this working copy was created, in which case there is an update
* conflict. The value of the <code>force</code> parameter effects the
* resolution of such a conflict:
* <ul>
* <li> <code>true</code> - in this case the contents of this working copy
* are applied to the underlying resource even though this working copy was
* created before a subsequent change in the resource</li>
* <li> <code>false</code> - in this case a {@link ModelException} is thrown</li>
* </ul>
* <p>
* A working copy can be created on a not-yet existing compilation unit. In
* particular, such a working copy can then be committed in order to create
* the corresponding compilation unit.
* </p>
*
* @param force
* a flag to handle the cases when the contents of the original
* resource have changed since this working copy was created
* @param monitor
* the given progress monitor
* @throws ModelException
* if this working copy could not commit. Reasons include:
* <ul>
* <li>A {@link org.eclipse.core.runtime.CoreException} occurred
* while updating an underlying resource
* <li>This element is not a working copy
* (INVALID_ELEMENT_TYPES)
* <li>A update conflict (described above) (UPDATE_CONFLICT)
* </ul>
*
*/
void commitWorkingCopy(boolean force, IProgressMonitor monitor)
throws ModelException;
/**
* Changes this compilation unit handle into a working copy. A new
* {@link IBuffer} is created using this compilation unit handle's owner.
* Uses the primary owner is none was specified when this compilation unit
* handle was created.
* <p>
* When switching to working copy mode, problems are reported to given
* {@link IProblemRequestor}. Note that once in working copy mode, the given
* {@link IProblemRequestor} is ignored. Only the original
* {@link IProblemRequestor} is used to report subsequent problems.
* </p>
* <p>
* Once in working copy mode, changes to this compilation unit or its
* children are done in memory. Only the new buffer is affected. Using
* {@link #commitWorkingCopy(boolean, IProgressMonitor)} will bring the
* underlying resource in sync with this compilation unit.
* </p>
* <p>
* If this compilation unit was already in working copy mode, an internal
* counter is incremented and no other action is taken on this compilation
* unit. To bring this compilation unit back into the original mode (where
* it reflects the underlying resource), {@link #discardWorkingCopy} must be
* call as many times as
* {@link #becomeWorkingCopy(IProblemRequestor, IProgressMonitor)}.
* </p>
*
* @param problemRequestor
* 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.
* @param monitor
* a progress monitor used to report progress while opening this
* compilation unit or <code>null</code> if no progress should be
* reported
* @throws ModelException
* if this compilation unit could not become a working copy.
* @see #discardWorkingCopy()
*
*/
void becomeWorkingCopy(IProblemRequestor problemRequestor,
IProgressMonitor monitor) throws ModelException;
/**
* Changes this compilation unit in working copy mode back to its original
* mode.
* <p>
* This has no effect if this compilation unit was not in working copy mode.
* </p>
* <p>
* If {@link #becomeWorkingCopy} was called several times on this
* compilation unit, {@link #discardWorkingCopy} must be called as many
* times before it switches back to the original mode.
* </p>
*
* @throws ModelException
* if this working copy could not return in its original mode.
* @see #becomeWorkingCopy(IProblemRequestor, IProgressMonitor)
*/
void discardWorkingCopy() throws ModelException;
/**
* Returns the source code associated with this element. This extracts the
* substring from the source buffer containing this source element. This
* corresponds to the source range that would be returned by
* <code>getSourceRange</code>.
*
* @return the source code, or <code>null</code> if this element has no
* associated source code
* @exception ModelException
* if an exception occurs while accessing its corresponding
* resource
*/
@Override
String getSource() throws ModelException;
/**
* Returns the source code associated with this element. This extracts the
* substring from the source buffer containing this source element. This
* corresponds to the source range that would be returned by
* <code>getSourceRange</code>.
*
* @return the source code, or <code>null</code> if this element has no
* associated source code
* @exception ModelException
* if an exception occurs while accessing its corresponding
* resource
*/
char[] getSourceAsCharArray() throws ModelException;
/**
* Returns a new working copy of this compilation unit if it is a primary
* compilation unit, or this compilation unit if it is already a non-primary
* working copy.
* <p>
* Note: if intending to share a working copy amongst several clients, then
* {@link #getWorkingCopy(WorkingCopyOwner, IProblemRequestor, IProgressMonitor)}
* should be used instead.
* </p>
* <p>
* When the working copy instance is created, an ADDED IModelElementDelta is
* reported on this working copy.
* </p>
* <p>
* Once done with the working copy, users of this method must discard it
* using {@link #discardWorkingCopy()}.
* </p>
* <p>
* A working copy can be created on a not-yet existing compilation unit. In
* particular, such a working copy can then be committed in order to create
* the corresponding compilation unit.
* </p>
*
* @param monitor
* a progress monitor used to report progress while opening this
* compilation unit or <code>null</code> if no progress should be
* reported
* @throws ModelException
* if the contents of this element can not be determined.
* @return a new working copy of this element if this element is not a
* working copy, or this element if this element is already a
* working copy
*/
ISourceModule getWorkingCopy(IProgressMonitor monitor)
throws ModelException;
ISourceModule getWorkingCopy(WorkingCopyOwner owner,
IProblemRequestor problemRequestor, IProgressMonitor monitor)
throws ModelException;
/**
* Reconciles the contents of this working copy, sends out a model delta
* notification indicating the nature of the change of the working copy
* since the last time it was either reconciled or made consistent (
* {@link IOpenable#makeConsistent(IProgressMonitor)}), and returns a
* compilation unit AST if requested.
* <p>
* It performs the reconciliation by locally caching the contents of the
* working copy, updating the contents, then creating a delta over the
* cached contents and the new contents, and finally firing this delta.
* <p>
* The boolean argument allows to force problem detection even if the
* working copy is already consistent.
* </p>
* <p>
* This functionality allows to specify a working copy owner which is used
* during problem detection. All references contained in the working copy
* are resolved against other units; for which corresponding owned working
* copies are going to take precedence over their original compilation
* units. If <code>null</code> is passed in, then the primary working copy
* owner is used.
* </p>
* <p>
* Compilation problems found in the new contents are notified through the
* {@link IProblemRequestor} interface which was passed at creation, and no
* longer as transient markers.
* </p>
* <p>
* Note: added/removed/changed inner types generate change deltas.
* </p>
* <p>
* If requested, a DOM AST representing the compilation unit is returned.
* Its bindings are computed only if the problem requestor is active, or if
* the problem detection is forced. This method returns <code>null</code> if
* the creation of the DOM AST was not requested, or if the requested level
* of AST API is not supported, or if the working copy was already
* consistent.
* </p>
*
* @param astLevel
* either {@link #NO_AST} if no AST is wanted, or the of the AST
* if one is wanted
* @param forceProblemDetection
* boolean indicating whether problem should be recomputed even
* if the source hasn't changed
* @param owner
* the owner of working copies that take precedence over the
* original compilation units, or <code>null</code> if the
* primary working copy owner should be used
* @param monitor
* a progress monitor
* @return the compilation unit AST or <code>null</code> if not requested,
* or if the requested level of AST API is not supported, or if the
* working copy was consistent
* @throws ModelException
* if the contents of the original element cannot be accessed.
* Reasons include:
* <ul>
* <li>The original script element does not exist
* (ELEMENT_DOES_NOT_EXIST)</li>
* </ul>
*/
void reconcile(boolean forceProblemDetection, WorkingCopyOwner owner,
IProgressMonitor monitor) throws ModelException;
/**
* Returns the primary compilation unit (whose owner is the primary owner)
* this working copy was created from, or this compilation unit if this a
* primary compilation unit.
* <p>
* Note that the returned primary compilation unit can be in working copy
* mode.
* </p>
*
* @return the primary compilation unit this working copy was created from,
* or this compilation unit if it is primary
*/
public ISourceModule getPrimary();
/**
* Returns the smallest element within this compilation 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 compilation unit
* itself at the given position, or if the given position is not within the
* source range of this compilation unit.
*
* @param position
* a source position inside the compilation unit
* @return the innermost script element enclosing a given source position or
* <code>null</code> if none (excluding the compilation unit).
* @throws ModelException
* if the compilation unit does not exist or if an exception
* occurs while accessing its corresponding resource
*/
IModelElement getElementAt(int position) throws ModelException;
/**
* Returns the working copy owner of this working copy. Returns null if it
* is not a working copy or if it has no owner.
*
* @return WorkingCopyOwner the owner of this working copy or
* <code>null</code>
*
*/
WorkingCopyOwner getOwner();
/**
* Returns whether this element is a working copy.
*
* @return true if this element is a working copy, false otherwise
*
*/
boolean isWorkingCopy();
/**
* Returns the top-level type declared in this compilation unit with the
* given simple type name. The type name has to be a valid compilation unit
* name. This is a handle-only method. The type may or may not exist.
*
* @param name
* the simple name of the requested type in the compilation unit
* @return a handle onto the corresponding type. The type may or may not
* exist.
*/
IType getType(String name);
/**
* Returns the top-level types declared in this compilation unit in the
* order in which they appear in the source.
*
* @return the top-level types declared in this compilation unit
* @throws ModelException
* if this element does not exist or if an exception occurs
* while accessing its corresponding resource
*/
IType[] getTypes() throws ModelException;
IType[] getAllTypes() throws ModelException;
/**
* Read only source module. From external resources.
*/
@Override
boolean isReadOnly();
boolean isPrimary();
/**
* Returns the first package declaration in this compilation unit with the
* given package name (there normally is at most one package declaration).
* This is a handle-only method. The package declaration may or may not
* exist.
*
* @param name
* the name of the package declaration as defined by JLS2 7.4.
* (For example, <code>"java.lang"</code>)
* @return the first package declaration in this compilation unit with the
* given package name
*/
IPackageDeclaration getPackageDeclaration(String name);
/**
* Returns the package declarations in this compilation unit in the order in
* which they appear in the source. There normally is at most one package
* declaration.
*
* @return an array of package declaration (normally of size one)
*
* @throws ModelException
* if this element does not exist or if an exception occurs
* while accessing its corresponding resource
*/
IPackageDeclaration[] getPackageDeclarations() throws ModelException;
/**
* Returns the method with the specified name and parameter types in this
* type (for example, <code>"foo", {"I", "QString;"}</code>). To get the
* handle for a constructor, the name specified must be the simple name of
* the enclosing type. This is a handle-only method. The method may or may
* not be present.
* <p>
* The type signatures may be either unresolved (for source types) or
* resolved (for binary types), and either basic (for basic types) or rich
* (for parameterized types).
* </p>
*
* @param name
* the given name
* @return the method with the specified name and parameter types in this
* type
*/
IMethod getMethod(String name);
IField getField(String string);
IField[] getFields() throws ModelException;
boolean isBuiltin();
/**
* @since 2.0
*/
boolean isBinary();
}