private static int ResourceNameComparer(IOldToNewTupleMap <GeneratedProjectOutputInfo> generationProjectInfoMap, string oldName, string newName)
        {
            var isOldNameEmpty = string.IsNullOrWhiteSpace(oldName);
            var isNewNameEmpty = string.IsNullOrWhiteSpace(newName);

            if (!isOldNameEmpty && !isNewNameEmpty)
            {
                oldName = generationProjectInfoMap.OldType.GetRelativePath(oldName);
                newName = generationProjectInfoMap.NewType.GetRelativePath(newName);

                return(string.Compare(oldName, newName, true));
            }

            if (isOldNameEmpty && isNewNameEmpty)
            {
                return(0);
            }

            if (isOldNameEmpty && !isNewNameEmpty)
            {
                return(1);
            }

            return(-1);
        }
 public AssemblyNode(IOldToNewTupleMap <string> map, IReadOnlyList <ModuleNode> modules, IReadOnlyList <ResourceNode> resources)
     : base("", map.GetFirstNotNullItem())
 {
     Map       = map;
     Modules   = modules;
     Resources = resources;
 }
        public AssemblyBrowseTabItem(IOldToNewTupleMap <string> comparableModel)
        {
            APIDiffInfo diffInfo = new APIDiffInfo(APIDiffHelper.GetAPIDifferences(comparableModel.OldType, comparableModel.NewType));

            var generationProjectInfoMap = new OldToNewTupleMap <GeneratedProjectOutputInfo>
                                           (
                new GeneratedProjectOutputInfo(comparableModel.OldType),
                new GeneratedProjectOutputInfo(comparableModel.NewType)
                                           );

            FilterSettings filterSettings = new FilterSettings(this.ShowAllUnmodified);

            this.nodes = new AssemblyNode[] {
                new AssemblyNode(comparableModel, null, null, this, filterSettings)
                {
                    GenerationProjectInfoMap = generationProjectInfoMap
                }
            };

            this.header  = GetTabTitle(comparableModel);
            this.toolTip = GetTabToolTip(comparableModel);

            this.nodes[0].ChildrenLoaded += OnAssemblyNodeChildrenLoaded;
            this.contentLoaded            = new bool[2];
        }
示例#4
0
        public AssemblyNode CreateAssemblyNode(IOldToNewTupleMap <string> assemblyMap)
        {
            var generationProjectInfoMap = new OldToNewTupleMap <GeneratedProjectOutputInfo>
                                           (
                new GeneratedProjectOutputInfo(assemblyMap.OldType),
                new GeneratedProjectOutputInfo(assemblyMap.NewType)
                                           );

            Console.Write("Loading old assembly...");
            var assemblyDecompilationResultOld = GetAssemblyDecompilationResult(
                assemblyMap.OldType,
                generationProjectInfoMap.OldType.OutputPath,
                CancellationToken.None);

            GlobalDecompilationResultsRepository.Instance.AddDecompilationResult(assemblyMap.OldType, assemblyDecompilationResultOld);
            Console.WriteLine("done.");

            Console.Write("Loading new assembly...");
            var assemblyDecompilationResultNew = GetAssemblyDecompilationResult(
                assemblyMap.NewType,
                generationProjectInfoMap.NewType.OutputPath,
                CancellationToken.None);

            GlobalDecompilationResultsRepository.Instance.AddDecompilationResult(assemblyMap.NewType, assemblyDecompilationResultNew);
            Console.WriteLine("done.");

            return(AssemblyNode.Create(assemblyMap, generationProjectInfoMap));
        }
示例#5
0
 public ModuleNode(AssemblyNode parent, IOldToNewTupleMap <ModuleMetadata> map, IReadOnlyList <NamespaceNode> namespaces)
     : base(parent, "", map.GetFirstNotNullItem().GetName())
 {
     Parent     = parent;
     Map        = map;
     Namespaces = namespaces;
 }
示例#6
0
 public ResourceMergeManager(IOldToNewTupleMap <ICollection <string> > resourcesMap, Comparison <string> oldResourceNameComparer, Comparison <string> newResourceNameComparer,
                             Comparison <string> resourceNameComparer)
     : base(resourcesMap)
 {
     this.oldResourceNameComparer = oldResourceNameComparer;
     this.newResourceNameComparer = newResourceNameComparer;
     this.resourceNameComparer    = resourceNameComparer;
 }
