예제 #1
0
        public override void Execute(object parameter)
        {
            var classBrowser = SD.GetService <IClassBrowser>();

            if (classBrowser != null)
            {
                IAssemblyModel assemblyModel = parameter as IAssemblyModel;
                if (assemblyModel == null)
                {
                    // Node is a project?
                    IProject project = parameter as IProject;
                    if (project != null)
                    {
                        assemblyModel = project.AssemblyModel;
                    }
                }

                if (assemblyModel == null)
                {
                    // Node is an assembly reference?
                    IAssemblyReferenceModel assemblyReference = parameter as IAssemblyReferenceModel;
                    if (assemblyReference != null)
                    {
                        // Model is an assembly reference
                        IAssemblyParserService   assemblyParserService = SD.GetRequiredService <IAssemblyParserService>();
                        IEntityModelContext      entityModelContext    = assemblyReference.ParentAssemblyModel.Context;
                        CombinedAssemblySearcher searcher = new CombinedAssemblySearcher();
                        if ((entityModelContext != null) && (entityModelContext.Project != null))
                        {
                            searcher.AddSearcher(new ProjectAssemblyReferenceSearcher(entityModelContext.Project));
                        }
                        searcher.AddSearcher(new DefaultAssemblySearcher(assemblyReference.ParentAssemblyModel.Location));
                        var resolvedFile = searcher.FindAssembly(assemblyReference.AssemblyName);
                        if (resolvedFile != null)
                        {
                            assemblyModel = assemblyParserService.GetAssemblyModelSafe(resolvedFile);
                        }
                        else
                        {
                            // Assembly file not resolvable
                            SD.MessageService.ShowWarningFormatted("Could not resolve reference '{0}'.", assemblyReference.AssemblyName.ShortName);
                        }
                    }
                }

                if (assemblyModel != null)
                {
                    // Try to remove AssemblyModel from list of UnpinnedAssemblies
                    classBrowser.UnpinnedAssemblies.Assemblies.RemoveAll(a => a.FullAssemblyName == assemblyModel.FullAssemblyName);

                    if (!classBrowser.MainAssemblyList.Assemblies.Contains(assemblyModel))
                    {
                        classBrowser.MainAssemblyList.Assemblies.Add(assemblyModel);
                    }

                    // Bring the node into view
                    classBrowser.GotoAssemblyModel(assemblyModel);
                }
            }
        }
		public TextTemplatingAssemblyPathResolver(
			IProject project,
			IAssemblyParserService assemblyParserService,
			ITextTemplatingPathResolver pathResolver)
		{
			this.project = project;
			this.assemblyParserService = assemblyParserService;
			this.pathResolver = pathResolver;
		}
 public TextTemplatingAssemblyPathResolver(
     IProject project,
     IAssemblyParserService assemblyParserService,
     ITextTemplatingPathResolver pathResolver)
 {
     this.project = project;
     this.assemblyParserService = assemblyParserService;
     this.pathResolver          = pathResolver;
 }
        public bool GoToEntity(IEntity entity)
        {
            // Try to find assembly in workspace
            var entityAssembly = entity.ParentAssembly;

            if (entityAssembly != null)
            {
                ITypeDefinition entityType = null;
                if (entity is ITypeDefinition)
                {
                    entityType = (ITypeDefinition)entity;
                }
                else
                {
                    entityType = entity.DeclaringTypeDefinition;
                }

                SharpTreeNodeCollection namespaceChildren = null;
                var root = this.Root as WorkspaceTreeNode;

                // Try to find assembly of passed entity among open projects in solution
                var solutionTreeNode = this.Root.Children.OfType <SolutionTreeNode>().FirstOrDefault();
                if (solutionTreeNode != null)
                {
                    // Ensure that we have children
                    solutionTreeNode.EnsureLazyChildren();

                    var projectTreeNode = solutionTreeNode.Children.FirstOrDefault(
                        node => {
                        if (node is ProjectTreeNode)
                        {
                            var treeNode = (ProjectTreeNode)node;
                            if (node.Model is IProject)
                            {
                                var projectModel = (IProject)node.Model;
                                return(projectModel.AssemblyModel.FullAssemblyName == entityAssembly.FullAssemblyName);
                            }
                        }

                        return(false);
                    });
                    if (projectTreeNode != null)
                    {
                        projectTreeNode.EnsureLazyChildren();
                        namespaceChildren = projectTreeNode.Children;
                    }
                }

                if (namespaceChildren == null)
                {
                    // Try to find assembly of passed entity among additional assemblies
                    var assemblyTreeNode = FindAssemblyTreeNode(entityAssembly.FullAssemblyName);
                    if (assemblyTreeNode != null)
                    {
                        assemblyTreeNode.EnsureLazyChildren();
                        namespaceChildren = assemblyTreeNode.Children;
                    }
                }

                if (namespaceChildren == null)
                {
                    // Add assembly to workspace (unpinned), if not available in ClassBrowser
                    IAssemblyParserService assemblyParser = SD.GetService <IAssemblyParserService>();
                    IClassBrowser          classBrowser   = SD.GetService <IClassBrowser>();
                    if (assemblyParser != null && classBrowser != null)
                    {
                        IAssemblyModel unpinnedAssemblyModel = assemblyParser.GetAssemblyModel(new FileName(entityAssembly.UnresolvedAssembly.Location));
                        if (unpinnedAssemblyModel != null)
                        {
                            classBrowser.UnpinnedAssemblies.Assemblies.Add(unpinnedAssemblyModel);
                            var assemblyTreeNode = FindAssemblyTreeNode(entityAssembly.FullAssemblyName);
                            if (assemblyTreeNode != null)
                            {
                                assemblyTreeNode.EnsureLazyChildren();
                                namespaceChildren = assemblyTreeNode.Children;
                            }
                        }
                    }
                }

                if (namespaceChildren != null)
                {
                    var nsTreeNode = namespaceChildren.FirstOrDefault(
                        node =>
                        (node is NamespaceTreeNode) &&
                        (((NamespaceTreeNode)node).Model is INamespaceModel) &&
                        (((INamespaceModel)((NamespaceTreeNode)node).Model).FullName == entityType.Namespace)
                        ) as ModelCollectionTreeNode;

                    if (nsTreeNode != null)
                    {
                        // Ensure that we have children
                        nsTreeNode.EnsureLazyChildren();

                        SharpTreeNode entityTypeNode = null;

                        // Search in namespace node recursively
                        var foundEntityNode = nsTreeNode.FindChildNodeRecursively(
                            node => {
                            var treeNode = node as SharpTreeNode;
                            if (treeNode != null)
                            {
                                var treeNodeTypeModel = treeNode.Model as ITypeDefinitionModel;
                                if (treeNodeTypeModel != null)
                                {
                                    var modelFullTypeName = treeNodeTypeModel.FullTypeName;
                                    if (modelFullTypeName == entityType.FullTypeName)
                                    {
                                        // This is the TypeDefinitionModel of searched entity (the type itself or its member)
                                        entityTypeNode = treeNode;
                                        if (entity is ITypeDefinition)
                                        {
                                            // We are looking for the type itself
                                            return(true);
                                        }
                                    }
                                }

                                if ((entity is IMember) && (treeNode.Model is IMemberModel))
                                {
                                    // Compare parent types and member names
                                    IMemberModel memberModel   = (IMemberModel)treeNode.Model;
                                    IMember member             = (IMember)entity;
                                    bool isSymbolOfTypeAndName =
                                        (member.DeclaringType.FullName == memberModel.UnresolvedMember.DeclaringTypeDefinition.FullName) &&
                                        (member.Name == memberModel.Name) &&
                                        (member.SymbolKind == memberModel.SymbolKind);

                                    if (isSymbolOfTypeAndName)
                                    {
                                        var parametrizedEntityMember   = member as IParameterizedMember;
                                        var parametrizedTreeNodeMember = memberModel.UnresolvedMember as IUnresolvedParameterizedMember;
                                        if ((parametrizedEntityMember != null) && (parametrizedTreeNodeMember != null))
                                        {
                                            // For methods and constructors additionally check the parameters and their types to handle overloading properly
                                            int treeNodeParamsCount = parametrizedTreeNodeMember.Parameters != null ? parametrizedTreeNodeMember.Parameters.Count : 0;
                                            int entityParamsCount   = parametrizedEntityMember.Parameters != null ? parametrizedEntityMember.Parameters.Count : 0;
                                            if (treeNodeParamsCount == entityParamsCount)
                                            {
                                                for (int i = 0; i < entityParamsCount; i++)
                                                {
                                                    // Compare full type names or at least only type names without namespace
                                                    // This is not precise, but sufficient in most cases.
                                                    var entityParamType   = parametrizedEntityMember.Parameters[i].Type;
                                                    var treeNodeParamType = parametrizedTreeNodeMember.Parameters[i].Type.Resolve(
                                                        new SimpleTypeResolveContext(entityAssembly));
                                                    if ((entityParamType.FullName != treeNodeParamType.FullName) &&
                                                        (entityParamType.Name != treeNodeParamType.Name))
                                                    {
                                                        return(false);
                                                    }
                                                }

                                                // All parameters were equal
                                                return(true);
                                            }
                                        }
                                        else
                                        {
                                            return(true);
                                        }
                                    }
                                }
                            }

                            return(false);
                        });

                        // Special handling for default constructors: If not found, jump to type declaration instead
                        if ((foundEntityNode == null) && (entity.SymbolKind == SymbolKind.Constructor))
                        {
                            foundEntityNode = entityTypeNode;
                        }

                        if (foundEntityNode != null)
                        {
                            this.FocusNode(foundEntityNode);
                            this.SelectedItem = foundEntityNode;
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }