public void Visit(LabelCodeLine line)
 {
     if (line.Head[0] != '_')
     {
         current_function = line.Label;
         size             = Preprocessor.GetFunctionVarsSize(current_function);
     }
     MIPSCode.Add($"\n");
     MIPSCode.Add($"{line.Label}:");
     MIPSCode.Add($"li $t9, 0");
 }
        public void Visit(ClassNode node)
        {
            // Handle Inheritance
            string @class = VariableManager.CurrentClass = node.type.Text;

            Code.Add(new InherCodeLine(node.type.Text, Scope.GetType(node.type.Text).Parent.Text));

            int self = VariableManager.VariableCounter = 0;

            VariableManager.IncrementVariableCounter();
            VariableManager.PushVariableCounter();

            // Handle Methods and Properties
            List <PropertyNode> properties = new List <PropertyNode>();
            List <MethodNode>   methods    = new List <MethodNode>();

            foreach (var feature in node.features)
            {
                if (feature is PropertyNode)
                {
                    properties.Add(feature as PropertyNode);
                }
                else
                {
                    methods.Add(feature as MethodNode);
                }
            }

            foreach (var method in methods)
            {
                method.Accept(this);
            }

            //Begin constructor function
            Code.Add(new LabelCodeLine(VariableManager.CurrentClass, "constructor"));
            Code.Add(new ParamCodeLine(self));

            //Call first the parent constructor function
            if (VariableManager.CurrentClass != "Object")
            {
                Code.Add(new PushParamCodeLine(self));
                LabelCodeLine label = new LabelCodeLine(node.Inherit.Text, "constructor");
                Code.Add(new CallLblCodeLine(label));
                Code.Add(new PopParamCodeLine(1));
            }

            foreach (var method in methods)
            {
                (string ClassName, string MethodName)label = ClassManager.GetDefinition(node.type.Text, method.id.text);
                Code.Add(new AssignLblToMemCodeLine(self, new LabelCodeLine(label.ClassName, label.MethodName), ClassManager.GetOffset(node.type.Text, method.id.text)));
            }

            foreach (var property in properties)
            {
                VariableManager.PushVariableCounter();
                property.Accept(this);
                VariableManager.PopVariableCounter();
                Code.Add(new CommentCodeLine("set attribute: " + property.formal.id.text));
                Code.Add(new AssignVarToMemCodeLine(self, VariableManager.PeekVariableCounter(), ClassManager.GetOffset(node.type.Text, property.formal.id.text)));
            }

            Code.Add(new CommentCodeLine("set class name: " + node.type.Text));
            Code.Add(new AssignStrToMemCodeLine(0, node.type.Text, 0));
            Code.Add(new CommentCodeLine("set class size: " + ClassManager.GetClassSize(node.type.Text) + " words"));
            Code.Add(new AssignConstToMemCodeLine(0, ClassManager.GetClassSize(node.type.Text), 1));
            Code.Add(new CommentCodeLine("set class generation label"));
            Code.Add(new AssignLblToMemCodeLine(0, new LabelCodeLine("_class", node.type.Text), 2));
            Code.Add(new ReturnCodeLine(-1));

            VariableManager.PopVariableCounter();
        }