Skip to content
This repository was archived by the owner on Jul 12, 2022. It is now read-only.

Commit eaf79a1

Browse files
author
Lakshmi Priya Sekar
committed
Several fixes
- Adding new rules - Removing infinite loop and introducing ordering of rules - Changing document write commit on workspace level - Adding RuleExtensions for common functionality among rules
1 parent da3919f commit eaf79a1

19 files changed

+484
-123
lines changed

src/CodeFormatter/App.config

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,42 @@
1-
<?xml version="1.0" encoding="utf-8" ?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<configuration>
33
<startup>
44
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
55
</startup>
6+
<runtime>
7+
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
8+
<dependentAssembly>
9+
<assemblyIdentity name="Microsoft.CodeAnalysis" publicKeyToken="31bf3856ad364e35" culture="neutral" />
10+
<bindingRedirect oldVersion="0.0.0.0-1.0.0.0" newVersion="1.0.0.0" />
11+
</dependentAssembly>
12+
<dependentAssembly>
13+
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
14+
<bindingRedirect oldVersion="0.0.0.0-1.1.32.0" newVersion="1.1.32.0" />
15+
</dependentAssembly>
16+
<dependentAssembly>
17+
<assemblyIdentity name="System.Reflection.Metadata" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
18+
<bindingRedirect oldVersion="0.0.0.0-1.0.17.0" newVersion="1.0.17.0" />
19+
</dependentAssembly>
20+
<dependentAssembly>
21+
<assemblyIdentity name="Microsoft.CodeAnalysis.Desktop" publicKeyToken="31bf3856ad364e35" culture="neutral" />
22+
<bindingRedirect oldVersion="0.0.0.0-1.0.0.0" newVersion="1.0.0.0" />
23+
</dependentAssembly>
24+
<dependentAssembly>
25+
<assemblyIdentity name="Microsoft.CodeAnalysis.Workspaces" publicKeyToken="31bf3856ad364e35" culture="neutral" />
26+
<bindingRedirect oldVersion="0.0.0.0-1.0.0.0" newVersion="1.0.0.0" />
27+
</dependentAssembly>
28+
<dependentAssembly>
29+
<assemblyIdentity name="Microsoft.CodeAnalysis.CSharp.Desktop" publicKeyToken="31bf3856ad364e35" culture="neutral" />
30+
<bindingRedirect oldVersion="0.0.0.0-0.7.0.0" newVersion="0.7.0.0" />
31+
</dependentAssembly>
32+
<dependentAssembly>
33+
<assemblyIdentity name="Microsoft.CodeAnalysis.CSharp" publicKeyToken="31bf3856ad364e35" culture="neutral" />
34+
<bindingRedirect oldVersion="0.0.0.0-0.7.0.0" newVersion="0.7.0.0" />
35+
</dependentAssembly>
36+
<dependentAssembly>
37+
<assemblyIdentity name="Microsoft.CodeAnalysis.CSharp.Workspaces" publicKeyToken="31bf3856ad364e35" culture="neutral" />
38+
<bindingRedirect oldVersion="0.0.0.0-0.7.0.0" newVersion="0.7.0.0" />
39+
</dependentAssembly>
40+
</assemblyBinding>
41+
</runtime>
642
</configuration>

