示例#1
0
 public Expression ConvertConstantValue(ResolveResult rr)
 {
     if (rr == null)
     {
         throw new ArgumentNullException("rr");
     }
     if (rr is TypeOfResolveResult)
     {
         return(new TypeOfExpression(ConvertType(((TypeOfResolveResult)rr).Type)));
     }
     else if (rr is ArrayCreateResolveResult)
     {
         ArrayCreateResolveResult acrr = (ArrayCreateResolveResult)rr;
         AstType type = ConvertType(acrr.Type);
         throw new NotImplementedException();
     }
     else if (rr.IsCompileTimeConstant)
     {
         return(ConvertConstantValue(rr.Type, rr.ConstantValue));
     }
     else
     {
         return(new EmptyExpression());
     }
 }
示例#2
0
 static ResolveResult MapToNewContext(ResolveResult rr, ITypeResolveContext newContext)
 {
     if (rr is TypeOfResolveResult)
     {
         return(new TypeOfResolveResult(
                    rr.Type.ToTypeReference().Resolve(newContext),
                    ((TypeOfResolveResult)rr).ReferencedType.ToTypeReference().Resolve(newContext)));
     }
     else if (rr is ArrayCreateResolveResult)
     {
         ArrayCreateResolveResult acrr = (ArrayCreateResolveResult)rr;
         return(new ArrayCreateResolveResult(
                    acrr.Type.ToTypeReference().Resolve(newContext),
                    MapToNewContext(acrr.SizeArguments, newContext),
                    MapToNewContext(acrr.InitializerElements, newContext)));
     }
     else if (rr.IsCompileTimeConstant)
     {
         return(new ConstantResolveResult(
                    rr.Type.ToTypeReference().Resolve(newContext),
                    rr.ConstantValue
                    ));
     }
     else
     {
         return(new ErrorResolveResult(rr.Type.ToTypeReference().Resolve(newContext)));
     }
 }
示例#3
0
 public ArrayCreateBlock(IEmitter emitter, ArrayCreateExpression arrayCreateExpression, ArrayCreateResolveResult arrayCreateResolveResult)
     : base(emitter, null)
 {
     Emitter = emitter;
     ArrayCreateExpression    = arrayCreateExpression;
     ArrayCreateResolveResult = arrayCreateResolveResult;
 }
示例#4
0
 static ResolveResult MapToNewContext(ResolveResult rr, MapTypeIntoNewContext mapping)
 {
     if (rr is TypeOfResolveResult)
     {
         return(new TypeOfResolveResult(
                    rr.Type.AcceptVisitor(mapping),
                    ((TypeOfResolveResult)rr).ReferencedType.AcceptVisitor(mapping)));
     }
     else if (rr is ArrayCreateResolveResult)
     {
         ArrayCreateResolveResult acrr = (ArrayCreateResolveResult)rr;
         return(new ArrayCreateResolveResult(
                    acrr.Type.AcceptVisitor(mapping),
                    MapToNewContext(acrr.SizeArguments, mapping),
                    MapToNewContext(acrr.InitializerElements, mapping)));
     }
     else if (rr.IsCompileTimeConstant)
     {
         return(new ConstantResolveResult(
                    rr.Type.AcceptVisitor(mapping),
                    rr.ConstantValue
                    ));
     }
     else
     {
         return(new ErrorResolveResult(rr.Type.AcceptVisitor(mapping)));
     }
 }
示例#5
0
        public override string VisitArrayCreateResolveResult(ArrayCreateResolveResult rr, object data)
        {
            if (rr.InitializerElements != null)
            {
                return(CompileFactoryCall("NewArrayInit", new[] { typeof(Type), typeof(Expression[]) }, new[] { ExpressionTreeBuilder.GetTypeName(rr.Type, this._emitter), this._emitter.ToJavaScript(rr.InitializerElements.Select(e => new JRaw(this.VisitResolveResult(e, null))).ToArray()) }));
            }

            return(CompileFactoryCall("NewArrayBounds", new[] { typeof(Type), typeof(Expression[]) }, new[] { ExpressionTreeBuilder.GetTypeName(rr.Type, this._emitter), this._emitter.ToJavaScript(rr.SizeArguments.Select(a => new JRaw(VisitResolveResult(a, null))).ToArray()) }));
        }
        public Expression ConvertConstantValue(ResolveResult rr)
        {
            if (rr == null)
            {
                throw new ArgumentNullException("rr");
            }
            if (rr is ConversionResolveResult)
            {
                // unpack ConversionResolveResult if necessary
                // (e.g. a boxing conversion or string->object reference conversion)
                rr = ((ConversionResolveResult)rr).Input;
            }

            if (rr is TypeOfResolveResult)
            {
                return(new TypeOfExpression(ConvertType(rr.Type)));
            }
            else if (rr is ArrayCreateResolveResult)
            {
                ArrayCreateResolveResult acrr = (ArrayCreateResolveResult)rr;
                ArrayCreateExpression    ace  = new ArrayCreateExpression();
                ace.Type = ConvertType(acrr.Type);
                ComposedType composedType = ace.Type as ComposedType;
                if (composedType != null)
                {
                    composedType.ArraySpecifiers.MoveTo(ace.AdditionalArraySpecifiers);
                    if (!composedType.HasNullableSpecifier && composedType.PointerRank == 0)
                    {
                        ace.Type = composedType.BaseType;
                    }
                }

                if (acrr.SizeArguments != null && acrr.InitializerElements == null)
                {
                    ace.AdditionalArraySpecifiers.FirstOrNullObject().Remove();
                    ace.Arguments.AddRange(acrr.SizeArguments.Select(ConvertConstantValue));
                }
                if (acrr.InitializerElements != null)
                {
                    ArrayInitializerExpression initializer = new ArrayInitializerExpression();
                    initializer.Elements.AddRange(acrr.InitializerElements.Select(ConvertConstantValue));
                    ace.Initializer = initializer;
                }
                return(ace);
            }
            else if (rr.IsCompileTimeConstant)
            {
                return(ConvertConstantValue(rr.Type, rr.ConstantValue));
            }
            else
            {
                return(new ErrorExpression());
            }
        }
