private static bool IsSelfAssign(IAssignableReference sstRef, IAssignableExpression sstExpr) { // TODO add test! var refExpr = sstExpr as KaVE.Commons.Model.SSTs.Expressions.Simple.IReferenceExpression; return(refExpr != null && sstRef.Equals(refExpr.Reference)); }
protected static IAssignment Assign(IAssignableReference reference, IAssignableExpression expr) { return(new Assignment { Reference = reference, Expression = expr }); }
public virtual IAssignableReference Anonymize([NotNull] IAssignableReference aref) { return((IAssignableReference)aref.Accept(this, 0)); }
public override IAssignableExpression VisitObjectCreationExpression(IObjectCreationExpression expr, IList <IStatement> body) { var r = expr.ConstructorReference.Resolve(); if (r.IsValid() && r.DeclaredElement != null) { var methodName = r.DeclaredElement.GetName <IMethodName>(r.Result.Substitution); Asserts.That(methodName.IsConstructor); var parameters = Lists.NewList <ISimpleExpression>(); foreach (var argument in expr.Arguments) { var parameter = ToSimpleExpression(argument.Value, body); parameters.Add(parameter); } var sstInv = new InvocationExpression { MethodName = methodName, Parameters = parameters }; var oInit = expr.Initializer as IObjectInitializer; var cInit = expr.Initializer as ICollectionInitializer; if (oInit != null || cInit != null) { var varDeclName = GetNameFromDeclaration(expr); IVariableReference newVar; if (varDeclName != null) { newVar = new VariableReference { Identifier = varDeclName }; } else { newVar = new VariableReference { Identifier = _nameGen.GetNextVariableName() }; body.Add( new VariableDeclaration { Reference = newVar, Type = sstInv.MethodName.DeclaringType }); } body.Add( new Assignment { Reference = newVar, Expression = sstInv }); if (oInit != null) { foreach (var mInit in oInit.MemberInitializersEnumerable) { IAssignableReference reference = null; var rr = mInit.Reference.Resolve(); var elem = rr.DeclaredElement; var typeMember = elem as ITypeMember; if (typeMember != null) { reference = ToReference(typeMember, newVar) as IAssignableReference; } if (reference == null) { reference = new UnknownReference(); } // check that operator is "=" if (mInit.Expression != null) { body.Add( new Assignment { Reference = reference, Expression = ToAssignableExpr(mInit.Expression, body) }); } else { var prop = elem as IProperty; var pInit = mInit as IPropertyInitializer; if (prop != null && pInit != null && pInit.Initializer != null) { var nextVar = new VariableReference { Identifier = _nameGen.GetNextVariableName() }; body.Add( new VariableDeclaration { Reference = nextVar, Type = prop.ReturnType.GetName() }); body.Add( new Assignment { Reference = nextVar, Expression = new ReferenceExpression { Reference = reference } }); ISubstitution substitution = EmptySubstitution.INSTANCE; var ctype = pInit.Initializer.ConstructedType as IDeclaredType; if (ctype != null) { var rctype = ctype.Resolve(); substitution = rctype.Substitution; } var addName = FindAdd(prop, substitution); foreach (var eInit in pInit.Initializer.InitializerElements) { var ceInit = eInit as ICollectionElementInitializer; if (ceInit != null) { foreach (var arg in ceInit.Arguments) { body.Add( new ExpressionStatement { Expression = new InvocationExpression { Reference = nextVar, MethodName = addName, Parameters = { ToSimpleExpression(arg.Value, body) } } }); } } } } } } } if (cInit != null) { var m = r.DeclaredElement as IConstructor; var addName = FindAdd(m, r.Result.Substitution) ?? Names.UnknownMethod; foreach (var eInit in cInit.ElementInitializersEnumerable) { foreach (var arg in eInit.Arguments) { body.Add( new ExpressionStatement { Expression = new InvocationExpression { Reference = newVar, MethodName = addName, Parameters = { ToSimpleExpression(arg.Value, body) } } }); } } } return(new ReferenceExpression { Reference = newVar }); } return(sstInv); } return(new InvocationExpression { MethodName = Names.UnknownMethod }); }