public override LLVMRegister VisitFieldAccessOnExpression([NotNull] ClepsParser.FieldAccessOnExpressionContext context) { string memberName = context.FieldName.Name.Text; LLVMRegister targetRegister = Visit(context.rightHandExpression()); string className = targetRegister.VariableType.RawTypeName; if (!ClassManager.DoesClassContainMember(className, memberName)) { string errorMessage = String.Format("The class {0} does not have a member named {1}", className, memberName); Status.AddError(new CompilerError(FileName, context.Start.Line, context.Start.Column, errorMessage)); //just assume this is operation returns a constant int to avoid stalling the compilation LLVMRegister errRet = GetConstantIntRegisterOfClepsType(context, LLVM.Int32TypeInContext(Context), 5, "int32" /* friendly type name */); return(errRet); } LLVMRegister ret = GetClassMember(className, memberName, targetRegister.LLVMPtrValueRef); return(ret); }
/// <summary> /// Exit a parse tree produced by <see cref="ClepsParser.FieldAccessOnExpression"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitFieldAccessOnExpression([NotNull] ClepsParser.FieldAccessOnExpressionContext context) { }
/// <summary> /// Visit a parse tree produced by <see cref="ClepsParser.FieldAccessOnExpression"/>. /// <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 VisitFieldAccessOnExpression([NotNull] ClepsParser.FieldAccessOnExpressionContext context) { return(VisitChildren(context)); }