コード例 #1
0
 public override void CaseAStructFieldLvalue(AStructFieldLvalue node)
 {
     if (!IsConst) return;
     AALocalDecl decl = data.StructMethodFieldLinks[node];
     if (decl.GetConst() == null)
     {
         IsConst = false;
     }
 }
コード例 #2
0
 public virtual void CaseAStructFieldLvalue(AStructFieldLvalue node)
 {
     DefaultCase(node);
 }
コード例 #3
0
        public static PLvalue Link(AAName name, Node refNode, List<Node> list, SharedData data)
        {
            List<TIdentifier> identifierList = new List<TIdentifier>();
            {
                int count = name.GetIdentifier().Count;
                if (count < list.Count)
                {
                    for (int i = 0; i < list.Count - count; i++)
                    {
                        if (list[i] is AStructDecl)
                            identifierList.Add(((AStructDecl)list[i]).GetName());
                    }

                    for (int i = 0; i < count; i++)
                    {
                        TIdentifier iden = (TIdentifier)name.GetIdentifier()[i];
                        identifierList.Add(iden);
                    }
                }
                else
                    for (int i = count - list.Count; i < count; i++)
                    {
                        TIdentifier iden = (TIdentifier)name.GetIdentifier()[i];
                        identifierList.Add(iden);
                    }
            }
            PLvalue baseLvalue = null;
            Node node = list[0];
            list.RemoveAt(0);
            TIdentifier identifier = identifierList[0];
            identifierList.RemoveAt(0);
            if (node is AALocalDecl)
            {
                AALocalDecl aNode = (AALocalDecl)node;
                if (node.Parent() is AStructDecl)
                {//Struct local
                    //Make it this->var or this.var
                    AStructDecl pStruct = Util.GetAncestor<AStructDecl>(node);
                    if (pStruct.GetClassToken() != null || Util.HasAncestor<AConstructorDecl>(refNode) || Util.HasAncestor<ADeconstructorDecl>(refNode))
                    {//(*this).
                        baseLvalue = new AThisLvalue(new TThis("this"));
                        baseLvalue = new APointerLvalue(new TStar("*"), new ALvalueExp(baseLvalue));
                        baseLvalue = new AStructLvalue(new ALvalueExp(baseLvalue), new ADotDotType(new TDot(".")),
                                                       identifier);
                        data.StructFieldLinks[(AStructLvalue)baseLvalue] = aNode;
                    }
                    else
                    {//struct.
                        baseLvalue = new AStructFieldLvalue(identifier);
                        data.StructMethodFieldLinks[(AStructFieldLvalue)baseLvalue] = aNode;
                    }
                }
                else
                {//Method/constructor/deconstructor local
                    ALocalLvalue replaceNode = new ALocalLvalue(identifier);
                    data.LocalLinks[replaceNode] = aNode;
                    baseLvalue = replaceNode;
                }
            }
            else if (node is APropertyDecl)
            {
                APropertyDecl aNode = (APropertyDecl)node;
                if (Util.HasAncestor<AStructDecl>(node))
                {//Property in current struct
                    AStructDecl pStruct = Util.GetAncestor<AStructDecl>(node);
                    if (pStruct.GetClassToken() != null || Util.HasAncestor<AConstructorDecl>(refNode) || Util.HasAncestor<ADeconstructorDecl>(refNode))
                    {//(*this).
                        baseLvalue = new AThisLvalue(new TThis("this"));
                        baseLvalue = new APointerLvalue(new TStar("*"), new ALvalueExp(baseLvalue));
                        baseLvalue = new AStructLvalue(new ALvalueExp(baseLvalue), new ADotDotType(new TDot(".")),
                                                       identifier);
                        data.StructPropertyLinks[(AStructLvalue)baseLvalue] = aNode;
                    }
                    else
                    {//struct.
                        baseLvalue = new AStructFieldLvalue(identifier);
                        data.StructMethodPropertyLinks[(AStructFieldLvalue)baseLvalue] = aNode;
                    }
                }
                else
                {//Global property
                    baseLvalue = new APropertyLvalue(identifier);
                    data.PropertyLinks[(APropertyLvalue)baseLvalue] = aNode;
                }
            }
            else if (node is AFieldDecl)
            {
                baseLvalue = new AFieldLvalue(identifier);
                data.FieldLinks[(AFieldLvalue)baseLvalue] = (AFieldDecl)node;
            }
            else if (node is AStructDecl)
            {
                AStructDecl targetStruct = (AStructDecl)node;
                node = list[0];
                list.RemoveAt(0);
                identifier = identifierList[0];
                identifierList.RemoveAt(0);

                AStructFieldLvalue lvalue = new AStructFieldLvalue(identifier);
                if (node is AALocalDecl)
                    data.StructMethodFieldLinks[lvalue] = (AALocalDecl)node;
                else
                    data.StructMethodPropertyLinks[lvalue] = (APropertyDecl)node;

                baseLvalue = lvalue;
            }
            while (list.Count > 0)
            {
                node = list[0];
                list.RemoveAt(0);
                identifier = identifierList[0];
                identifierList.RemoveAt(0);

                baseLvalue = new AStructLvalue(new ALvalueExp(baseLvalue), new ADotDotType(new TDot(".")),
                                                identifier);
                if (node is AALocalDecl)
                {//Struct local
                    data.StructFieldLinks[(AStructLvalue) baseLvalue] = (AALocalDecl) node;
                }
                else if (node is APropertyDecl)
                {//Struct property
                    data.StructPropertyLinks[(AStructLvalue) baseLvalue] = (APropertyDecl) node;
                }
                //Don't link array length stuff
            }
            return baseLvalue;
        }
