override fun buildVisitor()

in src/main/kotlin/com/netflix/dgs/plugin/hints/DgsInputArgumentInspector.kt [38:87]


    override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {

        return UastVisitorAdapter(object : AbstractUastNonRecursiveVisitor() {

            override fun visitMethod(node: UMethod): Boolean {

                if (InputArgumentUtils.hasDgsAnnotation(node) ) {
                        val dgsDataAnnotation = InputArgumentUtils.getDgsAnnotation(node)
                        val dgsService = dgsDataAnnotation.project.getService(DgsService::class.java)
                        val typeDefinitionRegistry = GraphQLSchemaProvider.getInstance(dgsDataAnnotation.project).getSchemaInfo(node.javaPsi).registry

                    val dgsDataFetcher = dgsService.dgsComponentIndex.dataFetchers.find { it.psiAnnotation.toUElement() == dgsDataAnnotation.toUElement() }
                        if (dgsDataFetcher?.schemaPsi != null) {
                            val isJavaFile = dgsDataFetcher.psiFile is PsiJavaFile
                            val arguments = (dgsDataFetcher.schemaPsi as? GraphQLFieldDefinitionImpl)?.argumentsDefinition?.inputValueDefinitionList
                            if (arguments != null && arguments.size > 0 && !node.uastParameters.any { it.hasAnnotation(InputArgumentUtils.DGS_INPUT_ARGUMENT_ANNOTATION) }) {
                                val inputArgumentsHint: String = InputArgumentUtils.getHintForInputArgument(arguments[0], typeDefinitionRegistry,  isJavaFile)
                                val inputArgumentsList = mutableListOf<String>()
                                arguments.forEach {
                                    // do not add a hint for custom scalar types
                                    if (! InputArgumentUtils.isCustomScalarType(it.type!!, typeDefinitionRegistry)) {
                                        val parameter = InputArgumentUtils.getHintForInputArgument(it, typeDefinitionRegistry, isJavaFile)
                                        inputArgumentsList.add(parameter)
                                    }
                                }

                                val message = MyBundle.getMessage(
                                    "dgs.inspection.dgsinputargument.hint",
                                    inputArgumentsHint
                                )
                                when(val element = node.toUElement()){
                                    is UMethod -> {
                                        val pointer = SmartPointerManager.createPointer(element)
                                        node.identifyingElement?.let {
                                            holder.registerProblem(
                                                it.navigationElement,
                                                message,
                                                ProblemHighlightType.WEAK_WARNING,
                                                DgsInputArgumentQuickFix(pointer, inputArgumentsList, message)
                                            )
                                        }
                                    }
                                }
                            }
                        }
                    }
                return super.visitMethod(node)
            }
        }, false)
    }