IDEA-123294 Make live templates for statement work properly inside shorten variant of lambda expression

This commit is contained in:
peter
2016-01-28 16:30:04 +01:00
parent 734d460bfd
commit f623ac8ede
4 changed files with 63 additions and 0 deletions
@@ -0,0 +1,49 @@
/*
* Copyright 2000-2016 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.
*/
package com.intellij.codeInsight.template.impl;
import com.intellij.codeInsight.template.TemplateSubstitutor;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.patterns.ElementPattern;
import com.intellij.psi.JavaTokenType;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static com.intellij.patterns.PsiJavaPatterns.psiElement;
/**
* @author peter
*/
public class JavaTemplateSubstitutor implements TemplateSubstitutor {
private static final ElementPattern<PsiElement> EXPR_LAMBDA_BODY = psiElement().afterLeaf(psiElement(JavaTokenType.ARROW));
@Nullable
@Override
public TemplateImpl substituteTemplate(@NotNull PsiFile file, int caretOffset, @NotNull TemplateImpl template) {
if (file.getLanguage().isKindOf(JavaLanguage.INSTANCE) && EXPR_LAMBDA_BODY.accepts(file.findElementAt(caretOffset))) {
String text = template.getString();
if (!text.contains("\n") && text.endsWith(";")) {
TemplateImpl copy = template.copy();
copy.setString(StringUtil.trimEnd(text, ";"));
return copy;
}
}
return null;
}
}
@@ -1098,4 +1098,16 @@ class Foo {
}
""")
}
public void "test sout template in expression lambda"() {
myFixture.configureByText 'a.java', '''class Foo {{
strings.stream().forEach(o -> sout<caret>);
}}
'''
myFixture.type('\t')
myFixture.checkResult '''class Foo {{
strings.stream().forEach(o -> System.out.println(<caret>));
}}
'''
}
}
@@ -392,6 +392,7 @@ public class TemplateImpl extends Template implements SchemeElement {
public void setString(String string) {
myString = string;
toParseSegments = true;
}
@Override
+1
View File
@@ -1496,6 +1496,7 @@
<treeStructureProvider implementation="com.intellij.ide.projectView.impl.ClassesTreeStructureProvider" order="last"/>
<defaultLiveTemplatesProvider implementation="com.intellij.codeInsight.template.impl.JavaDefaultLiveTemplatesProvider"/>
<liveTemplateSubstitutor implementation="com.intellij.codeInsight.template.impl.JavaTemplateSubstitutor"/>
<codeInsight.surroundWithRangeAdjuster implementation="com.intellij.codeInsight.generation.surroundWith.XmlSurroundWithRangeAdjuster"/>