summaryrefslogtreecommitdiff
path: root/platform/structuralsearch/source/com/intellij/structuralsearch/DocumentBasedReplaceHandler.java
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2014-07-25 13:10:36 -0700
committerTor Norbye <tnorbye@google.com>2014-07-25 13:10:36 -0700
commite5266e2343c8d275d79fa0be725180d0fe3a993c (patch)
tree0ba72f5de1949e0527874a799baa224cbe1537e0 /platform/structuralsearch/source/com/intellij/structuralsearch/DocumentBasedReplaceHandler.java
parentb03a5855292feb8c331815f883fe64372aacd872 (diff)
parent2e5965e996aad62ab1338b09d54caaf99ff3dd6a (diff)
downloadidea-e5266e2343c8d275d79fa0be725180d0fe3a993c.tar.gz
Merge remote-tracking branch 'aosp/upstream-master' into merge
Conflicts: .idea/modules.xml Change-Id: I5e3d04bc83cdc26b2b56fca66b44b1dd8941b143
Diffstat (limited to 'platform/structuralsearch/source/com/intellij/structuralsearch/DocumentBasedReplaceHandler.java')
-rw-r--r--platform/structuralsearch/source/com/intellij/structuralsearch/DocumentBasedReplaceHandler.java55
1 files changed, 55 insertions, 0 deletions
diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/DocumentBasedReplaceHandler.java b/platform/structuralsearch/source/com/intellij/structuralsearch/DocumentBasedReplaceHandler.java
new file mode 100644
index 000000000000..1f319b8f15e5
--- /dev/null
+++ b/platform/structuralsearch/source/com/intellij/structuralsearch/DocumentBasedReplaceHandler.java
@@ -0,0 +1,55 @@
+package com.intellij.structuralsearch;
+
+import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.editor.RangeMarker;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.TextRange;
+import com.intellij.psi.PsiDocumentManager;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.structuralsearch.plugin.replace.ReplaceOptions;
+import com.intellij.structuralsearch.plugin.replace.ReplacementInfo;
+import com.intellij.structuralsearch.plugin.replace.impl.ReplacementInfoImpl;
+import com.intellij.util.containers.HashMap;
+
+import java.util.Map;
+
+/**
+ * @author Eugene.Kudelevsky
+ */
+public class DocumentBasedReplaceHandler extends StructuralReplaceHandler {
+ private final Project myProject;
+ private final Map<ReplacementInfo, RangeMarker> myRangeMarkers = new HashMap<ReplacementInfo, RangeMarker>();
+
+ DocumentBasedReplaceHandler(Project project) {
+ myProject = project;
+ }
+
+ public void replace(ReplacementInfo info, ReplaceOptions options) {
+ if (info.getMatchesCount() == 0) return;
+ assert info instanceof ReplacementInfoImpl;
+ PsiElement element = info.getMatch(0);
+ if (element == null) return;
+ PsiFile file = element instanceof PsiFile ? (PsiFile)element : element.getContainingFile();
+ assert file != null;
+ RangeMarker rangeMarker = myRangeMarkers.get(info);
+ Document document = rangeMarker.getDocument();
+ document.replaceString(rangeMarker.getStartOffset(), rangeMarker.getEndOffset(), info.getReplacement());
+ PsiDocumentManager.getInstance(element.getProject()).commitDocument(document);
+ }
+
+ @Override
+ public void prepare(ReplacementInfo info) {
+ assert info instanceof ReplacementInfoImpl;
+ MatchResult result = ((ReplacementInfoImpl)info).getMatchResult();
+ PsiElement element = result.getMatch();
+ PsiFile file = element instanceof PsiFile ? (PsiFile)element : element.getContainingFile();
+ Document document = PsiDocumentManager.getInstance(myProject).getDocument(file);
+ TextRange textRange = result.getMatchRef().getElement().getTextRange();
+ assert textRange != null;
+ RangeMarker rangeMarker = document.createRangeMarker(textRange);
+ rangeMarker.setGreedyToLeft(true);
+ rangeMarker.setGreedyToRight(true);
+ myRangeMarkers.put(info, rangeMarker);
+ }
+}