From a162f710775a57280c0aa275148aa5217c7fd348 Mon Sep 17 00:00:00 2001
From: Bas Leijdekkers <basleijdekkers@gmail.com>
Date: Mon, 26 Feb 2018 11:23:20 +0100
Subject: [PATCH] SSR: simpler Replacer

---
 .../TypeConversionDescriptor.java             |   4 +-
 .../plugin/replace/impl/Replacer.java         | 123 +++-----
 .../StructuralReplaceTest.java                | 291 +++++++++---------
 .../StructuralReplaceTestCase.java            |   5 +-
 .../XmlStructuralReplaceTest.java             |  38 +--
 5 files changed, 205 insertions(+), 256 deletions(-)

diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/TypeConversionDescriptor.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/TypeConversionDescriptor.java
index 529b52be6a25..204039d4b03f 100644
--- a/java/typeMigration/src/com/intellij/refactoring/typeMigration/TypeConversionDescriptor.java
+++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/TypeConversionDescriptor.java
@@ -1,3 +1,4 @@
+// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
 package com.intellij.refactoring.typeMigration;
 
 import com.intellij.openapi.fileTypes.StdFileTypes;
@@ -89,8 +90,7 @@ public class TypeConversionDescriptor extends TypeConversionDescriptorBase {
     final ReplaceOptions options = new ReplaceOptions();
     final MatchOptions matchOptions = options.getMatchOptions();
     matchOptions.setFileType(StdFileTypes.JAVA);
-    final Replacer replacer = new Replacer(project, null);
-    final String replacement = replacer.testReplace(expression.getText(), stringToReplace, replaceByString, options);
+    final String replacement = Replacer.testReplace(expression.getText(), stringToReplace, replaceByString, options, project);
     return (PsiExpression)JavaCodeStyleManager.getInstance(project).shortenClassReferences(expression.replace(
       JavaPsiFacade.getInstance(project).getElementFactory().createExpressionFromText(replacement, expression)));
   }
diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/Replacer.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/Replacer.java
index 7de512590c98..d4aa758c6a9c 100644
--- a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/Replacer.java
+++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/Replacer.java
@@ -1,18 +1,4 @@
-/*
- * Copyright 2000-2017 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.
- */
+// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
 package com.intellij.structuralsearch.plugin.replace.impl;
 
 import com.intellij.codeInsight.template.Template;
@@ -47,59 +33,62 @@ import java.util.List;
  */
 public class Replacer {
   private final Project project;
-  private ReplacementBuilder replacementBuilder;
-  private ReplaceOptions options;
-  private ReplacementContext context;
-  private StructuralReplaceHandler replaceHandler;
+  private final ReplaceOptions options;
+  private final StructuralReplaceHandler replaceHandler;
+  private final ReplacementBuilder replacementBuilder;
   private PsiElement lastAffectedElement = null;
 
   public Replacer(Project project, ReplaceOptions options) {
     this.project = project;
     this.options = options;
+    final StructuralSearchProfile profile = StructuralSearchUtil.getProfileByFileType(options.getMatchOptions().getFileType());
+    assert profile != null;
+    replaceHandler = profile.getReplaceHandler(new ReplacementContext(options, project));
+    assert replaceHandler != null;
+    replacementBuilder = new ReplacementBuilder(this.project, this.options);
   }
 
   public static String stripTypedVariableDecoration(final String type) {
-   return type.substring(1,type.length()-1);
- }
+    return type.substring(1, type.length() - 1);
+  }
 
   public static int insertSubstitution(StringBuilder result, int offset, final ParameterInfo info, String image) {
-   if (image.length() > 0) result.insert(offset+ info.getStartIndex(),image);
-   offset += image.length();
+   if (!image.isEmpty()) {
+     result.insert(offset + info.getStartIndex(), image);
+     offset += image.length();
+   }
    return offset;
  }
 
