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."), });