void (@NotNull GrTupleAssignmentExpression expression) { super.visitTupleAssignmentExpression(expression); // visitExpression GrExpression initializer = expression.getRValue(); if (initializer == null) return; GrTuple tupleExpression = expression.getLValue(); GrExpression[] lValues = tupleExpression.getExpressions(); if (initializer instanceof GrListOrMap) { GrExpression[] initializers = ((GrListOrMap)initializer).getInitializers(); for (int i = 0; i < lValues.length; i++) { GrExpression lValue = lValues[i]; if (initializers.length <= i) break; GrExpression rValue = initializers[i]; processAssignmentWithinMultipleAssignment(lValue.getType(), rValue.getType(), rValue); } } else { MultiAssignmentTypes multiAssignmentTypes = getMultiAssignmentTypes(initializer); if (multiAssignmentTypes == null) { return; } for (int position = 0; position < lValues.length; position++) { PsiType rType = multiAssignmentTypes.getComponentType(position); GrExpression lValue = lValues[position]; // For assignments with spread dot if (PsiImplUtil.isSpreadAssignment(lValue)) { if (rType != null) { PsiType lType = lValue.getNominalType(); final PsiType argType = extractIterableTypeParameter(lType, false); if (argType != null) { processAssignment(argType, rType, tupleExpression, getExpressionPartToHighlight(lValue)); } } return; } if (lValue instanceof GrReferenceExpression && ((GrReferenceExpression)lValue).resolve() instanceof GrReferenceExpression) { //lvalue is not-declared variable return; } if (rType != null) { PsiType lType = lValue.getNominalType(); if (lType != null) { processAssignment(lType, rType, tupleExpression, getExpressionPartToHighlight(lValue)); } } } } }