override fun addCompletions()

in src/main/kotlin/com/pestphp/pest/completion/PestCustomExtensionCompletionProvider.kt [29:57]


    override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext, result: CompletionResultSet) {
        val memberReference = parameters.position.originalElement.parent as? MemberReference ?: return
        val project = parameters.position.project
        if (PhpType.intersectsGlobal(project, expectationType, memberReference.classReference?.globalType ?: PhpType.EMPTY)) {
            val index = FileBasedIndex.getInstance()
            index.getAllKeys(KEY, project).forEach { extensionName ->
                index.processValues(KEY, extensionName, null, { file, value ->
                    memberReference.manager.findFile(file)?.let { psiFile ->
                        val cheapRenderer = CustomExpectationRenderer()
                        val lookupElement = LookupElementBuilder.create(extensionName)
                            .withRenderer(cheapRenderer)
                            .withExpensiveRenderer(CustomExtensionExpensiveRenderer(cheapRenderer, psiFile, value.first()))
                            .withInsertHandler { context, _ ->
                                val expectation = psiFile.findElementAt(value.first())
                                val methodDescriptor =
                                    PhpPsiUtil.getParentOfClass(expectation, MethodReference::class.java)?.toMethod()
                                PhpInsertHandlerUtil.insertStringAtCaret(context.editor, "()")
                                if (methodDescriptor?.parameters?.isNotEmpty() == true) {
                                    PhpCompletionUtil.moveCaretRelativelyWithScroll(context.editor, -1)
                                    AutoPopupController.getInstance(project).autoPopupParameterInfo(context.editor, null)
                                }
                            }
                        result.addElement(lookupElement)
                    }
                    true
                }, GlobalSearchScope.projectScope(project))
            }
        }
    }