예제 #1
0
        public void CSharpComplexCollectionInitializer()
        {
            ObjectCreateExpression oce = ParseUtilCSharp.ParseExpression <ObjectCreateExpression>(
                @"new List<Contact> {
	new Contact {
		Name = ""Chris"",
		PhoneNumbers = { ""206-555-0101"" }
	},
	new Contact(additionalParameter) {
		Name = ""Bob"",
		PhoneNumbers = { ""650-555-0199"", ""425-882-8080"" }
	}
}");

            Assert.AreEqual(0, oce.Parameters.Count);
            Assert.AreEqual(2, oce.ObjectInitializer.CreateExpressions.Count);

            oce = (ObjectCreateExpression)oce.ObjectInitializer.CreateExpressions[1];             // look at Bob
            Assert.AreEqual(1, oce.Parameters.Count);
            Assert.IsInstanceOf(typeof(IdentifierExpression), oce.Parameters[0]);
            Assert.IsInstanceOf(typeof(PrimitiveExpression), CheckPropertyInitializationExpression(oce.ObjectInitializer.CreateExpressions[0], "Name"));
            CollectionInitializerExpression phoneNumbers = (CollectionInitializerExpression)CheckPropertyInitializationExpression(oce.ObjectInitializer.CreateExpressions[1], "PhoneNumbers");

            Assert.AreEqual(2, phoneNumbers.CreateExpressions.Count);
        }
예제 #2
0
        private InvocationExpression CreateReflectionInvocation(InvocationExpression invocationExpression, bool staticMethod)
        {
            List <Expression>        arguments = new List <Expression>();
            FieldReferenceExpression fieldReferenceExpression = (FieldReferenceExpression)invocationExpression.TargetObject;
            Expression invoker = fieldReferenceExpression.TargetObject;

            TypeReferenceExpression  helper = new TypeReferenceExpression("Helpers.ReflectionHelper");
            FieldReferenceExpression call   = new FieldReferenceExpression(helper, "CallInternalMethod");

            string name = fieldReferenceExpression.FieldName;
            PrimitiveExpression methodName = new PrimitiveExpression(name, '"' + name + '"');

            arguments.Add(methodName);
            if (staticMethod)
            {
                arguments.Add(new PrimitiveExpression(null, "null"));
            }
            else
            {
                arguments.Add(invoker);
            }

            CollectionInitializerExpression arrayInitializer = new CollectionInitializerExpression(invocationExpression.Arguments);
            TypeReference reference = AstUtil.GetTypeReference("object", invocationExpression);

            reference.RankSpecifier = new int[1];
            ArrayCreateExpression argArray = new ArrayCreateExpression(reference, arrayInitializer);

            arguments.Add(argArray);

            return(new InvocationExpression(call, arguments));
        }
예제 #3
0
 public override object VisitCollectionInitializerExpression(CollectionInitializerExpression arrayInitializerExpression, object data)
 {
     foreach (INode node in arrayInitializerExpression.CreateExpressions)
     {
         node.Parent = arrayInitializerExpression;
     }
     return(base.VisitCollectionInitializerExpression(arrayInitializerExpression, data));
 }
예제 #4
0
        public override object VisitCollectionInitializerExpression(CollectionInitializerExpression collectionInitializerExpression, object data)
        {
            if (collectionInitializerExpression.CreateExpressions.Count == 0)
            {
                return(null);
            }
            DomReturnType type = (DomReturnType)ResolveType(collectionInitializerExpression.CreateExpressions[0]);

            type.ArrayDimensions++;
            return(CreateResult(type));
        }
