diff options
Diffstat (limited to 'org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/UnindexedSearchScope.java')
-rw-r--r-- | org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/UnindexedSearchScope.java | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/UnindexedSearchScope.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/UnindexedSearchScope.java new file mode 100644 index 000000000..15ab020d3 --- /dev/null +++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/UnindexedSearchScope.java @@ -0,0 +1,97 @@ +/******************************************************************************* + * Copyright (c) 2015, 2016 Google, Inc 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Stefan Xenos (Google) - Initial implementation + *******************************************************************************/ +package org.eclipse.jdt.internal.core.search; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.IPath; +import org.eclipse.jdt.core.IJavaElement; +import org.eclipse.jdt.core.IJavaElementDelta; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.search.IJavaSearchScope; + +public class UnindexedSearchScope extends AbstractSearchScope { + private IJavaSearchScope searchScope; + + private UnindexedSearchScope(IJavaSearchScope scope) { + this.searchScope = scope; + } + + public static IJavaSearchScope filterEntriesCoveredByTheNewIndex(IJavaSearchScope scope) { + return new UnindexedSearchScope(scope); + } + + @Override + public boolean encloses(String resourcePathString) { + int separatorIndex = resourcePathString.indexOf(JAR_FILE_ENTRY_SEPARATOR); + if (separatorIndex != -1) { + // Files within jar files would have been indexed + return false; + } + + // Jar files themselves would have been indexed + if (isJarFile(resourcePathString)) { + return false; + } + + // Consult with the search scope + return this.searchScope.encloses(resourcePathString); + } + + private boolean isJarFile(String possibleJarFile) { + if (possibleJarFile == null) { + return false; + } + return (possibleJarFile.endsWith(".jar") || possibleJarFile.endsWith(".JAR")); //$NON-NLS-1$//$NON-NLS-2$ + } + + @Override + public boolean encloses(IJavaElement element) { + try { + IResource underlyingResource = element.getUnderlyingResource(); + + if (underlyingResource != null && isJarFile(underlyingResource.getName())) { + return false; + } + } catch (JavaModelException e) { + JavaCore.getPlugin().getLog().log(e.getStatus()); + } + return this.searchScope.encloses(element); + } + + @Override + public IPath[] enclosingProjectsAndJars() { + IPath[] unfiltered = this.searchScope.enclosingProjectsAndJars(); + + List<IPath> result = new ArrayList<>(); + + for (IPath next : unfiltered) { + if (isJarFile(next.lastSegment())) { + continue; + } + result.add(next); + } + return result.toArray(new IPath[result.size()]); + } + + @Override + public void processDelta(IJavaElementDelta delta, int eventType) { + if (this.searchScope instanceof AbstractSearchScope) { + AbstractSearchScope inner = (AbstractSearchScope) this.searchScope; + + inner.processDelta(delta, eventType); + } + } + +} |