void (JavaSmartCompletionParameters parameters, @Nullable PsiType expectedType, final PrefixMatcher matcher, Consumer<? super LookupElement> consumer) { final PsiExpression context = PsiTreeUtil.getParentOfType(parameters.getPosition(), PsiExpression.class); if (context == null) return; MultiMap<PsiExpression,PsiType> map = GuessManager.getInstance(context.getProject()).getControlFlowExpressionTypes(context, parameters.getParameters().getInvocationCount() > 1); if (map.isEmpty()) { return; } PsiScopesUtil.treeWalkUp(new PsiScopeProcessor() { @Override public boolean execute(@NotNull PsiElement element, @NotNull ResolveState state) { if (element instanceof PsiLocalVariable var) { if (!matcher.prefixMatches(var.getName())) { return true; } final PsiExpression expression = var.getInitializer(); if (expression instanceof PsiTypeCastExpression typeCastExpression) { final PsiExpression operand = typeCastExpression.getOperand(); if (operand != null && map.get(operand).contains(typeCastExpression.getType())) { map.remove(operand); } } } return true; } }, context, context.getContainingFile()); for (PsiExpression expression : map.keySet()) { for (PsiType castType : map.get(expression)) { PsiType baseType = expression.getType(); if (expectedType == null || (expectedType.isAssignableFrom(castType) && (baseType == null || !expectedType.isAssignableFrom(baseType)))) { consumer.consume(CastingLookupElementDecorator.createCastingElement(expressionToLookupElement(expression), castType)); } } } }