예제 #5
0
        DefaultClass CreateAnonymousTypeClass(CollectionInitializerExpression initializer)
        {
            List <IReturnType> fieldTypes = new List <IReturnType>();
            List <string>      fieldNames = new List <string>();

            foreach (Expression expr in initializer.CreateExpressions)
            {
                if (expr is NamedArgumentExpression)
                {
                    // use right part only
                    fieldTypes.Add(ResolveType(((NamedArgumentExpression)expr).Expression));
                }
                else
                {
                    fieldTypes.Add(ResolveType(expr));
                }

                fieldNames.Add(GetAnonymousTypeFieldName(expr));
            }

            StringBuilder nameBuilder = new StringBuilder();

            nameBuilder.Append('{');
            for (int i = 0; i < fieldTypes.Count; i++)
            {
                if (i > 0)
                {
                    nameBuilder.Append(", ");
                }
                nameBuilder.Append(fieldNames[i]);
                nameBuilder.Append(" : ");
                if (fieldTypes[i] != null)
                {
                    nameBuilder.Append(fieldTypes[i].DotNetName);
                }
            }
            nameBuilder.Append('}');

            DefaultClass c = new DefaultClass(new DefaultCompilationUnit(resolver.ProjectContent), nameBuilder.ToString());

            c.Modifiers = ModifierEnum.Internal | ModifierEnum.Synthetic | ModifierEnum.Sealed;
            for (int i = 0; i < fieldTypes.Count; i++)
            {
                DefaultProperty p = new DefaultProperty(fieldNames[i], fieldTypes[i], ModifierEnum.Public | ModifierEnum.Synthetic, DomRegion.Empty, DomRegion.Empty, c);
                p.CanGet = true;
                p.CanSet = false;
                c.Properties.Add(p);
            }
            return(c);
        }
예제 #6
0
        public void CSharpNestedObjectInitializerForPreinitializedProperty()
        {
            ObjectCreateExpression oce = ParseUtilCSharp.ParseExpression <ObjectCreateExpression>(
                "new Rectangle { P1 = { X = 0, Y = 1 }, P2 = { X = 2, Y = 3 } }"
                );

            Assert.AreEqual(0, oce.Parameters.Count);
            Assert.AreEqual(2, oce.ObjectInitializer.CreateExpressions.Count);
            CollectionInitializerExpression aie = (CollectionInitializerExpression)CheckPropertyInitializationExpression(oce.ObjectInitializer.CreateExpressions[0], "P1");

            Assert.IsInstanceOf(typeof(PrimitiveExpression), CheckPropertyInitializationExpression(aie.CreateExpressions[0], "X"));
            Assert.IsInstanceOf(typeof(PrimitiveExpression), CheckPropertyInitializationExpression(aie.CreateExpressions[1], "Y"));
            aie = (CollectionInitializerExpression)CheckPropertyInitializationExpression(oce.ObjectInitializer.CreateExpressions[1], "P2");
            Assert.IsInstanceOf(typeof(PrimitiveExpression), CheckPropertyInitializationExpression(aie.CreateExpressions[0], "X"));
            Assert.IsInstanceOf(typeof(PrimitiveExpression), CheckPropertyInitializationExpression(aie.CreateExpressions[1], "Y"));
        }
예제 #7
0
        private Expression CreateReflectionInstance(ObjectCreateExpression objectCreateExpression)
        {
            TypeReferenceExpression         helper           = new TypeReferenceExpression("Helpers.ReflectionHelper");
            FieldReferenceExpression        target           = new FieldReferenceExpression(helper, "InstantiateClass");
            List <Expression>               arguments        = new List <Expression>();
            TypeOfExpression                typeofExpression = new TypeOfExpression(objectCreateExpression.CreateType);
            CollectionInitializerExpression arrayInitializer = new CollectionInitializerExpression(objectCreateExpression.Parameters);
            TypeReference reference = new TypeReference("object");

            reference.RankSpecifier = new int[1];
            ArrayCreateExpression arrayCreateExpression = new ArrayCreateExpression(reference, arrayInitializer);

            arguments.Add(typeofExpression);
            arguments.Add(arrayCreateExpression);
            InvocationExpression invocation     = new InvocationExpression(target, arguments);
            CastExpression       castExpression = new CastExpression(objectCreateExpression.CreateType, invocation, CastType.Cast);

            return(castExpression);
        }
예제 #8
0
        public override object VisitCollectionInitializerExpression(CollectionInitializerExpression collectionInitializerExpression, object data)
        {
            // used for implicitly typed arrays
            if (collectionInitializerExpression.CreateExpressions.Count == 0)
            {
                return(null);
            }
            IReturnType combinedRT = ResolveType(collectionInitializerExpression.CreateExpressions[0]);

            for (int i = 1; i < collectionInitializerExpression.CreateExpressions.Count; i++)
            {
                IReturnType rt = ResolveType(collectionInitializerExpression.CreateExpressions[i]);
                combinedRT = MemberLookupHelper.GetCommonType(resolver.ProjectContent, combinedRT, rt);
            }
            if (combinedRT == null)
            {
                return(null);
            }
            return(CreateResolveResult(new ArrayReturnType(resolver.ProjectContent, combinedRT, 1)));
        }
