Exemple #1
0
    private static ESIR_MemberAccessExpression MemberAccessExpression(ESIR_Expression parent, ESIR_ValueNode name)
    {
        var node = ESIR_NodeCache.Shared.TryGetNode(ESIR_NodeKind.MemberAccessExpression, parent, name, out var hash);

        if (node is not null)
        {
            return((ESIR_MemberAccessExpression)node);
        }

        var ret = new ESIR_MemberAccessExpression(parent, name);

        if (hash >= 0)
        {
            ESIR_NodeCache.Shared.AddNode(ret, hash);
        }

        return(ret);
    }
    private static ExpressionData CompileExpression_MemberAccess(
        ref PassData passData,
        ref FunctionData funcData,
        ESIR_MemberAccessExpression expr
        )
    {
        var parentExpr = CompileExpression(ref passData, ref funcData, expr.ExprParent);

        StripFirstConst(ref parentExpr);

        Debug.Assert(parentExpr.Type is not null);

        return(parentExpr.Type->TypeTag switch {
            ES_TypeTag.UNKNOWN => throw new CompilationException(ES_BackendErrors.FrontendError),

            ES_TypeTag.Struct => CompileExpression_MemberAccess_Struct(ref passData, ref funcData, expr, parentExpr),
            ES_TypeTag.Array => CompileExpression_MemberAccess_Array(ref passData, ref funcData, expr, parentExpr),
            ES_TypeTag.Reference => throw new CompilationException("Reference types must be dereferenced manually before access."),

            _ => throw new NotImplementedException("Type not implemented."),
        });