src/CodeFormatter/CodeFormatter.csproj

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,47 +32,66 @@
3232
<WarningLevel>4</WarningLevel>
3333
</PropertyGroup>
3434
<ItemGroup>
35-
<Reference Include="Microsoft.CodeAnalysis, Version=0.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
36-
<SpecificVersion>False</SpecificVersion>
37-
<HintPath>..\packages\Microsoft.CodeAnalysis.Common.0.7.4091001-beta\lib\net45\Microsoft.CodeAnalysis.dll</HintPath>
35+
<Reference Include="Microsoft.CodeAnalysis">
36+
<HintPath>..\packages\Microsoft.CodeAnalysis.Common.1.0.0-beta1-20141031-01\lib\net45\Microsoft.CodeAnalysis.dll</HintPath>
3837
</Reference>
39-
<Reference Include="Microsoft.CodeAnalysis.CSharp, Version=0.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
40-
<SpecificVersion>False</SpecificVersion>
41-
<HintPath>..\packages\Microsoft.CodeAnalysis.CSharp.0.7.4091001-beta\lib\net45\Microsoft.CodeAnalysis.CSharp.dll</HintPath>
38+
<Reference Include="Microsoft.CodeAnalysis.CSharp">
39+
<HintPath>..\packages\Microsoft.CodeAnalysis.CSharp.1.0.0-beta1-20141031-01\lib\net45\Microsoft.CodeAnalysis.CSharp.dll</HintPath>
4240
</Reference>
4341
<Reference Include="Microsoft.CodeAnalysis.CSharp.Desktop">
44-
<HintPath>..\packages\Microsoft.CodeAnalysis.CSharp.0.7.4091001-beta\lib\net45\Microsoft.CodeAnalysis.CSharp.Desktop.dll</HintPath>
42+
<HintPath>..\packages\Microsoft.CodeAnalysis.CSharp.1.0.0-beta1-20141031-01\lib\net45\Microsoft.CodeAnalysis.CSharp.Desktop.dll</HintPath>
4543
</Reference>
4644
<Reference Include="Microsoft.CodeAnalysis.CSharp.Workspaces">
47-
<HintPath>..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.0.7.4091001-beta\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll</HintPath>
45+
<HintPath>..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.0.0-beta1-20141031-01\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll</HintPath>
4846
</Reference>
49-
<Reference Include="Microsoft.CodeAnalysis.Desktop, Version=0.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
50-
<SpecificVersion>False</SpecificVersion>
51-
<HintPath>..\packages\Microsoft.CodeAnalysis.Common.0.7.4091001-beta\lib\net45\Microsoft.CodeAnalysis.Desktop.dll</HintPath>
47+
<Reference Include="Microsoft.CodeAnalysis.CSharp.Workspaces.Desktop">
48+
<HintPath>..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.0.0-beta1-20141031-01\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.Desktop.dll</HintPath>
49+
</Reference>
50+
<Reference Include="Microsoft.CodeAnalysis.Desktop">
51+
<HintPath>..\packages\Microsoft.CodeAnalysis.Common.1.0.0-beta1-20141031-01\lib\net45\Microsoft.CodeAnalysis.Desktop.dll</HintPath>
5252
</Reference>
5353
<Reference Include="Microsoft.CodeAnalysis.VisualBasic">
54-
<HintPath>..\packages\Microsoft.CodeAnalysis.VisualBasic.0.7.4091001-beta\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll</HintPath>
54+
<HintPath>..\packages\Microsoft.CodeAnalysis.VisualBasic.1.0.0-beta1-20141031-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll</HintPath>
5555
</Reference>
5656
<Reference Include="Microsoft.CodeAnalysis.VisualBasic.Desktop">
57-
<HintPath>..\packages\Microsoft.CodeAnalysis.VisualBasic.0.7.4091001-beta\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Desktop.dll</HintPath>
57+
<HintPath>..\packages\Microsoft.CodeAnalysis.VisualBasic.1.0.0-beta1-20141031-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Desktop.dll</HintPath>
5858
</Reference>
5959
<Reference Include="Microsoft.CodeAnalysis.VisualBasic.Workspaces">
60-
<HintPath>..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.0.7.4091001-beta\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll</HintPath>
60+
<HintPath>..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.0.0-beta1-20141031-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll</HintPath>
6161
</Reference>
62-
<Reference Include="Microsoft.CodeAnalysis.Workspaces, Version=0.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
63-
<SpecificVersion>False</SpecificVersion>
64-
<HintPath>..\packages\Microsoft.CodeAnalysis.Workspaces.Common.0.7.4091001-beta\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll</HintPath>
62+
<Reference Include="Microsoft.CodeAnalysis.VisualBasic.Workspaces.Desktop">
63+
<HintPath>..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.0.0-beta1-20141031-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.Desktop.dll</HintPath>
64+
</Reference>
65+
<Reference Include="Microsoft.CodeAnalysis.Workspaces">
66+
<HintPath>..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.0.0-beta1-20141031-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll</HintPath>
67+
</Reference>
68+
<Reference Include="Microsoft.CodeAnalysis.Workspaces.Desktop">
69+
<HintPath>..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.0.0-beta1-20141031-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll</HintPath>
6570
</Reference>
6671
<Reference Include="System" />
67-
<Reference Include="System.Collections.Immutable, Version=1.1.20.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
68-
<Private>True</Private>
69-
<HintPath>..\packages\Microsoft.Bcl.Immutable.1.1.20-beta\lib\portable-net45+win8\System.Collections.Immutable.dll</HintPath>
72+
<Reference Include="System.Collections.Immutable, Version=1.1.32.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
73+
<SpecificVersion>False</SpecificVersion>
74+
<HintPath>..\packages\System.Collections.Immutable.1.1.32-beta\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll</HintPath>
7075
</Reference>
7176
<Reference Include="System.ComponentModel.Composition" />
77+
<Reference Include="System.Composition.AttributedModel">
78+
<HintPath>..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.AttributedModel.dll</HintPath>
79+
</Reference>
80+
<Reference Include="System.Composition.Convention">
81+
<HintPath>..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Convention.dll</HintPath>
82+
</Reference>
83+
<Reference Include="System.Composition.Hosting">
84+
<HintPath>..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Hosting.dll</HintPath>
85+
</Reference>
86+
<Reference Include="System.Composition.Runtime">
87+
<HintPath>..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Runtime.dll</HintPath>
88+
</Reference>
89+
<Reference Include="System.Composition.TypedParts">
90+
<HintPath>..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.TypedParts.dll</HintPath>
91+
</Reference>
7292
<Reference Include="System.Core" />
73-
<Reference Include="System.Reflection.Metadata, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
74-
<SpecificVersion>False</SpecificVersion>
75-
<HintPath>..\packages\Microsoft.Bcl.Metadata.1.0.12-alpha\lib\portable-net45+win8\System.Reflection.Metadata.dll</HintPath>
93+
<Reference Include="System.Reflection.Metadata">
94+
<HintPath>..\packages\System.Reflection.Metadata.1.0.17-beta\lib\portable-net45+win8\System.Reflection.Metadata.dll</HintPath>
7695
</Reference>
7796
<Reference Include="System.Xml.Linq" />
7897
<Reference Include="System.Data.DataSetExtensions" />