示例#7
0
        public DefaultResourceNode(IOldToNewTupleMap <string> typesMap, ItemNodeBase parent, IOldToNewTupleMap <GeneratedProjectOutputInfo> generationProjectInfoMap, FilterSettings filterSettings)
            : base("Resources", parent, filterSettings)
        {
            this.typesMap = typesMap;
            this.GenerationProjectInfoMap = generationProjectInfoMap;

            this.IsExpanded = true;
        }
        private FolderNode ProcessFolderNodeCreation(IOldToNewTupleMap <string> typesMap)
        {
            APIDiffInfo diffInfo = this.apiDiffInfo == null ? null : new APIDiffInfo(null);

            var folderNode = new FolderNode(typesMap, this, diffInfo, progressNotifier, this.FilterSettings, false);

            return(folderNode);
        }
示例#9
0
        public ModuleNode(IOldToNewTupleMap <ModuleMetadata> modulesMap, ItemNodeBase parent, APIDiffInfo apiDiffInfo, bool shouldBeExpanded, FilterSettings filterSettings)
            : base(GetName(modulesMap), parent, apiDiffInfo, filterSettings)
        {
            this.ModulesMap = modulesMap;

            this.differenceDecoration = GetDifferenceDecoration();

            this.IsExpanded = shouldBeExpanded;
        }
示例#10
0
        public AssemblyNode(IOldToNewTupleMap <string> typesMap, ItemNodeBase parent, APIDiffInfo apiDiffInfo, IProgressNotifier progressNotifier, FilterSettings filterSettings)
            : base(Path.GetFileName(typesMap.GetFirstNotNullItem()), parent, apiDiffInfo, filterSettings)
        {
            this.TypesMap = typesMap;

            this.progressNotifier = progressNotifier;

            this.areChildrenLoaded = false;
        }
示例#11
0
        public MemberNode(IOldToNewTupleMap <MemberMetadata> membersMap, ItemNodeBase parent, APIDiffInfo apiDiffInfo, FilterSettings filterSettings)
            : base(membersMap.GetFirstNotNullItem().GetSignature(), parent, apiDiffInfo, filterSettings)
        {
            this.membersMap = membersMap;

            this.differenceDecoration = GetDifferenceDecoration();

            // This node has no child items, so this removes the expander.
            this.LazyLoading = false;
        }
示例#12
0
        public ResourceNode(IOldToNewTupleMap <string> resourceMap, ItemNodeBase parent, FilterSettings filterSettings)
            : base(GetResourceName(resourceMap.GetFirstNotNullItem()), parent, filterSettings)
        {
            this.ResourceMap = resourceMap;

            this.differenceDecoration = GetDifferenceDecoration();

            // This node has no child items, so this removes the expander.
            this.LazyLoading = false;
        }
示例#13
0
 public TypeNode(
     TypeNode parent,
     IOldToNewTupleMap <TypeMetadata> map,
     IReadOnlyList <MemberNodeBase> members)
     : base(parent, map)
 {
     Parent  = parent;
     Map     = map;
     Members = members;
 }
示例#14
0
        public XamlResourceNode(IOldToNewTupleMap <string> resourceMap, string name, ItemNodeBase parent, FilterSettings filterSettings)
            : base(name, parent, null, filterSettings)
        {
            this.ResourceMap = resourceMap;

            this.differenceDecoration = this.GetDifferenceDecoration();

            // This node has no child items, so this removes the expander.
            this.LazyLoading = false;
        }
示例#15
0
 protected MemberNodeBase(
     NamespaceNode parent,
     IOldToNewTupleMap <MemberDefinitionMetadataBase> map,
     IDecompilationResults oldDecompileResult,
     IDecompilationResults newDecompileResult)
     : base(parent, parent.Namespace, map.GetFirstNotNullItem().GetName())
 {
     Map = map;
     OldDecompileResult = oldDecompileResult;
     NewDecompileResult = newDecompileResult;
 }