コード例 #4
0
        public override void OutAStructFieldLvalue(AStructFieldLvalue node)
        {
            if (data.StructMethodFieldLinks.ContainsKey(node))
            {
                AALocalDecl decl = data.StructMethodFieldLinks[node];
                if (data.Enums.ContainsKey((AStructDecl) decl.Parent()))
                {
                    AStructDecl str = (AStructDecl) decl.Parent();
                    ANamedType namedType = new ANamedType(new TIdentifier(str.GetName().Text), null);
                    data.StructTypeLinks[namedType] = str;
                    data.LvalueTypes[node] = namedType;
                }
                else
                    data.LvalueTypes[node] = decl.GetType();
                if (Util.IsStaticContext(node) && decl.GetStatic() == null)
                {
                    errors.Add(new ErrorCollection.Error(node.GetName(),
                                                         LocRM.GetString("ErrorText99"),
                                                         false,
                                                         new ErrorCollection.Error(decl.GetName(),
                                                                                   LocRM.GetString("ErrorText100"))));
                }
            }
            else
            {
                APropertyDecl decl = data.StructMethodPropertyLinks[node];
                data.LvalueTypes[node] = decl.GetType();
                CheckPropertyAccessibility(decl, node.Parent() is AAssignmentExp, node.GetName());
                if (Util.IsStaticContext(node) && decl.GetStatic() == null)
                {
                    errors.Add(new ErrorCollection.Error(node.GetName(),
                                                         LocRM.GetString("ErrorText101"),
                                                         false,
                                                         new ErrorCollection.Error(decl.GetName(),
                                                                                   LocRM.GetString("ErrorText62"))));
                }
            }

            //If the lvalue is a static variable, it's okay

            if (data.StructMethodFieldLinks[node].GetStatic() == null && Util.GetAncestor<AMethodDecl>(node) == null && Util.GetAncestor<APropertyDecl>(node) == null)
            {
                errors.Add(new ErrorCollection.Error(node.GetName(), currentSourceFile,
                    LocRM.GetString("ErrorText102")));
            }
        }
コード例 #5
0
 ArrayList New339()
 {
     ArrayList nodeList = new ArrayList();
     ArrayList nodeArrayList6 = (ArrayList) Pop();
     ArrayList nodeArrayList5 = (ArrayList) Pop();
     ArrayList nodeArrayList4 = (ArrayList) Pop();
     ArrayList nodeArrayList3 = (ArrayList) Pop();
     ArrayList nodeArrayList2 = (ArrayList) Pop();
     ArrayList nodeArrayList1 = (ArrayList) Pop();
     TLBracket tlbracketNode2 = (TLBracket)nodeArrayList4[0];
     TIdentifier tidentifierNode5 = (TIdentifier)nodeArrayList3[0];
     AStructFieldLvalue plvalueNode4 = new AStructFieldLvalue (
       tidentifierNode5
     );
     ALvalueExp pexpNode3 = new ALvalueExp (
       plvalueNode4
     );
     PExp pexpNode6 = (PExp)nodeArrayList5[0];
     AArrayLvalue plvalueNode1 = new AArrayLvalue (
       tlbracketNode2,
       pexpNode3,
       pexpNode6
     );
     nodeList.Add(plvalueNode1);
     return nodeList;
 }
