PsiElement (@NotNull PsiVariable variable, @Nullable PsiElement context) { PsiElement codeBlock = null; if (variable instanceof PsiParameter) { PsiElement declarationScope = ((PsiParameter)variable).getDeclarationScope(); if (declarationScope instanceof PsiCatchSection) { codeBlock = ((PsiCatchSection)declarationScope).getCatchBlock(); } else if (declarationScope instanceof PsiForeachStatement) { codeBlock = ((PsiForeachStatement)declarationScope).getBody(); } else if (declarationScope instanceof PsiMethod) { codeBlock = ((PsiMethod)declarationScope).getBody(); } else if (declarationScope instanceof PsiLambdaExpression) { codeBlock = ((PsiLambdaExpression)declarationScope).getBody(); } else if (declarationScope instanceof PsiCodeBlock) { codeBlock = declarationScope; } } else if (variable instanceof PsiResourceVariable) { PsiElement resourceList = variable.getParent(); return resourceList != null ? resourceList.getParent() : null; // use try statement as topmost } else if (variable instanceof PsiLocalVariable && variable.getParent() instanceof PsiForStatement) { return variable.getParent(); } else if (variable instanceof PsiField && context != null) { PsiClass aClass = ((PsiField) variable).getContainingClass(); while (context != null && context.getParent() != aClass) { context = context.getParent(); if (context instanceof PsiClassLevelDeclarationStatement) return null; } return context instanceof PsiMethod ? ((PsiMethod) context).getBody() : context instanceof PsiClassInitializer ? ((PsiClassInitializer) context).getBody() : null; } else { PsiElement scope = variable.getParent() == null ? null : variable.getParent().getParent(); codeBlock = getTopLevelEnclosingCodeBlock(variable, scope); if (codeBlock != null && codeBlock.getParent() instanceof PsiSwitchStatement) codeBlock = codeBlock.getParent().getParent(); } return codeBlock; }