private void SortFormatTokens_Execute(Object sender, ApplyContentEventArgs ea)
        {
            MethodCallExpression TheStringFormat = _PrimitiveString.Parent as MethodCallExpression;
            string TheString = _PrimitiveString.Name;
            List<Expression> TheArguments = TheStringFormat.Arguments.ToList<Expression>().Skip(1).ToList<Expression>();
            SourceRange TheStringFormatRange = TheStringFormat.Range;

            //Get List of Tokens
            var Tokens = new TokenGatherer().GetTokens(TheString);

            // Determine "Sort" map.
            List<MapItem> Map = MapGenerator.GenerateMap(from item in Tokens select item.Index);

            // Affect string using map
            TheString = new StringTokenRenumberer().Renumber(TheString, Tokens, Map);

            // Affect params using map?
            TheArguments = new ListReorderer().Reorder(TheArguments, Tokens, Map);

            // Write TheString and TheList back to the code.
            TheStringFormat.Arguments.Clear();
            TheStringFormat.Arguments.Add(new PrimitiveExpression(TheString));
            TheStringFormat.Arguments.AddRange(TheArguments);
            string TheNewCode = CodeRush.CodeMod.GenerateCode(TheStringFormat, true);
            ea.TextDocument.SetText(TheStringFormatRange, TheNewCode);
        }
        public void RenumberShuffledListWithDuplicates_Test()
        {
            string Start = "{3}, {0}, {2}, {0}, {1}, {0}";
            string Expected = "{0}, {1}, {2}, {1}, {3}, {1}";

            var Tokens = new TokenGatherer().GetTokens(Start);
            var Map = MapGenerator.GenerateMap(from item in Tokens select item.Index);
            var Result = new StringTokenRenumberer().Renumber(Start, Tokens, Map);

            Assert.AreEqual(Expected, Result);
        }
        private void FixStringAndList(ref string startString, ref List<int> startList)
        {
            // gather Tokens
            var Tokens = new TokenGatherer().GetTokens(startString);

            // Generate map
            List<MapItem> Map = MapGenerator.GenerateMap(from item in Tokens select item.Index);

            // Use map to rebuild string.
            startString = new StringTokenRenumberer().Renumber(startString, Tokens, Map);
            // use Map to rebuild list
            startList = new ListReorderer().Reorder(startList, Tokens, Map);
        }