-  public String testReplace(String in, String what, String by, ReplaceOptions options) throws IncorrectOperationException {
-    return testReplace(in, what, by, options, false);
+  public static String testReplace(String in, String what, String by, ReplaceOptions options, Project project)  {
+    return testReplace(in, what, by, options, project, false);
   }
 
-  public String testReplace(String in, String what, String by, ReplaceOptions options, boolean filePattern) {
+  public static String testReplace(String in, String what, String by, ReplaceOptions options, Project project, boolean sourceIsFile) {
     FileType type = options.getMatchOptions().getFileType();
-    return testReplace(in, what, by, options, filePattern, false, type, null);
+    return testReplace(in, what, by, options, project, sourceIsFile, false, type, null);
   }
 
-  public String testReplace(String in, String what, String by, ReplaceOptions options, boolean filePattern, boolean createPhysicalFile,
-                            FileType sourceFileType, Language sourceDialect) {
-    this.options = options;
-    final MatchOptions matchOptions = this.options.getMatchOptions();
-    this.options.setReplacement(by);
-    replacementBuilder=null;
-    context = null;
-    replaceHandler = null;
+  public static String testReplace(String in, String what, String by, ReplaceOptions replaceOptions, Project project, boolean sourceIsFile,
+                                   boolean createPhysicalFile, FileType sourceFileType, Language sourceDialect) {
+    replaceOptions.setReplacement(by);
 
+    final MatchOptions matchOptions = replaceOptions.getMatchOptions();
     matchOptions.clearVariableConstraints();
     matchOptions.fillSearchCriteria(what);
 
     Matcher.validate(project, matchOptions);
-    checkSupportedReplacementPattern(project, options);
+    checkSupportedReplacementPattern(project, replaceOptions);
 
-    Matcher matcher = new Matcher(project);
+    final Replacer replacer = new Replacer(project, replaceOptions);
+    final Matcher matcher = new Matcher(project);
     try {
-      PsiElement firstElement, lastElement, parent;
+      final PsiElement firstElement, lastElement, parent;
 
-      if (options.getMatchOptions().getScope() == null) {
-        PsiElement[] elements = MatcherImplUtil.createTreeFromText(
+      if (replaceOptions.getMatchOptions().getScope() == null) {
+        final PsiElement[] elements = MatcherImplUtil.createTreeFromText(
           in,
-          filePattern ? PatternTreeContext.File : PatternTreeContext.Block,
+          sourceIsFile ? PatternTreeContext.File : PatternTreeContext.Block,
           sourceFileType, sourceDialect, null,
           project,
           createPhysicalFile
@@ -111,7 +100,7 @@ public class Replacer {
 
         matchOptions.setScope(new LocalSearchScope(elements));
       } else {
-        parent = ((LocalSearchScope)options.getMatchOptions().getScope()).getScope()[0];
+        parent = ((LocalSearchScope)matchOptions.getScope()).getScope()[0];
         firstElement = parent.getFirstChild();
         lastElement = parent.getLastChild();
       }
@@ -121,24 +110,24 @@ public class Replacer {
 
       final List<ReplacementInfo> resultPtrList = new SmartList<>();
       for (final MatchResult result : sink.getMatches()) {
-        resultPtrList.add(buildReplacement(result));
+        resultPtrList.add(replacer.buildReplacement(result));
       }
 
       int startOffset = firstElement.getTextRange().getStartOffset();
-      int endOffset = filePattern ? 0 : parent.getTextLength() - lastElement.getTextRange().getEndOffset();
+      int endOffset = sourceIsFile ? 0 : parent.getTextLength() - lastElement.getTextRange().getEndOffset();
 
       // get nodes from text may contain
-      PsiElement prevSibling = firstElement.getPrevSibling();
+      final PsiElement prevSibling = firstElement.getPrevSibling();
       if (prevSibling instanceof PsiWhiteSpace) {
         startOffset -= prevSibling.getTextLength() - 1;
       }
 
-      PsiElement nextSibling = lastElement.getNextSibling();
+      final PsiElement nextSibling = lastElement.getNextSibling();
       if (nextSibling instanceof PsiWhiteSpace) {
         endOffset -= nextSibling.getTextLength() - 1;
       }
 
-      replaceAll(resultPtrList);
+      replacer.replaceAll(resultPtrList);
 
       String result = parent.getText();
       result = result.substring(startOffset);
@@ -150,17 +139,13 @@ public class Replacer {
       throw new IncorrectOperationException(e);
     }
     finally {
-      options.getMatchOptions().setScope(null);
+      matchOptions.setScope(null);
     }
   }
 
   public void replaceAll(final List<ReplacementInfo> infos) {
     for (ReplacementInfo info : infos) {
-      PsiElement element = info.getMatch(0);
-      initContextAndHandler(element);
-      if (replaceHandler != null) {
-        replaceHandler.prepare(info);
-      }
+      replaceHandler.prepare(info);
     }
 
     ((ApplicationImpl)ApplicationManager.getApplication()).runWriteActionWithCancellableProgressInDispatchThread(
@@ -201,11 +186,7 @@ public class Replacer {
   }
 
   public void replace(ReplacementInfo info) {
-    initContextAndHandler(info.getMatch(0));
-
-    if (replaceHandler != null) {
-      replaceHandler.prepare(info);
-    }
+    replaceHandler.prepare(info);
     reformatAndPostProcess(doReplace(info));
   }
 
@@ -218,11 +199,7 @@ public class Replacer {
     final PsiElement elementParent = StructuralSearchUtil.getPresentableElement(element).getParent();
 
     CodeStyleManager.getInstance(project).performActionWithFormatterDisabled(
-      (Runnable)() -> {
-        if (replaceHandler != null) {
-          replaceHandler.replace(info, options);
-        }
-      }
+      (Runnable)() -> replaceHandler.replace(info, options)
     );
 
     if (!elementParent.isValid() || !elementParent.isWritable()) {
@@ -245,21 +222,7 @@ public class Replacer {
       final int parentOffset = elementParent.getTextRange().getStartOffset();
       CodeStyleManager.getInstance(project).reformatRange(containingFile, parentOffset, parentOffset + elementParent.getTextLength(), true);
     }
-    if (replaceHandler != null) {
-      replaceHandler.postProcess(elementParent, options);
-    }
-  }
-
-  private void initContextAndHandler(PsiElement psiContext) {
-    if (context == null) {
-      context = new ReplacementContext(options, project);
-    }
-    if (replaceHandler == null) {
-      final StructuralSearchProfile profile = StructuralSearchUtil.getProfileByPsiElement(psiContext);
-      if (profile != null) {
-        replaceHandler = profile.getReplaceHandler(context);
-      }
-    }
+    replaceHandler.postProcess(elementParent, options);
   }
 
   public static void handleComments(final PsiElement el, final PsiElement replacement, ReplacementInfo replacementInfo) {
@@ -350,10 +313,6 @@ public class Replacer {
 
   public ReplacementInfo buildReplacement(MatchResult result) {
     final ReplacementInfoImpl replacementInfo = new ReplacementInfoImpl(result, project);
-
-    if (replacementBuilder == null) {
-      replacementBuilder = new ReplacementBuilder(project, options);
-    }
     replacementInfo.setReplacement(replacementBuilder.process(result, replacementInfo, options.getMatchOptions().getFileType()));
 
     return replacementInfo;
diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTest.java
index 6b10d0c5facd..ee940e8298c0 100644
--- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTest.java
+++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTest.java
@@ -4,6 +4,7 @@ package com.intellij.structuralsearch;
 import com.intellij.openapi.fileTypes.StdFileTypes;
 import com.intellij.psi.CommonClassNames;
 import com.intellij.psi.search.LocalSearchScope;
+import com.intellij.structuralsearch.plugin.replace.impl.Replacer;
 import com.intellij.testFramework.PlatformTestUtil;
 import org.jetbrains.annotations.NotNull;
 
@@ -31,13 +32,13 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "Matching/replacing literals",
       expectedResult,
-      replacer.testReplace(s1,s2,s3,options)
+      Replacer.testReplace(s1, s2, s3, options, getProject())
     );
 
     assertEquals(
       "Matching/replacing literals",
       expectedResult,
-      replacer.testReplace(s1,s2_2,s3,options)
+      Replacer.testReplace(s1, s2_2, s3, options, getProject())
     );
 
     String s4 = "params.put(\"BACKGROUND\", \"#7B528D\");";
@@ -50,7 +51,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "string literal replacement 2",
       expectedResult2,
-      replacer.testReplace(s4,s5,s6,options)
+      Replacer.testReplace(s4, s5, s6, options, getProject())
     );
 
     String s7 = "IconLoader.getIcon(\"/ant/property.png\");\n" +
@@ -63,7 +64,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "string literal replacement 3",
       expectedResult3,
-      replacer.testReplace(s7,s8,s9,options)
+      Replacer.testReplace(s7, s8, s9, options, getProject())
     );
 
     String s10 = "configureByFile(path + \"1.html\");\n" +
@@ -80,7 +81,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "string literal replacement 4",
       expectedResult4,
-      replacer.testReplace(s10,s11,s12,options)
+      Replacer.testReplace(s10, s11, s12, options, getProject())
     );
   }
 
@@ -114,7 +115,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "adding comment to statement inside the if body",
       expectedResult,
-      replacer.testReplace(s1,s2,s3,options)
+      Replacer.testReplace(s1, s2, s3, options, getProject())
     );
 
     String s4 = "myButton.setText(\"Ok\");";
@@ -126,7 +127,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "adding comment to statement inside the if body",
       expectedResult2,
-      replacer.testReplace(s4,s5,s6,options)
+      Replacer.testReplace(s4, s5, s6, options, getProject())
     );
   }
 
@@ -166,7 +167,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String str4 = "";
 
     options.setToReformatAccordingToStyle(true);
-    assertEquals("Basic replacement with formatter", expectedResult1, replacer.testReplace(str,str2,str3,options));
+    assertEquals("Basic replacement with formatter", expectedResult1, Replacer.testReplace(str, str2, str3, options, getProject()));
     options.setToReformatAccordingToStyle(false);
 
     String expectedResult2 = "// searching for several constructions\n" +
@@ -178,7 +179,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                              "\n" +
                              "    //options.setLooseMatching(true);\n" +
                              "    // searching for several constructions";
-    assertEquals("Empty replacement", expectedResult2, replacer.testReplace(str,str2,str4,options));
+    assertEquals("Empty replacement", expectedResult2, Replacer.testReplace(str, str2, str4, options, getProject()));
 
     String str5 = "testMatcher.findMatches('_In,'_Pattern, options).size()";
     String str6 = "findMatchesCount($In$,$Pattern$)";
@@ -193,14 +194,14 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                            "    //options.setLooseMatching(true);\n" +
                            "    // searching for several constructions\n" +
                            "    assertEquals(\"several constructions 3\", findMatchesCount(s7,s8), 2);";
-    assertEquals("Expression replacement", expectedResult3, replacer.testReplace(expectedResult1,str5,str6,options));
+    assertEquals("Expression replacement", expectedResult3, Replacer.testReplace(expectedResult1, str5, str6, options, getProject()));
 
     String str7 = "try { a.doSomething(); b.doSomething(); } catch(IOException ex) {  ex.printStackTrace(); throw new RuntimeException(ex); }";
     String str8 = "try { '_Statements+; } catch('_ '_) { '_HandlerStatements+; }";
     String str9 = "$Statements$;";
     String expectedResult4 = "a.doSomething(); b.doSomething();";
 
-    assertEquals("Multi line match in replacement", expectedResult4, replacer.testReplace(str7,str8,str9,options));
+    assertEquals("Multi line match in replacement", expectedResult4, Replacer.testReplace(str7, str8, str9, options, getProject()));
 
     String str10 = "    parentNode.insert(compositeNode, i);\n" +
                    "    if (asyncMode) {\n" +
@@ -213,35 +214,36 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String str12 = "addChild($parentNode$,$newNode$, $i$);";
     String expectedResult5 = "    addChild(parentNode,compositeNode, i);";
 
-    assertEquals("Array initializer replacement", expectedResult5, replacer.testReplace(str10,str11,str12,options));
+    assertEquals("Array initializer replacement", expectedResult5, Replacer.testReplace(str10, str11, str12, options, getProject()));
 
     String str13 = "  aaa(5,6,3,4,1,2);";
     String str14 = "aaa('_t{2,2},3,4,'_q{2,2});";
     String str15 = "aaa($q$,3,4,$t$);";
     String expectedResult6 = "  aaa(1,2,3,4,5,6);";
 
-    assertEquals("Parameter multiple match", expectedResult6, replacer.testReplace(str13,str14,str15,options));
+    assertEquals("Parameter multiple match", expectedResult6, Replacer.testReplace(str13, str14, str15, options, getProject()));
 
     String str16 = "  int c = a();";
     String str17 = "'_t:a ('_q*,'_p*)";
     String str18 = "$t$($q$,1,$p$)";
     String expectedResult7 = "  int c = a(1);";
 
-    assertEquals("Replacement of init in definition + empty substitution", expectedResult7, replacer.testReplace(str16,str17,str18,options));
+    assertEquals("Replacement of init in definition + empty substitution", expectedResult7,
+                 Replacer.testReplace(str16, str17, str18, options, getProject()));
 
     String str19 = "  aaa(bbb);";
     String str20 = "'_t('_);";
     String str21 = "$t$(ccc);";
     String expectedResult8 = "  aaa(ccc);";
 
-    assertEquals("One substition replacement", expectedResult8, replacer.testReplace(str19,str20,str21,options));
+    assertEquals("One substition replacement", expectedResult8, Replacer.testReplace(str19, str20, str21, options, getProject()));
 
     String str22 = "  instance.setAAA(anotherInstance.getBBB());";
     String str23 = "  '_i.'_m:set(.+) ('_a.'_m2:get(.+) ());";
     String str24 = "  $a$.set$m2_1$( $i$.get$m_1$() );";
     String expectedResult9 = "  anotherInstance.setBBB( instance.getAAA() );";
 
-    assertEquals("Reg exp substitution replacement", expectedResult9, replacer.testReplace(str22,str23,str24,options));
+    assertEquals("Reg exp substitution replacement", expectedResult9, Replacer.testReplace(str22, str23, str24, options, getProject()));
 
     String str25 = "  LaterInvocator.invokeLater(new Runnable() {\n" +
                    "          public void run() {\n" +
@@ -266,7 +268,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                               "          }\n" +
                               "        });";
 
-    assertEquals("Anonymous in parameter", expectedResult10, replacer.testReplace(str25,str26,str27,options));
+    assertEquals("Anonymous in parameter", expectedResult10, Replacer.testReplace(str25, str26, str27, options, getProject()));
 
     String str28 = "UTElementNode elementNode = new UTElementNode(myProject, processedElement, psiFile,\n" +
                    "                                                          processedElement.getTextOffset(), true,\n" +
@@ -278,21 +280,21 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
 
     String expectedResult11 = "UTElementNode elementNode = new UTElementNode(myProject, processedElement, psiFile, processedElement.getTextOffset(), true, true,\n" +
                               "  null);";
-    assertEquals("Replace in def initializer", expectedResult11, replacer.testReplace(str28,str29,str30,options));
+    assertEquals("Replace in def initializer", expectedResult11, Replacer.testReplace(str28, str29, str30, options, getProject()));
 
     String s31 = "a = b; b = c; a=a; c=c;";
     String s32 = "'_a = '_a;";
     String s33 = "1 = 1;";
     String expectedResult12 = "a = b; b = c; 1 = 1; 1 = 1;";
 
-    assertEquals("replace silly assignments", expectedResult12, replacer.testReplace(s31,s32,s33,options));
+    assertEquals("replace silly assignments", expectedResult12, Replacer.testReplace(s31, s32, s33, options, getProject()));
 
     String s34 = "ParamChecker.isTrue(1==1, \"!!!\");";
     String s35 = "ParamChecker.isTrue('_expr, '_msg);";
     String s36 = "assert $expr$ : $msg$;";
 
     String expectedResult13 = "assert 1==1 : \"!!!\";";
-    assertEquals("replace with assert", expectedResult13, replacer.testReplace(s34,s35,s36,options));
+    assertEquals("replace with assert", expectedResult13, Replacer.testReplace(s34, s35, s36, options, getProject()));
 
     String s37 = "try { \n" +
                  "  ParamChecker.isTrue(1==1, \"!!!\");\n  \n" +
@@ -307,14 +309,14 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String expectedResult14 = "ParamChecker.isTrue(1==1, \"!!!\");\n  \n" +
                               "  // comment we want to leave\n  \n" +
                               "  ParamChecker.isTrue(2==2, \"!!!\");";
-    assertEquals("remove try with comments inside", expectedResult14, replacer.testReplace(s37,s38,s39,options));
+    assertEquals("remove try with comments inside", expectedResult14, Replacer.testReplace(s37, s38, s39, options, getProject()));
 
     String s40 = "ParamChecker.instanceOf(queryKey, GroupBySqlTypePolicy.GroupKey.class);";
     String s41 = "ParamChecker.instanceOf('_obj, '_class.class);";
     String s42 = "assert $obj$ instanceof $class$ : \"$obj$ is an instance of \" + $obj$.getClass() + \"; expected \" + $class$.class;";
     String expectedResult15 = "assert queryKey instanceof GroupBySqlTypePolicy.GroupKey : \"queryKey is an instance of \" + queryKey.getClass() + \"; expected \" + GroupBySqlTypePolicy.GroupKey.class;";
 
-    assertEquals("Matching/replacing .class literals", expectedResult15, replacer.testReplace(s40,s41,s42,options));
+    assertEquals("Matching/replacing .class literals", expectedResult15, Replacer.testReplace(s40, s41, s42, options, getProject()));
 
     String s43 = "class Wpd {\n" +
                  "  static final String TAG_BEAN_VALUE = \"\";\n" +
@@ -327,7 +329,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                               "}\n" +
                               "XmlTag beanTag = jetbrains.fabrique.util.XmlApiUtil.findSubTag(rootTag, Wpd.TAG_BEAN_VALUE);";
 
-    assertEquals("Matching/replacing static fields", expectedResult16, replacer.testReplace(s43,s44,s45,options));
+    assertEquals("Matching/replacing static fields", expectedResult16, Replacer.testReplace(s43, s44, s45, options, getProject()));
 
     String s46 = "Rectangle2D rec = new Rectangle2D.Double(\n" +
                  "                drec.getX(),\n" +
@@ -341,7 +343,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                               "                OtherClass.round(drec.getY(),5),\n" +
                               "                OtherClass.round(drec.getWidth(),5),\n" +
                               "                OtherClass.round(drec.getWidth(),5));";
-    assertEquals("Replace in constructor", expectedResult17, replacer.testReplace(s46,s47,s48,options));
+    assertEquals("Replace in constructor", expectedResult17, Replacer.testReplace(s46, s47, s48, options, getProject()));
 
     String s49 = "class A {}\n" +
                  "class B extends A {}\n" +
@@ -352,7 +354,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                               "class B extends A {}\n" +
                               "A a = new B(\"a\");";
 
-    assertEquals("Class navigation", expectedResult18, replacer.testReplace(s49,s50,s51,options));
+    assertEquals("Class navigation", expectedResult18, Replacer.testReplace(s49, s50, s51, options, getProject()));
 
     String s52 = "try {\n" +
                  "  aaa();\n" +
@@ -393,7 +395,8 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
 
     options.getMatchOptions().setLooseMatching(false);
     try {
-      assertEquals("Try/finally unwrapped with strict matching", expectedResult19, replacer.testReplace(s52, s53, s54, options));
+      assertEquals("Try/finally unwrapped with strict matching", expectedResult19,
+                   Replacer.testReplace(s52, s53, s54, options, getProject()));
     } finally {
       options.getMatchOptions().setLooseMatching(true);
     }
@@ -405,7 +408,8 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                                    "} catch(Exception ex) {\n" +
                                    "  aaa5();\n" +
                                    "}\n";
-    assertEquals("Try/finally unwrapped with loose matching", expectedResult19Loose, replacer.testReplace(s52, s53, s54, options));
+    assertEquals("Try/finally unwrapped with loose matching", expectedResult19Loose,
+                 Replacer.testReplace(s52, s53, s54, options, getProject()));
 
 
     String s55 = "for(Iterator<String> iterator = stringlist.iterator(); iterator.hasNext();) {\n" +
@@ -423,7 +427,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                               "  System.out.println( str );\n" +
                               "}";
 
-    assertEquals("for with foreach", expectedResult20, replacer.testReplace(s55,s56,s57,options));
+    assertEquals("for with foreach", expectedResult20, Replacer.testReplace(s55, s56, s57, options, getProject()));
 
     String s58 = "class A {\n" +
                  "  static Set<String> b_MAP = new HashSet<String>();\n" +
@@ -436,7 +440,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                               "  int c;\n" +
                               "}";
 
-    assertEquals("replace symbol in definition", expectedResult21, replacer.testReplace(s58,s59,s60,options));
+    assertEquals("replace symbol in definition", expectedResult21, Replacer.testReplace(s58, s59, s60, options, getProject()));
 
     String s64 = "int x = 42;\n" +
                  "int y = 42; // Stuff";
@@ -451,7 +455,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                               " */\n" +
                               "int y = 42;";
 
-    assertEquals("Replacement of the comment with javadoc", expectedResult23, replacer.testReplace(s64,s65,s66,options));
+    assertEquals("Replacement of the comment with javadoc", expectedResult23, Replacer.testReplace(s64, s65, s66, options, getProject()));
 
     String s61 = "try { 1=1; } catch(Exception e) { 1=1; } catch(Throwable t) { 2=2; }";
     String s62 = "try { '_a; } catch(Exception e) { '_b; }";
@@ -460,7 +464,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
 
     assertEquals("try replacement by another try will leave the unmatched catch",
                  expectedResult22,
-                 replacer.testReplace(s61,s62,s63,options));
+                 Replacer.testReplace(s61, s62, s63, options, getProject()));
 
   }
 
@@ -470,14 +474,14 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String s3 = "new AtomicReference<DateFormat>($expr$)";
     String expectedResult = "new AtomicReference<DateFormat>(new SimpleDateFormat(\"yyyyMMddHHmmss\"))";
 
-    assertEquals("Replacement of top-level expression only", expectedResult, replacer.testReplace(s1, s2, s3, options));
+    assertEquals("Replacement of top-level expression only", expectedResult, Replacer.testReplace(s1, s2, s3, options, getProject()));
 
     String s4 = "get(\"smth\")";
     String s5 = "'expr";
     String s6 = "new Integer($expr$)";
     String expectedResult1 = "new Integer(get(\"smth\"))";
 
-    assertEquals("Replacement of top-level expression only", expectedResult1, replacer.testReplace(s4, s5, s6, options));
+    assertEquals("Replacement of top-level expression only", expectedResult1, Replacer.testReplace(s4, s5, s6, options, getProject()));
   }
 
   public void testReplaceParameter() {
@@ -486,7 +490,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String s3 = "int d2;";
     String expectedResult = "class A { void b(int c, int d2, int e) {} }";
 
-    assertEquals("replace method parameter", expectedResult, replacer.testReplace(s1,s2,s3,options));
+    assertEquals("replace method parameter", expectedResult, Replacer.testReplace(s1, s2, s3, options, getProject()));
   }
 
   public void testReplaceWithComments() {
@@ -495,7 +499,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String s3 = "map.put(key, value); // line 1";
     String expectedResult = "map.put(key, value); // line 1";
 
-    assertEquals("replace self with comment after", expectedResult, replacer.testReplace(s1,s2,s3,options));
+    assertEquals("replace self with comment after", expectedResult, Replacer.testReplace(s1, s2, s3, options, getProject()));
 
     String s4 = "if (true) System.out.println(\"1111\"); else System.out.println(\"2222\");\n" +
                 "while(true) System.out.println(\"1111\");";
@@ -503,7 +507,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String s6 = "/* System.out.println($Test$); */";
     String expectedResult2 = "if (true) /* System.out.println(\"1111\"); */; else /* System.out.println(\"2222\"); */;\n" +
                              "while(true) /* System.out.println(\"1111\"); */;";
-    assertEquals("replace with comment", expectedResult2, replacer.testReplace(s4,s5,s6,options));
+    assertEquals("replace with comment", expectedResult2, Replacer.testReplace(s4, s5, s6, options, getProject()));
   }
 
   public void testSeveralStatements() {
@@ -545,7 +549,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                              "        System.out.println(1);\n" +
                              "    }";
     options.setToReformatAccordingToStyle(true);
-    assertEquals("three statements replacement", expectedResult1, replacer.testReplace(s1,s2,s3,options));
+    assertEquals("three statements replacement", expectedResult1, Replacer.testReplace(s1, s2, s3, options, getProject()));
     options.setToReformatAccordingToStyle(false);
 
     String s4 = "ProgressManager.getInstance().startNonCancelableAction();\n" +
@@ -566,7 +570,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String s6 = "$statement$;";
     String expectedResult2 = "read(id, READ_PARENT);\n" +
                              "      return myViewport.parent;";
-    assertEquals("extra ;", expectedResult2, replacer.testReplace(s4,s5,s6,options));
+    assertEquals("extra ;", expectedResult2, Replacer.testReplace(s4, s5, s6, options, getProject()));
 
     String s7 = "public class A {\n" +
                 "    void f() {\n" +
@@ -626,7 +630,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                              "}";
     boolean formatAccordingToStyle = options.isToReformatAccordingToStyle();
     options.setToReformatAccordingToStyle(true);
-    assertEquals("extra ; 2", expectedResult3, replacer.testReplace(s7,s8,s9,options));
+    assertEquals("extra ; 2", expectedResult3, Replacer.testReplace(s7, s8, s9, options, getProject()));
 
     String s10 = "public class A {\n" +
                  "    void f() {\n" +
@@ -726,7 +730,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                              "    abstract void f();\n" +
                              "}";
 
-    assertEquals("same multiple occurrences 2 times", expectedResult4, replacer.testReplace(s10,s11,s12,options));
+    assertEquals("same multiple occurrences 2 times", expectedResult4, Replacer.testReplace(s10, s11, s12, options, getProject()));
 
     options.setToReformatAccordingToStyle(formatAccordingToStyle);
 
@@ -767,7 +771,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                              "        return value;\n" +
                              "    }";
     options.setToReformatAccordingToStyle(true);
-    assertEquals("extra ; over return", expectedResult5, replacer.testReplace(s13,s14,s15,options));
+    assertEquals("extra ; over return", expectedResult5, Replacer.testReplace(s13, s14, s15, options, getProject()));
     options.setToReformatAccordingToStyle(false);
 
 
@@ -777,7 +781,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                              "        }\n" +
                              "    }";
     options.setToReformatAccordingToStyle(true);
-    assertEquals("extra ; over if", expectedResult6, replacer.testReplace(s13_2,s14,s15,options));
+    assertEquals("extra ; over if", expectedResult6, Replacer.testReplace(s13_2, s14, s15, options, getProject()));
     options.setToReformatAccordingToStyle(false);
 
 
@@ -791,7 +795,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                              "        }\n" +
                              "    }";
     options.setToReformatAccordingToStyle(true);
-    assertEquals("newlines in matches of several lines", expectedResult7, replacer.testReplace(s13_3,s14,s15,options));
+    assertEquals("newlines in matches of several lines", expectedResult7, Replacer.testReplace(s13_3, s14, s15, options, getProject()));
     options.setToReformatAccordingToStyle(false);
 
     String s16 = "public class SSTest {\n" +
@@ -833,9 +837,9 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                                "  }\n" +
                                "}";
 
-    assertEquals("extra ;", expectedResult8, replacer.testReplace(s16,s17,s18,options));
+    assertEquals("extra ;", expectedResult8, Replacer.testReplace(s16, s17, s18, options, getProject()));
 
-    assertEquals("missed ;", expectedResult8_2, replacer.testReplace(s16_2,s17,s18,options));
+    assertEquals("missed ;", expectedResult8_2, Replacer.testReplace(s16_2, s17, s18, options, getProject()));
   }
 
   public void testClassReplacement() {
@@ -853,7 +857,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "Basic class replacement",
       expectedResult,
-      replacer.testReplace(s1,s2,s3,options)
+      Replacer.testReplace(s1, s2, s3, options, getProject())
     );
 
     String s4 = "class A { class C {} public void b() {} int f; }";
@@ -868,7 +872,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                              "        int f;\n" +
                              "    }";
 
-    assertEquals("Order of members in class replacement", expectedResult2, replacer.testReplace(s4,s5,s6,options));
+    assertEquals("Order of members in class replacement", expectedResult2, Replacer.testReplace(s4, s5, s6, options, getProject()));
 
     String s7 = "class A extends B { int c; void b() {} { a = 1; } }";
     String s8 = "class 'A extends B { '_Other* }";
@@ -882,7 +886,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                              "        }\n" +
                              "    }";
 
-    assertEquals("Unsupported pattern exception", expectedResult3, replacer.testReplace(s7, s8, s9, options));
+    assertEquals("Unsupported pattern exception", expectedResult3, Replacer.testReplace(s7, s8, s9, options, getProject()));
     options.setToReformatAccordingToStyle(formatAccordingToStyle);
 
     String s10 = "/** @example */\n" +
@@ -907,7 +911,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                              "    }";
 
     options.setToReformatAccordingToStyle(true);
-    assertEquals("Make class public", expectedResult4, replacer.testReplace(s10, s11, s12, options));
+    assertEquals("Make class public", expectedResult4, Replacer.testReplace(s10, s11, s12, options, getProject()));
     options.setToReformatAccordingToStyle(false);
 
     String s13 = "class CustomThread extends Thread {\n" +
@@ -950,7 +954,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                              "        }\n" +
                              "    }";
     options.setToReformatAccordingToStyle(true);
-    assertEquals("Constructor replacement", expectedResult5, replacer.testReplace(s13, s14, s15, options));
+    assertEquals("Constructor replacement", expectedResult5, Replacer.testReplace(s13, s14, s15, options, getProject()));
     options.setToReformatAccordingToStyle(false);
 
     String s16 = "public class A {}\n" +
@@ -962,25 +966,25 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
 
     String expectedResult6 = "public class A { private Log log = LogFactory.createLog();  }\n" +
                              "final class B { private Log log = LogFactory.createLog();  }";
-    assertEquals("Modifier list for class", expectedResult6, replacer.testReplace(s16, s17, s18, options));
+    assertEquals("Modifier list for class", expectedResult6, Replacer.testReplace(s16, s17, s18, options, getProject()));
 
     String expectedResult7 = "public class A {  }\n" +
                              "final class B {  }";
-    assertEquals("Removing field", expectedResult7, replacer.testReplace(expectedResult6, s17_2, s18_2, options));
+    assertEquals("Removing field", expectedResult7, Replacer.testReplace(expectedResult6, s17_2, s18_2, options, getProject()));
 
     String s19 = "public class A extends Object implements Cloneable {}\n";
     String s20 = "class 'A { '_Other* }";
     String s21 = "class $A$ { private Log log = LogFactory.createLog(); $Other$ }";
 
     String expectedResult8 = "public class A extends Object implements Cloneable { private Log log = LogFactory.createLog();  }\n";
-    assertEquals("Extends / implements list for class", expectedResult8, replacer.testReplace(s19, s20, s21, options));
+    assertEquals("Extends / implements list for class", expectedResult8, Replacer.testReplace(s19, s20, s21, options, getProject()));
 
     String s22 = "public class A<T> { int Afield; }\n";
     String s23 = "class 'A { '_Other* }";
     String s24 = "class $A$ { private Log log = LogFactory.createLog(); $Other$ }";
 
     String expectedResult9 = "public class A<T> { private Log log = LogFactory.createLog(); int Afield; }\n";
-    assertEquals("Type parameters for the class", expectedResult9, replacer.testReplace(s22, s23, s24, options));
+    assertEquals("Type parameters for the class", expectedResult9, Replacer.testReplace(s22, s23, s24, options, getProject()));
 
     String s25 = "class A {\n" +
                  "  // comment before\n" +
@@ -996,7 +1000,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "Replacing dcl with saving access modifiers",
       expectedResult10,
-      replacer.testReplace(s25,s26,s27,options)
+      Replacer.testReplace(s25, s26, s27, options, getProject())
     );
 
     String s28 = "aaa";
@@ -1015,7 +1019,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "Complex class replacement",
       expectedResult11,
-      replacer.testReplace(s28,s29,s30,options)
+      Replacer.testReplace(s28, s29, s30, options, getProject())
     );
 
     String s31 = "class A {\n" +
@@ -1043,7 +1047,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "Replacing comments with javadoc for fields",
       expectedResult12,
-      replacer.testReplace(s31,s32,s33,options)
+      Replacer.testReplace(s31, s32, s33, options, getProject())
     );
     options.setToReformatAccordingToStyle(false);
 
@@ -1077,7 +1081,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "Replacing interface with interface, saving comments properly",
       expectedResult13,
-      replacer.testReplace(s34,s35,s36,options, true)
+      Replacer.testReplace(s34, s35, s36, options, getProject(), true)
     );
   }
 
