Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions eng/config/PublishData.json
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@
"Microsoft.CodeAnalysis.Remote.Razor.ServiceHub": "vs-impl",
"Microsoft.CodeAnalysis.Remote.ServiceHub": "vs-impl",
"Microsoft.CodeAnalysis.Remote.Workspaces": "vs-impl",
"Microsoft.CodeAnalysis.SemanticSearch.Extensions": "vs-impl",
"Microsoft.CodeAnalysis.SemanticSearch.ReferenceAssemblies": "vs-impl",
"Microsoft.VisualStudio.LanguageServices.LiveShare": "vs-impl",
"Microsoft.VisualStudio.LanguageServices.Razor.RemoteClient": "vs-impl",
Expand Down
1 change: 1 addition & 0 deletions eng/test-rebuild.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ try {
" --exclude net8.0\GeneratedRefAssemblies\Microsoft.CodeAnalysis.dll" +
" --exclude net8.0\GeneratedRefAssemblies\Microsoft.CodeAnalysis.CSharp.dll" +
" --exclude net8.0\GeneratedRefAssemblies\Microsoft.CodeAnalysis.VisualBasic.dll" +
" --exclude net8.0\GeneratedRefAssemblies\Microsoft.CodeAnalysis.SemanticSearch.Extensions.dll" +
" --exclude net8.0\GeneratedRefAssemblies\System.Collections.Immutable.dll" +

" --debugPath `"$ArtifactsDir/BuildValidator`"" +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ internal sealed class SemanticSearchEditorWorkspace(
private ITextBuffer? _queryTextBuffer;
private DocumentId? _queryDocumentId;

public async Task OpenQueryDocumentAsync(ITextBuffer buffer, CancellationToken cancellationToken)
public async Task OpenQueryDocumentAsync(ITextBuffer buffer, string? targetLanguage, CancellationToken cancellationToken)
{
_queryTextBuffer = buffer;

// initialize solution with default query, unless it has already been initialized:
var queryDocument = await UpdateQueryDocumentAsync(query: null, cancellationToken).ConfigureAwait(false);
var queryDocument = await UpdateQueryDocumentAsync(query: null, targetLanguage, cancellationToken).ConfigureAwait(false);

_queryDocumentId = queryDocument.Id;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ internal interface ISemanticSearchResultsCommonObserver
internal interface ISemanticSearchResultsObserver : ISemanticSearchResultsCommonObserver
{
ValueTask OnSymbolFoundAsync(Solution solution, ISymbol symbol, CancellationToken cancellationToken);
ValueTask OnSyntaxNodeFoundAsync(Document document, SyntaxNode node, CancellationToken cancellationToken);
ValueTask OnLocationFoundAsync(Solution solution, Location location, CancellationToken cancellationToken);
ValueTask OnValueFoundAsync(Solution solution, object value, CancellationToken cancellationToken);
}

internal interface ISemanticSearchResultsDefinitionObserver : ISemanticSearchResultsCommonObserver
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@ internal interface ISemanticSearchSolutionService
/// </summary>
/// <param name="solution">Original solution.</param>
/// <param name="query">New query, or null to use default query.</param>
/// <param name="targetLanguage">Language of the target projects the query executes against, or null if it should execute against all supported projects.</param>
/// <param name="referenceAssembliesDir">Directory containing reference assemblies.</param>
Solution SetQueryText(Solution solution, string? query, string referenceAssembliesDir);
Solution SetQueryText(Solution solution, string? query, string? targetLanguage, string referenceAssembliesDir);

(WorkspaceChangeKind changeKind, ProjectId? projectId, DocumentId? documentId) GetWorkspaceChangeKind(Solution oldSolution, Solution newSolution);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System;
using System.Collections.Immutable;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Classification;
using Microsoft.CodeAnalysis.FindSymbols;
using Microsoft.CodeAnalysis.FindUsages;
using Microsoft.CodeAnalysis.Text;

namespace Microsoft.CodeAnalysis.SemanticSearch;

Expand All @@ -17,7 +20,63 @@ internal static class SemanticSearchDefinitionItemFactory
DisplayAllDefinitions = true,
};

public static DefinitionItem Create(string text)
{
var displayStr = Clip(text, maxLength: 100);
var displayText = new TaggedText(TextTags.Text, displayStr);

return DefinitionItem.CreateNonNavigableItem(
tags: [],
displayParts: text.Length == displayStr.Length ? [displayText] : [displayText, new TaggedText(TextTags.Punctuation, "…")]);
}

public static ValueTask<DefinitionItem> CreateAsync(Solution solution, ISymbol symbol, OptionsProvider<ClassificationOptions> classificationOptions, CancellationToken cancellationToken)
=> symbol.ToClassifiedDefinitionItemAsync(
classificationOptions, solution, s_findReferencesSearchOptions, isPrimary: true, includeHiddenLocations: false, cancellationToken);

public static ValueTask<DefinitionItem> CreateAsync(Document document, SyntaxNode node, CancellationToken cancellationToken)
=> CreateItemAsync(document, node.FullSpan, cancellationToken);

public static async ValueTask<DefinitionItem?> CreateAsync(Solution solution, Location location, CancellationToken cancellationToken)
{
if (location.MetadataModule is { } module)
{
var metadataLocation = DefinitionItemFactory.GetMetadataLocation(module.ContainingAssembly, solution, out var originatingProjectId);

return DefinitionItem.Create(
tags: [],
displayParts: [],
sourceSpans: [],
classifiedSpans: [],
metadataLocations: [metadataLocation],
properties: ImmutableDictionary<string, string>.Empty.WithMetadataSymbolProperties(module.ContainingAssembly, originatingProjectId));
}

if (solution.GetDocument(location.SourceTree) is { } document)
{
return await CreateItemAsync(document, location.SourceSpan, cancellationToken).ConfigureAwait(false);
}

return null;
}

private static async ValueTask<DefinitionItem> CreateItemAsync(Document document, TextSpan span, CancellationToken cancellationToken)
{
var text = await document.GetTextAsync(cancellationToken).ConfigureAwait(false);
var displaySpan = Clip(span, maxLength: 100);
var displayText = new TaggedText(TextTags.Text, text.ToString(displaySpan));

return DefinitionItem.Create(
tags: [],
displayParts: displaySpan.Length == span.Length ? [displayText] : [displayText, new TaggedText(TextTags.Punctuation, "…")],
sourceSpans: [new DocumentSpan(document, span)],
classifiedSpans: [],
metadataLocations: []);
}

private static TextSpan Clip(TextSpan span, int maxLength)
=> new(span.Start, Math.Min(span.Length, maxLength));

private static string Clip(string str, int maxLength)
=> str[0..Math.Min(str.Length, maxLength)];
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ public override bool CanOpenDocuments
public override bool CanApplyChange(ApplyChangesKind feature)
=> feature == ApplyChangesKind.ChangeDocument;

public async Task<Document> UpdateQueryDocumentAsync(string? query, CancellationToken cancellationToken)
public async Task<Document> UpdateQueryDocumentAsync(string? query, string? targetLanguage, CancellationToken cancellationToken)
{
var (updated, newSolution) = await this.SetCurrentSolutionAsync(
useAsync: true,
transformation: oldSolution => solutionService.SetQueryText(oldSolution, query, ReferenceAssembliesDirectory),
transformation: oldSolution => solutionService.SetQueryText(oldSolution, query, targetLanguage, ReferenceAssembliesDirectory),
changeKind: solutionService.GetWorkspaceChangeKind,
onBeforeUpdate: null,
onAfterUpdate: null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information.

using System;
using System.Collections.Immutable;
using System.Composition;
using System.Diagnostics;
using System.Threading;
Expand All @@ -11,6 +12,8 @@
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.SemanticSearch;
using Microsoft.CodeAnalysis.SolutionExplorer;
using Microsoft.CodeAnalysis.Text;

namespace Microsoft.CodeAnalysis.ExternalAccess.Copilot.Internal.SemanticSearch;

Expand All @@ -22,15 +25,24 @@ internal sealed class CopilotSemanticSearchQueryService(
{
private sealed class CopilotObserver(ISemanticSearchResultsObserver observer) : ICopilotSemanticSearchResultsObserver
{
public ValueTask OnLocationFoundAsync(Solution solution, Location location, CancellationToken cancellationToken)
=> observer.OnLocationFoundAsync(solution, location, cancellationToken);

public ValueTask OnSymbolFoundAsync(Solution solution, ISymbol symbol, CancellationToken cancellationToken)
=> observer.OnSymbolFoundAsync(solution, symbol, cancellationToken);

public ValueTask OnSyntaxNodeFoundAsync(Document document, SyntaxNode node, CancellationToken cancellationToken)
=> observer.OnSyntaxNodeFoundAsync(document, node, cancellationToken);

public ValueTask OnValueFoundAsync(Solution solution, object value, CancellationToken cancellationToken)
=> observer.OnValueFoundAsync(solution, value, cancellationToken);

public ValueTask AddItemsAsync(int itemCount, CancellationToken cancellationToken)
=> observer.AddItemsAsync(itemCount, cancellationToken);

public ValueTask ItemsCompletedAsync(int itemCount, CancellationToken cancellationToken)
=> observer.ItemsCompletedAsync(itemCount, cancellationToken);

public ValueTask OnSymbolFoundAsync(Solution solution, ISymbol symbol, CancellationToken cancellationToken)
=> observer.OnSymbolFoundAsync(solution, symbol, cancellationToken);

public ValueTask OnUserCodeExceptionAsync(ICopilotSemanticSearchResultsObserver.UserCodeExceptionInfo info, CancellationToken cancellationToken)
=> observer.OnUserCodeExceptionAsync(
new UserCodeExceptionInfo(
Expand All @@ -40,6 +52,15 @@ public ValueTask OnUserCodeExceptionAsync(ICopilotSemanticSearchResultsObserver.
info.StackTrace,
info.Span),
cancellationToken);

public ValueTask OnDocumentUpdatedAsync(DocumentId documentId, ImmutableArray<TextChange> changes, CancellationToken cancellationToken)
=> observer.OnDocumentUpdatedAsync(documentId, changes, cancellationToken);

public ValueTask OnTextFileUpdatedAsync(string filePath, string? newContent, CancellationToken cancellationToken)
=> observer.OnTextFileUpdatedAsync(filePath, newContent, cancellationToken);

public ValueTask OnLogMessageAsync(string message, CancellationToken cancellationToken)
=> observer.OnLogMessageAsync(message, cancellationToken);
}

public CompileQueryResult CompileQuery(SolutionServices services, string query, string? targetLanguage, string referenceAssembliesDir, TraceSource traceSource, CancellationToken cancellationToken)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,6 @@ public DocumentId GetQueryDocumentId(Solution solution)
public (WorkspaceChangeKind changeKind, ProjectId? projectId, DocumentId? documentId) GetWorkspaceChangeKind(Solution oldSolution, Solution newSolution)
=> GetImpl().GetWorkspaceChangeKind(oldSolution, newSolution);

public Solution SetQueryText(Solution solution, string? query, string referenceAssembliesDir)
=> GetImpl().SetQueryText(solution, query, referenceAssembliesDir);
public Solution SetQueryText(Solution solution, string? query, string? targetLanguage, string referenceAssembliesDir)
=> GetImpl().SetQueryText(solution, query, targetLanguage, referenceAssembliesDir);
}
Original file line number Diff line number Diff line change
Expand Up @@ -155,8 +155,14 @@ Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSea
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchResultsObserver
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchResultsObserver.AddItemsAsync(int itemCount, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchResultsObserver.ItemsCompletedAsync(int itemCount, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchResultsObserver.OnDocumentUpdatedAsync(Microsoft.CodeAnalysis.DocumentId! documentId, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Text.TextChange> changes, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchResultsObserver.OnLocationFoundAsync(Microsoft.CodeAnalysis.Solution! solution, Microsoft.CodeAnalysis.Location! location, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchResultsObserver.OnLogMessageAsync(string! message, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchResultsObserver.OnSymbolFoundAsync(Microsoft.CodeAnalysis.Solution! solution, Microsoft.CodeAnalysis.ISymbol! symbol, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchResultsObserver.OnSyntaxNodeFoundAsync(Microsoft.CodeAnalysis.Document! document, Microsoft.CodeAnalysis.SyntaxNode! node, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchResultsObserver.OnTextFileUpdatedAsync(string! filePath, string? newContent, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchResultsObserver.OnUserCodeExceptionAsync(Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchResultsObserver.UserCodeExceptionInfo exception, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchResultsObserver.OnValueFoundAsync(Microsoft.CodeAnalysis.Solution! solution, object! value, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchResultsObserver.UserCodeExceptionInfo
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchResultsObserver.UserCodeExceptionInfo.Deconstruct(out string! ProjectDisplayName, out string! Message, out System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.TaggedText> TypeName, out System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.TaggedText> StackTrace, out Microsoft.CodeAnalysis.Text.TextSpan Span) -> void
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchResultsObserver.UserCodeExceptionInfo.Equals(Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchResultsObserver.UserCodeExceptionInfo other) -> bool
Expand All @@ -176,7 +182,7 @@ Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSea
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchSolutionService.GetQueryDocumentFilePath() -> string!
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchSolutionService.GetQueryDocumentId(Microsoft.CodeAnalysis.Solution! solution) -> Microsoft.CodeAnalysis.DocumentId!
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchSolutionService.GetWorkspaceChangeKind(Microsoft.CodeAnalysis.Solution! oldSolution, Microsoft.CodeAnalysis.Solution! newSolution) -> (Microsoft.CodeAnalysis.WorkspaceChangeKind changeKind, Microsoft.CodeAnalysis.ProjectId? projectId, Microsoft.CodeAnalysis.DocumentId? documentId)
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchSolutionService.SetQueryText(Microsoft.CodeAnalysis.Solution! solution, string? query, string! referenceAssembliesDir) -> Microsoft.CodeAnalysis.Solution!
Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ICopilotSemanticSearchSolutionService.SetQueryText(Microsoft.CodeAnalysis.Solution! solution, string? query, string? targetLanguage, string! referenceAssembliesDir) -> Microsoft.CodeAnalysis.Solution!
Microsoft.CodeAnalysis.SemanticSearch.SemanticSearchCopilotServiceWrapper
Microsoft.CodeAnalysis.SemanticSearch.SemanticSearchCopilotServiceWrapper.SemanticSearchCopilotServiceWrapper(System.Lazy<Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.ISemanticSearchCopilotServiceImpl!>? impl) -> void
override Microsoft.CodeAnalysis.ExternalAccess.Copilot.Completion.CodeSnippetItem.Equals(object? obj) -> bool
Expand All @@ -203,6 +209,7 @@ static Microsoft.CodeAnalysis.ExternalAccess.Copilot.CopilotUtilities.GetContain
static Microsoft.CodeAnalysis.ExternalAccess.Copilot.CopilotUtilities.GetCopilotSuggestionDiagnosticTag() -> string!
static Microsoft.CodeAnalysis.ExternalAccess.Copilot.CopilotUtilities.IsResultantVisibilityPublic(this Microsoft.CodeAnalysis.ISymbol! symbol) -> bool
static Microsoft.CodeAnalysis.ExternalAccess.Copilot.CopilotUtilities.IsValidIdentifier(string? name) -> bool
static Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.CopilotSemanticSearchUtilities.CanApplyChange(Microsoft.CodeAnalysis.TextDocument! document) -> bool
static Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.CopilotSemanticSearchUtilities.CreateSyntaxTree(Microsoft.CodeAnalysis.Host.SolutionServices! services, string! language, string? filePath, Microsoft.CodeAnalysis.ParseOptions! options, Microsoft.CodeAnalysis.Text.SourceText? text, System.Text.Encoding? encoding, Microsoft.CodeAnalysis.Text.SourceHashAlgorithm checksumAlgorithm, Microsoft.CodeAnalysis.SyntaxNode! root) -> Microsoft.CodeAnalysis.SyntaxTree!
static Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.CopilotSemanticSearchUtilities.FindNode(this Microsoft.CodeAnalysis.Location! location, bool findInsideTrivia, bool getInnermostNodeForTie, System.Threading.CancellationToken cancellationToken) -> Microsoft.CodeAnalysis.SyntaxNode!
static Microsoft.CodeAnalysis.ExternalAccess.Copilot.SemanticSearch.CopilotSemanticSearchUtilities.FindReferencesAsync(Microsoft.CodeAnalysis.Solution! solution, Microsoft.CodeAnalysis.ISymbol! symbol, System.Action<Microsoft.CodeAnalysis.FindSymbols.ReferenceLocation>! callback, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ public static Task FindReferencesAsync(Solution solution, ISymbol symbol, Action
=> SymbolFinder.FindReferencesAsync(
symbol, solution, new Progress(callback), documents: null, s_options, cancellationToken);

public static bool CanApplyChange(TextDocument document)
=> document.CanApplyChange();

private sealed class Progress(Action<ReferenceLocation> callback) : IStreamingFindReferencesProgress
{
public ValueTask OnStartedAsync(CancellationToken cancellationToken) => ValueTask.CompletedTask;
Expand Down
Loading