예제 #1
0
        public async Task <CompletionResult> GetCompletionList(WorkspaceRequest request, Budget budget)
        {
            budget ??= new TimeBudget(TimeSpan.FromSeconds(defaultBudgetInSeconds));

            var package = await _packageFinder.Find <ICreateWorkspace>(request.Workspace.WorkspaceType);

            var workspace = await request.Workspace.InlineBuffersAsync();

            var sourceFiles = workspace.GetSourceFiles();

            var(_, documents) = await package.GetCompilationForLanguageServices(
                sourceFiles,
                GetSourceCodeKind(request),
                GetUsings(request.Workspace),
                budget);

            var file = workspace.GetFileFromBufferId(request.ActiveBufferId);

            var(_, _, absolutePosition) = workspace.GetTextLocation(request.ActiveBufferId);
            var selectedDocument = documents.First(doc => doc.IsMatch(file));

            var service = CompletionService.GetService(selectedDocument);

            var completionList = await service.GetCompletionsAsync(selectedDocument, absolutePosition);

            var semanticModel = await selectedDocument.GetSemanticModelAsync();

            var diagnostics = DiagnosticsExtractor.ExtractSerializableDiagnosticsFromSemanticModel(request.ActiveBufferId, budget, semanticModel, workspace);

            var symbols = await Recommender.GetRecommendedSymbolsAtPositionAsync(
                semanticModel,
                absolutePosition,
                selectedDocument.Project.Solution.Workspace);

            var symbolToSymbolKey = new Dictionary <(string, int), ISymbol>();

            foreach (var symbol in symbols)
            {
                var key = (symbol.Name, (int)symbol.Kind);
                if (!symbolToSymbolKey.ContainsKey(key))
                {
                    symbolToSymbolKey[key] = symbol;
                }
            }

            if (completionList == null)
            {
                return(new CompletionResult(requestId: request.RequestId, diagnostics: diagnostics));
            }

            var completionItems = completionList.Items
                                  .Where(i => i != null)
                                  .Select(item => item.ToModel(symbolToSymbolKey, selectedDocument));

            return(new CompletionResult(completionItems
                                        .Deduplicate()
                                        .ToArray(),
                                        requestId: request.RequestId,
                                        diagnostics: diagnostics));
        }
예제 #2
0
        public async Task <DiagnosticResult> GetDiagnostics(WorkspaceRequest request, Budget budget)
        {
            budget ??= new TimeBudget(TimeSpan.FromSeconds(defaultBudgetInSeconds));

            var package = await _packageFinder.Find <ICreateWorkspace>(request.Workspace.WorkspaceType);

            var workspace = await request.Workspace.InlineBuffersAsync();

            var sourceFiles = workspace.GetSourceFiles();

            var(_, documents) = await package.GetCompilationForLanguageServices(sourceFiles, GetSourceCodeKind(request), GetUsings(request.Workspace), budget);

            var selectedDocument = documents.FirstOrDefault(doc => doc.IsMatch(request.ActiveBufferId.FileName))
                                   ??
                                   (documents.Count == 1 ? documents.Single() : null);

            if (selectedDocument == null)
            {
                return(new DiagnosticResult(requestId: request.RequestId));
            }

            var diagnostics = await DiagnosticsExtractor.ExtractSerializableDiagnosticsFromDocument(request.ActiveBufferId, budget, selectedDocument, workspace);

            var result = new DiagnosticResult(diagnostics, request.RequestId);

            return(result);
        }
예제 #3
0
        internal static DiagnosticsProvider ExtractedProvider <T>(DiagnosticsExtractor <T> extractor, T source)
        {
//JAVA TO C# CONVERTER WARNING: Java wildcard generics have no direct equivalent in .NET:
//ORIGINAL LINE: if (extractor instanceof DiagnosticsExtractor_VisitableDiagnostics<?>)
            if (extractor is DiagnosticsExtractor_VisitableDiagnostics <object> )
            {
                return(new ExtractedVisitableDiagnosticsProvider <>((DiagnosticsExtractor_VisitableDiagnostics <T>)extractor, source));
            }
            else
            {
                return(new ExtractedDiagnosticsProvider <>(extractor, source));
            }
        }
예제 #4
0
        public async Task <SignatureHelpResult> GetSignatureHelp(WorkspaceRequest request, Budget budget)
        {
            budget ??= new TimeBudget(TimeSpan.FromSeconds(defaultBudgetInSeconds));

            var package = await _packageFinder.Find <ICreateWorkspace>(request.Workspace.WorkspaceType);

            var workspace = await request.Workspace.InlineBuffersAsync();

            var sourceFiles = workspace.GetSourceFiles();

            var(compilation, project) = await package.GetCompilationForLanguageServices(sourceFiles, GetSourceCodeKind(request), GetUsings(request.Workspace), budget);

            var documents = project.Documents.ToList();

            var selectedDocument = documents.FirstOrDefault(doc => doc.IsMatch(request.ActiveBufferId.FileName))
                                   ??
                                   (documents.Count == 1 ? documents.Single() : null);

            if (selectedDocument == null)
            {
                return(new SignatureHelpResult(requestId: request.RequestId));
            }

            var diagnostics = await DiagnosticsExtractor.ExtractSerializableDiagnosticsFromDocument(request.ActiveBufferId, budget, selectedDocument, workspace);

            var tree = await selectedDocument.GetSyntaxTreeAsync();

            var absolutePosition = workspace.GetAbsolutePositionForGetBufferWithSpecifiedIdOrSingleBufferIfThereIsOnlyOne(request.ActiveBufferId);

            var syntaxNode = tree.GetRoot().FindToken(absolutePosition).Parent;

            var result = await SignatureHelpService.GetSignatureHelp(
                () => Task.FromResult(compilation.GetSemanticModel(tree)),
                syntaxNode,
                absolutePosition);

            result.RequestId = request.RequestId;
            if (diagnostics?.Count > 0)
            {
                result.Diagnostics = diagnostics;
            }

            return(result);
        }
예제 #5
0
 internal ExtractedDiagnosticsProvider(DiagnosticsExtractor <T> extractor, T source)
 {
     this.Extractor = extractor;
     this.Source    = source;
 }
예제 #6
0
 public virtual void Register <T>(DiagnosticsExtractor <T> extractor, T source)
 {
     AppendProvider(ExtractedProvider(extractor, source));
 }
예제 #7
0
        public override Gene GenerateGene(int geneIndex)
        {
            var diagnostics = new DiagnosticsExtractor(Source).FromCode(geneIndex);

            return(new Gene(diagnostics));
        }