X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/CompilationUnit.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/CompilationUnit.java index c1d6b1b..9bc011a 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/CompilationUnit.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/CompilationUnit.java @@ -16,7 +16,6 @@ import java.util.Map; import net.sourceforge.phpdt.core.IBuffer; import net.sourceforge.phpdt.core.IBufferFactory; -import net.sourceforge.phpdt.core.ICodeAssist; import net.sourceforge.phpdt.core.ICompilationUnit; import net.sourceforge.phpdt.core.IImportContainer; import net.sourceforge.phpdt.core.IImportDeclaration; @@ -61,1293 +60,1478 @@ import org.eclipse.core.runtime.Path; */ public class CompilationUnit extends Openable implements ICompilationUnit, - net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit { - public WorkingCopyOwner owner; - /** - * Constructs a handle to a compilation unit with the given name in the specified package for the specified owner - * - * @exception IllegalArgumentException - * if the name of the compilation unit does not end with ".java" - */ - protected CompilationUnit(PackageFragment parent, String name, WorkingCopyOwner owner) { - super(parent, name); - this.owner = owner; - } - - /** - * Accepts the given visitor onto the parsed tree of this compilation unit, after having runned the name resolution. The visitor's - * corresponding visit method is called with the corresponding parse tree. If the visitor returns true, - * this method visits this parse node's members. - * - * @param visitor - * the visitor - * @exception JavaModelException - * if this method fails. Reasons include: - * - */ - //public void accept(IAbstractSyntaxTreeVisitor visitor) throws JavaModelException { - // CompilationUnitVisitor.visit(this, visitor); - //} - /* - * @see ICompilationUnit#becomeWorkingCopy(IProblemRequestor, IProgressMonitor) - */ - public void becomeWorkingCopy(IProblemRequestor problemRequestor, IProgressMonitor monitor) throws JavaModelException { - JavaModelManager manager = JavaModelManager.getJavaModelManager(); - JavaModelManager.PerWorkingCopyInfo perWorkingCopyInfo = manager.getPerWorkingCopyInfo(this, false/* don't create */, - true /* record usage */, null/* no problem requestor needed */); - if (perWorkingCopyInfo == null) { - // close cu and its children - close(); - - BecomeWorkingCopyOperation operation = new BecomeWorkingCopyOperation(this, problemRequestor); - operation.runOperation(monitor); - } - } - - //protected void buildStructure(OpenableElementInfo info, IProgressMonitor monitor) throws JavaModelException { - // - // if (monitor != null && monitor.isCanceled()) return; - // - // // remove existing (old) infos - // removeInfo(); - // - // HashMap newElements = new HashMap(11); - // info.setIsStructureKnown(generateInfos(info, monitor, newElements, getResource())); - // JavaModelManager.getJavaModelManager().getElementsOutOfSynchWithBuffers().remove(this); - // for (Iterator iter = newElements.keySet().iterator(); iter.hasNext();) { - // IJavaElement key = (IJavaElement) iter.next(); - // Object value = newElements.get(key); - // JavaModelManager.getJavaModelManager().putInfo(key, value); - // } - // // add the info for this at the end, to ensure that a getInfo cannot reply null in case the LRU cache needs - // // to be flushed. Might lead to performance issues. - // // see PR 1G2K5S7: ITPJCORE:ALL - NPE when accessing source for a binary type - // JavaModelManager.getJavaModelManager().putInfo(this, info); - //} - protected boolean buildStructure(OpenableElementInfo info, final IProgressMonitor pm, Map newElements, - IResource underlyingResource) throws JavaModelException { - - // check if this compilation unit can be opened - if (!isWorkingCopy()) { // no check is done on root kind or exclusion pattern for working copies - if ( // ((IPackageFragment)getParent()).getKind() == IPackageFragmentRoot.K_BINARY|| - !isValidCompilationUnit() || !underlyingResource.isAccessible()) { - throw newNotPresentException(); - } - } - - // prevents reopening of non-primary working copies (they are closed when they are discarded and should not be reopened) - if (!isPrimary() && getPerWorkingCopyInfo() == null) { - throw newNotPresentException(); - } - - CompilationUnitElementInfo unitInfo = (CompilationUnitElementInfo) info; - - // get buffer contents - IBuffer buffer = getBufferManager().getBuffer(CompilationUnit.this); - if (buffer == null) { - buffer = openBuffer(pm, unitInfo); // open buffer independently from the info, since we are building the info - } - final char[] contents = buffer == null ? null : buffer.getCharacters(); - - // generate structure and compute syntax problems if needed - CompilationUnitStructureRequestor requestor = new CompilationUnitStructureRequestor(this, unitInfo, newElements); - JavaModelManager.PerWorkingCopyInfo perWorkingCopyInfo = getPerWorkingCopyInfo(); - IJavaProject project = getJavaProject(); - boolean computeProblems = JavaProject.hasJavaNature(project.getProject()) && perWorkingCopyInfo != null - && perWorkingCopyInfo.isActive(); - IProblemFactory problemFactory = new DefaultProblemFactory(); - Map options = project.getOptions(true); - - if (underlyingResource == null) { - underlyingResource = getResource(); - } - - SourceElementParser parser = new SourceElementParser(requestor, problemFactory, - new CompilerOptions(options)); - //, true/*report local declarations*/); - requestor.parser = parser; - CompilationUnitDeclaration unit = parser.parseCompilationUnit( - new net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit() { - public char[] getContents() { - return contents; - } - - public char[] getMainTypeName() { - return CompilationUnit.this.getMainTypeName(); - } - - public char[][] getPackageName() { - return CompilationUnit.this.getPackageName(); - } - - public char[] getFileName() { - return CompilationUnit.this.getFileName(); - } - - public IResource getResource() { - return CompilationUnit.this.getResource(); - } - }, true /* full parse to find local elements */); - - // update timestamp (might be IResource.NULL_STAMP if original does not exist) - - unitInfo.timestamp = ((IFile) underlyingResource).getModificationStamp(); - // compute other problems if needed - CompilationUnitDeclaration compilationUnitDeclaration = null; - try { - if (computeProblems) { - perWorkingCopyInfo.beginReporting(); - compilationUnitDeclaration = CompilationUnitProblemFinder.process(unit, this, contents, parser, this.owner, - perWorkingCopyInfo, problemFactory, false/* don't cleanup cu */, pm); - perWorkingCopyInfo.endReporting(); - } - - // if (info instanceof ASTHolderCUInfo) { - // int astLevel = ((ASTHolderCUInfo) info).astLevel; - // net.sourceforge.phpdt.core.dom.CompilationUnit cu = AST.convertCompilationUnit(astLevel, unit, contents, options, pm); - // ((ASTHolderCUInfo) info).ast = cu; - // } - } finally { - if (compilationUnitDeclaration != null) { - compilationUnitDeclaration.cleanUp(); - } - } - - return unitInfo.isStructureKnown(); - } - - ///** - // * @see ICodeAssist#codeComplete(int, ICompletionRequestor) - // */ - //public void codeComplete(int offset, ICompletionRequestor requestor) throws JavaModelException { - // codeComplete(this, isWorkingCopy() ? (net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit) getOriginalElement() : this, - // offset, requestor); - //} - /** - * @see ICodeAssist#codeSelect(int, int) - */ - //public IJavaElement[] codeSelect(int offset, int length) throws JavaModelException { - // return super.codeSelect(this, offset, length); - //} - /** - * @see IWorkingCopy#commit(boolean, IProgressMonitor) - */ - public void commit(boolean force, IProgressMonitor monitor) throws JavaModelException { - commitWorkingCopy(force, monitor); - // throw new JavaModelException(new JavaModelStatus(IJavaModelStatusConstants.INVALID_ELEMENT_TYPES, this)); - } - - /** - * @see ICompilationUnit#commitWorkingCopy(boolean, IProgressMonitor) - */ - public void commitWorkingCopy(boolean force, IProgressMonitor monitor) throws JavaModelException { - CommitWorkingCopyOperation op = new CommitWorkingCopyOperation(this, force); - op.runOperation(monitor); - } - - /** - * @see ISourceManipulation#copy(IJavaElement, IJavaElement, String, boolean, IProgressMonitor) - */ - public void copy(IJavaElement container, IJavaElement sibling, String rename, boolean force, IProgressMonitor monitor) - throws JavaModelException { - if (container == null) { - throw new IllegalArgumentException(Util.bind("operation.nullContainer")); //$NON-NLS-1$ - } - IJavaElement[] elements = new IJavaElement[] { this }; - IJavaElement[] containers = new IJavaElement[] { container }; - String[] renamings = null; - if (rename != null) { - renamings = new String[] { rename }; - } - getJavaModel().copy(elements, containers, null, renamings, force, monitor); - } - - /** - * Returns a new element info for this element. - */ - protected Object createElementInfo() { - return new CompilationUnitElementInfo(); - } - - ///** - // * @see ICompilationUnit#createImport(String, IJavaElement, IProgressMonitor) - // */ - //public IImportDeclaration createImport(String name, IJavaElement sibling, IProgressMonitor monitor) throws JavaModelException { - // CreateImportOperation op = new CreateImportOperation(name, this); - // if (sibling != null) { - // op.createBefore(sibling); - // } - // runOperation(op, monitor); - // return getImport(name); - //} - /** - * @see ICompilationUnit#createPackageDeclaration(String, IProgressMonitor) - */ - public IPackageDeclaration createPackageDeclaration(String name, IProgressMonitor monitor) throws JavaModelException { - - CreatePackageDeclarationOperation op = new CreatePackageDeclarationOperation(name, this); - runOperation(op, monitor); - return getPackageDeclaration(name); - } - - ///** - // * @see ICompilationUnit#createType(String, IJavaElement, boolean, IProgressMonitor) - // */ - //public IType createType(String content, IJavaElement sibling, boolean force, IProgressMonitor monitor) throws - // JavaModelException { - // if (!exists()) { - // //autogenerate this compilation unit - // IPackageFragment pkg = (IPackageFragment) getParent(); - // String source = ""; //$NON-NLS-1$ - // if (pkg.getElementName().length() > 0) { - // //not the default package...add the package declaration - // source = "package " + pkg.getElementName() + ";" + net.sourceforge.phpdt.internal.compiler.util.ProjectPrefUtil.LINE_SEPARATOR + - // net.sourceforge.phpdt.internal.compiler.util.ProjectPrefUtil.LINE_SEPARATOR; //$NON-NLS-1$ //$NON-NLS-2$ - // } - // CreateCompilationUnitOperation op = new CreateCompilationUnitOperation(pkg, fName, source, force); - // runOperation(op, monitor); - // } - // CreateTypeOperation op = new CreateTypeOperation(this, content, force); - // if (sibling != null) { - // op.createBefore(sibling); - // } - // runOperation(op, monitor); - // return (IType) op.getResultElements()[0]; - //} - /** - * @see ISourceManipulation#delete(boolean, IProgressMonitor) - */ - public void delete(boolean force, IProgressMonitor monitor) throws JavaModelException { - IJavaElement[] elements = new IJavaElement[] { this }; - getJavaModel().delete(elements, force, monitor); - } - - /** - * @see IWorkingCopy#destroy() - * @deprecated - */ - public void destroy() { - try { - discardWorkingCopy(); - } catch (JavaModelException e) { - e.printStackTrace(); - } - } - - /* - * @see ICompilationUnit#discardWorkingCopy - */ - public void discardWorkingCopy() throws JavaModelException { - // discard working copy and its children - DiscardWorkingCopyOperation op = new DiscardWorkingCopyOperation(this); - op.runOperation(null); - } - - /** - * Returns true if this handle represents the same Java element as the given handle. - * - * @see Object#equals(java.lang.Object) - */ - public boolean equals(Object obj) { - if (!(obj instanceof CompilationUnit)) - return false; - CompilationUnit other = (CompilationUnit) obj; - return this.owner.equals(other.owner) && super.equals(obj); - } - - /** - * @see JavaElement#equalsDOMNode(IDOMNode) - */ - protected boolean equalsDOMNode(IDOMNode node) throws JavaModelException { - String name = getElementName(); - if (node.getNodeType() == IDOMNode.COMPILATION_UNIT && name != null) { - String nodeName = node.getName(); - if (nodeName == null) + net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit { + public WorkingCopyOwner owner; + + /** + * Constructs a handle to a compilation unit with the given name in the + * specified package for the specified owner + * + * @exception IllegalArgumentException + * if the name of the compilation unit does not end with + * ".java" + */ + protected CompilationUnit(PackageFragment parent, String name, + WorkingCopyOwner owner) { + super(parent, name); + this.owner = owner; + } + + /** + * Accepts the given visitor onto the parsed tree of this compilation unit, + * after having runned the name resolution. The visitor's corresponding + * visit method is called with the corresponding parse tree. + * If the visitor returns true, this method visits this + * parse node's members. + * + * @param visitor + * the visitor + * @exception JavaModelException + * if this method fails. Reasons include: + * + */ + // public void accept(IAbstractSyntaxTreeVisitor visitor) throws + // JavaModelException { + // CompilationUnitVisitor.visit(this, visitor); + // } + /* + * @see ICompilationUnit#becomeWorkingCopy(IProblemRequestor, + * IProgressMonitor) + */ + public void becomeWorkingCopy(IProblemRequestor problemRequestor, + IProgressMonitor monitor) throws JavaModelException { + JavaModelManager manager = JavaModelManager.getJavaModelManager(); + JavaModelManager.PerWorkingCopyInfo perWorkingCopyInfo = manager + .getPerWorkingCopyInfo(this, false/* don't create */, + true /* record usage */, null/* + * no problem requestor + * needed + */); + if (perWorkingCopyInfo == null) { + // close cu and its children + close(); + + BecomeWorkingCopyOperation operation = new BecomeWorkingCopyOperation( + this, problemRequestor); + operation.runOperation(monitor); + } + } + + // protected void buildStructure(OpenableElementInfo info, IProgressMonitor + // monitor) throws JavaModelException { + // + // if (monitor != null && monitor.isCanceled()) return; + // + // // remove existing (old) infos + // removeInfo(); + // + // HashMap newElements = new HashMap(11); + // info.setIsStructureKnown(generateInfos(info, monitor, newElements, + // getResource())); + // JavaModelManager.getJavaModelManager().getElementsOutOfSynchWithBuffers().remove(this); + // for (Iterator iter = newElements.keySet().iterator(); iter.hasNext();) { + // IJavaElement key = (IJavaElement) iter.next(); + // Object value = newElements.get(key); + // JavaModelManager.getJavaModelManager().putInfo(key, value); + // } + // // add the info for this at the end, to ensure that a getInfo cannot + // reply null in case the LRU cache needs + // // to be flushed. Might lead to performance issues. + // // see PR 1G2K5S7: ITPJCORE:ALL - NPE when accessing source for a binary + // type + // JavaModelManager.getJavaModelManager().putInfo(this, info); + // } + protected boolean buildStructure(OpenableElementInfo info, + final IProgressMonitor pm, Map newElements, + IResource underlyingResource) throws JavaModelException { + + // check if this compilation unit can be opened + if (!isWorkingCopy()) { // no check is done on root kind or exclusion + // pattern for working copies + if ( // ((IPackageFragment)getParent()).getKind() == + // IPackageFragmentRoot.K_BINARY|| + !isValidCompilationUnit() || !underlyingResource.isAccessible()) { + throw newNotPresentException(); + } + } + + // prevents reopening of non-primary working copies (they are closed + // when they are discarded and should not be reopened) + if (!isPrimary() && getPerWorkingCopyInfo() == null) { + throw newNotPresentException(); + } + + CompilationUnitElementInfo unitInfo = (CompilationUnitElementInfo) info; + + // get buffer contents + IBuffer buffer = getBufferManager().getBuffer(CompilationUnit.this); + if (buffer == null) { + buffer = openBuffer(pm, unitInfo); // open buffer independently + // from the info, since we are + // building the info + } + final char[] contents = buffer == null ? null : buffer.getCharacters(); + + // generate structure and compute syntax problems if needed + CompilationUnitStructureRequestor requestor = new CompilationUnitStructureRequestor( + this, unitInfo, newElements); + JavaModelManager.PerWorkingCopyInfo perWorkingCopyInfo = getPerWorkingCopyInfo(); + IJavaProject project = getJavaProject(); + boolean computeProblems = JavaProject.hasJavaNature(project + .getProject()) + && perWorkingCopyInfo != null && perWorkingCopyInfo.isActive(); + IProblemFactory problemFactory = new DefaultProblemFactory(); + Map options = project.getOptions(true); + + if (underlyingResource == null) { + underlyingResource = getResource(); + } + + SourceElementParser parser = new SourceElementParser(requestor, + problemFactory, new CompilerOptions(options)); + // , true/*report local declarations*/); + requestor.parser = parser; + CompilationUnitDeclaration unit = parser + .parseCompilationUnit( + new net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit() { + public char[] getContents() { + return contents; + } + + public char[] getMainTypeName() { + return CompilationUnit.this.getMainTypeName(); + } + + public char[][] getPackageName() { + return CompilationUnit.this.getPackageName(); + } + + public char[] getFileName() { + return CompilationUnit.this.getFileName(); + } + + public IResource getResource() { + return CompilationUnit.this.getResource(); + } + }, true /* full parse to find local elements */); + + // update timestamp (might be IResource.NULL_STAMP if original does not + // exist) + + unitInfo.timestamp = ((IFile) underlyingResource) + .getModificationStamp(); + // compute other problems if needed + CompilationUnitDeclaration compilationUnitDeclaration = null; + try { + if (computeProblems) { + perWorkingCopyInfo.beginReporting(); + compilationUnitDeclaration = CompilationUnitProblemFinder + .process(unit, this, contents, parser, this.owner, + perWorkingCopyInfo, problemFactory, + false/* don't cleanup cu */, pm); + perWorkingCopyInfo.endReporting(); + } + + // if (info instanceof ASTHolderCUInfo) { + // int astLevel = ((ASTHolderCUInfo) info).astLevel; + // net.sourceforge.phpdt.core.dom.CompilationUnit cu = + // AST.convertCompilationUnit(astLevel, unit, contents, options, + // pm); + // ((ASTHolderCUInfo) info).ast = cu; + // } + } finally { + if (compilationUnitDeclaration != null) { + compilationUnitDeclaration.cleanUp(); + } + } + + return unitInfo.isStructureKnown(); + } + + // /** + // * @see ICodeAssist#codeComplete(int, ICompletionRequestor) + // */ + // public void codeComplete(int offset, ICompletionRequestor requestor) + // throws JavaModelException { + // codeComplete(this, isWorkingCopy() ? + // (net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit) + // getOriginalElement() : this, + // offset, requestor); + // } + /** + * @see ICodeAssist#codeSelect(int, int) + */ + // public IJavaElement[] codeSelect(int offset, int length) throws + // JavaModelException { + // return super.codeSelect(this, offset, length); + // } + /** + * @see IWorkingCopy#commit(boolean, IProgressMonitor) + */ + public void commit(boolean force, IProgressMonitor monitor) + throws JavaModelException { + commitWorkingCopy(force, monitor); + // throw new JavaModelException(new + // JavaModelStatus(IJavaModelStatusConstants.INVALID_ELEMENT_TYPES, + // this)); + } + + /** + * @see ICompilationUnit#commitWorkingCopy(boolean, IProgressMonitor) + */ + public void commitWorkingCopy(boolean force, IProgressMonitor monitor) + throws JavaModelException { + CommitWorkingCopyOperation op = new CommitWorkingCopyOperation(this, + force); + op.runOperation(monitor); + } + + /** + * @see ISourceManipulation#copy(IJavaElement, IJavaElement, String, + * boolean, IProgressMonitor) + */ + public void copy(IJavaElement container, IJavaElement sibling, + String rename, boolean force, IProgressMonitor monitor) + throws JavaModelException { + if (container == null) { + throw new IllegalArgumentException(Util + .bind("operation.nullContainer")); //$NON-NLS-1$ + } + IJavaElement[] elements = new IJavaElement[] { this }; + IJavaElement[] containers = new IJavaElement[] { container }; + String[] renamings = null; + if (rename != null) { + renamings = new String[] { rename }; + } + getJavaModel().copy(elements, containers, null, renamings, force, + monitor); + } + + /** + * Returns a new element info for this element. + */ + protected Object createElementInfo() { + return new CompilationUnitElementInfo(); + } + + // /** + // * @see ICompilationUnit#createImport(String, IJavaElement, + // IProgressMonitor) + // */ + // public IImportDeclaration createImport(String name, IJavaElement sibling, + // IProgressMonitor monitor) throws JavaModelException { + // CreateImportOperation op = new CreateImportOperation(name, this); + // if (sibling != null) { + // op.createBefore(sibling); + // } + // runOperation(op, monitor); + // return getImport(name); + // } + /** + * @see ICompilationUnit#createPackageDeclaration(String, IProgressMonitor) + */ + public IPackageDeclaration createPackageDeclaration(String name, + IProgressMonitor monitor) throws JavaModelException { + + CreatePackageDeclarationOperation op = new CreatePackageDeclarationOperation( + name, this); + runOperation(op, monitor); + return getPackageDeclaration(name); + } + + // /** + // * @see ICompilationUnit#createType(String, IJavaElement, boolean, + // IProgressMonitor) + // */ + // public IType createType(String content, IJavaElement sibling, boolean + // force, IProgressMonitor monitor) throws + // JavaModelException { + // if (!exists()) { + // //autogenerate this compilation unit + // IPackageFragment pkg = (IPackageFragment) getParent(); + // String source = ""; //$NON-NLS-1$ + // if (pkg.getElementName().length() > 0) { + // //not the default package...add the package declaration + // source = "package " + pkg.getElementName() + ";" + + // net.sourceforge.phpdt.internal.compiler.util.ProjectPrefUtil.LINE_SEPARATOR + // + + // net.sourceforge.phpdt.internal.compiler.util.ProjectPrefUtil.LINE_SEPARATOR; + // //$NON-NLS-1$ //$NON-NLS-2$ + // } + // CreateCompilationUnitOperation op = new + // CreateCompilationUnitOperation(pkg, fName, source, force); + // runOperation(op, monitor); + // } + // CreateTypeOperation op = new CreateTypeOperation(this, content, force); + // if (sibling != null) { + // op.createBefore(sibling); + // } + // runOperation(op, monitor); + // return (IType) op.getResultElements()[0]; + // } + /** + * @see ISourceManipulation#delete(boolean, IProgressMonitor) + */ + public void delete(boolean force, IProgressMonitor monitor) + throws JavaModelException { + IJavaElement[] elements = new IJavaElement[] { this }; + getJavaModel().delete(elements, force, monitor); + } + + /** + * @see IWorkingCopy#destroy() + * @deprecated + */ + public void destroy() { + try { + discardWorkingCopy(); + } catch (JavaModelException e) { + e.printStackTrace(); + } + } + + /* + * @see ICompilationUnit#discardWorkingCopy + */ + public void discardWorkingCopy() throws JavaModelException { + // discard working copy and its children + DiscardWorkingCopyOperation op = new DiscardWorkingCopyOperation(this); + op.runOperation(null); + } + + /** + * Returns true if this handle represents the same Java element as the given + * handle. + * + * @see Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + if (!(obj instanceof CompilationUnit)) + return false; + CompilationUnit other = (CompilationUnit) obj; + return this.owner.equals(other.owner) && super.equals(obj); + } + + /** + * @see JavaElement#equalsDOMNode(IDOMNode) + */ + protected boolean equalsDOMNode(IDOMNode node) throws JavaModelException { + String name = getElementName(); + if (node.getNodeType() == IDOMNode.COMPILATION_UNIT && name != null) { + String nodeName = node.getName(); + if (nodeName == null) + return false; + if (name.equals(nodeName)) { + return true; + } else { + // iterate through all the types inside the receiver and see if + // one of them can fit + IType[] types = getTypes(); + String typeNodeName = nodeName.substring(0, nodeName + .indexOf(".java")); //$NON-NLS-1$ + for (int i = 0, max = types.length; i < max; i++) { + if (types[i].getElementName().equals(typeNodeName)) { + return true; + } + } + } + } return false; - if (name.equals(nodeName)) { - return true; - } else { - // iterate through all the types inside the receiver and see if one of them can fit - IType[] types = getTypes(); - String typeNodeName = nodeName.substring(0, nodeName.indexOf(".java")); //$NON-NLS-1$ - for (int i = 0, max = types.length; i < max; i++) { - if (types[i].getElementName().equals(typeNodeName)) { - return true; - } + } + + /** + * @see IWorkingCopy#findElements(IJavaElement) + */ + public IJavaElement[] findElements(IJavaElement element) { + ArrayList children = new ArrayList(); + while (element != null + && element.getElementType() != IJavaElement.COMPILATION_UNIT) { + children.add(element); + element = element.getParent(); } - } - } - return false; - } - - /** - * @see IWorkingCopy#findElements(IJavaElement) - */ - public IJavaElement[] findElements(IJavaElement element) { - ArrayList children = new ArrayList(); - while (element != null && element.getElementType() != IJavaElement.COMPILATION_UNIT) { - children.add(element); - element = element.getParent(); - } - if (element == null) - return null; - IJavaElement currentElement = this; - for (int i = children.size() - 1; i >= 0; i--) { - IJavaElement child = (IJavaElement) children.get(i); - switch (child.getElementType()) { - // case IJavaElement.PACKAGE_DECLARATION: - // currentElement = ((ICompilationUnit)currentElement).getPackageDeclaration(child.getElementName()); - // break; - // case IJavaElement.IMPORT_CONTAINER: - // currentElement = ((ICompilationUnit)currentElement).getImportContainer(); - // break; - // case IJavaElement.IMPORT_DECLARATION: - // currentElement = ((IImportContainer)currentElement).getImport(child.getElementName()); - // break; - case IJavaElement.TYPE: - if (currentElement.getElementType() == IJavaElement.COMPILATION_UNIT) { - currentElement = ((ICompilationUnit) currentElement).getType(child.getElementName()); + if (element == null) + return null; + IJavaElement currentElement = this; + for (int i = children.size() - 1; i >= 0; i--) { + IJavaElement child = (IJavaElement) children.get(i); + switch (child.getElementType()) { + // case IJavaElement.PACKAGE_DECLARATION: + // currentElement = + // ((ICompilationUnit)currentElement).getPackageDeclaration(child.getElementName()); + // break; + // case IJavaElement.IMPORT_CONTAINER: + // currentElement = + // ((ICompilationUnit)currentElement).getImportContainer(); + // break; + // case IJavaElement.IMPORT_DECLARATION: + // currentElement = + // ((IImportContainer)currentElement).getImport(child.getElementName()); + // break; + case IJavaElement.TYPE: + if (currentElement.getElementType() == IJavaElement.COMPILATION_UNIT) { + currentElement = ((ICompilationUnit) currentElement) + .getType(child.getElementName()); + } else { + currentElement = ((IType) currentElement).getType(child + .getElementName()); + } + break; + // case IJavaElement.INITIALIZER: + // currentElement = + // ((IType)currentElement).getInitializer(((JavaElement)child).getOccurrenceCount()); + // break; + case IJavaElement.FIELD: + currentElement = ((IType) currentElement).getField(child + .getElementName()); + break; + case IJavaElement.METHOD: + return ((IType) currentElement).findMethods((IMethod) child); + } + + } + if (currentElement != null && currentElement.exists()) { + return new IJavaElement[] { currentElement }; } else { - currentElement = ((IType) currentElement).getType(child.getElementName()); + return null; + } + } + + /** + * @see IWorkingCopy#findPrimaryType() + */ + public IType findPrimaryType() { + String typeName = Signature.getQualifier(this.getElementName()); + IType primaryType = this.getType(typeName); + if (primaryType.exists()) { + return primaryType; } - break; - // case IJavaElement.INITIALIZER: - // currentElement = ((IType)currentElement).getInitializer(((JavaElement)child).getOccurrenceCount()); - // break; - case IJavaElement.FIELD: - currentElement = ((IType) currentElement).getField(child.getElementName()); - break; - case IJavaElement.METHOD: - return ((IType) currentElement).findMethods((IMethod) child); - } - - } - if (currentElement != null && currentElement.exists()) { - return new IJavaElement[] { currentElement }; - } else { - return null; - } - } - - /** - * @see IWorkingCopy#findPrimaryType() - */ - public IType findPrimaryType() { - String typeName = Signature.getQualifier(this.getElementName()); - IType primaryType = this.getType(typeName); - if (primaryType.exists()) { - return primaryType; - } - return null; - } - - /** - * @see IWorkingCopy#findSharedWorkingCopy(IBufferFactory) - * @deprecated - */ - public IJavaElement findSharedWorkingCopy(IBufferFactory factory) { - - // if factory is null, default factory must be used - if (factory == null) - factory = this.getBufferManager().getDefaultBufferFactory(); - - return findWorkingCopy(BufferFactoryWrapper.create(factory)); - } - - /** - * @see ICompilationUnit#findWorkingCopy(WorkingCopyOwner) - */ - public ICompilationUnit findWorkingCopy(WorkingCopyOwner workingCopyOwner) { - CompilationUnit cu = new CompilationUnit((PackageFragment) this.parent, getElementName(), workingCopyOwner); - if (workingCopyOwner == DefaultWorkingCopyOwner.PRIMARY) { - return cu; - } else { - // must be a working copy - JavaModelManager.PerWorkingCopyInfo perWorkingCopyInfo = cu.getPerWorkingCopyInfo(); - if (perWorkingCopyInfo != null) { - return perWorkingCopyInfo.getWorkingCopy(); - } else { return null; - } - } - } - - //protected boolean generateInfos(OpenableElementInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) - // throws JavaModelException { - // - //// if (getParent() instanceof JarPackageFragment) { - //// // ignore .java files in jar - //// throw newNotPresentException(); - //// } else { - // // put the info now, because getting the contents requires it - // JavaModelManager.getJavaModelManager().putInfo(this, info); - // CompilationUnitElementInfo unitInfo = (CompilationUnitElementInfo) info; - // - // // generate structure - // CompilationUnitStructureRequestor requestor = new CompilationUnitStructureRequestor(this, unitInfo, newElements); - // IProblemFactory factory = new DefaultProblemFactory(); - // SourceElementParser parser = new SourceElementParser(requestor, factory, new - // CompilerOptions(getJavaProject().getOptions(true))); - //// SourceElementParser parser = new SourceElementParser(requestor, factory); - // requestor.parser = parser; - // parser.parseCompilationUnit(this, false); - // if (isWorkingCopy()) { - // CompilationUnit original = (CompilationUnit) getOriginalElement(); - // // might be IResource.NULL_STAMP if original does not exist - // unitInfo.timestamp = ((IFile) original.getResource()).getModificationStamp(); - // } - // return unitInfo.isStructureKnown(); - //// } - //} - /** - * @see ICompilationUnit#getAllTypes() - */ - public IType[] getAllTypes() throws JavaModelException { - IJavaElement[] types = getTypes(); - int i; - ArrayList allTypes = new ArrayList(types.length); - ArrayList typesToTraverse = new ArrayList(types.length); - for (i = 0; i < types.length; i++) { - typesToTraverse.add(types[i]); - } - while (!typesToTraverse.isEmpty()) { - IType type = (IType) typesToTraverse.get(0); - typesToTraverse.remove(type); - allTypes.add(type); - types = type.getTypes(); - for (i = 0; i < types.length; i++) { - typesToTraverse.add(types[i]); - } - } - IType[] arrayOfAllTypes = new IType[allTypes.size()]; - allTypes.toArray(arrayOfAllTypes); - return arrayOfAllTypes; - } - - /** - * @see IMember#getCompilationUnit() - */ - public ICompilationUnit getCompilationUnit() { - return this; - } - - /** - * @see net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit#getContents() - */ - public char[] getContents() { - try { - IBuffer buffer = this.getBuffer(); - return buffer == null ? null : buffer.getCharacters(); - } catch (JavaModelException e) { - return CharOperation.NO_CHAR; - } - } - - /** - * A compilation unit has a corresponding resource unless it is contained in a jar. - * - * @see IJavaElement#getCorrespondingResource() - */ - public IResource getCorrespondingResource() throws JavaModelException { - IPackageFragmentRoot root = (IPackageFragmentRoot) getParent().getParent(); - if (root.isArchive()) { - return null; - } else { - return getUnderlyingResource(); - } - } - - /** - * @see ICompilationUnit#getElementAt(int) - */ - public IJavaElement getElementAt(int position) throws JavaModelException { - - IJavaElement e = getSourceElementAt(position); - if (e == this) { - return null; - } else { - return e; - } - } - - /** - * @see IJavaElement - */ - public int getElementType() { - return COMPILATION_UNIT; - } - - public char[] getFileName() { - return getElementName().toCharArray(); - } - /* - * @see JavaElement - */ - public IJavaElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner workingCopyOwner) { - switch (token.charAt(0)) { - case JEM_COUNT: - return getHandleUpdatingCountFromMemento(memento, workingCopyOwner); - case JEM_IMPORTDECLARATION: - JavaElement container = (JavaElement)getImportContainer(); - return container.getHandleFromMemento(token, memento, workingCopyOwner); - case JEM_PACKAGEDECLARATION: - String pkgName = memento.nextToken(); - JavaElement pkgDecl = (JavaElement)getPackageDeclaration(pkgName); - return pkgDecl.getHandleFromMemento(memento, workingCopyOwner); - case JEM_TYPE: - String typeName = memento.nextToken(); - JavaElement type = (JavaElement)getType(typeName); - return type.getHandleFromMemento(memento, workingCopyOwner); - } - return null; - } - - /** - * @see JavaElement#getHandleMementoDelimiter() - */ - protected char getHandleMementoDelimiter() { - return JavaElement.JEM_COMPILATIONUNIT; - } - /** - * @see ICompilationUnit#getImport(String) - */ - public IImportDeclaration getImport(String importName) { - return new ImportDeclaration((ImportContainer)getImportContainer(), importName); - } - /** - * @see ICompilationUnit#getImportContainer() - */ - public IImportContainer getImportContainer() { - return new ImportContainer(this); - } - - - /** - * @see ICompilationUnit#getImports() - */ - public IImportDeclaration[] getImports() throws JavaModelException { - IImportContainer container= getImportContainer(); - if (container.exists()) { - IJavaElement[] elements= container.getChildren(); - IImportDeclaration[] imprts= new IImportDeclaration[elements.length]; - System.arraycopy(elements, 0, imprts, 0, elements.length); - return imprts; - } else if (!exists()) { - throw newNotPresentException(); - } else { - return new IImportDeclaration[0]; - } - - } - - /** - * @see net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit#getMainTypeName() - */ - public char[] getMainTypeName() { - String name = getElementName(); - //remove the .java - name = name.substring(0, name.length() - 5); - return name.toCharArray(); - } - - /** - * @see IWorkingCopy#getOriginal(IJavaElement) - * @deprecated - */ - public IJavaElement getOriginal(IJavaElement workingCopyElement) { - // backward compatibility - if (!isWorkingCopy()) - return null; - CompilationUnit cu = (CompilationUnit) workingCopyElement.getAncestor(COMPILATION_UNIT); - if (cu == null || !this.owner.equals(cu.owner)) { - return null; - } - - return workingCopyElement.getPrimaryElement(); - } - - /** - * @see IWorkingCopy#getOriginalElement() - * @deprecated - */ - public IJavaElement getOriginalElement() { - // backward compatibility - if (!isWorkingCopy()) - return null; - - return getPrimaryElement(); - } - - /* - * @see ICompilationUnit#getOwner() - */ - public WorkingCopyOwner getOwner() { - return isPrimary() || !isWorkingCopy() ? null : this.owner; - } - - /** - * @see ICompilationUnit#getPackageDeclaration(String) - */ - public IPackageDeclaration getPackageDeclaration(String name) { - return new PackageDeclaration(this, name); - } - - /** - * @see ICompilationUnit#getPackageDeclarations() - */ - public IPackageDeclaration[] getPackageDeclarations() throws JavaModelException { - ArrayList list = getChildrenOfType(PACKAGE_DECLARATION); - IPackageDeclaration[] array = new IPackageDeclaration[list.size()]; - list.toArray(array); - return array; - } - - /** - * @see net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit#getPackageName() - */ - public char[][] getPackageName() { - return null; - } - - /** - * @see IJavaElement#getPath() - */ - public IPath getPath() { - PackageFragmentRoot root = this.getPackageFragmentRoot(); - if (root.isArchive()) { - return root.getPath(); - } else { - return this.getParent().getPath().append(this.getElementName()); - } - } - - /* - * Returns the per working copy info for the receiver, or null if none exist. Note: the use count of the per working copy info is - * NOT incremented. - */ - public JavaModelManager.PerWorkingCopyInfo getPerWorkingCopyInfo() { - return JavaModelManager.getJavaModelManager().getPerWorkingCopyInfo(this, false/* don't create */, false/* don't record usage */, - null/* no problem requestor needed */); - } - - /* - * @see ICompilationUnit#getPrimary() - */ - public ICompilationUnit getPrimary() { - return (ICompilationUnit) getPrimaryElement(true); - } - - /* - * @see JavaElement#getPrimaryElement(boolean) - */ - public IJavaElement getPrimaryElement(boolean checkOwner) { - if (checkOwner && isPrimary()) - return this; - return new CompilationUnit((PackageFragment) getParent(), getElementName(), DefaultWorkingCopyOwner.PRIMARY); - } - - /** - * @see IJavaElement#getResource() - */ - public IResource getResource() { - PackageFragmentRoot root = this.getPackageFragmentRoot(); - if (root.isArchive()) { - return root.getResource(); - } else { - return ((IContainer) this.getParent().getResource()).getFile(new Path(this.getElementName())); - } - } - - /** - * @see ISourceReference#getSource() - */ - public String getSource() throws JavaModelException { - IBuffer buffer = getBuffer(); - if (buffer == null) - return ""; //$NON-NLS-1$ - return buffer.getContents(); - } - - /** - * @see ISourceReference#getSourceRange() - */ - public ISourceRange getSourceRange() throws JavaModelException { - return ((CompilationUnitElementInfo) getElementInfo()).getSourceRange(); - } - - /** - * @see ICompilationUnit#getType(String) - */ - public IType getType(String name) { - return new SourceType(this, name); - } - - /** - * @see ICompilationUnit#getTypes() - */ - public IType[] getTypes() throws JavaModelException { - ArrayList list = getChildrenOfType(TYPE); - IType[] array = new IType[list.size()]; - list.toArray(array); - return array; - } - - /** - * @see IJavaElement - */ - public IResource getUnderlyingResource() throws JavaModelException { - if (isWorkingCopy() && !isPrimary()) - return null; - return super.getUnderlyingResource(); - } - - ///** - // * @see IWorkingCopy#getSharedWorkingCopy(IProgressMonitor, IBufferFactory, IProblemRequestor) - // */ - //public IJavaElement getSharedWorkingCopy(IProgressMonitor pm, IBufferFactory factory, IProblemRequestor problemRequestor) - // throws JavaModelException { - // - // // if factory is null, default factory must be used - // if (factory == null) factory = this.getBufferManager().getDefaultBufferFactory(); - // - // JavaModelManager manager = JavaModelManager.getJavaModelManager(); - // - // // In order to be shared, working copies have to denote the same compilation unit - // // AND use the same buffer factory. - // // Assuming there is a little set of buffer factories, then use a 2 level Map cache. - // Map sharedWorkingCopies = manager.sharedWorkingCopies; - // - // Map perFactoryWorkingCopies = (Map) sharedWorkingCopies.get(factory); - // if (perFactoryWorkingCopies == null){ - // perFactoryWorkingCopies = new HashMap(); - // sharedWorkingCopies.put(factory, perFactoryWorkingCopies); - // } - // WorkingCopy workingCopy = (WorkingCopy)perFactoryWorkingCopies.get(this); - // if (workingCopy != null) { - // workingCopy.useCount++; - // - // if (SHARED_WC_VERBOSE) { - // System.out.println("Incrementing use count of shared working copy " + workingCopy.toStringWithAncestors()); //$NON-NLS-1$ - // } - // - // return workingCopy; - // } else { - // CreateWorkingCopyOperation op = new CreateWorkingCopyOperation(this, perFactoryWorkingCopies, factory, problemRequestor); - // runOperation(op, pm); - // return op.getResultElements()[0]; - // } - //} - ///** - // * @see IWorkingCopy#getWorkingCopy() - // */ - //public IJavaElement getWorkingCopy() throws JavaModelException { - // return this.getWorkingCopy(null, null, null); - //} - // - ///** - // * @see IWorkingCopy#getWorkingCopy(IProgressMonitor, IBufferFactory, IProblemRequestor) - // */ - //public IJavaElement getWorkingCopy(IProgressMonitor pm, IBufferFactory factory, IProblemRequestor problemRequestor) throws - // JavaModelException { - // CreateWorkingCopyOperation op = new CreateWorkingCopyOperation(this, null, factory, problemRequestor); - // runOperation(op, pm); - // return op.getResultElements()[0]; - //} - /** - * @see IWorkingCopy#getSharedWorkingCopy(IProgressMonitor, IBufferFactory, IProblemRequestor) - * @deprecated - */ - public IJavaElement getSharedWorkingCopy(IProgressMonitor pm, IBufferFactory factory, IProblemRequestor problemRequestor) - throws JavaModelException { - - // if factory is null, default factory must be used - if (factory == null) - factory = this.getBufferManager().getDefaultBufferFactory(); - - return getWorkingCopy(BufferFactoryWrapper.create(factory), problemRequestor, pm); - } - - /** - * @see IWorkingCopy#getWorkingCopy() - * @deprecated - */ - public IJavaElement getWorkingCopy() throws JavaModelException { - return getWorkingCopy(null); - } - - /** - * @see ICompilationUnit#getWorkingCopy(IProgressMonitor) - */ - public ICompilationUnit getWorkingCopy(IProgressMonitor monitor) throws JavaModelException { - return getWorkingCopy(new WorkingCopyOwner() {/* non shared working copy */ - }, null/* no problem requestor */, monitor); - } - - /** - * @see IWorkingCopy#getWorkingCopy(IProgressMonitor, IBufferFactory, IProblemRequestor) - * @deprecated - */ - public IJavaElement getWorkingCopy(IProgressMonitor monitor, IBufferFactory factory, IProblemRequestor problemRequestor) - throws JavaModelException { - return getWorkingCopy(BufferFactoryWrapper.create(factory), problemRequestor, monitor); - } - - /** - * @see ICompilationUnit#getWorkingCopy(WorkingCopyOwner, IProblemRequestor, IProgressMonitor) - */ - public ICompilationUnit getWorkingCopy(WorkingCopyOwner workingCopyOwner, IProblemRequestor problemRequestor, - IProgressMonitor monitor) throws JavaModelException { - if (!isPrimary()) - return this; - - JavaModelManager manager = JavaModelManager.getJavaModelManager(); - - CompilationUnit workingCopy = new CompilationUnit((PackageFragment) getParent(), getElementName(), workingCopyOwner); - JavaModelManager.PerWorkingCopyInfo perWorkingCopyInfo = manager.getPerWorkingCopyInfo(workingCopy, false/* don't create */, - true/* record usage */, null/* not used since don't create */); - if (perWorkingCopyInfo != null) { - return perWorkingCopyInfo.getWorkingCopy(); // return existing handle instead of the one created above - } - BecomeWorkingCopyOperation op = new BecomeWorkingCopyOperation(workingCopy, problemRequestor); - op.runOperation(monitor); - return workingCopy; - } - - /** - * If I am not open, return true to avoid parsing. - * - * @see IParent#hasChildren() - */ - public boolean hasChildren() throws JavaModelException { - // if (isOpen()) { - // return getChildren().length > 0; - // } else { - // return true; - // } - return false; - } - - /** - * @see Openable#hasBuffer() - */ - protected boolean hasBuffer() { - return true; - } - - /* - * @see ICompilationUnit#hasResourceChanged() - */ - public boolean hasResourceChanged() { - if (!isWorkingCopy()) - return false; - - // if resource got deleted, then #getModificationStamp() will answer IResource.NULL_STAMP, which is always different from the - // cached - // timestamp - Object info = JavaModelManager.getJavaModelManager().getInfo(this); - if (info == null) - return false; - return ((CompilationUnitElementInfo) info).timestamp != getResource().getModificationStamp(); - } - - /** - * @see IWorkingCopy#isBasedOn(IResource) - * @deprecated - */ - public boolean isBasedOn(IResource resource) { - if (!isWorkingCopy()) - return false; - if (!getResource().equals(resource)) - return false; - return !hasResourceChanged(); - } - - /** - * @see IOpenable#isConsistent() - */ - public boolean isConsistent() { - return JavaModelManager.getJavaModelManager().getElementsOutOfSynchWithBuffers().get(this) == null; - } - - /** - * - * @see IOpenable - */ - public boolean isOpen() { - Object info = JavaModelManager.getJavaModelManager().getInfo(this); - return info != null && ((CompilationUnitElementInfo) info).isOpen(); - } - - public boolean isPrimary() { - return this.owner == DefaultWorkingCopyOwner.PRIMARY; - } - - /** - * @see Openable#isSourceElement() - */ - protected boolean isSourceElement() { - return true; - } - - protected boolean isValidCompilationUnit() { - IPackageFragmentRoot root = getPackageFragmentRoot(); - try { - if (root.getKind() != IPackageFragmentRoot.K_SOURCE) - return false; - } catch (JavaModelException e) { - return false; - } - // IResource resource = getResource(); - // if (resource != null) { - // char[][] inclusionPatterns = ((PackageFragmentRoot)root).fullInclusionPatternChars(); - // char[][] exclusionPatterns = ((PackageFragmentRoot)root).fullExclusionPatternChars(); - // if (ProjectPrefUtil.isExcluded(resource, inclusionPatterns, exclusionPatterns)) return false; - // } - if (!Util.isValidCompilationUnitName(getElementName())) - return false; - return true; - } - - /* - * @see ICompilationUnit#isWorkingCopy() - */ - public boolean isWorkingCopy() { - // For backward compatibility, non primary working copies are always returning true; in removal - // delta, clients can still check that element was a working copy before being discarded. - return !isPrimary() || getPerWorkingCopyInfo() != null; - } - - /** - * @see IOpenable#makeConsistent(IProgressMonitor) - */ - public void makeConsistent(IProgressMonitor monitor) throws JavaModelException { - makeConsistent(false/* don't create AST */, 0, monitor); - } - - public Object makeConsistent(boolean createAST, int astLevel, IProgressMonitor monitor) throws JavaModelException { - if (isConsistent()) - return null; - - // create a new info and make it the current info - // (this will remove the info and its children just before storing the new infos) - // if (createAST) { - // ASTHolderCUInfo info = new ASTHolderCUInfo(); - // info.astLevel = astLevel; - // openWhenClosed(info, monitor); - // net.sourceforge.phpdt.core.dom.CompilationUnit result = info.ast; - // info.ast = null; - // return result; - // } else { - openWhenClosed(createElementInfo(), monitor); - return null; - // } - } - - //public net.sourceforge.phpdt.core.dom.CompilationUnit makeConsistent(boolean createAST, int astLevel, IProgressMonitor monitor) - // throws JavaModelException { - // if (isConsistent()) return null; - // - // // create a new info and make it the current info - // // (this will remove the info and its children just before storing the new infos) - // if (createAST) { - // ASTHolderCUInfo info = new ASTHolderCUInfo(); - // info.astLevel = astLevel; - // openWhenClosed(info, monitor); - // net.sourceforge.phpdt.core.dom.CompilationUnit result = info.ast; - // info.ast = null; - // return result; - // } else { - // openWhenClosed(createElementInfo(), monitor); - // return null; - // } - //} - - /** - * @see ISourceManipulation#move(IJavaElement, IJavaElement, String, boolean, IProgressMonitor) - */ - public void move(IJavaElement container, IJavaElement sibling, String rename, boolean force, IProgressMonitor monitor) - throws JavaModelException { - if (container == null) { - throw new IllegalArgumentException(Util.bind("operation.nullContainer")); //$NON-NLS-1$ - } - IJavaElement[] elements = new IJavaElement[] { this }; - IJavaElement[] containers = new IJavaElement[] { container }; - - String[] renamings = null; - if (rename != null) { - renamings = new String[] { rename }; - } - getJavaModel().move(elements, containers, null, renamings, force, monitor); - } - - ///** - // * @see Openable#openBuffer(IProgressMonitor) - // */ - //protected IBuffer openBuffer(IProgressMonitor pm) throws JavaModelException { - // - // // create buffer - compilation units only use default buffer factory - // BufferManager bufManager = getBufferManager(); - // IBuffer buffer = getBufferFactory().createBuffer(this); - // if (buffer == null) return null; - // - // // set the buffer source - // if (buffer.getCharacters() == null){ - // IFile file = (IFile)this.getResource(); - // if (file == null || !file.exists()) throw newNotPresentException(); - // buffer.setContents(ProjectPrefUtil.getResourceContentsAsCharArray(file)); - // } - // - // // add buffer to buffer cache - // bufManager.addBuffer(buffer); - // - // // listen to buffer changes - // buffer.addBufferChangedListener(this); - // - // return buffer; - //} - /** - * @see Openable#openBuffer(IProgressMonitor, Object) - */ - protected IBuffer openBuffer(IProgressMonitor pm, Object info) throws JavaModelException { - - // create buffer - boolean isWorkingCopy = isWorkingCopy(); - IBuffer buffer = isWorkingCopy ? this.owner.createBuffer(this) : BufferManager.getDefaultBufferManager().createBuffer(this); - if (buffer == null) - return null; - - // set the buffer source - if (buffer.getCharacters() == null) { - if (isWorkingCopy) { - ICompilationUnit original; - if (!isPrimary() - && (original = new CompilationUnit((PackageFragment) getParent(), getElementName(), DefaultWorkingCopyOwner.PRIMARY)) - .isOpen()) { - buffer.setContents(original.getSource()); + } + + /** + * @see IWorkingCopy#findSharedWorkingCopy(IBufferFactory) + * @deprecated + */ + public IJavaElement findSharedWorkingCopy(IBufferFactory factory) { + + // if factory is null, default factory must be used + if (factory == null) + factory = this.getBufferManager().getDefaultBufferFactory(); + + return findWorkingCopy(BufferFactoryWrapper.create(factory)); + } + + /** + * @see ICompilationUnit#findWorkingCopy(WorkingCopyOwner) + */ + public ICompilationUnit findWorkingCopy(WorkingCopyOwner workingCopyOwner) { + CompilationUnit cu = new CompilationUnit((PackageFragment) this.parent, + getElementName(), workingCopyOwner); + if (workingCopyOwner == DefaultWorkingCopyOwner.PRIMARY) { + return cu; + } else { + // must be a working copy + JavaModelManager.PerWorkingCopyInfo perWorkingCopyInfo = cu + .getPerWorkingCopyInfo(); + if (perWorkingCopyInfo != null) { + return perWorkingCopyInfo.getWorkingCopy(); + } else { + return null; + } + } + } + + // protected boolean generateInfos(OpenableElementInfo info, + // IProgressMonitor pm, Map newElements, IResource underlyingResource) + // throws JavaModelException { + // + // // if (getParent() instanceof JarPackageFragment) { + // // // ignore .java files in jar + // // throw newNotPresentException(); + // // } else { + // // put the info now, because getting the contents requires it + // JavaModelManager.getJavaModelManager().putInfo(this, info); + // CompilationUnitElementInfo unitInfo = (CompilationUnitElementInfo) info; + // + // // generate structure + // CompilationUnitStructureRequestor requestor = new + // CompilationUnitStructureRequestor(this, unitInfo, newElements); + // IProblemFactory factory = new DefaultProblemFactory(); + // SourceElementParser parser = new SourceElementParser(requestor, factory, + // new + // CompilerOptions(getJavaProject().getOptions(true))); + // // SourceElementParser parser = new SourceElementParser(requestor, + // factory); + // requestor.parser = parser; + // parser.parseCompilationUnit(this, false); + // if (isWorkingCopy()) { + // CompilationUnit original = (CompilationUnit) getOriginalElement(); + // // might be IResource.NULL_STAMP if original does not exist + // unitInfo.timestamp = ((IFile) + // original.getResource()).getModificationStamp(); + // } + // return unitInfo.isStructureKnown(); + // // } + // } + /** + * @see ICompilationUnit#getAllTypes() + */ + public IType[] getAllTypes() throws JavaModelException { + IJavaElement[] types = getTypes(); + int i; + ArrayList allTypes = new ArrayList(types.length); + ArrayList typesToTraverse = new ArrayList(types.length); + for (i = 0; i < types.length; i++) { + typesToTraverse.add(types[i]); + } + while (!typesToTraverse.isEmpty()) { + IType type = (IType) typesToTraverse.get(0); + typesToTraverse.remove(type); + allTypes.add(type); + types = type.getTypes(); + for (i = 0; i < types.length; i++) { + typesToTraverse.add(types[i]); + } + } + IType[] arrayOfAllTypes = new IType[allTypes.size()]; + allTypes.toArray(arrayOfAllTypes); + return arrayOfAllTypes; + } + + /** + * @see IMember#getCompilationUnit() + */ + public ICompilationUnit getCompilationUnit() { + return this; + } + + /** + * @see net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit#getContents() + */ + public char[] getContents() { + try { + IBuffer buffer = this.getBuffer(); + return buffer == null ? null : buffer.getCharacters(); + } catch (JavaModelException e) { + return CharOperation.NO_CHAR; + } + } + + /** + * A compilation unit has a corresponding resource unless it is contained in + * a jar. + * + * @see IJavaElement#getCorrespondingResource() + */ + public IResource getCorrespondingResource() throws JavaModelException { + IPackageFragmentRoot root = (IPackageFragmentRoot) getParent() + .getParent(); + if (root.isArchive()) { + return null; + } else { + return getUnderlyingResource(); + } + } + + /** + * @see ICompilationUnit#getElementAt(int) + */ + public IJavaElement getElementAt(int position) throws JavaModelException { + + IJavaElement e = getSourceElementAt(position); + if (e == this) { + return null; } else { - IFile file = (IFile) getResource(); - if (file == null || !file.exists()) { - // initialize buffer with empty contents - buffer.setContents(CharOperation.NO_CHAR); - } else { - buffer.setContents(Util.getResourceContentsAsCharArray(file)); - } + return e; } - } else { - IFile file = (IFile) this.getResource(); - if (file == null || !file.exists()) - throw newNotPresentException(); - buffer.setContents(Util.getResourceContentsAsCharArray(file)); - } - } - - // add buffer to buffer cache - BufferManager bufManager = getBufferManager(); - bufManager.addBuffer(buffer); - - // listen to buffer changes - buffer.addBufferChangedListener(this); - - return buffer; - } - - /* - * @see Openable#openParent - */ - protected void openParent(Object childInfo, HashMap newElements, IProgressMonitor pm) throws JavaModelException { - try { - super.openParent(childInfo, newElements, pm); - } catch (JavaModelException e) { - // allow parent to not exist for working copies defined outside classpath - if (!isWorkingCopy() && !e.isDoesNotExist()) { - throw e; - } - } - } - - /** - * @see ICompilationUnit#reconcile() - * @deprecated - */ - public IMarker[] reconcile() throws JavaModelException { - reconcile(NO_AST, false/* don't force problem detection */, null/* use primary owner */, null/* no progress monitor */); - return null; - } - - /** - * @see ICompilationUnit#reconcile(int, boolean, WorkingCopyOwner, IProgressMonitor) - */ - public void reconcile(boolean forceProblemDetection, IProgressMonitor monitor) throws JavaModelException { - reconcile(NO_AST, forceProblemDetection, null/* use primary owner */, monitor); - } - - /** - * @see ICompilationUnit#reconcile(int, boolean, WorkingCopyOwner, IProgressMonitor) - * @since 3.0 - */ - //public net.sourceforge.phpdt.core.dom.CompilationUnit reconcile( - public Object reconcile(int astLevel, boolean forceProblemDetection, WorkingCopyOwner workingCopyOwner, IProgressMonitor monitor) - throws JavaModelException { - - if (!isWorkingCopy()) - return null; // Reconciling is not supported on non working copies - if (workingCopyOwner == null) - workingCopyOwner = DefaultWorkingCopyOwner.PRIMARY; - - boolean createAST = false; - // if (astLevel == AST.JLS2) { - // // client asking for level 2 AST; these are supported - // createAST = true; - // } else if (astLevel == AST.JLS3) { - // // client asking for level 3 ASTs; these are not supported - // // TODO (jerome) - these should also be supported in 1.5 stream - // createAST = false; - // } else { - // // client asking for no AST (0) or unknown ast level - // // either way, request denied - // createAST = false; - // } - ReconcileWorkingCopyOperation op = new ReconcileWorkingCopyOperation(this, createAST, astLevel, forceProblemDetection, - workingCopyOwner); - op.runOperation(monitor); - // return op.ast; - return null; - } - - /** - * @see ISourceManipulation#rename(String, boolean, IProgressMonitor) - */ - public void rename(String name, boolean force, IProgressMonitor monitor) throws JavaModelException { - if (name == null) { - throw new IllegalArgumentException(Util.bind("operation.nullName")); //$NON-NLS-1$ - } - IJavaElement[] elements = new IJavaElement[] { this }; - IJavaElement[] dests = new IJavaElement[] { this.getParent() }; - String[] renamings = new String[] { name }; - getJavaModel().rename(elements, dests, renamings, force, monitor); - } - - /* - * @see ICompilationUnit - */ - public void restore() throws JavaModelException { - - if (!isWorkingCopy()) - return; - - CompilationUnit original = (CompilationUnit) getOriginalElement(); - IBuffer buffer = this.getBuffer(); - if (buffer == null) - return; - buffer.setContents(original.getContents()); - updateTimeStamp(original); - makeConsistent(null); - } - -// /** -// * @see ICodeAssist#codeComplete(int, ICodeCompletionRequestor) -// * @deprecated - use codeComplete(int, ICompletionRequestor) -// */ - //public void codeComplete(int offset, final ICodeCompletionRequestor requestor) throws JavaModelException { - // - // if (requestor == null){ - // codeComplete(offset, (ICompletionRequestor)null); - // return; - // } - // codeComplete( - // offset, - // new ICompletionRequestor(){ - // public void acceptAnonymousType(char[] superTypePackageName,char[] superTypeName,char[][] parameterPackageNames,char[][] - // parameterTypeNames,char[][] parameterNames,char[] completionName,int modifiers,int completionStart,int completionEnd, int - // relevance){ - // } - // public void acceptClass(char[] packageName, char[] className, char[] completionName, int modifiers, int completionStart, int - // completionEnd, int relevance) { - // requestor.acceptClass(packageName, className, completionName, modifiers, completionStart, completionEnd); - // } - // public void acceptError(IProblem error) { - // if (true) return; // was disabled in 1.0 - // - // try { - // IMarker marker = ResourcesPlugin.getWorkspace().getRoot().createMarker(IJavaModelMarker.TRANSIENT_PROBLEM); - // marker.setAttribute(IJavaModelMarker.ID, error.getID()); - // marker.setAttribute(IMarker.CHAR_START, error.getSourceStart()); - // marker.setAttribute(IMarker.CHAR_END, error.getSourceEnd() + 1); - // marker.setAttribute(IMarker.LINE_NUMBER, error.getSourceLineNumber()); - // marker.setAttribute(IMarker.MESSAGE, error.getMessage()); - // marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR); - // requestor.acceptError(marker); - // } catch(CoreException e){ - // } - // } - // public void acceptField(char[] declaringTypePackageName, char[] declaringTypeName, char[] name, char[] typePackageName, char[] - // typeName, char[] completionName, int modifiers, int completionStart, int completionEnd, int relevance) { - // requestor.acceptField(declaringTypePackageName, declaringTypeName, name, typePackageName, typeName, completionName, modifiers, - // completionStart, completionEnd); - // } - // public void acceptInterface(char[] packageName,char[] interfaceName,char[] completionName,int modifiers,int completionStart,int - // completionEnd, int relevance) { - // requestor.acceptInterface(packageName, interfaceName, completionName, modifiers, completionStart, completionEnd); - // } - // public void acceptKeyword(char[] keywordName,int completionStart,int completionEnd, int relevance){ - // requestor.acceptKeyword(keywordName, completionStart, completionEnd); - // } - // public void acceptLabel(char[] labelName,int completionStart,int completionEnd, int relevance){ - // requestor.acceptLabel(labelName, completionStart, completionEnd); - // } - // public void acceptLocalVariable(char[] name,char[] typePackageName,char[] typeName,int modifiers,int completionStart,int - // completionEnd, int relevance){ - // // ignore - // } - // public void acceptMethod(char[] declaringTypePackageName,char[] declaringTypeName,char[] selector,char[][] - // parameterPackageNames,char[][] parameterTypeNames,char[][] parameterNames,char[] returnTypePackageName,char[] - // returnTypeName,char[] completionName,int modifiers,int completionStart,int completionEnd, int relevance){ - // // skip parameter names - // requestor.acceptMethod(declaringTypePackageName, declaringTypeName, selector, parameterPackageNames, parameterTypeNames, - // returnTypePackageName, returnTypeName, completionName, modifiers, completionStart, completionEnd); - // } - // public void acceptMethodDeclaration(char[] declaringTypePackageName,char[] declaringTypeName,char[] selector,char[][] - // parameterPackageNames,char[][] parameterTypeNames,char[][] parameterNames,char[] returnTypePackageName,char[] - // returnTypeName,char[] completionName,int modifiers,int completionStart,int completionEnd, int relevance){ - // // ignore - // } - // public void acceptModifier(char[] modifierName,int completionStart,int completionEnd, int relevance){ - // requestor.acceptModifier(modifierName, completionStart, completionEnd); - // } - // public void acceptPackage(char[] packageName,char[] completionName,int completionStart,int completionEnd, int relevance){ - // requestor.acceptPackage(packageName, completionName, completionStart, completionEnd); - // } - // public void acceptType(char[] packageName,char[] typeName,char[] completionName,int completionStart,int completionEnd, int - // relevance){ - // requestor.acceptType(packageName, typeName, completionName, completionStart, completionEnd); - // } - // public void acceptVariableName(char[] typePackageName,char[] typeName,char[] name,char[] completionName,int completionStart,int - // completionEnd, int relevance){ - // // ignore - // } - // }); - //} - ///** - // * @see JavaElement#rootedAt(IJavaProject) - // */ - //public IJavaElement rootedAt(IJavaProject project) { - // return - // new CompilationUnit( - // (IPackageFragment)((JavaElement)parent).rootedAt(project), - // name); - //} - - /* - * Assume that this is a working copy - */ - protected void updateTimeStamp(CompilationUnit original) throws JavaModelException { - long timeStamp = ((IFile) original.getResource()).getModificationStamp(); - if (timeStamp == IResource.NULL_STAMP) { - throw new JavaModelException(new JavaModelStatus(IJavaModelStatusConstants.INVALID_RESOURCE)); - } - ((CompilationUnitElementInfo) getElementInfo()).timestamp = timeStamp; - } + } + + /** + * @see IJavaElement + */ + public int getElementType() { + return COMPILATION_UNIT; + } + + public char[] getFileName() { + return getElementName().toCharArray(); + } + + /* + * @see JavaElement + */ + public IJavaElement getHandleFromMemento(String token, + MementoTokenizer memento, WorkingCopyOwner workingCopyOwner) { + switch (token.charAt(0)) { + case JEM_COUNT: + return getHandleUpdatingCountFromMemento(memento, workingCopyOwner); + case JEM_IMPORTDECLARATION: + JavaElement container = (JavaElement) getImportContainer(); + return container.getHandleFromMemento(token, memento, + workingCopyOwner); + case JEM_PACKAGEDECLARATION: + String pkgName = memento.nextToken(); + JavaElement pkgDecl = (JavaElement) getPackageDeclaration(pkgName); + return pkgDecl.getHandleFromMemento(memento, workingCopyOwner); + case JEM_TYPE: + String typeName = memento.nextToken(); + JavaElement type = (JavaElement) getType(typeName); + return type.getHandleFromMemento(memento, workingCopyOwner); + } + return null; + } + + /** + * @see JavaElement#getHandleMementoDelimiter() + */ + protected char getHandleMementoDelimiter() { + return JavaElement.JEM_COMPILATIONUNIT; + } + + /** + * @see ICompilationUnit#getImport(String) + */ + public IImportDeclaration getImport(String importName) { + return new ImportDeclaration((ImportContainer) getImportContainer(), + importName); + } + + /** + * @see ICompilationUnit#getImportContainer() + */ + public IImportContainer getImportContainer() { + return new ImportContainer(this); + } + + /** + * @see ICompilationUnit#getImports() + */ + public IImportDeclaration[] getImports() throws JavaModelException { + IImportContainer container = getImportContainer(); + if (container.exists()) { + IJavaElement[] elements = container.getChildren(); + IImportDeclaration[] imprts = new IImportDeclaration[elements.length]; + System.arraycopy(elements, 0, imprts, 0, elements.length); + return imprts; + } else if (!exists()) { + throw newNotPresentException(); + } else { + return new IImportDeclaration[0]; + } + + } + + /** + * @see net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit#getMainTypeName() + */ + public char[] getMainTypeName() { + String name = getElementName(); + // remove the .java + name = name.substring(0, name.length() - 5); + return name.toCharArray(); + } + + /** + * @see IWorkingCopy#getOriginal(IJavaElement) + * @deprecated + */ + public IJavaElement getOriginal(IJavaElement workingCopyElement) { + // backward compatibility + if (!isWorkingCopy()) + return null; + CompilationUnit cu = (CompilationUnit) workingCopyElement + .getAncestor(COMPILATION_UNIT); + if (cu == null || !this.owner.equals(cu.owner)) { + return null; + } + + return workingCopyElement.getPrimaryElement(); + } + + /** + * @see IWorkingCopy#getOriginalElement() + * @deprecated + */ + public IJavaElement getOriginalElement() { + // backward compatibility + if (!isWorkingCopy()) + return null; + + return getPrimaryElement(); + } + + /* + * @see ICompilationUnit#getOwner() + */ + public WorkingCopyOwner getOwner() { + return isPrimary() || !isWorkingCopy() ? null : this.owner; + } + + /** + * @see ICompilationUnit#getPackageDeclaration(String) + */ + public IPackageDeclaration getPackageDeclaration(String name) { + return new PackageDeclaration(this, name); + } + + /** + * @see ICompilationUnit#getPackageDeclarations() + */ + public IPackageDeclaration[] getPackageDeclarations() + throws JavaModelException { + ArrayList list = getChildrenOfType(PACKAGE_DECLARATION); + IPackageDeclaration[] array = new IPackageDeclaration[list.size()]; + list.toArray(array); + return array; + } + + /** + * @see net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit#getPackageName() + */ + public char[][] getPackageName() { + return null; + } + + /** + * @see IJavaElement#getPath() + */ + public IPath getPath() { + PackageFragmentRoot root = this.getPackageFragmentRoot(); + if (root.isArchive()) { + return root.getPath(); + } else { + return this.getParent().getPath().append(this.getElementName()); + } + } + + /* + * Returns the per working copy info for the receiver, or null if none + * exist. Note: the use count of the per working copy info is NOT + * incremented. + */ + public JavaModelManager.PerWorkingCopyInfo getPerWorkingCopyInfo() { + return JavaModelManager.getJavaModelManager().getPerWorkingCopyInfo( + this, false/* don't create */, false/* don't record usage */, + null/* no problem requestor needed */); + } + + /* + * @see ICompilationUnit#getPrimary() + */ + public ICompilationUnit getPrimary() { + return (ICompilationUnit) getPrimaryElement(true); + } + + /* + * @see JavaElement#getPrimaryElement(boolean) + */ + public IJavaElement getPrimaryElement(boolean checkOwner) { + if (checkOwner && isPrimary()) + return this; + return new CompilationUnit((PackageFragment) getParent(), + getElementName(), DefaultWorkingCopyOwner.PRIMARY); + } + + /** + * @see IJavaElement#getResource() + */ + public IResource getResource() { + PackageFragmentRoot root = this.getPackageFragmentRoot(); + if (root.isArchive()) { + return root.getResource(); + } else { + return ((IContainer) this.getParent().getResource()) + .getFile(new Path(this.getElementName())); + } + } + + /** + * @see ISourceReference#getSource() + */ + public String getSource() throws JavaModelException { + IBuffer buffer = getBuffer(); + if (buffer == null) + return ""; //$NON-NLS-1$ + return buffer.getContents(); + } + + /** + * @see ISourceReference#getSourceRange() + */ + public ISourceRange getSourceRange() throws JavaModelException { + return ((CompilationUnitElementInfo) getElementInfo()).getSourceRange(); + } + + /** + * @see ICompilationUnit#getType(String) + */ + public IType getType(String name) { + return new SourceType(this, name); + } + + /** + * @see ICompilationUnit#getTypes() + */ + public IType[] getTypes() throws JavaModelException { + ArrayList list = getChildrenOfType(TYPE); + IType[] array = new IType[list.size()]; + list.toArray(array); + return array; + } + + /** + * @see IJavaElement + */ + public IResource getUnderlyingResource() throws JavaModelException { + if (isWorkingCopy() && !isPrimary()) + return null; + return super.getUnderlyingResource(); + } + + // /** + // * @see IWorkingCopy#getSharedWorkingCopy(IProgressMonitor, + // IBufferFactory, IProblemRequestor) + // */ + // public IJavaElement getSharedWorkingCopy(IProgressMonitor pm, + // IBufferFactory factory, IProblemRequestor problemRequestor) + // throws JavaModelException { + // + // // if factory is null, default factory must be used + // if (factory == null) factory = + // this.getBufferManager().getDefaultBufferFactory(); + // + // JavaModelManager manager = JavaModelManager.getJavaModelManager(); + // + // // In order to be shared, working copies have to denote the same + // compilation unit + // // AND use the same buffer factory. + // // Assuming there is a little set of buffer factories, then use a 2 level + // Map cache. + // Map sharedWorkingCopies = manager.sharedWorkingCopies; + // + // Map perFactoryWorkingCopies = (Map) sharedWorkingCopies.get(factory); + // if (perFactoryWorkingCopies == null){ + // perFactoryWorkingCopies = new HashMap(); + // sharedWorkingCopies.put(factory, perFactoryWorkingCopies); + // } + // WorkingCopy workingCopy = (WorkingCopy)perFactoryWorkingCopies.get(this); + // if (workingCopy != null) { + // workingCopy.useCount++; + // + // if (SHARED_WC_VERBOSE) { + // System.out.println("Incrementing use count of shared working copy " + + // workingCopy.toStringWithAncestors()); //$NON-NLS-1$ + // } + // + // return workingCopy; + // } else { + // CreateWorkingCopyOperation op = new CreateWorkingCopyOperation(this, + // perFactoryWorkingCopies, factory, problemRequestor); + // runOperation(op, pm); + // return op.getResultElements()[0]; + // } + // } + // /** + // * @see IWorkingCopy#getWorkingCopy() + // */ + // public IJavaElement getWorkingCopy() throws JavaModelException { + // return this.getWorkingCopy(null, null, null); + // } + // + // /** + // * @see IWorkingCopy#getWorkingCopy(IProgressMonitor, IBufferFactory, + // IProblemRequestor) + // */ + // public IJavaElement getWorkingCopy(IProgressMonitor pm, IBufferFactory + // factory, IProblemRequestor problemRequestor) throws + // JavaModelException { + // CreateWorkingCopyOperation op = new CreateWorkingCopyOperation(this, + // null, factory, problemRequestor); + // runOperation(op, pm); + // return op.getResultElements()[0]; + // } + /** + * @see IWorkingCopy#getSharedWorkingCopy(IProgressMonitor, IBufferFactory, + * IProblemRequestor) + * @deprecated + */ + public IJavaElement getSharedWorkingCopy(IProgressMonitor pm, + IBufferFactory factory, IProblemRequestor problemRequestor) + throws JavaModelException { + + // if factory is null, default factory must be used + if (factory == null) + factory = this.getBufferManager().getDefaultBufferFactory(); + + return getWorkingCopy(BufferFactoryWrapper.create(factory), + problemRequestor, pm); + } + + /** + * @see IWorkingCopy#getWorkingCopy() + * @deprecated + */ + public IJavaElement getWorkingCopy() throws JavaModelException { + return getWorkingCopy(null); + } + + /** + * @see ICompilationUnit#getWorkingCopy(IProgressMonitor) + */ + public ICompilationUnit getWorkingCopy(IProgressMonitor monitor) + throws JavaModelException { + return getWorkingCopy(new WorkingCopyOwner() {/* + * non shared working + * copy + */ + }, null/* no problem requestor */, monitor); + } + + /** + * @see IWorkingCopy#getWorkingCopy(IProgressMonitor, IBufferFactory, + * IProblemRequestor) + * @deprecated + */ + public IJavaElement getWorkingCopy(IProgressMonitor monitor, + IBufferFactory factory, IProblemRequestor problemRequestor) + throws JavaModelException { + return getWorkingCopy(BufferFactoryWrapper.create(factory), + problemRequestor, monitor); + } + + /** + * @see ICompilationUnit#getWorkingCopy(WorkingCopyOwner, IProblemRequestor, + * IProgressMonitor) + */ + public ICompilationUnit getWorkingCopy(WorkingCopyOwner workingCopyOwner, + IProblemRequestor problemRequestor, IProgressMonitor monitor) + throws JavaModelException { + if (!isPrimary()) + return this; + + JavaModelManager manager = JavaModelManager.getJavaModelManager(); + + CompilationUnit workingCopy = new CompilationUnit( + (PackageFragment) getParent(), getElementName(), + workingCopyOwner); + JavaModelManager.PerWorkingCopyInfo perWorkingCopyInfo = manager + .getPerWorkingCopyInfo(workingCopy, false/* don't create */, + true/* record usage */, null/* + * not used since don't + * create + */); + if (perWorkingCopyInfo != null) { + return perWorkingCopyInfo.getWorkingCopy(); // return existing + // handle instead of the + // one created above + } + BecomeWorkingCopyOperation op = new BecomeWorkingCopyOperation( + workingCopy, problemRequestor); + op.runOperation(monitor); + return workingCopy; + } + + /** + * If I am not open, return true to avoid parsing. + * + * @see IParent#hasChildren() + */ + public boolean hasChildren() throws JavaModelException { + // if (isOpen()) { + // return getChildren().length > 0; + // } else { + // return true; + // } + return false; + } + + /** + * @see Openable#hasBuffer() + */ + protected boolean hasBuffer() { + return true; + } + + /* + * @see ICompilationUnit#hasResourceChanged() + */ + public boolean hasResourceChanged() { + if (!isWorkingCopy()) + return false; + + // if resource got deleted, then #getModificationStamp() will answer + // IResource.NULL_STAMP, which is always different from the + // cached + // timestamp + Object info = JavaModelManager.getJavaModelManager().getInfo(this); + if (info == null) + return false; + return ((CompilationUnitElementInfo) info).timestamp != getResource() + .getModificationStamp(); + } + + /** + * @see IWorkingCopy#isBasedOn(IResource) + * @deprecated + */ + public boolean isBasedOn(IResource resource) { + if (!isWorkingCopy()) + return false; + if (!getResource().equals(resource)) + return false; + return !hasResourceChanged(); + } + + /** + * @see IOpenable#isConsistent() + */ + public boolean isConsistent() { + return JavaModelManager.getJavaModelManager() + .getElementsOutOfSynchWithBuffers().get(this) == null; + } + + /** + * + * @see IOpenable + */ + public boolean isOpen() { + Object info = JavaModelManager.getJavaModelManager().getInfo(this); + return info != null && ((CompilationUnitElementInfo) info).isOpen(); + } + + public boolean isPrimary() { + return this.owner == DefaultWorkingCopyOwner.PRIMARY; + } + + /** + * @see Openable#isSourceElement() + */ + protected boolean isSourceElement() { + return true; + } + + protected boolean isValidCompilationUnit() { + IPackageFragmentRoot root = getPackageFragmentRoot(); + try { + if (root.getKind() != IPackageFragmentRoot.K_SOURCE) + return false; + } catch (JavaModelException e) { + return false; + } + // IResource resource = getResource(); + // if (resource != null) { + // char[][] inclusionPatterns = + // ((PackageFragmentRoot)root).fullInclusionPatternChars(); + // char[][] exclusionPatterns = + // ((PackageFragmentRoot)root).fullExclusionPatternChars(); + // if (ProjectPrefUtil.isExcluded(resource, inclusionPatterns, + // exclusionPatterns)) return false; + // } + if (!Util.isValidCompilationUnitName(getElementName())) + return false; + return true; + } + + /* + * @see ICompilationUnit#isWorkingCopy() + */ + public boolean isWorkingCopy() { + // For backward compatibility, non primary working copies are always + // returning true; in removal + // delta, clients can still check that element was a working copy before + // being discarded. + return !isPrimary() || getPerWorkingCopyInfo() != null; + } + + /** + * @see IOpenable#makeConsistent(IProgressMonitor) + */ + public void makeConsistent(IProgressMonitor monitor) + throws JavaModelException { + makeConsistent(false/* don't create AST */, 0, monitor); + } + + public Object makeConsistent(boolean createAST, int astLevel, + IProgressMonitor monitor) throws JavaModelException { + if (isConsistent()) + return null; + + // create a new info and make it the current info + // (this will remove the info and its children just before storing the + // new infos) + // if (createAST) { + // ASTHolderCUInfo info = new ASTHolderCUInfo(); + // info.astLevel = astLevel; + // openWhenClosed(info, monitor); + // net.sourceforge.phpdt.core.dom.CompilationUnit result = info.ast; + // info.ast = null; + // return result; + // } else { + openWhenClosed(createElementInfo(), monitor); + return null; + // } + } + + // public net.sourceforge.phpdt.core.dom.CompilationUnit + // makeConsistent(boolean createAST, int astLevel, IProgressMonitor monitor) + // throws JavaModelException { + // if (isConsistent()) return null; + // + // // create a new info and make it the current info + // // (this will remove the info and its children just before storing the + // new infos) + // if (createAST) { + // ASTHolderCUInfo info = new ASTHolderCUInfo(); + // info.astLevel = astLevel; + // openWhenClosed(info, monitor); + // net.sourceforge.phpdt.core.dom.CompilationUnit result = info.ast; + // info.ast = null; + // return result; + // } else { + // openWhenClosed(createElementInfo(), monitor); + // return null; + // } + // } + + /** + * @see ISourceManipulation#move(IJavaElement, IJavaElement, String, + * boolean, IProgressMonitor) + */ + public void move(IJavaElement container, IJavaElement sibling, + String rename, boolean force, IProgressMonitor monitor) + throws JavaModelException { + if (container == null) { + throw new IllegalArgumentException(Util + .bind("operation.nullContainer")); //$NON-NLS-1$ + } + IJavaElement[] elements = new IJavaElement[] { this }; + IJavaElement[] containers = new IJavaElement[] { container }; + + String[] renamings = null; + if (rename != null) { + renamings = new String[] { rename }; + } + getJavaModel().move(elements, containers, null, renamings, force, + monitor); + } + + // /** + // * @see Openable#openBuffer(IProgressMonitor) + // */ + // protected IBuffer openBuffer(IProgressMonitor pm) throws + // JavaModelException { + // + // // create buffer - compilation units only use default buffer factory + // BufferManager bufManager = getBufferManager(); + // IBuffer buffer = getBufferFactory().createBuffer(this); + // if (buffer == null) return null; + // + // // set the buffer source + // if (buffer.getCharacters() == null){ + // IFile file = (IFile)this.getResource(); + // if (file == null || !file.exists()) throw newNotPresentException(); + // buffer.setContents(ProjectPrefUtil.getResourceContentsAsCharArray(file)); + // } + // + // // add buffer to buffer cache + // bufManager.addBuffer(buffer); + // + // // listen to buffer changes + // buffer.addBufferChangedListener(this); + // + // return buffer; + // } + /** + * @see Openable#openBuffer(IProgressMonitor, Object) + */ + protected IBuffer openBuffer(IProgressMonitor pm, Object info) + throws JavaModelException { + + // create buffer + boolean isWorkingCopy = isWorkingCopy(); + IBuffer buffer = isWorkingCopy ? this.owner.createBuffer(this) + : BufferManager.getDefaultBufferManager().createBuffer(this); + if (buffer == null) + return null; + + // set the buffer source + if (buffer.getCharacters() == null) { + if (isWorkingCopy) { + ICompilationUnit original; + if (!isPrimary() + && (original = new CompilationUnit( + (PackageFragment) getParent(), + getElementName(), + DefaultWorkingCopyOwner.PRIMARY)).isOpen()) { + buffer.setContents(original.getSource()); + } else { + IFile file = (IFile) getResource(); + if (file == null || !file.exists()) { + // initialize buffer with empty contents + buffer.setContents(CharOperation.NO_CHAR); + } else { + buffer.setContents(Util + .getResourceContentsAsCharArray(file)); + } + } + } else { + IFile file = (IFile) this.getResource(); + if (file == null || !file.exists()) + throw newNotPresentException(); + buffer.setContents(Util.getResourceContentsAsCharArray(file)); + } + } + + // add buffer to buffer cache + BufferManager bufManager = getBufferManager(); + bufManager.addBuffer(buffer); + + // listen to buffer changes + buffer.addBufferChangedListener(this); + + return buffer; + } + + /* + * @see Openable#openParent + */ + protected void openParent(Object childInfo, HashMap newElements, + IProgressMonitor pm) throws JavaModelException { + try { + super.openParent(childInfo, newElements, pm); + } catch (JavaModelException e) { + // allow parent to not exist for working copies defined outside + // classpath + if (!isWorkingCopy() && !e.isDoesNotExist()) { + throw e; + } + } + } + + /** + * @see ICompilationUnit#reconcile() + * @deprecated + */ + public IMarker[] reconcile() throws JavaModelException { + reconcile(NO_AST, false/* don't force problem detection */, + null/* use primary owner */, null/* no progress monitor */); + return null; + } + + /** + * @see ICompilationUnit#reconcile(int, boolean, WorkingCopyOwner, + * IProgressMonitor) + */ + public void reconcile(boolean forceProblemDetection, + IProgressMonitor monitor) throws JavaModelException { + reconcile(NO_AST, forceProblemDetection, null/* use primary owner */, + monitor); + } + + /** + * @see ICompilationUnit#reconcile(int, boolean, WorkingCopyOwner, + * IProgressMonitor) + * @since 3.0 + */ + // public net.sourceforge.phpdt.core.dom.CompilationUnit reconcile( + public Object reconcile(int astLevel, boolean forceProblemDetection, + WorkingCopyOwner workingCopyOwner, IProgressMonitor monitor) + throws JavaModelException { + + if (!isWorkingCopy()) + return null; // Reconciling is not supported on non working + // copies + if (workingCopyOwner == null) + workingCopyOwner = DefaultWorkingCopyOwner.PRIMARY; + + boolean createAST = false; + // if (astLevel == AST.JLS2) { + // // client asking for level 2 AST; these are supported + // createAST = true; + // } else if (astLevel == AST.JLS3) { + // // client asking for level 3 ASTs; these are not supported + // // TODO (jerome) - these should also be supported in 1.5 stream + // createAST = false; + // } else { + // // client asking for no AST (0) or unknown ast level + // // either way, request denied + // createAST = false; + // } + ReconcileWorkingCopyOperation op = new ReconcileWorkingCopyOperation( + this, createAST, astLevel, forceProblemDetection, + workingCopyOwner); + op.runOperation(monitor); + // return op.ast; + return null; + } + + /** + * @see ISourceManipulation#rename(String, boolean, IProgressMonitor) + */ + public void rename(String name, boolean force, IProgressMonitor monitor) + throws JavaModelException { + if (name == null) { + throw new IllegalArgumentException(Util.bind("operation.nullName")); //$NON-NLS-1$ + } + IJavaElement[] elements = new IJavaElement[] { this }; + IJavaElement[] dests = new IJavaElement[] { this.getParent() }; + String[] renamings = new String[] { name }; + getJavaModel().rename(elements, dests, renamings, force, monitor); + } + + /* + * @see ICompilationUnit + */ + public void restore() throws JavaModelException { + + if (!isWorkingCopy()) + return; + + CompilationUnit original = (CompilationUnit) getOriginalElement(); + IBuffer buffer = this.getBuffer(); + if (buffer == null) + return; + buffer.setContents(original.getContents()); + updateTimeStamp(original); + makeConsistent(null); + } + + // /** + // * @see ICodeAssist#codeComplete(int, ICodeCompletionRequestor) + // * @deprecated - use codeComplete(int, ICompletionRequestor) + // */ + // public void codeComplete(int offset, final ICodeCompletionRequestor + // requestor) throws JavaModelException { + // + // if (requestor == null){ + // codeComplete(offset, (ICompletionRequestor)null); + // return; + // } + // codeComplete( + // offset, + // new ICompletionRequestor(){ + // public void acceptAnonymousType(char[] superTypePackageName,char[] + // superTypeName,char[][] parameterPackageNames,char[][] + // parameterTypeNames,char[][] parameterNames,char[] completionName,int + // modifiers,int completionStart,int completionEnd, int + // relevance){ + // } + // public void acceptClass(char[] packageName, char[] className, char[] + // completionName, int modifiers, int completionStart, int + // completionEnd, int relevance) { + // requestor.acceptClass(packageName, className, completionName, modifiers, + // completionStart, completionEnd); + // } + // public void acceptError(IProblem error) { + // if (true) return; // was disabled in 1.0 + // + // try { + // IMarker marker = + // ResourcesPlugin.getWorkspace().getRoot().createMarker(IJavaModelMarker.TRANSIENT_PROBLEM); + // marker.setAttribute(IJavaModelMarker.ID, error.getID()); + // marker.setAttribute(IMarker.CHAR_START, error.getSourceStart()); + // marker.setAttribute(IMarker.CHAR_END, error.getSourceEnd() + 1); + // marker.setAttribute(IMarker.LINE_NUMBER, error.getSourceLineNumber()); + // marker.setAttribute(IMarker.MESSAGE, error.getMessage()); + // marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR); + // requestor.acceptError(marker); + // } catch(CoreException e){ + // } + // } + // public void acceptField(char[] declaringTypePackageName, char[] + // declaringTypeName, char[] name, char[] typePackageName, char[] + // typeName, char[] completionName, int modifiers, int completionStart, int + // completionEnd, int relevance) { + // requestor.acceptField(declaringTypePackageName, declaringTypeName, name, + // typePackageName, typeName, completionName, modifiers, + // completionStart, completionEnd); + // } + // public void acceptInterface(char[] packageName,char[] + // interfaceName,char[] completionName,int modifiers,int completionStart,int + // completionEnd, int relevance) { + // requestor.acceptInterface(packageName, interfaceName, completionName, + // modifiers, completionStart, completionEnd); + // } + // public void acceptKeyword(char[] keywordName,int completionStart,int + // completionEnd, int relevance){ + // requestor.acceptKeyword(keywordName, completionStart, completionEnd); + // } + // public void acceptLabel(char[] labelName,int completionStart,int + // completionEnd, int relevance){ + // requestor.acceptLabel(labelName, completionStart, completionEnd); + // } + // public void acceptLocalVariable(char[] name,char[] typePackageName,char[] + // typeName,int modifiers,int completionStart,int + // completionEnd, int relevance){ + // // ignore + // } + // public void acceptMethod(char[] declaringTypePackageName,char[] + // declaringTypeName,char[] selector,char[][] + // parameterPackageNames,char[][] parameterTypeNames,char[][] + // parameterNames,char[] returnTypePackageName,char[] + // returnTypeName,char[] completionName,int modifiers,int + // completionStart,int completionEnd, int relevance){ + // // skip parameter names + // requestor.acceptMethod(declaringTypePackageName, declaringTypeName, + // selector, parameterPackageNames, parameterTypeNames, + // returnTypePackageName, returnTypeName, completionName, modifiers, + // completionStart, completionEnd); + // } + // public void acceptMethodDeclaration(char[] + // declaringTypePackageName,char[] declaringTypeName,char[] + // selector,char[][] + // parameterPackageNames,char[][] parameterTypeNames,char[][] + // parameterNames,char[] returnTypePackageName,char[] + // returnTypeName,char[] completionName,int modifiers,int + // completionStart,int completionEnd, int relevance){ + // // ignore + // } + // public void acceptModifier(char[] modifierName,int completionStart,int + // completionEnd, int relevance){ + // requestor.acceptModifier(modifierName, completionStart, completionEnd); + // } + // public void acceptPackage(char[] packageName,char[] completionName,int + // completionStart,int completionEnd, int relevance){ + // requestor.acceptPackage(packageName, completionName, completionStart, + // completionEnd); + // } + // public void acceptType(char[] packageName,char[] typeName,char[] + // completionName,int completionStart,int completionEnd, int + // relevance){ + // requestor.acceptType(packageName, typeName, completionName, + // completionStart, completionEnd); + // } + // public void acceptVariableName(char[] typePackageName,char[] + // typeName,char[] name,char[] completionName,int completionStart,int + // completionEnd, int relevance){ + // // ignore + // } + // }); + // } + // /** + // * @see JavaElement#rootedAt(IJavaProject) + // */ + // public IJavaElement rootedAt(IJavaProject project) { + // return + // new CompilationUnit( + // (IPackageFragment)((JavaElement)parent).rootedAt(project), + // name); + // } + + /* + * Assume that this is a working copy + */ + protected void updateTimeStamp(CompilationUnit original) + throws JavaModelException { + long timeStamp = ((IFile) original.getResource()) + .getModificationStamp(); + if (timeStamp == IResource.NULL_STAMP) { + throw new JavaModelException(new JavaModelStatus( + IJavaModelStatusConstants.INVALID_RESOURCE)); + } + ((CompilationUnitElementInfo) getElementInfo()).timestamp = timeStamp; + } } \ No newline at end of file