public async Task <Document> AddSourceToAsync(Document document, Compilation symbolCompilation, Microsoft.CodeAnalysis.ISymbol symbol, CancellationToken cancellationToken) { // Get the name of the type the symbol is in var containingOrThis = symbol.GetContainingTypeOrThis(); var fullName = GetFullReflectionName(containingOrThis); var reference = symbolCompilation.GetMetadataReference(symbol.ContainingAssembly); var assemblyLocation = (reference as PortableExecutableReference)?.FilePath; if (assemblyLocation == null) { throw new NotSupportedException("Cannot_navigate_to_the_symbol_under_the_caret"); } // Decompile document = PerformDecompilation(document, fullName, symbolCompilation, assemblyLocation); document = await AddAssemblyInfoRegionAsync(document, symbol, cancellationToken).ConfigureAwait(false); // Convert XML doc comments to regular comments, just like MAS document = await ConvertDocCommentsToRegularCommentsAsync(document, cancellationToken).ConfigureAwait(false); var node = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); // Apply formatting rules var options = await FormattingWorker.GetFormattingOptionsAsync(document, _omnisharpOptions).ConfigureAwait(false); document = await OmniSharpFormatter.FormatAsync(document, new[] { node.FullSpan }, options, cancellationToken).ConfigureAwait(false); return(document); }
public async Task <(Document document, string documentPath)> GetAndAddExternalSymbolDocument(Project project, ISymbol symbol, CancellationToken cancellationToken) { var fileName = symbol.GetFilePathForExternalSymbol(project); Project metadataProject; // since submission projects cannot have new documents added to it // we will use a separate project to hold metadata documents if (project.IsSubmission) { metadataProject = project.Solution.Projects.FirstOrDefault(x => x.Name == MetadataKey); if (metadataProject == null) { metadataProject = project.Solution.AddProject(MetadataKey, $"{MetadataKey}.dll", LanguageNames.CSharp) .WithCompilationOptions(project.CompilationOptions) .WithMetadataReferences(project.MetadataReferences); } } else { // for regular projects we will use current project to store metadata metadataProject = project; } if (!_cache.TryGetValue(fileName, out var document)) { var topLevelSymbol = symbol.GetTopLevelContainingNamedType(); var temporaryDocument = metadataProject.AddDocument(fileName, string.Empty); var formattingOptions = await FormattingWorker.GetFormattingOptionsAsync(temporaryDocument, _omnisharpOptions); document = await OmniSharpMetadataAsSourceService.AddSourceToAsync( temporaryDocument, await metadataProject.GetCompilationAsync(), topLevelSymbol, formattingOptions, cancellationToken); _cache.TryAdd(fileName, document); } return(document, fileName); }