void (CompletionParameters parameters, CompletionResultSet result) { PsiElement position = parameters.getPosition(); PsiElement parent = position.getParent(); if (!(parent instanceof GrReferenceElement)) { return; } PsiElement qualifier = ((GrReferenceElement<?>)parent).getQualifier(); if (!(qualifier instanceof GrReferenceElement) || ((GrReferenceElement<?>)qualifier).getQualifier() != null) { return; } PsiElement target = ((GrReferenceElement<?>)qualifier).resolve(); if (target != null && !(target instanceof PsiPackage)) { return; } String fullPrefix = position.getContainingFile().getText().substring(parent.getTextRange().getStartOffset(), parameters.getOffset()); final CompletionResultSet qualifiedCollector = result.withPrefixMatcher(fullPrefix); JavaCompletionSession session = new JavaCompletionSession(result); for (final LookupElement base : suggestQualifierItems(parameters, (GrReferenceElement<?>)qualifier, session)) { final PsiType type = getPsiType(base.getObject()); if (type != null && !PsiTypes.voidType().equals(type)) { GrReferenceElement<?> ref = createMockReference(position, type, base); PsiElement refName = ref == null ? null : ref.getReferenceNameElement(); if (refName == null) continue; CompletionParameters newParams = parameters.withPosition(refName, refName.getTextRange().getStartOffset()); GrMainCompletionProvider.completeReference(newParams, ref, session, result.getPrefixMatcher(), result, element -> qualifiedCollector.addElement(new JavaChainLookupElement(base, element) { @Override protected boolean shouldParenthesizeQualifier(PsiFile file, int startOffset, int endOffset) { return false; } })); } } }