void (ChainContext context, ChainVariable var, int index) { super.preprocessVariable(context, var, index); boolean hasClassOrLambda = StreamEx.ofTree(myBody, e -> StreamEx.of(e.getChildren())).anyMatch(e -> e instanceof PsiLambdaExpression || e instanceof PsiClass); if (hasClassOrLambda) { PsiLambdaExpression lambda = (PsiLambdaExpression)context.createExpression(getParameterName(index) + "->" + myBody.getText()); PsiParameter parameter = lambda.getParameterList().getParameters()[0]; PsiElement body = lambda.getBody(); LOG.assertTrue(body != null); boolean mayBeNotFinal = ReferencesSearch.search(parameter, new LocalSearchScope(body)) .allMatch(e -> PsiTreeUtil.getParentOfType(e.getElement(), PsiLambdaExpression.class, PsiClass.class) == lambda); if (!mayBeNotFinal) { var.markFinal(); } } }