boolean (@NotNull UCallExpression expression) { UElement currentParent = expression; while ((currentParent = currentParent.getUastParent()) != null) { ProgressManager.checkCanceled(); if (currentParent instanceof UReturnExpression || currentParent instanceof ULocalVariable || currentParent instanceof UField || currentParent instanceof UBinaryExpression || currentParent instanceof UCallExpression) { return true; } // chain of calls if (currentParent instanceof UQualifiedReferenceExpression) { UExpression selector = ((UQualifiedReferenceExpression)currentParent).getSelector(); if (selector instanceof UCallExpression && !selector.equals(expression)) { return true; } } if (currentParent instanceof UMethod || currentParent instanceof UClass || currentParent instanceof UFile) { break; // no need to go further if we already on method/class/file level; result is not used. } } //Kotlin expression-bodies (a workaround for KT-23557) if (currentParent instanceof UMethod && !(((UMethod)currentParent).getUastBody() instanceof UBlockExpression)) { return true; } return false; }