public override GamaValueRef VisitExprFQMB([NotNull] GamaParser.ExprFQMBContext context) { PushLoad(false); var lexpr = Visit(context.expr()); PopLoad(); if (lexpr == null) { return(null); } var block = Parent.CurrentBlock; var builder = Parent.Builder; block.PositionBuilderAtEnd(builder); var syms = context.Symbol().Select(s => s.GetText()).ToArray(); Reference = lexpr; // for single fqmb (eg: foo.bar(...)) for (int i = 0; i < syms.Length; i++) { var fieldref = lexpr.Type.Meta.GetField(syms[i]); if (fieldref == null) { var method = lexpr.Type.Meta.GetMethod(syms[i]); if (method != null) { if (i != syms.Length - 1) { Parent.NamespaceContext.Context.AddError(new ErrorFunctionIndexing(context)); return(null); } PushCall(method); return(null); } Parent.NamespaceContext.Context.AddError(new ErrorMemberNotFound(context)); return(null); } /* LLVM */ var gep = builder.BuildStructGEP(lexpr.Value, (uint)fieldref.Index); lexpr = new GamaValueRef(fieldref.Type, gep, true); // TODO: check editability Reference = lexpr; } if (!IsEmptyLoad) { if (!TopLoad) { return(lexpr); // dont load it, for assign probably } } if (lexpr == null) // TODO: check this, this should not happen, in loop lexpr is ALWAYS assigned to a new value { Console.WriteLine(">>> It happened: {0}", Environment.StackTrace); return(null); } var load = builder.BuildLoad(lexpr.Value); return(new GamaValueRef(lexpr.Type, load, false)); }
/// <summary> /// Visit a parse tree produced by the <c>ExprFQMB</c> /// labeled alternative in <see cref="GamaParser.expr"/>. /// <para> /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/> /// on <paramref name="context"/>. /// </para> /// </summary> /// <param name="context">The parse tree.</param> /// <return>The visitor result.</return> public virtual Result VisitExprFQMB([NotNull] GamaParser.ExprFQMBContext context) { return(VisitChildren(context)); }
/// <summary> /// Exit a parse tree produced by the <c>ExprFQMB</c> /// labeled alternative in <see cref="GamaParser.expr"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitExprFQMB([NotNull] GamaParser.ExprFQMBContext context) { }