@@ -1094,7 +1098,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "Multiple methods replacement",
       expectedResult14,
-      replacer.testReplace(s37, s38, s39, options, true)
+      Replacer.testReplace(s37, s38, s39, options, getProject(), true)
     );
   }
 
@@ -1117,7 +1121,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "Multiple fields replacement",
       expectedResult,
-      replacer.testReplace(s1,s2,s3,options, true)
+      Replacer.testReplace(s1, s2, s3, options, getProject(), true)
     );
   }
 
@@ -1154,7 +1158,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "Not preserving comment if it is present",
       expectedResult,
-      replacer.testReplace(s1,s2,s3,options, true)
+      Replacer.testReplace(s1, s2, s3, options, getProject(), true)
     );
   }
 
@@ -1201,7 +1205,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "Correct class replacement",
       expectedResult,
-      replacer.testReplace(s1,s2,s3,options)
+      Replacer.testReplace(s1, s2, s3, options, getProject())
     );
 
     String expectedResult2 = "public class X {\n" +
@@ -1216,7 +1220,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "Correct class replacement, 2",
       expectedResult2,
-      replacer.testReplace(s1_2,s2,s3,options)
+      Replacer.testReplace(s1_2, s2, s3, options, getProject())
     );
   }
 
@@ -1262,7 +1266,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                             "   }\n" +
                             "}";
 
