internal async Task GoToCodeAsync(Project project, ISymbol targetSymbol) { try { _workspace.TryGoToDefinition(targetSymbol, project, CancellationToken.None); } catch (Exception ex) { await UIHelper.ShowErrorAsync(_package, ex.Message); } }
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; } } }
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); }
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); }