public override string GetExpressionType(CompilationModel model)
        {
            var fullName = string.Format("{0}:{1}", Method, String.Join(":", Parameters.Select(e => e.GetExpressionType(model))));

            if (Expression != null)
            {
                return model.GetClass(Expression.GetExpressionType(model)).GetMethod(fullName).Type;
            }

            return model.GetClass(FindParent<Class>().Name).GetMethod(fullName).Type;
        }
 public override List<InstructionModel> GetInstructions(CompilationModel model)
 {
     var instructions = new List<InstructionModel>();
     var index = model.GetClass(Expression.GetExpressionType(model)).GetFieldIndex(Property).ToString(CultureInfo.InvariantCulture);
     instructions.AddRange(Expression.GetInstructions(model));
     instructions.Add(new InstructionModel(Instructions.SetFieldInstruction, index) { Comment = model.GetComment(this) + " - setting field on expression" });
     return instructions;
 }
 public override List<InstructionModel> GetInstructions(CompilationModel model)
 {
     var method = FindParent<Method>();
     var @class = (Class)method.Parent;
     var classModel = model.GetClass(@class.Name);
     var index = classModel.GetFieldIndex(Property).ToString(CultureInfo.InvariantCulture);
     var instructions = new List<InstructionModel>();
     instructions.Add(new InstructionModel(Instructions.LoadPointerInstruction, "0") { Comment = model.GetComment(this) + " - setting field" });
     instructions.Add(new InstructionModel(Instructions.SetFieldInstruction, index) { Comment = model.GetComment(this) + " - setting field" });
     return instructions;
 }
 public override string GetExpressionType(CompilationModel model)
 {
     var method = FindParent<Method>();
     var @class = (Class)method.Parent;
     var methodModel = model.GetClass(@class.Name).GetMethod(method.FullName);
     try
     {
         return methodModel.GetVariableType(Variable);
     }
     catch (Exception)
     {
         return Variable; // in this case it's static call
     }
 }
        public override List<InstructionModel> GetInstructions(CompilationModel model)
        {
            var method = FindParent<Method>();
            var @class = (Class) method.Parent;

            var methodModel = model.GetClass(@class.Name).GetMethod(method.FullName);
            var index = methodModel.GetVariableIndex(Variable).ToString(CultureInfo.InvariantCulture);
            var type = methodModel.GetVariableType(Variable);

            var instructions = new List<InstructionModel>();
            instructions.AddRange(Expression.GetInstructions(model)); // get instructions of expression
            instructions.Add(new InstructionModel(type == BuiltinTypes.Integer ? // store result into local variable
                                                      Instructions.StoreIntInstruction :
                                                      Instructions.StorePointerInstruction, index));

            instructions.Latest().Comment = model.GetComment(this);

            return instructions;
        }
        public override List<InstructionModel> GetInstructions(CompilationModel model)
        {
            var instructions = new List<InstructionModel>();
            var method = FindParent<Method>();
            var @classs = (Class) method.Parent;
            var methodModel = model.GetClass(@classs.Name).GetMethod(method.FullName);
            var type = methodModel.GetVariableType(Variable);
            var index = methodModel.GetVariableIndex(Variable).ToString(CultureInfo.InvariantCulture);

            if (type == BuiltinTypes.Integer)
            {
                instructions.Add(new InstructionModel(Instructions.LoadIntInstruction, index));
            }
            else
            {
                instructions.Add(new InstructionModel(Instructions.LoadPointerInstruction, index));
            }

            instructions.Latest().Comment = model.GetComment(this);

            return instructions;
        }
 public override string GetExpressionType(CompilationModel model)
 {
     var @class = model.GetClass(Expression.GetExpressionType(model));
     return @class.GetFieldType(Property);
 }
        private ClassModel GetCorrectParent(CompilationModel model)
        {
            var className = FindParent<Class>().Name;
            var classModel = model.GetClass(className);

            if (ParentClass == "parent")
            {
                return classModel.ParentClassModel;
            }

            if (ParentClass != "this" && ParentClass != className)
            {
                var parents = new List<ClassModel>(); // add this

                while (classModel.Name != "Any")
                {
                    classModel = classModel.ParentClassModel;
                    parents.Add(classModel);
                }

                classModel = parents.SingleOrDefault(c => c.Name == ParentClass);

                if (classModel == null)
                {
                    throw new Exception(string.Format("Class with name {0} does not inherit from {1}!", className, ParentClass));
                }
            }

            return classModel;
        }
        public override List<InstructionModel> GetInstructions(CompilationModel model)
        {
            var instructions = new List<InstructionModel>();
            bool isStaticCall = false;
            string tmpIndex = null;
            if (Expression is VariableExpression) // calling static method
            {
                var variable = (VariableExpression) Expression;
                var method = FindParent<Method>();
                var @class = (Class) method.Parent;
                // first try to find it in locals in that case it would be local variable
                tmpIndex = model.GetClass(@class.Name).GetMethod(method.FullName).GetVariableIndex(LocalModel.TempVariable).ToString(CultureInfo.InvariantCulture);
                try
                {
                    model.GetClass(@class.Name).GetMethod(method.FullName).GetVariableIndex(variable.Variable);
                }
                catch (Exception)
                {
                    isStaticCall = true;
                }
            }

            // push args
            foreach (var param in Parameters)
            {
                instructions.AddRange(param.GetInstructions(model));
            }

            // find on which object it will be called
            if (isStaticCall)
            {
                var @class = (VariableExpression) Expression;
                instructions.Add(new InstructionModel(Instructions.NewInstruction, @class.Variable) { Comment = model.GetComment(this) + " - creating new instance" });
                instructions.Add(new InstructionModel(Instructions.StorePointerInstruction, tmpIndex) { Comment = model.GetComment(this) + " - storing in tmp variable" });
                instructions.Add(new InstructionModel(Instructions.LoadPointerInstruction, tmpIndex) { Comment = model.GetComment(this) + " - loading from tmp variable" });
            }
            else if (Expression != null)
            {
                instructions.AddRange(Expression.GetInstructions(model));
            }
            else
            {
                instructions.Add(new InstructionModel(Instructions.LoadPointerInstruction, "0") { Comment = model.GetComment(this) + " - loading self" });
            }

            try
            {
                instructions.Add(new InstructionModel(Instructions.CallInstruction, string.Format("::{0}::{1}", Method, Parameters.Count())) { Comment = model.GetComment(this) + " - doing method call" });
                if (isStaticCall)
                {
                    instructions.Add(new InstructionModel(Instructions.LoadPointerInstruction, tmpIndex) { Comment = model.GetComment(this) + " - loading from tmp variable" });
                }
            }
            catch (Exception)
            {
                if (Method != "New" && Parameters.Count() != 0)
                {
                    throw;
                }
            }

            return instructions;
        }
 public override string GetExpressionType(CompilationModel model)
 {
     var @class = FindParent<Class>();
     var classModel = model.GetClass(@class.Name);
     return classModel.GetFieldType(Property);
 }