コード例 #6
0
        public override void OutAStructFieldLvalue(AStructFieldLvalue node)
        {
            if (!data.StructMethodFieldLinks.ContainsKey(node) &&
                !data.StructMethodPropertyLinks.ContainsKey(node))
            {
                AStructDecl str = Util.GetAncestor<AStructDecl>(node);
                AConstructorDecl constructor = Util.GetAncestor<AConstructorDecl>(node);
                if (str.GetClassToken() != null || constructor != null || Util.HasAncestor<ADeconstructorDecl>(node))
                {
                    errors.Add(new ErrorCollection.Error(node.GetName(), currentSourceFile,
                                                         LocRM.GetString("ErrorText171")));
                }
                if (str != null)
                {
                    foreach (AALocalDecl localDecl in data.StructFields[str])
                    {
                        if (localDecl.GetName().Text == node.GetName().Text)
                        {
                            data.StructMethodFieldLinks.Add(node, localDecl);
                            return;
                        }
                    }
                    foreach (APropertyDecl property in data.StructProperties[str])
                    {
                        if (property.GetName().Text == node.GetName().Text)
                        {
                            data.StructMethodPropertyLinks.Add(node, property);
                            return;
                        }
                    }
                }
                errors.Add(
                    new ErrorCollection.Error(node.GetName(), currentSourceFile,
                                              node.GetName().Text + LocRM.GetString("ErrorText172"), false),
                    true);
            }
            //We can be sure this is linked. If in an array index, it must be constant.
            if (foldIntegerConstants)
            {
                if (data.StructMethodPropertyLinks.ContainsKey(node))
                {

                    errors.Add(
                        new ErrorCollection.Error(node.GetName(),
                                                  LocRM.GetString("ErrorText61"),
                                                  false,
                                                  new ErrorCollection.Error(
                                                      data.StructMethodPropertyLinks[node].GetName(),
                                                      LocRM.GetString("ErrorText62"))), true);
                    throw new ParserException(node.GetName(), "TypeLinking.OutAStructFieldLvalue");
                }
                AALocalDecl field = data.StructMethodFieldLinks[node];
                if (!(field.GetType() is ANamedType && ((ANamedType)field.GetType()).IsPrimitive("int")))
                {
                    errors.Add(
                        new ErrorCollection.Error(node.GetName(),
                                                  "Dimensions of array types must be integer expressions.",
                                                  false, new ErrorCollection.Error(field.GetName(), "Matching field")), true);
                    throw new ParserException(node.GetName(), "TypeLinking.OutAStructFieldLvalue");
                }

                if (field.GetConst() == null)
                {
                    foldingFailed = true;
                    if (!isInANewExp)
                    {
                        errors.Add(
                            new ErrorCollection.Error(node.GetName(), currentSourceFile,
                                                      LocRM.GetString("ErrorText61"),
                                                      false, new ErrorCollection.Error(field.GetName(), LocRM.GetString("ErrorText60"))), true);
                        throw new ParserException(node.GetName(), "TypeLinking.OutAFieldLvalue");
                    }
                }
                if (field.GetInit() == null)//An error will be given earlier - constant fields must have an initializer
                {
                    throw new ParserException(node.GetName(), "TypeLinking.OutAFieldLvalue");
                }
                field.GetInit().Apply(this);
            }
            //base.CaseAStructFieldLvalue(node);
        }
コード例 #7
0
 ArrayList New537()
 {
     ArrayList nodeList = new ArrayList();
     ArrayList nodeArrayList6 = (ArrayList) Pop();
     ArrayList nodeArrayList5 = (ArrayList) Pop();
     ArrayList nodeArrayList4 = (ArrayList) Pop();
     ArrayList nodeArrayList3 = (ArrayList) Pop();
     ArrayList nodeArrayList2 = (ArrayList) Pop();
     ArrayList nodeArrayList1 = (ArrayList) Pop();
     TypedList listNode3 = new TypedList();
     TypedList listNode7 = new TypedList();
     TypedList listNode9 = new TypedList();
     TypedList listNode11 = new TypedList();
     TConst tconstNode2 = (TConst)nodeArrayList1[0];
     TIdentifier tidentifierNode5 = (TIdentifier)nodeArrayList4[0];
     AStructFieldLvalue plvalueNode4 = new AStructFieldLvalue (
       tidentifierNode5
     );
     TypedList listNode8 = (TypedList)nodeArrayList5[0];
     if ( listNode8 != null )
     {
     listNode9.AddAll(listNode8);
     }
     TypedList listNode10 = (TypedList)nodeArrayList6[0];
     if ( listNode10 != null )
     {
     listNode11.AddAll(listNode10);
     }
     AShadySAssignmentExp pexpNode1 = new AShadySAssignmentExp (
       tconstNode2,
       listNode3,
       plvalueNode4,
       null,
       listNode7,
       listNode9,
       listNode11
     );
     nodeList.Add(pexpNode1);
     return nodeList;
 }