示例#16
0
        public FolderBrowseTabItem(IOldToNewTupleMap <string> tupleMap)
        {
            FilterSettings filterSettings = new FilterSettings(this.ShowAllUnmodified);

            this.nodes = new ItemNodeBase[] {
                new FolderNode(tupleMap, null, null, this, filterSettings, true)
            };

            this.header  = GetTabTitle(tupleMap);
            this.toolTip = GetTabToolTip(tupleMap);
        }
示例#17
0
 private string GetResourceName(IOldToNewTupleMap <string> resourceMap)
 {
     if (resourceMap.OldType != null)
     {
         return(this.GenerationProjectInfoMap.OldType.GetRelativePath(resourceMap.OldType));
     }
     else
     {
         return(this.GenerationProjectInfoMap.NewType.GetRelativePath(resourceMap.NewType));
     }
 }
示例#18
0
        protected MemberNodeBase(NestedTypeNode parent, IOldToNewTupleMap <MemberDefinitionMetadataBase> map)
            : base(parent, parent.GetNamespaceIncludingName(), map.GetFirstNotNullItem().GetName())
        {
            Map = map;

            if (parent != null)
            {
                OldDecompileResult = parent.OldDecompileResult;
                NewDecompileResult = parent.NewDecompileResult;
            }
        }
示例#19
0
        public FolderNode(IOldToNewTupleMap <string> folderMap, ItemNodeBase parent, APIDiffInfo apiDiffInfo, IProgressNotifier progressNotifier, FilterSettings filterSettings, bool loadChildrenAsync)
            : base(GetName(folderMap), parent, apiDiffInfo, filterSettings)
        {
            this.folderMap = folderMap;

            this.progressNotifier = progressNotifier;

            // This line needs to be before this.IsExpanded = true; in any case.
            this.loadChildrenAsync = loadChildrenAsync;

            this.IsExpanded = true;
        }
示例#20
0
 public TypeNode(
     NamespaceNode parent,
     IOldToNewTupleMap <TypeMetadata> map,
     IReadOnlyList <MemberNodeBase> members,
     IDecompilationResults oldDecompileResult,
     IDecompilationResults newDecompileResult)
     : base(parent, map, oldDecompileResult, newDecompileResult)
 {
     Parent  = parent;
     Map     = map;
     Members = members;
 }
示例#21
0
        public static TypeNode Create(NamespaceNode parent, IOldToNewTupleMap <TypeMetadata> map)
        {
            var oldTypeMetadata = map.OldType;
            var newTypeMetadata = map.NewType;

            IDecompilationResults oldResult = null;
            IDecompilationResults newResult = null;

            IDecompilationResults result;

            if (oldTypeMetadata != null &&
                GlobalDecompilationResultsRepository.Instance.TryGetDecompilationResult(
                    oldTypeMetadata.AssemblyPath,
                    oldTypeMetadata.Module.TokenId,
                    oldTypeMetadata.TokenId,
                    out result))
            {
                oldResult = result;
            }

            if (newTypeMetadata != null &&
                GlobalDecompilationResultsRepository.Instance.TryGetDecompilationResult(
                    newTypeMetadata.AssemblyPath,
                    newTypeMetadata.Module.TokenId,
                    newTypeMetadata.TokenId,
                    out result))
            {
                newResult = result;
            }

            var typeNode = new TypeNode(parent, map, new MemberNodeBase[0], oldResult, newResult);

            var memberManager = new MemberMergeManager(map);
            var members       = memberManager.GetMergedCollection().Select <IOldToNewTupleMap <MemberDefinitionMetadataBase>, MemberNodeBase> (
                e =>
            {
                if (e.GetFirstNotNullItem().MemberType == MemberType.Type)
                {
                    return(NestedTypeNode.Create(
                               typeNode,
                               new OldToNewTupleMap <TypeMetadata> ((TypeMetadata)e.OldType, (TypeMetadata)e.NewType)));
                }
                return(new MemberNode(
                           typeNode,
                           new OldToNewTupleMap <MemberMetadata> ((MemberMetadata)e.OldType, (MemberMetadata)e.NewType)));
            }).ToArray();

            typeNode.Members = members;


            return(typeNode);
        }
