diff options
Diffstat (limited to 'org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.java')
-rw-r--r-- | org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.java | 114 |
1 files changed, 112 insertions, 2 deletions
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.java index 4c9d1e7f4..a2342ebc1 100644 --- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.java +++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/IndexBasedHierarchyBuilder.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2015 IBM Corporation and others. + * Copyright (c) 2000, 2016 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.jdt.internal.core.hierarchy; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; @@ -17,9 +18,12 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; +import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SubMonitor; @@ -50,9 +54,19 @@ import org.eclipse.jdt.internal.core.Member; import org.eclipse.jdt.internal.core.Openable; import org.eclipse.jdt.internal.core.PackageFragment; import org.eclipse.jdt.internal.core.SearchableEnvironment; +import org.eclipse.jdt.internal.core.nd.IReader; +import org.eclipse.jdt.internal.core.nd.Nd; +import org.eclipse.jdt.internal.core.nd.indexer.Indexer; +import org.eclipse.jdt.internal.core.nd.java.JavaIndex; +import org.eclipse.jdt.internal.core.nd.java.JavaNames; +import org.eclipse.jdt.internal.core.nd.java.NdType; +import org.eclipse.jdt.internal.core.nd.java.NdTypeId; +import org.eclipse.jdt.internal.core.nd.java.NdTypeInterface; +import org.eclipse.jdt.internal.core.nd.java.NdTypeSignature; import org.eclipse.jdt.internal.core.search.IndexQueryRequestor; import org.eclipse.jdt.internal.core.search.JavaSearchParticipant; import org.eclipse.jdt.internal.core.search.SubTypeSearchJob; +import org.eclipse.jdt.internal.core.search.UnindexedSearchScope; import org.eclipse.jdt.internal.core.search.indexing.IIndexConstants; import org.eclipse.jdt.internal.core.search.indexing.IndexManager; import org.eclipse.jdt.internal.core.search.matching.MatchLocator; @@ -467,7 +481,103 @@ public static void searchAllPossibleSubTypes( int waitingPolicy, // WaitUntilReadyToSearch | ForceImmediateSearch | CancelIfNotReadyToSearch final IProgressMonitor monitor) { - SubMonitor subMonitor = SubMonitor.convert(monitor); + if (JavaIndex.isEnabled()) { + SubMonitor subMonitor = SubMonitor.convert(monitor, 2); + newSearchAllPossibleSubTypes(type, scope, binariesFromIndexMatches, pathRequestor, waitingPolicy, + subMonitor.split(1)); + legacySearchAllPossibleSubTypes(type, UnindexedSearchScope.filterEntriesCoveredByTheNewIndex(scope), + binariesFromIndexMatches, pathRequestor, waitingPolicy, subMonitor.split(1)); + } else { + legacySearchAllPossibleSubTypes(type, scope, binariesFromIndexMatches, pathRequestor, waitingPolicy, + monitor); + } +} + +private static void newSearchAllPossibleSubTypes(IType type, IJavaSearchScope scope2, Map binariesFromIndexMatches2, + IPathRequestor pathRequestor, int waitingPolicy, IProgressMonitor progressMonitor) { + SubMonitor subMonitor = SubMonitor.convert(progressMonitor, 2); + JavaIndex index = JavaIndex.getIndex(); + + Indexer.getInstance().waitForIndex(waitingPolicy, subMonitor.split(1)); + + Nd nd = index.getNd(); + char[] fieldDefinition = JavaNames.fullyQualifiedNameToFieldDescriptor(type.getFullyQualifiedName().toCharArray()); + + IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); + + try (IReader reader = nd.acquireReadLock()) { + NdTypeId foundType = index.findType(fieldDefinition); + + if (foundType == null) { + return; + } + + ArrayDeque<NdType> typesToVisit = new ArrayDeque<>(); + Set<NdType> discoveredTypes = new HashSet<>(); + typesToVisit.addAll(foundType.getTypes()); + discoveredTypes.addAll(typesToVisit); + + while (!typesToVisit.isEmpty()) { + NdType nextType = typesToVisit.removeFirst(); + NdTypeId typeId = nextType.getTypeId(); + + String typePath = new String(JavaNames.getIndexPathFor(nextType, root)); + if (!scope2.encloses(typePath)) { + continue; + } + + subMonitor.setWorkRemaining(Math.max(typesToVisit.size(), 3000)).split(1); + + boolean isLocalClass = nextType.isLocal() || nextType.isAnonymous(); + pathRequestor.acceptPath(typePath, isLocalClass); + + HierarchyBinaryType binaryType = (HierarchyBinaryType)binariesFromIndexMatches2.get(typePath); + if (binaryType == null) { + binaryType = createBinaryTypeFrom(nextType); + binariesFromIndexMatches2.put(typePath, binaryType); + } + + for (NdType subType : typeId.getSubTypes()) { + if (discoveredTypes.add(subType)) { + typesToVisit.add(subType); + } + } + } + } +} + +private static HierarchyBinaryType createBinaryTypeFrom(NdType type) { + char[] enclosingTypeName = null; + NdTypeSignature enclosingType = type.getDeclaringType(); + if (enclosingType != null) { + enclosingTypeName = enclosingType.getRawType().getBinaryName(); + } + char[][] typeParameters = type.getTypeParameterSignatures(); + NdTypeId typeId = type.getTypeId(); + HierarchyBinaryType result = new HierarchyBinaryType(type.getModifiers(), typeId.getBinaryName(), + type.getSourceName(), enclosingTypeName, typeParameters.length == 0 ? null : typeParameters); + + NdTypeSignature superClass = type.getSuperclass(); + if (superClass != null) { + result.recordSuperclass(superClass.getRawType().getBinaryName()); + } + + for (NdTypeInterface interf : type.getInterfaces()) { + result.recordInterface(interf.getInterface().getRawType().getBinaryName()); + } + return result; +} + +private static void legacySearchAllPossibleSubTypes( + IType type, + IJavaSearchScope scope, + final Map binariesFromIndexMatches, + final IPathRequestor pathRequestor, + int waitingPolicy, // WaitUntilReadyToSearch | ForceImmediateSearch | CancelIfNotReadyToSearch + final IProgressMonitor progressMonitor) { + + SubMonitor subMonitor = SubMonitor.convert(progressMonitor, 100); + /* embed constructs inside arrays so as to pass them to (inner) collector */ final Queue queue = new Queue(); final HashtableOfObject foundSuperNames = new HashtableOfObject(5); |