private IEnumerable <AstVariableDecl> SplitVariableDeclaration(AstVariableDecl v) { v.Pattern.SetFlag(ExprFlags.IsDeclarationPattern, true); switch (v.Pattern) { case AstCompCallExpr cc when cc.Name.Name == "id": cc.AttachTo(v); v.Name = InferType(cc, null) as AstIdExpr; break; case AstIdExpr name: // ok, do nothing v.Name = name; break; case AstTupleExpr t: { v.Name = new AstIdExpr(GetUniqueName(t.ToString()), false, t); v.Pattern = v.Name; //var initClone = v.Initializer.Clone(); //initClone.AttachTo(v); //initClone.SetFlag(ExprFlags.ValueRequired, true); //initClone = InferType(initClone, null); //AstVariableDecl CreateSub(int index, string name) //{ // var init = mCompiler.ParseExpression( // $"@{name}(§init)", // new Dictionary<string, AstExpression> // { // { "init", new AstVariableRef(v, v.Initializer) } // }); // var sub = new AstVariableDecl(t.Values[index], null, init, Location: v); // sub.Scope = v.Scope; // sub.SetFlags(v.GetFlags()); // return sub; //} //if (initClone.Type is PointerType pt1 && pt1.TargetType is AnyType) //{ // // create new declarations for sub patterns // yield return CreateSub(0, "ptr_of_any"); // yield return CreateSub(1, "type_info_of_any"); // break; //} //else if (initClone.Type is PointerType pt2 && pt2.TargetType is TraitType) //{ // // create new declarations for sub patterns // yield return CreateSub(0, "ptr_of_trait"); // yield return CreateSub(1, "vtable_of_trait"); // break; //} //else //{ // create new declarations for sub patterns var index = 0; foreach (var subPattern in t.Values) { var init = new AstArrayAccessExpr( new AstVariableRef(v, v.Initializer), new AstNumberExpr(NumberData.FromBigInt(index), Location: v.Initializer)); var sub = new AstVariableDecl(subPattern, null, init, v.Mutable, v.Documentation, Location: v); sub.Scope = v.Scope; sub.SetFlags(v.GetFlags()); yield return(sub); index += 1; } break; //} } default: ReportError(v.Pattern, $"Invalid pattern in variable declaration"); break; } }