X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.ui%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fui%2Fsearch%2FSCLSearchQuery.java;fp=bundles%2Forg.simantics.scl.ui%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fui%2Fsearch%2FSCLSearchQuery.java;h=9f8ef5a2430f7106e018ebf3ba861b0a4e380cd0;hp=0000000000000000000000000000000000000000;hb=b2561fc60dbe74e8c332025b61cae104f5ccfc66;hpb=60887e497000cd31f5e5f2008d681b8612a21d26 diff --git a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/search/SCLSearchQuery.java b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/search/SCLSearchQuery.java new file mode 100644 index 000000000..9f8ef5a24 --- /dev/null +++ b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/search/SCLSearchQuery.java @@ -0,0 +1,91 @@ +package org.simantics.scl.ui.search; + +import java.util.ArrayList; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.Status; +import org.eclipse.search.internal.ui.text.SearchResultUpdater; +import org.eclipse.search.ui.ISearchQuery; +import org.eclipse.search.ui.ISearchResult; +import org.eclipse.search.ui.text.Match; +import org.simantics.scl.compiler.common.names.Name; +import org.simantics.scl.compiler.errors.Failable; +import org.simantics.scl.compiler.module.Module; +import org.simantics.scl.compiler.module.debug.ModuleDebugInfo; +import org.simantics.scl.compiler.module.debug.SymbolReference; +import org.simantics.scl.compiler.module.repository.ModuleRepository; +import org.simantics.scl.osgi.SCLOsgi; + +import gnu.trove.procedure.TObjectProcedure; + +public class SCLSearchQuery implements ISearchQuery { + + private SCLSearchResult result; + private String moduleName; + private Name valueName; + + public SCLSearchQuery(Name valueName, String localModuleName) { + this.valueName = valueName; + this.moduleName = localModuleName; + } + + @Override + public IStatus run(IProgressMonitor monitor) throws OperationCanceledException { + SCLSearchResult current = (SCLSearchResult) getSearchResult(); + current.removeAll(); + ModuleRepository repo = SCLOsgi.MODULE_REPOSITORY; + Name localName = Name.create(moduleName, valueName.name); + repo.getSourceRepository().forAllModules(new TObjectProcedure() { + + @Override + public boolean execute(String moduleName) { + Failable failableModule = repo.getModule(moduleName); + if (failableModule.didSucceed()) { + Module module = failableModule.getResult(); + ModuleDebugInfo info = module.getModuleDebugInfo(); + if (info != null) { + ArrayList results = info.symbolReferences; + for (SymbolReference ref : results) { + if (ref.referred.equals(valueName) || ref.referred.equals(localName)) { + result.addMatch(new Match(ref, Match.UNIT_LINE, -1, 1)); + } + } + } + } + return true; + } + }); + return Status.OK_STATUS; + } + + @Override + public String getLabel() { + return "Search references for "; + } + + @Override + public boolean canRerun() { + return true; + } + + @Override + public boolean canRunInBackground() { + return true; + } + + @Override + public ISearchResult getSearchResult() { + if (result == null) { + result = new SCLSearchResult(this); + new SearchResultUpdater(result); + } + return result; + } + + public String getValueName() { + return valueName.toString(); + } + +}