-    assertEquals("Class with comment replacement", expectedResult, replacer.testReplace(s1,s2,s3,options,true));
+    assertEquals("Class with comment replacement", expectedResult, Replacer.testReplace(s1, s2, s3, options, getProject(), true));
   }
 
   public void testClassReplacement8() {
@@ -1276,7 +1280,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                             "}";
 
     assertEquals("Class field replacement with simple pattern",
-                 expectedResult, replacer.testReplace(s1,s2,s3,options,true));
+                 expectedResult, Replacer.testReplace(s1, s2, s3, options, getProject(), true));
   }
 
   @NotNull
@@ -1300,7 +1304,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String expectedResult = loadFile("after1.java");
 
     options.setToReformatAccordingToStyle(true);
-    assertEquals("Class replacement 9", expectedResult, replacer.testReplace(s1,s2,s3,options,true));
+    assertEquals("Class replacement 9", expectedResult, Replacer.testReplace(s1, s2, s3, options, getProject(), true));
   }
 
   public void testReplaceReturnWithArrayInitializer() {
@@ -1309,7 +1313,8 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String replaceBy = "return $A$;";
     String expectedResult = "return new String[]{CoreVars.CMUAudioPort + \"\"};";
 
-    assertEquals("ReplaceReturnWithArrayInitializer", expectedResult, replacer.testReplace(searchIn,searchFor,replaceBy,options));
+    assertEquals("ReplaceReturnWithArrayInitializer", expectedResult,
+                 Replacer.testReplace(searchIn, searchFor, replaceBy, options, getProject()));
   }
 
   @SuppressWarnings("unused")
