IDEA-CR-16944 IDEA-43096 Inspection for gstrings used as map keys

This commit is contained in:
alexey.afanasiev
2016-12-26 17:51:02 +03:00
parent cf3c645623
commit 77cf51b621
2 changed files with 12 additions and 21 deletions
@@ -25,10 +25,8 @@ import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentLabel;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrApplicationStatement;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrMethodCallExpression;
import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil;
import static com.intellij.psi.CommonClassNames.JAVA_UTIL_MAP;
@@ -66,30 +64,23 @@ public class GroovyGStringKeyInspection extends BaseInspection {
}
@Override
public void visitMethodCallExpression(@NotNull GrMethodCallExpression methodCallExpression) {
checkMethodCall(methodCallExpression);
}
public void visitExpression(@NotNull GrExpression grExpression) {
if (!isGStringType(grExpression)) return;
@Override
public void visitApplicationStatement(@NotNull GrApplicationStatement applicationStatement) {
checkMethodCall(applicationStatement);
}
final PsiElement gstringParent = grExpression.getParent();
if (gstringParent == null || !(gstringParent instanceof GrArgumentList)) return;
public void checkMethodCall(@NotNull GrMethodCall grMethodCall) {
final GrArgumentList args = grMethodCall.getArgumentList();
GrExpression[] arguments = ((GrArgumentList)gstringParent).getExpressionArguments();
if (arguments.length != 2 || !arguments[0].equals(grExpression)) return;
if (args.getExpressionArguments().length != 2 || args.getAllArguments().length != 2) {
final PsiElement grandparent = gstringParent.getParent();
if (grandparent == null || !(grandparent instanceof GrMethodCall)) {
return;
}
final GrExpression firstArgument = args.getExpressionArguments()[0];
if (!isGStringType(firstArgument) ) {
return;
}
if (!isMapPutMethod((GrMethodCall)grandparent)) return;
if (!isMapPutMethod(grMethodCall)) return;
registerError(firstArgument);
registerError(grExpression);
}
boolean isMapPutMethod(@NotNull GrMethodCall grMethodCall) {
@@ -26,7 +26,7 @@ class GroovyGStringKeyInspectionTest extends GrHighlightingTestBase {
void testMapLiteral() {
testHighlighting('''
def key = 'key'
[<warning>"${key}"</warning>: 'value', (key): 'value']
[<warning>"${key}"</warning>: 'value', (key): "${key}"]
''')
}
void testMapLiteralGStringFromClosure() {
@@ -60,7 +60,7 @@ class GroovyGStringKeyInspectionTest extends GrHighlightingTestBase {
testHighlighting('''
def key = 'foo'
def map = [:]
map.put(<warning>"${key}"</warning>, 'bar')
map.put(<warning>"${key}"</warning>, "${key}")
''')
}