Esempio n. 1
0
        public Expression CreateReferenceExpression(ResolveContext rc, Location loc)
        {
            Expression expr = null;

            //
            // We know the variable name is somewhere in the scope. This generates
            // an access expression from current block
            //
            var pb = rc.CurrentBlock.ParametersBlock;

            while (true)
            {
                if (pb is QueryBlock)
                {
                    for (int i = pb.Parameters.Count - 1; i >= 0; --i)
                    {
                        var p = pb.Parameters[i];
                        if (p.Name == Name)
                        {
                            return(pb.GetParameterReference(i, loc));
                        }

                        var tp = p as QueryBlock.TransparentParameter;
                        while (tp != null)
                        {
                            if (expr == null)
                            {
                                expr = pb.GetParameterReference(i, loc);
                            }
                            else
                            {
                                expr = new TransparentMemberAccess(expr, tp.Name);
                            }

                            if (tp.Identifier == Name)
                            {
                                return(new TransparentMemberAccess(expr, Name));
                            }

                            if (tp.Parent.Name == Name)
                            {
                                return(new TransparentMemberAccess(expr, Name));
                            }

                            tp = tp.Parent as QueryBlock.TransparentParameter;
                        }
                    }

                    expr = null;
                }

                if (pb == block)
                {
                    return(null);
                }

                pb = pb.Parent.ParametersBlock;
            }
        }
Esempio n. 2
0
		public Expression CreateReferenceExpression (ResolveContext rc, Location loc)
		{
			Expression expr = null;

			// 
			// We know the variable name is somewhere in the scope. This generates
			// an access expression from current block
			//
			var pb = rc.CurrentBlock.ParametersBlock;
			while (true) {
				if (pb is QueryBlock) {
					for (int i = pb.Parameters.Count - 1; i >= 0; --i) {
						var p = pb.Parameters[i];
						if (p.Name == Name)
							return pb.GetParameterReference (i, loc);

						var tp = p as QueryBlock.TransparentParameter;
						while (tp != null) {
							if (expr == null)
								expr = pb.GetParameterReference (i, loc);
							else
								expr = new TransparentMemberAccess (expr, tp.Name);

							if (tp.Identifier == Name)
								return new TransparentMemberAccess (expr, Name);

							if (tp.Parent.Name == Name)
								return new TransparentMemberAccess (expr, Name);

							tp = tp.Parent as QueryBlock.TransparentParameter;
						}
					}

					expr = null;
				}

				if (pb == block)
					return null;

				pb = pb.Parent.ParametersBlock;
			}
		}
Esempio n. 3
0
		// 
		// Query parameter reference can include transparent parameters
		//
		protected override Expression GetParameterReferenceExpression (string name, Location loc)
		{
			Expression expr = base.GetParameterReferenceExpression (name, loc);
			if (expr != null)
				return expr;

			TransparentParameter tp = parameters [0] as TransparentParameter;
			while (tp != null) {
				if (tp.Identifier == name)
					break;

				TransparentParameter tp_next = tp.Parent as TransparentParameter;
				if (tp_next == null && tp.Parent.Name == name)
					break;

				tp = tp_next;
			}

			if (tp != null) {
				expr = new SimpleName (parameters[0].Name, loc);
				TransparentParameter tp_cursor = (TransparentParameter) parameters[0];
				while (tp_cursor != tp) {
					tp_cursor = (TransparentParameter) tp_cursor.Parent;
					expr = new TransparentMemberAccess (expr, tp_cursor.Name);
				}

				return new TransparentMemberAccess (expr, name);
			}

			return null;
		}