예제 #9
0
        private static AbstractExpression ReadCollectionInitializer(IObjectOrCollectionInitializerOperation op)
        {
            var context = CodeReaderContext.GetContextOrThrow();
            var result  = new CollectionInitializerExpression {
                Items = op.Initializers.Select(readInitializer).ToList()
            };

            return(result);

            CollectionInitializerExpression.ItemInitializer readInitializer(IOperation initOp)
            {
                if (initOp is IInvocationOperation invocation)
                {
                    var item = new CollectionInitializerExpression.ItemInitializer();
                    item.ItemArguments.AddRange(invocation.Arguments.Select(arg => ReadExpression(arg.Value)));
                    return(item);
                }

                throw new CodeReadErrorException($"Unrecognized collection initializer: {initOp.Syntax}");
            }
        }
예제 #10
0
        public override object VisitCollectionInitializerExpression(CollectionInitializerExpression collectionInitializerExpression, object data)
        {
            if (collectionInitializerExpression.CreateExpressions.Count == 0)
            {
                return(null);
            }
            DomReturnType type       = null;
            IType         typeObject = null;

            for (int i = 0; i < collectionInitializerExpression.CreateExpressions.Count; i++)
            {
                DomReturnType curType = (DomReturnType)ResolveType(collectionInitializerExpression.CreateExpressions[i]);
                // if we found object or we have only one create expression we can stop
                if (curType.DecoratedFullName == DomReturnType.Object.DecoratedFullName || collectionInitializerExpression.CreateExpressions.Count == 1)
                {
                    type = curType;
                    break;
                }
                IType curTypeObject = resolver.Dom.GetType(curType);
                if (curTypeObject == null)
                {
                    continue;
                }
                if (type == null || resolver.Dom.GetInheritanceTree(typeObject).Any(t => t.DecoratedFullName == curTypeObject.DecoratedFullName))
                {
                    type       = curType;
                    typeObject = curTypeObject;
                }
            }

            if (type != null)
            {
                type.ArrayDimensions++;
            }
            return(CreateResult(type));
        }
예제 #11
0
        IType CreateAnonymousClass(CollectionInitializerExpression initializer)
        {
            DomType result;

            if (!anonymousTypes.TryGetValue(initializer, out result))
            {
                result = new AnonymousType();
                result.SourceProjectDom = resolver.Dom;
                foreach (Expression expr in initializer.CreateExpressions)
                {
                    var oldPos = resolver.ResolvePosition;
                    if (!expr.StartLocation.IsEmpty)
                    {
                        resolver.resolvePosition = new DomLocation(expr.StartLocation.Line + resolver.CallingMember.Location.Line - 1, expr.StartLocation.Column - 1);
                    }
                    DomProperty newProperty = new DomProperty(GetAnonymousTypeFieldName(expr), MonoDevelop.Projects.Dom.Modifiers.Public, DomLocation.Empty, DomRegion.Empty, ResolveType(expr));
                    newProperty.DeclaringType = result;
                    result.Add(newProperty);
                    resolver.resolvePosition = oldPos;
                }
                anonymousTypes[initializer] = result;
            }
            return(result);
        }
