internal async Task GoToCodeAsync(Project project, ISymbol targetSymbol)
 {
     try
     {
         _workspace.TryGoToDefinition(targetSymbol, project, CancellationToken.None);
     }
     catch (Exception ex)
     {
         await UIHelper.ShowErrorAsync(_package, ex.Message);
     }
 }
Exemple #2
0
        public static void NavigateToSymbol(SourceTextContainer textContainer, ISymbol symbol, Project project)
        {
            Workspace workspace;

            if (!Workspace.TryGetWorkspace(textContainer, out workspace))
            {
                return;
            }

            VisualStudioWorkspace visualStudioWorkspace = workspace as VisualStudioWorkspace;

            if (visualStudioWorkspace == null)
            {
                return;
            }

            visualStudioWorkspace.TryGoToDefinition(symbol, project, CancellationToken.None);
        }
        /// <summary>
        /// 指定されたノードの定義を開きます。
        /// </summary>
        public void OpenSymbol(TypeNode node)
        {
            if (node == null)
            {
                return;
            }

            var currentProject    = _workspace.CurrentSolution.GetProject(TargetType.ContainingAssembly);
            var candidateProjects = currentProject != null?
                                    GetCandidateProjects(currentProject) : _workspace.CurrentSolution.Projects;

            foreach (var project in candidateProjects)
            {
                if (_workspace.TryGoToDefinition(node.Source, project, CancellationToken.None))
                {
                    break;
                }
            }
        }
Exemple #4
0
        private bool TryGoToDefinition(Project currentProject, ISymbol searchSymbol)
        {
            var result = VisualStudioWorkspace.TryGoToDefinition(searchSymbol, currentProject, CancellationToken.None);

            if (result)
            {
                return(true);
            }
            else
            {
                // not found in current project ... search all projects in solution
                foreach (var project in currentProject.Solution.Projects)
                {
                    result = VisualStudioWorkspace.TryGoToDefinition(searchSymbol, project, CancellationToken.None);
                    if (result)
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Exemple #5
0
        public static void NavigateToSymbol(SourceTextContainer textContainer, ProjectId projectId, KeyValuePair <SymbolKind, string>[] symbolPath)
        {
            Workspace workspace;

            if (!Workspace.TryGetWorkspace(textContainer, out workspace))
            {
                return;
            }

            VisualStudioWorkspace visualStudioWorkspace = workspace as VisualStudioWorkspace;

            if (visualStudioWorkspace == null)
            {
                return;
            }

            var project = visualStudioWorkspace.CurrentSolution.GetProject(projectId);

            if (project == null)
            {
                return;
            }

            var compilation = project.GetCompilationAsync(CancellationToken.None).GetAwaiter().GetResult();

            if (compilation == null)
            {
                return;
            }

            ImmutableArray <ISymbol> currentSymbols = ImmutableArray.Create <ISymbol>(compilation.GlobalNamespace);
            int firstParameterIndex = symbolPath.Length;

            for (int i = 0; i < symbolPath.Length; i++)
            {
                bool complete = false;
                var  pair     = symbolPath[i];
                switch (pair.Key)
                {
                case SymbolKind.Namespace:
                    // The current symbols must be namespaces
                    currentSymbols = currentSymbols.SelectMany(currentSymbol => ((INamespaceSymbol)currentSymbol).GetNamespaceMembers().Where(ns => ns.Name == pair.Value)).Select(ns => (ISymbol)ns).ToImmutableArray();
                    continue;

                case SymbolKind.NamedType:
                    // The current symbol must be a namespaces or types
                    GetNameAndArity(pair.Value, out string typeName, out int arity);
                    currentSymbols = currentSymbols.SelectMany(currentSymbol => ((INamespaceOrTypeSymbol)currentSymbol).GetTypeMembers(typeName, arity)).Select(sym => (ISymbol)sym).ToImmutableArray();
                    continue;

                case SymbolKind.Property:
                case SymbolKind.Event:
                    currentSymbols      = currentSymbols.SelectMany(currentSymbol => ((INamedTypeSymbol)currentSymbol).GetMembers().Where(sym => sym.Kind == pair.Key && sym.MetadataName == pair.Value)).ToImmutableArray();
                    firstParameterIndex = i + 1;
                    complete            = true;
                    break;

                case SymbolKind.Method:
                    GetNameAndArity(pair.Value, out string memberName, out arity);
                    currentSymbols      = currentSymbols.SelectMany(currentSymbol => ((INamedTypeSymbol)currentSymbol).GetMembers().Where(sym => sym.MetadataName == memberName && ((IMethodSymbol)sym).Arity == arity && sym.Kind == pair.Key)).ToImmutableArray();
                    firstParameterIndex = i + 1;
                    complete            = true;
                    break;

                default:
                    return;
                }

                if (complete)
                {
                    break;
                }
            }

            if (firstParameterIndex < symbolPath.Length)
            {
                string[]             parameters       = symbolPath.Skip(firstParameterIndex).Select(pair => pair.Value).ToArray();
                Func <ISymbol, bool> matchesSignature =
                    sym =>
                {
                    ImmutableArray <IParameterSymbol> parameterSymbols;
                    switch (sym.Kind)
                    {
                    case SymbolKind.Property:
                        parameterSymbols = ((IPropertySymbol)sym).Parameters;
                        break;

                    case SymbolKind.Method:
                        parameterSymbols = ((IMethodSymbol)sym).Parameters;
                        break;

                    default:
                        return(false);
                    }

                    if (parameterSymbols.Length != parameters.Length)
                    {
                        return(false);
                    }

                    for (int i = 0; i < parameters.Length; i++)
                    {
                        if (parameterSymbols[i].ToString() != parameters[i])
                        {
                            return(false);
                        }
                    }

                    return(true);
                };

                currentSymbols = currentSymbols.Where(matchesSignature).ToImmutableArray();
            }

            ISymbol symbol = currentSymbols.FirstOrDefault();

            if (symbol == null)
            {
                return;
            }

            visualStudioWorkspace.TryGoToDefinition(symbol, project, CancellationToken.None);
        }