提交 b3c39f04 编写于 作者: C Cyrus Najmabadi

Update regex features with latet master.

上级 506b6f31
......@@ -15,17 +15,20 @@ internal abstract class AbstractEmbeddedLanguageBraceMatcher : IBraceMatcher
public async Task<BraceMatchingResult?> FindBracesAsync(
Document document, int position, CancellationToken cancellationToken)
{
var languageProvider = document.GetLanguageService<IEmbeddedLanguageProvider>();
foreach (var language in languageProvider.GetEmbeddedLanguages())
var languagesProvider = document.GetLanguageService<IEmbeddedLanguagesProvider>();
if (languagesProvider != null)
{
var braceMatcher = language.BraceMatcher;
if (braceMatcher != null)
foreach (var language in languagesProvider.GetEmbeddedLanguages())
{
var result = await braceMatcher.FindBracesAsync(
document, position, cancellationToken).ConfigureAwait(false);
if (result != null)
var braceMatcher = language.BraceMatcher;
if (braceMatcher != null)
{
return new BraceMatchingResult(result.Value.LeftSpan, result.Value.RightSpan);
var result = await braceMatcher.FindBracesAsync(
document, position, cancellationToken).ConfigureAwait(false);
if (result != null)
{
return new BraceMatchingResult(result.Value.LeftSpan, result.Value.RightSpan);
}
}
}
}
......
......@@ -11,7 +11,7 @@ namespace Microsoft.CodeAnalysis.CSharp.EmbeddedLanguages
internal class CSharpEmbeddedLanguageCodeFixProvider : AbstractEmbeddedLanguageCodeFixProvider
{
public CSharpEmbeddedLanguageCodeFixProvider()
: base(CSharpEmbeddedLanguageProvider.Instance)
: base(CSharpEmbeddedLanguagesProvider.Instance)
{
}
}
......
......@@ -10,7 +10,7 @@ namespace Microsoft.CodeAnalysis.CSharp.EmbeddedLanguages
internal class CSharpEmbeddedLanguageDiagnosticAnalyzer : AbstractEmbeddedLanguageDiagnosticAnalyzer
{
public CSharpEmbeddedLanguageDiagnosticAnalyzer()
: base(CSharpEmbeddedLanguageProvider.Instance)
: base(CSharpEmbeddedLanguagesProvider.Instance)
{
}
}
......
......@@ -94,25 +94,28 @@ internal abstract partial class AbstractDocumentHighlightsService : IDocumentHig
private async Task<ImmutableArray<DocumentHighlights>> TryGetEmbeddedLanguageHighlightsAsync(
Document document, int position, CancellationToken cancellationToken)
{
var embeddedLanguageProvider = document.GetLanguageService<IEmbeddedLanguageProvider>();
foreach (var language in embeddedLanguageProvider.GetEmbeddedLanguages())
var embeddedLanguagesProvider = document.GetLanguageService<IEmbeddedLanguagesProvider>();
if (embeddedLanguagesProvider != null)
{
var highlighter = language.Highlighter;
if (highlighter != null)
foreach (var language in embeddedLanguagesProvider.GetEmbeddedLanguages())
{
var highlights = await highlighter.GetHighlightsAsync(
document, position, cancellationToken).ConfigureAwait(false);
if (!highlights.IsDefaultOrEmpty)
var highlighter = language.Highlighter;
if (highlighter != null)
{
var result = ArrayBuilder<HighlightSpan>.GetInstance();
foreach (var span in highlights)
var highlights = await highlighter.GetHighlightsAsync(
document, position, cancellationToken).ConfigureAwait(false);
if (!highlights.IsDefaultOrEmpty)
{
result.Add(new HighlightSpan(span, HighlightSpanKind.None));
}
var result = ArrayBuilder<HighlightSpan>.GetInstance();
foreach (var span in highlights)
{
result.Add(new HighlightSpan(span, HighlightSpanKind.None));
}
return ImmutableArray.Create(new DocumentHighlights(
document, result.ToImmutableAndFree()));
return ImmutableArray.Create(new DocumentHighlights(
document, result.ToImmutableAndFree()));
}
}
}
}
......
......@@ -22,21 +22,19 @@ namespace Microsoft.CodeAnalysis.EmbeddedLanguages
/// </summary>
internal abstract class AbstractEmbeddedLanguageCodeFixProvider : SyntaxEditorBasedCodeFixProvider
{
private readonly IEmbeddedLanguageProvider _embeddedLanguageProvider;
private readonly Dictionary<string, IEmbeddedCodeFixProvider> _diagnosticIdToCodeFixProvider;
public override ImmutableArray<string> FixableDiagnosticIds { get; }
protected AbstractEmbeddedLanguageCodeFixProvider(
IEmbeddedLanguageProvider embeddedLanguageProvider)
IEmbeddedLanguagesProvider embeddedLanguagesProvider)
{
_embeddedLanguageProvider = embeddedLanguageProvider;
_diagnosticIdToCodeFixProvider = new Dictionary<string, IEmbeddedCodeFixProvider>();
// Create a mapping from each IEmbeddedCodeFixProvider.FixableDiagnosticIds back to the
// IEmbeddedCodeFixProvider itself. That way, when we hear about diagnostics, we know
// which provider to actually do the fixing.
foreach (var language in embeddedLanguageProvider.GetEmbeddedLanguages())
foreach (var language in embeddedLanguagesProvider.GetEmbeddedLanguages())
{
var codeFixProvider = language.CodeFixProvider;
if (codeFixProvider != null)
......
......@@ -12,13 +12,13 @@ internal abstract class AbstractEmbeddedLanguageDiagnosticAnalyzer : DiagnosticA
private readonly ImmutableArray<IEmbeddedDiagnosticAnalyzer> _analyzers;
protected AbstractEmbeddedLanguageDiagnosticAnalyzer(
IEmbeddedLanguageProvider embeddedLanguageProvider)
IEmbeddedLanguagesProvider embeddedLanguagesProvider)
{
var supportedDiagnostics = ArrayBuilder<DiagnosticDescriptor>.GetInstance();
var analyzers = ArrayBuilder<IEmbeddedDiagnosticAnalyzer>.GetInstance();
foreach (var language in embeddedLanguageProvider.GetEmbeddedLanguages())
foreach (var language in embeddedLanguagesProvider.GetEmbeddedLanguages())
{
var analyzer = language.DiagnosticAnalyzer;
if (analyzer != null)
......
......@@ -11,7 +11,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.EmbeddedLanguages
Inherits AbstractEmbeddedLanguageCodeFixProvider
Public Sub New()
MyBase.New(VisualBasicEmbeddedLanguageProvider.Instance)
MyBase.New(VisualBasicEmbeddedLanguagesProvider.Instance)
End Sub
End Class
End Namespace
......@@ -10,7 +10,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.EmbeddedLanguages
Inherits AbstractEmbeddedLanguageDiagnosticAnalyzer
Public Sub New()
MyBase.New(VisualBasicEmbeddedLanguageProvider.Instance)
MyBase.New(VisualBasicEmbeddedLanguagesProvider.Instance)
End Sub
End Class
End Namespace
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.Classification.Classifiers;
using Microsoft.CodeAnalysis.CSharp.EmbeddedLanguages.LanguageServices;
namespace Microsoft.CodeAnalysis.CSharp.Classification.Classifiers
{
internal class EmbeddedLanguageTokenClassifier : AbstractEmbeddedLanguageTokenClassifier
{
public override ImmutableArray<int> SyntaxTokenKinds { get; } = ImmutableArray.Create((int)SyntaxKind.StringLiteralToken);
public EmbeddedLanguageTokenClassifier()
: base(CSharpEmbeddedLanguageProvider.Instance)
{
}
}
}
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Composition;
using Microsoft.CodeAnalysis.CSharp.EmbeddedLanguages.VirtualChars;
using Microsoft.CodeAnalysis.Editing;
using Microsoft.CodeAnalysis.EmbeddedLanguages.LanguageServices;
using Microsoft.CodeAnalysis.Host.Mef;
namespace Microsoft.CodeAnalysis.CSharp.EmbeddedLanguages.LanguageServices
{
[ExportLanguageService(typeof(IEmbeddedLanguageProvider), LanguageNames.CSharp), Shared]
internal class CSharpEmbeddedLanguageProvider : AbstractEmbeddedLanguageProvider
{
public static IEmbeddedLanguageProvider Instance = new CSharpEmbeddedLanguageProvider();
private CSharpEmbeddedLanguageProvider()
: base((int)SyntaxKind.StringLiteralToken,
CSharpSyntaxFactsService.Instance,
CSharpSemanticFactsService.Instance,
CSharpVirtualCharService.Instance)
{
}
internal override void AddComment(SyntaxEditor editor, SyntaxToken stringLiteral, string commentContents)
{
var triviaList = SyntaxFactory.TriviaList(
SyntaxFactory.Comment($"/*{commentContents}*/"),
SyntaxFactory.ElasticSpace);
var newStringLiteral = stringLiteral.WithLeadingTrivia(
stringLiteral.LeadingTrivia.AddRange(triviaList));
editor.ReplaceNode(stringLiteral.Parent, stringLiteral.Parent.ReplaceToken(stringLiteral, newStringLiteral));
}
}
}
......@@ -2,6 +2,7 @@
using System.Composition;
using Microsoft.CodeAnalysis.CSharp.EmbeddedLanguages.VirtualChars;
using Microsoft.CodeAnalysis.Editing;
using Microsoft.CodeAnalysis.EmbeddedLanguages.LanguageServices;
using Microsoft.CodeAnalysis.Host.Mef;
......@@ -20,5 +21,17 @@ public CSharpEmbeddedLanguagesProvider()
CSharpVirtualCharService.Instance)
{
}
internal override void AddComment(SyntaxEditor editor, SyntaxToken stringLiteral, string commentContents)
{
var triviaList = SyntaxFactory.TriviaList(
SyntaxFactory.Comment($"/*{commentContents}*/"),
SyntaxFactory.ElasticSpace);
var newStringLiteral = stringLiteral.WithLeadingTrivia(
stringLiteral.LeadingTrivia.AddRange(triviaList));
editor.ReplaceNode(stringLiteral.Parent, stringLiteral.Parent.ReplaceToken(stringLiteral, newStringLiteral));
}
}
}
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Threading;
using Microsoft.CodeAnalysis.EmbeddedLanguages.LanguageServices;
using Microsoft.CodeAnalysis.PooledObjects;
namespace Microsoft.CodeAnalysis.Classification.Classifiers
{
internal abstract class AbstractEmbeddedLanguageTokenClassifier : AbstractSyntaxClassifier
{
private readonly IEmbeddedLanguageProvider _languageProvider;
protected AbstractEmbeddedLanguageTokenClassifier(IEmbeddedLanguageProvider languageProvider)
{
_languageProvider = languageProvider;
}
public sealed override void AddClassifications(Workspace workspace, SyntaxToken token, SemanticModel semanticModel, ArrayBuilder<ClassifiedSpan> result, CancellationToken cancellationToken)
{
foreach (var language in _languageProvider.GetEmbeddedLanguages())
{
var classifier = language.Classifier;
if (classifier != null)
{
var count = result.Count;
classifier.AddClassifications(workspace, token, semanticModel, result, cancellationToken);
if (result.Count != count)
{
// This classifier added values. No need to check the other ones.
return;
}
}
}
}
}
}
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.Editing;
using Microsoft.CodeAnalysis.EmbeddedLanguages.RegularExpressions.LanguageServices;
using Microsoft.CodeAnalysis.EmbeddedLanguages.VirtualChars;
using Microsoft.CodeAnalysis.LanguageServices;
namespace Microsoft.CodeAnalysis.EmbeddedLanguages.LanguageServices
{
/// <summary>
/// Abstract implementation of the C# and VB embedded language providers.
/// </summary>
internal abstract class AbstractEmbeddedLanguageProvider : IEmbeddedLanguageProvider
{
private readonly ImmutableArray<IEmbeddedLanguage> _embeddedLanguages;
protected AbstractEmbeddedLanguageProvider(
int stringLiteralKind,
ISyntaxFactsService syntaxFacts,
ISemanticFactsService semanticFacts,
IVirtualCharService virtualCharService)
{
_embeddedLanguages = ImmutableArray.Create<IEmbeddedLanguage>(
new RegexEmbeddedLanguage(this, stringLiteralKind, syntaxFacts, semanticFacts, virtualCharService));
}
public ImmutableArray<IEmbeddedLanguage> GetEmbeddedLanguages()
=> _embeddedLanguages;
/// <summary>
/// Helper method used by the VB and C# <see cref="IEmbeddedCodeFixProvider"/>s so they can
/// add special comments to string literals to convey that language services should light up
/// for them.
/// </summary>
internal abstract void AddComment(
SyntaxEditor editor, SyntaxToken stringLiteral, string commentContents);
}
}
......@@ -4,6 +4,7 @@
using System.Collections.Immutable;
using System.Threading;
using Microsoft.CodeAnalysis.Editing;
using Microsoft.CodeAnalysis.EmbeddedLanguages.RegularExpressions.LanguageServices;
using Microsoft.CodeAnalysis.EmbeddedLanguages.VirtualChars;
using Microsoft.CodeAnalysis.LanguageServices;
......@@ -24,12 +25,19 @@ internal abstract class AbstractEmbeddedLanguagesProvider : IEmbeddedLanguagesPr
IVirtualCharService virtualCharService)
{
_embeddedLanguages = ImmutableArray.Create<IEmbeddedLanguage>(
new FallbackEmbeddedLanguage(
stringLiteralTokenKind, interpolatedTextTokenKind,
syntaxFacts, semanticFacts, virtualCharService));
new RegexEmbeddedLanguage(stringLiteralTokenKind, syntaxFacts, semanticFacts, virtualCharService),
new FallbackEmbeddedLanguage(stringLiteralTokenKind, interpolatedTextTokenKind, syntaxFacts, semanticFacts, virtualCharService));
}
public ImmutableArray<IEmbeddedLanguage> GetEmbeddedLanguages()
=> _embeddedLanguages;
/// <summary>
/// Helper method used by the VB and C# <see cref="IEmbeddedCodeFixProvider"/>s so they can
/// add special comments to string literals to convey that language services should light up
/// for them.
/// </summary>
internal abstract void AddComment(
SyntaxEditor editor, SyntaxToken stringLiteral, string commentContents);
}
}
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.Host;
namespace Microsoft.CodeAnalysis.EmbeddedLanguages.LanguageServices
{
/// <summary>
/// Service that returns all the embedded languages supported. Each embedded language can expose
/// individual language services through the <see cref="IEmbeddedLanguage"/> interface.
/// </summary>
internal interface IEmbeddedLanguageProvider : ILanguageService
{
ImmutableArray<IEmbeddedLanguage> GetEmbeddedLanguages();
}
}
......@@ -14,7 +14,6 @@ internal class RegexEmbeddedLanguage : IEmbeddedLanguage
public IVirtualCharService VirtualCharService { get; }
public RegexEmbeddedLanguage(
AbstractEmbeddedLanguageProvider languageProvider,
int stringLiteralKind,
ISyntaxFactsService syntaxFacts,
ISemanticFactsService semanticFacts,
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports System.Collections.Immutable
Imports Microsoft.CodeAnalysis.Classification.Classifiers
Imports Microsoft.CodeAnalysis.VisualBasic.EmbeddedLanguages.LanguageServices
Namespace Microsoft.CodeAnalysis.VisualBasic.Classification.Classifiers
Friend Class EmbeddedLanguageTokenClassifier
Inherits AbstractEmbeddedLanguageTokenClassifier
Public Overrides ReadOnly Property SyntaxTokenKinds As ImmutableArray(Of Integer) = ImmutableArray.Create(Of Integer)(SyntaxKind.StringLiteralToken)
Public Sub New()
MyBase.New(VisualBasicEmbeddedLanguageProvider.Instance)
End Sub
End Class
End Namespace
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports System.Composition
Imports Microsoft.CodeAnalysis.Editing
Imports Microsoft.CodeAnalysis.EmbeddedLanguages.LanguageServices
Imports Microsoft.CodeAnalysis.Host.Mef
Imports Microsoft.CodeAnalysis.VisualBasic.EmbeddedLanguages.VirtualChars
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.EmbeddedLanguages.LanguageServices
<ExportLanguageService(GetType(IEmbeddedLanguageProvider), LanguageNames.VisualBasic), [Shared]>
Friend Class VisualBasicEmbeddedLanguageProvider
Inherits AbstractEmbeddedLanguageProvider
Public Shared Instance As New VisualBasicEmbeddedLanguageProvider()
Private Sub New()
MyBase.New(SyntaxKind.StringLiteralToken,
VisualBasicSyntaxFactsService.Instance,
VisualBasicSemanticFactsService.Instance,
VisualBasicVirtualCharService.Instance)
End Sub
Friend Overrides Sub AddComment(editor As SyntaxEditor, stringLiteral As SyntaxToken, commentContents As String)
Dim trivia = SyntaxFactory.TriviaList(
SyntaxFactory.CommentTrivia($"' {commentContents}"),
SyntaxFactory.ElasticCarriageReturnLineFeed)
Dim containingStatement = stringLiteral.Parent.GetAncestor(Of StatementSyntax)
Dim leadingBlankLines = containingStatement.GetLeadingBlankLines()
Dim newStatement = containingStatement.GetNodeWithoutLeadingBlankLines().
WithPrependedLeadingTrivia(leadingBlankLines.AddRange(trivia))
editor.ReplaceNode(containingStatement, newStatement)
End Sub
End Class
End Namespace
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports System.Composition
Imports Microsoft.CodeAnalysis.Editing
Imports Microsoft.CodeAnalysis.EmbeddedLanguages.LanguageServices
Imports Microsoft.CodeAnalysis.Host.Mef
Imports Microsoft.CodeAnalysis.VisualBasic.EmbeddedLanguages.VirtualChars
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.EmbeddedLanguages.LanguageServices
<ExportLanguageService(GetType(IEmbeddedLanguagesProvider), LanguageNames.VisualBasic), [Shared]>
......@@ -19,5 +21,20 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.EmbeddedLanguages.LanguageServices
VisualBasicSemanticFactsService.Instance,
VisualBasicVirtualCharService.Instance)
End Sub
Friend Overrides Sub AddComment(editor As SyntaxEditor, stringLiteral As SyntaxToken, commentContents As String)
Dim trivia = SyntaxFactory.TriviaList(
SyntaxFactory.CommentTrivia($"' {commentContents}"),
SyntaxFactory.ElasticCarriageReturnLineFeed)
Dim containingStatement = stringLiteral.Parent.GetAncestor(Of StatementSyntax)
Dim leadingBlankLines = containingStatement.GetLeadingBlankLines()
Dim newStatement = containingStatement.GetNodeWithoutLeadingBlankLines().
WithPrependedLeadingTrivia(leadingBlankLines.AddRange(trivia))
editor.ReplaceNode(containingStatement, newStatement)
End Sub
End Class
End Namespace
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册