src/CodeFormatter/packages.config

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3-
<package id="Microsoft.Bcl.Immutable" version="1.1.20-beta" targetFramework="net45" />
4-
<package id="Microsoft.Bcl.Metadata" version="1.0.12-alpha" targetFramework="net45" />
5-
<package id="Microsoft.CodeAnalysis.Common" version="0.7.4091001-beta" targetFramework="net45" />
6-
<package id="Microsoft.CodeAnalysis.VisualBasic" version="0.7.4091001-beta" targetFramework="net45" />
7-
<package id="Microsoft.CodeAnalysis.VisualBasic.Workspaces" version="0.7.4091001-beta" targetFramework="net45" />
8-
<package id="Microsoft.CodeAnalysis.Workspaces.Common" version="0.7.4091001-beta" targetFramework="net45" />
3+
<package id="Microsoft.CodeAnalysis.Common" version="1.0.0-beta1-20141031-01" targetFramework="net45" />
4+
<package id="Microsoft.CodeAnalysis.CSharp" version="1.0.0-beta1-20141031-01" targetFramework="net45" />
5+
<package id="Microsoft.CodeAnalysis.CSharp.Workspaces" version="1.0.0-beta1-20141031-01" targetFramework="net45" />
6+
<package id="Microsoft.CodeAnalysis.VisualBasic" version="1.0.0-beta1-20141031-01" targetFramework="net45" />
7+
<package id="Microsoft.CodeAnalysis.VisualBasic.Workspaces" version="1.0.0-beta1-20141031-01" targetFramework="net45" />
8+
<package id="Microsoft.CodeAnalysis.Workspaces.Common" version="1.0.0-beta1-20141031-01" targetFramework="net45" />
9+
<package id="Microsoft.Composition" version="1.0.27" targetFramework="net45" />
10+
<package id="System.Collections.Immutable" version="1.1.32-beta" targetFramework="net45" />
11+
<package id="System.Reflection.Metadata" version="1.0.17-beta" targetFramework="net45" />
912
</packages>

