/// <summary> /// Bind a name to this scope, including destructuring assignment. /// </summary> public void Bind(Analyzer analyzer, Exp target, DataType rvalue, BindingKind kind) { if (target is Identifier) { this.Bind(analyzer, (Identifier)target, rvalue, kind); } else if (target is PyTuple) { this.Bind(analyzer, ((PyTuple)target).values, rvalue, kind); } else if (target is PyList) { this.Bind(analyzer, ((PyList)target).elts, rvalue, kind); } else if (target is AttributeAccess) { var attr = (AttributeAccess)target; DataType targetType = transformExpr(analyzer, attr.Expression, this); setAttr(analyzer, attr, rvalue, targetType); } else if (target is ArrayRef) { ArrayRef sub = (ArrayRef)target; DataType valueType = transformExpr(analyzer, sub.array, this); var xform = new TypeTransformer(this, analyzer); transformExprs(analyzer, sub.subs, this); if (valueType is ListType) { ListType t = (ListType)valueType; t.setElementType(UnionType.Union(t.eltType, rvalue)); } } else if (target != null) { analyzer.putProblem(target, "invalid location for assignment"); } }