@@ -1330,7 +1335,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String expectedResult = loadFile("after2.java");
 
     options.setToReformatAccordingToStyle(true);
-    assertEquals("Class replacement 10", expectedResult, replacer.testReplace(s1,s2,s3,options,true));
+    assertEquals("Class replacement 10", expectedResult, Replacer.testReplace(s1, s2, s3, options, getProject(), true));
   }
 
   public void testCatchReplacement() {
@@ -1347,7 +1352,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                 "    if (false) LOG.assertTrue(false);\n" +
                 "}";
     options.setToReformatAccordingToStyle(true);
-    assertEquals("Catch replacement by block", expectedResult, replacer.testReplace(s1,s2,s3,options));
+    assertEquals("Catch replacement by block", expectedResult, Replacer.testReplace(s1, s2, s3, options, getProject()));
     options.setToReformatAccordingToStyle(false);
 
   }
@@ -1364,7 +1369,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "Preserving var modifiers and generic information in type during replacement",
       expectedResult16,
-      replacer.testReplace(s43, s44, s45, options, true)
+      Replacer.testReplace(s43, s44, s45, options, getProject(), true)
     );
 
     String in1 = "public class A {" +
@@ -1377,7 +1382,8 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                  "  private class $B$ {}" +
                  "}";
     String expected1 = "public class A {  private class B {}}";
-    assertEquals("No illegal modifier combinations during replacement", expected1, replacer.testReplace(in1, what1, by1, options));
+    assertEquals("No illegal modifier combinations during replacement", expected1,
+                 Replacer.testReplace(in1, what1, by1, options, getProject()));
   }
 
   public void testDontRequireSpecialVarsForUnmatchedContent() {
@@ -1398,7 +1404,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "Preserving class modifiers and generic information in type during replacement",
       expectedResult16,
-      replacer.testReplace(s43, s44, s45, options, true)
+      Replacer.testReplace(s43, s44, s45, options, getProject(), true)
     );
 
     String in = "public class A {\n" +
@@ -1422,7 +1428,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                  "  private void m2() {}\n" +
                  "  void m3() {}\n" +
                  "}",
-                 replacer.testReplace(in, what, by, options));
+                 Replacer.testReplace(in, what, by, options, getProject()));
   }
 
   public void testClassReplacement2() {
@@ -1464,7 +1470,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                               "}";
 
     assertEquals("Preserving var modifiers and generic information in type during replacement",
-      expectedResult15, replacer.testReplace(s40,s41,s42,options, true));
+                 expectedResult15, Replacer.testReplace(s40, s41, s42, options, getProject(), true));
 
     String s46 = "class Foo { int xxx; void foo() { assert false; } void yyy() {}}";
     String s47 = "class '_Class { void '_foo:[regex( foo )](); }";
@@ -1474,7 +1480,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals(
       "Preserving method bodies",
       expectedResult17,
-      replacer.testReplace(s46,s47,s48,options, true)
+      Replacer.testReplace(s46, s47, s48, options, getProject(), true)
     );
   }
 
@@ -1484,7 +1490,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String s3 = "$b$";
 
     try {
-      replacer.testReplace(s1,s2,s3,options);
+      Replacer.testReplace(s1, s2, s3, options, getProject());
       assertTrue("Undefined replace variable is not checked",false);
     } catch(UnsupportedPatternException ignored) {
     }
@@ -1494,13 +1500,13 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String s6 = "a=a";
 
     try {
-      replacer.testReplace(s4,s5,s6,options);
+      Replacer.testReplace(s4, s5, s6, options, getProject());
       assertTrue("Undefined no ; in replace",false);
     } catch(UnsupportedPatternException ignored) {
     }
 
     try {
-      replacer.testReplace(s4,s6,s5,options);
+      Replacer.testReplace(s4, s6, s5, options, getProject());
       assertTrue("Undefined no ; in search",false);
     } catch(UnsupportedPatternException ignored) {
     }
@@ -1524,7 +1530,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     options.setToReformatAccordingToStyle(true);
     options.setToShortenFQN(true);
 
-    assertEquals("Replace in anonymous class parameter", expectedResult, replacer.testReplace(s1, s2, s3, options));
+    assertEquals("Replace in anonymous class parameter", expectedResult, Replacer.testReplace(s1, s2, s3, options, getProject()));
     options.setToShortenFQN(false);
     options.setToReformatAccordingToStyle(false);
   }
@@ -1566,7 +1572,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                             "    }\n" +
                             "}";
     options.setToReformatAccordingToStyle(true);
-    assertEquals("Removing comments", expectedResult, replacer.testReplace(s1,s2,s3,options));
+    assertEquals("Removing comments", expectedResult, Replacer.testReplace(s1, s2, s3, options, getProject()));
     options.setToReformatAccordingToStyle(false);
 
 
@@ -1587,7 +1593,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                              "  }\n" +
                              "}";
 
