public MemberNotImplementedErrorEvent(HlTypeDefinition type, HlMemberDefinition member) : base(
         $"FunctionType '{type.Name}' does not implement member '{member.Name}'",
         ErrorEventKeys.s_HlMemberNotImplemented,
         false
         )
 {
 }
Beispiel #2
0
        public void Redirect(
            string instance,
            HlTypeDefinition instanceType,
            HlMemberDefinition memberDef,
            bool writeProlog = true)
        {
            WriteProlog      = writeProlog;
            InstanceType     = instanceType;
            MemberDefinition = memberDef;

            if (memberDef != null)
            {
                Left = new HlValueOperand(
                    new HlTextToken(
                        HlTokenType.OpWord,
                        InstanceType.GetFinalMemberName(
                            memberDef
                            ),                                   //$"FUN_{tdef.Name}_{tdef.Constructor.Name}",
                        0
                        )
                    );
            }

            Instance = instance;
        }
Beispiel #3
0
 public StaticInstanceMemberAccessEvent(HlTypeDefinition type, HlMemberDefinition member) : base(
         $"Accessing Instance Function '{member.Name}' in type '{type.Namespace.FullName}::{type.Name}' as static function. Passing an instance of '{type.Namespace.FullName}::{type.Name}' is required",
         WarningEventKeys.s_StaticInstanceMemberAccess
         )
 {
 }
        public override ExpressionTarget ParseExpression(
            HlCompilation compilation,
            HlMemberAccessOp expr,
            ExpressionTarget outputTarget)
        {
            string           tmpVar;
            ExpressionTarget lType = compilation.Parse(expr.Left);

            if (lType.ResultAddress == "%%TYPE%%")
            {
                if (expr.MemberName is HlInvocationOp invoc)
                {
                    HlMemberDefinition data = null;
                    bool writeProlog        = invoc.Left.ToString() == "new";

                    if (invoc.Left.ToString() == "new" || invoc.Left.ToString() == "base")
                    {
                        data = lType.TypeDefinition.StaticConstructor;
                    }
                    else
                    {
                        data = lType.TypeDefinition.GetPrivateOrPublicMember(invoc.Left.ToString());
                    }

                    if (lType.TypeDefinition.IsAbstract &&
                        writeProlog &&
                        data == lType.TypeDefinition.StaticConstructor)
                    {
                        EventManager <ErrorEvent> .SendEvent(
                            new AbstractConstructorCallEvent( lType.TypeDefinition )
                            );
                    }

                    if (data != null && !data.IsStatic)
                    {
                        EventManager <WarningEvent> .SendEvent(
                            new StaticInstanceMemberAccessEvent(
                                lType.TypeDefinition,
                                data
                                )
                            );
                    }

                    invoc.Redirect(null, lType.TypeDefinition, data, writeProlog);

                    ExpressionTarget t = compilation.Parse(invoc, outputTarget).
                                         CopyIfNotNull(compilation, outputTarget);

                    return(t);
                }
                else
                {
                    HlMemberDefinition data =
                        lType.TypeDefinition.GetPrivateOrPublicMember(expr.MemberName.ToString());

                    string funcName =
                        lType.TypeDefinition.
                        GetFinalMemberName(data);         //$"FUN_{lType.TypeDefinition.Name}_{expr.MemberName}";

                    if (data.IsStatic && data is HlPropertyDefinition propDef)
                    {
                        funcName = compilation.GetFinalName(funcName);
                    }

                    if (!data.IsStatic)
                    {
                        EventManager <WarningEvent> .SendEvent(
                            new StaticInstanceMemberAccessEvent(
                                lType.TypeDefinition,
                                data
                                )
                            );
                    }

                    if (outputTarget.ResultAddress != null)
                    {
                        compilation.EmitterResult.Emit("LOAD", funcName, outputTarget.ResultAddress);

                        return(outputTarget);
                    }

                    return(new ExpressionTarget(
                               funcName,
                               true,
                               compilation.TypeSystem.GetType(
                                   compilation.Root,
                                   HLBaseTypeNames.s_UintTypeName
                                   ),
                               false
                               ));
                }
            }

            string containerName = expr.MemberName.ToString();

            if (expr.MemberName is HlInvocationOp inv)
            {
                if (lType.TypeDefinition.HasMember(inv.Left.ToString()) &&
                    lType.TypeDefinition.GetPrivateOrPublicMember(inv.Left.ToString()) is HlPropertyDefinition)
                {
                    containerName = inv.Left.ToString();
                }
                else
                {
                    HlMemberDefinition data = lType.TypeDefinition.GetPrivateOrPublicMember(inv.Left.ToString());

                    inv.Redirect(
                        lType.ResultAddress,
                        lType.TypeDefinition,
                        data
                        );

                    ExpressionTarget tVal = compilation.Parse(inv, outputTarget);
                    ExpressionTarget t    = tVal.CopyIfNotNull(compilation, outputTarget);


                    return(t);
                }
            }
            else if (expr.MemberName is HlArrayAccessorOp arr &&
                     lType.TypeDefinition.GetPrivateOrPublicMember(arr.Left.ToString()) is HlPropertyDefinition)
            {
                containerName = arr.Left.ToString();
            }

            uint off = HlTypeDefinition.RecursiveGetOffset(
                lType.TypeDefinition,
                0,
                0,
                containerName.Split('.')
                );

            string tmpOff = compilation.GetTempVar(off);

            if (lType.IsPointer)
            {
                tmpVar = compilation.GetTempVarCopy(lType.ResultAddress);
            }
            else
            {
                tmpVar = compilation.GetTempVarLoad(lType.ResultAddress);
            }

            compilation.EmitterResult.Emit($"ADD", tmpVar, tmpOff);

            compilation.ReleaseTempVar(tmpOff);

            HlMemberDefinition mdef = null;

            if (expr.Left.ToString() == "this")
            {
                mdef = HlTypeDefinition.RecursiveGetPrivateOrPublicMember(
                    lType.TypeDefinition,
                    0,
                    containerName.Split('.')
                    );
            }
            else
            {
                mdef = HlTypeDefinition.RecursiveGetPublicMember(
                    lType.TypeDefinition,
                    0,
                    containerName.Split('.')
                    );
            }

            if (mdef is HlPropertyDefinition pdef)
            {
                if (outputTarget.ResultAddress != null)
                {
                    compilation.EmitterResult.Emit($"DREF", tmpVar, outputTarget.ResultAddress);
                    compilation.ReleaseTempVar(tmpVar);

                    return(outputTarget);
                }

                return(new ExpressionTarget(tmpVar, true, pdef.PropertyType, true));
            }

            if (mdef is HlFunctionDefinition fdef)
            {
                if (outputTarget.ResultAddress != null)
                {
                    compilation.EmitterResult.Emit($"DREF", tmpVar, outputTarget.ResultAddress);
                    compilation.ReleaseTempVar(tmpVar);

                    return(outputTarget);
                }

                return(new ExpressionTarget(tmpVar, true, fdef.ReturnType, true));
            }

            return(new ExpressionTarget());
        }
