void (@NotNull PyElement node) { if (parameterWasReassigned.get()) return; if (node instanceof ScopeOwner && node != owner) { return; } if (node instanceof PyQualifiedExpression expr) { final PyExpression qualifier = expr.getQualifier(); if (qualifier != null) { final String attributeName = expr.getReferencedName(); final PyExpression referencedExpr = node instanceof PyBinaryExpression && PyNames.isRightOperatorName(attributeName) ? ((PyBinaryExpression)node).getRightExpression() : qualifier; if (attributeName != null && isReferenceToParameter(referencedExpr)) { usedAttributes.add(attributeName); } } else if (isReferenceToParameter(expr)) { StreamEx.of(getParametersByCallArgument(expr, context)) .nonNull() .map(parameter -> parameter.getType(context)) .select(PyStructuralType.class) .forEach(type -> usedAttributes.addAll(type.getAttributeNames())); } } super.visitPyElement(node); }