diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/UnnecessaryLocalVariableInspectionBase.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/UnnecessaryLocalVariableInspectionBase.java index e6e1541fa1da..0f331f5e3ed9 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/UnnecessaryLocalVariableInspectionBase.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/UnnecessaryLocalVariableInspectionBase.java @@ -169,6 +169,9 @@ public class UnnecessaryLocalVariableInspectionBase extends BaseInspection { !HighlightControlFlowUtil.isEffectivelyFinal(initialization, containingScope, null) && HighlightControlFlowUtil.isEffectivelyFinal(variable, containingScope, null); + final PsiType variableType = variable.getType(); + final PsiType initializationType = initialization.getType(); + final boolean sameType = Comparing.equal(variableType, initializationType); for (PsiReference ref : ReferencesSearch.search(variable, new LocalSearchScope(containingScope))) { final PsiElement refElement = ref.getElement(); if (finalVariableIntroduction) { @@ -181,9 +184,20 @@ public class UnnecessaryLocalVariableInspectionBase extends BaseInspection { if (resolveHelper.resolveReferencedVariable(initializationName, refElement) != initialization) { return false; } + + if (!sameType) { + final PsiElement parent = refElement.getParent(); + if (parent instanceof PsiReferenceExpression) { + final PsiElement resolve = ((PsiReferenceExpression)parent).resolve(); + if (resolve instanceof PsiMember && + ((PsiMember)resolve).hasModifierProperty(PsiModifier.PRIVATE)) { + return false; + } + } + } } - return !TypeConversionUtil.boxingConversionApplicable(variable.getType(), initialization.getType()); + return !TypeConversionUtil.boxingConversionApplicable(variableType, initializationType); } private boolean isImmediatelyReturned(PsiVariable variable) { diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/unnecessary_local_variable/C.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/unnecessary_local_variable/C.java index b356ca51be45..569114a1eff3 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/unnecessary_local_variable/C.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/unnecessary_local_variable/C.java @@ -154,4 +154,35 @@ class C { } }; } + + abstract class AbstractSchedulingElement> { + private String scenarioSettings; + public String scenarioSettings1; + + public T copyInto(T target) { + AbstractSchedulingElement targetAsAbstractSchedulingElement = target; + targetAsAbstractSchedulingElement.scenarioSettings = scenarioSettings; + return target; + } + + public T copyInto1(T target) { + AbstractSchedulingElement targetAsAbstractSchedulingElement = target; + targetAsAbstractSchedulingElement.scenarioSettings1 = scenarioSettings1; + return target; + } + + public SchedulingElement copyInto2(SchedulingElement target) { + AbstractSchedulingElement targetAsAbstractSchedulingElement = target; + targetAsAbstractSchedulingElement.scenarioSettings = scenarioSettings; + return target; + } + + public SchedulingElement copyInto3(SchedulingElement target) { + AbstractSchedulingElement targetAsAbstractSchedulingElement = target; + targetAsAbstractSchedulingElement.scenarioSettings1 = scenarioSettings1; + return target; + } + } + + class SchedulingElement extends AbstractSchedulingElement{} } \ No newline at end of file