提交 c9bcbfd4 编写于 作者: S Sam Harwell

Avoid the unnecessary use of MEF for IFormattingRule

上级 1fbb9720
// 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;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.Formatting.Rules;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Shared.Collections;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Formatting
{
internal class CSharpSyntaxFormattingService : AbstractSyntaxFormattingService
{
private readonly Lazy<IEnumerable<IFormattingRule>> _lazyExportedRules;
private readonly ImmutableList<IFormattingRule> _rules;
public CSharpSyntaxFormattingService()
{
_lazyExportedRules = new Lazy<IEnumerable<IFormattingRule>>(() => new IFormattingRule[]
{
_rules = ImmutableList.Create<IFormattingRule>(
new WrappingFormattingRule(),
new SpacingFormattingRule(),
new NewLineUserSettingFormattingRule(),
new IndentUserSettingsFormattingRule(),
new ElasticTriviaFormattingRule(),
new EndOfFileTokenFormattingRule(),
new StructuredTriviaFormattingRule(),
......@@ -31,23 +29,12 @@ public CSharpSyntaxFormattingService()
new AnchorIndentationFormattingRule(),
new QueryExpressionFormattingRule(),
new TokenBasedFormattingRule(),
new DefaultOperationProvider(),
});
new DefaultOperationProvider());
}
public override IEnumerable<IFormattingRule> GetDefaultFormattingRules()
{
var rules = _lazyExportedRules.Value;
var spaceFormattingRules = new IFormattingRule[]
{
new WrappingFormattingRule(),
new SpacingFormattingRule(),
new NewLineUserSettingFormattingRule(),
new IndentUserSettingsFormattingRule()
};
return spaceFormattingRules.Concat(rules).ToImmutableArray();
return _rules;
}
protected override IFormattingResult CreateAggregatedFormattingResult(SyntaxNode node, IList<AbstractFormattingResult> results, SimpleIntervalTree<TextSpan> formattingSpans = null)
......
' 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 System.Threading
Imports Microsoft.CodeAnalysis.Diagnostics
Imports Microsoft.CodeAnalysis.Formatting
Imports Microsoft.CodeAnalysis.Formatting.Rules
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.Shared.Collections
Imports Microsoft.CodeAnalysis.Text
......@@ -12,23 +11,20 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting
Friend Class VisualBasicSyntaxFormattingService
Inherits AbstractSyntaxFormattingService
Private ReadOnly _lazyExportedRules As Lazy(Of IEnumerable(Of IFormattingRule))
Private ReadOnly _rules As ImmutableList(Of IFormattingRule)
Public Sub New()
_lazyExportedRules = New Lazy(Of IEnumerable(Of IFormattingRule))(
Function()
Return New IFormattingRule() {
New StructuredTriviaFormattingRule(),
New ElasticTriviaFormattingRule(),
New AdjustSpaceFormattingRule(),
New AlignTokensFormattingRule(),
New NodeBasedFormattingRule()
}
End Function)
_rules = ImmutableList.Create(Of IFormattingRule)(
New StructuredTriviaFormattingRule(),
New ElasticTriviaFormattingRule(),
New AdjustSpaceFormattingRule(),
New AlignTokensFormattingRule(),
New NodeBasedFormattingRule(),
New DefaultOperationProvider())
End Sub
Public Overrides Function GetDefaultFormattingRules() As IEnumerable(Of IFormattingRule)
Return _lazyExportedRules.Value
Return _rules
End Function
Protected Overrides Function CreateAggregatedFormattingResult(node As SyntaxNode, results As IList(Of AbstractFormattingResult), Optional formattingSpans As SimpleIntervalTree(Of TextSpan) = Nothing) As IFormattingResult
......
......@@ -4,50 +4,45 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Composition;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.Formatting.Rules;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Shared.Collections;
using Microsoft.CodeAnalysis.Shared.Utilities;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Formatting
{
[ExportLanguageService(typeof(ISyntaxFormattingService), LanguageNames.CSharp), Shared]
internal class CSharpSyntaxFormattingService : AbstractSyntaxFormattingService
{
private readonly Lazy<IEnumerable<IFormattingRule>> _lazyExportedRules;
private readonly ImmutableList<IFormattingRule> _rules;
[ImportingConstructor]
public CSharpSyntaxFormattingService([ImportMany] IEnumerable<Lazy<IFormattingRule, OrderableLanguageMetadata>> rules)
[Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
public CSharpSyntaxFormattingService()
{
_lazyExportedRules = new Lazy<IEnumerable<IFormattingRule>>(() =>
ExtensionOrderer.Order(rules)
.Where(x => x.Metadata.Language == LanguageNames.CSharp)
.Select(x => x.Value)
.Concat(new DefaultOperationProvider())
.ToImmutableArray());
_rules = ImmutableList.Create<IFormattingRule>(
new WrappingFormattingRule(),
new SpacingFormattingRule(),
new NewLineUserSettingFormattingRule(),
new IndentUserSettingsFormattingRule(),
new ElasticTriviaFormattingRule(),
new EndOfFileTokenFormattingRule(),
new StructuredTriviaFormattingRule(),
new IndentBlockFormattingRule(),
new SuppressFormattingRule(),
new AnchorIndentationFormattingRule(),
new QueryExpressionFormattingRule(),
new TokenBasedFormattingRule(),
new DefaultOperationProvider());
}
public override IEnumerable<IFormattingRule> GetDefaultFormattingRules()
{
var rules = _lazyExportedRules.Value;
var spaceFormattingRules = new IFormattingRule[]
{
new WrappingFormattingRule(),
new SpacingFormattingRule(),
new NewLineUserSettingFormattingRule(),
new IndentUserSettingsFormattingRule()
};
return spaceFormattingRules.Concat(rules).ToImmutableArray();
return _rules;
}
protected override IFormattingResult CreateAggregatedFormattingResult(SyntaxNode node, IList<AbstractFormattingResult> results, SimpleIntervalTree<TextSpan> formattingSpans = null)
......
// 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.Generic;
using System.Composition;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Formatting.Rules;
using Microsoft.CodeAnalysis.Options;
namespace Microsoft.CodeAnalysis.CSharp.Formatting
{
#if !CODE_STYLE
[ExportFormattingRule(Name, LanguageNames.CSharp), Shared]
[ExtensionOrder(After = SuppressFormattingRule.Name)]
#endif
internal class AnchorIndentationFormattingRule : BaseFormattingRule
{
internal const string Name = "CSharp Anchor Indentation Formatting Rule";
......
......@@ -2,7 +2,6 @@
using System.Collections.Generic;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.CSharp.Utilities;
using Microsoft.CodeAnalysis.Formatting.Rules;
using Microsoft.CodeAnalysis.Shared.Utilities;
using Microsoft.CodeAnalysis.Text;
......
......@@ -2,10 +2,8 @@
using System;
using System.Collections.Generic;
using System.Composition;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.CSharp.Utilities;
......@@ -16,9 +14,6 @@
namespace Microsoft.CodeAnalysis.CSharp.Formatting
{
#if !CODE_STYLE
[ExportFormattingRule(Name, LanguageNames.CSharp), Shared]
#endif
internal class ElasticTriviaFormattingRule : BaseFormattingRule
{
internal const string Name = "CSharp Elastic trivia Formatting Rule";
......
// 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.Formatting.Rules;
using Microsoft.CodeAnalysis.Options;
namespace Microsoft.CodeAnalysis.CSharp.Formatting
{
#if !CODE_STYLE
[ExportFormattingRule(Name, LanguageNames.CSharp), Shared]
[ExtensionOrder(After = ElasticTriviaFormattingRule.Name)]
#endif
internal class EndOfFileTokenFormattingRule : BaseFormattingRule
{
internal const string Name = "CSharp End Of File Token Formatting Rule";
......
......@@ -2,7 +2,6 @@
using System;
using System.Collections.Generic;
using System.Composition;
using System.Diagnostics;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Formatting.Rules;
......@@ -12,10 +11,6 @@
namespace Microsoft.CodeAnalysis.CSharp.Formatting
{
#if !CODE_STYLE
[ExportFormattingRule(Name, LanguageNames.CSharp), Shared]
[ExtensionOrder(After = StructuredTriviaFormattingRule.Name)]
#endif
internal class IndentBlockFormattingRule : BaseFormattingRule
{
internal const string Name = "CSharp IndentBlock Formatting Rule";
......
// 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.Generic;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Formatting.Rules;
using Microsoft.CodeAnalysis.Options;
......
// 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.Diagnostics;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Formatting.Rules;
using Microsoft.CodeAnalysis.Options;
......
// 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.Generic;
using System.Composition;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Formatting.Rules;
using Microsoft.CodeAnalysis.Options;
......@@ -9,10 +8,6 @@
namespace Microsoft.CodeAnalysis.CSharp.Formatting
{
#if !CODE_STYLE
[ExportFormattingRule(Name, LanguageNames.CSharp), Shared]
[ExtensionOrder(After = AnchorIndentationFormattingRule.Name)]
#endif
internal class QueryExpressionFormattingRule : BaseFormattingRule
{
internal const string Name = "CSharp Query Expressions Formatting Rule";
......
// 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.Syntax;
using Microsoft.CodeAnalysis.Formatting.Rules;
using Microsoft.CodeAnalysis.Options;
namespace Microsoft.CodeAnalysis.CSharp.Formatting
{
#if !CODE_STYLE
[ExportFormattingRule(Name, LanguageNames.CSharp), Shared]
[ExtensionOrder(After = EndOfFileTokenFormattingRule.Name)]
#endif
internal class StructuredTriviaFormattingRule : BaseFormattingRule
{
internal const string Name = "CSharp Structured Trivia Formatting Rule";
......
// 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.Generic;
using System.Composition;
using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Formatting.Rules;
using Microsoft.CodeAnalysis.Options;
using System.Linq;
namespace Microsoft.CodeAnalysis.CSharp.Formatting
{
#if !CODE_STYLE
[ExportFormattingRule(Name, LanguageNames.CSharp), Shared]
[ExtensionOrder(After = IndentBlockFormattingRule.Name)]
#endif
internal class SuppressFormattingRule : BaseFormattingRule
{
internal const string Name = "CSharp Suppress Formatting Rule";
......
// 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.Extensions;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Formatting.Rules;
......@@ -12,10 +11,6 @@
namespace Microsoft.CodeAnalysis.CSharp.Formatting
{
#if !CODE_STYLE
[ExportFormattingRule(Name, LanguageNames.CSharp), Shared]
[ExtensionOrder(After = QueryExpressionFormattingRule.Name)]
#endif
internal class TokenBasedFormattingRule : BaseFormattingRule
{
internal const string Name = "CSharp Token Based Formatting Rule";
......
......@@ -2,14 +2,11 @@
using System;
using System.Collections.Generic;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Formatting.Rules;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Formatting
{
......
// 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;
using System.Composition;
namespace Microsoft.CodeAnalysis.Formatting.Rules
{
/// <summary>
/// Specifies the exact type of the formatting rule exported
/// </summary>
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class)]
internal class ExportFormattingRule : ExportAttribute
{
public string Name { get; }
public string Language { get; }
public ExportFormattingRule(string name, string language)
: base(typeof(IFormattingRule))
{
this.Name = name;
this.Language = language ?? throw new ArgumentNullException(nameof(language));
}
}
}
' 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.Formatting.Rules
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting
#If Not CODE_STYLE Then
<ExportFormattingRule(AdjustSpaceFormattingRule.Name, LanguageNames.VisualBasic), [Shared]>
<ExtensionOrder(After:=ElasticTriviaFormattingRule.Name)>
Friend Class AdjustSpaceFormattingRule
#Else
Friend Class AdjustSpaceFormattingRule
#End If
Inherits BaseFormattingRule
Friend Const Name As String = "VisualBasic Adjust Space Formatting Rule"
......
' 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.Formatting.Rules
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting
#If Not CODE_STYLE Then
<ExportFormattingRule(AlignTokensFormattingRule.Name, LanguageNames.VisualBasic), [Shared]>
<ExtensionOrder(After:=AdjustSpaceFormattingRule.Name)>
Friend Class AlignTokensFormattingRule
#Else
Friend Class AlignTokensFormattingRule
#End If
Inherits BaseFormattingRule
Friend Const Name As String = "VisualBasic Align Tokens Formatting Rule"
......
' 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.Formatting
Imports Microsoft.CodeAnalysis.Formatting.Rules
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting
#If Not CODE_STYLE Then
<ExportFormattingRule(ElasticTriviaFormattingRule.Name, LanguageNames.VisualBasic), [Shared]>
<ExtensionOrder(After:=StructuredTriviaFormattingRule.Name)>
Friend Class ElasticTriviaFormattingRule
#Else
Friend Class ElasticTriviaFormattingRule
#End If
Inherits BaseFormattingRule
Friend Const Name As String = "VisualBasic Elastic Trivia Formatting Rule"
......
' 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
Imports Microsoft.CodeAnalysis.Formatting
Imports Microsoft.CodeAnalysis.Formatting.Rules
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting
#If Not CODE_STYLE Then
<ExportFormattingRule(NodeBasedFormattingRule.Name, LanguageNames.VisualBasic), [Shared]>
<ExtensionOrder(After:=AlignTokensFormattingRule.Name)>
Friend Class NodeBasedFormattingRule
#Else
Friend Class NodeBasedFormattingRule
#End If
Inherits BaseFormattingRule
Friend Const Name As String = "VisualBasic Node Based Formatting Rule"
......
' 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.Formatting.Rules
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting
#If Not CODE_STYLE Then
<ExportFormattingRule(StructuredTriviaFormattingRule.Name, LanguageNames.VisualBasic), [Shared]>
<ExtensionOrder()>
Friend Class StructuredTriviaFormattingRule
#Else
Friend Class StructuredTriviaFormattingRule
#End If
Inherits BaseFormattingRule
Friend Const Name As String = "VisualBasic Structured Trivia Formatting Rule"
......
......@@ -15,18 +15,22 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting
Friend Class VisualBasicSyntaxFormattingService
Inherits AbstractSyntaxFormattingService
Private ReadOnly _lazyExportedRules As Lazy(Of IEnumerable(Of IFormattingRule))
Private ReadOnly _rules As ImmutableList(Of IFormattingRule)
<ImportingConstructor>
Public Sub New(<ImportMany> rules As IEnumerable(Of Lazy(Of IFormattingRule, OrderableLanguageMetadata)))
Me._lazyExportedRules = New Lazy(Of IEnumerable(Of IFormattingRule))(
Function()
Return ExtensionOrderer.Order(rules).Where(Function(x) x.Metadata.Language = LanguageNames.VisualBasic).Select(Function(x) x.Value).Concat(New DefaultOperationProvider()).ToImmutableArray()
End Function)
<Obsolete(MefConstruction.ImportingConstructorMessage, True)>
Public Sub New()
_rules = ImmutableList.Create(Of IFormattingRule)(
New StructuredTriviaFormattingRule(),
New ElasticTriviaFormattingRule(),
New AdjustSpaceFormattingRule(),
New AlignTokensFormattingRule(),
New NodeBasedFormattingRule(),
New DefaultOperationProvider())
End Sub
Public Overrides Function GetDefaultFormattingRules() As IEnumerable(Of IFormattingRule)
Return _lazyExportedRules.Value
Return _rules
End Function
Protected Overrides Function CreateAggregatedFormattingResult(node As SyntaxNode, results As IList(Of AbstractFormattingResult), Optional formattingSpans As SimpleIntervalTree(Of TextSpan) = Nothing) As IFormattingResult
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册