### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: model/org/eclipse/jdt/core/IWorkingCopy.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IWorkingCopy.java,v retrieving revision 1.41 diff -u -r1.41 IWorkingCopy.java --- model/org/eclipse/jdt/core/IWorkingCopy.java 29 Sep 2006 17:13:57 -0000 1.41 +++ model/org/eclipse/jdt/core/IWorkingCopy.java 14 Nov 2006 16:16:43 -0000 @@ -277,7 +277,7 @@ * the buffer, or this element if this element is already a working copy * @since 2.0 * - * @deprecated Use {@link ICompilationUnit#getWorkingCopy(WorkingCopyOwner, IProblemRequestor, IProgressMonitor)} instead. + * @deprecated Use {@link IJavaFile#getWorkingCopy(WorkingCopyOwner, IProgressMonitor)} instead. */ IJavaElement getWorkingCopy( IProgressMonitor monitor, Index: model/org/eclipse/jdt/core/ICompilationUnit.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ICompilationUnit.java,v retrieving revision 1.58 diff -u -r1.58 ICompilationUnit.java --- model/org/eclipse/jdt/core/ICompilationUnit.java 6 Nov 2006 14:13:47 -0000 1.58 +++ model/org/eclipse/jdt/core/ICompilationUnit.java 14 Nov 2006 16:16:43 -0000 @@ -30,7 +30,7 @@ * This interface is not intended to be implemented by clients. *

