### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: model/org/eclipse/jdt/internal/core/SelectionRequestor.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SelectionRequestor.java,v retrieving revision 1.77 diff -u -r1.77 SelectionRequestor.java --- model/org/eclipse/jdt/internal/core/SelectionRequestor.java 27 Jun 2008 16:03:51 -0000 1.77 +++ model/org/eclipse/jdt/internal/core/SelectionRequestor.java 9 Oct 2008 08:30:12 -0000 @@ -211,6 +211,28 @@ } } /** + * Resolve the type. + */ +public void acceptType(IType type) { + String key = type.getKey(); + if(type.isBinary()) { + ResolvedBinaryType resolvedType = new ResolvedBinaryType((JavaElement)type.getParent(), type.getElementName(), key); + resolvedType.occurrenceCount = type.getOccurrenceCount(); + type = resolvedType; + } else { + ResolvedSourceType resolvedType = new ResolvedSourceType((JavaElement)type.getParent(), type.getElementName(), key); + resolvedType.occurrenceCount = type.getOccurrenceCount(); + type = resolvedType; + } + + addElement(type); + if(SelectionEngine.DEBUG){ + System.out.print("SELECTION - accept type("); //$NON-NLS-1$ + System.out.print(type.toString()); + System.out.println(")"); //$NON-NLS-1$ + } +} +/** * @see ISelectionRequestor#acceptError */ public void acceptError(CategorizedProblem error) { Index: model/org/eclipse/jdt/internal/core/Openable.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/Openable.java,v retrieving revision 1.118 diff -u -r1.118 Openable.java --- model/org/eclipse/jdt/internal/core/Openable.java 27 Jun 2008 16:03:51 -0000 1.118 +++ model/org/eclipse/jdt/internal/core/Openable.java 9 Oct 2008 08:30:12 -0000 @@ -157,7 +157,7 @@ } // fix for 1FVXGDK - SelectionEngine engine = new SelectionEngine(environment, requestor, project.getOptions(true)); + SelectionEngine engine = new SelectionEngine(environment, requestor, project.getOptions(true), owner); engine.select(cu, offset, offset + length - 1); if(performanceStats != null) { Index: model/org/eclipse/jdt/internal/core/NamedMember.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/NamedMember.java,v retrieving revision 1.21 diff -u -r1.21 NamedMember.java --- model/org/eclipse/jdt/internal/core/NamedMember.java 27 Jun 2008 16:03:51 -0000 1.21 +++ model/org/eclipse/jdt/internal/core/NamedMember.java 9 Oct 2008 08:30:12 -0000 @@ -287,7 +287,7 @@ } TypeResolveRequestor requestor = new TypeResolveRequestor(); SelectionEngine engine = - new SelectionEngine(environment, requestor, project.getOptions(true)); + new SelectionEngine(environment, requestor, project.getOptions(true), owner); engine.selectType(typeName.toCharArray(), (IType) this); if (NameLookup.VERBOSE) { Index: model/org/eclipse/jdt/internal/core/eval/EvaluationContextWrapper.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/eval/EvaluationContextWrapper.java,v retrieving revision 1.59 diff -u -r1.59 EvaluationContextWrapper.java --- model/org/eclipse/jdt/internal/core/eval/EvaluationContextWrapper.java 27 Jun 2008 16:04:14 -0000 1.59 +++ model/org/eclipse/jdt/internal/core/eval/EvaluationContextWrapper.java 9 Oct 2008 08:30:12 -0000 @@ -132,7 +132,8 @@ offset + length - 1, environment, requestor, - this.project.getOptions(true) + this.project.getOptions(true), + owner ); return requestor.getElements(); } Index: codeassist/org/eclipse/jdt/internal/codeassist/SelectionEngine.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/SelectionEngine.java,v retrieving revision 1.148 diff -u -r1.148 SelectionEngine.java --- codeassist/org/eclipse/jdt/internal/codeassist/SelectionEngine.java 27 Jun 2008 16:04:05 -0000 1.148 +++ codeassist/org/eclipse/jdt/internal/codeassist/SelectionEngine.java 9 Oct 2008 08:30:11 -0000 @@ -14,11 +14,18 @@ import java.util.Map; import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.Signature; +import org.eclipse.jdt.core.WorkingCopyOwner; import org.eclipse.jdt.core.compiler.*; import org.eclipse.jdt.core.search.IJavaSearchConstants; +import org.eclipse.jdt.core.search.IJavaSearchScope; +import org.eclipse.jdt.core.search.SearchPattern; +import org.eclipse.jdt.core.search.TypeNameMatch; +import org.eclipse.jdt.core.search.TypeNameMatchRequestor; import org.eclipse.jdt.internal.codeassist.impl.*; import org.eclipse.jdt.internal.codeassist.select.*; import org.eclipse.jdt.internal.compiler.*; @@ -29,12 +36,17 @@ import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.parser.*; import org.eclipse.jdt.internal.compiler.problem.*; +import org.eclipse.jdt.internal.compiler.util.HashtableOfObject; +import org.eclipse.jdt.internal.compiler.util.ObjectVector; import org.eclipse.jdt.internal.core.BinaryTypeConverter; import org.eclipse.jdt.internal.core.ClassFile; +import org.eclipse.jdt.internal.core.JavaModelManager; import org.eclipse.jdt.internal.core.SearchableEnvironment; import org.eclipse.jdt.internal.core.SelectionRequestor; import org.eclipse.jdt.internal.core.SourceType; import org.eclipse.jdt.internal.core.SourceTypeElementInfo; +import org.eclipse.jdt.internal.core.search.BasicSearchEngine; +import org.eclipse.jdt.internal.core.search.TypeNameMatchRequestorWrapper; import org.eclipse.jdt.internal.core.util.ASTNodeFinder; import org.eclipse.jdt.internal.core.util.HashSetOfCharArrayArray; @@ -48,12 +60,126 @@ * performed instead. */ public final class SelectionEngine extends Engine implements ISearchRequestor { + + private class SelectionTypeNameMatchRequestorWrapper extends TypeNameMatchRequestorWrapper { + + class AcceptedType { + public int modifiers; + public char[] packageName; + public char[] simpleTypeName; + public String path; + public AccessRestriction access; + + public AcceptedType(int modifiers, char[] packageName, char[] simpleTypeName, String path, AccessRestriction access) { + this.modifiers = modifiers; + this.packageName = packageName; + this.simpleTypeName = simpleTypeName; + this.path = path; + this.access = access; + } + } + + private ImportReference[] importReferences; + + private boolean importCachesNodeInitialized = false; + private ImportReference[] onDemandImportsNodeCache; + private int onDemandImportsNodeCacheCount; + private char[][][] importsNodeCache; + private int importsNodeCacheCount; + + private HashtableOfObject onDemandFound = new HashtableOfObject(); + private ObjectVector notImportedFound = new ObjectVector(); + + public SelectionTypeNameMatchRequestorWrapper(TypeNameMatchRequestor requestor, IJavaSearchScope scope, ImportReference[] importReferences) { + super(requestor, scope); + this.importReferences = importReferences; + } + + public void acceptType(int modifiers, char[] packageName, char[] simpleTypeName, char[][] enclosingTypeNames, String path, AccessRestriction access) { + if (enclosingTypeNames != null && enclosingTypeNames.length > 0) return; + + if (!this.importCachesNodeInitialized) initializeImportNodeCaches(); + + char[] fullyQualifiedTypeName = CharOperation.concat(packageName, simpleTypeName, '.'); + + for (int i = 0; i < this.importsNodeCacheCount; i++) { + char[][] importName = this.importsNodeCache[i]; + if (CharOperation.equals(importName[0], simpleTypeName)) { + + if(CharOperation.equals(importName[1], fullyQualifiedTypeName)) { + super.acceptType(modifiers, packageName, simpleTypeName, enclosingTypeNames, path, access); + } + return; + } + } + + for (int i = 0; i < this.onDemandImportsNodeCacheCount; i++) { + char[][] importName = this.onDemandImportsNodeCache[i].tokens; + char[] importFlatName = CharOperation.concatWith(importName, '.'); + + if (CharOperation.equals(importFlatName, packageName)) { + + this.onDemandFound.put(simpleTypeName, simpleTypeName); + super.acceptType(modifiers, packageName, simpleTypeName, enclosingTypeNames, path, access); + return; + } + } + + + this.notImportedFound.add(new AcceptedType(modifiers, packageName, simpleTypeName, path, access)); + } + + public void acceptNotImported() { + int size = this.notImportedFound.size(); + for (int i = 0; i < size; i++) { + AcceptedType acceptedType = (AcceptedType)this.notImportedFound.elementAt(i); + + if (this.onDemandFound.get(acceptedType.simpleTypeName) == null) { + super.acceptType( + acceptedType.modifiers, + acceptedType.packageName, + acceptedType.simpleTypeName, + null, + acceptedType.path, + acceptedType.access); + } + } + } + + public void initializeImportNodeCaches() { + int length = this.importReferences == null ? 0 : this.importReferences.length; + + for (int i = 0; i < length; i++) { + ImportReference importReference = this.importReferences[i]; + if((importReference.bits & ASTNode.OnDemand) != 0) { + if(this.onDemandImportsNodeCache == null) { + this.onDemandImportsNodeCache = new ImportReference[length - i]; + } + this.onDemandImportsNodeCache[this.onDemandImportsNodeCacheCount++] = + importReference; + } else { + if(this.importsNodeCache == null) { + this.importsNodeCache = new char[length - i][][]; + } + + + this.importsNodeCache[this.importsNodeCacheCount++] = new char[][]{ + importReference.tokens[importReference.tokens.length - 1], + CharOperation.concatWith(importReference.tokens, '.') + }; + } + } + + this.importCachesNodeInitialized = true; + } + } public static boolean DEBUG = false; public static boolean PERF = false; SelectionParser parser; ISelectionRequestor requestor; + WorkingCopyOwner owner; boolean acceptedAnswer; @@ -97,7 +223,8 @@ public SelectionEngine( SearchableEnvironment nameEnvironment, ISelectionRequestor requestor, - Map settings) { + Map settings, + WorkingCopyOwner owner) { super(settings); @@ -140,6 +267,7 @@ this.lookupEnvironment = new LookupEnvironment(this, this.compilerOptions, problemReporter, nameEnvironment); this.parser = new SelectionParser(problemReporter); + this.owner = owner; } public void acceptType(char[] packageName, char[] simpleTypeName, char[][] enclosingTypeNames, int modifiers, AccessRestriction accessRestriction) { @@ -557,6 +685,74 @@ return false; } + + /* + * find all types outside the project scope + */ + private void findAllTypes(char[] prefix) { + try { + IProgressMonitor progressMonitor = new IProgressMonitor() { + boolean isCanceled = false; + public void beginTask(String name, int totalWork) { + // implements interface method + } + public void done() { + // implements interface method + } + public void internalWorked(double work) { + // implements interface method + } + public boolean isCanceled() { + return this.isCanceled; + } + public void setCanceled(boolean value) { + this.isCanceled = value; + } + public void setTaskName(String name) { + // implements interface method + } + public void subTask(String name) { + // implements interface method + } + public void worked(int work) { + // implements interface method + } + }; + + TypeNameMatchRequestor typeNameMatchRequestor = new TypeNameMatchRequestor() { + public void acceptTypeNameMatch(TypeNameMatch match) { + if (SelectionEngine.this.requestor instanceof SelectionRequestor) { + SelectionEngine.this.noProposal = false; + ((SelectionRequestor)SelectionEngine.this.requestor).acceptType(match.getType()); + } + } + }; + + IJavaSearchScope scope = BasicSearchEngine.createWorkspaceScope(); + + SelectionTypeNameMatchRequestorWrapper requestorWrapper = new SelectionTypeNameMatchRequestorWrapper(typeNameMatchRequestor, scope, this.unitScope.referenceContext.imports); + + org.eclipse.jdt.core.ICompilationUnit[] workingCopies = this.owner == null ? null : JavaModelManager.getJavaModelManager().getWorkingCopies(this.owner, true/*add primary WCs*/); + + try { + new BasicSearchEngine(workingCopies).searchAllTypeNames( + null, + SearchPattern.R_EXACT_MATCH, + CharOperation.toLowerCase(prefix), + SearchPattern.R_EXACT_MATCH, + IJavaSearchConstants.TYPE, + scope, + requestorWrapper, + IJavaSearchConstants.CANCEL_IF_NOT_READY_TO_SEARCH, + progressMonitor); + } catch (OperationCanceledException e) { + // do nothing + } + requestorWrapper.acceptNotImported(); + } catch (JavaModelException e) { + // do nothing + } + } public AssistParser getParser() { return this.parser; @@ -688,7 +884,11 @@ if ((this.unitScope = parsedUnit.scope) != null) { try { this.lookupEnvironment.completeTypeBindings(parsedUnit, true); + + CompilationUnitDeclaration previousUnitBeingCompleted = this.lookupEnvironment.unitBeingCompleted; + this.lookupEnvironment.unitBeingCompleted = parsedUnit; parsedUnit.scope.faultInTypes(); + this.lookupEnvironment.unitBeingCompleted = previousUnitBeingCompleted; ASTNode node = null; if (parsedUnit.types != null) node = parseBlockStatements(parsedUnit, selectionSourceStart); @@ -721,6 +921,11 @@ // accept qualified types only if no unqualified type was accepted if(!this.acceptedAnswer) { acceptQualifiedTypes(); + + // accept types from all the workspace only if no type was found in the project scope + if (this.noProposal) { + findAllTypes(this.selectedIdentifier); + } } } if(this.noProposal && this.problem != null) { Index: eval/org/eclipse/jdt/internal/eval/EvaluationContext.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/EvaluationContext.java,v retrieving revision 1.61 diff -u -r1.61 EvaluationContext.java --- eval/org/eclipse/jdt/internal/eval/EvaluationContext.java 25 Sep 2008 10:58:38 -0000 1.61 +++ eval/org/eclipse/jdt/internal/eval/EvaluationContext.java 9 Oct 2008 08:30:11 -0000 @@ -566,7 +566,8 @@ int selectionSourceEnd, SearchableEnvironment environment, ISelectionRequestor requestor, - Map options) { + Map options, + WorkingCopyOwner owner) { final char[] className = "CodeSnippetSelection".toCharArray(); //$NON-NLS-1$ final CodeSnippetToCuMapper mapper = new CodeSnippetToCuMapper( @@ -595,7 +596,7 @@ return null; } }; - SelectionEngine engine = new SelectionEngine(environment, mapper.getSelectionRequestor(requestor), options); + SelectionEngine engine = new SelectionEngine(environment, mapper.getSelectionRequestor(requestor), options, owner); engine.select(sourceUnit, mapper.startPosOffset + selectionSourceStart, mapper.startPosOffset + selectionSourceEnd); } /** #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/model/ResolveTests2.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ResolveTests2.java,v retrieving revision 1.2 diff -u -r1.2 ResolveTests2.java --- src/org/eclipse/jdt/core/tests/model/ResolveTests2.java 27 Jun 2008 16:02:40 -0000 1.2 +++ src/org/eclipse/jdt/core/tests/model/ResolveTests2.java 9 Oct 2008 08:30:13 -0000 @@ -10,8 +10,11 @@ *******************************************************************************/ package org.eclipse.jdt.core.tests.model; -import org.eclipse.jdt.core.*; +import java.io.File; +import java.util.HashMap; +import org.eclipse.jdt.core.*; +import org.eclipse.jdt.core.tests.util.Util; import junit.framework.*; public class ResolveTests2 extends ModifyingResourceTests { @@ -68,7 +71,7 @@ assertElementsEqual( "Unexpected elements", - "", + "Object [in Object.class [in java.lang [in "+ getExternalJCLPathString() + "]]]", // Object is found in another project with Object on his classpath elements ); } finally { @@ -192,4 +195,745 @@ this.deleteProject("P1"); } } + +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=232880 +public void testBug232880a() throws Exception { + String outputDirectory = Util.getOutputDirectory(); + String externalJar1 = outputDirectory + File.separator + "bug232880a.jar"; //$NON-NLS-1$ + String externalJar2 = outputDirectory + File.separator + "bug232880b.jar"; //$NON-NLS-1$ + try { + + // create external jar 1 + Util.createJar( + new String[] { + "test1/IResource.java", //$NON-NLS-1$ + "package test1;\n" + //$NON-NLS-1$ + "public class IResource {\n" + //$NON-NLS-1$ + "}" //$NON-NLS-1$ + }, + new HashMap(), + externalJar1); + + // create external jar 2 + String source2 = + "package test2;\n" + //$NON-NLS-1$ + "import test1.IResource;\n" + //$NON-NLS-1$ + "public class IJavaElement {\n" + //$NON-NLS-1$ + " IResource foo() {return null;}\n" + //$NON-NLS-1$ + "}"; //$NON-NLS-1$ + + Util.createJar( + new String[] { + "test2/IJavaElement.java", //$NON-NLS-1$ + source2 + }, + null, + new HashMap(), + new String[]{externalJar1}, + externalJar2); + + // create P1 + IJavaProject project1 = this.createJavaProject( + "PS1", + new String[]{"src"}, + new String[]{"JCL_LIB", externalJar1, externalJar2}, + "bin"); + + this.createFolder("/PS1/attachment/test2"); + this.createFile( + "/PS1/attachment/test2/IJavaElement.java", + source2); + + IPackageFragmentRoot root = project1.getPackageFragmentRoot(externalJar2); + attachSource(root, "/PS1/attachment/", ""); + + waitUntilIndexesReady(); + + // do code select + IClassFile cf = getClassFile("PS1", externalJar2, "test2", "IJavaElement.class"); + + IJavaElement[] elements = codeSelect(cf, "IResource foo", "IResource"); + + assertElementsEqual( + "Unexpected elements", + "IResource [in IResource.class [in test1 [in "+outputDirectory + File.separator+"bug232880a.jar]]]", + elements + ); + } finally { + this.deleteExternalFile(externalJar1); + this.deleteExternalFile(externalJar2); + refreshExternalArchives(getJavaProject("PS1")); // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=250083 + this.deleteProject("PS1"); + } +} +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=232880 +public void testBug232880b() throws Exception { + String outputDirectory = Util.getOutputDirectory(); + String externalJar1 = outputDirectory + File.separator + "bug232880a.jar"; //$NON-NLS-1$ + String externalJar2 = outputDirectory + File.separator + "bug232880b.jar"; //$NON-NLS-1$ + try { + + // create external jar 1 + Util.createJar( + new String[] { + "test1/IResource.java", //$NON-NLS-1$ + "package test1;\n" + //$NON-NLS-1$ + "public class IResource {\n" + //$NON-NLS-1$ + "}" //$NON-NLS-1$ + }, + new HashMap(), + externalJar1); + + // create external jar 2 + String source2 = + "package test2;\n" + //$NON-NLS-1$ + "import test1.IResource;\n" + //$NON-NLS-1$ + "public class IJavaElement {\n" + //$NON-NLS-1$ + " IResource foo() {return null;}\n" + //$NON-NLS-1$ + "}"; //$NON-NLS-1$ + + Util.createJar( + new String[] { + "test2/IJavaElement.java", //$NON-NLS-1$ + source2 + }, + null, + new HashMap(), + new String[]{externalJar1}, + externalJar2); + + // create P1 + IJavaProject project1 = this.createJavaProject( + "PS1", + new String[]{"src"}, + new String[]{"JCL_LIB", externalJar2}, + "bin"); + + this.createFolder("/PS1/attachment/test2"); + this.createFile( + "/PS1/attachment/test2/IJavaElement.java", + source2); + + IPackageFragmentRoot root = project1.getPackageFragmentRoot(externalJar2); + attachSource(root, "/PS1/attachment/", ""); + + waitUntilIndexesReady(); + + // do code select + IClassFile cf = getClassFile("PS1", externalJar2, "test2", "IJavaElement.class"); + + IJavaElement[] elements = codeSelect(cf, "IResource foo", "IResource"); + + assertElementsEqual( + "Unexpected elements", + "", + elements + ); + } finally { + this.deleteExternalFile(externalJar1); + this.deleteExternalFile(externalJar2); + refreshExternalArchives(getJavaProject("PS1")); // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=250083 + this.deleteProject("PS1"); + } +} +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=232880 +public void testBug232880c() throws Exception { + String outputDirectory = Util.getOutputDirectory(); + String externalJar1 = outputDirectory + File.separator + "bug232880a.jar"; //$NON-NLS-1$ + String externalJar2 = outputDirectory + File.separator + "bug232880b.jar"; //$NON-NLS-1$ + try { + + // create external jar 1 + Util.createJar( + new String[] { + "test1/IResource.java", //$NON-NLS-1$ + "package test1;\n" + //$NON-NLS-1$ + "public class IResource {\n" + //$NON-NLS-1$ + "}" //$NON-NLS-1$ + }, + new HashMap(), + externalJar1); + + // create external jar 2 + String source2 = + "package test2;\n" + //$NON-NLS-1$ + "import test1.IResource;\n" + //$NON-NLS-1$ + "public class IJavaElement {\n" + //$NON-NLS-1$ + " IResource foo() {return null;}\n" + //$NON-NLS-1$ + "}"; //$NON-NLS-1$ + + Util.createJar( + new String[] { + "test2/IJavaElement.java", //$NON-NLS-1$ + source2 + }, + null, + new HashMap(), + new String[]{externalJar1}, + externalJar2); + + // create P1 + IJavaProject project1 = this.createJavaProject( + "PS1", + new String[]{"src"}, + new String[]{"JCL_LIB", externalJar2}, + "bin"); + + this.createFolder("/PS1/attachment/test2"); + this.createFile( + "/PS1/attachment/test2/IJavaElement.java", + source2); + + IPackageFragmentRoot root = project1.getPackageFragmentRoot(externalJar2); + attachSource(root, "/PS1/attachment/", ""); + + // create P2 + this.createJavaProject( + "PS2", + new String[]{"src"}, + new String[]{"JCL_LIB", externalJar1}, + "bin"); + + waitUntilIndexesReady(); + + // do code select + IClassFile cf = getClassFile("PS1", externalJar2, "test2", "IJavaElement.class"); + + IJavaElement[] elements = codeSelect(cf, "IResource foo", "IResource"); + + assertElementsEqual( + "Unexpected elements", + "IResource [in IResource.class [in test1 [in "+outputDirectory+File.separator+"bug232880a.jar]]]", + elements + ); + } finally { + this.deleteExternalFile(externalJar1); + this.deleteExternalFile(externalJar2); + refreshExternalArchives(getJavaProject("PS1")); // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=250083 + refreshExternalArchives(getJavaProject("PS2")); // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=250083 + this.deleteProject("PS1"); + this.deleteProject("PS2"); + } +} +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=232880 +public void testBug232880d() throws Exception { + String outputDirectory = Util.getOutputDirectory(); + String externalJar1 = outputDirectory + File.separator + "bug232880a.jar"; //$NON-NLS-1$ + String externalJar2 = outputDirectory + File.separator + "bug232880b.jar"; //$NON-NLS-1$ + try { + + // create external jar 1 + String source1 = + "package test1;\n" + //$NON-NLS-1$ + "public class IResource {\n" + //$NON-NLS-1$ + "}"; //$NON-NLS-1$ + + Util.createJar( + new String[] { + "test1/IResource.java", //$NON-NLS-1$ + source1 + }, + new HashMap(), + externalJar1); + + // create external jar 2 + String source2 = + "package test2;\n" + //$NON-NLS-1$ + "import test1.IResource;\n" + //$NON-NLS-1$ + "public class IJavaElement {\n" + //$NON-NLS-1$ + " IResource foo() {return null;}\n" + //$NON-NLS-1$ + "}"; //$NON-NLS-1$ + + Util.createJar( + new String[] { + "test2/IJavaElement.java", //$NON-NLS-1$ + source2 + }, + null, + new HashMap(), + new String[]{externalJar1}, + externalJar2); + + // create P1 + IJavaProject project1 = this.createJavaProject( + "PS1", + new String[]{"src"}, + new String[]{"JCL_LIB", externalJar2}, + "bin"); + + this.createFolder("/PS1/attachment/test2"); + this.createFile( + "/PS1/attachment/test2/IJavaElement.java", + source2); + + IPackageFragmentRoot root = project1.getPackageFragmentRoot(externalJar2); + attachSource(root, "/PS1/attachment/", ""); + + // create P2 + this.createJavaProject( + "PS2", + new String[]{"src"}, + new String[]{"JCL_LIB"}, + "bin"); + + this.createFolder("/PS2/src/test1"); + this.createFile( + "/PS2/src/test1/IResource.java", + source1); + + waitUntilIndexesReady(); + + // do code select + IClassFile cf = getClassFile("PS1", externalJar2, "test2", "IJavaElement.class"); + + IJavaElement[] elements = codeSelect(cf, "IResource foo", "IResource"); + + assertElementsEqual( + "Unexpected elements", + "IResource [in IResource.java [in test1 [in src [in PS2]]]]", + elements + ); + } finally { + this.deleteExternalFile(externalJar1); + this.deleteExternalFile(externalJar2); + refreshExternalArchives(getJavaProject("PS1")); // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=250083 + refreshExternalArchives(getJavaProject("PS2")); // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=250083 + this.deleteProject("PS1"); + this.deleteProject("PS2"); + } +} +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=232880 +public void testBug232880e() throws Exception { + String outputDirectory = Util.getOutputDirectory(); + String externalJar1 = outputDirectory + File.separator + "bug232880a.jar"; //$NON-NLS-1$ + String externalJar2 = outputDirectory + File.separator + "bug232880b.jar"; //$NON-NLS-1$ + try { + + // create external jar 1 + String source1_1 = + "package test1;\n" + //$NON-NLS-1$ + "public class CoreException extends Exception {\n" + //$NON-NLS-1$ + "}"; //$NON-NLS-1$ + + String source1_2 = + "package test1;\n" + //$NON-NLS-1$ + "public class IResource {\n" + //$NON-NLS-1$ + "}"; //$NON-NLS-1$ + + Util.createJar( + new String[] { + "test1/CoreException.java", //$NON-NLS-1$ + source1_1, + "test1/IResource.java", //$NON-NLS-1$ + source1_2 + }, + new HashMap(), + externalJar1); + + // create external jar 2 + String source2_1 = + "package test2;\n" + //$NON-NLS-1$ + "import test1.CoreException;\n" + //$NON-NLS-1$ + "public class JavaModelException extends CoreException {\n" + //$NON-NLS-1$ + "}"; //$NON-NLS-1$ + + String source2_2 = + "package test2;\n" + //$NON-NLS-1$ + "import test1.IResource;\n" + //$NON-NLS-1$ + "public class IJavaElement {\n" + //$NON-NLS-1$ + " void foo1() throws JavaModelException {}\n" + //$NON-NLS-1$ + " IResource foo2() {return null;}\n" + //$NON-NLS-1$ + "}"; //$NON-NLS-1$ + + Util.createJar( + new String[] { + "test2/JavaModelException.java", //$NON-NLS-1$ + source2_1, + "test2/IJavaElement.java", //$NON-NLS-1$ + source2_2 + }, + null, + new HashMap(), + new String[]{externalJar1}, + externalJar2); + + // create P1 + IJavaProject project1 = this.createJavaProject( + "PS1", + new String[]{"src"}, + new String[]{"JCL_LIB", externalJar2}, + "bin"); + + this.createFolder("/PS1/attachment/test2"); + this.createFile( + "/PS1/attachment/test2/IJavaElement.java", + source2_2); + + IPackageFragmentRoot root = project1.getPackageFragmentRoot(externalJar2); + attachSource(root, "/PS1/attachment/", ""); + + // create P2 + this.createJavaProject( + "PS2", + new String[]{"src"}, + new String[]{"JCL_LIB"}, + "bin"); + + this.createFolder("/PS2/src/test1"); + this.createFile( + "/PS2/src/test1/IResource.java", + source1_2); + + waitUntilIndexesReady(); + + // do code select + IClassFile cf = getClassFile("PS1", externalJar2, "test2", "IJavaElement.class"); + + IJavaElement[] elements = codeSelect(cf, "IResource foo", "IResource"); + + assertElementsEqual( + "Unexpected elements", + "IResource [in IResource.java [in test1 [in src [in PS2]]]]", + elements + ); + } finally { + this.deleteExternalFile(externalJar1); + this.deleteExternalFile(externalJar2); + refreshExternalArchives(getJavaProject("PS1")); // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=250083 + refreshExternalArchives(getJavaProject("PS2")); // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=250083 + this.deleteProject("PS1"); + this.deleteProject("PS2"); + } +} +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=232880 +public void testBug232880f() throws Exception { + String outputDirectory = Util.getOutputDirectory(); + String externalJar1 = outputDirectory + File.separator + "bug232880a.jar"; //$NON-NLS-1$ + String externalJar2 = outputDirectory + File.separator + "bug232880b.jar"; //$NON-NLS-1$ + try { + + // create external jar 1 + Util.createJar( + new String[] { + "test1/IResource.java", //$NON-NLS-1$ + "package test1;\n" + //$NON-NLS-1$ + "public class IResource {\n" + //$NON-NLS-1$ + "}", //$NON-NLS-1$ + "test2/IResource.java", //$NON-NLS-1$ + "package test2;\n" + //$NON-NLS-1$ + "public class IResource {\n" + //$NON-NLS-1$ + "}" //$NON-NLS-1$ + }, + new HashMap(), + externalJar1); + + // create external jar 2 + String source2 = + "package test3;\n" + //$NON-NLS-1$ + "import test2.IResource;\n" + //$NON-NLS-1$ + "public class IJavaElement {\n" + //$NON-NLS-1$ + " IResource foo() {return null;}\n" + //$NON-NLS-1$ + "}"; //$NON-NLS-1$ + + Util.createJar( + new String[] { + "test3/IJavaElement.java", //$NON-NLS-1$ + source2 + }, + null, + new HashMap(), + new String[]{externalJar1}, + externalJar2); + + // create P1 + IJavaProject project1 = this.createJavaProject( + "PS1", + new String[]{"src"}, + new String[]{"JCL_LIB", externalJar2}, + "bin"); + + this.createFolder("/PS1/attachment/test3"); + this.createFile( + "/PS1/attachment/test3/IJavaElement.java", + source2); + + IPackageFragmentRoot root = project1.getPackageFragmentRoot(externalJar2); + attachSource(root, "/PS1/attachment/", ""); + + // create P2 + this.createJavaProject( + "PS2", + new String[]{"src"}, + new String[]{"JCL_LIB", externalJar1}, + "bin"); + + waitUntilIndexesReady(); + + // do code select + IClassFile cf = getClassFile("PS1", externalJar2, "test3", "IJavaElement.class"); + + IJavaElement[] elements = codeSelect(cf, "IResource foo", "IResource"); + + assertElementsEqual( + "Unexpected elements", + "IResource [in IResource.class [in test2 [in "+outputDirectory+File.separator+"bug232880a.jar]]]", + elements + ); + } finally { + this.deleteExternalFile(externalJar1); + this.deleteExternalFile(externalJar2); + refreshExternalArchives(getJavaProject("PS1")); // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=250083 + refreshExternalArchives(getJavaProject("PS2")); // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=250083 + this.deleteProject("PS1"); + this.deleteProject("PS2"); + } +} +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=232880 +public void testBug232880g() throws Exception { + String outputDirectory = Util.getOutputDirectory(); + String externalJar1 = outputDirectory + File.separator + "bug232880a.jar"; //$NON-NLS-1$ + String externalJar2 = outputDirectory + File.separator + "bug232880b.jar"; //$NON-NLS-1$ + try { + + // create external jar 1 + Util.createJar( + new String[] { + "test1/IResource.java", //$NON-NLS-1$ + "package test1;\n" + //$NON-NLS-1$ + "public class IResource {\n" + //$NON-NLS-1$ + "}", //$NON-NLS-1$ + "test2/IResource.java", //$NON-NLS-1$ + "package test2;\n" + //$NON-NLS-1$ + "public class IResource {\n" + //$NON-NLS-1$ + "}" //$NON-NLS-1$ + }, + new HashMap(), + externalJar1); + + // create external jar 2 + String source2 = + "package test3;\n" + //$NON-NLS-1$ + "import test2.*;\n" + //$NON-NLS-1$ + "public class IJavaElement {\n" + //$NON-NLS-1$ + " IResource foo() {return null;}\n" + //$NON-NLS-1$ + "}"; //$NON-NLS-1$ + + Util.createJar( + new String[] { + "test3/IJavaElement.java", //$NON-NLS-1$ + source2 + }, + null, + new HashMap(), + new String[]{externalJar1}, + externalJar2); + + // create P1 + IJavaProject project1 = this.createJavaProject( + "PS1", + new String[]{"src"}, + new String[]{"JCL_LIB", externalJar2}, + "bin"); + + this.createFolder("/PS1/attachment/test3"); + this.createFile( + "/PS1/attachment/test3/IJavaElement.java", + source2); + + IPackageFragmentRoot root = project1.getPackageFragmentRoot(externalJar2); + attachSource(root, "/PS1/attachment/", ""); + + // create P2 + this.createJavaProject( + "PS2", + new String[]{"src"}, + new String[]{"JCL_LIB", externalJar1}, + "bin"); + + waitUntilIndexesReady(); + + // do code select + IClassFile cf = getClassFile("PS1", externalJar2, "test3", "IJavaElement.class"); + + IJavaElement[] elements = codeSelect(cf, "IResource foo", "IResource"); + + assertElementsEqual( + "Unexpected elements", + "IResource [in IResource.class [in test2 [in "+outputDirectory+File.separator+"bug232880a.jar]]]", + elements + ); + } finally { + this.deleteExternalFile(externalJar1); + this.deleteExternalFile(externalJar2); + refreshExternalArchives(getJavaProject("PS1")); // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=250083 + refreshExternalArchives(getJavaProject("PS2")); // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=250083 + this.deleteProject("PS1"); + this.deleteProject("PS2"); + } +}//https://bugs.eclipse.org/bugs/show_bug.cgi?id=232880 +public void testBug232880h() throws Exception { + String outputDirectory = Util.getOutputDirectory(); + String externalJar1 = outputDirectory + File.separator + "bug232880a.jar"; //$NON-NLS-1$ + String externalJar2 = outputDirectory + File.separator + "bug232880b.jar"; //$NON-NLS-1$ + try { + + // create external jar 1 + Util.createJar( + new String[] { + "test1/IResource.java", //$NON-NLS-1$ + "package test1;\n" + //$NON-NLS-1$ + "public class IResource {\n" + //$NON-NLS-1$ + "}", //$NON-NLS-1$ + "test2/IResource.java", //$NON-NLS-1$ + "package test2;\n" + //$NON-NLS-1$ + "public class IResource {\n" + //$NON-NLS-1$ + "}" //$NON-NLS-1$ + }, + new HashMap(), + externalJar1); + + // create external jar 2 + String source2 = + "package test3;\n" + //$NON-NLS-1$ + "import test1.*;\n" + //$NON-NLS-1$ + "import test2.IResource;\n" + //$NON-NLS-1$ + "public class IJavaElement {\n" + //$NON-NLS-1$ + " IResource foo() {return null;}\n" + //$NON-NLS-1$ + "}"; //$NON-NLS-1$ + + Util.createJar( + new String[] { + "test3/IJavaElement.java", //$NON-NLS-1$ + source2 + }, + null, + new HashMap(), + new String[]{externalJar1}, + externalJar2); + + // create P1 + IJavaProject project1 = this.createJavaProject( + "PS1", + new String[]{"src"}, + new String[]{"JCL_LIB", externalJar2}, + "bin"); + + this.createFolder("/PS1/attachment/test3"); + this.createFile( + "/PS1/attachment/test3/IJavaElement.java", + source2); + + IPackageFragmentRoot root = project1.getPackageFragmentRoot(externalJar2); + attachSource(root, "/PS1/attachment/", ""); + + // create P2 + this.createJavaProject( + "PS2", + new String[]{"src"}, + new String[]{"JCL_LIB", externalJar1}, + "bin"); + + waitUntilIndexesReady(); + + // do code select + IClassFile cf = getClassFile("PS1", externalJar2, "test3", "IJavaElement.class"); + + IJavaElement[] elements = codeSelect(cf, "IResource foo", "IResource"); + + assertElementsEqual( + "Unexpected elements", + "IResource [in IResource.class [in test2 [in "+outputDirectory+File.separator+"bug232880a.jar]]]", + elements + ); + } finally { + this.deleteExternalFile(externalJar1); + this.deleteExternalFile(externalJar2); + refreshExternalArchives(getJavaProject("PS1")); // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=250083 + refreshExternalArchives(getJavaProject("PS2")); // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=250083 + this.deleteProject("PS1"); + this.deleteProject("PS2"); + } +} +public void testBug232880i() throws Exception { + String outputDirectory = Util.getOutputDirectory(); + String externalJar1 = outputDirectory + File.separator + "bug232880a.jar"; //$NON-NLS-1$ + String externalJar2 = outputDirectory + File.separator + "bug232880b.jar"; //$NON-NLS-1$ + try { + + // create external jar 1 + Util.createJar( + new String[] { + "test1/IResource.java", //$NON-NLS-1$ + "package test1;\n" + //$NON-NLS-1$ + "public class IResource {\n" + //$NON-NLS-1$ + "}", //$NON-NLS-1$ + "test2/IResource.java", //$NON-NLS-1$ + "package test2;\n" + //$NON-NLS-1$ + "public class IResource {\n" + //$NON-NLS-1$ + "}" //$NON-NLS-1$ + }, + new HashMap(), + externalJar1); + + // create external jar 2 + String source2 = + "package test3;\n" + //$NON-NLS-1$ + "public class IJavaElement {\n" + //$NON-NLS-1$ + " test2.IResource foo() {return null;}\n" + //$NON-NLS-1$ + "}"; //$NON-NLS-1$ + + Util.createJar( + new String[] { + "test3/IJavaElement.java", //$NON-NLS-1$ + source2 + }, + null, + new HashMap(), + new String[]{externalJar1}, + externalJar2); + + // create P1 + IJavaProject project1 = this.createJavaProject( + "PS1", + new String[]{"src"}, + new String[]{"JCL_LIB", externalJar2}, + "bin"); + + this.createFolder("/PS1/attachment/test3"); + this.createFile( + "/PS1/attachment/test3/IJavaElement.java", + source2); + + IPackageFragmentRoot root = project1.getPackageFragmentRoot(externalJar2); + attachSource(root, "/PS1/attachment/", ""); + + // create P2 + this.createJavaProject( + "PS2", + new String[]{"src"}, + new String[]{"JCL_LIB", externalJar1}, + "bin"); + + waitUntilIndexesReady(); + + // do code select + IClassFile cf = getClassFile("PS1", externalJar2, "test3", "IJavaElement.class"); + + IJavaElement[] elements = codeSelect(cf, "IResource foo", "IResource"); + + assertElementsEqual( + "Unexpected elements", + "IResource [in IResource.class [in test1 [in "+outputDirectory+File.separator+"bug232880a.jar]]]\n" + + "IResource [in IResource.class [in test2 [in "+outputDirectory+File.separator+"bug232880a.jar]]]", + elements + ); + } finally { + this.deleteExternalFile(externalJar1); + this.deleteExternalFile(externalJar2); + refreshExternalArchives(getJavaProject("PS1")); // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=250083 + refreshExternalArchives(getJavaProject("PS2")); // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=250083 + this.deleteProject("PS1"); + this.deleteProject("PS2"); + } +} }