JDT Camelcase search
This commit is contained in:
@@ -30,6 +30,7 @@ import org.springframework.ide.vscode.commons.protocol.java.JavaSearchParams;
|
||||
import org.springframework.ide.vscode.commons.protocol.java.JavaTypeHierarchyParams;
|
||||
import org.springframework.ide.vscode.commons.protocol.java.TypeData;
|
||||
import org.springframework.ide.vscode.commons.protocol.java.TypeDescriptorData;
|
||||
import org.springframework.ide.vscode.commons.protocol.java.JavaSearchParams.SearchType;
|
||||
import org.springframework.tooling.ls.eclipse.commons.STS4LanguageClientImpl;
|
||||
|
||||
public class JavaLangugeClientTest {
|
||||
@@ -89,7 +90,7 @@ public class JavaLangugeClientTest {
|
||||
@Test
|
||||
public void fuzzyFindTypesIncludingSysLibs() throws Exception {
|
||||
List<TypeDescriptorData> data = client
|
||||
.javaSearchTypes(new JavaSearchParams(project.getLocationURI().toString(), "util.Map", true, true))
|
||||
.javaSearchTypes(new JavaSearchParams(project.getLocationURI().toString(), "util.Map", SearchType.FUZZY, true, true))
|
||||
.get(100, TimeUnit.SECONDS);
|
||||
assertNotNull(data);
|
||||
assertEquals(500, data.size());
|
||||
@@ -101,7 +102,7 @@ public class JavaLangugeClientTest {
|
||||
@Test
|
||||
public void fuzzyFindTypesExcludingSysLibs() throws Exception {
|
||||
List<TypeDescriptorData> data = client
|
||||
.javaSearchTypes(new JavaSearchParams(project.getLocationURI().toString(), "util.Map", true, false))
|
||||
.javaSearchTypes(new JavaSearchParams(project.getLocationURI().toString(), "util.Map", SearchType.FUZZY, true, false))
|
||||
.get(10, TimeUnit.SECONDS);
|
||||
assertNotNull(data);
|
||||
assertEquals(186, data.size());
|
||||
@@ -114,7 +115,7 @@ public class JavaLangugeClientTest {
|
||||
@Test
|
||||
public void fuzzyFindAllTypesExcludingSysLibs() throws Exception {
|
||||
List<TypeDescriptorData> data = client
|
||||
.javaSearchTypes(new JavaSearchParams(project.getLocationURI().toString(), "", true, false))
|
||||
.javaSearchTypes(new JavaSearchParams(project.getLocationURI().toString(), "", SearchType.FUZZY, true, false))
|
||||
.get(1000, TimeUnit.SECONDS);
|
||||
assertNotNull(data);
|
||||
assertEquals(500, data.size());
|
||||
@@ -122,21 +123,21 @@ public class JavaLangugeClientTest {
|
||||
|
||||
@Test
|
||||
public void searchPackagesIncludingSysLibs() throws Exception {
|
||||
List<String> packages = client.javaSearchPackages(new JavaSearchParams(project.getLocationURI().toString(), "java.lang", true, true)).get(30, TimeUnit.SECONDS);
|
||||
List<String> packages = client.javaSearchPackages(new JavaSearchParams(project.getLocationURI().toString(), "java.lang", SearchType.FUZZY, true, true)).get(30, TimeUnit.SECONDS);
|
||||
assertTrue(packages.size() > 15 && packages.size() < 25);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void searchPackagesExcludingSysLibs() throws Exception {
|
||||
List<String> packages = client.javaSearchPackages(new JavaSearchParams(project.getLocationURI().toString(), "java.lang", true, false)).get(30, TimeUnit.SECONDS);
|
||||
List<String> packages = client.javaSearchPackages(new JavaSearchParams(project.getLocationURI().toString(), "java.lang", SearchType.FUZZY, true, false)).get(30, TimeUnit.SECONDS);
|
||||
assertEquals(1, packages.size());
|
||||
packages = client.javaSearchPackages(new JavaSearchParams(project.getLocationURI().toString(), "org.test", true, false)).get(30, TimeUnit.SECONDS);
|
||||
packages = client.javaSearchPackages(new JavaSearchParams(project.getLocationURI().toString(), "org.test", SearchType.FUZZY, true, false)).get(30, TimeUnit.SECONDS);
|
||||
assertTrue(packages.contains("org.test"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void searchAllPackagesExcludingSysLibs() throws Exception {
|
||||
List<String> packages = client.javaSearchPackages(new JavaSearchParams(project.getLocationURI().toString(), "", true, false)).get(30, TimeUnit.SECONDS);
|
||||
List<String> packages = client.javaSearchPackages(new JavaSearchParams(project.getLocationURI().toString(), "", SearchType.FUZZY, true, false)).get(30, TimeUnit.SECONDS);
|
||||
assertEquals(500, packages.size());
|
||||
}
|
||||
|
||||
@@ -220,4 +221,41 @@ public class JavaLangugeClientTest {
|
||||
));
|
||||
assertEquals(expected, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void camelcaseFindTypesExcludingSysLibs_1() throws Exception {
|
||||
List<TypeDescriptorData> data = client
|
||||
.javaSearchTypes(new JavaSearchParams(project.getLocationURI().toString(), "springb", SearchType.CAMELCASE, true, false))
|
||||
.get(10, TimeUnit.SECONDS);
|
||||
assertNotNull(data);
|
||||
assertEquals(24, data.size());
|
||||
List<String> closeMatches = data.stream().map(t -> t.getFqName()).filter(t -> t.endsWith("SpringBootApplication")).collect(Collectors.toList());
|
||||
assertEquals(1, closeMatches.size());
|
||||
assertEquals("org.springframework.boot.autoconfigure.SpringBootApplication", closeMatches.get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void camelcaseFindTypesExcludingSysLibs_2() throws Exception {
|
||||
List<TypeDescriptorData> data = client
|
||||
.javaSearchTypes(new JavaSearchParams(project.getLocationURI().toString(), "SpBA", SearchType.CAMELCASE, true, false))
|
||||
.get(10, TimeUnit.SECONDS);
|
||||
assertNotNull(data);
|
||||
assertEquals(2, data.size());
|
||||
Set<String> actual = data.stream().map(t -> t.getFqName()).collect(Collectors.toSet());
|
||||
Set<String> expected = new HashSet<>(Arrays.asList(
|
||||
"org.springframework.boot.autoconfigure.SpringBootApplication",
|
||||
"org.springframework.web.context.support.SpringBeanAutowiringSupport"
|
||||
));
|
||||
assertEquals(expected, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void camelcaseFindAllTypesExcludingSysLibs() throws Exception {
|
||||
List<TypeDescriptorData> data = client
|
||||
.javaSearchTypes(new JavaSearchParams(project.getLocationURI().toString(), "", SearchType.CAMELCASE, true, false))
|
||||
.get(1000, TimeUnit.SECONDS);
|
||||
assertNotNull(data);
|
||||
assertEquals(500, data.size());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -105,6 +105,12 @@ public final class JandexClasspath implements ClasspathIndex {
|
||||
return javaIndex.get().fuzzySearchITypes(searchTerm);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Flux<Tuple2<IType, Double>> camelcaseSearchTypes(String searchTerm, boolean includeBinaries,
|
||||
boolean includeSystemLibs) {
|
||||
throw new UnsupportedOperationException("Not implemented for Jandex index!");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Flux<Tuple2<String, Double>> fuzzySearchPackages(String searchTerm, boolean includeBinaries, boolean includeSystemLibs) {
|
||||
return javaIndex.get().fuzzySearchPackages(searchTerm);
|
||||
|
||||
@@ -18,6 +18,7 @@ public interface ClasspathIndex extends Disposable {
|
||||
|
||||
IType findType(String fqName);
|
||||
Flux<Tuple2<IType, Double>> fuzzySearchTypes(String searchTerm, boolean includeBinaries, boolean includeSystemLibs);
|
||||
Flux<Tuple2<IType, Double>> camelcaseSearchTypes(String searchTerm, boolean includeBinaries, boolean includeSystemLibs);
|
||||
Flux<Tuple2<String, Double>> fuzzySearchPackages(String searchTerm, boolean includeBinaries, boolean includeSystemLibs);
|
||||
Flux<IType> allSubtypesOf(String fqName, boolean includeFocusType);
|
||||
Flux<IType> allSuperTypesOf(String fqName, boolean includeFocusType);
|
||||
|
||||
@@ -33,6 +33,7 @@ import org.springframework.ide.vscode.commons.protocol.STS4LanguageClient;
|
||||
import org.springframework.ide.vscode.commons.protocol.java.Classpath;
|
||||
import org.springframework.ide.vscode.commons.protocol.java.JavaDataParams;
|
||||
import org.springframework.ide.vscode.commons.protocol.java.JavaSearchParams;
|
||||
import org.springframework.ide.vscode.commons.protocol.java.JavaSearchParams.SearchType;
|
||||
import org.springframework.ide.vscode.commons.protocol.java.JavaTypeHierarchyParams;
|
||||
import org.springframework.ide.vscode.commons.protocol.java.TypeData;
|
||||
import org.springframework.ide.vscode.commons.protocol.java.TypeDescriptorData;
|
||||
@@ -146,7 +147,7 @@ public class JdtLsIndex implements ClasspathIndex {
|
||||
|
||||
@Override
|
||||
public Flux<Tuple2<IType, Double>> fuzzySearchTypes(String searchTerm, boolean includeBinaries, boolean includeSystemLibs) {
|
||||
JavaSearchParams searchParams = new JavaSearchParams(projectUri.toString(), searchTerm, includeBinaries, includeSystemLibs, SEARCH_TIMEOUT);
|
||||
JavaSearchParams searchParams = new JavaSearchParams(projectUri.toString(), searchTerm, SearchType.FUZZY, includeBinaries, includeSystemLibs, SEARCH_TIMEOUT);
|
||||
return Mono.fromFuture(client.javaSearchTypes(searchParams))
|
||||
.flatMapMany(results -> Flux.fromIterable(results).publishOn(Schedulers.parallel()))
|
||||
.filter(Objects::nonNull)
|
||||
@@ -156,13 +157,24 @@ public class JdtLsIndex implements ClasspathIndex {
|
||||
|
||||
@Override
|
||||
public Flux<Tuple2<String, Double>> fuzzySearchPackages(String searchTerm, boolean includeBinaries, boolean includeSystemLibs) {
|
||||
JavaSearchParams searchParams = new JavaSearchParams(projectUri.toString(), searchTerm, includeBinaries, includeSystemLibs, SEARCH_TIMEOUT);
|
||||
JavaSearchParams searchParams = new JavaSearchParams(projectUri.toString(), searchTerm, SearchType.FUZZY, includeBinaries, includeSystemLibs, SEARCH_TIMEOUT);
|
||||
return Mono.fromFuture(client.javaSearchPackages(searchParams))
|
||||
.flatMapMany(results -> Flux.fromIterable(results).publishOn(Schedulers.parallel()))
|
||||
.filter(Objects::nonNull)
|
||||
.map(p -> Tuples.of(p, FuzzyMatcher.matchScore(searchTerm, p)))
|
||||
.filter(tuple -> tuple.getT2() != 0.0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Flux<Tuple2<IType, Double>> camelcaseSearchTypes(String searchTerm, boolean includeBinaries,
|
||||
boolean includeSystemLibs) {
|
||||
JavaSearchParams searchParams = new JavaSearchParams(projectUri.toString(), searchTerm, SearchType.CAMELCASE, includeBinaries, includeSystemLibs, SEARCH_TIMEOUT);
|
||||
return Mono.fromFuture(client.javaSearchTypes(searchParams))
|
||||
.flatMapMany(results -> Flux.fromIterable(results).publishOn(Schedulers.parallel()))
|
||||
.filter(Objects::nonNull)
|
||||
.map(type -> Tuples.of(toTypeFromDescriptor(type), FuzzyMatcher.matchScore(searchTerm, type.getFqName())))
|
||||
.filter(tuple -> tuple.getT2() != 0.0);
|
||||
}
|
||||
|
||||
private List<IType> convertTypeDescriptors(List<TypeDescriptorData> descriptors) {
|
||||
List<IType> types = new ArrayList<>(descriptors.size());
|
||||
|
||||
@@ -12,27 +12,34 @@ package org.springframework.ide.vscode.commons.protocol.java;
|
||||
|
||||
public class JavaSearchParams {
|
||||
|
||||
public enum SearchType {
|
||||
FUZZY,
|
||||
CAMELCASE
|
||||
}
|
||||
|
||||
private String projectUri;
|
||||
private String term;
|
||||
private boolean includeBinaries;
|
||||
private boolean includeSystemLibs;
|
||||
private long timeLimit = -1;
|
||||
private SearchType searchType;
|
||||
|
||||
public JavaSearchParams(String projectUri, String term) {
|
||||
this(projectUri, term, true, false);
|
||||
public JavaSearchParams(String projectUri, String term, SearchType searchType) {
|
||||
this(projectUri, term, searchType, true, false);
|
||||
}
|
||||
|
||||
public JavaSearchParams(String projectUri, String term, boolean includeBinaries, boolean includeSystemLibs, long timeLimit) {
|
||||
public JavaSearchParams(String projectUri, String term, SearchType searchType, boolean includeBinaries, boolean includeSystemLibs, long timeLimit) {
|
||||
super();
|
||||
this.projectUri = projectUri;
|
||||
this.term = term;
|
||||
this.setSearchType(searchType);
|
||||
this.includeBinaries = includeBinaries;
|
||||
this.includeSystemLibs = includeSystemLibs;
|
||||
this.setTimeLimit(timeLimit);
|
||||
}
|
||||
|
||||
public JavaSearchParams(String projectUri, String term, boolean includeBinaries, boolean includeSystemLibs) {
|
||||
this(projectUri, term, includeBinaries, includeSystemLibs, -1);
|
||||
public JavaSearchParams(String projectUri, String term, SearchType searchType, boolean includeBinaries, boolean includeSystemLibs) {
|
||||
this(projectUri, term, searchType, includeBinaries, includeSystemLibs, -1);
|
||||
}
|
||||
|
||||
public String getProjectUri() {
|
||||
@@ -75,4 +82,12 @@ public class JavaSearchParams {
|
||||
this.timeLimit = timeLimit;
|
||||
}
|
||||
|
||||
public SearchType getSearchType() {
|
||||
return searchType;
|
||||
}
|
||||
|
||||
public void setSearchType(SearchType searchType) {
|
||||
this.searchType = searchType;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.eclipse.jdt.core.IJavaProject;
|
||||
import org.springframework.ide.vscode.commons.protocol.java.JavaSearchParams.SearchType;
|
||||
import org.springframework.tooling.jdt.ls.commons.Logger;
|
||||
|
||||
import com.google.common.cache.Cache;
|
||||
@@ -22,6 +23,7 @@ import com.google.common.cache.CacheLoader.InvalidCacheLoadException;
|
||||
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.util.function.Tuple2;
|
||||
import reactor.util.function.Tuple3;
|
||||
import reactor.util.function.Tuples;
|
||||
|
||||
public abstract class CachingFluxJavaSearch<T> implements FluxSearch<T> {
|
||||
@@ -62,11 +64,11 @@ public abstract class CachingFluxJavaSearch<T> implements FluxSearch<T> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Flux<T> search(IJavaProject javaProject, String query) {
|
||||
Tuple2<String, String> key = key(javaProject, query);
|
||||
public final Flux<T> search(IJavaProject javaProject, String query, SearchType searchType) {
|
||||
Tuple2<String, String> key = key(javaProject, query, searchType);
|
||||
CacheEntry cached = null;
|
||||
try {
|
||||
cached = cache.get(key, () -> new CacheEntry(query, getValuesIncremental(javaProject, query)));
|
||||
cached = cache.get(key, () -> new CacheEntry(query, getValuesIncremental(javaProject, query, searchType)));
|
||||
} catch (ExecutionException e) {
|
||||
logger.log(e);
|
||||
}
|
||||
@@ -78,14 +80,14 @@ public abstract class CachingFluxJavaSearch<T> implements FluxSearch<T> {
|
||||
* <p>
|
||||
* Falls back on doing a full-blown search if there's no usable 'prefix-query' in the cache.
|
||||
*/
|
||||
private Flux<T> getValuesIncremental(IJavaProject javaProject, String query) {
|
||||
private Flux<T> getValuesIncremental(IJavaProject javaProject, String query, SearchType searchType) {
|
||||
// debug("trying to solve "+query+" incrementally");
|
||||
String subquery = query;
|
||||
while (subquery.length()>=1) {
|
||||
subquery = subquery.substring(0, subquery.length()-1);
|
||||
CacheEntry cached = null;
|
||||
try {
|
||||
cached = cache.get(key(javaProject, subquery), () -> null);
|
||||
cached = cache.get(key(javaProject, subquery, searchType), () -> null);
|
||||
} catch (ExecutionException | InvalidCacheLoadException e) {
|
||||
// Log.log(e);
|
||||
}
|
||||
@@ -101,19 +103,19 @@ public abstract class CachingFluxJavaSearch<T> implements FluxSearch<T> {
|
||||
}
|
||||
}
|
||||
// debug("full search for: "+query);
|
||||
return getValuesAsync(javaProject, query);
|
||||
return getValuesAsync(javaProject, query, searchType);
|
||||
}
|
||||
|
||||
protected abstract Flux<T> getValuesAsync(IJavaProject javaProject, String query);
|
||||
protected abstract Flux<T> getValuesAsync(IJavaProject javaProject, String query, SearchType searchType);
|
||||
|
||||
protected abstract String stringValue(T t);
|
||||
|
||||
private Tuple2<String,String> key(IJavaProject javaProject, String query) {
|
||||
return Tuples.of(javaProject==null?null:javaProject.getElementName(), query);
|
||||
private Tuple3<String,String,SearchType> key(IJavaProject javaProject, String query, SearchType searchType) {
|
||||
return Tuples.of(javaProject==null?null:javaProject.getElementName(), query, searchType);
|
||||
}
|
||||
|
||||
protected <K,V> Cache<K,V> createCache() {
|
||||
return CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.MINUTES).expireAfterAccess(1, TimeUnit.MINUTES).build();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -14,15 +14,16 @@ import java.time.Duration;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.jdt.core.IJavaProject;
|
||||
import org.springframework.ide.vscode.commons.protocol.java.JavaSearchParams.SearchType;
|
||||
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
public interface FluxSearch<T> {
|
||||
|
||||
Flux<T> search(IJavaProject project, String searchTerm);
|
||||
Flux<T> search(IJavaProject project, String searchTerm, SearchType searchType);
|
||||
|
||||
default List<T> searchWithLimits(IJavaProject javaProject, String searchTerm, long timeLimit) {
|
||||
Flux<T> flux = this.search(javaProject, searchTerm);
|
||||
default List<T> searchWithLimits(IJavaProject javaProject, String searchTerm, SearchType searchType, long timeLimit) {
|
||||
Flux<T> flux = this.search(javaProject, searchTerm, searchType);
|
||||
if (timeLimit > 0) {
|
||||
flux = flux.take(Duration.ofMillis(timeLimit));
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ public class JavaFluxSearch {
|
||||
PackageFluxSearch fluxPackageSearch = packageSearchCache.get(
|
||||
Tuples.of(params.isIncludeBinaries(), params.isIncludeSystemLibs()), () -> new PackageFluxSearch(logger, params.isIncludeBinaries(), params.isIncludeSystemLibs())
|
||||
);
|
||||
return fluxPackageSearch.searchWithLimits(javaProject, params.getTerm(), params.getTimeLimit());
|
||||
return fluxPackageSearch.searchWithLimits(javaProject, params.getTerm(), params.getSearchType(), params.getTimeLimit());
|
||||
}
|
||||
|
||||
public List<TypeDescriptorData> fuzzySearchTypes(JavaSearchParams params) throws Exception {
|
||||
@@ -53,7 +53,7 @@ public class JavaFluxSearch {
|
||||
TypeFluxSearch fluxTypeSearch = typeSearchCache.get(
|
||||
Tuples.of(params.isIncludeBinaries(), params.isIncludeSystemLibs()), () -> new TypeFluxSearch(logger, javaData, params.isIncludeBinaries(), params.isIncludeSystemLibs())
|
||||
);
|
||||
return fluxTypeSearch.searchWithLimits(javaProject, params.getTerm(), params.getTimeLimit());
|
||||
return fluxTypeSearch.searchWithLimits(javaProject, params.getTerm(), params.getSearchType(), params.getTimeLimit());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -12,11 +12,11 @@ package org.springframework.tooling.jdt.ls.commons.java;
|
||||
|
||||
import static org.springframework.tooling.jdt.ls.commons.java.SearchUtils.searchScope;
|
||||
import static org.springframework.tooling.jdt.ls.commons.java.SearchUtils.toPackagePattern;
|
||||
import static org.springframework.tooling.jdt.ls.commons.java.SearchUtils.toWildCardPattern;
|
||||
|
||||
import org.eclipse.jdt.core.IJavaProject;
|
||||
import org.eclipse.jdt.core.IPackageFragment;
|
||||
import org.eclipse.jdt.core.JavaModelException;
|
||||
import org.springframework.ide.vscode.commons.protocol.java.JavaSearchParams.SearchType;
|
||||
import org.springframework.tooling.jdt.ls.commons.Logger;
|
||||
|
||||
import reactor.core.publisher.Flux;
|
||||
@@ -28,11 +28,11 @@ public class PackageFluxSearch extends CachingFluxJavaSearch<String> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Flux<String> getValuesAsync(IJavaProject javaProject, String searchTerm) {
|
||||
protected Flux<String> getValuesAsync(IJavaProject javaProject, String searchTerm, SearchType searchType) {
|
||||
try {
|
||||
return new FluxJdtSearch(logger)
|
||||
.scope(searchScope(javaProject, includeBinaries, includeSystemLibs))
|
||||
.pattern(toPackagePattern(toWildCardPattern(searchTerm)))
|
||||
.pattern(toPackagePattern(searchType, searchTerm))
|
||||
.search()
|
||||
.map(match -> match.getElement())
|
||||
.filter(o -> o instanceof IPackageFragment)
|
||||
|
||||
@@ -17,37 +17,100 @@ import org.eclipse.jdt.core.search.IJavaSearchConstants;
|
||||
import org.eclipse.jdt.core.search.IJavaSearchScope;
|
||||
import org.eclipse.jdt.core.search.SearchEngine;
|
||||
import org.eclipse.jdt.core.search.SearchPattern;
|
||||
import org.springframework.ide.vscode.commons.protocol.java.JavaSearchParams.SearchType;
|
||||
|
||||
public class SearchUtils {
|
||||
|
||||
private static final String WILDCARD = "*";
|
||||
|
||||
public static String toWildCardPattern(String query) {
|
||||
StringBuilder builder = new StringBuilder("*");
|
||||
StringBuilder builder = new StringBuilder(WILDCARD);
|
||||
for (char c : query.toCharArray()) {
|
||||
builder.append(c);
|
||||
builder.append('*');
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
public static String toCamelCasePattern(String query) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
boolean insertStarBeforeCapitalLetter = false;
|
||||
for (char c : query.toCharArray()) {
|
||||
if (Character.isUpperCase(c)) {
|
||||
if (insertStarBeforeCapitalLetter) {
|
||||
builder.append('*');
|
||||
}
|
||||
insertStarBeforeCapitalLetter = true;
|
||||
}
|
||||
builder.append(c);
|
||||
}
|
||||
builder.append('*');
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
public static String toSearchPattern(SearchType searchType, String query) {
|
||||
switch(searchType) {
|
||||
case FUZZY:
|
||||
return toWildCardPattern(query);
|
||||
case CAMELCASE:
|
||||
return toCamelCasePattern(query);
|
||||
default:
|
||||
return query;
|
||||
}
|
||||
}
|
||||
|
||||
public static SearchPattern toPackagePattern(String wildCardedQuery) {
|
||||
public static SearchPattern toPackagePattern(SearchType searchType, String query) {
|
||||
int searchFor = IJavaSearchConstants.PACKAGE;
|
||||
int limitTo = IJavaSearchConstants.DECLARATIONS;
|
||||
int matchRule = SearchPattern.R_PATTERN_MATCH;
|
||||
return SearchPattern.createPattern(wildCardedQuery, searchFor, limitTo, matchRule);
|
||||
int matchRule = SearchPattern.R_EXACT_MATCH;
|
||||
String finalQuery = query;
|
||||
switch (searchType) {
|
||||
case FUZZY:
|
||||
matchRule = SearchPattern.R_PATTERN_MATCH;
|
||||
finalQuery = toWildCardPattern(query);
|
||||
break;
|
||||
case CAMELCASE:
|
||||
matchRule = SearchPattern.R_CAMELCASE_MATCH;
|
||||
finalQuery = query.isEmpty() ? WILDCARD : query;
|
||||
break;
|
||||
}
|
||||
return SearchPattern.createPattern(finalQuery, searchFor, limitTo, matchRule);
|
||||
}
|
||||
|
||||
public static SearchPattern toClassPattern(String wildCardedQuery) {
|
||||
public static SearchPattern toClassPattern(SearchType searchType, String query) {
|
||||
int searchFor = IJavaSearchConstants.CLASS;
|
||||
int limitTo = IJavaSearchConstants.DECLARATIONS;
|
||||
int matchRule = SearchPattern.R_PATTERN_MATCH;
|
||||
return SearchPattern.createPattern(wildCardedQuery, searchFor, limitTo, matchRule);
|
||||
int matchRule = SearchPattern.R_EXACT_MATCH;
|
||||
String finalQuery = query;
|
||||
switch (searchType) {
|
||||
case FUZZY:
|
||||
matchRule = SearchPattern.R_PATTERN_MATCH;
|
||||
finalQuery = toWildCardPattern(query);
|
||||
break;
|
||||
case CAMELCASE:
|
||||
matchRule = SearchPattern.R_CAMELCASE_MATCH;
|
||||
finalQuery = query.isEmpty() ? WILDCARD : query;
|
||||
break;
|
||||
}
|
||||
return SearchPattern.createPattern(finalQuery, searchFor, limitTo, matchRule);
|
||||
}
|
||||
|
||||
public static SearchPattern toTypePattern(String wildCardedQuery) {
|
||||
public static SearchPattern toTypePattern(SearchType searchType, String query) {
|
||||
int searchFor = IJavaSearchConstants.TYPE;
|
||||
int limitTo = IJavaSearchConstants.DECLARATIONS;
|
||||
int matchRule = SearchPattern.R_PATTERN_MATCH;
|
||||
return SearchPattern.createPattern(wildCardedQuery, searchFor, limitTo, matchRule);
|
||||
int matchRule = SearchPattern.R_EXACT_MATCH;
|
||||
String finalQuery = query;
|
||||
switch (searchType) {
|
||||
case FUZZY:
|
||||
matchRule = SearchPattern.R_PATTERN_MATCH;
|
||||
finalQuery = toWildCardPattern(query);
|
||||
break;
|
||||
case CAMELCASE:
|
||||
matchRule = SearchPattern.R_CAMELCASE_MATCH;
|
||||
finalQuery = query.isEmpty() ? WILDCARD : query;
|
||||
break;
|
||||
}
|
||||
return SearchPattern.createPattern(finalQuery, searchFor, limitTo, matchRule);
|
||||
}
|
||||
|
||||
public static String toProperTypeQuery(String query) {
|
||||
|
||||
@@ -11,12 +11,11 @@
|
||||
package org.springframework.tooling.jdt.ls.commons.java;
|
||||
|
||||
import static org.springframework.tooling.jdt.ls.commons.java.SearchUtils.searchScope;
|
||||
import static org.springframework.tooling.jdt.ls.commons.java.SearchUtils.toProperTypeQuery;
|
||||
import static org.springframework.tooling.jdt.ls.commons.java.SearchUtils.toTypePattern;
|
||||
import static org.springframework.tooling.jdt.ls.commons.java.SearchUtils.toWildCardPattern;
|
||||
|
||||
import org.eclipse.jdt.core.IJavaProject;
|
||||
import org.eclipse.jdt.core.IType;
|
||||
import org.springframework.ide.vscode.commons.protocol.java.JavaSearchParams.SearchType;
|
||||
import org.springframework.ide.vscode.commons.protocol.java.TypeDescriptorData;
|
||||
import org.springframework.tooling.jdt.ls.commons.Logger;
|
||||
|
||||
@@ -32,11 +31,11 @@ public class TypeFluxSearch extends CachingFluxJavaSearch<TypeDescriptorData> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Flux<TypeDescriptorData> getValuesAsync(IJavaProject javaProject, String searchTerm) {
|
||||
protected Flux<TypeDescriptorData> getValuesAsync(IJavaProject javaProject, String searchTerm, SearchType searchType) {
|
||||
try {
|
||||
return new FluxJdtSearch(logger)
|
||||
.scope(searchScope(javaProject, includeBinaries, includeSystemLibs))
|
||||
.pattern(toTypePattern(toWildCardPattern(toProperTypeQuery(searchTerm))))
|
||||
.pattern(toTypePattern(searchType, searchTerm))
|
||||
.search()
|
||||
.map(match -> match.getElement())
|
||||
.filter(o -> o instanceof IType)
|
||||
@@ -46,7 +45,7 @@ public class TypeFluxSearch extends CachingFluxJavaSearch<TypeDescriptorData> {
|
||||
return Flux.empty();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected String stringValue(TypeDescriptorData t) {
|
||||
return t.getFqName();
|
||||
|
||||
Reference in New Issue
Block a user