boolean (CompletionParameters parameters, CompletionResultSet result, PsiElement position) { PsiElement parent = position.getParent(); if (!(parent instanceof PsiJavaCodeReferenceElement) || PsiTreeUtil.getParentOfType(parent, PsiImportStatementBase.class) != null) { return false; } PsiElement qualifier = ((PsiJavaCodeReferenceElement)parent).getQualifier(); if (!(qualifier instanceof PsiJavaCodeReferenceElement) || ((PsiJavaCodeReferenceElement)qualifier).isQualified()) { return false; } PsiElement target = ((PsiJavaCodeReferenceElement)qualifier).resolve(); if (target != null && !(target instanceof PsiPackage)) { return false; } PsiFile file = position.getContainingFile(); if (file instanceof PsiJavaCodeReferenceCodeFragment) { return false; } String fullPrefix = parent.getText().substring(0, parameters.getOffset() - parent.getTextRange().getStartOffset()); CompletionResultSet qualifiedCollector = result.withPrefixMatcher(fullPrefix); ElementFilter filter = JavaCompletionContributor.getReferenceFilter(position); JavaLookupElementHighlighter highlighter = JavaCompletionUtil.getHighlighterForPlace(position); boolean added = false; for (LookupElement base : suggestQualifierItems(parameters, (PsiJavaCodeReferenceElement)qualifier, filter)) { PsiType type = JavaCompletionUtil.getLookupElementType(base); if (type != null && !PsiTypes.voidType().equals(type)) { String separator = parent instanceof PsiMethodReferenceExpression ? "::" : "."; PsiReferenceExpression ref = ReferenceExpressionCompletionContributor.createMockReference(position, type, base, separator); if (ref != null) { for (LookupElement item : JavaSmartCompletionContributor.completeReference(position, ref, filter, true, true, parameters, result.getPrefixMatcher())) { if (!JavaChainLookupElement.isReasonableChain(base, item)) continue; JavaChainLookupElement chainedElement = new JavaChainLookupElement(base, item, separator); LookupElement chain = highlighter.highlightIfNeeded(null, chainedElement, item.getObject()); if (JavaCompletionContributor.shouldInsertSemicolon(position)) { chain = TailTypeDecorator.withTail(chain, TailTypes.semicolonType()); } qualifiedCollector.addElement(chain); added = true; } } } } return added; }