*/ -public interface ICompilationUnit extends IJavaElement, ISourceReference, IParent, IOpenable, IWorkingCopy, ISourceManipulation, ICodeAssist { +public interface ICompilationUnit extends IJavaFile, IWorkingCopy, ISourceManipulation { /** * Constant indicating that a reconcile operation should not return an AST. * @since 3.0 @@ -254,14 +254,6 @@ */ IJavaElement[] findElements(IJavaElement element); /** - * Finds the primary type of this compilation unit (that is, the type with the same name as the - * compilation unit), or null if no such a type exists. - * - * @return the found primary type of this compilation unit, or null if no such a type exists - * @since 3.0 - */ -IType findPrimaryType(); -/** * Finds the working copy for this compilation unit, given a {@link WorkingCopyOwner}. * If no working copy has been created for this compilation unit associated with this * working copy owner, returns null. @@ -286,20 +278,6 @@ */ IType[] getAllTypes() throws JavaModelException; /** - * Returns the smallest element within this compilation unit that - * includes the given source position (that is, a method, field, etc.), or - * null 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 Java element enclosing a given source position or null - * if none (excluding the compilation unit). - * @throws JavaModelException if the compilation unit does not exist or if an - * exception occurs while accessing its corresponding resource - */ -IJavaElement getElementAt(int position) throws JavaModelException; -/** * Returns the first import declaration in this compilation unit with the given name. * This is a handle-only method. The import declaration may or may not exist. This * is a convenience method - imports can also be accessed from a compilation unit's Index: model/org/eclipse/jdt/core/IMember.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IMember.java,v retrieving revision 1.23 diff -u -r1.23 IMember.java --- model/org/eclipse/jdt/core/IMember.java 10 May 2006 18:03:42 -0000 1.23 +++ model/org/eclipse/jdt/core/IMember.java 14 Nov 2006 16:16:43 -0000 @@ -49,6 +49,14 @@ */ ICompilationUnit getCompilationUnit(); /** + * Returns the Java file in which this member is declared. + * This is a handle-only method. + * + * @return the Java file in which this member is declared + * @since 3.3 + */ +IJavaFile getJavaFile(); +/** * Returns the type in which this member is declared, or null * if this member is not declared in a type (for example, a top-level type). * This is a handle-only method. Index: model/org/eclipse/jdt/core/IClassFile.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IClassFile.java,v retrieving revision 1.21 diff -u -r1.21 IClassFile.java --- model/org/eclipse/jdt/core/IClassFile.java 29 Sep 2006 17:13:57 -0000 1.21 +++ model/org/eclipse/jdt/core/IClassFile.java 14 Nov 2006 16:16:43 -0000 @@ -32,7 +32,7 @@ * @see IPackageFragmentRoot#attachSource(org.eclipse.core.runtime.IPath, org.eclipse.core.runtime.IPath, IProgressMonitor) */ -public interface IClassFile extends IJavaElement, IParent, IOpenable, ISourceReference, ICodeAssist { +public interface IClassFile extends IJavaFile { /** * Changes this class file handle into a working copy. A new {@link IBuffer} is @@ -80,21 +80,6 @@ ICompilationUnit becomeWorkingCopy(IProblemRequestor problemRequestor, WorkingCopyOwner owner, IProgressMonitor monitor) throws JavaModelException; /** - * Returns the smallest element within this class file that - * includes the given source position (a method, field, etc.), or - * null if there is no element other than the class file - * itself at the given position, or if the given position is not - * within the source range of this class file. - * - * @param position a source position inside the class file - * @return the innermost Java element enclosing a given source position or null - * if none (excluding the class file). - * - * @exception JavaModelException if this element does not exist or if an - * exception occurs while accessing its corresponding resource - */ -IJavaElement getElementAt(int position) throws JavaModelException; -/** * Returns the type contained in this class file. * * @return the type contained in this class file @@ -105,29 +90,6 @@ IType getType() throws JavaModelException; /** * Returns a working copy on the source associated with this class file using the given - * owner to create the buffer, or null if there is no source associated - * with the class file. - *

- * The buffer will be automatically initialized with the source of the class file - * upon creation. - *

- * The only valid operations on this working copy are getBuffer() or getPrimary(). - * - * @param owner the owner that creates a buffer that is used to get the content of the working copy - * or null if the primary owner should be used - * @param monitor a progress monitor used to report progress while opening this compilation unit - * or null if no progress should be reported - * @return a a working copy on the source associated with this class file - * @exception JavaModelException if the source of this class file can - * not be determined. Reasons include: - *

- * @since 3.0 - */ -ICompilationUnit getWorkingCopy(WorkingCopyOwner owner, IProgressMonitor monitor) throws JavaModelException; -/** - * Returns a working copy on the source associated with this class file using the given * factory to create the buffer, or null if there is no source associated * with the class file. *

@@ -147,7 +109,7 @@ *

  • This class file does not exist (ELEMENT_DOES_NOT_EXIST)
  • * * @since 2.0 - * @deprecated Use {@link #getWorkingCopy(WorkingCopyOwner, IProgressMonitor)} instead + * @deprecated Use {@link IJavaFile#getWorkingCopy(WorkingCopyOwner, IProgressMonitor)} instead */ IJavaElement getWorkingCopy(IProgressMonitor monitor, IBufferFactory factory) throws JavaModelException; /** Index: model/org/eclipse/jdt/internal/core/SourceRefElement.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceRefElement.java,v retrieving revision 1.46 diff -u -r1.46 SourceRefElement.java --- model/org/eclipse/jdt/internal/core/SourceRefElement.java 24 Nov 2005 12:14:48 -0000 1.46 +++ model/org/eclipse/jdt/internal/core/SourceRefElement.java 14 Nov 2006 16:16:44 -0000 @@ -151,6 +151,12 @@ String token = memento.nextToken(); return getHandleFromMemento(token, memento, owner); } +/** + * @see IMember + */ +public IJavaFile getJavaFile() { + return ((JavaElement)getParent()).getJavaFile(); +} /* * @see IMember#getOccurrenceCount() */ Index: model/org/eclipse/jdt/internal/core/CompilationUnit.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CompilationUnit.java,v retrieving revision 1.234 diff -u -r1.234 CompilationUnit.java --- model/org/eclipse/jdt/internal/core/CompilationUnit.java 6 Nov 2006 14:13:45 -0000 1.234 +++ model/org/eclipse/jdt/internal/core/CompilationUnit.java 14 Nov 2006 16:16:44 -0000 @@ -713,6 +713,12 @@ System.arraycopy(elements, 0, imports, 0, length); return imports; } +/* + * @see IMember + */ +public IJavaFile getJavaFile() { + return this; +} /** * @see org.eclipse.jdt.internal.compiler.env.ICompilationUnit#getMainTypeName() */ @@ -878,6 +884,12 @@ return getWorkingCopy(new WorkingCopyOwner() {/*non shared working copy*/}, null/*no problem requestor*/, monitor); } /** + * @see IJavaFile#getWorkingCopy(WorkingCopyOwner, IProblemRequestor) + */ +public ICompilationUnit getWorkingCopy(WorkingCopyOwner workingCopyOwner, IProgressMonitor monitor) throws JavaModelException { + return getWorkingCopy(workingCopyOwner, null, monitor); +} +/** * @see IWorkingCopy#getWorkingCopy(IProgressMonitor, IBufferFactory, IProblemRequestor) * @deprecated */ Index: model/org/eclipse/jdt/internal/core/ClassFile.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ClassFile.java,v retrieving revision 1.128 diff -u -r1.128 ClassFile.java --- model/org/eclipse/jdt/internal/core/ClassFile.java 6 Nov 2006 14:13:45 -0000 1.128 +++ model/org/eclipse/jdt/internal/core/ClassFile.java 14 Nov 2006 16:16:44 -0000 @@ -239,6 +239,9 @@ } return elt; } +public IType findPrimaryType() { + return getType(); +} public String getAttachedJavadoc(IProgressMonitor monitor) throws JavaModelException { return this.getType().getAttachedJavadoc(monitor); } @@ -327,6 +330,12 @@ return this; } /** + * @see IMember + */ +public IJavaFile getJavaFile() { + return this; +} +/** * A class file has a corresponding resource unless it is contained * in a jar. * Index: model/org/eclipse/jdt/internal/core/JavaElement.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaElement.java,v retrieving revision 1.123 diff -u -r1.123 JavaElement.java --- model/org/eclipse/jdt/internal/core/JavaElement.java 20 Oct 2006 18:10:51 -0000 1.123 +++ model/org/eclipse/jdt/internal/core/JavaElement.java 14 Nov 2006 16:16:44 -0000 @@ -293,6 +293,12 @@ * contribution to a memento. */ protected abstract char getHandleMementoDelimiter(); + /* (non-Javadoc) + * @see IMember#getJavaFile() + */ + public IJavaFile getJavaFile() { + return null; + } /** * @see IJavaElement */ Index: dom/org/eclipse/jdt/core/dom/ASTParser.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTParser.java,v retrieving revision 1.65 diff -u -r1.65 ASTParser.java --- dom/org/eclipse/jdt/core/dom/ASTParser.java 23 Jun 2006 13:44:54 -0000 1.65 +++ dom/org/eclipse/jdt/core/dom/ASTParser.java 14 Nov 2006 16:16:42 -0000 @@ -17,6 +17,7 @@ import org.eclipse.jdt.core.IClassFile; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; +import org.eclipse.jdt.core.IJavaFile; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; @@ -154,14 +155,9 @@ private char[] rawSource = null; /** - * Java mode compilation unit supplying the source. + * Java model class file or compilation unit supplying the source. */ - private ICompilationUnit compilationUnitSource = null; - - /** - * Java model class file supplying the source. - */ - private IClassFile classFileSource = null; + private IJavaFile javaFileSource = null; /** * Character-based offset into the source string where parsing is to @@ -218,8 +214,7 @@ private void initializeDefaults() { this.astKind = K_COMPILATION_UNIT; this.rawSource = null; - this.classFileSource = null; - this.compilationUnitSource = null; + this.javaFileSource = null; this.resolveBindings = false; this.sourceLength = -1; this.sourceOffset = 0; @@ -452,9 +447,8 @@ */ public void setSource(char[] source) { this.rawSource = source; - // clear the others - this.compilationUnitSource = null; - this.classFileSource = null; + // clear the other + this.javaFileSource = null; } /** @@ -467,16 +461,7 @@ * is to be parsed, or null if none */ public void setSource(ICompilationUnit source) { - this.compilationUnitSource = source; - // clear the others - this.rawSource = null; - this.classFileSource = null; - if (source != null) { - this.project = source.getJavaProject(); - Map options = this.project.getOptions(true); - options.remove(JavaCore.COMPILER_TASK_TAGS); // no need to parse task tags - this.compilerOptions = options; - } + setSource((IJavaFile) source); } /** @@ -491,10 +476,25 @@ * is to be parsed, or null if none */ public void setSource(IClassFile source) { - this.classFileSource = source; - // clear the others + setSource((IJavaFile) source); + } + + /** + * Sets the source code to be parsed. + *

    This method automatically sets the project (and compiler + * options) based on the given compilation unit of class file, in a manner + * equivalent to setProject(source.getJavaProject()).

    + *

    If the source is a class file without source attachment, the creation of the + * ast will fail with an IllegalStateException.

    + * + * @param source the Java model compilation unit or class file whose corresponding source code + * is to be parsed, or null if none + * @since 3.3 + */ + public void setSource(IJavaFile source) { + this.javaFileSource = source; + // clear the other this.rawSource = null; - this.compilationUnitSource = null; if (source != null) { this.project = source.getJavaProject(); Map options = this.project.getOptions(true); @@ -623,8 +623,7 @@ if (monitor != null) monitor.beginTask("", 1); //$NON-NLS-1$ try { if ((this.rawSource == null) - && (this.compilationUnitSource == null) - && (this.classFileSource == null)) { + && (this.javaFileSource == null)) { throw new IllegalStateException("source not specified"); //$NON-NLS-1$ } result = internalCreateAST(monitor); @@ -782,22 +781,22 @@ try { NodeSearcher searcher = null; org.eclipse.jdt.internal.compiler.env.ICompilationUnit sourceUnit = null; - IJavaElement element = null; - if (this.compilationUnitSource != null) { - sourceUnit = (org.eclipse.jdt.internal.compiler.env.ICompilationUnit) this.compilationUnitSource; - // use a BasicCompilation that caches the source instead of using the compilationUnitSource directly + IJavaFile javaFile = null; + if (this.javaFileSource instanceof ICompilationUnit) { + sourceUnit = (org.eclipse.jdt.internal.compiler.env.ICompilationUnit) this.javaFileSource; + // use a BasicCompilation that caches the source instead of using the javaFileSource directly // (if it is a working copy, the source can change between the parse and the AST convertion) // (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=75632) sourceUnit = new BasicCompilationUnit(sourceUnit.getContents(), sourceUnit.getPackageName(), new String(sourceUnit.getFileName()), this.project); - element = this.compilationUnitSource; - } else if (this.classFileSource != null) { + javaFile = this.javaFileSource; + } else if (this.javaFileSource instanceof IClassFile) { try { - String sourceString = this.classFileSource.getSource(); + String sourceString = this.javaFileSource.getSource(); if (sourceString == null) { throw new IllegalStateException(); } - PackageFragment packageFragment = (PackageFragment) this.classFileSource.getParent(); - BinaryType type = (BinaryType) this.classFileSource.getType(); + PackageFragment packageFragment = (PackageFragment) this.javaFileSource.getParent(); + BinaryType type = (BinaryType) this.javaFileSource.findPrimaryType(); IBinaryType binaryType = (IBinaryType) type.getElementInfo(); // file name is used to recreate the Java element, so it has to be the toplevel .class file name char[] fileName = binaryType.getFileName(); @@ -811,7 +810,7 @@ fileName = newFileName; } sourceUnit = new BasicCompilationUnit(sourceString.toCharArray(), Util.toCharArrays(packageFragment.names), new String(fileName), this.project); - element = this.classFileSource; + javaFile = this.javaFileSource; } catch(JavaModelException e) { // an error occured accessing the java element throw new IllegalStateException(); @@ -859,10 +858,10 @@ this.apiLevel, this.compilerOptions, needToResolveBindings, - this.compilationUnitSource == null ? this.workingCopyOwner : this.compilationUnitSource.getOwner(), + ! (this.javaFileSource instanceof ICompilationUnit) ? this.workingCopyOwner : ((ICompilationUnit) this.javaFileSource).getOwner(), needToResolveBindings ? new DefaultBindingResolver.BindingTables() : null, monitor); - result.setJavaElement(element); + result.setJavaElement(javaFile); return result; } finally { if (compilationUnitDeclaration != null && this.resolveBindings) { Index: dom/org/eclipse/jdt/core/dom/CompilationUnit.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CompilationUnit.java,v retrieving revision 1.84 diff -u -r1.84 CompilationUnit.java --- dom/org/eclipse/jdt/core/dom/CompilationUnit.java 23 Oct 2006 16:43:55 -0000 1.84 +++ dom/org/eclipse/jdt/core/dom/CompilationUnit.java 14 Nov 2006 16:16:43 -0000 @@ -18,6 +18,7 @@ import java.util.Map; import org.eclipse.jdt.core.IJavaElement; +import org.eclipse.jdt.core.IJavaFile; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.internal.compiler.parser.Scanner; import org.eclipse.jface.text.IDocument; @@ -123,11 +124,11 @@ private DefaultCommentMapper commentMapper = null; /** - * The Java element (an org.eclipse.jdt.core.ICompilationUnit or an org.eclipse.jdt.core.IClassFile) - * this compilation unit was created from, or null if it was not created from a Java element. + * The Java file (an org.eclipse.jdt.core.ICompilationUnit or an org.eclipse.jdt.core.IClassFile) + * this compilation unit was created from, or null if it was not created from a Java file. * @since 3.1 */ - private IJavaElement element = null; + private IJavaFile javaFile = null; /** * The list of import declarations in textual order order; @@ -492,7 +493,18 @@ * @since 3.1 */ public IJavaElement getJavaElement() { - return this.element; + return this.javaFile; + } + + /** + * The Java file (an org.eclipse.jdt.core.ICompilationUnit or an org.eclipse.jdt.core.IClassFile) + * this compilation unit was created from, or null if it was not created from a Java file. + * + * @return the Java file this compilation unit was created from, or null if none + * @since 3.3 + */ + public IJavaFile getJavaFile() { + return this.javaFile; } /** @@ -940,7 +952,18 @@ * @since 3.1 */ void setJavaElement(IJavaElement element) { - this.element = element; + this.javaFile = (IJavaFile) element; + } + + /** + * Sets the Java file (an org.eclipse.jdt.core.ICompilationUnit or an org.eclipse.jdt.core.IClassFile) + * this compilation unit was created from, or null if it was not created from a Java element. + * + * @param javaFile the Java file this compilation unit was created from + * @since 3.3 + */ + void setJavaFile(IJavaFile javaFile) { + this.javaFile = javaFile; } /** Index: model/org/eclipse/jdt/core/IJavaFile.java =================================================================== RCS file: model/org/eclipse/jdt/core/IJavaFile.java diff -N model/org/eclipse/jdt/core/IJavaFile.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ model/org/eclipse/jdt/core/IJavaFile.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,95 @@ +/******************************************************************************* + * Copyright (c) 2006 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.core.runtime.IProgressMonitor; + + +/** + * Represents an entire Java file (either an ICompilationUnit + * or an IClassFile). + * + *

    + * This interface is not intended to be implemented by clients. + *

    + * + * @see ICompilationUnit + * @see IClassFile + * @since 3.3 + */ +public interface IJavaFile extends IJavaElement, IParent, IOpenable, ISourceReference, ICodeAssist { + +/** + * Finds the primary type of this Java file (that is, the type with the same name as the + * compilation unit, or the type of a class file), or null if no such a type exists. + * + * @return the found primary type of this Java file, or null if no such a type exists + */ +IType findPrimaryType(); + +/** + * Returns the smallest element within this Java file that + * includes the given source position (that is, a method, field, etc.), or + * null if there is no element other than the Java file + * itself at the given position, or if the given position is not + * within the source range of the source of this Java file. + * + * @param position a source position inside the Java file + * @return the innermost Java element enclosing a given source position or null + * if none (excluding the Java file). + * @throws JavaModelException if the Java file does not exist or if an + * exception occurs while accessing its corresponding resource + */ +IJavaElement getElementAt(int position) throws JavaModelException; + +/** + * Returns a shared working copy on this compilation unit or class file using the given working copy owner to create + * the buffer. If this is already a working copy of the given owner, the element itself is returned. + * This API can only answer an already existing working copy if it is based on the same + * original Java file AND was using the same working copy owner (that is, as defined by {@link Object#equals}). + *

    + * The life time of a shared working copy is as follows: + *

    + * So users of this method must discard exactly once the working copy. + *

    + * Note that the working copy owner will be used for the life time of the shared working copy, that is if the + * working copy is closed then reopened, this owner will be used. + * The buffer will be automatically initialized with the original's Java file content upon creation. + *

    + * When the shared working copy instance is created, an ADDED IJavaElementDelta is reported on this + * working copy. + *

    + * Since 2.1, 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. + *

    + * The problems of this working copy are reported to the {@link IProblemRequestor} configured by the + * {@link WorkingCopyOwner}. + *

    + * + * @param owner the working copy owner that creates a buffer that is used to get the content + * of the working copy + * @param monitor a progress monitor used to report progress while opening this compilation unit + * or null if no progress should be reported + * @throws JavaModelException if the contents of this element can + * not be determined. + * @return a new working copy of this Java file using the given owner to create + * the buffer, or this Java file if it is already a working copy + */ +ICompilationUnit getWorkingCopy(WorkingCopyOwner owner, IProgressMonitor monitor) throws JavaModelException; + +}