public RenamedItem(NanoXmlElement el, RenamedClass owner)
    {
      try
      {
        this.owner = owner;
        entityType = (EntityType)Enum.Parse(typeof (EntityType), el.Name.Substring(7));
        string str = el.GetAttribute("oldName");

        int i;
        if ((i = str.IndexOf(' ')) != -1)
        {
          string s = str.Substring(0, i);
          int k = s.IndexOf('/');
          if (k != -1)
            resultType = new Renamed(s.Substring(0, k) + "." + s.Substring(k + 1));
          else
            resultType = new Renamed(s);
          str = str.Substring(i + 1);
        }

        if ((i = str.IndexOf("::")) != -1)
          str = str.Substring(i + 2);

        if ((i = str.IndexOf('(')) != -1)
        {
          methodParams = new List<Renamed>();
          foreach (string s in EntityName.ParseList(str, i + 1, ')'))
          {
            int k = s.IndexOf('/');
            if (k != -1)
              methodParams.Add(new Renamed(s.Substring(0, k) + "." + s.Substring(k + 1)));
            else
              methodParams.Add(new Renamed(s));
          }

          str = str.Substring(0, i);

          i = str.IndexOf('[');
          if (i != -1 && str[i + 2] == ']')
            str = str.Substring(0, i);
        }

        string strNew = el.GetAttribute("newName");
        if (strNew != "dropped")
          name = new Renamed(str, strNew);
        else
          name = new Renamed(str);
      }
      catch (Exception e)
      {
        throw new ObfuscarParserException("Failed to process item element", e, el.Path);
      }
    }
    private void LoadFile()
    {      
      Stopwatch sw = new Stopwatch();
      sw.Start();
      NanoXmlDocument xml = NanoXmlDocument.LoadFromFile(filename);

      timingXML = sw.ElapsedMilliseconds;
      Debug.WriteLine("XML Loading: " + timingXML + " ms");
      sw.Reset();
      sw.Start();

      NanoXmlElement doc = xml.DocumentElement;
      NanoXmlElement types = (NanoXmlElement)doc["renamedTypes"];

      modules.Clear();
      namespaces.Clear();
      namespacesObfuscated.Clear();
      classes.Clear();
      haveSystemEntities = false;
      methodsCount = classesCount = subclassesCount = skippedCount = 0;
      lastModified = File.GetLastWriteTime(filename);

      List<RenamedClass> subclasses = new List<RenamedClass>();

      if (types != null)
        foreach (NanoXmlElement element in types.ChildElements)
        {
          if (string.Compare(element.Name, "renamedClass", StringComparison.Ordinal) == 0)
          {
            RenamedClass c = new RenamedClass(element, this);
            classesCount++;
            if (c.OwnerClassName == null)
            {
              classes.Add(c);
              if (c.Name.NameOld != null && c.Name.NameOld.Namespace != null)
                haveSystemEntities |= c.Name.NameOld.Namespace.StartsWith("System.");
            }
            else
              subclasses.Add(c);

            methodsCount += c.MethodsCount;
            if (c.ModuleNew != null && !modules.Contains(c.ModuleNew))
              modules.Add(c.ModuleNew);
            if (c.Name.NameOld != null && !string.IsNullOrEmpty(c.Name.NameOld.Namespace) && !namespaces.Contains(c.Name.NameOld.Namespace))
              namespaces.Add(c.Name.NameOld.Namespace);
            if (c.Name.NameNew != null && !string.IsNullOrEmpty(c.Name.NameNew.Namespace) && !namespacesObfuscated.Contains(c.Name.NameNew.Namespace))
              namespacesObfuscated.Add(c.Name.NameNew.Namespace);
          }
        }

      types = (NanoXmlElement)doc["skippedTypes"];
      if (types != null)
        foreach (NanoXmlElement element in types.ChildElements)
          if (string.Compare(element.Name, "skippedClass", StringComparison.Ordinal) == 0)
          {
            skippedCount++;
            classesCount++;
            RenamedClass c = new RenamedClass(element, this);
            if (c.OwnerClassName == null)
              classes.Add(c);
            else
              subclasses.Add(c);
          }


      timingParsing = sw.ElapsedMilliseconds;
      Debug.WriteLine("Parsing: " + timingParsing + " ms");
      sw.Reset();
      sw.Start();

      foreach (RenamedClass subclass in subclasses)
      {
        RenamedClass c = (RenamedClass)SearchForOldName(subclass.OwnerClassName);
        if (c == null)
          c = (RenamedClass)SearchForNewName(subclass.OwnerClassName);

        if (c != null)
        {
          c.Items.Add(subclass);
          subclass.OwnerClass = c;
          subclassesCount++;
          continue;
        }

        Debug.WriteLine("Failed to find root class: " + subclass.OwnerClassName);
        classes.Add(subclass);
      }

      timingSubclasses = sw.ElapsedMilliseconds;
      Debug.WriteLine("Subclasses processing: " + timingSubclasses + " ms");
      sw.Reset();
      sw.Start();

      foreach (RenamedClass c in classes)
        c.UpdateNewNames(this);

      timingUpdateNewNames = sw.ElapsedMilliseconds;
      Debug.WriteLine("Values updating: " + timingUpdateNewNames + " ms");
      Debug.WriteLine("Total elapsed: " + TimingTotal + " ms");
      sw.Stop();
    }
        private void LoadFile(IMappingReader reader)
        {
            loadTime = 0;
            LoadTimer timer = new LoadTimer("File Parsing");

            reader.Load();

            loadTime += timer.Stop();
            timer     = new LoadTimer("Items Processing");

            modules.Clear();
            namespaces.Clear();
            namespacesObfuscated.Clear();
            classes.Clear();
            classesCache.Clear();
            haveSystemEntities = false;
            methodsCount       = classesCount = subclassesCount = skippedCount = 0;

            List <RenamedClass> subclasses = new List <RenamedClass>();

            foreach (IMappingEntity entity in reader.Entities)
            {
                if (entity.Type == EntityType.Resource)
                {
                    RenamedResource resource = new RenamedResource(entity);
                    resources.Add(resource);
                    continue;
                }

                RenamedClass c = new RenamedClass(entity, this);
                classesCount++;

                if (c.SkipReason != null)
                {
                    skippedCount++;
                }

                if (c.OwnerClassName == null)
                {
                    classes.Add(c);
                    if (c.Name.NameOld != null && c.Name.NameOld.Namespace != null)
                    {
                        haveSystemEntities |= c.Name.NameOld.Namespace.StartsWith("System.");
                    }
                }
                else
                {
                    subclasses.Add(c);
                }

                methodsCount += c.MethodsCount;

                if (c.ModuleNew != null)
                {
                    modules.Add(c.ModuleNew);
                }
                if (c.Name.NameOld != null)
                {
                    classesCache[c.NameOld]     = c;
                    classesCache[c.NameOldFull] = c;

                    if (!string.IsNullOrEmpty(c.Name.NameOld.Namespace))
                    {
                        namespaces.Add(c.Name.NameOld.Namespace);
                    }
                }
                if (c.Name.NameNew != null)
                {
                    classesCache[c.NameNew]     = c;
                    classesCache[c.NameNewFull] = c;

                    if (!string.IsNullOrEmpty(c.Name.NameNew.Namespace))
                    {
                        namespacesObfuscated.Add(c.Name.NameNew.Namespace);
                    }
                }
            }

            loadTime += timer.Stop();
            timer     = new LoadTimer("Subclasses Processing");

            foreach (RenamedClass subclass in subclasses)
            {
                RenamedClass c;
                if (classesCache.TryGetValue(subclass.OwnerClassName, out c))
                {
                    c.Items.Add(subclass);
                    subclass.OwnerClass = c;
                    subclassesCount++;
                    continue;
                }

                Debug.WriteLine("Failed to find root class: " + subclass.OwnerClassName);
                classes.Add(subclass);
            }

            loadTime += timer.Stop();
            timer     = new LoadTimer("Values Updating");

            foreach (RenamedClass c in classes)
            {
                c.UpdateNewNames(this);
            }

            loadTime += timer.Stop();
            Debug.WriteLine("Total Elapsed: {0} ms", loadTime);
        }