diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyBundle.properties b/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyBundle.properties
index a24fca4d818c..2d00bb9821b9 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyBundle.properties
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyBundle.properties
@@ -352,3 +352,4 @@ enums.may.not.have.extends.clause=Enums may not have 'extends' clause
method.0.cannot.override.method.1.in.2.overridden.method.is.final=Method ''{0}'' cannot override method ''{1}'' in ''{2}''; overridden method is final
method.0.cannot.have.weaker.access.privileges.1.than.2.in.3.4=Method ''{0}'' cannot have weaker access privileges (''{1}'') than ''{2}'' in ''{3}'' (''{4}'')
tuple.declaration.should.end.with.def.modifier=Tuple declaration should end with 'def' modifier
+injection.should.not.contain.line.feeds=GString injection must not contain line feeds
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java
index 4b5e9e7c088d..b989841822b3 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java
@@ -77,6 +77,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.*;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrRegex;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrString;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrStringInjection;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrMethodCallExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.*;
@@ -1256,6 +1257,16 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator {
return;
}
}
+
+ }
+
+ @Override
+ public void visitGStringInjection(GrStringInjection injection) {
+ if (((GrString)injection.getParent()).isPlainString()) {
+ if (StringUtil.indexOf(injection.getText(), '\n') != -1) {
+ myHolder.createErrorAnnotation(injection, GroovyBundle.message("injection.should.not.contain.line.feeds"));
+ }
+ }
}
private void checkStringLiteral(PsiElement literal, String text) {
diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GroovyHighlightingTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GroovyHighlightingTest.groovy
index 09ac11f3bdbe..ddbcae753173 100644
--- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GroovyHighlightingTest.groovy
+++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GroovyHighlightingTest.groovy
@@ -1098,4 +1098,17 @@ print testConfig.list[0]
print testConfig.foo()
''', true, false, false, GrUnresolvedAccessInspection)
}
+
+ void testGStringInjectionLFs() {
+ testHighlighting('''\
+print "${
+}"
+
+print """${
+}"""
+
+print "${ """
+"""}"
+''')
+ }
}
\ No newline at end of file