/* * Copyright 2003-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.ide.findusages.view; import jetbrains.mps.ide.findusages.FindersManager; import jetbrains.mps.ide.findusages.findalgorithm.finders.Finder; import jetbrains.mps.ide.findusages.findalgorithm.finders.GeneratedFinder; import jetbrains.mps.ide.findusages.findalgorithm.finders.IFinder; import jetbrains.mps.ide.findusages.findalgorithm.finders.IInterfacedFinder; import jetbrains.mps.ide.findusages.findalgorithm.finders.ReloadableFinder; import jetbrains.mps.ide.findusages.findalgorithm.resultproviders.treenodes.FinderNode; import jetbrains.mps.ide.findusages.findalgorithm.resultproviders.treenodes.UnionNode; import jetbrains.mps.ide.findusages.model.IResultProvider; import jetbrains.mps.ide.findusages.model.SearchQuery; import jetbrains.mps.ide.findusages.model.SearchResult; import jetbrains.mps.ide.findusages.model.SearchResults; import jetbrains.mps.util.annotation.ToRemove; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.module.SearchScope; import org.jetbrains.mps.openapi.util.ProgressMonitor; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; public class FindUtils { @Deprecated public static SearchResults getSearchResults(@Nullable final ProgressMonitor monitor, final @NotNull SNode node, final SearchScope scope, final String... finderClassNames) { List<IInterfacedFinder> finders = new ArrayList<>(finderClassNames.length); for (String finderClassName : finderClassNames) { IInterfacedFinder finder = FindersManager.getInstance().getFinder(finderClassName); if (finder != null) { finders.add(finder); } } return getSearchResults(monitor, new SearchQuery(node, scope), finders.toArray(new IInterfacedFinder[finders.size()])); } public static SearchResults getSearchResults(@Nullable final ProgressMonitor monitor, final SearchQuery query, final IFinder... finders) { return getSearchResults(monitor, query, makeProvider(finders)); } public static SearchResults getSearchResults(@Nullable final ProgressMonitor monitor, final SearchQuery query, final IResultProvider provider) { return provider.getResults(query, monitor); } @Deprecated public static List<SNode> executeFinder(String className, SNode node, SearchScope scope, ProgressMonitor monitor) { List<SNode> result = new ArrayList<>(); IInterfacedFinder finder = FindersManager.getInstance().getFinder(className); if (finder == null) { return result; } for (SearchResult<SNode> searchResult : finder.find(new SearchQuery(node, scope), monitor).getSearchResults()) { result.add(searchResult.getObject()); } return result; } /** * @deprecated see {@link FindersManager#getFinderByClassName(String)} for explanation. Replace with {@link #getFinder(String)} */ @Deprecated @Nullable @ToRemove(version = 3.5) public static IInterfacedFinder getFinderByClassName(String className) { return FindersManager.getInstance().getFinder(className); } /** * There would be another {@code getFinder(FinderIdentity}) later (perhaps, with distinct FinderIdentity implementations, one to take string, another * takes SLanguage + int token + optional? String mangledName) */ public static IInterfacedFinder getFinder(String finderIdentity) { return FindersManager.getInstance().getFinder(finderIdentity); } public static IResultProvider makeProvider(Collection<? extends IFinder> finders) { UnionNode unionNode = new UnionNode(); for (IFinder finder : finders) { final FinderNode fn; if (finder instanceof GeneratedFinder) { // just in case IResultProvider get serialized later, we give it an indication this one could get reloaded // XXX OTOH, it mught be IResultProvider itself to care about GeneratedFinder on write as it does on read for ReloadableFinders (so that RF // knowledge stays in a single place)? fn = new FinderNode(new ReloadableFinder((GeneratedFinder) finder)); } else { fn = new FinderNode(finder); } unionNode.addChild(fn); } return unionNode; } public static IResultProvider makeProvider(IFinder... finders) { return makeProvider(Arrays.asList(finders)); } /** * @param finderIdentity at the moment, we use finder implementation class fqn to identify it */ public static IResultProvider makeProvider(@NotNull String... finderIdentity) { ArrayList<Finder> finders = new ArrayList<>(finderIdentity.length); for (String fi : finderIdentity) { IInterfacedFinder f = FindersManager.getInstance().getFinder(fi); if (f != null) { finders.add(f); } } return makeProvider(finders); } }