private static NameWrapper AddNameToUniqueStrings(string name, Dictionary <string, string> dontShortenStrings,
                                                          CaseInsensitiveDictionary <StringWrapper> uniqueStrings)
        {
            NameWrapper nameWrapper = new NameWrapper();

            List <string> nameStrings = StringUtils.SplitAndReallyRemoveEmptyEntries(name, Utils.NAME_SEPARATOR, StringComparison.OrdinalIgnoreCase);

            foreach (string nameString in nameStrings)
            {
                bool          canShorten = !dontShortenStrings.ContainsKey(nameString);
                StringWrapper stringWrapper;
                if (uniqueStrings.TryGetValue(nameString, out stringWrapper))
                {
                    DebugUtils.AssertDebuggerBreak(stringWrapper.CanShorten == canShorten);
                }
                else
                {
                    stringWrapper = new StringWrapper(nameString, canShorten);
                    uniqueStrings.Add(nameString, stringWrapper);
                }
                nameWrapper.AddString(stringWrapper);
            }

            return(nameWrapper);
        }
        private static CaseInsensitiveDictionary <StringWrapper> GetUniqueStrings(IDictionary <string, Table> tables, List <KeyValuePair <string, string> > nameReplacements,
                                                                                  out Dictionary <Table, NameWrapper> tableNames,
                                                                                  out Dictionary <Column, NameWrapper> columnNames)
        {
            Dictionary <string, string> dontShortenStrings;

            if (nameReplacements == null)
            {
                dontShortenStrings = new Dictionary <string, string>();
            }
            else
            {
                dontShortenStrings = new Dictionary <string, string>(nameReplacements.Count);
                foreach (KeyValuePair <string, string> pair in nameReplacements)
                {
                    dontShortenStrings[pair.Value] = pair.Value;
                }
            }

            CaseInsensitiveDictionary <StringWrapper> uniqueStrings = new CaseInsensitiveDictionary <StringWrapper>();

            tableNames  = new Dictionary <Table, NameWrapper>();
            columnNames = new Dictionary <Column, NameWrapper>();

            foreach (Table table in tables.Values)
            {
                if (!string.IsNullOrEmpty(table.TableNamePrefix))
                {
                    List <string> nameStrings = StringUtils.SplitAndReallyRemoveEmptyEntries(table.TableNamePrefix, Utils.NAME_SEPARATOR,
                                                                                             StringComparison.OrdinalIgnoreCase);

                    foreach (string nameString in nameStrings)
                    {
                        dontShortenStrings[nameString] = nameString;
                    }
                }
            }
            foreach (Table table in tables.Values)
            {
                NameWrapper nameWrapper = AddNameToUniqueStrings(table.TableName, dontShortenStrings, uniqueStrings);
                tableNames.Add(table, nameWrapper);

                foreach (Column column in table.AllColumns)
                {
                    if (!column.IsPrimaryKey && !column.IsForeignKey)
                    {
                        nameWrapper = AddNameToUniqueStrings(column.ColumnName, dontShortenStrings, uniqueStrings);
                        columnNames.Add(column, nameWrapper);
                    }
                }
            }

            return(uniqueStrings);
        }