diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchTemplateBuilder.java b/platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchTemplateBuilder.java index 8c416eb41135..5c2dd0bc9a6b 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchTemplateBuilder.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchTemplateBuilder.java @@ -5,9 +5,10 @@ import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.codeInsight.template.*; import com.intellij.psi.*; -import com.intellij.structuralsearch.impl.matcher.CompiledPattern; -import com.intellij.structuralsearch.impl.matcher.compiler.PatternCompiler; +import com.intellij.structuralsearch.impl.matcher.MatcherImplUtil; +import com.intellij.structuralsearch.impl.matcher.PatternTreeContext; import com.intellij.util.ArrayUtil; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -60,16 +61,13 @@ public class StructuralSearchTemplateBuilder { MatchOptions matchOptions = new MatchOptions(); String text = myPsiFile.getText(); matchOptions.setSearchPattern(text); - CompiledPattern pattern = PatternCompiler.compilePattern(myPsiFile.getProject(), matchOptions, false); - if (pattern == null) - return myBuilder; - - PsiElement current = pattern.getNodes().current(); - if (current != null) { - myShift = current.getTextRange().getStartOffset(); - current.accept(visitor); + PsiElement[] elements = + MatcherImplUtil.createTreeFromText(text, PatternTreeContext.Block, myPsiFile.getFileType(), myPsiFile.getProject()); + PsiElement psiElement = ContainerUtil.find(elements, element -> !(element instanceof PsiWhiteSpace)); + if (psiElement != null) { + myShift = 2; + psiElement.accept(visitor); } - return myBuilder; } diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/SSTemplateBuilderTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/SSTemplateBuilderTest.java index 8c5352ac6543..1127a148c861 100644 --- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/SSTemplateBuilderTest.java +++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/SSTemplateBuilderTest.java @@ -24,6 +24,16 @@ public class SSTemplateBuilderTest extends LightCodeInsightFixtureTestCase { assertEquals(1, template.getSegmentsCount()); } + public void testStartingWhitespace() { + doTest(" List list = null;", " $Class1$<$Class2$> list = null;"); + } + + public void testInnerWhiteSpace() { + doTest("try {\n" + + " List list = null;} finally {}", "try {\n" + + " $Class1$<$Class2$> list = null;} finally {}"); + } + private Template doTest(String text, String expected) { PsiFile psiFile = myFixture.configureByText(JavaFileType.INSTANCE, text); TemplateBuilderImpl builder = (TemplateBuilderImpl)new StructuralSearchTemplateBuilder(getFile()).buildTemplate();