-    assertEquals("Removing comments", expectedResult2, replacer.testReplace(s1,s2_2,s3,options));
+    assertEquals("Removing comments", expectedResult2, Replacer.testReplace(s1, s2_2, s3, options, getProject()));
   }
 
   public void testTryCatchInLoop() {
@@ -1620,7 +1626,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                             "catch(final Throwable e) { continue; }\n" +
                             "}";
 
-    assertEquals("Replacing try/catch in loop", expectedResult, replacer.testReplace(code,toFind,replacement,options));
+    assertEquals("Replacing try/catch in loop", expectedResult, Replacer.testReplace(code, toFind, replacement, options, getProject()));
   }
 
   public void testUseStaticImport() {
@@ -1631,15 +1637,15 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     options.setToUseStaticImport(true);
     try {
       final String expected = "import static java.lang.Math.abs;class X {{ abs(-1); }}";
-      assertEquals("Replacing with static import", expected, replacer.testReplace(in, what, by, options, true));
+      assertEquals("Replacing with static import", expected, Replacer.testReplace(in, what, by, options, getProject(), true));
 
       final String in2 = "class X { void m(java.util.Random r) { Math.abs(r.nextInt()); }}";
       final String expected2 = "import static java.lang.Math.abs;class X { void m(java.util.Random r) { abs(r.nextInt()); }}";
-      assertEquals("don't add broken static imports", expected2, replacer.testReplace(in2, what, by, options, true));
+      assertEquals("don't add broken static imports", expected2, Replacer.testReplace(in2, what, by, options, getProject(), true));
 
       final String by2 = "new java.util.Map.Entry() {}";
       final String expected3 = "import static java.util.Map.Entry;class X {{ new Entry() {}; }}";
-      assertEquals("", expected3, replacer.testReplace(in, what, by2, options, true));
+      assertEquals("", expected3, Replacer.testReplace(in, what, by2, options, getProject(), true));
 
       final String in3 = "import java.util.Collections;" +
                          "class X {" +
@@ -1656,7 +1662,8 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                                "    out.println(Collections.<String>emptyList());" +
                                "  }" +
                                "}";
-      assertEquals("don't break references with type parameters", expected4, replacer.testReplace(in3, what3, by3, options, true));
+      assertEquals("don't break references with type parameters", expected4,
+                   Replacer.testReplace(in3, what3, by3, options, getProject(), true));
 
       final String in4 = "import java.util.Collections;\n" +
                          "public class X {\n" +
@@ -1674,7 +1681,8 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                                "        boolean b = Collections.eq(null, null);\n" +
                                "    }\n" +
                                "}";
-      assertEquals("don't add static import to inaccessible members", expected5, replacer.testReplace(in4, what4, by4, options, true));
+      assertEquals("don't add static import to inaccessible members", expected5,
+                   Replacer.testReplace(in4, what4, by4, options, getProject(), true));
 
       final String in5 = "package cz.ahoj.sample.annotations;\n" +
                          "/**\n" +
@@ -1698,7 +1706,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                          "    InnerAnnotation[] value();\n" +
                          "}";
       configureFromFileText("ReplacementTest.java", in5);
-      this.options.getMatchOptions().setScope(new LocalSearchScope( getFile()));
+      this.options.getMatchOptions().setScope(new LocalSearchScope(getFile()));
 
       final String what5 = "@'_a:[regex( InnerAnnotation )](classes = { String.class })";
       final String by5 = "@$a$(classes = { Integer.class })\n" +
@@ -1730,7 +1738,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                    "\n" +
                    "    InnerAnnotation[] value();\n" +
                    "}",
-                   replacer.testReplace(null, what5, by5, this.options, true));
+                   Replacer.testReplace(null, what5, by5, options, getProject(), true));
     } finally {
       options.setToUseStaticImport(save);
     }
@@ -1754,7 +1762,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                               "    sin(0.5);\n" +
                               "    max(1,2);\n" +
                               "}}";
-      assertEquals("Replacing with static star import", expected, replacer.testReplace(in, what, by, options, true));
+      assertEquals("Replacing with static star import", expected, Replacer.testReplace(in, what, by, options, getProject(), true));
     } finally {
       options.setToUseStaticImport(save);
     }
@@ -1783,7 +1791,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
       String replacement = loadFile(testName + "_replacement." + ext);
       String expected = loadFile(testName + "_result." + ext);
 
-      assertEquals(message, expected, replacer.testReplace(source,pattern,replacement,options));
+      assertEquals(message, expected, Replacer.testReplace(source, pattern, replacement, options, getProject()));
     }
     catch (IOException e) {
       throw new RuntimeException(e);
@@ -1809,10 +1817,10 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                 "  }\n" +
                 "}";
 
-    assertEquals(expected, replacer.testReplace(s1,s2,replacement,options));
-    assertEquals(expected, replacer.testReplace(s1,s2_2,replacement,options));
-    assertEquals(expected, replacer.testReplace(s1,s2_3,replacement,options));
-    assertEquals(expected, replacer.testReplace(s1,s2_4,replacement,options));
+    assertEquals(expected, Replacer.testReplace(s1, s2, replacement, options, getProject()));
+    assertEquals(expected, Replacer.testReplace(s1, s2_2, replacement, options, getProject()));
+    assertEquals(expected, Replacer.testReplace(s1, s2_3, replacement, options, getProject()));
+    assertEquals(expected, Replacer.testReplace(s1, s2_4, replacement, options, getProject()));
   }
 
   public void testLeastSurprise2() {
@@ -1821,7 +1829,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String replacement = "a2";
     String expected = "class B { int s(int a2) { a2 = 1; a2 = 2; c(a2); } }";
 
-    assertEquals(expected, replacer.testReplace(s1,s2,replacement,options));
+    assertEquals(expected, Replacer.testReplace(s1, s2, replacement, options, getProject()));
   }
 
   public void testReplaceTry() {
@@ -1834,7 +1842,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String replacement = "try { $TryStatement$; } catch($ExceptionType$ $ExceptionDcl$) { _logger.warning(\"$CommentContent$\", $ExceptionDcl$); }";
     String expected = "try { em.persist(p); } catch(PersistenceException e) { _logger.warning(\" good\", e); }";
 
-    assertEquals(expected, replacer.testReplace(s1,s2,replacement,options));
+    assertEquals(expected, Replacer.testReplace(s1, s2, replacement, options, getProject()));
 
     final String in1 = "try {\n" +
                        "  System.out.println(1);\n" +
@@ -1865,7 +1873,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                              "  System.out.println(3);\n" +
                              "}\n";
     assertEquals("Replacing try/finally should leave unmatched catch sections alone",
-                 expected1, replacer.testReplace(in1, what1, by1, options));
+                 expected1, Replacer.testReplace(in1, what1, by1, options, getProject()));
 
     final String in2 = "try (AutoCloseable a = null) {" +
                        "  System.out.println(1);" +
@@ -1890,7 +1898,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                              "}";
     assertEquals("Replacing try/finally should also keep unmatched resource lists and finally blocks",
                  expected2,
-                 replacer.testReplace(in2, what2, by2, options));
+                 Replacer.testReplace(in2, what2, by2, options, getProject()));
   }
 
   public void testReplaceExtraSemicolon() {
@@ -1904,7 +1912,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String expected = "String[] a = {\"a\"};\n" +
                 "      System.out.println(\"blah\");\n";
 
-    assertEquals(expected, replacer.testReplace(s1,s2,replacement,options));
+    assertEquals(expected, Replacer.testReplace(s1, s2, replacement, options, getProject()));
 
     String s1_2 = "try {\n" +
                   "    if (args == null) return ;\n" +
@@ -1916,7 +1924,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                   "    while(true) return ;\n" +
                   "    System.out.println(\"blah2\");";
 
-    assertEquals(expected_2, replacer.testReplace(s1_2,s2,replacement,options));
+    assertEquals(expected_2, Replacer.testReplace(s1_2, s2, replacement, options, getProject()));
 
     String s1_3 = "{\n" +
                   "    try {\n" +
@@ -1931,7 +1939,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                   "\n" +
                   "        System.out.println(\"blah2\");\n" +
                   "}";
-    assertEquals(expected_3, replacer.testReplace(s1_3,s2,replacement,options));
+    assertEquals(expected_3, Replacer.testReplace(s1_3, s2, replacement, options, getProject()));
 
     String s1_4 = "{\n" +
                   "    try {\n" +
@@ -1946,7 +1954,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                   "        // indented comment\n" +
                   "        System.out.println(\"blah2\");\n" +
                   "}";
-    assertEquals(expected_4, replacer.testReplace(s1_4,s2,replacement,options));
+    assertEquals(expected_4, Replacer.testReplace(s1_4, s2, replacement, options, getProject()));
   }
 
   public void testReplaceFinalModifier() {
@@ -1964,7 +1972,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                       "  }\n" +
                       "}";
 
-    assertEquals(expected, replacer.testReplace(s1,s2,s3,options));
+    assertEquals(expected, Replacer.testReplace(s1, s2, s3, options, getProject()));
   }
 
   public void testKeepUnmatchedModifiers() {
@@ -1975,7 +1983,8 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                             "  protected static final int foo = 1;" +
                             "}";
 
-    assertEquals(expected, replacer.testReplace(in, "private '_Type '_field = '_init;", "protected $Type$ $field$ = $init$;", options));
+    assertEquals(expected,
+                 Replacer.testReplace(in, "private '_Type '_field = '_init;", "protected $Type$ $field$ = $init$;", options, getProject()));
   }
 
   public void testRemovingRedundancy() {
@@ -1991,7 +2000,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
 
     String expected = "2 = 1;\nint b = a;\nb2 = 3;";
 
-    assertEquals(expected, replacer.testReplace(s1,s2,s3,options));
+    assertEquals(expected, Replacer.testReplace(s1, s2, s3, options, getProject()));
 
     String s2_2 = "int '_a = '_i;\n" +
                   "'_st*;\n" +
@@ -2000,7 +2009,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                   "int $c$ = $i$;";
     String expected_2 = "a = 2;\nint b = 1;\nb2 = 3;";
 
-    assertEquals(expected_2, replacer.testReplace(s1,s2_2,s3_2,options));
+    assertEquals(expected_2, Replacer.testReplace(s1, s2_2, s3_2, options, getProject()));
   }
 
   public void testReplaceWithEmptyString() {
@@ -2009,7 +2018,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String replace = "";
     String expectedResult = "public class Peepers {    \n}";
 
-    assertEquals(expectedResult, replacer.testReplace(source, search, replace, options, true));
+    assertEquals(expectedResult, Replacer.testReplace(source, search, replace, options, getProject(), true));
   }
 
   public void testReplaceMultipleFieldsInSingleDeclaration() {
@@ -2018,7 +2027,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String replace = "class $Name$ {\n  $ClassContent$\n}";
     String expectedResult = "abstract class MyClass {\n  private String a,b;\n}";
 
-    assertEquals(expectedResult, replacer.testReplace(source, search, replace, options, true));
+    assertEquals(expectedResult, Replacer.testReplace(source, search, replace, options, getProject(), true));
   }
 
   public void testReplaceInImplementsList() {
@@ -2031,7 +2040,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                             "import java.io.Serializable;\n" +
                             "abstract class MyClass implements Externalizable,Serializable {\n    \n}";
 
-    assertEquals(expectedResult, replacer.testReplace(source, search, replace, options, true));
+    assertEquals(expectedResult, Replacer.testReplace(source, search, replace, options, getProject(), true));
   }
 
   public void testReplaceFieldWithEndOfLineComment() {
@@ -2054,7 +2063,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                             "    void bar() {}\n" +
                             "}";
 
-    assertEquals(expectedResult, replacer.testReplace(source, search, replace, options, true));
+    assertEquals(expectedResult, Replacer.testReplace(source, search, replace, options, getProject(), true));
   }
 
   public void testReplaceAnnotation() {
@@ -2063,11 +2072,11 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     String what = "@SuppressWarnings(\"ALL\")";
 
     final String by1 = "";
-    assertEquals("public class A {}", replacer.testReplace(in, what, by1, options, false));
+    assertEquals("public class A {}", Replacer.testReplace(in, what, by1, options, getProject()));
 
     final String by2 = "@SuppressWarnings(\"NONE\") @Deprecated";
     assertEquals("@SuppressWarnings(\"NONE\") @Deprecated\n" +
-                 "public class A {}", replacer.testReplace(in, what, by2, options, false));
+                 "public class A {}", Replacer.testReplace(in, what, by2, options, getProject()));
 
     final String in2 = "class X {" +
                  "  @SuppressWarnings(\"unused\") String s;" +