示例#22
0
        private ItemNodeBase GetResourceNode(IOldToNewTupleMap <string> resourceMap)
        {
            string resourceFile = Path.GetExtension(resourceMap.GetFirstNotNullItem()).ToLower();

            switch (resourceFile)
            {
            case ".xaml":
                return(new XamlResourceNode(resourceMap, GetResourceName(resourceMap), this, this.FilterSettings));

            default:
                return(new ResourceNode(resourceMap, this, this.FilterSettings));
            }
        }
示例#23
0
        private DecompiledMemberNodeBase GetItemNodeFromMemberType(IOldToNewTupleMap <MemberDefinitionMetadataBase> membersMap, LoadAPIItemsContext context)
        {
            MemberDefinitionMetadataBase metadata = membersMap.GetFirstNotNullItem();

            APIDiffInfo diffInfo = context.GenerateAPIDiffInfo(membersMap);

            if (metadata.MemberType == MemberType.Type)
            {
                return(new NestedTypeNode((new OldToNewTupleMap <TypeMetadata>((TypeMetadata)membersMap.OldType, (TypeMetadata)membersMap.NewType)), this, diffInfo, this.FilterSettings));
            }
            else
            {
                return(new MemberNode((new OldToNewTupleMap <MemberMetadata>((MemberMetadata)membersMap.OldType, (MemberMetadata)membersMap.NewType)), this, diffInfo, this.FilterSettings));
            }
        }
        public IMetadataDiffItem GetDiffItem(IOldToNewTupleMap <MemberMetadataBase> tuple)
        {
            IMetadataDiffItem oldDiffItem = null;
            IMetadataDiffItem newDiffItem = null;

            if (tuple.OldType == null && tuple.NewType == null)
            {
                throw new ArgumentException();
            }

            if (tuple.OldType != null)
            {
                if (!oldChildrenTokens.TryGetValue(tuple.OldType.TokenId, out oldDiffItem))
                {
                    oldDiffItem = null;
                }
                else
                {
                    oldChildrenTokens.Remove(tuple.OldType.TokenId);
                }
            }

            if (tuple.NewType != null)
            {
                if (!newChildrenTokens.TryGetValue(tuple.NewType.TokenId, out newDiffItem))
                {
                    newDiffItem = null;
                }
                else
                {
                    newChildrenTokens.Remove(tuple.NewType.TokenId);
                }
            }

            if (oldDiffItem != null && newDiffItem != null && oldDiffItem != newDiffItem)
            {
                throw new Exception("Diff item mismatch");
            }

            if (oldDiffItem == null && newDiffItem == null)
            {
                ;
            }

            return(oldDiffItem ?? newDiffItem);
        }
示例#25
0
        public static ModuleNode CreateFromModuleMap(AssemblyNode parent, IOldToNewTupleMap <ModuleMetadata> moduleMap)
        {
            var module = new ModuleNode(parent, moduleMap, new NamespaceNode[0]);

            var types = new TypesMergeManager(moduleMap)
                        .GetMergedCollection()
                        .ToList();

            var namespaces = types.GroupBy(e => e.GetFirstNotNullItem().GetNamespace())
                             .OrderBy(e => e.Key)
                             .Select(e => NamespaceNode.Create(module, e.Key, e.ToArray()))
                             .ToArray();

            module.Namespaces = namespaces;

            return(module);
        }
示例#26
0
        protected string GetTabToolTip(IOldToNewTupleMap <string> comparableModel)
        {
            string oldItemName = string.Empty;
            string newItemName = string.Empty;

            if (comparableModel.OldType != null)
            {
                var oldDirInfo = new DirectoryInfo(comparableModel.OldType);
                oldItemName = oldDirInfo.FullName;
            }
            if (comparableModel.NewType != null)
            {
                var newDirInfo = new DirectoryInfo(comparableModel.NewType);
                newItemName = newDirInfo.FullName;
            }
            return(string.Format("{0} <> {1}", oldItemName, newItemName));
        }