예제 #12
0
	void ObjectCreateExpression(
#line  1935 "VBNET.ATG" 
out Expression oce) {

#line  1937 "VBNET.ATG" 
		TypeReference type = null;
		Expression initializer = null;
		List<Expression> arguments = null;
		ArrayList dimensions = null;
		oce = null;
		bool canBeNormal; bool canBeReDim;
		
		Expect(148);
		if (StartOf(7)) {
			NonArrayTypeName(
#line  1945 "VBNET.ATG" 
out type, false);
			if (la.kind == 25) {
				lexer.NextToken();
				NormalOrReDimArgumentList(
#line  1946 "VBNET.ATG" 
out arguments, out canBeNormal, out canBeReDim);
				Expect(26);
				if (la.kind == 23 || 
#line  1947 "VBNET.ATG" 
la.kind == Tokens.OpenParenthesis) {
					if (
#line  1947 "VBNET.ATG" 
la.kind == Tokens.OpenParenthesis) {
						ArrayTypeModifiers(
#line  1948 "VBNET.ATG" 
out dimensions);
						CollectionInitializer(
#line  1949 "VBNET.ATG" 
out initializer);
					} else {
						CollectionInitializer(
#line  1950 "VBNET.ATG" 
out initializer);
					}
				}

#line  1952 "VBNET.ATG" 
				if (canBeReDim && !canBeNormal && initializer == null) initializer = new CollectionInitializerExpression(); 
			}
		}

#line  1956 "VBNET.ATG" 
		if (initializer == null) {
		oce = new ObjectCreateExpression(type, arguments);
		} else {
			if (dimensions == null) dimensions = new ArrayList();
			dimensions.Insert(0, (arguments == null) ? 0 : Math.Max(arguments.Count - 1, 0));
			type.RankSpecifier = (int[])dimensions.ToArray(typeof(int));
			ArrayCreateExpression ace = new ArrayCreateExpression(type, initializer as CollectionInitializerExpression);
			ace.Arguments = arguments;
			oce = ace;
		}
		
		if (la.kind == 218) {

#line  1970 "VBNET.ATG" 
			NamedArgumentExpression memberInitializer = null;
			
			lexer.NextToken();

#line  1974 "VBNET.ATG" 
			CollectionInitializerExpression memberInitializers = new CollectionInitializerExpression();
			memberInitializers.StartLocation = la.Location;
			
			Expect(23);
			MemberInitializer(
#line  1978 "VBNET.ATG" 
out memberInitializer);

#line  1979 "VBNET.ATG" 
			memberInitializers.CreateExpressions.Add(memberInitializer); 
			while (la.kind == 12) {
				lexer.NextToken();
				MemberInitializer(
#line  1981 "VBNET.ATG" 
out memberInitializer);

#line  1982 "VBNET.ATG" 
				memberInitializers.CreateExpressions.Add(memberInitializer); 
			}
			Expect(24);

#line  1986 "VBNET.ATG" 
			memberInitializers.EndLocation = t.Location;
			if(oce is ObjectCreateExpression)
			{
				((ObjectCreateExpression)oce).ObjectInitializer = memberInitializers;
			}
			
		}
	}
		public virtual object VisitCollectionInitializerExpression(CollectionInitializerExpression collectionInitializerExpression, object data) {
			Debug.Assert((collectionInitializerExpression != null));
			Debug.Assert((collectionInitializerExpression.CreateExpressions != null));
			for (int i = 0; i < collectionInitializerExpression.CreateExpressions.Count; i++) {
				Expression o = collectionInitializerExpression.CreateExpressions[i];
				Debug.Assert(o != null);
				nodeStack.Push(o);
				o.AcceptVisitor(this, data);
				o = (Expression)nodeStack.Pop();
				if (o == null)
					collectionInitializerExpression.CreateExpressions.RemoveAt(i--);
				else
					collectionInitializerExpression.CreateExpressions[i] = o;
			}
			return null;
		}
		public virtual object VisitCollectionInitializerExpression(CollectionInitializerExpression collectionInitializerExpression, object data) {
			throw new global::System.NotImplementedException("CollectionInitializerExpression");
		}
 private bool IsMatch(CollectionInitializerExpression left, CollectionInitializerExpression right)
 {
     return(true);
 }
 public object VisitCollectionInitializerExpression(CollectionInitializerExpression collectionInitializerExpression, object data)
 {
     throw new NotImplementedException();
 }
예제 #17
0
		public virtual object VisitCollectionInitializerExpression(CollectionInitializerExpression collectionInitializerExpression, object data) {
			Debug.Assert((collectionInitializerExpression != null));
			Debug.Assert((collectionInitializerExpression.CreateExpressions != null));
			foreach (Expression o in collectionInitializerExpression.CreateExpressions) {
				Debug.Assert(o != null);
				o.AcceptVisitor(this, data);
			}
			return null;
		}
		public virtual object TrackedVisitCollectionInitializerExpression(CollectionInitializerExpression collectionInitializerExpression, object data) {
			return base.VisitCollectionInitializerExpression(collectionInitializerExpression, data);
		}
예제 #19
0
	void CollectionInitializer(
#line  1403 "cs.ATG" 
out Expression outExpr) {

#line  1405 "cs.ATG" 
		Expression expr = null;
		CollectionInitializerExpression initializer = new CollectionInitializerExpression();
		
		Expect(16);

#line  1409 "cs.ATG" 
		initializer.StartLocation = t.Location; 
		if (StartOf(31)) {
			VariableInitializer(
#line  1410 "cs.ATG" 
out expr);

#line  1411 "cs.ATG" 
			SafeAdd(initializer, initializer.CreateExpressions, expr); 
			while (
#line  1412 "cs.ATG" 
NotFinalComma()) {
				Expect(14);
				VariableInitializer(
#line  1413 "cs.ATG" 
out expr);

#line  1414 "cs.ATG" 
				SafeAdd(initializer, initializer.CreateExpressions, expr); 
			}
			if (la.kind == 14) {
				lexer.NextToken();
			}
		}
		Expect(17);

#line  1418 "cs.ATG" 
		initializer.EndLocation = t.Location; outExpr = initializer; 
	}
