X-Git-Url: http://secure.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 50c264c..c1d6b1b 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 @@ -1,10 +1,10 @@ /******************************************************************************* * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials + * 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 *******************************************************************************/ @@ -12,12 +12,14 @@ package net.sourceforge.phpdt.internal.core; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; 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; import net.sourceforge.phpdt.core.IJavaElement; import net.sourceforge.phpdt.core.IJavaModelStatusConstants; import net.sourceforge.phpdt.core.IJavaProject; @@ -25,7 +27,6 @@ import net.sourceforge.phpdt.core.IMember; import net.sourceforge.phpdt.core.IMethod; import net.sourceforge.phpdt.core.IOpenable; import net.sourceforge.phpdt.core.IPackageDeclaration; -import net.sourceforge.phpdt.core.IPackageFragment; import net.sourceforge.phpdt.core.IPackageFragmentRoot; import net.sourceforge.phpdt.core.IParent; import net.sourceforge.phpdt.core.IProblemRequestor; @@ -36,12 +37,16 @@ import net.sourceforge.phpdt.core.IType; import net.sourceforge.phpdt.core.IWorkingCopy; import net.sourceforge.phpdt.core.JavaModelException; import net.sourceforge.phpdt.core.Signature; +import net.sourceforge.phpdt.core.WorkingCopyOwner; import net.sourceforge.phpdt.core.compiler.CharOperation; import net.sourceforge.phpdt.core.jdom.IDOMNode; import net.sourceforge.phpdt.internal.compiler.IProblemFactory; import net.sourceforge.phpdt.internal.compiler.SourceElementParser; +import net.sourceforge.phpdt.internal.compiler.ast.CompilationUnitDeclaration; import net.sourceforge.phpdt.internal.compiler.impl.CompilerOptions; import net.sourceforge.phpdt.internal.compiler.problem.DefaultProblemFactory; +import net.sourceforge.phpdt.internal.core.util.MementoTokenizer; +import net.sourceforge.phpdt.internal.core.util.Util; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; @@ -51,799 +56,1298 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; -/** +/** * @see ICompilationUnit */ -public class CompilationUnit extends Openable implements ICompilationUnit, net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit { - - public static boolean SHARED_WC_VERBOSE = false; - - // TODO: Remove when we are certain that every client is ready for this fix - public static final boolean FIX_BUG25184 = true; +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; + } -/** - * Constructs a handle to a compilation unit with the given name in the - * specified package. - * - * @exception IllegalArgumentException if the name of the compilation unit - * does not end with ".java" - */ -protected CompilationUnit(IPackageFragment parent, String name) { - super(COMPILATION_UNIT, parent, name); - if (!Util.isJavaFileName(name)) { - throw new IllegalArgumentException(net.sourceforge.phpdt.internal.core.Util.bind("convention.unit.notJavaName")); //$NON-NLS-1$ + /** + * 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); } -} -/** - * 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); -//} + } -protected void buildStructure(OpenableElementInfo info, IProgressMonitor monitor) throws JavaModelException { + //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(); + } + } - if (monitor != null && monitor.isCanceled()) return; + // 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(); + } - // remove existing (old) infos - removeInfo(); + CompilationUnitElementInfo unitInfo = (CompilationUnitElementInfo) info; - 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); + // 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 } - // 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); -} - -///** -// * @see ICodeAssist#codeComplete(int, ICompletionRequestor) -// */ -//public void codeComplete(int offset, ICompletionRequestor requestor) throws JavaModelException { -// codeComplete(this, isWorkingCopy() ? (org.eclipse.jdt.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 { - throw new JavaModelException(new JavaModelStatus(IJavaModelStatusConstants.INVALID_ELEMENT_TYPES, this)); -} -/** - * @see ISourceManipulation#copy(IJavaElement, IJavaElement, String, boolean, IProgressMonitor) - */ -public void copy(IJavaElement container, IJavaElement sibling, String rename, boolean force, IProgressMonitor monitor) throws JavaModelException { + 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$ + throw new IllegalArgumentException(Util.bind("operation.nullContainer")); //$NON-NLS-1$ } - IJavaElement[] elements = new IJavaElement[] {this}; - IJavaElement[] containers = new IJavaElement[] {container}; + IJavaElement[] elements = new IJavaElement[] { this }; + IJavaElement[] containers = new IJavaElement[] { container }; String[] renamings = null; if (rename != null) { - renamings = new String[] {rename}; + renamings = new String[] { rename }; } getJavaModel().copy(elements, containers, null, renamings, force, monitor); -} -/** - * Returns a new element info for this element. - */ -protected OpenableElementInfo createElementInfo() { + } + + /** + * 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); + } + + ///** + // * @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() + ";" + org.eclipse.jdt.internal.compiler.util.Util.LINE_SEPARATOR + org.eclipse.jdt.internal.compiler.util.Util.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}; + } + + ///** + // * @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); -} -/** - * This is not a working copy, do nothing. - * - * @see IWorkingCopy#destroy() - */ -public void destroy() { -} + } + /** + * @see IWorkingCopy#destroy() + * @deprecated + */ + public void destroy() { + try { + discardWorkingCopy(); + } catch (JavaModelException e) { + e.printStackTrace(); + } + } -/** - * Returns true if this handle represents the same Java element - * as the given handle. - * - *

