diff --git a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties index f6103d4acf1e..90ad378a822f 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties @@ -1040,8 +1040,8 @@ instantiating.object.to.get.class.object.problem.descriptor=Instantiating object field.may.be.static.problem.descriptor=Field #ref may be 'static' #loc method.may.be.static.problem.descriptor=Method #ref() may be 'static' #loc class.initializer.may.be.static.problem.descriptor=Class initializer may be 'static' #loc -map.replaceable.by.enum.map.problem.descriptor=#ref replaceable with EnumMap #loc -set.replaceable.by.enum.set.problem.descriptor=#ref replaceable with EnumSet #loc +map.replaceable.by.enum.map.problem.descriptor=#ref replaceable with 'EnumMap' #loc +set.replaceable.by.enum.set.problem.descriptor=#ref replaceable with 'EnumSet' #loc inner.class.may.be.static.problem.descriptor=Inner class #ref may be 'static' #loc string.buffer.must.have.initial.capacity.problem.descriptor=#ref without initial capacity #loc string.buffer.replaceable.by.string.builder.problem.descriptor=StringBuffer #ref may be declared as 'StringBuilder' #loc diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/MapReplaceableByEnumMapInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/MapReplaceableByEnumMapInspection.java index bd8d55e5e27a..5f7076353221 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/MapReplaceableByEnumMapInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/MapReplaceableByEnumMapInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2012 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import com.intellij.psi.util.PsiTreeUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; +import com.siyeh.ig.psiutils.ExpectedTypeUtils; import com.siyeh.ig.psiutils.TypeUtils; import org.jetbrains.annotations.NotNull; @@ -28,15 +29,13 @@ public class MapReplaceableByEnumMapInspection extends BaseInspection { @Override @NotNull public String getDisplayName() { - return InspectionGadgetsBundle.message( - "map.replaceable.by.enum.map.display.name"); + return InspectionGadgetsBundle.message("map.replaceable.by.enum.map.display.name"); } @Override @NotNull protected String buildErrorString(Object... infos) { - return InspectionGadgetsBundle.message( - "map.replaceable.by.enum.map.problem.descriptor"); + return InspectionGadgetsBundle.message("map.replaceable.by.enum.map.problem.descriptor"); } @Override @@ -48,16 +47,19 @@ public class MapReplaceableByEnumMapInspection extends BaseInspection { extends BaseInspectionVisitor { @Override - public void visitNewExpression( - @NotNull PsiNewExpression expression) { + public void visitNewExpression(@NotNull PsiNewExpression expression) { super.visitNewExpression(expression); final PsiType type = expression.getType(); if (!(type instanceof PsiClassType)) { return; } - final PsiClassType classType = (PsiClassType)type; + PsiClassType classType = (PsiClassType)type; if (!classType.hasParameters()) { - return; + final PsiType expectedType = ExpectedTypeUtils.findExpectedType(expression, false); + if (!(expectedType instanceof PsiClassType)) { + return; + } + classType = (PsiClassType)expectedType; } final PsiType[] typeArguments = classType.getParameters(); if (typeArguments.length != 2) { @@ -67,12 +69,10 @@ public class MapReplaceableByEnumMapInspection extends BaseInspection { if (!(argumentType instanceof PsiClassType)) { return; } - if (!TypeUtils.expressionHasTypeOrSubtype(expression, - CommonClassNames.JAVA_UTIL_MAP)) { + if (!TypeUtils.expressionHasTypeOrSubtype(expression, CommonClassNames.JAVA_UTIL_MAP)) { return; } - if (null != TypeUtils.expressionHasTypeOrSubtype(expression, - "java.util.EnumMap", "java.util.concurrent.ConcurrentMap")) { + if (null != TypeUtils.expressionHasTypeOrSubtype(expression, "java.util.EnumMap", "java.util.concurrent.ConcurrentMap")) { return; } final PsiClassType argumentClassType = (PsiClassType)argumentType; @@ -80,13 +80,17 @@ public class MapReplaceableByEnumMapInspection extends BaseInspection { if (argumentClass == null || !argumentClass.isEnum()) { return; } - final PsiClass aClass = - PsiTreeUtil.getParentOfType(expression, PsiClass.class); + final PsiClass aClass = PsiTreeUtil.getParentOfType(expression, PsiClass.class); if (argumentClass.equals(aClass)) { - final PsiMember member = - PsiTreeUtil.getParentOfType(expression, PsiMember.class); - if (member != null && - !member.hasModifierProperty(PsiModifier.STATIC)) { + final PsiMember member = PsiTreeUtil.getParentOfType(expression, PsiMember.class); + if (member != null && !member.hasModifierProperty(PsiModifier.STATIC)) { + return; + } + } + final PsiExpressionList argumentList = expression.getArgumentList(); + if (argumentList != null) { + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length > 0 && TypeUtils.expressionHasTypeOrSubtype(arguments[0], "java.util.Comparator")) { return; } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/performance/map_replaceable_by_enum_map/MapReplaceableByEnumMap.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/performance/map_replaceable_by_enum_map/MapReplaceableByEnumMap.java index 9f2a423ddd18..a9fc66b71d63 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/performance/map_replaceable_by_enum_map/MapReplaceableByEnumMap.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/performance/map_replaceable_by_enum_map/MapReplaceableByEnumMap.java @@ -1,7 +1,7 @@ package com.siyeh.igtest.performance.map_replaceable_by_enum_map; -import java.util.HashMap; -import java.util.Map; +import java.util.Collections; import java.util.HashMap; +import java.util.Map; import java.util.TreeMap; public class MapReplaceableByEnumMap { @@ -14,4 +14,8 @@ public class MapReplaceableByEnumMap { Map enums = new HashMap(); // enum map here throws exception at runtime -> don't suggest it } + + void foo() { + final Map map = new TreeMap(Collections.reverseOrder()); + } }