Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use a more sensible MEF export for brace completion #73756

Merged
merged 2 commits into from
May 30, 2024
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
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System;
using System.Collections.Generic;
using System.Composition;
using System.Linq;
using Microsoft.CodeAnalysis.AutomaticCompletion;
using Microsoft.CodeAnalysis.BraceCompletion;
using Microsoft.CodeAnalysis.Host.Mef;
Expand All @@ -15,6 +16,6 @@ namespace Microsoft.CodeAnalysis.Editor.CSharp.AutomaticCompletion;
[method: ImportingConstructor]
[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
internal class CSharpBraceCompletionServiceFactory(
[ImportMany(LanguageNames.CSharp)] IEnumerable<IBraceCompletionService> braceCompletionServices) : AbstractBraceCompletionServiceFactory(braceCompletionServices)
[ImportMany] IEnumerable<Lazy<IBraceCompletionService, LanguageMetadata>> braceCompletionServices) : AbstractBraceCompletionServiceFactory(braceCompletionServices, LanguageNames.CSharp)
{
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +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.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using Microsoft.CodeAnalysis.BraceCompletion;
using Microsoft.CodeAnalysis.Host.Mef;
using Roslyn.Utilities;

namespace Microsoft.CodeAnalysis.AutomaticCompletion;

Expand All @@ -14,9 +18,10 @@ internal abstract class AbstractBraceCompletionServiceFactory : IBraceCompletion
private readonly ImmutableArray<IBraceCompletionService> _braceCompletionServices;

protected AbstractBraceCompletionServiceFactory(
IEnumerable<IBraceCompletionService> braceCompletionServices)
IEnumerable<Lazy<IBraceCompletionService, LanguageMetadata>> braceCompletionServices,
string languageName)
{
_braceCompletionServices = braceCompletionServices.ToImmutableArray();
_braceCompletionServices = braceCompletionServices.Where(s => s.Metadata.Language == languageName).SelectAsArray(s => s.Value);
}

public IBraceCompletionService? TryGetService(ParsedDocument document, int openingPosition, char openingBrace, CancellationToken cancellationToken)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.AutomaticCompletion
<ImportingConstructor>
<Obsolete(MefConstruction.ImportingConstructorMessage, True)>
Public Sub New(
<ImportMany(LanguageNames.VisualBasic)> braceCompletionServices As IEnumerable(Of IBraceCompletionService))
MyBase.New(braceCompletionServices)
<ImportMany> braceCompletionServices As IEnumerable(Of Lazy(Of IBraceCompletionService, LanguageMetadata)))
MyBase.New(braceCompletionServices, LanguageNames.VisualBasic)
End Sub
End Class
End Namespace
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,11 @@

namespace Microsoft.CodeAnalysis.CSharp.BraceCompletion;

