public override LLVMRegister VisitFieldOrClassAssignment([NotNull] ClepsParser.FieldOrClassAssignmentContext context) { string memberName = context.classOrMemberName().Name.Text; string className = String.Join(".", CurrentNamespaceAndClass); if (ClassManager.DoesClassContainMember(className, memberName)) { LLVMRegister thisPtr = VariableManager.GetVariable("this"); LLVMValueRef thisVar = LLVM.BuildLoad(Builder, thisPtr.LLVMPtrValueRef, "this"); LLVMRegister ret = GetClassMember(className, memberName, thisVar); return(ret); } else if (ClassManager.IsClassLoaded(className)) { //get the class type throw new NotImplementedException("Class types are not yet supported"); } else { string errorMessage = String.Format("No Class or Field named {0} exists", 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 ret = GetConstantIntRegisterOfClepsType(context, LLVM.Int32TypeInContext(Context), 11, "int32" /* friendly type name */); return(ret); } }
public override object VisitFieldOrClassAssignment([NotNull] ClepsParser.FieldOrClassAssignmentContext context) { List <string> namespaceClassAndFieldHierarchy = context._ClassHierarchy.Select(h => h.GetText()).ToList(); bool classFound = false; int i; for (i = namespaceClassAndFieldHierarchy.Count; i >= 1; i--) { string classNameToTest = String.Join(".", namespaceClassAndFieldHierarchy.Take(i).ToList()); if (ClassManager.IsClassBodySet(classNameToTest)) { classFound = true; break; } } if (!classFound) { string errorMessage = String.Format("Could not find class or field {0}", String.Join(".", namespaceClassAndFieldHierarchy)); Status.AddError(new CompilerError(FileName, context.Start.Line, context.Start.Column, errorMessage)); //just return something to avoid stalling return(CodeGenerator.CreateByte(0)); } string fullClassName = String.Join(".", namespaceClassAndFieldHierarchy.Take(i).ToList()); ClepsClass currentClass = ClassManager.GetClass(fullClassName); BasicStaticClepsType currentType = new BasicStaticClepsType(fullClassName); var fieldAccesses = namespaceClassAndFieldHierarchy.Skip(i).ToList(); if (fieldAccesses.Count != 0) { throw new NotImplementedException("Getting fields on static classes is not supported yet"); } IValue ret = CodeGenerator.GetClassStaticInstance(currentType); return(ret); }
/// <summary> /// Exit a parse tree produced by <see cref="ClepsParser.fieldOrClassAssignment"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitFieldOrClassAssignment([NotNull] ClepsParser.FieldOrClassAssignmentContext context) { }
/// <summary> /// Visit a parse tree produced by <see cref="ClepsParser.fieldOrClassAssignment"/>. /// <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 VisitFieldOrClassAssignment([NotNull] ClepsParser.FieldOrClassAssignmentContext context) { return(VisitChildren(context)); }