boolean (PsiFile file, int startOffset) { PsiJavaCodeReferenceElement ref = PsiTreeUtil.findElementOfClassAtOffset(file, startOffset, PsiJavaCodeReferenceElement.class, false); if (ref != null && !(ref instanceof PsiReferenceExpression)) { if (ref.getParent() instanceof PsiTypeElement) { return true; } } PsiElement at = file.findElementAt(startOffset); if (psiElement(PsiIdentifier.class).withParent(psiParameter()).accepts(at)) { return true; } if (PsiUtilCore.getElementType(at) == JavaTokenType.IDENTIFIER) { at = PsiTreeUtil.nextLeaf(at); } at = skipWhitespacesAndComments(at); if (PsiUtilCore.getElementType(at) == JavaTokenType.LPARENTH && PsiTreeUtil.getParentOfType(ref, PsiExpression.class, PsiClass.class) == null && PsiTreeUtil.getParentOfType(at, PsiUnnamedClass.class) == null) { // TODO check before it that there is record // looks like a method declaration, e.g. StringBui<caret>methodName() inside a class return true; } if (PsiUtilCore.getElementType(at) == JavaTokenType.COLON && PsiTreeUtil.findElementOfClassAtOffset(file, startOffset, PsiConditionalExpression.class, false) == null) { return true; } at = skipWhitespacesAndComments(at); if (PsiUtilCore.getElementType(at) != JavaTokenType.IDENTIFIER) { return false; } at = PsiTreeUtil.nextLeaf(at); at = skipWhitespacesAndComments(at); // <caret> foo = something, we don't want the reference to be treated as a type return at != null && at.getNode().getElementType() == JavaTokenType.EQ; }