示例#7
0
 public override JsExpression VisitArrayCreateResolveResult(ArrayCreateResolveResult rr, object data)
 {
     if (rr.InitializerElements != null)
     {
         return(CompileFactoryCall("NewArrayInit", new[] { typeof(Type), typeof(Expression[]) }, new[] { _instantiateType(rr.Type), JsExpression.ArrayLiteral(rr.InitializerElements.Select(e => VisitResolveResult(e, null))) }));
     }
     else
     {
         return(CompileFactoryCall("NewArrayBounds", new[] { typeof(Type), typeof(Expression[]) }, new[] { _instantiateType(rr.Type), JsExpression.ArrayLiteral(rr.SizeArguments.Select(a => VisitResolveResult(a, null))) }));
     }
 }
示例#8
0
        public override string VisitArrayCreateResolveResult(ArrayCreateResolveResult rr, object data)
        {
            var arrayType = rr.Type as ArrayType;

            if (rr.InitializerElements != null)
            {
                return(CompileFactoryCall("NewArrayInit", new[] { typeof(Type), typeof(Expression[]) }, new[] { GetTypeName(arrayType != null ? arrayType.ElementType : rr.Type, _emitter), _emitter.ToJavaScript(rr.InitializerElements.Select(e => new JRaw(VisitResolveResult(e, null))).ToArray()) }));
            }

            return(CompileFactoryCall("NewArrayBounds", new[] { typeof(Type), typeof(Expression[]) }, new[] { GetTypeName(arrayType != null ? arrayType.ElementType : rr.Type, _emitter), _emitter.ToJavaScript(rr.SizeArguments.Select(a => new JRaw(VisitResolveResult(a, null))).ToArray()) }));
        }
示例#9
0
        public JNode VisitArrayCreateResolveResult(ArrayCreateResolveResult res)
        {
            JExpression[] items = null;
            JExpression   size  = null;

            if (res.InitializerElements.IsNotNullOrEmpty())
            {
                items = VisitExpressions(res.InitializerElements).ToArray();
            }
            else if (res.SizeArguments.IsNotNullOrEmpty())
            {
                size = VisitExpression(res.SizeArguments.Single());
            }

            return(J.NewArray(res.Type, size, items));
        }
示例#10
0
 public object VisitArrayCreateResolveResult(ArrayCreateResolveResult res)
 {
     if (res.InitializerElements.IsNotNullOrEmpty())
     {
         var array     = res.InitializerElements.Select(Visit).ToArray();
         var arrayType = res.Type.GetMirroredClrType();
         //HACK: bug in parser
         if (arrayType.GetElementType().IsArray)
         {
             arrayType = arrayType.GetElementType();
         }
         var array2 = Array.CreateInstance(arrayType.GetElementType(), array.Length);
         array.CopyTo(array2, 0);
         return(array2);
     }
     return(null);
 }
示例#11
0
        public JsNode VisitArrayCreateResolveResult(ArrayCreateResolveResult res)
        {
            var jsArrayType = SkJs.GetJsArrayType((ArrayType)res.Type);

            JsExpression[] items = null;
            JsExpression   size  = null;

            if (res.InitializerElements.IsNotNullOrEmpty())
            {
                items = VisitExpressions(res.InitializerElements).ToArray();
            }
            else if (res.SizeArguments.IsNotNullOrEmpty())
            {
                size = VisitExpression(res.SizeArguments.Single());
            }

            return(Js.NewArray(jsArrayType, size, items));
        }
示例#12
0
 Expression ConvertConstantValue(ResolveResult rr)
 {
     if (rr is TypeOfResolveResult)
     {
         return(new TypeOfExpression(ConvertType(((TypeOfResolveResult)rr).Type)));
     }
     else if (rr is ArrayCreateResolveResult)
     {
         ArrayCreateResolveResult acrr = (ArrayCreateResolveResult)rr;
         AstType type = ConvertType(acrr.Type);
         throw new NotImplementedException();
     }
     else if (rr.IsCompileTimeConstant)
     {
         object val = rr.ConstantValue;
         if (val == null)
         {
             if (rr.Type.IsReferenceType(context) == true)
             {
                 return(new NullReferenceExpression());
             }
             else
             {
                 return(new DefaultValueExpression(ConvertType(rr.Type)));
             }
         }
         else if (rr.Type.Kind == TypeKind.Enum)
         {
             throw new NotImplementedException();
         }
         else
         {
             return(new PrimitiveExpression(val));
         }
     }
     else
     {
         return(new EmptyExpression());
     }
 }
 public virtual TResult VisitArrayCreateResolveResult(ArrayCreateResolveResult rr, TData data)
 {
     VisitChildResolveResults(rr, data);
     return(default(TResult));
 }
示例#14
0
 string Visit(ArrayCreateResolveResult result)
 {
     throw new NotImplementedException();
 }
		string Visit(ArrayCreateResolveResult result)
		{
			throw new NotImplementedException();
		}
示例#16
0
 public virtual object VisitArrayCreateResolveResult(ArrayCreateResolveResult rr, object data)
 {
     VisitChildResolveResults(rr, data);
     return(null);
 }