Esempio n. 1
0
        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);
        }
Esempio n. 3
0
 /// <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)
 {
 }
Esempio n. 4
0
 /// <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));
 }