[Export(LanguageNames.CSharp, typeof(IBraceCompletionService)), Shared]
internal class BracketBraceCompletionService : AbstractCurlyBraceOrBracketCompletionService
[ExportBraceCompletionService(LanguageNames.CSharp), Shared]
[method: ImportingConstructor]
[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
internal class BracketBraceCompletionService() : AbstractCurlyBraceOrBracketCompletionService
{
[ImportingConstructor]
[Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
public BracketBraceCompletionService()
{
}

protected override char OpeningBrace => Bracket.OpenCharacter;

protected override char ClosingBrace => Bracket.CloseCharacter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,11 @@

namespace Microsoft.CodeAnalysis.CSharp.BraceCompletion;

[Export(LanguageNames.CSharp, typeof(IBraceCompletionService)), Shared]
internal class CharLiteralBraceCompletionService : AbstractCSharpBraceCompletionService
[ExportBraceCompletionService(LanguageNames.CSharp), Shared]
[method: ImportingConstructor]
[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
internal class CharLiteralBraceCompletionService() : AbstractCSharpBraceCompletionService
{
[ImportingConstructor]
[Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
public CharLiteralBraceCompletionService()
{
}

protected override char OpeningBrace => SingleQuote.OpenCharacter;

protected override char ClosingBrace => SingleQuote.CloseCharacter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,11 @@

namespace Microsoft.CodeAnalysis.CSharp.BraceCompletion;

[Export(LanguageNames.CSharp, typeof(IBraceCompletionService)), Shared]
internal class CurlyBraceCompletionService : AbstractCurlyBraceOrBracketCompletionService
[ExportBraceCompletionService(LanguageNames.CSharp), Shared]
[method: ImportingConstructor]
[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
internal class CurlyBraceCompletionService() : AbstractCurlyBraceOrBracketCompletionService
{
[ImportingConstructor]
[Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
public CurlyBraceCompletionService()
{
}

protected override char OpeningBrace => CurlyBrace.OpenCharacter;

protected override char ClosingBrace => CurlyBrace.CloseCharacter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ namespace Microsoft.CodeAnalysis.CSharp.BraceCompletion;
/// Brace completion service for double quotes marking an interpolated string. Note that the <see
/// cref="StringLiteralBraceCompletionService"/> is used for other double quote completions.
/// </summary>
[Export(LanguageNames.CSharp, typeof(IBraceCompletionService)), Shared]
[ExportBraceCompletionService(LanguageNames.CSharp), Shared]
[method: ImportingConstructor]
[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
internal sealed class InterpolatedStringBraceCompletionService() : AbstractCSharpBraceCompletionService
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,11 @@ namespace Microsoft.CodeAnalysis.CSharp.BraceCompletion;
/// Brace completion service used for completing curly braces inside interpolated strings.
/// In other curly brace completion scenarios the <see cref="CurlyBraceCompletionService"/> should be used.
/// </summary>
[Export(LanguageNames.CSharp, typeof(IBraceCompletionService)), Shared]
internal class InterpolationBraceCompletionService : AbstractCSharpBraceCompletionService
[ExportBraceCompletionService(LanguageNames.CSharp), Shared]
[method: ImportingConstructor]
[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
internal class InterpolationBraceCompletionService() : AbstractCSharpBraceCompletionService
{
[ImportingConstructor]
[Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
public InterpolationBraceCompletionService()
{
}

protected override char OpeningBrace => CurlyBrace.OpenCharacter;
protected override char ClosingBrace => CurlyBrace.CloseCharacter;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,11 @@

namespace Microsoft.CodeAnalysis.CSharp.BraceCompletion;

[Export(LanguageNames.CSharp, typeof(IBraceCompletionService)), Shared]
internal class LessAndGreaterThanBraceCompletionService : AbstractCSharpBraceCompletionService
[ExportBraceCompletionService(LanguageNames.CSharp), Shared]
[method: ImportingConstructor]
[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
internal class LessAndGreaterThanBraceCompletionService() : AbstractCSharpBraceCompletionService
{
[ImportingConstructor]
[Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
public LessAndGreaterThanBraceCompletionService()
{
}

protected override bool NeedsSemantics => true;

protected override char OpeningBrace => LessAndGreaterThan.OpenCharacter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,11 @@

namespace Microsoft.CodeAnalysis.CSharp.BraceCompletion;

[Export(LanguageNames.CSharp, typeof(IBraceCompletionService)), Shared]
internal class ParenthesisBraceCompletionService : AbstractCSharpBraceCompletionService
[ExportBraceCompletionService(LanguageNames.CSharp), Shared]
[method: ImportingConstructor]
[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
internal class ParenthesisBraceCompletionService() : AbstractCSharpBraceCompletionService
{
[ImportingConstructor]
[Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
public ParenthesisBraceCompletionService()
{
}

protected override char OpeningBrace => Parenthesis.OpenCharacter;
protected override char ClosingBrace => Parenthesis.CloseCharacter;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

namespace Microsoft.CodeAnalysis.CSharp.BraceCompletion;

[Export(LanguageNames.CSharp, typeof(IBraceCompletionService)), Shared]
[ExportBraceCompletionService(LanguageNames.CSharp), Shared]
[method: ImportingConstructor]
[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
internal sealed class StringLiteralBraceCompletionService() : AbstractCSharpBraceCompletionService
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Licensed to the .NET Foundation under one or more agreements.
// 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.Composition;

namespace Microsoft.CodeAnalysis.BraceCompletion;

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class)]
internal class ExportBraceCompletionServiceAttribute(string language) : ExportAttribute(typeof(IBraceCompletionService))
{
public string Language { get; } = language ?? throw new ArgumentNullException(nameof(language));
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using System.Collections.Immutable;
using System.Composition;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.BraceCompletion;
Expand All @@ -26,27 +27,18 @@ namespace Microsoft.CodeAnalysis.LanguageServer.Handler
{
[ExportCSharpVisualBasicStatelessLspService(typeof(OnAutoInsertHandler)), Shared]
[Method(LSP.VSInternalMethods.OnAutoInsertName)]
internal sealed class OnAutoInsertHandler : ILspServiceDocumentRequestHandler<LSP.VSInternalDocumentOnAutoInsertParams, LSP.VSInternalDocumentOnAutoInsertResponseItem?>
[method: ImportingConstructor]
[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
internal sealed class OnAutoInsertHandler(
[ImportMany] IEnumerable<Lazy<IBraceCompletionService, LanguageMetadata>> braceCompletionServices,
IGlobalOptionService globalOptions) : ILspServiceDocumentRequestHandler<LSP.VSInternalDocumentOnAutoInsertParams, LSP.VSInternalDocumentOnAutoInsertResponseItem?>
{
private readonly ImmutableArray<IBraceCompletionService> _csharpBraceCompletionServices;
private readonly ImmutableArray<IBraceCompletionService> _visualBasicBraceCompletionServices;
private readonly IGlobalOptionService _globalOptions;
private readonly ImmutableArray<Lazy<IBraceCompletionService, LanguageMetadata>> _braceCompletionServices = braceCompletionServices.ToImmutableArray();
private readonly IGlobalOptionService _globalOptions = globalOptions;

public bool MutatesSolutionState => false;
public bool RequiresLSPSolution => true;

[ImportingConstructor]
[Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
public OnAutoInsertHandler(
[ImportMany(LanguageNames.CSharp)] IEnumerable<IBraceCompletionService> csharpBraceCompletionServices,
[ImportMany(LanguageNames.VisualBasic)] IEnumerable<IBraceCompletionService> visualBasicBraceCompletionServices,
IGlobalOptionService globalOptions)
{
_csharpBraceCompletionServices = csharpBraceCompletionServices.ToImmutableArray();
_visualBasicBraceCompletionServices = visualBasicBraceCompletionServices.ToImmutableArray();
_globalOptions = globalOptions;
}

public LSP.TextDocumentIdentifier GetTextDocumentIdentifier(LSP.VSInternalDocumentOnAutoInsertParams request) => request.TextDocument;

public async Task<LSP.VSInternalDocumentOnAutoInsertResponseItem?> HandleRequestAsync(
Expand Down Expand Up @@ -229,12 +221,7 @@ static string GetTextChangeTextWithCaretAtLocation(SourceText sourceText, TextCh

private async Task<(IBraceCompletionService Service, BraceCompletionContext Context)?> GetBraceCompletionContextAsync(int caretLocation, Document document, CancellationToken cancellationToken)
{
var servicesForDocument = document.Project.Language switch
{
LanguageNames.CSharp => _csharpBraceCompletionServices,
LanguageNames.VisualBasic => _visualBasicBraceCompletionServices,
_ => throw new ArgumentException($"Language {document.Project.Language} is not recognized for OnAutoInsert")
};
var servicesForDocument = _braceCompletionServices.Where(s => s.Metadata.Language == document.Project.Language).SelectAsArray(s => s.Value);

var parsedDocument = await ParsedDocument.CreateAsync(document, cancellationToken).ConfigureAwait(false);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Imports Microsoft.CodeAnalysis.VisualBasic.LanguageService
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax

Namespace Microsoft.CodeAnalysis.VisualBasic.BraceCompletion
<Export(LanguageNames.VisualBasic, GetType(IBraceCompletionService)), [Shared]>
<ExportBraceCompletionService(LanguageNames.VisualBasic), [Shared]>
Friend Class BracketBraceCompletionService
Inherits AbstractVisualBasicBraceCompletionService

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Imports Microsoft.CodeAnalysis.Host.Mef
Imports Microsoft.CodeAnalysis.VisualBasic

Namespace Microsoft.CodeAnalysis.VisualBasic.BraceCompletion
<Export(LanguageNames.VisualBasic, GetType(IBraceCompletionService)), [Shared]>
<ExportBraceCompletionService(LanguageNames.VisualBasic), [Shared]>
Friend Class CurlyBraceCompletionService
Inherits AbstractVisualBasicBraceCompletionService

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Imports Microsoft.CodeAnalysis.VisualBasic
Imports Microsoft.CodeAnalysis.VisualBasic.Extensions.ContextQuery

Namespace Microsoft.CodeAnalysis.VisualBasic.BraceCompletion
<Export(LanguageNames.VisualBasic, GetType(IBraceCompletionService)), [Shared]>
<ExportBraceCompletionService(LanguageNames.VisualBasic), [Shared]>
Friend Class InterpolatedStringBraceCompletionService
Inherits AbstractVisualBasicBraceCompletionService

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic

Namespace Microsoft.CodeAnalysis.VisualBasic.BraceCompletion
<Export(LanguageNames.VisualBasic, GetType(IBraceCompletionService)), [Shared]>
<ExportBraceCompletionService(LanguageNames.VisualBasic), [Shared]>
Friend Class InterpolationBraceCompletionService
Inherits AbstractVisualBasicBraceCompletionService

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Imports Microsoft.CodeAnalysis.VisualBasic
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax

Namespace Microsoft.CodeAnalysis.VisualBasic.BraceCompletion
<Export(LanguageNames.VisualBasic, GetType(IBraceCompletionService)), [Shared]>
<ExportBraceCompletionService(LanguageNames.VisualBasic), [Shared]>
Friend Class LessAndGreaterThanCompletionService
Inherits AbstractVisualBasicBraceCompletionService

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Imports Microsoft.CodeAnalysis.VisualBasic
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax

Namespace Microsoft.CodeAnalysis.VisualBasic.BraceCompletion
<Export(LanguageNames.VisualBasic, GetType(IBraceCompletionService)), [Shared]>
<ExportBraceCompletionService(LanguageNames.VisualBasic), [Shared]>
Friend Class ParenthesisBraceCompletionService
Inherits AbstractVisualBasicBraceCompletionService

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Imports Microsoft.CodeAnalysis.Host.Mef
Imports Microsoft.CodeAnalysis.VisualBasic

Namespace Microsoft.CodeAnalysis.VisualBasic.BraceCompletion
<Export(LanguageNames.VisualBasic, GetType(IBraceCompletionService)), [Shared]>
<ExportBraceCompletionService(LanguageNames.VisualBasic), [Shared]>
Friend Class StringLiteralBraceCompletionService
Inherits AbstractVisualBasicBraceCompletionService

Expand Down
Loading