public static int findFieldAssignmentAnchor( final PsiStatement[] statements, final @Nullable Ref<Pair<PsiField, Boolean>> anchorRef, final PsiClass targetClass, final PsiParameter myParameter) { int i = 0; for (; i < statements.length; i++) { PsiStatement psiStatement = statements[i]; if (psiStatement instanceof PsiExpressionStatement) { PsiExpressionStatement expressionStatement = (PsiExpressionStatement) psiStatement; PsiExpression expression = expressionStatement.getExpression(); if (expression instanceof PsiMethodCallExpression) { PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression) expression; String text = methodCallExpression.getMethodExpression().getText(); if (text.equals("super") || text.equals("this")) { continue; } } else if (expression instanceof PsiAssignmentExpression) { PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression) expression; PsiExpression lExpression = assignmentExpression.getLExpression(); PsiExpression rExpression = assignmentExpression.getRExpression(); if (!(lExpression instanceof PsiReferenceExpression)) break; if (!(rExpression instanceof PsiReferenceExpression)) break; PsiReferenceExpression lReference = (PsiReferenceExpression) lExpression; PsiReferenceExpression rReference = (PsiReferenceExpression) rExpression; PsiElement lElement = lReference.resolve(); PsiElement rElement = rReference.resolve(); if (!(lElement instanceof PsiField) || ((PsiField) lElement).getContainingClass() != targetClass) break; if (!(rElement instanceof PsiParameter)) break; if (myParameter.getTextRange().getStartOffset() < rElement.getTextRange().getStartOffset()) { if (anchorRef != null) { anchorRef.set(Pair.create((PsiField) lElement, Boolean.TRUE)); } break; } if (anchorRef != null) { anchorRef.set(Pair.create((PsiField) lElement, Boolean.FALSE)); } continue; } } break; } return i; }
@Nullable public static PsiParameter findParameterAtCursor(@NotNull PsiFile file, @NotNull Editor editor) { final int offset = editor.getCaretModel().getOffset(); final PsiParameterList parameterList = PsiTreeUtil.findElementOfClassAtOffset(file, offset, PsiParameterList.class, false); if (parameterList == null) return null; final PsiParameter[] parameters = parameterList.getParameters(); for (PsiParameter parameter : parameters) { final TextRange range = parameter.getTextRange(); if (range.getStartOffset() <= offset && offset <= range.getEndOffset()) return parameter; } return null; }