diff --git a/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java b/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java index 140ef8353238..4b2e39ecbe68 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java @@ -72,6 +72,10 @@ public class InlineUtil { ChangeContextUtil.encodeContextInfo(initializer, false); PsiExpression expr = (PsiExpression)replaceDiamondWithInferredTypesIfNeeded(initializer, ref); + + PsiThisExpression thisAccessExpr = createThisExpression(manager, thisClass, refParent); + + expr = (PsiExpression)ChangeContextUtil.decodeContextInfo(expr, thisClass, thisAccessExpr); PsiType exprType = expr.getType(); if (exprType != null && (!varType.equals(exprType) && (varType instanceof PsiPrimitiveType || exprType instanceof PsiPrimitiveType) || !TypeConversionUtil.isAssignable(varType, exprType) @@ -164,9 +168,7 @@ public class InlineUtil { ChangeContextUtil.clearContextInfo(initializer); - PsiThisExpression thisAccessExpr = createThisExpression(manager, thisClass, refParent); - - return (PsiExpression)ChangeContextUtil.decodeContextInfo(expr, thisClass, thisAccessExpr); + return expr; } private static PsiExpression surroundWithCast(PsiVariable variable, PsiExpression expr, PsiExpression expression) { diff --git a/java/java-tests/testData/refactoring/inlineLocal/DecodeRefsBeforeCheckingOverRedundantCasts.java b/java/java-tests/testData/refactoring/inlineLocal/DecodeRefsBeforeCheckingOverRedundantCasts.java new file mode 100644 index 000000000000..60f50077d47a --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineLocal/DecodeRefsBeforeCheckingOverRedundantCasts.java @@ -0,0 +1,15 @@ +class Outer { + + public void bar() { + Outer foo = this; + + new Object() { + public void run() { + foo.baz(); + } + }; + } + + public void baz() { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineLocal/DecodeRefsBeforeCheckingOverRedundantCasts.java.after b/java/java-tests/testData/refactoring/inlineLocal/DecodeRefsBeforeCheckingOverRedundantCasts.java.after new file mode 100644 index 000000000000..60aa60bb8e01 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineLocal/DecodeRefsBeforeCheckingOverRedundantCasts.java.after @@ -0,0 +1,14 @@ +class Outer { + + public void bar() { + + new Object() { + public void run() { + Outer.this.baz(); + } + }; + } + + public void baz() { + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java index 8fc191d8616e..8ba4def19ab3 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java @@ -256,6 +256,10 @@ public class InlineLocalTest extends LightCodeInsightTestCase { doTest(true); } + public void testDecodeRefsBeforeCheckingOverRedundantCasts() throws Exception { + doTest(true); + } + public void testLocalVarInsideLambdaBodyWriteUsage() throws Exception { doTest(true, "Cannot perform refactoring.\n" + "Variable 'hello' is accessed for writing");