]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/search/SCLSearchQuery.java
Find SCL references in SCLModuleEditor with Ctrl+Shift+G
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / search / SCLSearchQuery.java
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 (file)
index 0000000..9f8ef5a
--- /dev/null
@@ -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<String>() {
+            
+            @Override
+            public boolean execute(String moduleName) {
+                Failable<Module> failableModule = repo.getModule(moduleName);
+                if (failableModule.didSucceed()) {
+                    Module module = failableModule.getResult();
+                    ModuleDebugInfo info = module.getModuleDebugInfo();
+                    if (info != null) {
+                        ArrayList<SymbolReference> 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();
+    }
+
+}