@@ -2076,13 +2085,13 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     final String by3 = "@SuppressWarnings({\"unused\", \"other\"}) String $s$;";
     assertEquals("class X {" +
                  "  @SuppressWarnings({\"unused\", \"other\"}) String s;" +
-                 "}", replacer.testReplace(in2, what2, by3, options, false));
+                 "}", Replacer.testReplace(in2, what2, by3, options, getProject()));
 
     final String what3 = "@'_Anno('_v) String '_s;";
     final String by4 = "@$Anno$($v$) String $s$ = \"undoubtedly\";";
     assertEquals("class X {" +
                  "  @SuppressWarnings(\"unused\") String s = \"undoubtedly\";" +
-                 "}", replacer.testReplace(in2, what3, by4, options, false));
+                 "}", Replacer.testReplace(in2, what3, by4, options, getProject()));
   }
 
   public void testReplacePolyadicExpression() {
@@ -2092,33 +2101,33 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     final String what1 = "1 + '_a+";
 
     final String by1 = "4";
-    assertEquals("class A {  int i = 4;}", replacer.testReplace(in1, what1, by1, options, false));
+    assertEquals("class A {  int i = 4;}", Replacer.testReplace(in1, what1, by1, options, getProject()));
 
     final String by2 = "$a$";
-    assertEquals("class A {  int i = 2+3;}", replacer.testReplace(in1, what1, by2, options, false));
+    assertEquals("class A {  int i = 2+3;}", Replacer.testReplace(in1, what1, by2, options, getProject()));
 
     final String by3 = "$a$+4";
-    assertEquals("class A {  int i = 2+3+4;}", replacer.testReplace(in1, what1, by3, options, false));
+    assertEquals("class A {  int i = 2+3+4;}", Replacer.testReplace(in1, what1, by3, options, getProject()));
 
     final String what2 = "1 + 2 + 3 + '_a*";
     final String by4 = "1 + 3 + $a$";
-    assertEquals("class A {  int i = 1 + 3;}", replacer.testReplace(in1, what2, by4, options, false));
+    assertEquals("class A {  int i = 1 + 3;}", Replacer.testReplace(in1, what2, by4, options, getProject()));
 
     final String by5 = "$a$ + 1 + 3";
-    assertEquals("class A {  int i = 1 + 3;}", replacer.testReplace(in1, what2, by5, options, false));
+    assertEquals("class A {  int i = 1 + 3;}", Replacer.testReplace(in1, what2, by5, options, getProject()));
 
     final String by6 = "1 + $a$ + 3";
-    assertEquals("class A {  int i = 1 + 3;}", replacer.testReplace(in1, what2, by6, options, false));
+    assertEquals("class A {  int i = 1 + 3;}", Replacer.testReplace(in1, what2, by6, options, getProject()));
 
     final String in2 = "class A {" +
                        "  boolean b = true && true;" +
                        "}";
     final String what3 = "true && true && '_a*";
     final String by7 = "true && true && $a$";
-    assertEquals("class A {  boolean b = true && true;}", replacer.testReplace(in2, what3, by7, options, false));
+    assertEquals("class A {  boolean b = true && true;}", Replacer.testReplace(in2, what3, by7, options, getProject()));
 
     final String by8 = "$a$ && true && true";
-    assertEquals("class A {  boolean b = true && true;}", replacer.testReplace(in2, what3, by8, options, false));
+    assertEquals("class A {  boolean b = true && true;}", Replacer.testReplace(in2, what3, by8, options, getProject()));
 
   }
 
@@ -2131,7 +2140,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
 
     final String what = "assert '_a > '_b : '_c?;";
     final String by = "assert $b$ < $a$ : $c$;";
-    assertEquals("class A {  void m(int i) {    assert i < 10;  }}", replacer.testReplace(in, what, by, options, false));
+    assertEquals("class A {  void m(int i) {    assert i < 10;  }}", Replacer.testReplace(in, what, by, options, getProject()));
   }
 
   public void testReplaceMultipleVariablesInOneDeclaration() {
@@ -2143,11 +2152,13 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                       "}";
     final String what1 = "int '_i+;";
     final String by1 = "float $i$;";
-    assertEquals("class A {  private float i,j,k;  void m() {    float i,j,k;  }}", replacer.testReplace(in, what1, by1, options));
+    assertEquals("class A {  private float i,j,k;  void m() {    float i,j,k;  }}",
+                 Replacer.testReplace(in, what1, by1, options, getProject()));
 
     final String what2 = "int '_a, '_b, '_c = '_d?;";
     final String by2 = "float $a$, $b$, $c$ = $d$;";
-    assertEquals("class A {  private float i, j, k;  void m() {    float i, j, k;  }}", replacer.testReplace(in, what2, by2, options));
+    assertEquals("class A {  private float i, j, k;  void m() {    float i, j, k;  }}",
+                 Replacer.testReplace(in, what2, by2, options, getProject()));
   }
 
   public void testReplaceWithScriptedVariable() {
@@ -2172,7 +2183,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                             "    method((String)a);\n" +
                             "  }\n" +
                             "}";
-    assertEquals(expected, replacer.testReplace(in, what, by, options));
+    assertEquals(expected, Replacer.testReplace(in, what, by, options, getProject()));
 
     options.clearVariableDefinitions();
   }
@@ -2189,7 +2200,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                  "  @Override void testOne() {\n" +
                  "    System.out.println();\n" +
                  "  }\n" +
-                 "}\n", replacer.testReplace(in, what, by, options));
+                 "}\n", Replacer.testReplace(in, what, by, options, getProject()));
 
     final String what2 = "void '_a:[regex( test.* )]();";
     final String by2 = "@org.junit.Test void $a$();";
@@ -2198,7 +2209,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                  "    System.out.println();\n" +
                  "  }\n" +
                  "}\n",
-                 replacer.testReplace(in, what2, by2, options));
+                 Replacer.testReplace(in, what2, by2, options, getProject()));
   }
 
   public void testReplaceMethodWithoutBody() {
@@ -2210,14 +2221,14 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals("abstract class A {\n" +
                  "  abstract void a(int i);\n" +
                  "}",
-                 replacer.testReplace(in, what, by, options));
+                 Replacer.testReplace(in, what, by, options, getProject()));
 
     final String what2 = "abstract void '_a('_T '_p*);";
     final String by2 = "void $a$($T$ $p$) {}";
     assertEquals("abstract class A {\n" +
                  "  void a() {}\n" +
                  "}",
-                 replacer.testReplace(in, what2, by2, options));
+                 Replacer.testReplace(in, what2, by2, options, getProject()));
   }
 
   public void testReplaceParameterWithComment() {
@@ -2229,7 +2240,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
     assertEquals("class A {\n" +
                  "  void a(final long /*!*/ b) {}\n" +
                  "}",
-                 replacer.testReplace(in, what, by, options));
+                 Replacer.testReplace(in, what, by, options, getProject()));
 
     final String in2 = "class X {" +
                        "  void m() {" +
