Esempio n. 1
0
        public static void Compile(ParserContext parser, ByteBuffer buffer, ThisKeyword thisKeyword, bool outputUsed)
        {
            if (!outputUsed)
            {
                throw new ParserException(thisKeyword, "This expression doesn't do anything.");
            }

            buffer.Add(thisKeyword.FirstToken, OpCode.THIS);
        }
Esempio n. 2
0
        public override Expression ResolveTypes(ParserContext context, VariableScope varScope)
        {
            string name = this.Name.Value;

            if (name == "this" || name == "base")
            {
                if (name == "this")
                {
                    ClassLikeDefinition cd = this.Parent.ClassContainer;

                    return(new ThisKeyword(this.FirstToken, this.Parent)
                    {
                        ResolvedType = ResolvedType.FromClass(cd),
                    });
                }

                // TODO: base
                throw new System.NotImplementedException();
            }

            this.ResolvedType = varScope.GetVariableType(name);
            if (this.ResolvedType == null)
            {
                foreach (TopLevelEntity member in this.ClassContainer.GetMemberNonNull(name))
                {
                    if (member is PropertyDefinition || member is FieldDefinition || member is MethodDefinition)
                    {
                        VerifiedFieldReference vfr;
                        if (member.IsStatic)
                        {
                            ClassLikeDefinition  cd       = member.ClassContainer;
                            StaticClassReference classRef = new StaticClassReference(this.FirstToken, this.parent, member.ClassContainer);
                            vfr = new VerifiedFieldReference(this.FirstToken, this.parent, this.Name, classRef, ResolvedType.FromClass(cd));
                        }
                        else
                        {
                            ThisKeyword thisKeyword = new ThisKeyword(this.FirstToken, this.Parent);
                            thisKeyword.ResolvedType = ResolvedType.FromClass(this.Parent.ClassContainer);
                            vfr = new VerifiedFieldReference(this.FirstToken, this.parent, this.Name, thisKeyword, null);
                        }

                        if (member is PropertyDefinition)
                        {
                            vfr.Property     = (PropertyDefinition)member;
                            vfr.ResolvedType = vfr.Property.ResolvedType;
                        }
                        else if (member is FieldDefinition)
                        {
                            vfr.Field        = (FieldDefinition)member;
                            vfr.ResolvedType = vfr.Field.ResolvedType;
                        }
                        else if (member is MethodDefinition)
                        {
                            vfr.Method       = (MethodDefinition)member;
                            vfr.ResolvedType = vfr.Method.ResolvedReturnType;
                        }
                        else
                        {
                            throw new System.NotImplementedException();
                        }

                        return(vfr);
                    }
                    else
                    {
                        throw new System.NotImplementedException();
                    }
                }

                char c = this.Name.Value[0]; // lame optimization
                if (c >= 'A' && c <= 'Z')
                {
                    Expression newExpr = DotField.AttemptToResolveDotFieldChainIntoDirectReference(new Token[] { this.Name }, context, this);
                    if (newExpr != null)
                    {
                        return(newExpr);
                    }
                }

                throw new ParserException(this.FirstToken, "This variable is not declared.");
            }
            return(this);
        }