Beispiel #5
0
        public ExpressionTarget Compile(HlCompilation compilation, HlInvocationOp expr)
        {
            if (expr.ParameterList.Length != 1)
            {
                EventManager <ErrorEvent> .SendEvent(
                    new FunctionArgumentMismatchEvent(
                        "Invalid Arguments. Expected size_of(variable)"
                        )
                    );
            }


            if (compilation.ContainsVariable(expr.ParameterList[0].ToString()))
            {
                string v = compilation.GetTempVar(
                    compilation.GetVariable(expr.ParameterList[0].ToString()).Size
                    );

                return(new ExpressionTarget(
                           v,
                           true,
                           compilation.TypeSystem.GetType(
                               compilation.Root,
                               HLBaseTypeNames.s_UintTypeName
                               )
                           ));
            }

            if (expr.ParameterList[0] is HlMemberAccessOp mac)
            {
                ExpressionTarget lType = compilation.Parse(mac.Left);

                if (lType.ResultAddress == "%%TYPE%%")
                {
                    HlMemberDefinition member = lType.TypeDefinition.
                                                GetPrivateOrPublicMember(
                        mac.MemberName.ToString()
                        );
                    VariableData var = compilation.
                                       GetVariable(
                        lType.TypeDefinition.GetFinalMemberName(
                            member
                            )
                        );
                    string v = compilation.GetTempVar(
                        var.
                        Size
                        );

                    return(new ExpressionTarget(
                               v,
                               true,
                               compilation.TypeSystem.GetType(
                                   compilation.Root,
                                   HLBaseTypeNames.s_UintTypeName
                                   )
                               ));
                }
                else
                {
                    throw new Exception();
                }
            }

            if (compilation.TypeSystem.HasType(compilation.Root, expr.ParameterList[0].ToString()))
            {
                string v = compilation.GetTempVar(
                    compilation.TypeSystem.
                    GetType(
                        compilation.Root,
                        expr.ParameterList[0].ToString()
                        ).
                    GetSize()
                    );

                return(new ExpressionTarget(
                           v,
                           true,
                           compilation.TypeSystem.GetType(
                               compilation.Root,
                               HLBaseTypeNames.s_UintTypeName
                               )
                           ));
            }

            EventManager <ErrorEvent> .SendEvent(
                new HlVariableNotFoundEvent(
                    expr.ParameterList[0].ToString(),
                    false
                    )
                );

            return(new ExpressionTarget());
        }
 public MemberNotImplementedWarningEvent(HlTypeDefinition type, HlMemberDefinition member) : base(
         $"Ignoring unimplemented member '{member.Name}' in abstract type '{type.Namespace.FullName}::{type.Name}'",
         WarningEventKeys.s_HlMemberNotImplemented
         )
 {
 }