コード例 #8
0
 public virtual void OutAStructFieldLvalue(AStructFieldLvalue node)
 {
     DefaultOut(node);
 }
コード例 #9
0
 ArrayList New472()
 {
     ArrayList nodeList = new ArrayList();
     ArrayList nodeArrayList4 = (ArrayList) Pop();
     ArrayList nodeArrayList3 = (ArrayList) Pop();
     ArrayList nodeArrayList2 = (ArrayList) Pop();
     ArrayList nodeArrayList1 = (ArrayList) Pop();
     TIdentifier tidentifierNode3 = (TIdentifier)nodeArrayList4[0];
     AStructFieldLvalue plvalueNode2 = new AStructFieldLvalue (
       tidentifierNode3
     );
     TMinusMinus tminusminusNode5 = (TMinusMinus)nodeArrayList1[0];
     APreDecIncDecOp pincdecopNode4 = new APreDecIncDecOp (
       tminusminusNode5
     );
     AIncDecExp pexpNode1 = new AIncDecExp (
       plvalueNode2,
       pincdecopNode4
     );
     nodeList.Add(pexpNode1);
     return nodeList;
 }
コード例 #10
0
 ArrayList New511()
 {
     ArrayList nodeList = new ArrayList();
     ArrayList nodeArrayList5 = (ArrayList) Pop();
     ArrayList nodeArrayList4 = (ArrayList) Pop();
     ArrayList nodeArrayList3 = (ArrayList) Pop();
     ArrayList nodeArrayList2 = (ArrayList) Pop();
     ArrayList nodeArrayList1 = (ArrayList) Pop();
     TAssign tassignNode2 = (TAssign)nodeArrayList4[0];
     TIdentifier tidentifierNode4 = (TIdentifier)nodeArrayList3[0];
     AStructFieldLvalue plvalueNode3 = new AStructFieldLvalue (
       tidentifierNode4
     );
     PExp pexpNode5 = (PExp)nodeArrayList5[0];
     AAssignmentExp pexpNode1 = new AAssignmentExp (
       tassignNode2,
       plvalueNode3,
       pexpNode5
     );
     nodeList.Add(pexpNode1);
     return nodeList;
 }
コード例 #11
0
 ArrayList New437()
 {
     ArrayList nodeList = new ArrayList();
     ArrayList nodeArrayList4 = (ArrayList) Pop();
     ArrayList nodeArrayList3 = (ArrayList) Pop();
     ArrayList nodeArrayList2 = (ArrayList) Pop();
     ArrayList nodeArrayList1 = (ArrayList) Pop();
     TIdentifier tidentifierNode3 = (TIdentifier)nodeArrayList3[0];
     AStructFieldLvalue plvalueNode2 = new AStructFieldLvalue (
       tidentifierNode3
     );
     TPlusPlus tplusplusNode5 = (TPlusPlus)nodeArrayList4[0];
     APostIncIncDecOp pincdecopNode4 = new APostIncIncDecOp (
       tplusplusNode5
     );
     AIncDecExp pexpNode1 = new AIncDecExp (
       plvalueNode2,
       pincdecopNode4
     );
     nodeList.Add(pexpNode1);
     return nodeList;
 }
コード例 #12
0
 ArrayList New425()
 {
     ArrayList nodeList = new ArrayList();
     ArrayList nodeArrayList3 = (ArrayList) Pop();
     ArrayList nodeArrayList2 = (ArrayList) Pop();
     ArrayList nodeArrayList1 = (ArrayList) Pop();
     TIdentifier tidentifierNode3 = (TIdentifier)nodeArrayList3[0];
     AStructFieldLvalue plvalueNode2 = new AStructFieldLvalue (
       tidentifierNode3
     );
     ALvalueExp pexpNode1 = new ALvalueExp (
       plvalueNode2
     );
     nodeList.Add(pexpNode1);
     return nodeList;
 }