Compilation units must also check working copy state; - * - * @see Object#equals(java.lang.Object) - */ -public boolean equals(Object o) { - return super.equals(o) && !((ICompilationUnit)o).isWorkingCopy(); -} -/** - * @see JavaElement#equalsDOMNode(IDOMNode) - */ -protected boolean equalsDOMNode(IDOMNode node) throws JavaModelException { + /* + * @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)) { + 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; - } 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; -} -/** - * @see IWorkingCopy#findElements(IJavaElement) - */ -public IJavaElement[] findElements(IJavaElement element) { + } + + /** + * @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(); + children.add(element); + element = element.getParent(); } - if (element == null) return null; + 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); + 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}; + return new IJavaElement[] { currentElement }; } else { - return null; + return null; } -} -/** - * @see IWorkingCopy#findPrimaryType() - */ -public IType findPrimaryType() { + } + + /** + * @see IWorkingCopy#findPrimaryType() + */ + public IType findPrimaryType() { String typeName = Signature.getQualifier(this.getElementName()); - IType primaryType= this.getType(typeName); + IType primaryType = this.getType(typeName); if (primaryType.exists()) { - return primaryType; + return primaryType; } return null; -} + } -/** - * @see IWorkingCopy#findSharedWorkingCopy(IBufferFactory) - */ -public IJavaElement findSharedWorkingCopy(IBufferFactory factory) { + /** + * @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(); - - // 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 = JavaModelManager.getJavaModelManager().sharedWorkingCopies; - - Map perFactoryWorkingCopies = (Map) sharedWorkingCopies.get(factory); - if (perFactoryWorkingCopies == null) return null; - return (WorkingCopy)perFactoryWorkingCopies.get(this); -} - -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.fTimestamp = ((IFile) original.getResource()).getModificationStamp(); - } - return unitInfo.isStructureKnown(); -// } -} -/** - * @see ICompilationUnit#getAllTypes() - */ -public IType[] getAllTypes() throws JavaModelException { + 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]); + 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 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() { + } + + /** + * @see IMember#getCompilationUnit() + */ + public ICompilationUnit getCompilationUnit() { return this; -} -/** - * @see org.eclipse.jdt.internal.compiler.env.ICompilationUnit#getContents() - */ -public char[] getContents() { + } + + /** + * @see net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit#getContents() + */ + public char[] getContents() { try { - IBuffer buffer = this.getBuffer(); - return buffer == null ? null : buffer.getCharacters(); + IBuffer buffer = this.getBuffer(); + return buffer == null ? null : buffer.getCharacters(); } catch (JavaModelException e) { - return CharOperation.NO_CHAR; + 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(); + } + + /** + * 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; + return null; } else { - return getUnderlyingResource(); + return getUnderlyingResource(); } -} -/** - * @see ICompilationUnit#getElementAt(int) - */ -public IJavaElement getElementAt(int position) throws JavaModelException { + } - IJavaElement e= getSourceElementAt(position); + /** + * @see ICompilationUnit#getElementAt(int) + */ + public IJavaElement getElementAt(int position) throws JavaModelException { + + IJavaElement e = getSourceElementAt(position); if (e == this) { - return null; + return null; } else { - return e; + return e; } -} -public char[] getFileName(){ + } + + /** + * @see IJavaElement + */ + public int getElementType() { + return COMPILATION_UNIT; + } + + public char[] getFileName() { return getElementName().toCharArray(); -} -/** - * @see JavaElement#getHandleMementoDelimiter() - */ -protected char getHandleMementoDelimiter() { - return JavaElement.JEM_COMPILATIONUNIT; -} -/** - * @see ICompilationUnit#getImport(String) - */ -//public IImportDeclaration getImport(String name) { -// return new ImportDeclaration(getImportContainer(), name); -//} -///** -// * @see ICompilationUnit#getImportContainer() -// */ -//public IImportContainer getImportContainer() { -// return new ImportContainer(this); -//} + } + /* + * @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 org.eclipse.jdt.internal.compiler.env.ICompilationUnit#getMainTypeName() - */ -public char[] getMainTypeName(){ - String name= getElementName(); + + /** + * @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); + name = name.substring(0, name.length() - 5); return name.toCharArray(); -} -/** - * Returns null, this is not a working copy. - * - * @see IWorkingCopy#getOriginal(IJavaElement) - */ -public IJavaElement getOriginal(IJavaElement workingCopyElement) { - return null; -} -/** - * Returns null, this is not a working copy. - * - * @see IWorkingCopy#getOriginalElement() - */ -public IJavaElement getOriginalElement() { - return null; -} -/** - * @see ICompilationUnit#getPackageDeclaration(String) - */ -public IPackageDeclaration getPackageDeclaration(String name) { + } + + /** + * @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 { + } + + /** + * @see ICompilationUnit#getPackageDeclarations() + */ + public IPackageDeclaration[] getPackageDeclarations() throws JavaModelException { ArrayList list = getChildrenOfType(PACKAGE_DECLARATION); - IPackageDeclaration[] array= new IPackageDeclaration[list.size()]; + IPackageDeclaration[] array = new IPackageDeclaration[list.size()]; list.toArray(array); return array; -} -/** - * @see org.eclipse.jdt.internal.compiler.env.ICompilationUnit#getPackageName() - */ -public char[][] getPackageName() { + } + + /** + * @see net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit#getPackageName() + */ + public char[][] getPackageName() { return null; -} -/** - * @see IJavaElement#getPath() - */ -public IPath getPath() { + } + + /** + * @see IJavaElement#getPath() + */ + public IPath getPath() { PackageFragmentRoot root = this.getPackageFragmentRoot(); if (root.isArchive()) { - return root.getPath(); + return root.getPath(); } else { - return this.getParent().getPath().append(this.getElementName()); + return this.getParent().getPath().append(this.getElementName()); } -} -/** - * @see IJavaElement#getResource() - */ -public IResource getResource() { + } + + /* + * 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(); + return root.getResource(); } else { - return ((IContainer)this.getParent().getResource()).getFile(new Path(this.getElementName())); + return ((IContainer) this.getParent().getResource()).getFile(new Path(this.getElementName())); } -} + } -/** - * @see ISourceReference#getSource() - */ -public String getSource() throws JavaModelException { + /** + * @see ISourceReference#getSource() + */ + public String getSource() throws JavaModelException { IBuffer buffer = getBuffer(); - if (buffer == null) return ""; //$NON-NLS-1$ + if (buffer == null) + return ""; //$NON-NLS-1$ return buffer.getContents(); -} -/** - * @see ISourceReference#getSourceRange() - */ -public ISourceRange getSourceRange() throws JavaModelException { + } + + /** + * @see ISourceReference#getSourceRange() + */ + public ISourceRange getSourceRange() throws JavaModelException { return ((CompilationUnitElementInfo) getElementInfo()).getSourceRange(); -} -/** - * @see ICompilationUnit#getType(String) - */ -public IType getType(String name) { + } + + /** + * @see ICompilationUnit#getType(String) + */ + public IType getType(String name) { return new SourceType(this, name); -} -/** - * @see ICompilationUnit#getTypes() - */ -public IType[] getTypes() throws JavaModelException { + } + + /** + * @see ICompilationUnit#getTypes() + */ + public IType[] getTypes() throws JavaModelException { ArrayList list = getChildrenOfType(TYPE); - IType[] array= new IType[list.size()]; + IType[] array = new IType[list.size()]; list.toArray(array); return array; -} -public IResource getUnderlyingResource() throws JavaModelException { - if (FIX_BUG25184) { - return super.getUnderlyingResource(); - } else { - return getResource(); - } -} -/** - * @see IWorkingCopy#getSharedWorkingCopy(IProgressMonitor, IBufferFactory, IProblemRequestor) - */ -public IJavaElement getSharedWorkingCopy(IProgressMonitor pm, IBufferFactory factory, IProblemRequestor problemRequestor) throws JavaModelException { - + } + + /** + * @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(); + 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++; + return getWorkingCopy(BufferFactoryWrapper.create(factory), problemRequestor, pm); + } - if (SHARED_WC_VERBOSE) { - System.out.println("Incrementing use count of shared working copy " + workingCopy.toStringWithAncestors()); //$NON-NLS-1$ - } + /** + * @see IWorkingCopy#getWorkingCopy() + * @deprecated + */ + public IJavaElement getWorkingCopy() throws JavaModelException { + return getWorkingCopy(null); + } - return workingCopy; - } else { - CreateWorkingCopyOperation op = new CreateWorkingCopyOperation(this, perFactoryWorkingCopies, factory, problemRequestor); - runOperation(op, pm); - return op.getResultElements()[0]; + /** + * @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 } -} -/** - * @see IWorkingCopy#getWorkingCopy() - */ -public IJavaElement getWorkingCopy() throws JavaModelException { - return this.getWorkingCopy(null, null, null); -} + BecomeWorkingCopyOperation op = new BecomeWorkingCopyOperation(workingCopy, problemRequestor); + op.runOperation(monitor); + return workingCopy; + } -/** - * @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]; -} + /** + * 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() { + /** + * @see Openable#hasBuffer() + */ + protected boolean hasBuffer() { return true; -} -/** - * 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; -} -/** - * Returns false, this is not a working copy. - * - * @see IWorkingCopy#isBasedOn(IResource) - */ -public boolean isBasedOn(IResource resource) { - return false; -} -/** - * @see IOpenable#isConsistent() - */ -public boolean isConsistent() throws JavaModelException { + } + + /* + * @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 Openable#isSourceElement() - */ -protected boolean isSourceElement() { + } + + /** + * + * @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; -} -/** - * @see IWorkingCopy#isWorkingCopy() - */ -public boolean isWorkingCopy() { - return false; -} -/** - * @see IOpenable#makeConsistent(IProgressMonitor) - */ -public void makeConsistent(IProgressMonitor monitor) throws JavaModelException { - if (!isConsistent()) { // TODO: this code isn't synchronized with regular opening of a working copy - // create a new info and make it the current info - OpenableElementInfo info = createElementInfo(); - buildStructure(info, monitor); + } + + 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 ISourceManipulation#move(IJavaElement, IJavaElement, String, boolean, IProgressMonitor) - */ -public void move(IJavaElement container, IJavaElement sibling, String rename, boolean force, IProgressMonitor monitor) throws JavaModelException { + /* + * @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$ + throw new IllegalArgumentException(Util.bind("operation.nullContainer")); //$NON-NLS-1$ } - IJavaElement[] elements= new IJavaElement[] {this}; - IJavaElement[] containers= new IJavaElement[] {container}; - - String[] renamings= null; + IJavaElement[] elements = new IJavaElement[] { this }; + IJavaElement[] containers = new IJavaElement[] { container }; + + String[] renamings = null; if (rename != null) { - renamings= new String[] {rename}; + renamings = new String[] { rename }; } getJavaModel().move(elements, containers, null, renamings, force, monitor); -} + } -/** - * @see Openable#openBuffer(IProgressMonitor) - */ -protected IBuffer openBuffer(IProgressMonitor pm) throws JavaModelException { + ///** + // * @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; - // 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(); + 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; -} -protected void openParent(IProgressMonitor pm) throws JavaModelException { - if (FIX_BUG25184) { - super.openParent(pm); - } else { - try { - super.openParent(pm); - } catch(JavaModelException e){ - // allow parent to not exist for compilation units defined outside classpath - if (!e.isDoesNotExist()){ - throw e; - } - } - } -} -protected boolean parentExists() { - if (FIX_BUG25184) { - return super.parentExists(); - } else { - return true; // tolerate units outside classpath + } + + /* + * @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 IWorkingCopy#reconcile() - */ -public IMarker[] reconcile() throws JavaModelException { - // Reconciling is not supported on non working copies + /** + * @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 IWorkingCopy#reconcile(boolean, IProgressMonitor) - */ -public void reconcile( - boolean forceProblemDetection, - IProgressMonitor monitor) - throws JavaModelException { - // Reconciling is not supported on non working copies -} + /** + * @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 ISourceManipulation#rename(String, boolean, IProgressMonitor) - */ -public void rename(String name, boolean force, IProgressMonitor monitor) throws JavaModelException { + /** + * @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$ + 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}; + IJavaElement[] elements = new IJavaElement[] { this }; + IJavaElement[] dests = new IJavaElement[] { this.getParent() }; + String[] renamings = new String[] { name }; getJavaModel().rename(elements, dests, renamings, force, monitor); -} -/** - * Does nothing - this is not a working copy. - * - * @see IWorkingCopy#restore() - */ -public void restore () throws JavaModelException { -} -/** - * @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)fParent).rootedAt(project), - fName); -} - -} + } + + /* + * @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