private FirstPassResult HandleCodeFirstPass(
            IExpression <T> expression,
            AssemblyContext <T> assemblyContext)
        {
            Code <T> code = (Code <T>)expression;

            if (code.IsEmpty)
            {
                return(FirstPassResult.Invalid());
            }

            if (HandleBuiltInCode(code, assemblyContext, false))
            {
                return(FirstPassResult.Invalid());
            }

            var paramTypes    = code.Parameters.Select(EAType.GetType).ToArray();
            var templateError = storer.FindTemplate(code.CodeName.Name, paramTypes);

            if (templateError.CausedError)
            {
                assemblyContext.AddError(code, templateError);
                return(FirstPassResult.Invalid());
            }
            else
            {
                var template  = templateError.Result;
                int oldOffset = assemblyContext.CurrentOffset;
                assemblyContext.CurrentOffset += template.GetLengthBytes(code.Parameters);
                return(FirstPassResult.Valid(code, oldOffset, template));
            }
        }
 private FirstPassResult HandleScopeFirstPass(
     IExpression <T> expression,
     AssemblyContext <T> assemblyContext)
 {
     assemblyContext.SetScopeStructure(expression);
     return(FirstPassResult.Invalid());
 }
        private FirstPassResult HandleLabelFirstPass(
            IExpression <T> expression,
            AssemblyContext <T> assemblyContext)
        {
            LabeledExpression <T> labelExp = (LabeledExpression <T>)expression;

            assemblyContext.CurrentScope.AddNewSymbol((labelExp).LabelName,
                                                      new ValueExpression <T>(intType.FromInt(assemblyContext.CurrentOffset), default(FilePosition)));
            return(FirstPassResult.Invalid());
        }
        private FirstPassResult HandleAssignmentFirstPass(
            IExpression <T> expression,
            AssemblyContext <T> assemblyContext)
        {
            Assingment <T> assignment = (Assingment <T>)expression;

            if (assignment.VariableCount != 0)
            {
                assemblyContext.AddError(assignment, "Assignments with parameters aren't supported.");
            }
            else
            {
                assemblyContext.CurrentScope.AddNewSymbol(assignment.Name.Name, assignment.Result);
            }
            return(FirstPassResult.Invalid());
        }