コード例 #13
0
 ArrayList New387()
 {
     ArrayList nodeList = new ArrayList();
     ArrayList nodeArrayList8 = (ArrayList) Pop();
     ArrayList nodeArrayList7 = (ArrayList) Pop();
     ArrayList nodeArrayList6 = (ArrayList) Pop();
     ArrayList nodeArrayList5 = (ArrayList) Pop();
     ArrayList nodeArrayList4 = (ArrayList) Pop();
     ArrayList nodeArrayList3 = (ArrayList) Pop();
     ArrayList nodeArrayList2 = (ArrayList) Pop();
     ArrayList nodeArrayList1 = (ArrayList) Pop();
     TypedList listNode9 = new TypedList();
     TIdentifier tidentifierNode4 = (TIdentifier)nodeArrayList3[0];
     AStructFieldLvalue plvalueNode3 = new AStructFieldLvalue (
       tidentifierNode4
     );
     ALvalueExp pexpNode2 = new ALvalueExp (
       plvalueNode3
     );
     TArrow tarrowNode6 = (TArrow)nodeArrayList4[0];
     AArrowDotType pdottypeNode5 = new AArrowDotType (
       tarrowNode6
     );
     TIdentifier tidentifierNode7 = (TIdentifier)nodeArrayList5[0];
     TypedList listNode8 = (TypedList)nodeArrayList7[0];
     if ( listNode8 != null )
     {
     listNode9.AddAll(listNode8);
     }
     ANonstaticInvokeExp pexpNode1 = new ANonstaticInvokeExp (
       pexpNode2,
       pdottypeNode5,
       tidentifierNode7,
       listNode9
     );
     nodeList.Add(pexpNode1);
     return nodeList;
 }
コード例 #14
0
 public override void CaseAStructFieldLvalue(AStructFieldLvalue node)
 {
     InAStructFieldLvalue(node);
     if (node.GetName() != null)
     {
         node.GetName().Apply(this);
     }
     OutAStructFieldLvalue(node);
 }
コード例 #15
0
 ArrayList New538()
 {
     ArrayList nodeList = new ArrayList();
     ArrayList nodeArrayList9 = (ArrayList) Pop();
     ArrayList nodeArrayList8 = (ArrayList) Pop();
     ArrayList nodeArrayList7 = (ArrayList) Pop();
     ArrayList nodeArrayList6 = (ArrayList) Pop();
     ArrayList nodeArrayList5 = (ArrayList) Pop();
     ArrayList nodeArrayList4 = (ArrayList) Pop();
     ArrayList nodeArrayList3 = (ArrayList) Pop();
     ArrayList nodeArrayList2 = (ArrayList) Pop();
     ArrayList nodeArrayList1 = (ArrayList) Pop();
     TypedList listNode3 = new TypedList();
     TypedList listNode8 = new TypedList();
     TypedList listNode10 = new TypedList();
     TypedList listNode12 = new TypedList();
     TConst tconstNode2 = (TConst)nodeArrayList1[0];
     TIdentifier tidentifierNode5 = (TIdentifier)nodeArrayList4[0];
     AStructFieldLvalue plvalueNode4 = new AStructFieldLvalue (
       tidentifierNode5
     );
     TLt tltNode6 = (TLt)nodeArrayList5[0];
     TypedList listNode7 = (TypedList)nodeArrayList6[0];
     if ( listNode7 != null )
     {
     listNode8.AddAll(listNode7);
     }
     TypedList listNode9 = (TypedList)nodeArrayList8[0];
     if ( listNode9 != null )
     {
     listNode10.AddAll(listNode9);
     }
     TypedList listNode11 = (TypedList)nodeArrayList9[0];
     if ( listNode11 != null )
     {
     listNode12.AddAll(listNode11);
     }
     AShadySAssignmentExp pexpNode1 = new AShadySAssignmentExp (
       tconstNode2,
       listNode3,
       plvalueNode4,
       tltNode6,
       listNode8,
       listNode10,
       listNode12
     );
     nodeList.Add(pexpNode1);
     return nodeList;
 }
コード例 #16
0
 public virtual void InAStructFieldLvalue(AStructFieldLvalue node)
 {
     DefaultIn(node);
 }