src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs

Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -17,32 +17,40 @@ internal sealed class FormattingEngineImplementation : IFormattingEngine
1717
{
1818
private readonly IEnumerable<IFormattingFilter> _filters;
1919
private readonly IEnumerable<IFormattingRule> _rules;
20+
2021

2122
[ImportingConstructor]
2223
public FormattingEngineImplementation([ImportMany] IEnumerable<IFormattingFilter> filters,
23-
[ImportMany] IEnumerable<IFormattingRule> rules)
24+
[ImportMany] IEnumerable<Lazy<IFormattingRule, IOrderMetadata>> rules)
2425
{
2526
_filters = filters;
26-
_rules = rules;
27+
_rules = rules.OrderBy(r => r.Metadata.Order).Select(r => r.Value);
2728
}
2829

2930
public async Task<bool> RunAsync(Workspace workspace, CancellationToken cancellationToken)
3031
{
3132
var solution = workspace.CurrentSolution;
32-
var documents = solution.Projects.SelectMany(p => p.Documents);
33+
var documentIds = solution.Projects.SelectMany(p => p.DocumentIds);
3334
var hasChanges = false;
3435

35-
foreach (var document in documents)
36+
foreach (var id in documentIds)
3637
{
38+
var document = solution.GetDocument(id);
3739
var shouldBeProcessed = await ShouldBeProcessedAsync(document);
3840
if (!shouldBeProcessed)
3941
continue;
4042

4143
var newDocument = await RewriteDocumentAsync(document, cancellationToken);
4244
hasChanges |= newDocument != document;
4345

44-
await SaveDocumentAsync(newDocument, cancellationToken);
45-
Console.WriteLine("Processing document: " + document.Name);
46+
solution = newDocument.Project.Solution;
47+
48+
Console.WriteLine("Processed document: " + document.Name);
49+
}
50+
51+
if (workspace.TryApplyChanges(solution))
52+
{
53+
Console.WriteLine("Solution changes committed");
4654
}
4755

4856
return hasChanges;
@@ -69,34 +77,10 @@ private async Task<bool> ShouldBeProcessedAsync(Document document)
6977

7078
private async Task<Document> RewriteDocumentAsync(Document document, CancellationToken cancellationToken)
7179
{
72-
var newDocument = document;
73-
74-
// There is no good ordering for formatting rules because they might interact with each other.
75-
//
76-
// Thus, we'll run the formatting until no more changes occur. In theory, we could run into an
77-
// infinite loop if two formatting rules are undoing each other's change.
78-
//
79-
// We'll ignore this for now.
80-
81-
while (true)
82-
{
83-
var previousDocument = newDocument;
80+
foreach (var rule in _rules)
81+
document = await rule.ProcessAsync(document, cancellationToken);
8482

85-
foreach (var rule in _rules)
86-
newDocument = await rule.ProcessAsync(newDocument, cancellationToken);
87-
88-
if (IsEqual(newDocument, previousDocument))
89-
break;
90-
}
91-
92-
return newDocument;
93-
}
94-
95-
private bool IsEqual(Document newDocument, Document previousDocument)
96-
{
97-
if (newDocument.GetTextAsync().Result.ToString() == previousDocument.GetTextAsync().Result.ToString())
98-
return true;
99-
return false;
83+
return document;
10084
}
10185
}
10286
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System.ComponentModel;
2+
3+
namespace Microsoft.DotNet.CodeFormatting
4+
{
5+
public interface IOrderMetadata
6+
{
7+
[DefaultValue(int.MaxValue)]
8+
int Order { get; }
9+
}
10+
}

0 commit comments

Comments
 (0)