public MemberNotImplementedErrorEvent(HlTypeDefinition type, HlMemberDefinition member) : base( $"FunctionType '{type.Name}' does not implement member '{member.Name}'", ErrorEventKeys.s_HlMemberNotImplemented, false ) { }
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; }
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()); }
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 ) { }