コード例 #17
0
 ArrayList New586()
 {
     ArrayList nodeList = new ArrayList();
     ArrayList nodeArrayList5 = (ArrayList) Pop();
     ArrayList nodeArrayList4 = (ArrayList) Pop();
     ArrayList nodeArrayList3 = (ArrayList) Pop();
     ArrayList nodeArrayList2 = (ArrayList) Pop();
     ArrayList nodeArrayList1 = (ArrayList) Pop();
     TIdentifier tidentifierNode4 = (TIdentifier)nodeArrayList3[0];
     AStructFieldLvalue plvalueNode3 = new AStructFieldLvalue (
       tidentifierNode4
     );
     ALvalueExp pexpNode2 = new ALvalueExp (
       plvalueNode3
     );
     TArrow tarrowNode6 = (TArrow)nodeArrayList4[0];
     AArrowDotType pdottypeNode5 = new AArrowDotType (
       tarrowNode6
     );
     TIdentifier tidentifierNode7 = (TIdentifier)nodeArrayList5[0];
     AStructLvalue plvalueNode1 = new AStructLvalue (
       pexpNode2,
       pdottypeNode5,
       tidentifierNode7
     );
     nodeList.Add(plvalueNode1);
     return nodeList;
 }
コード例 #18
0
        public override void OutAStructFieldLvalue(AStructFieldLvalue node)
        {
            if (folding)
            {
                if (data.StructMethodPropertyLinks.ContainsKey(node))
                {

                    errors.Add(
                        new ErrorCollection.Error(node.GetName(),
                                                  LocRM.GetString("ErrorText61"),
                                                  false,
                                                  new ErrorCollection.Error(
                                                      data.StructMethodPropertyLinks[node].GetName(),
                                                      LocRM.GetString("ErrorText62"))), true);
                    throw new ParserException(node.GetName(), "TypeLinking.OutAStructFieldLvalue");
                }
                AALocalDecl field = data.StructMethodFieldLinks[node];
                if (!(field.GetType() is ANamedType && ((ANamedType)field.GetType()).IsPrimitive("int")))
                {
                    errors.Add(
                        new ErrorCollection.Error(node.GetName(),
                                                  LocRM.GetString("ErrorText59"),
                                                  false, new ErrorCollection.Error(field.GetName(), LocRM.GetString("ErrorText60"))), true);
                    throw new ParserException(node.GetName(), "TypeLinking.OutAStructFieldLvalue");
                }

                if (field.GetConst() == null)
                {
                    if (!isANewExp)
                    {
                        errors.Add(
                            new ErrorCollection.Error(node.GetName(),
                                                      LocRM.GetString("ErrorText62"),
                                                      false, new ErrorCollection.Error(field.GetName(), LocRM.GetString("ErrorText60"))), true);
                        throw new ParserException(node.GetName(), "TypeLinking.OutAFieldLvalue");
                    }
                }
                if (field.GetInit() == null)//An error will be given earlier - constant fields must have an initializer
                {
                    throw new ParserException(node.GetName(), "TypeLinking.OutAFieldLvalue");
                }
                field.GetInit().Apply(this);
            }
        }
コード例 #19
0
 public override void CaseAStructFieldLvalue(AStructFieldLvalue node)
 {
     //replace strField1
     //with <structFormal>.strField1
     AStructDecl str = finalTrans.data.StructTypeLinks[(ANamedType)structFormal.GetType()];
     ALocalLvalue parameterRefference = new ALocalLvalue(new TIdentifier("tempName"));
     finalTrans.data.LocalLinks[parameterRefference] = structFormal;
     finalTrans.data.LvalueTypes[parameterRefference] = structFormal.GetType();
     ALvalueExp exp = new ALvalueExp(parameterRefference);
     finalTrans.data.ExpTypes[exp] = structFormal.GetType();
     AStructLvalue replacer = new AStructLvalue(exp, new ADotDotType(new TDot(".")), node.GetName());
     foreach (AALocalDecl structField in finalTrans.data.StructFields[str])
     {
         if (structField.GetName().Text == replacer.GetName().Text)
         {
             finalTrans.data.StructFieldLinks[replacer] = structField;
             finalTrans.data.LvalueTypes[replacer] = structField.GetType();
             break;
         }
     }
     foreach (APropertyDecl property in finalTrans.data.StructProperties[str])
     {
         if (property.GetName().Text == replacer.GetName().Text)
         {
             finalTrans.data.StructPropertyLinks[replacer] = property;
             finalTrans.data.LvalueTypes[replacer] = property.GetType();
             break;
         }
     }
     node.ReplaceBy(replacer);
 }