示例#27
0
        private AssemblyNode ProcessAssemblyNodeCreation(IOldToNewTupleMap <string> typesMap)
        {
            APIDiffInfo diffInfo = this.apiDiffInfo != null ? new APIDiffInfo(APIDiffHelper.GetAPIDifferences(typesMap.OldType, typesMap.NewType)) : null;

            var generationProjectInfoMap = new OldToNewTupleMap <GeneratedProjectOutputInfo>
                                           (
                new GeneratedProjectOutputInfo(typesMap.OldType),
                new GeneratedProjectOutputInfo(typesMap.NewType)
                                           );
            var assemblyNode = new AssemblyNode(typesMap, this, diffInfo, progressNotifier, this.FilterSettings)
            {
                GenerationProjectInfoMap = generationProjectInfoMap
            };

            assemblyNode.SetDifferenceDecoration();

            return(assemblyNode);
        }
示例#28
0
        public int GetAssembliesCount(IOldToNewTupleMap <string> folderMap)
        {
            int result = 0;

            string root = folderMap.OldType;

            foreach (var extension in supportedFileExtensions)
            {
                result += Directory.GetFiles(root, "*" + extension, SearchOption.AllDirectories).Length;
            }

            root = folderMap.NewType;
            foreach (var extension in supportedFileExtensions)
            {
                result += Directory.GetFiles(root, "*" + extension, SearchOption.AllDirectories).Length;
            }

            return(result);
        }
        public static AssemblyNode Create(IOldToNewTupleMap <string> assemblyMap, IOldToNewTupleMap <GeneratedProjectOutputInfo> generationProjectInfoMap)
        {
            var assemblyNode = new AssemblyNode(assemblyMap, new ModuleNode[0], new ResourceNode[0]);

            var moduleMergeManager = new ModuleManager(assemblyMap);
            var modulesNodes       = moduleMergeManager.GetMergedCollection()
                                     .Select(tuple => ModuleNode.CreateFromModuleMap(assemblyNode, tuple))
                                     .ToArray();

            assemblyNode.Modules = modulesNodes;

            ICollection <string> oldResources = new Collection <string>();
            ICollection <string> newResources = new Collection <string>();

            IAssemblyDecompilationResults oldAssemblyResult;
            IAssemblyDecompilationResults newAssemblyResult;

            if (GlobalDecompilationResultsRepository.Instance.TryGetAssemblyDecompilationResult(assemblyMap.OldType, out oldAssemblyResult))
            {
                oldResources = oldAssemblyResult.ResourcesFilePaths;
            }

            if (GlobalDecompilationResultsRepository.Instance.TryGetAssemblyDecompilationResult(assemblyMap.NewType, out newAssemblyResult))
            {
                newResources = newAssemblyResult.ResourcesFilePaths;
            }

            var resourceMergeManager = new ResourceMergeManager(
                new OldToNewTupleMap <ICollection <string> > (oldResources, newResources),
                (a, b) => string.Compare(generationProjectInfoMap.OldType.GetRelativePath(a), generationProjectInfoMap.OldType.GetRelativePath(b), true),
                (a, b) => string.Compare(generationProjectInfoMap.NewType.GetRelativePath(a), generationProjectInfoMap.NewType.GetRelativePath(b), true),
                (a, b) => ResourceNameComparer(generationProjectInfoMap, a, b));

            var resourceNodes = resourceMergeManager.GetMergedCollection()
                                .Select(e => new ResourceNode(assemblyNode, e))
                                .ToArray();

            assemblyNode.Resources = resourceNodes;

            return(assemblyNode);
        }
        public static NestedTypeNode Create(TypeNode parent, IOldToNewTupleMap <TypeMetadata> map)
        {
            var nestedTypeNode = new NestedTypeNode(parent, map, new MemberNodeBase[0]);

            var memberManager = new MemberMergeManager(map);
            var members       = memberManager.GetMergedCollection().Select <IOldToNewTupleMap <MemberDefinitionMetadataBase>, MemberNodeBase> (
                e =>
            {
                if (e.GetFirstNotNullItem().MemberType == MemberType.Type)
                {
                    return(Create(
                               parent,
                               new OldToNewTupleMap <TypeMetadata> ((TypeMetadata)e.OldType, (TypeMetadata)e.NewType)));
                }
                return(new MemberNode(
                           nestedTypeNode,
                           new OldToNewTupleMap <MemberMetadata> ((MemberMetadata)e.OldType, (MemberMetadata)e.NewType)));
            }).ToArray();

            nestedTypeNode.Members = members;

            return(nestedTypeNode);
        }