// propagate (var = new X) forward to the <init> invocation private static bool IsConstructorInvocationRemote(List <Exprent> list, int index) { Exprent current = list[index]; if (current.type == Exprent.Exprent_Assignment) { AssignmentExprent @as = (AssignmentExprent)current; if (@as.GetLeft().type == Exprent.Exprent_Var && @as.GetRight().type == Exprent.Exprent_New) { NewExprent newExpr = (NewExprent)@as.GetRight(); VarType newType = newExpr.GetNewType(); VarVersionPair leftPair = new VarVersionPair((VarExprent)@as.GetLeft()); if (newType.type == ICodeConstants.Type_Object && newType.arrayDim == 0 && newExpr .GetConstructor() == null) { for (int i = index + 1; i < list.Count; i++) { Exprent remote = list[i]; // <init> invocation if (remote.type == Exprent.Exprent_Invocation) { InvocationExprent @in = (InvocationExprent)remote; if (@in.GetFunctype() == InvocationExprent.Typ_Init && @in.GetInstance().type == Exprent.Exprent_Var && @as.GetLeft().Equals(@in.GetInstance())) { newExpr.SetConstructor(@in); @in.SetInstance(null); list[i] = @as.Copy(); return(true); } } // check for variable in use HashSet <VarVersionPair> setVars = remote.GetAllVariables(); if (setVars.Contains(leftPair)) { // variable used somewhere in between -> exit, need a better reduced code return(false); } } } } } return(false); }