Beispiel #1
0
        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;
            }
        }