1 package org.simantics.scl.ui.search;
3 import java.util.ArrayList;
4 import java.util.Collection;
6 import org.eclipse.core.runtime.IProgressMonitor;
7 import org.eclipse.core.runtime.IStatus;
8 import org.eclipse.core.runtime.OperationCanceledException;
9 import org.eclipse.core.runtime.Status;
10 import org.eclipse.search.internal.ui.text.SearchResultUpdater;
11 import org.eclipse.search.ui.ISearchQuery;
12 import org.eclipse.search.ui.ISearchResult;
13 import org.eclipse.search.ui.text.Match;
14 import org.simantics.scl.compiler.common.names.Name;
15 import org.simantics.scl.compiler.errors.Failable;
16 import org.simantics.scl.compiler.module.Module;
17 import org.simantics.scl.compiler.module.debug.ModuleDebugInfo;
18 import org.simantics.scl.compiler.module.debug.SymbolReference;
19 import org.simantics.scl.compiler.module.repository.ModuleRepository;
20 import org.simantics.scl.db.SCLExpressionTableEntry;
21 import org.simantics.scl.db.UsedSCLExpressionsRequest;
22 import org.simantics.scl.osgi.SCLOsgi;
24 import gnu.trove.procedure.TObjectProcedure;
26 public class SCLSearchQuery implements ISearchQuery {
28 private SCLSearchResult result;
29 private String moduleName;
30 private Name valueName;
32 public SCLSearchQuery(Name valueName, String localModuleName) {
33 this.valueName = valueName;
34 this.moduleName = localModuleName;
38 public IStatus run(IProgressMonitor monitor) throws OperationCanceledException {
39 SCLSearchResult current = (SCLSearchResult) getSearchResult();
41 ModuleRepository repo = SCLOsgi.MODULE_REPOSITORY;
42 Name localName = Name.create(moduleName, valueName.name);
43 repo.getSourceRepository().forAllModules(new TObjectProcedure<String>() {
46 public boolean execute(String moduleName) {
47 Failable<Module> failableModule = repo.getModule(moduleName);
48 if (failableModule.didSucceed()) {
49 Module module = failableModule.getResult();
50 ModuleDebugInfo info = module.getModuleDebugInfo();
52 ArrayList<SymbolReference> results = info.symbolReferences;
53 for (SymbolReference ref : results) {
54 if (ref.referred.equals(valueName) || ref.referred.equals(localName)) {
55 result.addMatch(new Match(ref, Match.UNIT_LINE, -1, 1));
64 Collection<SCLExpressionTableEntry> results = UsedSCLExpressionsRequest.execute();
65 for (SCLExpressionTableEntry entry : results) {
66 if (entry.getContent().contains(valueName.name)) {
67 result.addMatch(new Match(entry, Match.UNIT_LINE, -1, 1));
71 return Status.OK_STATUS;
75 public String getLabel() {
76 return "Search references for ";
80 public boolean canRerun() {
85 public boolean canRunInBackground() {
90 public ISearchResult getSearchResult() {
92 result = new SCLSearchResult(this);
93 new SearchResultUpdater(result);
98 public String getValueName() {
99 return valueName.toString();