@@ -2244,7 +2255,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                  "    for (final int /*!*/ x : new int[]{1, 2, 3}) {}" +
                  "  }" +
                  "}",
-                 replacer.testReplace(in2, what2, by2, options));
+                 Replacer.testReplace(in2, what2, by2, options, getProject()));
   }
 
   public void testReplaceInnerClass() {
@@ -2262,7 +2273,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                  "  private class B<T> extends A implements java.io.Serializable {\n" +
                  "  }\n" +
                  "}",
-                 replacer.testReplace(in, what, by, options));
+                 Replacer.testReplace(in, what, by, options, getProject()));
 
     String in2 = "public class A {\n" +
                  "  void m1() {}\n" +
@@ -2285,7 +2296,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                  "  }\n" +
                  "  void m3() {}\n" +
                  "}",
-                 replacer.testReplace(in2, what, by, options));
+                 Replacer.testReplace(in2, what, by, options, getProject()));
   }
 
   public void testReplaceQualifiedReference() {
@@ -2306,7 +2317,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                  "    this.s = s;" +
                  "  }" +
                  "}",
-                 replacer.testReplace(in, what, by, options));
+                 Replacer.testReplace(in, what, by, options, getProject()));
   }
 
   public void testReplaceExpressionStatement() {
@@ -2323,7 +2334,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                  "    new Object().toString();" +
                  "  }" +
                  "}",
-                 replacer.testReplace(in, what, by, options, true));
+                 Replacer.testReplace(in, what, by, options, getProject(), true));
   }
 
   public void testReplaceVariableInitializer() {
@@ -2336,7 +2347,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                  "class X {" +
                  "  private final long i=1;" +
                  "}",
-                 replacer.testReplace(in, what, by, options, true));
+                 Replacer.testReplace(in, what, by, options, getProject(), true));
   }
 
   public void testReplaceParentheses() {
@@ -2365,7 +2376,7 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                  "        }\n" +
                  "    }\n" +
                  "}",
-                 replacer.testReplace(in, what, by, options, true));
+                 Replacer.testReplace(in, what, by, options, getProject(), true));
   }
 
   public void testReplaceTarget() {
@@ -2404,6 +2415,6 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase {
                  "    System.out.println();" +
                  "    System.out.println();" +
                  "  }" +
-                 "}", replacer.testReplace(in, what, by, options, true));
+                 "}", Replacer.testReplace(in, what, by, options, getProject(), true));
   }
 }
\ No newline at end of file
diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTestCase.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTestCase.java
index 0ca9b4811cf9..ab7b4e5bd26c 100644
--- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTestCase.java
+++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTestCase.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
 package com.intellij.structuralsearch;
 
 import com.intellij.codeInsight.daemon.quickFix.LightQuickFixTestCase;
@@ -7,13 +7,11 @@ import com.intellij.openapi.util.io.FileUtilRt;
 import com.intellij.openapi.vfs.CharsetToolkit;
 import com.intellij.pom.java.LanguageLevel;
 import com.intellij.structuralsearch.plugin.replace.ReplaceOptions;
-import com.intellij.structuralsearch.plugin.replace.impl.Replacer;
 
 import java.io.File;
 import java.io.IOException;
 
 abstract class StructuralReplaceTestCase extends LightQuickFixTestCase {
-  protected Replacer replacer;
   protected ReplaceOptions options;
 
   @Override
@@ -23,7 +21,6 @@ abstract class StructuralReplaceTestCase extends LightQuickFixTestCase {
     LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_4);
 
     options = new ReplaceOptions();
-    replacer = new Replacer(getProject(), null);
   }
 
   protected String loadFile(String fileName) throws IOException {
diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/XmlStructuralReplaceTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/XmlStructuralReplaceTest.java
index b9f4d4e9575c..4a052cfed6c0 100644
--- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/XmlStructuralReplaceTest.java
+++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/XmlStructuralReplaceTest.java
@@ -2,6 +2,7 @@
 package com.intellij.structuralsearch;
 
 import com.intellij.openapi.fileTypes.StdFileTypes;
+import com.intellij.structuralsearch.plugin.replace.impl.Replacer;
 import com.intellij.testFramework.PlatformTestUtil;
 import org.jetbrains.annotations.NotNull;
 
@@ -13,22 +14,14 @@ public class XmlStructuralReplaceTest extends StructuralReplaceTestCase {
     super.setUp();
     options.getMatchOptions().setFileType(StdFileTypes.XML);
   }
-  
+
   public void testReplaceXmlAndHtml() {
-    
     String s1 = "<a/>";
     String s2 = "<a/>";
     String s3 = "<a><b/></a>";
 
     String expectedResult = "<a><b/></a>";
-    String actualResult = replacer.testReplace(s1,s2,s3,options);
-
-    assertEquals(
-      "First tag replacement",
-      expectedResult,
-      actualResult
-    );
-
+    assertEquals("First tag replacement", expectedResult, Replacer.testReplace(s1, s2, s3, options, getProject()));
 
     String s4 = "<group id=\"EditorTabPopupMenu\">\n" +
                 "      <reference id=\"Compile\"/>\n" +
@@ -42,7 +35,6 @@ public class XmlStructuralReplaceTest extends StructuralReplaceTestCase {
     String s5 = "<reference id=\"'_Value\"/>";
     String s6 = "<reference ref=\"$Value$\"/>";
 
-    actualResult = replacer.testReplace(s4,s5,s6,options);
     expectedResult = "<group id=\"EditorTabPopupMenu\">\n" +
                      "      <reference ref=\"Compile\"/>\n" +
                      "      <reference ref=\"RunContextPopupGroup\"/>\n" +
@@ -52,42 +44,32 @@ public class XmlStructuralReplaceTest extends StructuralReplaceTestCase {
                      "      <separator/>\n" +
                      "      <reference ref=\"ExternalToolsGroup\"/>\n" +
                      "</group>";
-    assertEquals(
-      "Replace tag",
-      expectedResult,
-      actualResult
-    );
+    assertEquals("Replace tag", expectedResult, Replacer.testReplace(s4, s5, s6, options, getProject()));
 
     String s7 = "<h4 class=\"a\">My title<aaa>ZZZZ</aaa> My title 3</h4>\n" +
                 "<h4>My title 2</h4>";
     String s8 = "<h4 class=\"a\">'_Content*</h4>";
     String s9 = "<h5>$Content$</h5>";
 
-    actualResult = replacer.testReplace(s7,s8,s9,options);
     expectedResult = "<h5>My title <aaa>ZZZZ</aaa>  My title 3</h5>\n" +
                      "<h4>My title 2</h4>";
-
-    assertEquals(
-      "Replace tag saving content",
-      expectedResult,
-      actualResult
-    );
+    assertEquals("Replace tag saving content", expectedResult, Replacer.testReplace(s7, s8, s9, options, getProject()));
 
     expectedResult = "\n" +
                      "<h4>My title 2</h4>";
-    assertEquals("Delete tag", expectedResult, replacer.testReplace(s7, s8, "", options));
+    assertEquals("Delete tag", expectedResult, Replacer.testReplace(s7, s8, "", options, getProject()));
 
     String what = "<'_H:h4 class=\"a\">'_Content*</'_H>";
     String by = "<$H$>$Content$</$H$>";
     expectedResult = "<h4>My title <aaa>ZZZZ</aaa>  My title 3</h4>\n" +
                      "<h4>My title 2</h4>";
-    assertEquals("Replace with variable", expectedResult, replacer.testReplace(s7, what, by, options));
+    assertEquals("Replace with variable", expectedResult, Replacer.testReplace(s7, what, by, options, getProject()));
 
     String in = "<b>Cry 'Havoc!', and <i>let slip the<br> dogs of war</i></b>";
     what = "<'_Tag:b >'_Content2*</'_Tag>";
     by = "<$Tag$ id=\"unique\">$Content2$</$Tag$>";
     expectedResult = "<b id=\"unique\">Cry 'Havoc!', and  <i>let slip the<br> dogs of war</i></b>";
-    assertEquals("Replace complex content with variable", expectedResult, replacer.testReplace(in, what, by, options));
+    assertEquals("Replace complex content with variable", expectedResult, Replacer.testReplace(in, what, by, options, getProject()));
   }
 
   public void testHtmlReplacement1() throws IOException {
@@ -108,7 +90,7 @@ public class XmlStructuralReplaceTest extends StructuralReplaceTestCase {
     String by = "<input $a$ id=\"someId1\" />";
     String expected = "<input class=\"other\" type=\"text\" ng-model=\"someModel\" placeholder=\"Some placeholder\" id=\"someId1\" />";
 
-    String actual = replacer.testReplace(in, what, by, options);
+    String actual = Replacer.testReplace(in, what, by, options, getProject());
     assertEquals(expected, actual);
   }
 
@@ -130,7 +112,7 @@ public class XmlStructuralReplaceTest extends StructuralReplaceTestCase {
     String replacement = loadFile(replacementFileName);
     String expectedResult = loadFile(outFileName);
 
-    assertEquals(message, expectedResult, replacer.testReplace(content,pattern,replacement,options,filepattern));
+    assertEquals(message, expectedResult, Replacer.testReplace(content, pattern, replacement, options,getProject(), filepattern));
 
     options.getMatchOptions().setFileType(StdFileTypes.XML);
   }
-- 
GitLab