Improve check for statements-only postfix templates

Before this change the check was quite complicated
because of cases like:
for (i in 1..9)
    foo(i)<caret>

It's not located in a block, but in the same time it's a stament.
So we had a tricky heuristics that if is parent is not a block, then
we should check if element isn't used as expression.

Of course this heuristics is wrong, e.g. for import/package nodes.

The solution is to reuse similar logic from BasicExpressionTypingVisitor.
it has been checked once that statement container is one of:
- KtBlockExpression
- KtContainerNodeForControlStructureBody
- KtWhenEntry

So there's no need to check anything else

 #KT-14986 Fixed
 #KT-14483 Fixed
This commit is contained in:
Denis Zharkov
2017-03-10 19:11:58 +03:00
parent 78ffe47bf8
commit dcc98e3839
8 changed files with 42 additions and 10 deletions
@@ -860,4 +860,14 @@ public class KtPsiUtil {
}
return deparenthesizedExpression;
}
public static boolean isStatementContainer(@Nullable PsiElement container) {
return container instanceof KtBlockExpression ||
container instanceof KtContainerNodeForControlStructureBody ||
container instanceof KtWhenEntry;
}
public static boolean isStatement(@NotNull PsiElement element) {
return isStatementContainer(element.getParent());
}
}
@@ -1681,13 +1681,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
parent = parent.getParent();
}
return isParentForBlockLevelExpression(parent);
}
private static boolean isParentForBlockLevelExpression(@Nullable PsiElement parent) {
return parent instanceof KtBlockExpression ||
parent instanceof KtContainerNodeForControlStructureBody ||
parent instanceof KtWhenEntry;
return KtPsiUtil.isStatementContainer(parent);
}
@Override