void (HashSet<? super PsiType> typesSet, PsiVariable var, PsiFile scopeFile, HashSet<? super PsiVariable> checkedVariables, int flags, TextRange rangeToIgnore) { if (!checkedVariables.add(var)) return; //System.out.println("analyzing usages of " + var + " in file " + scopeFile); SearchScope searchScope = new LocalSearchScope(scopeFile); if (BitUtil.isSet(flags, CHECK_USAGE) || BitUtil.isSet(flags, CHECK_DOWN)) { for (PsiReference varRef : ReferencesSearch.search(var, searchScope, false)) { PsiElement ref = varRef.getElement(); if (BitUtil.isSet(flags, CHECK_USAGE)) { PsiType type = guessElementTypeFromReference(myMethodPatternMap, ref, rangeToIgnore); if (type != null && !(type instanceof PsiPrimitiveType)) { typesSet.add(type); } } if (BitUtil.isSet(flags, CHECK_DOWN)) { if (ref.getParent() instanceof PsiExpressionList list && ref.getParent().getParent() instanceof PsiMethodCallExpression) { //TODO : new int argIndex = ArrayUtil.indexOf(list.getExpressions(), ref); PsiMethodCallExpression methodCall = (PsiMethodCallExpression)list.getParent(); PsiMethod method = (PsiMethod)methodCall.getMethodExpression().resolve(); if (method != null) { PsiParameter[] parameters = method.getParameterList().getParameters(); if (argIndex < parameters.length) { addTypesByVariable(typesSet, parameters[argIndex], method.getContainingFile(), checkedVariables, flags | CHECK_USAGE, rangeToIgnore); } } } } } } if (BitUtil.isSet(flags, CHECK_UP)){ if (var instanceof PsiParameter && var.getParent() instanceof PsiParameterList list && var.getParent().getParent() instanceof PsiMethod method){ PsiParameter[] parameters = list.getParameters(); int argIndex = ArrayUtil.indexOf(parameters, var); for (PsiReference methodRef : ReferencesSearch.search(method, searchScope, false)) { if (methodRef.getElement().getParent() instanceof PsiMethodCallExpression methodCall) { PsiExpression[] args = methodCall.getArgumentList().getExpressions(); if (args.length <= argIndex) continue; PsiExpression arg = args[argIndex]; if (arg instanceof PsiReferenceExpression ref && ref.resolve() instanceof PsiVariable variable) { addTypesByVariable(typesSet, variable, scopeFile, checkedVariables, flags | CHECK_USAGE, rangeToIgnore); } //TODO : constructor } } } } }