예제 #20
0
 B.ArrayLiteralExpression ConvertArrayLiteralExpression(CollectionInitializerExpression aie)
 {
     B.ArrayLiteralExpression dims = new B.ArrayLiteralExpression(GetLexicalInfo(aie));
     ConvertExpressions(aie.CreateExpressions, dims.Items);
     return(dims);
 }
예제 #21
0
	void CollectionOrObjectInitializer(
#line  1421 "cs.ATG" 
out Expression outExpr) {

#line  1423 "cs.ATG" 
		Expression expr = null;
		CollectionInitializerExpression initializer = new CollectionInitializerExpression();
		
		Expect(16);

#line  1427 "cs.ATG" 
		initializer.StartLocation = t.Location; 
		if (StartOf(31)) {
			ObjectPropertyInitializerOrVariableInitializer(
#line  1428 "cs.ATG" 
out expr);

#line  1429 "cs.ATG" 
			SafeAdd(initializer, initializer.CreateExpressions, expr); 
			while (
#line  1430 "cs.ATG" 
NotFinalComma()) {
				Expect(14);
				ObjectPropertyInitializerOrVariableInitializer(
#line  1431 "cs.ATG" 
out expr);

#line  1432 "cs.ATG" 
				SafeAdd(initializer, initializer.CreateExpressions, expr); 
			}
			if (la.kind == 14) {
				lexer.NextToken();
			}
		}
		Expect(17);

#line  1436 "cs.ATG" 
		initializer.EndLocation = t.Location; outExpr = initializer; 
	}
예제 #22
0
 public virtual CollectionInitializerExpression RewriteCollectionInitializerExpression(CollectionInitializerExpression expression)
 {
     return(expression);
 }
예제 #23
0
 public override object VisitCollectionInitializerExpression(CollectionInitializerExpression collectionInitializerExpression, object data)
 {
     WriteLine("VisitCollectionInitializerExpression");
     return(base.VisitCollectionInitializerExpression(collectionInitializerExpression, data));
 }
예제 #24
0
 public virtual void VisitCollectionInitializerExpression(CollectionInitializerExpression expression)
 {
     VisitAbstractExpression(expression);
 }
예제 #25
0
 public object VisitCollectionInitializerExpression(CollectionInitializerExpression aie, object data)
 {
     return(ConvertArrayLiteralExpression(aie));
 }
예제 #26
0
	void CollectionInitializer(
#line  1511 "VBNET.ATG" 
out Expression outExpr) {

#line  1513 "VBNET.ATG" 
		Expression expr = null;
		CollectionInitializerExpression initializer = new CollectionInitializerExpression();
		
		Expect(23);
		if (StartOf(30)) {
			VariableInitializer(
#line  1518 "VBNET.ATG" 
out expr);

#line  1520 "VBNET.ATG" 
			if (expr != null) { initializer.CreateExpressions.Add(expr); }
			
			while (
#line  1523 "VBNET.ATG" 
NotFinalComma()) {
				Expect(12);
				VariableInitializer(
#line  1523 "VBNET.ATG" 
out expr);

#line  1524 "VBNET.ATG" 
				if (expr != null) { initializer.CreateExpressions.Add(expr); } 
			}
		}
		Expect(24);

#line  1527 "VBNET.ATG" 
		outExpr = initializer; 
	}
예제 #27
0
 public virtual object VisitCollectionInitializerExpression(CollectionInitializerExpression collectionInitializerExpression, object data)
 {
     throw new global::System.NotImplementedException("CollectionInitializerExpression");
 }
		public sealed override object VisitCollectionInitializerExpression(CollectionInitializerExpression collectionInitializerExpression, object data) {
			BeginVisit(collectionInitializerExpression);
			object result = TrackedVisitCollectionInitializerExpression(collectionInitializerExpression, data);
			EndVisit(collectionInitializerExpression);
			return result;
		}