From 62451c4b87e5c01b1915129fd2fc021231cdede2 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Tue, 16 Aug 2016 19:01:02 +0200 Subject: [PATCH 001/236] Made some async delegates registered as analyzer callbacks synchronous to solve issue #251. --- .../CSharp/Diagnostics/Custom/XmlDocAnalyzer.cs | 4 ++-- .../Synced/CodeQuality/FunctionNeverReturnsAnalyzer.cs | 4 ++-- .../CodeQuality/MemberHidesStaticFromOuterClassAnalyzer.cs | 4 ++-- .../StaticFieldOrAutoPropertyInGenericTypeAnalyzer.cs | 4 ++-- .../FieldCanBeMadeReadOnlyAnalyzer.cs | 4 ++-- .../RedundanciesInCode/RedundantUnsafeContextAnalyzer.cs | 4 ++-- .../RedundanciesInDeclaration/UnusedParameterAnalyzer.cs | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/RefactoringEssentials/CSharp/Diagnostics/Custom/XmlDocAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Custom/XmlDocAnalyzer.cs index 0078a79e..bfda5c88 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Custom/XmlDocAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Custom/XmlDocAnalyzer.cs @@ -34,14 +34,14 @@ public override void Initialize(AnalysisContext context) context.RegisterCompilationStartAction(compilationContext => { var compilation = compilationContext.Compilation; - compilationContext.RegisterSyntaxTreeAction(async delegate (SyntaxTreeAnalysisContext ctx) + compilationContext.RegisterSyntaxTreeAction(delegate (SyntaxTreeAnalysisContext ctx) { try { if (!compilation.SyntaxTrees.Contains(ctx.Tree)) return; var semanticModel = compilation.GetSemanticModel(ctx.Tree); - var root = await ctx.Tree.GetRootAsync(ctx.CancellationToken).ConfigureAwait(false); + var root = ctx.Tree.GetRoot(ctx.CancellationToken); var model = compilationContext.Compilation.GetSemanticModel(ctx.Tree); new GatherVisitor(ctx, semanticModel).Visit(root); } diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/FunctionNeverReturnsAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/FunctionNeverReturnsAnalyzer.cs index 07eef234..0be090fe 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/FunctionNeverReturnsAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/FunctionNeverReturnsAnalyzer.cs @@ -33,14 +33,14 @@ public override void Initialize(AnalysisContext context) context.RegisterCompilationStartAction(compilationContext => { var compilation = compilationContext.Compilation; - compilationContext.RegisterSyntaxTreeAction(async delegate (SyntaxTreeAnalysisContext ctx) + compilationContext.RegisterSyntaxTreeAction(delegate (SyntaxTreeAnalysisContext ctx) { try { if (!compilation.SyntaxTrees.Contains(ctx.Tree)) return; var semanticModel = compilation.GetSemanticModel(ctx.Tree); - var root = await ctx.Tree.GetRootAsync(ctx.CancellationToken).ConfigureAwait(false); + var root = ctx.Tree.GetRoot(ctx.CancellationToken); var model = compilationContext.Compilation.GetSemanticModel(ctx.Tree); new GatherVisitor(ctx, semanticModel).Visit(root); } diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/MemberHidesStaticFromOuterClassAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/MemberHidesStaticFromOuterClassAnalyzer.cs index 7c408f24..eaebfb7e 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/MemberHidesStaticFromOuterClassAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/MemberHidesStaticFromOuterClassAnalyzer.cs @@ -30,14 +30,14 @@ public override void Initialize(AnalysisContext context) context.RegisterCompilationStartAction(compilationContext => { var compilation = compilationContext.Compilation; - compilationContext.RegisterSyntaxTreeAction(async delegate (SyntaxTreeAnalysisContext ctx) + compilationContext.RegisterSyntaxTreeAction(delegate (SyntaxTreeAnalysisContext ctx) { try { if (!compilation.SyntaxTrees.Contains(ctx.Tree)) return; var semanticModel = compilation.GetSemanticModel(ctx.Tree); - var root = await ctx.Tree.GetRootAsync(ctx.CancellationToken).ConfigureAwait(false); + var root = ctx.Tree.GetRoot(ctx.CancellationToken); var model = compilationContext.Compilation.GetSemanticModel(ctx.Tree); new GatherVisitor(ctx, semanticModel).Visit(root); } diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/StaticFieldOrAutoPropertyInGenericTypeAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/StaticFieldOrAutoPropertyInGenericTypeAnalyzer.cs index 3b116c5a..dc4b5351 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/StaticFieldOrAutoPropertyInGenericTypeAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/StaticFieldOrAutoPropertyInGenericTypeAnalyzer.cs @@ -31,14 +31,14 @@ public override void Initialize(AnalysisContext context) context.RegisterCompilationStartAction(compilationContext => { var compilation = compilationContext.Compilation; - compilationContext.RegisterSyntaxTreeAction(async delegate (SyntaxTreeAnalysisContext ctx) + compilationContext.RegisterSyntaxTreeAction(delegate (SyntaxTreeAnalysisContext ctx) { try { if (!compilation.SyntaxTrees.Contains(ctx.Tree)) return; var semanticModel = compilation.GetSemanticModel(ctx.Tree); - var root = await ctx.Tree.GetRootAsync(ctx.CancellationToken).ConfigureAwait(false); + var root = ctx.Tree.GetRoot(ctx.CancellationToken); var model = compilationContext.Compilation.GetSemanticModel(ctx.Tree); new GatherVisitor(ctx, semanticModel).Visit(root); } diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/FieldCanBeMadeReadOnlyAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/FieldCanBeMadeReadOnlyAnalyzer.cs index dbad32b4..f1ab8c92 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/FieldCanBeMadeReadOnlyAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/FieldCanBeMadeReadOnlyAnalyzer.cs @@ -34,14 +34,14 @@ public override void Initialize(AnalysisContext context) void Analyze(CompilationStartAnalysisContext compilationContext) { var compilation = compilationContext.Compilation; - compilationContext.RegisterSyntaxTreeAction(async delegate (SyntaxTreeAnalysisContext context) + compilationContext.RegisterSyntaxTreeAction(delegate (SyntaxTreeAnalysisContext context) { try { if (!compilation.SyntaxTrees.Contains(context.Tree)) return; var semanticModel = compilation.GetSemanticModel(context.Tree); - var root = await context.Tree.GetRootAsync(context.CancellationToken).ConfigureAwait(false); + var root = context.Tree.GetRoot(context.CancellationToken); var model = compilationContext.Compilation.GetSemanticModel(context.Tree); foreach (var type in root.DescendantNodesAndSelf(SkipMembers).OfType()) { diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantUnsafeContextAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantUnsafeContextAnalyzer.cs index c2724427..c7e7e0ab 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantUnsafeContextAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantUnsafeContextAnalyzer.cs @@ -33,14 +33,14 @@ public override void Initialize(AnalysisContext context) context.RegisterCompilationStartAction(compilationContext => { var compilation = compilationContext.Compilation; - compilationContext.RegisterSyntaxTreeAction(async delegate (SyntaxTreeAnalysisContext ctx) + compilationContext.RegisterSyntaxTreeAction(delegate (SyntaxTreeAnalysisContext ctx) { try { if (!compilation.SyntaxTrees.Contains(ctx.Tree)) return; var semanticModel = compilation.GetSemanticModel(ctx.Tree); - var root = await ctx.Tree.GetRootAsync(ctx.CancellationToken).ConfigureAwait(false); + var root = ctx.Tree.GetRoot(ctx.CancellationToken); var model = compilationContext.Compilation.GetSemanticModel(ctx.Tree); if (model.IsFromGeneratedCode(compilationContext.CancellationToken)) return; diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedParameterAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedParameterAnalyzer.cs index e8f2f463..ac421c3f 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedParameterAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedParameterAnalyzer.cs @@ -35,14 +35,14 @@ public override void Initialize(AnalysisContext context) void Analyze(CompilationStartAnalysisContext compilationContext) { var compilation = compilationContext.Compilation; - compilationContext.RegisterSyntaxTreeAction(async delegate (SyntaxTreeAnalysisContext context) + compilationContext.RegisterSyntaxTreeAction(delegate (SyntaxTreeAnalysisContext context) { try { if (!compilation.SyntaxTrees.Contains(context.Tree)) return; var semanticModel = compilation.GetSemanticModel(context.Tree); - var root = await context.Tree.GetRootAsync(context.CancellationToken).ConfigureAwait(false); + var root = context.Tree.GetRoot(context.CancellationToken); var model = compilationContext.Compilation.GetSemanticModel(context.Tree); if (model.IsFromGeneratedCode(compilationContext.CancellationToken)) return; From a83e7b93434fbb76631851f20ad34770097772f7 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Thu, 18 Aug 2016 19:41:59 +0200 Subject: [PATCH 002/236] Fixed #248: Removing ToString is too relaxed --- .../RedundantToStringCallAnalyzer.cs | 24 ++ .../Diagnostics/RedundantToStringCallTests.cs | 331 ++++++++++-------- 2 files changed, 210 insertions(+), 145 deletions(-) diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantToStringCallAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantToStringCallAnalyzer.cs index 3b564a01..5c3c24f5 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantToStringCallAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantToStringCallAnalyzer.cs @@ -149,9 +149,12 @@ void CheckInvocationInAutoCallContext(InvocationExpressionSyntax invocationExpre { return; } + if (!OverridesObjectToStringMethod(resolveResult)) + return; var type = nodeContext.SemanticModel.GetTypeInfo(memberExpression.Expression).Type; if ((type != null) && type.IsValueType) return; + AddRedundantToStringIssue(memberExpression, invocationExpression); } @@ -167,6 +170,25 @@ void AddRedundantToStringIssue(MemberAccessExpressionSyntax memberExpression, In #region Invocation expression + static bool OverridesObjectToStringMethod(ISymbol toStringSymbol) + { + ISymbol currentSymbol = toStringSymbol; + while (currentSymbol != null) + { + var currentMethodSymbol = currentSymbol as IMethodSymbol; + if ((currentMethodSymbol != null) + && (currentSymbol.ContainingType != null) + && (currentSymbol.ContainingType.SpecialType == SpecialType.System_Object)) + { + // Found object.ToString() + return true; + } + currentSymbol = currentSymbol.OverriddenMember(); + } + + return false; + } + static void CheckTargetedObject(SyntaxNodeAnalysisContext nodeContext, InvocationExpressionSyntax invocationExpression, ISymbol member) { var memberExpression = invocationExpression.Expression as MemberAccessExpressionSyntax; @@ -233,6 +255,8 @@ static void CheckInvocationInAutoCallContext(SyntaxNodeAnalysisContext nodeConte { return; } + if (!OverridesObjectToStringMethod(resolveResult)) + return; var type = nodeContext.SemanticModel.GetTypeInfo(memberExpression.Expression).Type; if ((type != null) && type.IsValueType) return; diff --git a/Tests/CSharp/Diagnostics/RedundantToStringCallTests.cs b/Tests/CSharp/Diagnostics/RedundantToStringCallTests.cs index 8ba8784d..469acd55 100644 --- a/Tests/CSharp/Diagnostics/RedundantToStringCallTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantToStringCallTests.cs @@ -12,17 +12,17 @@ public void ConcatenationOperator() Analyze(@" class Foo { - void Bar (object i) - { - string s = """" + i$.ToString()$ + """" + i$.ToString()$; - } + void Bar (object i) + { + string s = """" + i$.ToString()$ + """" + i$.ToString()$; + } }", @" class Foo { - void Bar (object i) - { - string s = """" + i + """" + i.ToString(); - } + void Bar (object i) + { + string s = """" + i + """" + i.ToString(); + } }", 0); } @@ -32,10 +32,10 @@ public void TestValueTypes() Analyze(@" class Foo { - void Bar (int i) - { - string s = """" + i.ToString() + """" + i.ToString(); - } + void Bar (int i) + { + string s = """" + i.ToString() + """" + i.ToString(); + } }"); } @@ -46,10 +46,10 @@ public void ConcatenationOperatorWithToStringAsOnlyString() Analyze(@" class Foo { - void Bar (int i) - { - string s = i.ToString() + i + i + i + 1.3; - } + void Bar (int i) + { + string s = i.ToString() + i + i + i + 1.3; + } }"); } @@ -59,10 +59,10 @@ public void IgnoresCallsToIFormattableToString() Analyze(@" class Foo { - void Bar (System.DateTime dt) - { - string s = dt.ToString("""", CultureInfo.InvariantCulture) + string.Empty; - } + void Bar (System.DateTime dt) + { + string s = dt.ToString("""", CultureInfo.InvariantCulture) + string.Empty; + } }"); } @@ -72,19 +72,19 @@ public void StringTarget() Analyze(@" class Foo { - void Bar (string str) - { - string s = str$.ToString()$; - string inOperator = """" + str$.ToString()$; - } + void Bar (string str) + { + string s = str$.ToString()$; + string inOperator = """" + str$.ToString()$; + } }", @" class Foo { - void Bar (string str) - { - string s = str; - string inOperator = """" + str; - } + void Bar (string str) + { + string s = str; + string inOperator = """" + str; + } }"); } @@ -94,17 +94,17 @@ public void FormatStringTests() Analyze(@" class Foo { - void Bar (object i) - { - string s = string.Format(""{0}"", i$.ToString()$); - } + void Bar (object i) + { + string s = string.Format(""{0}"", i$.ToString()$); + } }", @" class Foo { - void Bar (object i) - { - string s = string.Format(""{0}"", i); - } + void Bar (object i) + { + string s = string.Format(""{0}"", i); + } }"); } @@ -114,19 +114,19 @@ public void HandlesNonLiteralFormatParameter() Analyze(@" class Foo { - void Bar (object i) - { - string format = ""{0}""; - string s = string.Format(format, i$.ToString()$); - } + void Bar (object i) + { + string format = ""{0}""; + string s = string.Format(format, i$.ToString()$); + } }", @" class Foo { - void Bar (object i) - { - string format = ""{0}""; - string s = string.Format(format, i); - } + void Bar (object i) + { + string format = ""{0}""; + string s = string.Format(format, i); + } }"); } @@ -137,31 +137,31 @@ public void FormatStringWithNonObjectParameterTests() Analyze(@" class Foo { - void Bar (object i) - { - string s = FakeFormat(""{0} {1}"", i.ToString(), i$.ToString()$); - } - - void FakeFormat(string format, string arg0, object arg1) - { - } - void FakeFormat(string format, params object[] arg1) - { - } + void Bar (object i) + { + string s = FakeFormat(""{0} {1}"", i.ToString(), i$.ToString()$); + } + + void FakeFormat(string format, string arg0, object arg1) + { + } + void FakeFormat(string format, params object[] arg1) + { + } }", @" class Foo { - void Bar (object i) - { - string s = FakeFormat(""{0} {1}"", i.ToString (), i); - } - - void FakeFormat(string format, string arg0, object arg1) - { - } - void FakeFormat(string format, params object[] arg1) - { - } + void Bar (object i) + { + string s = FakeFormat(""{0} {1}"", i.ToString (), i); + } + + void FakeFormat(string format, string arg0, object arg1) + { + } + void FakeFormat(string format, params object[] arg1) + { + } }"); } @@ -172,25 +172,25 @@ public void FormatMethodWithObjectParamsArray() Analyze(@" class Foo { - void Bar (object i) - { - string s = FakeFormat(""{0} {1}"", i$.ToString()$, i$.ToString()$); - } + void Bar (object i) + { + string s = FakeFormat(""{0} {1}"", i$.ToString()$, i$.ToString()$); + } - void FakeFormat(string format, params object[] args) - { - } + void FakeFormat(string format, params object[] args) + { + } }", @" class Foo { - void Bar (object i) - { - string s = FakeFormat(""{0} {1}"", i, i); - } + void Bar (object i) + { + string s = FakeFormat(""{0} {1}"", i, i); + } - void FakeFormat(string format, params object[] args) - { - } + void FakeFormat(string format, params object[] args) + { + } }"); } @@ -200,21 +200,21 @@ public void DetectsBlacklistedCalls() Analyze(@" class Foo { - void Bar (object i) - { - var w = new System.IO.StringWriter (); - w.Write(i$.ToString()$); - w.WriteLine(i$.ToString()$); - } + void Bar (object i) + { + var w = new System.IO.StringWriter (); + w.Write(i$.ToString()$); + w.WriteLine(i$.ToString()$); + } }", @" class Foo { - void Bar (object i) - { - var w = new System.IO.StringWriter (); - w.Write(i); - w.WriteLine(i); - } + void Bar (object i) + { + var w = new System.IO.StringWriter (); + w.Write(i); + w.WriteLine(i); + } }"); } @@ -224,10 +224,10 @@ public void ConcatenationOperator2() Analyze(@" class Foo { - void Bar (int i) - { - string s = """" + i.ToString() + """" + i.ToString(); - } + void Bar (int i) + { + string s = """" + i.ToString() + """" + i.ToString(); + } }"); } @@ -237,10 +237,10 @@ public void TestReferenceTypes2() Analyze(@" class Foo { - void Bar (object i) - { - string s = """" + i$.ToString()$ + """" + i$.ToString()$; - } + void Bar (object i) + { + string s = """" + i$.ToString()$ + """" + i$.ToString()$; + } }"); } @@ -250,10 +250,10 @@ public void ConcatenationOperatorWithToStringAsOnlyString2() Analyze(@" class Foo { - void Bar (int i) - { - string s = i.ToString() + i + i + i + 1.3; - } + void Bar (int i) + { + string s = i.ToString() + i + i + i + 1.3; + } }"); } @@ -263,10 +263,10 @@ public void IgnoresCallsToIFormattableToString2() Analyze(@" class Foo { - void Bar (System.DateTime dt) - { - string s = dt.ToString("""", CultureInfo.InvariantCulture) + string.Empty; - } + void Bar (System.DateTime dt) + { + string s = dt.ToString("""", CultureInfo.InvariantCulture) + string.Empty; + } }"); } @@ -276,10 +276,10 @@ public void FormatStringTests2() Analyze(@" class Foo { - void Bar (int i) - { - string s = string.Format(""{0}"", i.ToString()); - } + void Bar (int i) + { + string s = string.Format(""{0}"", i.ToString()); + } }"); } @@ -289,11 +289,11 @@ public void HandlesNonLiteralFormatParameter2() Analyze(@" class Foo { - void Bar (int i) - { - string format = ""{0}""; - string s = string.Format(format, i.ToString()); - } + void Bar (int i) + { + string format = ""{0}""; + string s = string.Format(format, i.ToString()); + } }"); } @@ -304,17 +304,17 @@ public void FormatStringWithNonObjectParameterTests2() Analyze(@" class Foo { - void Bar (int i) - { - string s = FakeFormat(""{0} {1}"", i.ToString(), i.ToString()); - } - - void FakeFormat(string format, string arg0, object arg1) - { - } - void FakeFormat(string format, params object[] args) - { - } + void Bar (int i) + { + string s = FakeFormat(""{0} {1}"", i.ToString(), i.ToString()); + } + + void FakeFormat(string format, string arg0, object arg1) + { + } + void FakeFormat(string format, params object[] args) + { + } }"); } @@ -325,14 +325,14 @@ public void FormatMethodWithObjectParamsArray2() Analyze(@" class Foo { - void Bar (int i) - { - string s = FakeFormat(""{0} {1}"", i.ToString(), i.ToString()); - } + void Bar (int i) + { + string s = FakeFormat(""{0} {1}"", i.ToString(), i.ToString()); + } - void FakeFormat(string format, params object[] args) - { - } + void FakeFormat(string format, params object[] args) + { + } }"); } @@ -342,12 +342,12 @@ public void DetectsBlacklistedCalls2() Analyze(@" class Foo { - void Bar (int i) - { - var w = new System.IO.StringWriter (); - w.Write(i.ToString()); - w.WriteLine(i.ToString()); - } + void Bar (int i) + { + var w = new System.IO.StringWriter (); + w.Write(i.ToString()); + w.WriteLine(i.ToString()); + } }"); } @@ -383,5 +383,46 @@ void Foo (string s) {} }"); } + [Test] + public void TestIgnoresShadowedToStringInConcatenation() + { + Analyze(@" +class ClassShadowingToString +{ + public new string ToString() + { + return ""ANYTHING""; + } +} + +class Foo +{ + void Bar (ClassShadowingToString v) + { + string s = """" + v.ToString(); + } +}"); + } + + [Test] + public void TestIgnoresShadowedToStringInFormatParameter() + { + Analyze(@" +class ClassShadowingToString +{ + public new string ToString() + { + return ""ANYTHING""; + } +} + +class Foo +{ + void Bar (ClassShadowingToString v) + { + string s = string.Format(""{0}"", v.ToString()); + } +}"); + } } } \ No newline at end of file From 196f8f27da706423e0e0f345023f0d909ddc82a1 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Fri, 19 Aug 2016 16:10:49 +0200 Subject: [PATCH 003/236] Fixed #240: RefactoringEssentials.pdb is not included in .vsix --- Vsix/Vsix.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Vsix/Vsix.csproj b/Vsix/Vsix.csproj index fd2817b4..245f8058 100644 --- a/Vsix/Vsix.csproj +++ b/Vsix/Vsix.csproj @@ -40,7 +40,7 @@ true true true - false + true Roslyn @@ -102,6 +102,7 @@ {c465a5dc-ad28-49a2-89c0-f81838814a7e} RefactoringEssentials DebugSymbolsProjectOutputGroup + DebugSymbolsProjectOutputGroup From d4beb3e775c032dcf9a576ac2de26bd8155a827f Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Wed, 14 Sep 2016 00:21:15 +0200 Subject: [PATCH 004/236] Fixed #255: Wrong usafe redundancy proposal --- .../RedundantUnsafeContextAnalyzer.cs | 35 +++++++++++++++++-- .../RedundantUnsafeContextTests.cs | 19 ++++++++-- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantUnsafeContextAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantUnsafeContextAnalyzer.cs index c7e7e0ab..ca93b05d 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantUnsafeContextAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantUnsafeContextAnalyzer.cs @@ -44,7 +44,7 @@ public override void Initialize(AnalysisContext context) var model = compilationContext.Compilation.GetSemanticModel(ctx.Tree); if (model.IsFromGeneratedCode(compilationContext.CancellationToken)) return; - new GatherVisitor(ctx).Visit(root); + new GatherVisitor(ctx, semanticModel).Visit(root); } catch (OperationCanceledException) { } }); @@ -54,10 +54,12 @@ public override void Initialize(AnalysisContext context) class GatherVisitor : CSharpSyntaxWalker { SyntaxTreeAnalysisContext ctx; + SemanticModel semanticModel; - public GatherVisitor(SyntaxTreeAnalysisContext ctx) + public GatherVisitor(SyntaxTreeAnalysisContext ctx, SemanticModel semanticModel) { this.ctx = ctx; + this.semanticModel = semanticModel; } class UnsafeState @@ -161,6 +163,35 @@ public override void VisitPrefixUnaryExpression(PrefixUnaryExpressionSyntax node MarkUnsafe(); } + public override void VisitIdentifierName(IdentifierNameSyntax node) + { + base.VisitIdentifierName(node); + + ISymbol symbol = semanticModel.GetSymbolInfo(node).Symbol; + if (symbol != null) + { + switch (symbol.Kind) + { + case SymbolKind.ArrayType: + case SymbolKind.DynamicType: + case SymbolKind.ErrorType: + case SymbolKind.Event: + case SymbolKind.Field: + case SymbolKind.Method: + case SymbolKind.NamedType: + case SymbolKind.Parameter: + case SymbolKind.PointerType: + case SymbolKind.Property: + case SymbolKind.RangeVariable: + if (symbol.IsUnsafe()) + MarkUnsafe(); + break; + default: + break; + } + } + } + public override void VisitUnsafeStatement(UnsafeStatementSyntax node) { if (unsafeStateStack.Count == 0) diff --git a/Tests/CSharp/Diagnostics/RedundantUnsafeContextTests.cs b/Tests/CSharp/Diagnostics/RedundantUnsafeContextTests.cs index 4493bd77..2faadf33 100644 --- a/Tests/CSharp/Diagnostics/RedundantUnsafeContextTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantUnsafeContextTests.cs @@ -127,14 +127,27 @@ public static void Main(String[] args) } [Test] - public void TestFixed() + public void TestUnsafeProperty() { Analyze(@" class Foo { - unsafe struct TestStruct + class TestStruct { - public fixed byte TestVar[32]; + unsafe byte* UnsafePointer + { + get { + return null; + } + } + + public IntPtr SafeData { + get { + unsafe { + return new IntPtr(UnsafePointer); + } + } + } } } "); From bf1d4d352bfd8eb729cbf97912020a193fe7bbcf Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Wed, 14 Sep 2016 00:26:41 +0200 Subject: [PATCH 005/236] Brought back accidentally replaced unit test. --- .../Diagnostics/RedundantUnsafeContextTests.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Tests/CSharp/Diagnostics/RedundantUnsafeContextTests.cs b/Tests/CSharp/Diagnostics/RedundantUnsafeContextTests.cs index 2faadf33..02401f93 100644 --- a/Tests/CSharp/Diagnostics/RedundantUnsafeContextTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantUnsafeContextTests.cs @@ -126,6 +126,20 @@ public static void Main(String[] args) }"); } + [Test] + public void TestFixed() + { + Analyze(@" +class Foo +{ + unsafe struct TestStruct + { + public fixed byte TestVar[32]; + } +} +"); + } + [Test] public void TestUnsafeProperty() { From 9c6360a10722a5e6089e0db43f5ae867a870b2ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Thu, 15 Sep 2016 11:11:38 +0200 Subject: [PATCH 006/236] Fixed a bug that changed visibility modifiers on property <-> backing field actions. --- ...yAndBackingFieldCodeRefactoringProvider.cs | 4 ++- ...WithAutoPropertyCodeRefactoringProvider.cs | 14 +++++++---- ...ropertyWithPropertyAndBackingFieldTests.cs | 25 +++++++++++++++++++ ...tyWithBackingFieldWithAutoPropertyTests.cs | 21 ++++++++++++++++ 4 files changed, 58 insertions(+), 6 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider.cs index 92632115..503965a1 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider.cs @@ -61,12 +61,13 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte var newPropAnno = new SyntaxAnnotation(); var syntaxList = new SyntaxList(); var hasSetter = property.AccessorList.Accessors.Any(acc => acc.IsKind(SyntaxKind.SetAccessorDeclaration)); - var hasGetter = property.AccessorList.Accessors.Any(acc => acc.IsKind(SyntaxKind.GetAccessorDeclaration)); + var hasGetter = property.AccessorList.Accessors.Any(acc => acc.IsKind (SyntaxKind.GetAccessorDeclaration)); if (hasGetter) { var getBody = SyntaxFactory.Block(SyntaxFactory.ReturnStatement(fieldExpression)); var getter = SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration, getBody); + getter = getter.WithModifiers (property.AccessorList.Accessors.First (acc => acc.IsKind (SyntaxKind.GetAccessorDeclaration)).Modifiers); syntaxList = syntaxList.Add(getter); if (!hasSetter) backingStore = backingStore.WithModifiers(SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.ReadOnlyKeyword))); @@ -78,6 +79,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte SyntaxFactory.AssignmentExpression(SyntaxKind.SimpleAssignmentExpression, fieldExpression, SyntaxFactory.IdentifierName("value")))); var setter = SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration, setBody); + setter = setter.WithModifiers (property.AccessorList.Accessors.First (acc => acc.IsKind (SyntaxKind.SetAccessorDeclaration)).Modifiers); syntaxList = syntaxList.Add(setter); } var newProperty = property.WithAccessorList(SyntaxFactory.AccessorList(syntaxList)) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplacePropertyWithBackingFieldWithAutoPropertyCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplacePropertyWithBackingFieldWithAutoPropertyCodeRefactoringProvider.cs index 4bc2c257..9e095dcd 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplacePropertyWithBackingFieldWithAutoPropertyCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplacePropertyWithBackingFieldWithAutoPropertyCodeRefactoringProvider.cs @@ -73,8 +73,8 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte static bool IsEmptyComputedProperty(PropertyDeclarationSyntax property) { - var getter = property.AccessorList.Accessors.FirstOrDefault(a => a.IsKind(SyntaxKind.GetAccessorDeclaration)); - var setter = property.AccessorList.Accessors.FirstOrDefault(a => a.IsKind(SyntaxKind.SetAccessorDeclaration)); + var getter = property.AccessorList.Accessors.FirstOrDefault (a => a.IsKind (SyntaxKind.GetAccessorDeclaration)); + var setter = property.AccessorList.Accessors.FirstOrDefault (a => a.IsKind (SyntaxKind.SetAccessorDeclaration)); return getter != null && setter != null && IsNotImplemented(getter.Body) && IsNotImplemented(setter.Body); } static bool IsNotImplemented(BlockSyntax body) @@ -86,9 +86,13 @@ static bool IsNotImplemented(BlockSyntax body) static PropertyDeclarationSyntax CreateNewProperty(PropertyDeclarationSyntax property) - { - // create new auto property - var accessorDeclList = new SyntaxList().Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))).Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))); + { + var getter = property.AccessorList.Accessors.FirstOrDefault (a => a.IsKind (SyntaxKind.GetAccessorDeclaration)); + var setter = property.AccessorList.Accessors.FirstOrDefault (a => a.IsKind (SyntaxKind.SetAccessorDeclaration)); + + // create new auto property + var accessorDeclList = new SyntaxList().Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithModifiers (getter.Modifiers).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))) + .Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithModifiers (setter.Modifiers).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))); var newProperty = property.WithAccessorList(SyntaxFactory.AccessorList(accessorDeclList)).WithTrailingTrivia(property.GetTrailingTrivia()).WithAdditionalAnnotations(Formatter.Annotation); return newProperty; } diff --git a/Tests/CSharp/CodeRefactorings/ReplaceAutoPropertyWithPropertyAndBackingFieldTests.cs b/Tests/CSharp/CodeRefactorings/ReplaceAutoPropertyWithPropertyAndBackingFieldTests.cs index 7fb61906..4c304883 100644 --- a/Tests/CSharp/CodeRefactorings/ReplaceAutoPropertyWithPropertyAndBackingFieldTests.cs +++ b/Tests/CSharp/CodeRefactorings/ReplaceAutoPropertyWithPropertyAndBackingFieldTests.cs @@ -211,6 +211,31 @@ public string Test ${ throw new System.NotImplementedException (); } } +}"); + } + + [Test] + public void TestPreserveVisibility() + { + Test(@"class TestClass +{ + public string $Test { get; private set; } +}", @"class TestClass +{ + string test; + + public string Test + { + get + { + return test; + } + + private set + { + test = value; + } + } }"); } } diff --git a/Tests/CSharp/CodeRefactorings/ReplacePropertyWithBackingFieldWithAutoPropertyTests.cs b/Tests/CSharp/CodeRefactorings/ReplacePropertyWithBackingFieldWithAutoPropertyTests.cs index bf694276..a86b9bfd 100644 --- a/Tests/CSharp/CodeRefactorings/ReplacePropertyWithBackingFieldWithAutoPropertyTests.cs +++ b/Tests/CSharp/CodeRefactorings/ReplacePropertyWithBackingFieldWithAutoPropertyTests.cs @@ -225,6 +225,27 @@ class TestClass { public int Field { get; set; } } +"); + } + + [Test] + public void TestPreserveVisibility() + { + Test(@" +class TestClass +{ + int field; + public int $Field + { + get { return field; } + private set { field = value; } + } +} +", @" +class TestClass +{ + public int Field { get; private set; } +} "); } } From ba0965c49a15349cf88d7642c36a73fd43f126c6 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sun, 2 Oct 2016 16:41:04 +0200 Subject: [PATCH 007/236] Updated version to 4.4. --- BuildTools/appveyor.yml | 4 ++-- RefactoringEssentials/Properties/AssemblyInfoBase.cs | 4 ++-- RefactoringEssentials/RefactoringEssentials.Library.nuspec | 4 ++-- RefactoringEssentials/RefactoringEssentials.nuspec | 4 ++-- RefactoringEssentials/RefactoringEssentials.version | 6 +++--- Vsix/source.extension.vsixmanifest | 6 +++--- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/BuildTools/appveyor.yml b/BuildTools/appveyor.yml index 56f1b5a0..0b110857 100644 --- a/BuildTools/appveyor.yml +++ b/BuildTools/appveyor.yml @@ -4,7 +4,7 @@ only: - release - version: 4.3.{build} + version: 4.4.{build} os: Visual Studio 2015 @@ -34,7 +34,7 @@ only: - master - version: 4.3.{build} + version: 4.4.{build} os: Visual Studio 2015 diff --git a/RefactoringEssentials/Properties/AssemblyInfoBase.cs b/RefactoringEssentials/Properties/AssemblyInfoBase.cs index b395e3f2..161aec0d 100644 --- a/RefactoringEssentials/Properties/AssemblyInfoBase.cs +++ b/RefactoringEssentials/Properties/AssemblyInfoBase.cs @@ -9,8 +9,8 @@ [assembly: AssemblyCompany("ICSharpCode")] [assembly: AssemblyProduct("Refactoring Essentials")] [assembly: AssemblyCopyright("Copyright 2010-2016 AlphaSierraPapa and Xamarin Inc.")] -[assembly: AssemblyVersion("4.3.0.0")] -[assembly: AssemblyFileVersion("4.3.0")] +[assembly: AssemblyVersion("4.4.0.0")] +[assembly: AssemblyFileVersion("4.4.0")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. diff --git a/RefactoringEssentials/RefactoringEssentials.Library.nuspec b/RefactoringEssentials/RefactoringEssentials.Library.nuspec index 84d1f4d0..69d5b403 100644 --- a/RefactoringEssentials/RefactoringEssentials.Library.nuspec +++ b/RefactoringEssentials/RefactoringEssentials.Library.nuspec @@ -3,7 +3,7 @@ RefactoringEssentials.Library - 4.3.0 + 4.4.0 Refactoring Essentials IC#Code IC#Code @@ -12,7 +12,7 @@ https://raw.githubusercontent.com/icsharpcode/RefactoringEssentials/master/RefactoringEssentials/Images/refactoringessentials-logo32.png false Analyzers and Code Fixes as a library, intended for IDE builders - Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.2 for more information. + Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.4 for more information. Copyright (c) 2014-2016 AlphaSierraPapa VS 2015 Roslyn Analyzer Refactoring diff --git a/RefactoringEssentials/RefactoringEssentials.nuspec b/RefactoringEssentials/RefactoringEssentials.nuspec index 27d6bf6c..d4096ef3 100644 --- a/RefactoringEssentials/RefactoringEssentials.nuspec +++ b/RefactoringEssentials/RefactoringEssentials.nuspec @@ -3,7 +3,7 @@ RefactoringEssentials - 4.3.0 + 4.4.0 Refactoring Essentials IC#Code IC#Code @@ -13,7 +13,7 @@ false Analyzers and Code Fixes for Visual Studio 2015 (Roslyn-based). Intended for build integration. If you need Visual Studio integration only, please check out the VSIX (Visual Studio extension) from our Web site. - Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.2 for more information. + Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.4 for more information. Copyright (c) 2014-2016 AlphaSierraPapa VS 2015 Roslyn Analyzer Refactoring diff --git a/RefactoringEssentials/RefactoringEssentials.version b/RefactoringEssentials/RefactoringEssentials.version index 42a16854..dd8513e1 100644 --- a/RefactoringEssentials/RefactoringEssentials.version +++ b/RefactoringEssentials/RefactoringEssentials.version @@ -1,4 +1,4 @@ -nuget_version=4.3.0 -full_version=4.3.0.0 -release_notes_link=https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.2 +nuget_version=4.4.0 +full_version=4.4.0.0 +release_notes_link=https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.4 copyright=Copyright (c) 2014-2016 AlphaSierraPapa \ No newline at end of file diff --git a/Vsix/source.extension.vsixmanifest b/Vsix/source.extension.vsixmanifest index 994894da..b711334b 100644 --- a/Vsix/source.extension.vsixmanifest +++ b/Vsix/source.extension.vsixmanifest @@ -2,12 +2,12 @@ - + Refactoring Essentials for Visual Studio Free refactorings for C# and Visual Basic (VB) - plus more! license.txt - https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.2 - https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.2 + https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.4 + https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.4 Images\refactoringessentials-logo90.png Images\refactoringessentials-preview.png From 19fbd4abf1db91fc82c008de79987e3937022312 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sun, 2 Oct 2016 17:35:32 +0200 Subject: [PATCH 008/236] Updated development release version to 4.5. --- BuildTools/appveyor.yml | 4 ++-- RefactoringEssentials/Properties/AssemblyInfoBase.cs | 4 ++-- RefactoringEssentials/RefactoringEssentials.Library.nuspec | 4 ++-- RefactoringEssentials/RefactoringEssentials.nuspec | 4 ++-- RefactoringEssentials/RefactoringEssentials.version | 6 +++--- Vsix/source.extension.vsixmanifest | 6 +++--- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/BuildTools/appveyor.yml b/BuildTools/appveyor.yml index 0b110857..822c9267 100644 --- a/BuildTools/appveyor.yml +++ b/BuildTools/appveyor.yml @@ -4,7 +4,7 @@ only: - release - version: 4.4.{build} + version: 4.5.{build} os: Visual Studio 2015 @@ -34,7 +34,7 @@ only: - master - version: 4.4.{build} + version: 4.5.{build} os: Visual Studio 2015 diff --git a/RefactoringEssentials/Properties/AssemblyInfoBase.cs b/RefactoringEssentials/Properties/AssemblyInfoBase.cs index 161aec0d..4d15cd5c 100644 --- a/RefactoringEssentials/Properties/AssemblyInfoBase.cs +++ b/RefactoringEssentials/Properties/AssemblyInfoBase.cs @@ -9,8 +9,8 @@ [assembly: AssemblyCompany("ICSharpCode")] [assembly: AssemblyProduct("Refactoring Essentials")] [assembly: AssemblyCopyright("Copyright 2010-2016 AlphaSierraPapa and Xamarin Inc.")] -[assembly: AssemblyVersion("4.4.0.0")] -[assembly: AssemblyFileVersion("4.4.0")] +[assembly: AssemblyVersion("4.5.0.0")] +[assembly: AssemblyFileVersion("4.5.0")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. diff --git a/RefactoringEssentials/RefactoringEssentials.Library.nuspec b/RefactoringEssentials/RefactoringEssentials.Library.nuspec index 69d5b403..b754be37 100644 --- a/RefactoringEssentials/RefactoringEssentials.Library.nuspec +++ b/RefactoringEssentials/RefactoringEssentials.Library.nuspec @@ -3,7 +3,7 @@ RefactoringEssentials.Library - 4.4.0 + 4.5.0 Refactoring Essentials IC#Code IC#Code @@ -12,7 +12,7 @@ https://raw.githubusercontent.com/icsharpcode/RefactoringEssentials/master/RefactoringEssentials/Images/refactoringessentials-logo32.png false Analyzers and Code Fixes as a library, intended for IDE builders - Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.4 for more information. + Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 for more information. Copyright (c) 2014-2016 AlphaSierraPapa VS 2015 Roslyn Analyzer Refactoring diff --git a/RefactoringEssentials/RefactoringEssentials.nuspec b/RefactoringEssentials/RefactoringEssentials.nuspec index d4096ef3..2ea898fc 100644 --- a/RefactoringEssentials/RefactoringEssentials.nuspec +++ b/RefactoringEssentials/RefactoringEssentials.nuspec @@ -3,7 +3,7 @@ RefactoringEssentials - 4.4.0 + 4.5.0 Refactoring Essentials IC#Code IC#Code @@ -13,7 +13,7 @@ false Analyzers and Code Fixes for Visual Studio 2015 (Roslyn-based). Intended for build integration. If you need Visual Studio integration only, please check out the VSIX (Visual Studio extension) from our Web site. - Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.4 for more information. + Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 for more information. Copyright (c) 2014-2016 AlphaSierraPapa VS 2015 Roslyn Analyzer Refactoring diff --git a/RefactoringEssentials/RefactoringEssentials.version b/RefactoringEssentials/RefactoringEssentials.version index dd8513e1..43bdcfc0 100644 --- a/RefactoringEssentials/RefactoringEssentials.version +++ b/RefactoringEssentials/RefactoringEssentials.version @@ -1,4 +1,4 @@ -nuget_version=4.4.0 -full_version=4.4.0.0 -release_notes_link=https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.4 +nuget_version=4.5.0 +full_version=4.5.0.0 +release_notes_link=https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 copyright=Copyright (c) 2014-2016 AlphaSierraPapa \ No newline at end of file diff --git a/Vsix/source.extension.vsixmanifest b/Vsix/source.extension.vsixmanifest index b711334b..8e3be36b 100644 --- a/Vsix/source.extension.vsixmanifest +++ b/Vsix/source.extension.vsixmanifest @@ -2,12 +2,12 @@ - + Refactoring Essentials for Visual Studio Free refactorings for C# and Visual Basic (VB) - plus more! license.txt - https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.4 - https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.4 + https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 + https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 Images\refactoringessentials-logo90.png Images\refactoringessentials-preview.png From 7c9fed45d961554627e3957edfdcc120d2063857 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 30 Sep 2016 20:24:34 +0200 Subject: [PATCH 009/236] Add VB to C# converter --- .../CSharp/Converter/MethodBodyVisitor.cs | 232 +++++ .../CSharp/Converter/NodesVisitor.cs | 863 ++++++++++++++++++ .../CSharp/Converter/VisualBasicConverter.cs | 341 +++++++ .../RefactoringEssentials.csproj | 3 + RefactoringEssentials/Util/CSharpUtil.cs | 65 +- 5 files changed, 1499 insertions(+), 5 deletions(-) create mode 100644 RefactoringEssentials/CSharp/Converter/MethodBodyVisitor.cs create mode 100644 RefactoringEssentials/CSharp/Converter/NodesVisitor.cs create mode 100644 RefactoringEssentials/CSharp/Converter/VisualBasicConverter.cs diff --git a/RefactoringEssentials/CSharp/Converter/MethodBodyVisitor.cs b/RefactoringEssentials/CSharp/Converter/MethodBodyVisitor.cs new file mode 100644 index 00000000..6c1ca2f7 --- /dev/null +++ b/RefactoringEssentials/CSharp/Converter/MethodBodyVisitor.cs @@ -0,0 +1,232 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using VBasic = Microsoft.CodeAnalysis.VisualBasic; +using VBSyntax = Microsoft.CodeAnalysis.VisualBasic.Syntax; + +namespace RefactoringEssentials.CSharp.Converter +{ + public partial class VisualBasicConverter + { + class MethodBodyVisitor : VBasic.VisualBasicSyntaxVisitor> + { + SemanticModel semanticModel; + NodesVisitor nodesVisitor; + + public MethodBodyVisitor(SemanticModel semanticModel, NodesVisitor nodesVisitor) + { + this.semanticModel = semanticModel; + this.nodesVisitor = nodesVisitor; + } + + public override SyntaxList DefaultVisit(SyntaxNode node) + { + throw new NotImplementedException(node.GetType() + " not implemented!"); + } + + public override SyntaxList VisitLocalDeclarationStatement(VBSyntax.LocalDeclarationStatementSyntax node) + { + var modifiers = ConvertModifiers(node.Modifiers); + + var declarations = new List(); + + foreach (var declarator in node.Declarators) + foreach (var decl in SplitVariableDeclarations(declarator, nodesVisitor, semanticModel)) + declarations.Add(SyntaxFactory.LocalDeclarationStatement(modifiers, decl.Value)); + + return SyntaxFactory.List(declarations); + } + + public override SyntaxList VisitExpressionStatement(VBSyntax.ExpressionStatementSyntax node) + { + return SingleStatement((ExpressionSyntax)node.Expression.Accept(nodesVisitor)); + } + + public override SyntaxList VisitAssignmentStatement(VBSyntax.AssignmentStatementSyntax node) + { + var kind = ConvertToken(node.Kind(), TokenContext.Local); + return SingleStatement(SyntaxFactory.AssignmentExpression(kind, (ExpressionSyntax)node.Left.Accept(nodesVisitor), (ExpressionSyntax)node.Right.Accept(nodesVisitor))); + } + + public override SyntaxList VisitThrowStatement(VBSyntax.ThrowStatementSyntax node) + { + return SingleStatement(SyntaxFactory.ThrowStatement((ExpressionSyntax)node.Expression?.Accept(nodesVisitor))); + } + + public override SyntaxList VisitReturnStatement(VBSyntax.ReturnStatementSyntax node) + { + return SingleStatement(SyntaxFactory.ReturnStatement((ExpressionSyntax)node.Expression?.Accept(nodesVisitor))); + } + + public override SyntaxList VisitYieldStatement(VBSyntax.YieldStatementSyntax node) + { + return SingleStatement(SyntaxFactory.YieldStatement(SyntaxKind.YieldReturnStatement, (ExpressionSyntax)node.Expression?.Accept(nodesVisitor))); + } + + public override SyntaxList VisitSingleLineIfStatement(VBSyntax.SingleLineIfStatementSyntax node) + { + var condition = (ExpressionSyntax)node.Condition.Accept(nodesVisitor); + var block = SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))); + ElseClauseSyntax elseClause = null; + + if (node.ElseClause != null) + { + var elseBlock = SyntaxFactory.Block(node.ElseClause.Statements.SelectMany(s => s.Accept(this))); + elseClause = SyntaxFactory.ElseClause(elseBlock); + } + return SingleStatement(SyntaxFactory.IfStatement(condition, block, elseClause)); + } + + public override SyntaxList VisitMultiLineIfBlock(VBSyntax.MultiLineIfBlockSyntax node) + { + var condition = (ExpressionSyntax)node.IfStatement.Condition.Accept(nodesVisitor); + var block = SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))); + ElseClauseSyntax elseClause = null; + + if (node.ElseBlock != null) + { + var elseBlock = SyntaxFactory.Block(node.ElseBlock.Statements.SelectMany(s => s.Accept(this))); + elseClause = SyntaxFactory.ElseClause(elseBlock); + } + + foreach (var elseIf in node.ElseIfBlocks.Reverse()) + { + var elseBlock = SyntaxFactory.Block(elseIf.Statements.SelectMany(s => s.Accept(this))); + var ifStmt = SyntaxFactory.IfStatement((ExpressionSyntax)elseIf.ElseIfStatement.Condition.Accept(nodesVisitor), elseBlock, elseClause); + elseClause = SyntaxFactory.ElseClause(ifStmt); + } + + return SingleStatement(SyntaxFactory.IfStatement(condition, block, elseClause)); + } + + public override SyntaxList VisitForBlock(VBSyntax.ForBlockSyntax node) + { + var stmt = node.ForStatement; + ExpressionSyntax startValue = (ExpressionSyntax)stmt.FromValue.Accept(nodesVisitor); + VariableDeclarationSyntax declaration = null; + ExpressionSyntax id; + if (stmt.ControlVariable is VBSyntax.VariableDeclaratorSyntax) { + var v = (VBSyntax.VariableDeclaratorSyntax)stmt.ControlVariable; + declaration = SplitVariableDeclarations(v, nodesVisitor, semanticModel).Values.Single(); + declaration = declaration.WithVariables(SyntaxFactory.SingletonSeparatedList(declaration.Variables[0].WithInitializer(SyntaxFactory.EqualsValueClause(startValue)))); + id = SyntaxFactory.IdentifierName(declaration.Variables[0].Identifier); + } else { + var v = (ExpressionSyntax)stmt.ControlVariable.Accept(nodesVisitor); + startValue = SyntaxFactory.AssignmentExpression(SyntaxKind.SimpleAssignmentExpression, v, startValue); + id = v; + } + + var step = (ExpressionSyntax)stmt.StepClause?.StepValue.Accept(nodesVisitor); + PrefixUnaryExpressionSyntax value = step.SkipParens() as PrefixUnaryExpressionSyntax; + ExpressionSyntax condition; + if (value == null) { + condition = SyntaxFactory.BinaryExpression(SyntaxKind.LessThanOrEqualExpression, id, (ExpressionSyntax)stmt.ToValue.Accept(nodesVisitor)); + } else { + condition = SyntaxFactory.BinaryExpression(SyntaxKind.GreaterThanOrEqualExpression, id, (ExpressionSyntax)stmt.ToValue.Accept(nodesVisitor)); + } + if (step == null) + step = SyntaxFactory.PostfixUnaryExpression(SyntaxKind.PostIncrementExpression, id); + else + step = SyntaxFactory.AssignmentExpression(SyntaxKind.AddAssignmentExpression, id, step); + var block = SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))); + return SingleStatement(SyntaxFactory.ForStatement( + declaration, + declaration != null ? SyntaxFactory.SeparatedList() : SyntaxFactory.SingletonSeparatedList(startValue), + condition, + SyntaxFactory.SingletonSeparatedList(step), + block)); + } + + public override SyntaxList VisitForEachBlock(VBSyntax.ForEachBlockSyntax node) + { + var stmt = node.ForEachStatement; + + TypeSyntax type = null; + SyntaxToken id; + if (stmt.ControlVariable is VBSyntax.VariableDeclaratorSyntax) + { + var v = (VBSyntax.VariableDeclaratorSyntax)stmt.ControlVariable; + var declaration = SplitVariableDeclarations(v, nodesVisitor, semanticModel).Values.Single(); + type = declaration.Type; + id = declaration.Variables[0].Identifier; + } + else + { + var v = (IdentifierNameSyntax)stmt.ControlVariable.Accept(nodesVisitor); + id = v.Identifier; + type = SyntaxFactory.ParseTypeName("var"); + } + + var block = SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))); + return SingleStatement(SyntaxFactory.ForEachStatement( + type, + id, + (ExpressionSyntax)stmt.Expression.Accept(nodesVisitor), + block + )); + } + + public override SyntaxList VisitSelectBlock(VBSyntax.SelectBlockSyntax node) + { + var expr = (ExpressionSyntax)node.SelectStatement.Expression.Accept(nodesVisitor); + SwitchStatementSyntax switchStatement; + if (ConvertToSwitch(expr, node.CaseBlocks, out switchStatement)) + return SingleStatement(switchStatement); + throw new NotSupportedException(); + } + + private bool ConvertToSwitch(ExpressionSyntax expr, SyntaxList caseBlocks, out SwitchStatementSyntax switchStatement) + { + switchStatement = null; + + var sections = new List(); + foreach (var block in caseBlocks) + { + var labels = SyntaxFactory.List(); + foreach (var c in block.CaseStatement.Cases) + { + if (c is VBSyntax.SimpleCaseClauseSyntax) { + var s = (VBSyntax.SimpleCaseClauseSyntax)c; + labels.Add(SyntaxFactory.CaseSwitchLabel((ExpressionSyntax)s.Value.Accept(nodesVisitor))); + } else if (c is VBSyntax.ElseCaseClauseSyntax) { + labels.Add(SyntaxFactory.DefaultSwitchLabel()); + } else return false; + } + var list = SyntaxFactory.List(block.Statements.SelectMany(s => s.Accept(this))); + sections.Add(SyntaxFactory.SwitchSection(labels, list)); + } + switchStatement = SyntaxFactory.SwitchStatement(expr, SyntaxFactory.List(sections)); + return true; + } + + public override SyntaxList VisitTryBlock(VBSyntax.TryBlockSyntax node) + { + return base.VisitTryBlock(node); + } + + public override SyntaxList VisitSyncLockBlock(VBSyntax.SyncLockBlockSyntax node) + { + return SingleStatement(SyntaxFactory.LockStatement( + (ExpressionSyntax)node.SyncLockStatement.Expression.Accept(nodesVisitor), + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))) + )); + } + + SyntaxList SingleStatement(StatementSyntax statement) + { + return SyntaxFactory.SingletonList(statement); + } + + SyntaxList SingleStatement(ExpressionSyntax expression) + { + return SyntaxFactory.SingletonList(SyntaxFactory.ExpressionStatement(expression)); + } + } + } +} diff --git a/RefactoringEssentials/CSharp/Converter/NodesVisitor.cs b/RefactoringEssentials/CSharp/Converter/NodesVisitor.cs new file mode 100644 index 00000000..518ec574 --- /dev/null +++ b/RefactoringEssentials/CSharp/Converter/NodesVisitor.cs @@ -0,0 +1,863 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using VBSyntax = Microsoft.CodeAnalysis.VisualBasic.Syntax; +using VBasic = Microsoft.CodeAnalysis.VisualBasic; + +namespace RefactoringEssentials.CSharp.Converter +{ + public partial class VisualBasicConverter + { + class NodesVisitor : VBasic.VisualBasicSyntaxVisitor + { + SemanticModel semanticModel; + Document targetDocument; + CSharpCompilationOptions options; + readonly Dictionary additionalFieldDeclarations = new Dictionary(); + + public NodesVisitor(SemanticModel semanticModel, Document targetDocument) + { + this.semanticModel = semanticModel; + this.targetDocument = targetDocument; + this.options = (CSharpCompilationOptions)targetDocument?.Project.CompilationOptions; + } + + public override CSharpSyntaxNode DefaultVisit(SyntaxNode node) + { + throw new NotImplementedException(node.GetType() + " not implemented!"); + } + + #region Attributes + + IEnumerable ConvertAttribute(VBSyntax.AttributeListSyntax attributeList) + { + return attributeList.Attributes.Select(a => (AttributeListSyntax)a.Accept(this)); + } + + public override CSharpSyntaxNode VisitAttribute(VBSyntax.AttributeSyntax node) + { + return SyntaxFactory.AttributeList( + node.Target == null ? null : SyntaxFactory.AttributeTargetSpecifier(ConvertToken(node.Target.AttributeModifier)), + SyntaxFactory.SingletonSeparatedList(SyntaxFactory.Attribute((NameSyntax)node.Name.Accept(this), (AttributeArgumentListSyntax)node.ArgumentList?.Accept(this))) + ); + } + + #endregion + + public override CSharpSyntaxNode VisitCompilationUnit(VBSyntax.CompilationUnitSyntax node) + { + var attributes = SyntaxFactory.List(node.Attributes.SelectMany(a => a.AttributeLists).SelectMany(ConvertAttribute)); + var members = SyntaxFactory.List(node.Members.Select(m => (MemberDeclarationSyntax)m.Accept(this))); + + return SyntaxFactory.CompilationUnit( + SyntaxFactory.List(), + SyntaxFactory.List(node.Imports.SelectMany(imp => imp.ImportsClauses).Select(c => (UsingDirectiveSyntax)c.Accept(this))), + attributes, + members + ); + } + + public override CSharpSyntaxNode VisitSimpleImportsClause(VBSyntax.SimpleImportsClauseSyntax node) + { + if (node.Alias != null) + { + return SyntaxFactory.UsingDirective(SyntaxFactory.NameEquals(SyntaxFactory.IdentifierName(ConvertIdentifier(node.Alias.Identifier, semanticModel))), (NameSyntax)node.Name.Accept(this)); + } + return SyntaxFactory.UsingDirective((NameSyntax)node.Name.Accept(this)); + } + + public override CSharpSyntaxNode VisitNamespaceBlock(VBSyntax.NamespaceBlockSyntax node) + { + var members = node.Members.Select(m => (MemberDeclarationSyntax)m.Accept(this)); + + return SyntaxFactory.NamespaceDeclaration( + (NameSyntax)node.NamespaceStatement.Name.Accept(this), + SyntaxFactory.List(), + SyntaxFactory.List(), + SyntaxFactory.List(members) + ); + } + + #region Namespace Members + + IEnumerable ConvertMembers(SyntaxList members) + { + foreach (var member in members.Select(m => (MemberDeclarationSyntax)m.Accept(this))) + { + BaseFieldDeclarationSyntax[] declarations; + if (member is BaseFieldDeclarationSyntax && additionalFieldDeclarations.TryGetValue((BaseFieldDeclarationSyntax)member, out declarations)) + { + foreach (var d in declarations) + yield return d; + additionalFieldDeclarations.Remove((BaseFieldDeclarationSyntax)member); + } + else + { + yield return member; + } + } + } + + public override CSharpSyntaxNode VisitClassBlock(VBSyntax.ClassBlockSyntax node) + { + var stmt = node.ClassStatement; + var attributes = SyntaxFactory.List(stmt.AttributeLists.SelectMany(ConvertAttribute)); + var members = SyntaxFactory.List(ConvertMembers(node.Members)); + + TypeParameterListSyntax parameters; + SyntaxList constraints; + SplitTypeParameters(stmt.TypeParameterList, out parameters, out constraints); + + return SyntaxFactory.ClassDeclaration( + attributes, + ConvertModifiers(stmt.Modifiers), + ConvertIdentifier(stmt.Identifier, semanticModel), + parameters, + ConvertInheritsAndImplements(node.Inherits, node.Implements), + constraints, + members + ); + } + + private BaseListSyntax ConvertInheritsAndImplements(SyntaxList inherits, SyntaxList implements) + { + if (inherits.Count + implements.Count == 0) + return null; + var baseTypes = new List(); + foreach (var t in inherits.SelectMany(c => c.Types).Concat(implements.SelectMany(c => c.Types))) + baseTypes.Add(SyntaxFactory.SimpleBaseType((TypeSyntax)t.Accept(this))); + return SyntaxFactory.BaseList(SyntaxFactory.SeparatedList(baseTypes)); + } + + public override CSharpSyntaxNode VisitModuleBlock(VBSyntax.ModuleBlockSyntax node) + { + var stmt = node.ModuleStatement; + var attributes = SyntaxFactory.List(stmt.AttributeLists.SelectMany(ConvertAttribute)); + var members = SyntaxFactory.List(ConvertMembers(node.Members)); + + TypeParameterListSyntax parameters; + SyntaxList constraints; + SplitTypeParameters(stmt.TypeParameterList, out parameters, out constraints); + + return SyntaxFactory.ClassDeclaration( + attributes, + ConvertModifiers(stmt.Modifiers).Add(SyntaxFactory.Token(SyntaxKind.StaticKeyword)), + ConvertIdentifier(stmt.Identifier, semanticModel), + parameters, + ConvertInheritsAndImplements(node.Inherits, node.Implements), + constraints, + members + ); + } + + public override CSharpSyntaxNode VisitStructureBlock(VBSyntax.StructureBlockSyntax node) + { + var stmt = node.StructureStatement; + var attributes = SyntaxFactory.List(stmt.AttributeLists.SelectMany(ConvertAttribute)); + var members = SyntaxFactory.List(ConvertMembers(node.Members)); + + TypeParameterListSyntax parameters; + SyntaxList constraints; + SplitTypeParameters(stmt.TypeParameterList, out parameters, out constraints); + + return SyntaxFactory.StructDeclaration( + attributes, + ConvertModifiers(stmt.Modifiers), + ConvertIdentifier(stmt.Identifier, semanticModel), + parameters, + ConvertInheritsAndImplements(node.Inherits, node.Implements), + constraints, + members + ); + } + + public override CSharpSyntaxNode VisitInterfaceBlock(VBSyntax.InterfaceBlockSyntax node) + { + var stmt = node.InterfaceStatement; + var attributes = SyntaxFactory.List(stmt.AttributeLists.SelectMany(ConvertAttribute)); + var members = SyntaxFactory.List(ConvertMembers(node.Members)); + + TypeParameterListSyntax parameters; + SyntaxList constraints; + SplitTypeParameters(stmt.TypeParameterList, out parameters, out constraints); + + return SyntaxFactory.InterfaceDeclaration( + attributes, + ConvertModifiers(stmt.Modifiers), + ConvertIdentifier(stmt.Identifier, semanticModel), + parameters, + ConvertInheritsAndImplements(node.Inherits, node.Implements), + constraints, + members + ); + } + + public override CSharpSyntaxNode VisitEnumBlock(VBSyntax.EnumBlockSyntax node) + { + var stmt = node.EnumStatement; + // we can cast to SimpleAsClause because other type make no sense as enum-type. + var asClause = (VBSyntax.SimpleAsClauseSyntax)stmt.UnderlyingType; + var attributes = stmt.AttributeLists.SelectMany(ConvertAttribute); + BaseListSyntax baseList = null; + if (asClause != null) + { + baseList = SyntaxFactory.BaseList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.SimpleBaseType((TypeSyntax)asClause.Type.Accept(this)))); + if (asClause.AttributeLists.Count > 0) + { + attributes = attributes.Concat( + SyntaxFactory.AttributeList( + SyntaxFactory.AttributeTargetSpecifier(SyntaxFactory.Token(SyntaxKind.ReturnKeyword)), + SyntaxFactory.SeparatedList(asClause.AttributeLists.SelectMany(l => ConvertAttribute(l).SelectMany(a => a.Attributes))) + ) + ); + } + } + var members = SyntaxFactory.SeparatedList(node.Members.Select(m => (EnumMemberDeclarationSyntax)m.Accept(this))); + return SyntaxFactory.EnumDeclaration( + SyntaxFactory.List(attributes), + ConvertModifiers(stmt.Modifiers), + ConvertIdentifier(stmt.Identifier, semanticModel), + baseList, + members + ); + } + + public override CSharpSyntaxNode VisitEnumMemberDeclaration(VBSyntax.EnumMemberDeclarationSyntax node) + { + var attributes = SyntaxFactory.List(node.AttributeLists.SelectMany(ConvertAttribute)); + return SyntaxFactory.EnumMemberDeclaration( + attributes, + ConvertIdentifier(node.Identifier, semanticModel), + (EqualsValueClauseSyntax)node.Initializer?.Accept(this) + ); + } + + public override CSharpSyntaxNode VisitDelegateStatement(VBSyntax.DelegateStatementSyntax node) + { + var attributes = node.AttributeLists.SelectMany(ConvertAttribute); + + TypeParameterListSyntax typeParameters; + SyntaxList constraints; + SplitTypeParameters(node.TypeParameterList, out typeParameters, out constraints); + + TypeSyntax returnType; + var asClause = node.AsClause; + if (asClause == null) + { + returnType = SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword)); + } + else + { + returnType = (TypeSyntax)asClause.Type.Accept(this); + if (asClause.AttributeLists.Count > 0) + { + attributes = attributes.Concat( + SyntaxFactory.AttributeList( + SyntaxFactory.AttributeTargetSpecifier(SyntaxFactory.Token(SyntaxKind.ReturnKeyword)), + SyntaxFactory.SeparatedList(asClause.AttributeLists.SelectMany(l => ConvertAttribute(l).SelectMany(a => a.Attributes))) + ) + ); + } + } + + return SyntaxFactory.DelegateDeclaration( + SyntaxFactory.List(attributes), + ConvertModifiers(node.Modifiers), + returnType, + ConvertIdentifier(node.Identifier, semanticModel), + typeParameters, + (ParameterListSyntax)node.ParameterList?.Accept(this), + constraints + ); + } + + #endregion + + #region Type Members + + public override CSharpSyntaxNode VisitFieldDeclaration(VBSyntax.FieldDeclarationSyntax node) + { + var attributes = node.AttributeLists.SelectMany(ConvertAttribute); + var modifiers = ConvertModifiers(node.Modifiers); + var key = SyntaxFactory.FieldDeclaration(SyntaxFactory.VariableDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword)))); + var declarations = new List(node.Declarators.Count); + + foreach (var declarator in node.Declarators) + { + foreach (var decl in SplitVariableDeclarations(declarator, this, semanticModel).Values) + { + declarations.Add(SyntaxFactory.FieldDeclaration( + SyntaxFactory.List(attributes), + modifiers, + decl + )); + } + } + + additionalFieldDeclarations.Add(key, declarations.ToArray()); + return key; + } + + public override CSharpSyntaxNode VisitPropertyBlock(VBSyntax.PropertyBlockSyntax node) + { + return base.VisitPropertyBlock(node); + } + + public override CSharpSyntaxNode VisitMethodBlock(VBSyntax.MethodBlockSyntax node) + { + var block = node.SubOrFunctionStatement; + var attributes = block.AttributeLists.SelectMany(ConvertAttribute); + var modifiers = ConvertModifiers(block.Modifiers); + + return SyntaxFactory.MethodDeclaration( + SyntaxFactory.List(attributes), + modifiers, + (TypeSyntax)block.AsClause?.Type.Accept(this) ?? SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword)), + null, + ConvertIdentifier(block.Identifier, semanticModel), + null, + (ParameterListSyntax)block.ParameterList.Accept(this), + SyntaxFactory.List(), + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(new MethodBodyVisitor(semanticModel, this)))), + null + ); + } + + public override CSharpSyntaxNode VisitEventBlock(VBSyntax.EventBlockSyntax node) + { + return base.VisitEventBlock(node); + } + + public override CSharpSyntaxNode VisitEventStatement(VBSyntax.EventStatementSyntax node) + { + return base.VisitEventStatement(node); + } + + public override CSharpSyntaxNode VisitOperatorBlock(VBSyntax.OperatorBlockSyntax node) + { + var block = node.OperatorStatement; + var attributes = block.AttributeLists.SelectMany(ConvertAttribute); + var modifiers = ConvertModifiers(block.Modifiers); + return SyntaxFactory.OperatorDeclaration( + SyntaxFactory.List(attributes), + modifiers, + (TypeSyntax)block.AsClause?.Type.Accept(this) ?? SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword)), + ConvertToken(block.OperatorToken), + (ParameterListSyntax)block.ParameterList.Accept(this), + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(new MethodBodyVisitor(semanticModel, this)))), + null + ); + } + + public override CSharpSyntaxNode VisitConstructorBlock(VBSyntax.ConstructorBlockSyntax node) + { + var block = node.BlockStatement; + var attributes = block.AttributeLists.SelectMany(ConvertAttribute); + var modifiers = ConvertModifiers(block.Modifiers); + return SyntaxFactory.ConstructorDeclaration( + SyntaxFactory.List(attributes), + modifiers, + ConvertIdentifier(node.GetAncestor().BlockStatement.Identifier, semanticModel), + (ParameterListSyntax)block.ParameterList.Accept(this), + null, + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(new MethodBodyVisitor(semanticModel, this)))) + ); + } + + public override CSharpSyntaxNode VisitParameterList(VBSyntax.ParameterListSyntax node) + { + if (node.Parent is VBSyntax.PropertyStatementSyntax) + { + return SyntaxFactory.BracketedParameterList(SyntaxFactory.SeparatedList(node.Parameters.Select(p => (ParameterSyntax)p.Accept(this)))); + } + return SyntaxFactory.ParameterList(SyntaxFactory.SeparatedList(node.Parameters.Select(p => (ParameterSyntax)p.Accept(this)))); + } + + public override CSharpSyntaxNode VisitParameter(VBSyntax.ParameterSyntax node) + { + var id = ConvertIdentifier(node.Identifier.Identifier, semanticModel); + var returnType = (TypeSyntax)node.AsClause?.Type.Accept(this); + if (returnType != null && !node.Identifier.Nullable.IsKind(SyntaxKind.None)) + { + var arrayType = returnType as ArrayTypeSyntax; + if (arrayType == null) + { + returnType = SyntaxFactory.NullableType(returnType); + } + else + { + returnType = arrayType.WithElementType(SyntaxFactory.NullableType(arrayType.ElementType)); + } + } + EqualsValueClauseSyntax @default = null; + if (node.Default != null) + { + @default = SyntaxFactory.EqualsValueClause((ExpressionSyntax)node.Default?.Value.Accept(this)); + } + var attributes = node.AttributeLists.SelectMany(ConvertAttribute).ToList(); + int outAttributeIndex = attributes.FindIndex(a => a.Attributes.Single().Name.ToString() == "Out"); + var modifiers = ConvertModifiers(node.Modifiers); + if (outAttributeIndex > -1) { + attributes.RemoveAt(outAttributeIndex); + modifiers = modifiers.Replace(SyntaxFactory.Token(SyntaxKind.RefKeyword), SyntaxFactory.Token(SyntaxKind.OutKeyword)); + } + return SyntaxFactory.Parameter( + SyntaxFactory.List(attributes), + modifiers, + returnType, + id, + @default + ); + } + + #endregion + + #region Expressions + + public override CSharpSyntaxNode VisitCTypeExpression(VBSyntax.CTypeExpressionSyntax node) + { + return SyntaxFactory.CastExpression( + (TypeSyntax)node.Type.Accept(this), + (ExpressionSyntax)node.Expression.Accept(this) + ); + } + + public override CSharpSyntaxNode VisitPredefinedCastExpression(VBSyntax.PredefinedCastExpressionSyntax node) + { + if (node.Keyword.IsKind(VBasic.SyntaxKind.CDateKeyword)) + { + return SyntaxFactory.CastExpression( + SyntaxFactory.ParseTypeName("DateTime"), + (ExpressionSyntax)node.Expression.Accept(this) + ); + } + return SyntaxFactory.CastExpression( + SyntaxFactory.PredefinedType(ConvertToken(node.Keyword)), + (ExpressionSyntax)node.Expression.Accept(this) + ); + } + + public override CSharpSyntaxNode VisitTryCastExpression(VBSyntax.TryCastExpressionSyntax node) + { + return SyntaxFactory.BinaryExpression( + SyntaxKind.AsExpression, + (ExpressionSyntax)node.Expression.Accept(this), + (TypeSyntax)node.Type.Accept(this) + ); + } + + public override CSharpSyntaxNode VisitLiteralExpression(VBSyntax.LiteralExpressionSyntax node) + { + return Literal(node.Token.Value); + } + + public override CSharpSyntaxNode VisitInterpolatedStringExpression(VBSyntax.InterpolatedStringExpressionSyntax node) + { + return SyntaxFactory.InterpolatedStringExpression(SyntaxFactory.Token(SyntaxKind.InterpolatedStringStartToken), SyntaxFactory.List(node.Contents.Select(c => (InterpolatedStringContentSyntax)c.Accept(this)))); + } + + public override CSharpSyntaxNode VisitInterpolatedStringText(VBSyntax.InterpolatedStringTextSyntax node) + { + return SyntaxFactory.InterpolatedStringText(SyntaxFactory.Token(default(SyntaxTriviaList), SyntaxKind.InterpolatedStringTextToken, node.TextToken.Text, node.TextToken.ValueText, default(SyntaxTriviaList))); + } + + public override CSharpSyntaxNode VisitInterpolation(VBSyntax.InterpolationSyntax node) + { + return SyntaxFactory.Interpolation((ExpressionSyntax)node.Expression.Accept(this)); + } + + public override CSharpSyntaxNode VisitInterpolationFormatClause(VBSyntax.InterpolationFormatClauseSyntax node) + { + return base.VisitInterpolationFormatClause(node); + } + + public override CSharpSyntaxNode VisitMeExpression(VBSyntax.MeExpressionSyntax node) + { + return SyntaxFactory.ThisExpression(); + } + + public override CSharpSyntaxNode VisitMyBaseExpression(VBSyntax.MyBaseExpressionSyntax node) + { + return SyntaxFactory.BaseExpression(); + } + + public override CSharpSyntaxNode VisitParenthesizedExpression(VBSyntax.ParenthesizedExpressionSyntax node) + { + return SyntaxFactory.ParenthesizedExpression((ExpressionSyntax)node.Expression.Accept(this)); + } + + public override CSharpSyntaxNode VisitMemberAccessExpression(VBSyntax.MemberAccessExpressionSyntax node) + { + var left = (ExpressionSyntax)node.Expression?.Accept(this); + if (left == null) + return SyntaxFactory.MemberBindingExpression((SimpleNameSyntax)node.Name.Accept(this)); + else + return SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, left, (SimpleNameSyntax)node.Name.Accept(this)); + } + + public override CSharpSyntaxNode VisitConditionalAccessExpression(VBSyntax.ConditionalAccessExpressionSyntax node) + { + return SyntaxFactory.ConditionalAccessExpression((ExpressionSyntax)node.Expression.Accept(this), (ExpressionSyntax)node.WhenNotNull.Accept(this)); + } + + public override CSharpSyntaxNode VisitArgumentList(VBSyntax.ArgumentListSyntax node) + { + if (node.Parent.IsKind(VBasic.SyntaxKind.Attribute)) + { + return SyntaxFactory.AttributeArgumentList(SyntaxFactory.SeparatedList(node.Arguments.Select(ToAttributeArgument))); + } + return SyntaxFactory.ArgumentList(SyntaxFactory.SeparatedList(node.Arguments.Select(a => (ArgumentSyntax)a.Accept(this)))); + } + + public override CSharpSyntaxNode VisitSimpleArgument(VBSyntax.SimpleArgumentSyntax node) + { + int argID = ((VBSyntax.ArgumentListSyntax)node.Parent).Arguments.IndexOf(node); + var invocation = node.Parent.Parent; + if (invocation is VBSyntax.ArrayCreationExpressionSyntax) + return node.Expression.Accept(this); + var symbol = invocation.TypeSwitch( + (VBSyntax.InvocationExpressionSyntax e) => ExtractMatch(semanticModel.GetSymbolInfo(e)) as IMethodSymbol, + (VBSyntax.ObjectCreationExpressionSyntax e) => ExtractMatch(semanticModel.GetSymbolInfo(e)) as IMethodSymbol, + _ => { throw new NotSupportedException(); } + ); + SyntaxToken token = default(SyntaxToken); + if (symbol != null) + { + var p = symbol.Parameters[argID]; + switch (p.RefKind) + { + case RefKind.None: + token = default(SyntaxToken); + break; + case RefKind.Ref: + token = SyntaxFactory.Token(SyntaxKind.RefKeyword); + break; + case RefKind.Out: + token = SyntaxFactory.Token(SyntaxKind.OutKeyword); + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + return SyntaxFactory.Argument( + node.IsNamed ? SyntaxFactory.NameColon((IdentifierNameSyntax)node.NameColonEquals.Name.Accept(this)) : null, + token, + (ExpressionSyntax)node.Expression.Accept(this) + ); + } + + private ISymbol ExtractMatch(SymbolInfo info) + { + if (info.Symbol == null && info.CandidateSymbols.Length == 0) + return null; + if (info.Symbol != null) + return info.Symbol; + if (info.CandidateSymbols.Length == 1) + return info.CandidateSymbols[0]; + return null; + } + + private AttributeArgumentSyntax ToAttributeArgument(VBSyntax.ArgumentSyntax arg) + { + if (!(arg is VBSyntax.SimpleArgumentSyntax)) + throw new NotSupportedException(); + var a = (VBSyntax.SimpleArgumentSyntax)arg; + var attr = SyntaxFactory.AttributeArgument((ExpressionSyntax)a.Expression.Accept(this)); + if (a.IsNamed) + { + attr = attr.WithNameEquals(SyntaxFactory.NameEquals((IdentifierNameSyntax)a.NameColonEquals.Name.Accept(this))); + } + return attr; + } + + public override CSharpSyntaxNode VisitNameOfExpression(VBSyntax.NameOfExpressionSyntax node) + { + return SyntaxFactory.InvocationExpression(SyntaxFactory.IdentifierName("nameof"), SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.Argument((ExpressionSyntax)node.Argument.Accept(this))))); + } + + public override CSharpSyntaxNode VisitEqualsValue(VBSyntax.EqualsValueSyntax node) + { + return SyntaxFactory.EqualsValueClause((ExpressionSyntax)node.Value.Accept(this)); + } + + public override CSharpSyntaxNode VisitAnonymousObjectCreationExpression(VBSyntax.AnonymousObjectCreationExpressionSyntax node) + { + return base.VisitAnonymousObjectCreationExpression(node); + } + + public override CSharpSyntaxNode VisitObjectCreationExpression(VBSyntax.ObjectCreationExpressionSyntax node) + { + return SyntaxFactory.ObjectCreationExpression( + (TypeSyntax)node.Type.Accept(this), + (ArgumentListSyntax)node.ArgumentList?.Accept(this), + (InitializerExpressionSyntax)node.Initializer?.Accept(this) + ); + } + + public override CSharpSyntaxNode VisitArrayCreationExpression(VBSyntax.ArrayCreationExpressionSyntax node) + { + IEnumerable arguments; + if (node.ArrayBounds != null) + arguments = node.ArrayBounds.Arguments.Select(a => IncreaseArrayUpperBoundExpression(((VBSyntax.SimpleArgumentSyntax)a).Expression)); + else + arguments = Enumerable.Empty(); + var bounds = SyntaxFactory.SingletonList(SyntaxFactory.ArrayRankSpecifier(SyntaxFactory.SeparatedList(arguments))); + return SyntaxFactory.ArrayCreationExpression( + SyntaxFactory.ArrayType((TypeSyntax)node.Type.Accept(this), bounds), + (InitializerExpressionSyntax)node.Initializer?.Accept(this) + ); + } + + public override CSharpSyntaxNode VisitCollectionInitializer(VBSyntax.CollectionInitializerSyntax node) + { + if (node.Initializers.Count == 0 && node.Parent is VBSyntax.ArrayCreationExpressionSyntax) + return null; + return SyntaxFactory.InitializerExpression(SyntaxKind.CollectionInitializerExpression, SyntaxFactory.SeparatedList(node.Initializers.Select(i => (ExpressionSyntax)i.Accept(this)))); + } + + ExpressionSyntax IncreaseArrayUpperBoundExpression(VBSyntax.ExpressionSyntax expr) + { + var constant = semanticModel.GetConstantValue(expr); + if (constant.HasValue && constant.Value is int) + return SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal((int)constant.Value + 1)); + + return SyntaxFactory.BinaryExpression( + SyntaxKind.SubtractExpression, + (ExpressionSyntax)expr.Accept(this), SyntaxFactory.Token(SyntaxKind.PlusToken), SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(1))); + } + + public override CSharpSyntaxNode VisitBinaryConditionalExpression(VBSyntax.BinaryConditionalExpressionSyntax node) + { + return SyntaxFactory.BinaryExpression( + SyntaxKind.CoalesceExpression, + (ExpressionSyntax)node.FirstExpression.Accept(this), + (ExpressionSyntax)node.SecondExpression.Accept(this) + ); + } + + public override CSharpSyntaxNode VisitTernaryConditionalExpression(VBSyntax.TernaryConditionalExpressionSyntax node) + { + return SyntaxFactory.ConditionalExpression( + (ExpressionSyntax)node.Condition.Accept(this), + (ExpressionSyntax)node.WhenTrue.Accept(this), + (ExpressionSyntax)node.WhenFalse.Accept(this) + ); + } + + public override CSharpSyntaxNode VisitTypeOfExpression(VBSyntax.TypeOfExpressionSyntax node) + { + var expr = SyntaxFactory.BinaryExpression( + SyntaxKind.IsExpression, + (ExpressionSyntax)node.Expression.Accept(this), + (TypeSyntax)node.Type.Accept(this) + ); + if (node.IsKind(VBasic.SyntaxKind.TypeOfIsNotExpression)) + return SyntaxFactory.PrefixUnaryExpression(SyntaxKind.LogicalNotExpression, expr); + else + return expr; + } + + public override CSharpSyntaxNode VisitUnaryExpression(VBSyntax.UnaryExpressionSyntax node) + { + var expr = (ExpressionSyntax)node.Operand.Accept(this); + if (node.IsKind(VBasic.SyntaxKind.AddressOfExpression)) + return expr; + var kind = ConvertToken(VBasic.VisualBasicExtensions.Kind(node), TokenContext.Local); + return SyntaxFactory.PrefixUnaryExpression( + kind, + SyntaxFactory.Token(CSharpUtil.GetExpressionOperatorTokenKind(kind)), + expr + ); + } + + public override CSharpSyntaxNode VisitBinaryExpression(VBSyntax.BinaryExpressionSyntax node) + { + if (node.IsKind(VBasic.SyntaxKind.IsExpression)) + { + ExpressionSyntax otherArgument = null; + if (node.Left.IsKind(VBasic.SyntaxKind.NothingLiteralExpression)) + { + otherArgument = (ExpressionSyntax)node.Right.Accept(this); + } + if (node.Right.IsKind(VBasic.SyntaxKind.NothingLiteralExpression)) + { + otherArgument = (ExpressionSyntax)node.Left.Accept(this); + } + if (otherArgument != null) + { + return SyntaxFactory.BinaryExpression(SyntaxKind.EqualsExpression, otherArgument, SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)); + } + } + if (node.IsKind(VBasic.SyntaxKind.IsNotExpression)) + { + ExpressionSyntax otherArgument = null; + if (node.Left.IsKind(VBasic.SyntaxKind.NothingLiteralExpression)) + { + otherArgument = (ExpressionSyntax)node.Right.Accept(this); + } + if (node.Right.IsKind(VBasic.SyntaxKind.NothingLiteralExpression)) + { + otherArgument = (ExpressionSyntax)node.Left.Accept(this); + } + if (otherArgument != null) + { + return SyntaxFactory.BinaryExpression(SyntaxKind.NotEqualsExpression, otherArgument, SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)); + } + } + var kind = ConvertToken(VBasic.VisualBasicExtensions.Kind(node), TokenContext.Local); + return SyntaxFactory.BinaryExpression( + kind, + (ExpressionSyntax)node.Left.Accept(this), + SyntaxFactory.Token(CSharpUtil.GetExpressionOperatorTokenKind(kind)), + (ExpressionSyntax)node.Right.Accept(this) + ); + } + + public override CSharpSyntaxNode VisitInvocationExpression(VBSyntax.InvocationExpressionSyntax node) + { + return SyntaxFactory.InvocationExpression( + (ExpressionSyntax)node.Expression.Accept(this), + (ArgumentListSyntax)node.ArgumentList.Accept(this) + ); + } + + public override CSharpSyntaxNode VisitSingleLineLambdaExpression(VBSyntax.SingleLineLambdaExpressionSyntax node) + { + CSharpSyntaxNode body; + if (node.Body is VBSyntax.ExpressionSyntax) + body = node.Body.Accept(this); + else + { + var stmt = node.Body.Accept(new MethodBodyVisitor(semanticModel, this)); + if (stmt.Count == 1) + body = stmt[0]; + else + { + body = SyntaxFactory.Block(stmt); + } + } + var param = (ParameterListSyntax)node.SubOrFunctionHeader.ParameterList.Accept(this); + if (param.Parameters.Count == 1) + return SyntaxFactory.SimpleLambdaExpression(param.Parameters[0], body); + return SyntaxFactory.ParenthesizedLambdaExpression(param, body); + } + + public override CSharpSyntaxNode VisitMultiLineLambdaExpression(VBSyntax.MultiLineLambdaExpressionSyntax node) + { + var body = SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(new MethodBodyVisitor(semanticModel, this)))); + var param = (ParameterListSyntax)node.SubOrFunctionHeader.ParameterList.Accept(this); + if (param.Parameters.Count == 1) + return SyntaxFactory.SimpleLambdaExpression(param.Parameters[0], body); + return SyntaxFactory.ParenthesizedLambdaExpression(param, body); + } + + #endregion + + #region Type Name / Modifier + + public override CSharpSyntaxNode VisitPredefinedType(VBSyntax.PredefinedTypeSyntax node) + { + return SyntaxFactory.PredefinedType(ConvertToken(node.Keyword)); + } + + public override CSharpSyntaxNode VisitNullableType(VBSyntax.NullableTypeSyntax node) + { + return SyntaxFactory.NullableType((TypeSyntax)node.ElementType.Accept(this)); + } + + public override CSharpSyntaxNode VisitArrayType(VBSyntax.ArrayTypeSyntax node) + { + return SyntaxFactory.ArrayType((TypeSyntax)node.ElementType.Accept(this), SyntaxFactory.List(node.RankSpecifiers.Select(r => (ArrayRankSpecifierSyntax)r.Accept(this)))); + } + + public override CSharpSyntaxNode VisitArrayRankSpecifier(VBSyntax.ArrayRankSpecifierSyntax node) + { + return SyntaxFactory.ArrayRankSpecifier(SyntaxFactory.SeparatedList(Enumerable.Repeat(SyntaxFactory.OmittedArraySizeExpression(), node.Rank))); + } + + private void SplitTypeParameters(VBSyntax.TypeParameterListSyntax typeParameterList, out TypeParameterListSyntax parameters, out SyntaxList constraints) + { + parameters = null; + constraints = SyntaxFactory.List(); + if (typeParameterList == null) + return; + var paramList = new List(); + var constraintList = new List(); + foreach (var p in typeParameterList.Parameters) + { + var tp = (TypeParameterSyntax)p.Accept(this); + paramList.Add(tp); + constraintList.Add((TypeParameterConstraintClauseSyntax)p.TypeParameterConstraintClause.Accept(this)); + } + parameters = SyntaxFactory.TypeParameterList(SyntaxFactory.SeparatedList(paramList)); + constraints = SyntaxFactory.List(constraintList); + } + + public override CSharpSyntaxNode VisitTypeParameter(VBSyntax.TypeParameterSyntax node) + { + SyntaxToken variance = default(SyntaxToken); + if (!node.VarianceKeyword.IsKind(VBasic.SyntaxKind.None)) + { + variance = SyntaxFactory.Token(node.VarianceKeyword.IsKind(VBasic.SyntaxKind.InKeyword) ? SyntaxKind.InKeyword : SyntaxKind.OutKeyword); + } + return SyntaxFactory.TypeParameter(SyntaxFactory.List(), variance, ConvertIdentifier(node.Identifier, semanticModel)); + } + + public override CSharpSyntaxNode VisitTypeParameterSingleConstraintClause(VBSyntax.TypeParameterSingleConstraintClauseSyntax node) + { + var id = SyntaxFactory.IdentifierName(ConvertIdentifier(((VBSyntax.TypeParameterSyntax)node.Parent).Identifier, semanticModel)); + return SyntaxFactory.TypeParameterConstraintClause(id, SyntaxFactory.SingletonSeparatedList((TypeParameterConstraintSyntax)node.Constraint.Accept(this))); + } + + public override CSharpSyntaxNode VisitTypeParameterMultipleConstraintClause(VBSyntax.TypeParameterMultipleConstraintClauseSyntax node) + { + var id = SyntaxFactory.IdentifierName(ConvertIdentifier(((VBSyntax.TypeParameterSyntax)node.Parent).Identifier, semanticModel)); + return SyntaxFactory.TypeParameterConstraintClause(id, SyntaxFactory.SeparatedList(node.Constraints.Select(c => (TypeParameterConstraintSyntax)c.Accept(this)))); + } + + public override CSharpSyntaxNode VisitSpecialConstraint(VBSyntax.SpecialConstraintSyntax node) + { + if (node.ConstraintKeyword.IsKind(VBasic.SyntaxKind.NewKeyword)) + return SyntaxFactory.ConstructorConstraint(); + return SyntaxFactory.ClassOrStructConstraint(node.IsKind(VBasic.SyntaxKind.ClassConstraint) ? SyntaxKind.ClassConstraint : SyntaxKind.StructConstraint); + } + + public override CSharpSyntaxNode VisitTypeConstraint(VBSyntax.TypeConstraintSyntax node) + { + return SyntaxFactory.TypeConstraint((TypeSyntax)node.Type.Accept(this)); + } + + #endregion + + #region NameSyntax + + public override CSharpSyntaxNode VisitIdentifierName(VBSyntax.IdentifierNameSyntax node) + { + return SyntaxFactory.IdentifierName(ConvertIdentifier(node.Identifier, semanticModel, node.Parent is VBSyntax.AsClauseSyntax)); + } + + public override CSharpSyntaxNode VisitQualifiedName(VBSyntax.QualifiedNameSyntax node) + { + return SyntaxFactory.QualifiedName((NameSyntax)node.Left.Accept(this), (SimpleNameSyntax)node.Right.Accept(this)); + } + + public override CSharpSyntaxNode VisitGenericName(VBSyntax.GenericNameSyntax node) + { + return SyntaxFactory.GenericName(ConvertIdentifier(node.Identifier, semanticModel), (TypeArgumentListSyntax)node.TypeArgumentList?.Accept(this)); + } + + public override CSharpSyntaxNode VisitTypeArgumentList(VBSyntax.TypeArgumentListSyntax node) + { + return SyntaxFactory.TypeArgumentList(SyntaxFactory.SeparatedList(node.Arguments.Select(a => (TypeSyntax)a.Accept(this)))); + } + + #endregion + } + } +} diff --git a/RefactoringEssentials/CSharp/Converter/VisualBasicConverter.cs b/RefactoringEssentials/CSharp/Converter/VisualBasicConverter.cs new file mode 100644 index 00000000..18f0a855 --- /dev/null +++ b/RefactoringEssentials/CSharp/Converter/VisualBasicConverter.cs @@ -0,0 +1,341 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using VBasic = Microsoft.CodeAnalysis.VisualBasic; +using VBSyntax = Microsoft.CodeAnalysis.VisualBasic.Syntax; +using RefactoringEssentials.Converter; +using Microsoft.CodeAnalysis.Text; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace RefactoringEssentials.CSharp.Converter +{ + public partial class VisualBasicConverter + { + enum TokenContext + { + Global, + InterfaceOrModule, + Member, + VariableOrConst, + Local + } + + public static CSharpSyntaxNode Convert(VBasic.VisualBasicSyntaxNode input, SemanticModel semanticModel, Document targetDocument) + { + return input.Accept(new NodesVisitor(semanticModel, targetDocument)); + } + + public static ConversionResult ConvertText(string text, MetadataReference[] references) + { + if (text == null) + throw new ArgumentNullException(nameof(text)); + if (references == null) + throw new ArgumentNullException(nameof(references)); + var tree = VBasic.SyntaxFactory.ParseSyntaxTree(SourceText.From(text)); + var compilation = VBasic.VisualBasicCompilation.Create("Conversion", new[] { tree }, references); + try + { + return new ConversionResult(Convert((VBasic.VisualBasicSyntaxNode)tree.GetRoot(), compilation.GetSemanticModel(tree, true), null).NormalizeWhitespace().ToFullString()); + } + catch (Exception ex) + { + return new ConversionResult(ex); + } + } + + static Dictionary SplitVariableDeclarations(VBSyntax.VariableDeclaratorSyntax declarator, NodesVisitor nodesVisitor, SemanticModel semanticModel) + { + var rawType = (TypeSyntax)declarator.AsClause?.TypeSwitch( + (VBSyntax.SimpleAsClauseSyntax c) => c.Type, + (VBSyntax.AsNewClauseSyntax c) => VBasic.SyntaxExtensions.Type(c.NewExpression), + _ => { throw new NotImplementedException($"{_.GetType().FullName} not implemented!"); } + )?.Accept(nodesVisitor) ?? SyntaxFactory.ParseTypeName("var"); + + var initializer = (ExpressionSyntax)declarator.AsClause?.TypeSwitch( + (VBSyntax.SimpleAsClauseSyntax _) => declarator.Initializer?.Value, + (VBSyntax.AsNewClauseSyntax c) => c.NewExpression + )?.Accept(nodesVisitor) ?? (ExpressionSyntax)declarator.Initializer?.Value.Accept(nodesVisitor); + + var newDecls = new Dictionary(); + + foreach (var name in declarator.Names) + { + var type = rawType; + if (!name.Nullable.IsKind(VBasic.SyntaxKind.None)) + { + if (type is ArrayTypeSyntax) + type = ((ArrayTypeSyntax)type).WithElementType(SyntaxFactory.NullableType(((ArrayTypeSyntax)type).ElementType)); + else + type = SyntaxFactory.NullableType(type); + } + if (name.ArrayRankSpecifiers.Count > 0) + type = SyntaxFactory.ArrayType(type, SyntaxFactory.List(name.ArrayRankSpecifiers.Select(a => (ArrayRankSpecifierSyntax)a.Accept(nodesVisitor)))); + VariableDeclarationSyntax decl; + var v = SyntaxFactory.VariableDeclarator(ConvertIdentifier(name.Identifier, semanticModel), null, initializer == null ? null : SyntaxFactory.EqualsValueClause(initializer)); + string k = type.ToString(); + if (newDecls.TryGetValue(k, out decl)) + newDecls[k] = decl.AddVariables(v); + else + newDecls[k] = SyntaxFactory.VariableDeclaration(type, SyntaxFactory.SingletonSeparatedList(v)); + } + + return newDecls; + } + + static ExpressionSyntax Literal(object o) => CodeRefactorings.ComputeConstantValueCodeRefactoringProvider.GetLiteralExpression(o); + + static SyntaxToken ConvertIdentifier(SyntaxToken id, SemanticModel semanticModel, bool isInTypeContext = false) + { + var keywordKind = SyntaxFacts.GetKeywordKind(id.ValueText); + if (keywordKind != SyntaxKind.None && !SyntaxFacts.IsPredefinedType(keywordKind)) + return SyntaxFactory.Identifier("@" + id.ValueText); + var symbol = semanticModel.GetSymbolInfo(id.Parent).Symbol; + string text = id.ValueText; + if (symbol != null && !string.IsNullOrWhiteSpace(symbol.Name)) + text = symbol.Name; + return SyntaxFactory.Identifier(text); + } + + static SyntaxTokenList ConvertModifiers(IEnumerable modifiers, TokenContext context = TokenContext.Global) + { + return SyntaxFactory.TokenList(ConvertModifiersCore(modifiers, context)); + } + + static SyntaxTokenList ConvertModifiers(SyntaxTokenList modifiers, TokenContext context = TokenContext.Global) + { + return SyntaxFactory.TokenList(ConvertModifiersCore(modifiers, context)); + } + + static SyntaxToken? ConvertModifier(SyntaxToken m, TokenContext context = TokenContext.Global) + { + var token = ConvertToken(VBasic.VisualBasicExtensions.Kind(m), context); + return token == SyntaxKind.None ? null : new SyntaxToken?(SyntaxFactory.Token(token)); + } + + static IEnumerable ConvertModifiersCore(IEnumerable modifiers, TokenContext context) + { + if (context != TokenContext.Local && context != TokenContext.InterfaceOrModule) + { + bool visibility = false; + foreach (var token in modifiers) + { + if (IsVisibility(token, context)) + { + visibility = true; + break; + } + } + if (!visibility && context == TokenContext.Member) + yield return VisualBasicDefaultVisibility(context); + } + foreach (var token in modifiers.Where(m => !IgnoreInContext(m, context))) + { + var m = ConvertModifier(token, context); + if (m.HasValue) yield return m.Value; + } + } + + static bool IgnoreInContext(SyntaxToken m, TokenContext context) + { + switch (VBasic.VisualBasicExtensions.Kind(m)) + { + case VBasic.SyntaxKind.OptionalKeyword: + case VBasic.SyntaxKind.ByValKeyword: + case VBasic.SyntaxKind.IteratorKeyword: + case VBasic.SyntaxKind.DimKeyword: + return true; + default: + return false; + } + } + + static bool IsVisibility(SyntaxToken token, TokenContext context) + { + return token.IsKind(VBasic.SyntaxKind.PublicKeyword, VBasic.SyntaxKind.FriendKeyword, VBasic.SyntaxKind.ProtectedKeyword, VBasic.SyntaxKind.PrivateKeyword) + || (context == TokenContext.VariableOrConst && token.IsKind(VBasic.SyntaxKind.ConstKeyword)); + } + + static SyntaxToken VisualBasicDefaultVisibility(TokenContext context) + { + switch (context) + { + case TokenContext.Global: + return SyntaxFactory.Token(SyntaxKind.InternalKeyword); + case TokenContext.Local: + case TokenContext.VariableOrConst: + case TokenContext.Member: + return SyntaxFactory.Token(SyntaxKind.PrivateKeyword); + } + throw new ArgumentOutOfRangeException(nameof(context)); + } + + static SyntaxToken ConvertToken(SyntaxToken t, TokenContext context = TokenContext.Global) + { + return SyntaxFactory.Token(ConvertToken(VBasic.VisualBasicExtensions.Kind(t), context)); + } + + static SyntaxKind ConvertToken(VBasic.SyntaxKind t, TokenContext context = TokenContext.Global) + { + switch (t) + { + case VBasic.SyntaxKind.None: + return SyntaxKind.None; + // built-in types + case VBasic.SyntaxKind.BooleanKeyword: + return SyntaxKind.BoolKeyword; + case VBasic.SyntaxKind.ByteKeyword: + return SyntaxKind.ByteKeyword; + case VBasic.SyntaxKind.SByteKeyword: + return SyntaxKind.SByteKeyword; + case VBasic.SyntaxKind.ShortKeyword: + return SyntaxKind.ShortKeyword; + case VBasic.SyntaxKind.UShortKeyword: + return SyntaxKind.UShortKeyword; + case VBasic.SyntaxKind.IntegerKeyword: + return SyntaxKind.IntKeyword; + case VBasic.SyntaxKind.UIntegerKeyword: + return SyntaxKind.UIntKeyword; + case VBasic.SyntaxKind.LongKeyword: + return SyntaxKind.LongKeyword; + case VBasic.SyntaxKind.ULongKeyword: + return SyntaxKind.ULongKeyword; + case VBasic.SyntaxKind.DoubleKeyword: + return SyntaxKind.DoubleKeyword; + case VBasic.SyntaxKind.SingleKeyword: + return SyntaxKind.FloatKeyword; + case VBasic.SyntaxKind.DecimalKeyword: + return SyntaxKind.DecimalKeyword; + case VBasic.SyntaxKind.StringKeyword: + return SyntaxKind.StringKeyword; + case VBasic.SyntaxKind.CharKeyword: + return SyntaxKind.CharKeyword; + case VBasic.SyntaxKind.ObjectKeyword: + return SyntaxKind.ObjectKeyword; + // literals + case VBasic.SyntaxKind.NothingKeyword: + return SyntaxKind.NullKeyword; + case VBasic.SyntaxKind.TrueKeyword: + return SyntaxKind.TrueKeyword; + case VBasic.SyntaxKind.FalseKeyword: + return SyntaxKind.FalseKeyword; + case VBasic.SyntaxKind.MeKeyword: + return SyntaxKind.ThisKeyword; + case VBasic.SyntaxKind.MyBaseKeyword: + return SyntaxKind.BaseKeyword; + // modifiers + case VBasic.SyntaxKind.PublicKeyword: + return SyntaxKind.PublicKeyword; + case VBasic.SyntaxKind.FriendKeyword: + return SyntaxKind.InternalKeyword; + case VBasic.SyntaxKind.ProtectedKeyword: + return SyntaxKind.ProtectedKeyword; + case VBasic.SyntaxKind.PrivateKeyword: + return SyntaxKind.PrivateKeyword; + case VBasic.SyntaxKind.ByRefKeyword: + return SyntaxKind.RefKeyword; + case VBasic.SyntaxKind.ParamArrayKeyword: + return SyntaxKind.ParamsKeyword; + case VBasic.SyntaxKind.ReadOnlyKeyword: + return SyntaxKind.ReadOnlyKeyword; + case VBasic.SyntaxKind.OverridesKeyword: + return SyntaxKind.OverrideKeyword; + case VBasic.SyntaxKind.SharedKeyword: + return SyntaxKind.StaticKeyword; + case VBasic.SyntaxKind.ConstKeyword: + return SyntaxKind.ConstKeyword; + case VBasic.SyntaxKind.PartialKeyword: + return SyntaxKind.PartialKeyword; + // unary operators + case VBasic.SyntaxKind.UnaryMinusExpression: + return SyntaxKind.UnaryMinusExpression; + case VBasic.SyntaxKind.UnaryPlusExpression: + return SyntaxKind.UnaryPlusExpression; + case VBasic.SyntaxKind.NotExpression: + return SyntaxKind.LogicalNotExpression; + // binary operators + case VBasic.SyntaxKind.ConcatenateExpression: + case VBasic.SyntaxKind.AddExpression: + return SyntaxKind.AddExpression; + case VBasic.SyntaxKind.SubtractExpression: + return SyntaxKind.SubtractExpression; + case VBasic.SyntaxKind.MultiplyExpression: + return SyntaxKind.MultiplyExpression; + case VBasic.SyntaxKind.DivideExpression: + return SyntaxKind.DivideExpression; + case VBasic.SyntaxKind.AndAlsoExpression: + return SyntaxKind.LogicalAndExpression; + case VBasic.SyntaxKind.OrElseExpression: + return SyntaxKind.LogicalOrExpression; + case VBasic.SyntaxKind.OrExpression: + return SyntaxKind.BitwiseOrExpression; + case VBasic.SyntaxKind.AndExpression: + return SyntaxKind.BitwiseAndExpression; + case VBasic.SyntaxKind.ExclusiveOrExpression: + return SyntaxKind.ExclusiveOrExpression; + case VBasic.SyntaxKind.EqualsExpression: + return SyntaxKind.EqualsExpression; + case VBasic.SyntaxKind.NotEqualsExpression: + return SyntaxKind.NotEqualsExpression; + case VBasic.SyntaxKind.GreaterThanExpression: + return SyntaxKind.GreaterThanExpression; + case VBasic.SyntaxKind.GreaterThanOrEqualExpression: + return SyntaxKind.GreaterThanOrEqualExpression; + case VBasic.SyntaxKind.LessThanExpression: + return SyntaxKind.LessThanExpression; + case VBasic.SyntaxKind.LessThanOrEqualExpression: + return SyntaxKind.LessThanOrEqualExpression; + // assignment + case VBasic.SyntaxKind.SimpleAssignmentStatement: + return SyntaxKind.SimpleAssignmentExpression; + case VBasic.SyntaxKind.AddAssignmentStatement: + return SyntaxKind.AddAssignmentExpression; + case VBasic.SyntaxKind.SubtractAssignmentStatement: + return SyntaxKind.SubtractAssignmentExpression; + case VBasic.SyntaxKind.MultiplyAssignmentStatement: + return SyntaxKind.MultiplyAssignmentExpression; + case VBasic.SyntaxKind.DivideAssignmentStatement: + return SyntaxKind.DivideAssignmentExpression; + // Casts + case VBasic.SyntaxKind.CObjKeyword: + return SyntaxKind.ObjectKeyword; + case VBasic.SyntaxKind.CBoolKeyword: + return SyntaxKind.BoolKeyword; + case VBasic.SyntaxKind.CCharKeyword: + return SyntaxKind.CharKeyword; + case VBasic.SyntaxKind.CSByteKeyword: + return SyntaxKind.SByteKeyword; + case VBasic.SyntaxKind.CByteKeyword: + return SyntaxKind.ByteKeyword; + case VBasic.SyntaxKind.CShortKeyword: + return SyntaxKind.ShortKeyword; + case VBasic.SyntaxKind.CUShortKeyword: + return SyntaxKind.UShortKeyword; + case VBasic.SyntaxKind.CIntKeyword: + return SyntaxKind.IntKeyword; + case VBasic.SyntaxKind.CUIntKeyword: + return SyntaxKind.UIntKeyword; + case VBasic.SyntaxKind.CLngKeyword: + return SyntaxKind.LongKeyword; + case VBasic.SyntaxKind.CULngKeyword: + return SyntaxKind.ULongKeyword; + case VBasic.SyntaxKind.CDecKeyword: + return SyntaxKind.DecimalKeyword; + case VBasic.SyntaxKind.CSngKeyword: + return SyntaxKind.FloatKeyword; + case VBasic.SyntaxKind.CDblKeyword: + return SyntaxKind.DoubleKeyword; + case VBasic.SyntaxKind.CStrKeyword: + return SyntaxKind.StringKeyword; + // + case VBasic.SyntaxKind.AssemblyKeyword: + return SyntaxKind.AssemblyKeyword; + } + throw new NotSupportedException(t + " not supported!"); + } + } +} diff --git a/RefactoringEssentials/RefactoringEssentials.csproj b/RefactoringEssentials/RefactoringEssentials.csproj index ef4a0fa2..54ff0fff 100644 --- a/RefactoringEssentials/RefactoringEssentials.csproj +++ b/RefactoringEssentials/RefactoringEssentials.csproj @@ -62,6 +62,9 @@ + + + diff --git a/RefactoringEssentials/Util/CSharpUtil.cs b/RefactoringEssentials/Util/CSharpUtil.cs index 032006f5..40757970 100644 --- a/RefactoringEssentials/Util/CSharpUtil.cs +++ b/RefactoringEssentials/Util/CSharpUtil.cs @@ -80,11 +80,66 @@ static ExpressionSyntax InvertConditionInternal(ExpressionSyntax condition) return SyntaxFactory.PrefixUnaryExpression(SyntaxKind.LogicalNotExpression, AddParensIfRequired(condition, false)); } - /// - /// When negating an expression this is required, otherwise you would end up with - /// a or b -> !a or b - /// - public static ExpressionSyntax AddParensIfRequired(ExpressionSyntax expression, bool parenthesesRequiredForUnaryExpressions = true) + + public static SyntaxKind GetExpressionOperatorTokenKind(SyntaxKind op) + { + switch (op) + { + case SyntaxKind.EqualsExpression: + return SyntaxKind.EqualsEqualsToken; + case SyntaxKind.NotEqualsExpression: + return SyntaxKind.ExclamationEqualsToken; + case SyntaxKind.GreaterThanExpression: + return SyntaxKind.GreaterThanToken; + case SyntaxKind.GreaterThanOrEqualExpression: + return SyntaxKind.GreaterThanEqualsToken; + case SyntaxKind.LessThanExpression: + return SyntaxKind.LessThanToken; + case SyntaxKind.LessThanOrEqualExpression: + return SyntaxKind.LessThanEqualsToken; + case SyntaxKind.BitwiseOrExpression: + return SyntaxKind.BarToken; + case SyntaxKind.LogicalOrExpression: + return SyntaxKind.BarBarToken; + case SyntaxKind.BitwiseAndExpression: + return SyntaxKind.AmpersandToken; + case SyntaxKind.LogicalAndExpression: + return SyntaxKind.AmpersandAmpersandToken; + case SyntaxKind.AddExpression: + return SyntaxKind.PlusToken; + case SyntaxKind.SubtractExpression: + return SyntaxKind.MinusToken; + case SyntaxKind.MultiplyExpression: + return SyntaxKind.AsteriskToken; + case SyntaxKind.DivideExpression: + return SyntaxKind.SlashToken; + case SyntaxKind.ModuloExpression: + return SyntaxKind.PercentToken; + // assignments + case SyntaxKind.SimpleAssignmentExpression: + return SyntaxKind.EqualsToken; + case SyntaxKind.AddAssignmentExpression: + return SyntaxKind.PlusEqualsToken; + case SyntaxKind.SubtractAssignmentExpression: + return SyntaxKind.MinusEqualsToken; + // unary + case SyntaxKind.UnaryPlusExpression: + return SyntaxKind.PlusToken; + case SyntaxKind.UnaryMinusExpression: + return SyntaxKind.MinusToken; + case SyntaxKind.LogicalNotExpression: + return SyntaxKind.ExclamationToken; + case SyntaxKind.BitwiseNotExpression: + return SyntaxKind.TildeToken; + } + throw new ArgumentOutOfRangeException(nameof(op)); + } + + /// + /// When negating an expression this is required, otherwise you would end up with + /// a or b -> !a or b + /// + public static ExpressionSyntax AddParensIfRequired(ExpressionSyntax expression, bool parenthesesRequiredForUnaryExpressions = true) { if ((expression is BinaryExpressionSyntax) || (expression is AssignmentExpressionSyntax) || From 00516df694256dcfb4c57046b7fb09ef6d89dbe3 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 30 Sep 2016 20:26:26 +0200 Subject: [PATCH 010/236] Add VB->C# option to web interface --- .../Controllers/ConverterController.cs | 21 ++++++++++++------- CodeConverterWebApp/Views/Home/Index.cshtml | 8 +++---- .../Converter/CodeConverter.cs | 15 ++++++++++--- .../Converter/ConversionResult.cs | 2 +- 4 files changed, 31 insertions(+), 15 deletions(-) diff --git a/CodeConverterWebApp/Controllers/ConverterController.cs b/CodeConverterWebApp/Controllers/ConverterController.cs index fb9c9af9..38306083 100644 --- a/CodeConverterWebApp/Controllers/ConverterController.cs +++ b/CodeConverterWebApp/Controllers/ConverterController.cs @@ -49,17 +49,24 @@ public IHttpActionResult Post([FromBody]ConvertRequest todo) string ParseLanguage(string language) { - if ("cs".Equals(language, StringComparison.OrdinalIgnoreCase)) + if (language == null) + throw new ArgumentNullException(nameof(language)); + if (language.StartsWith("cs", StringComparison.OrdinalIgnoreCase)) return "C#"; - return "Visual Basic"; + if (language.StartsWith("vb", StringComparison.OrdinalIgnoreCase)) + return "Visual Basic"; + throw new ArgumentException($"{language} not supported!"); } int GetDefaultVersionForLanguage(string language) { - if ("cs".Equals(language, StringComparison.OrdinalIgnoreCase)) - return 6; - // Visual Basic - return 14; - } + if (language == null) + throw new ArgumentNullException(nameof(language)); + if (language.StartsWith("cs", StringComparison.OrdinalIgnoreCase)) + return 6; + if (language.StartsWith("vb", StringComparison.OrdinalIgnoreCase)) + return 14; + throw new ArgumentException($"{language} not supported!"); + } } } diff --git a/CodeConverterWebApp/Views/Home/Index.cshtml b/CodeConverterWebApp/Views/Home/Index.cshtml index 9fe3b36b..3a24bbe0 100644 --- a/CodeConverterWebApp/Views/Home/Index.cshtml +++ b/CodeConverterWebApp/Views/Home/Index.cshtml @@ -20,10 +20,10 @@ C# to VB.NET - @*  
@@ -33,7 +33,7 @@ -

Error message: {{errorMessageOnResponse}}

+

Error message:
{{errorMessageOnResponse}}

diff --git a/RefactoringEssentials/Converter/CodeConverter.cs b/RefactoringEssentials/Converter/CodeConverter.cs index 9735faa4..3ddbcfec 100644 --- a/RefactoringEssentials/Converter/CodeConverter.cs +++ b/RefactoringEssentials/Converter/CodeConverter.cs @@ -1,5 +1,6 @@ using System; using ConvVB = RefactoringEssentials.VB.Converter; +using ConvCS = RefactoringEssentials.CSharp.Converter; namespace RefactoringEssentials.Converter { @@ -23,18 +24,26 @@ public static ConversionResult Convert(CodeWithOptions code) return ConvVB.CSharpConverter.ConvertText(code.Text, code.References); } break; - } + case "Visual Basic": + switch (code.ToLanguage) + { + case "C#": + return ConvCS.VisualBasicConverter.ConvertText(code.Text, code.References); + } + break; + + } return new ConversionResult(new NotSupportedException($"Converting from {code.FromLanguage} {code.FromLanguageVersion} to {code.ToLanguage} {code.ToLanguageVersion} is not supported!")); } static bool IsSupportedTarget(string toLanguage, int toLanguageVersion) { - return toLanguage == "Visual Basic" && toLanguageVersion == 14; + return (toLanguage == "Visual Basic" && toLanguageVersion == 14) || (toLanguage == "C#" && toLanguageVersion == 6); } static bool IsSupportedSource(string fromLanguage, int fromLanguageVersion) { - return fromLanguage == "C#" && fromLanguageVersion == 6; + return (fromLanguage == "C#" && fromLanguageVersion == 6) || (fromLanguage == "Visual Basic" && fromLanguageVersion == 14); } } } diff --git a/RefactoringEssentials/Converter/ConversionResult.cs b/RefactoringEssentials/Converter/ConversionResult.cs index aa7f84c4..0b9f166b 100644 --- a/RefactoringEssentials/Converter/ConversionResult.cs +++ b/RefactoringEssentials/Converter/ConversionResult.cs @@ -32,7 +32,7 @@ public string GetExceptionsAsString() var builder = new StringBuilder(); for (int i = 0; i < Exceptions.Count; i++) { - builder.AppendFormat("----- Exception {0} of {1} -----\r\n", i + 1, Exceptions.Count); + builder.AppendFormat("----- Exception {0} of {1} -----" + Environment.NewLine, i + 1, Exceptions.Count); builder.AppendLine(Exceptions[i].ToString()); } return builder.ToString(); From 046cc852fa2e77f9bd99417ee3f2b487fdbc0fcb Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 30 Sep 2016 20:27:06 +0200 Subject: [PATCH 011/236] Fix bug in C#->VB converter --- .../VB/Converter/CSharpConverter.cs | 18 ++++---- .../VB/Converter/NodesVisitor.cs | 42 ++++++------------- 2 files changed, 22 insertions(+), 38 deletions(-) diff --git a/RefactoringEssentials/VB/Converter/CSharpConverter.cs b/RefactoringEssentials/VB/Converter/CSharpConverter.cs index e62e1bc9..926a5367 100644 --- a/RefactoringEssentials/VB/Converter/CSharpConverter.cs +++ b/RefactoringEssentials/VB/Converter/CSharpConverter.cs @@ -155,17 +155,17 @@ static ModifiedIdentifierSyntax ExtractIdentifier(CSS.VariableDeclaratorSyntax v return SyntaxFactory.ModifiedIdentifier(ConvertIdentifier(v.Identifier)); } - static SyntaxToken ConvertIdentifier(SyntaxToken t) - { - return SyntaxFactory.Identifier(t.ValueText, SyntaxFacts.IsKeywordKind(t.Kind()), t.GetIdentifierText(), TypeCharacter.None); - } + static SyntaxToken ConvertIdentifier(SyntaxToken id) + { + var keywordKind = SyntaxFacts.GetKeywordKind(id.ValueText); + if (keywordKind != SyntaxKind.None && !SyntaxFacts.IsPredefinedType(keywordKind)) + return SyntaxFactory.Identifier("[" + id.ValueText + "]"); + return SyntaxFactory.Identifier(id.ValueText); + } - static ExpressionSyntax Literal(object o) - { - return ComputeConstantValueCodeRefactoringProvider.GetLiteralExpression(o); - } + static ExpressionSyntax Literal(object o) => ComputeConstantValueCodeRefactoringProvider.GetLiteralExpression(o); - static SyntaxKind ConvertToken(CS.SyntaxKind t, TokenContext context = TokenContext.Global) + static SyntaxKind ConvertToken(CS.SyntaxKind t, TokenContext context = TokenContext.Global) { switch (t) { diff --git a/RefactoringEssentials/VB/Converter/NodesVisitor.cs b/RefactoringEssentials/VB/Converter/NodesVisitor.cs index 5d7e4852..512f0d32 100644 --- a/RefactoringEssentials/VB/Converter/NodesVisitor.cs +++ b/RefactoringEssentials/VB/Converter/NodesVisitor.cs @@ -161,10 +161,6 @@ public override VisualBasicSyntaxNode VisitNamespaceDeclaration(CSS.NamespaceDec @extern.Accept(this); var members = node.Members.Select(m => (StatementSyntax)m.Accept(this)); - IList names; - if (!node.Name.TryGetNameParts(out names)) - throw new NotSupportedException(); - return SyntaxFactory.NamespaceBlock( SyntaxFactory.NamespaceStatement((NameSyntax)node.Name.Accept(this)), SyntaxFactory.List(members) @@ -919,12 +915,12 @@ public override VisualBasicSyntaxNode VisitConditionalAccessExpression(CSS.Condi public override VisualBasicSyntaxNode VisitMemberAccessExpression(CSS.MemberAccessExpressionSyntax node) { - return SyntaxFactory.MemberAccessExpression( + return WrapTypedNameIfNecessary(SyntaxFactory.MemberAccessExpression( SyntaxKind.SimpleMemberAccessExpression, (ExpressionSyntax)node.Expression.Accept(this), SyntaxFactory.Token(SyntaxKind.DotToken), (SimpleNameSyntax)node.Name.Accept(this) - ); + ), node); } public override VisualBasicSyntaxNode VisitImplicitElementAccess(CSS.ImplicitElementAccessSyntax node) @@ -1135,13 +1131,9 @@ public override VisualBasicSyntaxNode VisitImplicitArrayCreationExpression(CSS.I ExpressionSyntax ReduceArrayUpperBoundExpression(ExpressionSyntax expr) { - if (expr.IsKind(SyntaxKind.NumericLiteralExpression)) - { - var numericLiteral = expr as LiteralExpressionSyntax; - int? upperBound = numericLiteral.Token.Value as int?; - if (upperBound.HasValue) - return SyntaxFactory.NumericLiteralExpression(SyntaxFactory.Literal(upperBound.Value - 1)); - } + var constant = semanticModel.GetConstantValue(expr); + if (constant.HasValue && constant.Value is int) + return SyntaxFactory.NumericLiteralExpression(SyntaxFactory.Literal((int)constant.Value - 1)); return SyntaxFactory.BinaryExpression( SyntaxKind.SubtractExpression, @@ -1428,7 +1420,7 @@ public override VisualBasicSyntaxNode VisitClassOrStructConstraint(CSS.ClassOrSt public override VisualBasicSyntaxNode VisitTypeConstraint(CSS.TypeConstraintSyntax node) { - return SyntaxFactory.TypeConstraint((TypeSyntax)node.Accept(this)); + return SyntaxFactory.TypeConstraint((TypeSyntax)node.Type.Accept(this)); } public override VisualBasicSyntaxNode VisitConstructorConstraint(CSS.ConstructorConstraintSyntax node) @@ -1504,14 +1496,6 @@ public override VisualBasicSyntaxNode VisitOmittedTypeArgument(CSS.OmittedTypeAr #region NameSyntax - SyntaxToken ConvertIdentifier(SyntaxToken id) - { - var keywordKind = SyntaxFacts.GetKeywordKind(id.ValueText); - if (keywordKind != SyntaxKind.None && !SyntaxFacts.IsPredefinedType(keywordKind)) - return SyntaxFactory.Identifier("[" + id.ValueText + "]"); - return SyntaxFactory.Identifier(id.ValueText); - } - public override VisualBasicSyntaxNode VisitIdentifierName(CSS.IdentifierNameSyntax node) { return WrapTypedNameIfNecessary(SyntaxFactory.IdentifierName(ConvertIdentifier(node.Identifier)), node); @@ -1537,18 +1521,18 @@ public override VisualBasicSyntaxNode VisitTypeArgumentList(CSS.TypeArgumentList return SyntaxFactory.TypeArgumentList(SyntaxFactory.SeparatedList(node.Arguments.Select(a => (TypeSyntax)a.Accept(this)))); } - VisualBasicSyntaxNode WrapTypedNameIfNecessary(NameSyntax name, CSS.NameSyntax originalName) + VisualBasicSyntaxNode WrapTypedNameIfNecessary(ExpressionSyntax name, CSS.ExpressionSyntax originalName) { - if (originalName.Parent is CSS.NameSyntax || originalName.Parent is CSS.AttributeSyntax) return name; - CSS.ExpressionSyntax parent = originalName; - while (parent.Parent is CSS.MemberAccessExpressionSyntax || parent.Parent is CSS.MemberBindingExpressionSyntax) - parent = (CSS.ExpressionSyntax)parent.Parent; - if (parent != null && parent.Parent is CSS.InvocationExpressionSyntax) + if (originalName.Parent is CSS.NameSyntax || originalName.Parent is CSS.AttributeSyntax || originalName.Parent is CSS.MemberAccessExpressionSyntax || originalName.Parent is CSS.MemberBindingExpressionSyntax) return name; + if (originalName != null && originalName.Parent is CSS.InvocationExpressionSyntax) return name; - var symbol = semanticModel.GetSymbolInfo(originalName).Symbol; + var symbolInfo = semanticModel.GetSymbolInfo(originalName); + var symbol = symbolInfo.Symbol ?? symbolInfo.CandidateSymbols.FirstOrDefault(); if (symbol.IsKind(SymbolKind.Method)) return SyntaxFactory.AddressOfExpression(name); + + return name; } From 09a20bc6a9e6922e3f83fa3a4d0a11eb68f411b4 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 2 Oct 2016 18:39:47 +0200 Subject: [PATCH 012/236] implemented a few more expressions and missing statements/constructs (see converter.txt for any missing items) --- .../CSharp/Converter/MethodBodyVisitor.cs | 99 ++++++- .../CSharp/Converter/NodesVisitor.cs | 244 +++++++++++++++--- .../CSharp/Converter/VisualBasicConverter.cs | 3 + .../Util/SyntaxTokenExtensions.cs | 30 ++- converter.txt | 14 +- 5 files changed, 342 insertions(+), 48 deletions(-) diff --git a/RefactoringEssentials/CSharp/Converter/MethodBodyVisitor.cs b/RefactoringEssentials/CSharp/Converter/MethodBodyVisitor.cs index 6c1ca2f7..53a26565 100644 --- a/RefactoringEssentials/CSharp/Converter/MethodBodyVisitor.cs +++ b/RefactoringEssentials/CSharp/Converter/MethodBodyVisitor.cs @@ -32,7 +32,7 @@ public override SyntaxList DefaultVisit(SyntaxNode node) public override SyntaxList VisitLocalDeclarationStatement(VBSyntax.LocalDeclarationStatementSyntax node) { - var modifiers = ConvertModifiers(node.Modifiers); + var modifiers = ConvertModifiers(node.Modifiers, TokenContext.Local); var declarations = new List(); @@ -69,6 +69,35 @@ public override SyntaxList VisitYieldStatement(VBSyntax.YieldSt return SingleStatement(SyntaxFactory.YieldStatement(SyntaxKind.YieldReturnStatement, (ExpressionSyntax)node.Expression?.Accept(nodesVisitor))); } + public override SyntaxList VisitExitStatement(VBSyntax.ExitStatementSyntax node) + { + switch (VBasic.VisualBasicExtensions.Kind(node.BlockKeyword)) + { + case VBasic.SyntaxKind.SubKeyword: + return SingleStatement(SyntaxFactory.ReturnStatement()); + case VBasic.SyntaxKind.FunctionKeyword: + VBasic.VisualBasicSyntaxNode typeContainer = (VBasic.VisualBasicSyntaxNode)node.Ancestors().OfType().FirstOrDefault() + ?? node.Ancestors().OfType().FirstOrDefault(); + var info = typeContainer.TypeSwitch( + (VBSyntax.LambdaExpressionSyntax e) => semanticModel.GetTypeInfo(e).Type.GetReturnType(), + (VBSyntax.MethodBlockSyntax e) => { + var type = (TypeSyntax)e.SubOrFunctionStatement.AsClause?.Type.Accept(nodesVisitor) ?? SyntaxFactory.ParseTypeName("object"); + return semanticModel.GetSymbolInfo(type).Symbol.GetReturnType(); + } + ); + ExpressionSyntax expr; + if (info.IsReferenceType) + expr = SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression); + else if (info.CanBeReferencedByName) + expr = SyntaxFactory.DefaultExpression(SyntaxFactory.ParseTypeName(info.ToMinimalDisplayString(semanticModel, node.SpanStart))); + else + throw new NotSupportedException(); + return SingleStatement(SyntaxFactory.ReturnStatement(expr)); + default: + throw new NotImplementedException(); + } + } + public override SyntaxList VisitSingleLineIfStatement(VBSyntax.SingleLineIfStatementSyntax node) { var condition = (ExpressionSyntax)node.Condition.Accept(nodesVisitor); @@ -78,9 +107,9 @@ public override SyntaxList VisitSingleLineIfStatement(VBSyntax. if (node.ElseClause != null) { var elseBlock = SyntaxFactory.Block(node.ElseClause.Statements.SelectMany(s => s.Accept(this))); - elseClause = SyntaxFactory.ElseClause(elseBlock); + elseClause = SyntaxFactory.ElseClause(elseBlock.Statements.Count == 1 ? elseBlock.Statements[0] : elseBlock); } - return SingleStatement(SyntaxFactory.IfStatement(condition, block, elseClause)); + return SingleStatement(SyntaxFactory.IfStatement(condition, block.Statements.Count == 1 ? block.Statements[0] : block, elseClause)); } public override SyntaxList VisitMultiLineIfBlock(VBSyntax.MultiLineIfBlockSyntax node) @@ -207,7 +236,14 @@ private bool ConvertToSwitch(ExpressionSyntax expr, SyntaxList VisitTryBlock(VBSyntax.TryBlockSyntax node) { - return base.VisitTryBlock(node); + var block = SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))); + return SingleStatement( + SyntaxFactory.TryStatement( + block, + SyntaxFactory.List(node.CatchBlocks.Select(c => (CatchClauseSyntax)c.Accept(nodesVisitor))), + (FinallyClauseSyntax)node.FinallyBlock?.Accept(nodesVisitor) + ) + ); } public override SyntaxList VisitSyncLockBlock(VBSyntax.SyncLockBlockSyntax node) @@ -218,6 +254,61 @@ public override SyntaxList VisitSyncLockBlock(VBSyntax.SyncLock )); } + public override SyntaxList VisitUsingBlock(VBSyntax.UsingBlockSyntax node) + { + if (node.UsingStatement.Expression == null) { + StatementSyntax stmt = SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))); + foreach (var v in node.UsingStatement.Variables.Reverse()) + foreach (var declaration in SplitVariableDeclarations(v, nodesVisitor, semanticModel).Values.Reverse()) + stmt = SyntaxFactory.UsingStatement(declaration, null, stmt); + return SingleStatement(stmt); + } else { + var expr = (ExpressionSyntax)node.UsingStatement.Expression.Accept(nodesVisitor); + return SingleStatement(SyntaxFactory.UsingStatement(null, expr, SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))))); + } + } + + public override SyntaxList VisitWhileBlock(VBSyntax.WhileBlockSyntax node) + { + return SingleStatement(SyntaxFactory.WhileStatement( + (ExpressionSyntax)node.WhileStatement.Condition.Accept(nodesVisitor), + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))) + )); + } + + public override SyntaxList VisitDoLoopBlock(VBSyntax.DoLoopBlockSyntax node) + { + if (node.DoStatement.WhileOrUntilClause != null) + { + var stmt = node.DoStatement.WhileOrUntilClause; + if (stmt.WhileOrUntilKeyword.IsKind(VBasic.SyntaxKind.WhileKeyword)) + return SingleStatement(SyntaxFactory.WhileStatement( + (ExpressionSyntax)stmt.Condition.Accept(nodesVisitor), + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))) + )); + else + return SingleStatement(SyntaxFactory.WhileStatement( + SyntaxFactory.PrefixUnaryExpression(SyntaxKind.LogicalNotExpression, (ExpressionSyntax)stmt.Condition.Accept(nodesVisitor)), + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))) + )); + } + if (node.LoopStatement.WhileOrUntilClause != null) + { + var stmt = node.LoopStatement.WhileOrUntilClause; + if (stmt.WhileOrUntilKeyword.IsKind(VBasic.SyntaxKind.WhileKeyword)) + return SingleStatement(SyntaxFactory.DoStatement( + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))), + (ExpressionSyntax)stmt.Condition.Accept(nodesVisitor) + )); + else + return SingleStatement(SyntaxFactory.DoStatement( + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))), + SyntaxFactory.PrefixUnaryExpression(SyntaxKind.LogicalNotExpression, (ExpressionSyntax)stmt.Condition.Accept(nodesVisitor)) + )); + } + throw new NotSupportedException(); + } + SyntaxList SingleStatement(StatementSyntax statement) { return SyntaxFactory.SingletonList(statement); diff --git a/RefactoringEssentials/CSharp/Converter/NodesVisitor.cs b/RefactoringEssentials/CSharp/Converter/NodesVisitor.cs index 518ec574..cd15749a 100644 --- a/RefactoringEssentials/CSharp/Converter/NodesVisitor.cs +++ b/RefactoringEssentials/CSharp/Converter/NodesVisitor.cs @@ -19,7 +19,7 @@ class NodesVisitor : VBasic.VisualBasicSyntaxVisitor SemanticModel semanticModel; Document targetDocument; CSharpCompilationOptions options; - readonly Dictionary additionalFieldDeclarations = new Dictionary(); + readonly Dictionary additionalDeclarations = new Dictionary(); public NodesVisitor(SemanticModel semanticModel, Document targetDocument) { @@ -55,9 +55,11 @@ public override CSharpSyntaxNode VisitCompilationUnit(VBSyntax.CompilationUnitSy var attributes = SyntaxFactory.List(node.Attributes.SelectMany(a => a.AttributeLists).SelectMany(ConvertAttribute)); var members = SyntaxFactory.List(node.Members.Select(m => (MemberDeclarationSyntax)m.Accept(this))); + var options = (VBasic.VisualBasicCompilationOptions)semanticModel.Compilation.Options; + return SyntaxFactory.CompilationUnit( SyntaxFactory.List(), - SyntaxFactory.List(node.Imports.SelectMany(imp => imp.ImportsClauses).Select(c => (UsingDirectiveSyntax)c.Accept(this))), + SyntaxFactory.List(options.GlobalImports.Select(gi => gi.Clause).Concat(node.Imports.SelectMany(imp => imp.ImportsClauses)).Select(c => (UsingDirectiveSyntax)c.Accept(this))), attributes, members ); @@ -90,12 +92,12 @@ IEnumerable ConvertMembers(SyntaxList (MemberDeclarationSyntax)m.Accept(this))) { - BaseFieldDeclarationSyntax[] declarations; - if (member is BaseFieldDeclarationSyntax && additionalFieldDeclarations.TryGetValue((BaseFieldDeclarationSyntax)member, out declarations)) + MemberDeclarationSyntax[] declarations; + if (member is BaseFieldDeclarationSyntax && additionalDeclarations.TryGetValue(member, out declarations)) { foreach (var d in declarations) yield return d; - additionalFieldDeclarations.Remove((BaseFieldDeclarationSyntax)member); + additionalDeclarations.Remove(member); } else { @@ -147,7 +149,7 @@ public override CSharpSyntaxNode VisitModuleBlock(VBSyntax.ModuleBlockSyntax nod return SyntaxFactory.ClassDeclaration( attributes, - ConvertModifiers(stmt.Modifiers).Add(SyntaxFactory.Token(SyntaxKind.StaticKeyword)), + ConvertModifiers(stmt.Modifiers, TokenContext.InterfaceOrModule).Add(SyntaxFactory.Token(SyntaxKind.StaticKeyword)), ConvertIdentifier(stmt.Identifier, semanticModel), parameters, ConvertInheritsAndImplements(node.Inherits, node.Implements), @@ -168,7 +170,7 @@ public override CSharpSyntaxNode VisitStructureBlock(VBSyntax.StructureBlockSynt return SyntaxFactory.StructDeclaration( attributes, - ConvertModifiers(stmt.Modifiers), + ConvertModifiers(stmt.Modifiers, TokenContext.Global), ConvertIdentifier(stmt.Identifier, semanticModel), parameters, ConvertInheritsAndImplements(node.Inherits, node.Implements), @@ -189,7 +191,7 @@ public override CSharpSyntaxNode VisitInterfaceBlock(VBSyntax.InterfaceBlockSynt return SyntaxFactory.InterfaceDeclaration( attributes, - ConvertModifiers(stmt.Modifiers), + ConvertModifiers(stmt.Modifiers, TokenContext.InterfaceOrModule), ConvertIdentifier(stmt.Identifier, semanticModel), parameters, ConvertInheritsAndImplements(node.Inherits, node.Implements), @@ -221,7 +223,7 @@ public override CSharpSyntaxNode VisitEnumBlock(VBSyntax.EnumBlockSyntax node) var members = SyntaxFactory.SeparatedList(node.Members.Select(m => (EnumMemberDeclarationSyntax)m.Accept(this))); return SyntaxFactory.EnumDeclaration( SyntaxFactory.List(attributes), - ConvertModifiers(stmt.Modifiers), + ConvertModifiers(stmt.Modifiers, TokenContext.Global), ConvertIdentifier(stmt.Identifier, semanticModel), baseList, members @@ -268,7 +270,7 @@ public override CSharpSyntaxNode VisitDelegateStatement(VBSyntax.DelegateStateme return SyntaxFactory.DelegateDeclaration( SyntaxFactory.List(attributes), - ConvertModifiers(node.Modifiers), + ConvertModifiers(node.Modifiers, TokenContext.Global), returnType, ConvertIdentifier(node.Identifier, semanticModel), typeParameters, @@ -284,7 +286,7 @@ public override CSharpSyntaxNode VisitDelegateStatement(VBSyntax.DelegateStateme public override CSharpSyntaxNode VisitFieldDeclaration(VBSyntax.FieldDeclarationSyntax node) { var attributes = node.AttributeLists.SelectMany(ConvertAttribute); - var modifiers = ConvertModifiers(node.Modifiers); + var modifiers = ConvertModifiers(node.Modifiers, TokenContext.VariableOrConst); var key = SyntaxFactory.FieldDeclaration(SyntaxFactory.VariableDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword)))); var declarations = new List(node.Declarators.Count); @@ -300,50 +302,170 @@ public override CSharpSyntaxNode VisitFieldDeclaration(VBSyntax.FieldDeclaration } } - additionalFieldDeclarations.Add(key, declarations.ToArray()); + additionalDeclarations.Add(key, declarations.ToArray()); return key; } public override CSharpSyntaxNode VisitPropertyBlock(VBSyntax.PropertyBlockSyntax node) { - return base.VisitPropertyBlock(node); + var block = node.PropertyStatement; + var attributes = block.AttributeLists.SelectMany(ConvertAttribute); + var modifiers = ConvertModifiers(block.Modifiers, TokenContext.Member); + + var isIndexer = block.Modifiers.Any(m => m.IsKind(VBasic.SyntaxKind.DefaultKeyword)) && block.Identifier.ValueText.Equals("Items", StringComparison.OrdinalIgnoreCase); + + var rawType = (TypeSyntax)block.AsClause?.TypeSwitch( + (VBSyntax.SimpleAsClauseSyntax c) => c.Type, + (VBSyntax.AsNewClauseSyntax c) => VBasic.SyntaxExtensions.Type(c.NewExpression), + _ => { throw new NotImplementedException($"{_.GetType().FullName} not implemented!"); } + )?.Accept(this) ?? SyntaxFactory.ParseTypeName("var"); + + if (isIndexer) + return SyntaxFactory.IndexerDeclaration( + SyntaxFactory.List(attributes), + modifiers, + rawType, + null, + SyntaxFactory.BracketedParameterList(SyntaxFactory.SeparatedList(block.ParameterList.Parameters.Select(p => (ParameterSyntax)p.Accept(this)))), + SyntaxFactory.AccessorList(SyntaxFactory.List(node.Accessors.Select(a => (AccessorDeclarationSyntax)a.Accept(this)))) + ); + else + return SyntaxFactory.PropertyDeclaration( + SyntaxFactory.List(attributes), + modifiers, + rawType, + null, + ConvertIdentifier(block.Identifier, semanticModel), + SyntaxFactory.AccessorList(SyntaxFactory.List(node.Accessors.Select(a => (AccessorDeclarationSyntax)a.Accept(this)))), + null, + null); + } + + public override CSharpSyntaxNode VisitAccessorBlock(VBSyntax.AccessorBlockSyntax node) + { + SyntaxKind blockKind; + var body = SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(new MethodBodyVisitor(semanticModel, this)))); + var attributes = SyntaxFactory.List(node.AccessorStatement.AttributeLists.Select(a => (AttributeListSyntax)a.Accept(this))); + var modifiers = ConvertModifiers(node.AccessorStatement.Modifiers, TokenContext.Member); + + switch (node.Kind()) + { + case VBasic.SyntaxKind.GetAccessorBlock: + blockKind = SyntaxKind.GetAccessorDeclaration; + break; + case VBasic.SyntaxKind.SetAccessorBlock: + blockKind = SyntaxKind.SetAccessorDeclaration; + break; + case VBasic.SyntaxKind.AddHandlerAccessorBlock: + blockKind = SyntaxKind.AddAccessorDeclaration; + break; + case VBasic.SyntaxKind.RemoveHandlerAccessorBlock: + blockKind = SyntaxKind.RemoveAccessorDeclaration; + break; + default: + throw new NotSupportedException(); + } + return SyntaxFactory.AccessorDeclaration(blockKind, attributes, modifiers, body); } public override CSharpSyntaxNode VisitMethodBlock(VBSyntax.MethodBlockSyntax node) { var block = node.SubOrFunctionStatement; var attributes = block.AttributeLists.SelectMany(ConvertAttribute); - var modifiers = ConvertModifiers(block.Modifiers); - - return SyntaxFactory.MethodDeclaration( + + if ("Finalize".Equals(block.Identifier.ValueText, StringComparison.OrdinalIgnoreCase) + && block.Modifiers.Any(m => VBasic.VisualBasicExtensions.Kind(m) == VBasic.SyntaxKind.OverridesKeyword)) { + return SyntaxFactory.DestructorDeclaration( + SyntaxFactory.List(attributes), + SyntaxFactory.TokenList(), + ConvertIdentifier(node.GetAncestor().BlockStatement.Identifier, semanticModel), + SyntaxFactory.ParameterList(), + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(new MethodBodyVisitor(semanticModel, this)))) + ); + } else { + var modifiers = ConvertModifiers(block.Modifiers, TokenContext.Member); + + return SyntaxFactory.MethodDeclaration( + SyntaxFactory.List(attributes), + modifiers, + (TypeSyntax)block.AsClause?.Type.Accept(this) ?? SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword)), + null, + ConvertIdentifier(block.Identifier, semanticModel), + null, + (ParameterListSyntax)block.ParameterList.Accept(this), + SyntaxFactory.List(), + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(new MethodBodyVisitor(semanticModel, this)))), + null + ); + } + } + + public override CSharpSyntaxNode VisitEventBlock(VBSyntax.EventBlockSyntax node) + { + var block = node.EventStatement; + var attributes = block.AttributeLists.SelectMany(ConvertAttribute); + var modifiers = ConvertModifiers(block.Modifiers, TokenContext.Member); + + var rawType = (TypeSyntax)block.AsClause?.Type.Accept(this) ?? SyntaxFactory.ParseTypeName("var"); + + return SyntaxFactory.EventDeclaration( SyntaxFactory.List(attributes), modifiers, - (TypeSyntax)block.AsClause?.Type.Accept(this) ?? SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword)), + rawType, null, ConvertIdentifier(block.Identifier, semanticModel), - null, - (ParameterListSyntax)block.ParameterList.Accept(this), - SyntaxFactory.List(), - SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(new MethodBodyVisitor(semanticModel, this)))), - null + SyntaxFactory.AccessorList(SyntaxFactory.List(node.Accessors.Select(a => (AccessorDeclarationSyntax)a.Accept(this)))) ); } - public override CSharpSyntaxNode VisitEventBlock(VBSyntax.EventBlockSyntax node) - { - return base.VisitEventBlock(node); - } - public override CSharpSyntaxNode VisitEventStatement(VBSyntax.EventStatementSyntax node) { - return base.VisitEventStatement(node); + var attributes = node.AttributeLists.SelectMany(ConvertAttribute); + var modifiers = ConvertModifiers(node.Modifiers, TokenContext.Member); + var id = ConvertIdentifier(node.Identifier, semanticModel); + + if (node.AsClause == null) + { + var key = SyntaxFactory.EventFieldDeclaration(SyntaxFactory.VariableDeclaration(SyntaxFactory.ParseTypeName("__event" + id.ValueText))); + var delegateName = SyntaxFactory.Identifier(id.ValueText + "EventHandler"); + + var delegateDecl = SyntaxFactory.DelegateDeclaration( + SyntaxFactory.List(), + modifiers, + SyntaxFactory.ParseTypeName("void"), + delegateName, + null, + (ParameterListSyntax)node.ParameterList.Accept(this), + SyntaxFactory.List() + ); + + var eventDecl = SyntaxFactory.EventFieldDeclaration( + SyntaxFactory.List(attributes), + modifiers, + SyntaxFactory.VariableDeclaration(SyntaxFactory.IdentifierName(delegateName), + SyntaxFactory.SingletonSeparatedList(SyntaxFactory.VariableDeclarator(id))) + ); + + additionalDeclarations.Add(key, new MemberDeclarationSyntax[] { eventDecl, delegateDecl }); + return key; + } + else + { + return SyntaxFactory.EventFieldDeclaration( + SyntaxFactory.List(attributes), + modifiers, + SyntaxFactory.VariableDeclaration((TypeSyntax)node.AsClause.Type.Accept(this), + SyntaxFactory.SingletonSeparatedList(SyntaxFactory.VariableDeclarator(id))) + ); + } + throw new NotSupportedException(); } public override CSharpSyntaxNode VisitOperatorBlock(VBSyntax.OperatorBlockSyntax node) { var block = node.OperatorStatement; var attributes = block.AttributeLists.SelectMany(ConvertAttribute); - var modifiers = ConvertModifiers(block.Modifiers); + var modifiers = ConvertModifiers(block.Modifiers, TokenContext.Member); return SyntaxFactory.OperatorDeclaration( SyntaxFactory.List(attributes), modifiers, @@ -359,14 +481,36 @@ public override CSharpSyntaxNode VisitConstructorBlock(VBSyntax.ConstructorBlock { var block = node.BlockStatement; var attributes = block.AttributeLists.SelectMany(ConvertAttribute); - var modifiers = ConvertModifiers(block.Modifiers); + var modifiers = ConvertModifiers(block.Modifiers, TokenContext.Member); + + + var ctor = (node.Statements.FirstOrDefault() as VBSyntax.ExpressionStatementSyntax)?.Expression as VBSyntax.InvocationExpressionSyntax; + var ctorExpression = ctor?.Expression as VBSyntax.MemberAccessExpressionSyntax; + var ctorArgs = (ArgumentListSyntax)ctor?.ArgumentList.Accept(this); + + IEnumerable statements; + ConstructorInitializerSyntax ctorCall; + if (ctorExpression == null || !ctorExpression.Name.Identifier.IsKindOrHasMatchingText(VBasic.SyntaxKind.NewKeyword)) { + statements = node.Statements; + ctorCall = null; + } else if (ctorExpression.Expression is VBSyntax.MyBaseExpressionSyntax) { + statements = node.Statements.Skip(1); + ctorCall = SyntaxFactory.ConstructorInitializer(SyntaxKind.BaseConstructorInitializer, ctorArgs ?? SyntaxFactory.ArgumentList()); + } else if (ctorExpression.Expression is VBSyntax.MeExpressionSyntax || ctorExpression.Expression is VBSyntax.MyClassExpressionSyntax) { + statements = node.Statements.Skip(1); + ctorCall = SyntaxFactory.ConstructorInitializer(SyntaxKind.ThisConstructorInitializer, ctorArgs ?? SyntaxFactory.ArgumentList()); + } else { + statements = node.Statements; + ctorCall = null; + } + return SyntaxFactory.ConstructorDeclaration( SyntaxFactory.List(attributes), modifiers, ConvertIdentifier(node.GetAncestor().BlockStatement.Identifier, semanticModel), (ParameterListSyntax)block.ParameterList.Accept(this), - null, - SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(new MethodBodyVisitor(semanticModel, this)))) + ctorCall, + SyntaxFactory.Block(statements.SelectMany(s => s.Accept(new MethodBodyVisitor(semanticModel, this)))) ); } @@ -402,7 +546,7 @@ public override CSharpSyntaxNode VisitParameter(VBSyntax.ParameterSyntax node) } var attributes = node.AttributeLists.SelectMany(ConvertAttribute).ToList(); int outAttributeIndex = attributes.FindIndex(a => a.Attributes.Single().Name.ToString() == "Out"); - var modifiers = ConvertModifiers(node.Modifiers); + var modifiers = ConvertModifiers(node.Modifiers, TokenContext.Local); if (outAttributeIndex > -1) { attributes.RemoveAt(outAttributeIndex); modifiers = modifiers.Replace(SyntaxFactory.Token(SyntaxKind.RefKeyword), SyntaxFactory.Token(SyntaxKind.OutKeyword)); @@ -420,6 +564,40 @@ public override CSharpSyntaxNode VisitParameter(VBSyntax.ParameterSyntax node) #region Expressions + public override CSharpSyntaxNode VisitCatchBlock(VBSyntax.CatchBlockSyntax node) + { + var stmt = node.CatchStatement; + CatchDeclarationSyntax catcher; + if (stmt.IdentifierName == null) + catcher = null; + else + { + var typeInfo = semanticModel.GetTypeInfo(stmt.IdentifierName).Type; + catcher = SyntaxFactory.CatchDeclaration( + SyntaxFactory.ParseTypeName(typeInfo.ToMinimalDisplayString(semanticModel, node.SpanStart)), + ConvertIdentifier(stmt.IdentifierName.Identifier, semanticModel) + ); + } + + var filter = (CatchFilterClauseSyntax)stmt.WhenClause?.Accept(this); + + return SyntaxFactory.CatchClause( + catcher, + filter, + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(new MethodBodyVisitor(semanticModel, this)))) + ); + } + + public override CSharpSyntaxNode VisitCatchFilterClause(VBSyntax.CatchFilterClauseSyntax node) + { + return SyntaxFactory.CatchFilterClause((ExpressionSyntax)node.Filter.Accept(this)); + } + + public override CSharpSyntaxNode VisitFinallyBlock(VBSyntax.FinallyBlockSyntax node) + { + return SyntaxFactory.FinallyClause(SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(new MethodBodyVisitor(semanticModel, this))))); + } + public override CSharpSyntaxNode VisitCTypeExpression(VBSyntax.CTypeExpressionSyntax node) { return SyntaxFactory.CastExpression( diff --git a/RefactoringEssentials/CSharp/Converter/VisualBasicConverter.cs b/RefactoringEssentials/CSharp/Converter/VisualBasicConverter.cs index 18f0a855..087af0cc 100644 --- a/RefactoringEssentials/CSharp/Converter/VisualBasicConverter.cs +++ b/RefactoringEssentials/CSharp/Converter/VisualBasicConverter.cs @@ -149,6 +149,9 @@ static bool IgnoreInContext(SyntaxToken m, TokenContext context) case VBasic.SyntaxKind.IteratorKeyword: case VBasic.SyntaxKind.DimKeyword: return true; + case VBasic.SyntaxKind.ReadOnlyKeyword: + case VBasic.SyntaxKind.WriteOnlyKeyword: + return context == TokenContext.Member; default: return false; } diff --git a/RefactoringEssentials/Util/SyntaxTokenExtensions.cs b/RefactoringEssentials/Util/SyntaxTokenExtensions.cs index 098d24b6..ef6209b5 100644 --- a/RefactoringEssentials/Util/SyntaxTokenExtensions.cs +++ b/RefactoringEssentials/Util/SyntaxTokenExtensions.cs @@ -756,19 +756,29 @@ public static bool IsMandatoryNamedParameterPosition(this SyntaxToken token) } return false; - } + } - public static bool IsKindOrHasMatchingText(this SyntaxToken token, SyntaxKind kind) - { - return token.Kind() == kind || token.HasMatchingText(kind); - } + public static bool IsKindOrHasMatchingText(this SyntaxToken token, SyntaxKind kind) + { + return token.Kind() == kind || token.HasMatchingText(kind); + } - public static bool HasMatchingText(this SyntaxToken token, SyntaxKind kind) - { - return token.ToString() == SyntaxFacts.GetText(kind); - } + public static bool IsKindOrHasMatchingText(this SyntaxToken token, Microsoft.CodeAnalysis.VisualBasic.SyntaxKind kind) + { + return Microsoft.CodeAnalysis.VisualBasic.VisualBasicExtensions.Kind(token) == kind || token.HasMatchingText(kind); + } + + public static bool HasMatchingText(this SyntaxToken token, SyntaxKind kind) + { + return token.ToString() == SyntaxFacts.GetText(kind); + } + + public static bool HasMatchingText(this SyntaxToken token, Microsoft.CodeAnalysis.VisualBasic.SyntaxKind kind) + { + return token.ToString() == Microsoft.CodeAnalysis.VisualBasic.SyntaxFacts.GetText(kind); + } - public static bool IsKind(this SyntaxToken token, Microsoft.CodeAnalysis.CSharp.SyntaxKind kind1, Microsoft.CodeAnalysis.CSharp.SyntaxKind kind2) + public static bool IsKind(this SyntaxToken token, Microsoft.CodeAnalysis.CSharp.SyntaxKind kind1, Microsoft.CodeAnalysis.CSharp.SyntaxKind kind2) { return Microsoft.CodeAnalysis.CSharp.CSharpExtensions.Kind(token) == kind1 || Microsoft.CodeAnalysis.CSharp.CSharpExtensions.Kind(token) == kind2; diff --git a/converter.txt b/converter.txt index b0918b60..18e2bff5 100644 --- a/converter.txt +++ b/converter.txt @@ -12,4 +12,16 @@ C# to VB: - unsafe code cannot be converted VB to C#: -- not implemented +- statements: + * special select case expressions + * special statements: call, erase, redim, a.o. +- expressions: + * .. To .. arguments + * anonymous types +- special cases: + * Should add Public Modifier to inner types, methods, properties and fields in structures + * Built-in methods => Prefix with class name + * Function A() \n A = SomeValue \n End Function -> convert to return statement + * Comparison with empty string literal -> string.IsNullOrEmpty + * Add default value to local variable declarations without initializer + * XML literals -> XLinq \ No newline at end of file From d137c4af6c543a4ffd5c5ded5e8bc1d264b78eeb Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 2 Oct 2016 19:02:00 +0200 Subject: [PATCH 013/236] fix bug in C#->VB converter --- RefactoringEssentials/VB/Converter/NodesVisitor.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/RefactoringEssentials/VB/Converter/NodesVisitor.cs b/RefactoringEssentials/VB/Converter/NodesVisitor.cs index 512f0d32..77cdeac2 100644 --- a/RefactoringEssentials/VB/Converter/NodesVisitor.cs +++ b/RefactoringEssentials/VB/Converter/NodesVisitor.cs @@ -1109,7 +1109,7 @@ public override VisualBasicSyntaxNode VisitAnonymousObjectMemberDeclarator(CSS.A public override VisualBasicSyntaxNode VisitArrayCreationExpression(CSS.ArrayCreationExpressionSyntax node) { var upperBoundArguments = node.Type.RankSpecifiers.First()?.Sizes.Where(s => !(s is CSS.OmittedArraySizeExpressionSyntax)).Select( - s => (ArgumentSyntax) SyntaxFactory.SimpleArgument(ReduceArrayUpperBoundExpression((ExpressionSyntax)s.Accept(this)))); + s => (ArgumentSyntax) SyntaxFactory.SimpleArgument(ReduceArrayUpperBoundExpression(s))); var rankSpecifiers = node.Type.RankSpecifiers.Select(rs => (ArrayRankSpecifierSyntax)rs.Accept(this)); return SyntaxFactory.ArrayCreationExpression( @@ -1129,7 +1129,7 @@ public override VisualBasicSyntaxNode VisitImplicitArrayCreationExpression(CSS.I ); } - ExpressionSyntax ReduceArrayUpperBoundExpression(ExpressionSyntax expr) + ExpressionSyntax ReduceArrayUpperBoundExpression(CSS.ExpressionSyntax expr) { var constant = semanticModel.GetConstantValue(expr); if (constant.HasValue && constant.Value is int) @@ -1137,7 +1137,7 @@ ExpressionSyntax ReduceArrayUpperBoundExpression(ExpressionSyntax expr) return SyntaxFactory.BinaryExpression( SyntaxKind.SubtractExpression, - expr, SyntaxFactory.Token(SyntaxKind.MinusToken), SyntaxFactory.NumericLiteralExpression(SyntaxFactory.Literal(1))); + (ExpressionSyntax)expr.Accept(this), SyntaxFactory.Token(SyntaxKind.MinusToken), SyntaxFactory.NumericLiteralExpression(SyntaxFactory.Literal(1))); } public override VisualBasicSyntaxNode VisitInitializerExpression(CSS.InitializerExpressionSyntax node) From 5ab73276453b60c9557892c12cb3bb7b1e4e7124 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sun, 2 Oct 2016 21:33:36 +0200 Subject: [PATCH 014/236] Added context menu commands for new VB -> C# converter in code editor and Solution Explorer. --- Vsix/CodeConversion.cs | 97 ++++++++-- Vsix/ConvertCSToVBCommand.cs | 6 +- Vsix/ConvertVBToCSCommand.cs | 167 ++++++++++++++++++ ...ommandPackage.cs => REConverterPackage.cs} | 9 +- ...ndPackage.vsct => REConverterPackage.vsct} | 34 +++- Vsix/VSPackage.resx | 69 +++----- Vsix/Vsix.csproj | 5 +- 7 files changed, 325 insertions(+), 62 deletions(-) create mode 100644 Vsix/ConvertVBToCSCommand.cs rename Vsix/{ConvertCSToVBCommandPackage.cs => REConverterPackage.cs} (93%) rename Vsix/{ConvertCSToVBCommandPackage.vsct => REConverterPackage.vsct} (62%) diff --git a/Vsix/CodeConversion.cs b/Vsix/CodeConversion.cs index 76feefbf..d0a02c04 100644 --- a/Vsix/CodeConversion.cs +++ b/Vsix/CodeConversion.cs @@ -15,23 +15,28 @@ namespace RefactoringEssentials.VsExtension static class CodeConversion { public static readonly string CSToVBConversionTitle = "Convert C# to VB:"; + public static readonly string VBToCSConversionTitle = "Convert VB to C#:"; public static void PerformCSToVBConversion(IServiceProvider serviceProvider, string inputCode) { string convertedText = null; try { - if (!TryConvertingCSToVBCode(inputCode, out convertedText)) + var result = TryConvertingCSToVBCode(inputCode); + if (!result.Success) { + var newLines = Environment.NewLine + Environment.NewLine; VsShellUtilities.ShowMessageBox( serviceProvider, - "Selected C# code seems to have errors or to be incomplete.", + $"Selected C# code seems to have errors or to be incomplete:{newLines}{result.GetExceptionsAsString()}", CSToVBConversionTitle, OLEMSGICON.OLEMSGICON_WARNING, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST); return; } + + convertedText = result.ConvertedCode; } catch (Exception ex) { @@ -54,21 +59,64 @@ public static void PerformCSToVBConversion(IServiceProvider serviceProvider, str Clipboard.SetText(convertedText); } - static bool TryConvertingCSToVBCode(string csCode, out string vbCode) + static ConversionResult TryConvertingCSToVBCode(string inputCode) { - vbCode = null; - - var codeWithOptions = new CodeWithOptions(csCode) + var codeWithOptions = new CodeWithOptions(inputCode) + .SetFromLanguage("C#") + .SetToLanguage("Visual Basic") .WithDefaultReferences(); - var result = CodeConverter.Convert(codeWithOptions); + return CodeConverter.Convert(codeWithOptions); + } + + public static void PerformVBToCSConversion(IServiceProvider serviceProvider, string inputCode) + { + string convertedText = null; + try + { + var result = TryConvertingVBToCSCode(inputCode); + if (!result.Success) + { + var newLines = Environment.NewLine + Environment.NewLine; + VsShellUtilities.ShowMessageBox( + serviceProvider, + $"Selected VB code seems to have errors or to be incomplete:{newLines}{result.GetExceptionsAsString()}", + VBToCSConversionTitle, + OLEMSGICON.OLEMSGICON_WARNING, + OLEMSGBUTTON.OLEMSGBUTTON_OK, + OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST); + return; + } - if (result.Success) + convertedText = result.ConvertedCode; + } + catch (Exception ex) { - vbCode = result.ConvertedCode; - return true; + VisualStudioInteraction.ShowException(serviceProvider, VBToCSConversionTitle, ex); + return; } - return false; + // Direct output for debugging + //string message = convertedText; + //VsShellUtilities.ShowMessageBox( + // serviceProvider, + // message, + // VBToCSConversionTitle, + // OLEMSGICON.OLEMSGICON_INFO, + // OLEMSGBUTTON.OLEMSGBUTTON_OK, + // OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST); + + WriteStatusBarText(serviceProvider, "Copied converted C# code to clipboard."); + + Clipboard.SetText(convertedText); + } + + static ConversionResult TryConvertingVBToCSCode(string inputCode) + { + var codeWithOptions = new CodeWithOptions(inputCode) + .SetFromLanguage("Visual Basic", 14) + .SetToLanguage("C#", 6) + .WithDefaultReferences(); + return CodeConverter.Convert(codeWithOptions); } static void WriteStatusBarText(IServiceProvider serviceProvider, string text) @@ -115,5 +163,32 @@ public static ITextSelection GetCSSelectionInCurrentView(IServiceProvider servic return viewHost.TextView.Selection; } + + static IWpfTextViewHost GetCurrentVBViewHost(IServiceProvider serviceProvider) + { + IWpfTextViewHost viewHost = VisualStudioInteraction.GetCurrentViewHost(serviceProvider); + if (viewHost == null) + return null; + + ITextDocument textDocument = viewHost.GetTextDocument(); + if ((textDocument == null) || !IsVBFileName(textDocument.FilePath)) + return null; + + return viewHost; + } + + public static bool IsVBFileName(string fileName) + { + return fileName.EndsWith(".vb", StringComparison.OrdinalIgnoreCase); + } + + public static ITextSelection GetVBSelectionInCurrentView(IServiceProvider serviceProvider) + { + IWpfTextViewHost viewHost = GetCurrentVBViewHost(serviceProvider); + if (viewHost == null) + return null; + + return viewHost.TextView.Selection; + } } } diff --git a/Vsix/ConvertCSToVBCommand.cs b/Vsix/ConvertCSToVBCommand.cs index 5646d8d1..06b4474d 100644 --- a/Vsix/ConvertCSToVBCommand.cs +++ b/Vsix/ConvertCSToVBCommand.cs @@ -32,7 +32,7 @@ internal sealed class ConvertCSToVBCommand /// /// VS Package that provides this command, not null. /// - readonly ConvertCSToVBCommandPackage package; + readonly REConverterPackage package; /// /// Gets the instance of the command. @@ -58,7 +58,7 @@ IServiceProvider ServiceProvider /// Initializes the singleton instance of the command. /// /// Owner package, not null. - public static void Initialize(ConvertCSToVBCommandPackage package) + public static void Initialize(REConverterPackage package) { Instance = new ConvertCSToVBCommand(package); } @@ -68,7 +68,7 @@ public static void Initialize(ConvertCSToVBCommandPackage package) /// Adds our command handlers for menu (commands must exist in the command table file) /// /// Owner package, not null. - ConvertCSToVBCommand(ConvertCSToVBCommandPackage package) + ConvertCSToVBCommand(REConverterPackage package) { if (package == null) { diff --git a/Vsix/ConvertVBToCSCommand.cs b/Vsix/ConvertVBToCSCommand.cs new file mode 100644 index 00000000..76f484e8 --- /dev/null +++ b/Vsix/ConvertVBToCSCommand.cs @@ -0,0 +1,167 @@ +using System; +using System.ComponentModel.Design; +using System.Globalization; +using Microsoft.VisualStudio.Shell; +using Microsoft.VisualStudio.Shell.Interop; +using Microsoft.VisualStudio.TextManager.Interop; +using Microsoft.VisualStudio.Text.Editor; +using Microsoft.VisualStudio.Editor; +using System.Windows; +using Microsoft.VisualStudio.Text; +using RefactoringEssentials.Converter; +using Microsoft.VisualStudio; +using System.Runtime.InteropServices; +using System.IO; + +namespace RefactoringEssentials.VsExtension +{ + /// + /// Command handler + /// + internal sealed class ConvertVBToCSCommand + { + public const int MainMenuCommandId = 0x0200; + public const int CtxMenuCommandId = 0x0201; + public const int ProjectItemCtxMenuCommandId = 0x0202; + + /// + /// Command menu group (command set GUID). + /// + public static readonly Guid CommandSet = new Guid("a3378a21-e939-40c9-9e4b-eb0cec7b7854"); + + /// + /// VS Package that provides this command, not null. + /// + readonly REConverterPackage package; + + /// + /// Gets the instance of the command. + /// + public static ConvertVBToCSCommand Instance + { + get; + private set; + } + + /// + /// Gets the service provider from the owner package. + /// + IServiceProvider ServiceProvider + { + get + { + return this.package; + } + } + + /// + /// Initializes the singleton instance of the command. + /// + /// Owner package, not null. + public static void Initialize(REConverterPackage package) + { + Instance = new ConvertVBToCSCommand(package); + } + + /// + /// Initializes a new instance of the class. + /// Adds our command handlers for menu (commands must exist in the command table file) + /// + /// Owner package, not null. + ConvertVBToCSCommand(REConverterPackage package) + { + if (package == null) + { + throw new ArgumentNullException(nameof(package)); + } + + this.package = package; + + OleMenuCommandService commandService = this.ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService; + if (commandService != null) + { + // Command in main menu + var menuCommandID = new CommandID(CommandSet, MainMenuCommandId); + var menuItem = new OleMenuCommand(CodeEditorMenuItemCallback, menuCommandID); + menuItem.BeforeQueryStatus += CodeEditorMenuItem_BeforeQueryStatus; + commandService.AddCommand(menuItem); + + // Command in code editor's context menu + var ctxMenuCommandID = new CommandID(CommandSet, CtxMenuCommandId); + var ctxMenuItem = new OleMenuCommand(CodeEditorMenuItemCallback, ctxMenuCommandID); + ctxMenuItem.BeforeQueryStatus += CodeEditorMenuItem_BeforeQueryStatus; + commandService.AddCommand(ctxMenuItem); + + // Command in project item context menu + var projectItemCtxMenuCommandID = new CommandID(CommandSet, ProjectItemCtxMenuCommandId); + var projectItemCtxMenuItem = new OleMenuCommand(ProjectItemMenuItemCallback, projectItemCtxMenuCommandID); + projectItemCtxMenuItem.BeforeQueryStatus += ProjectItemMenuItem_BeforeQueryStatus; + commandService.AddCommand(projectItemCtxMenuItem); + } + } + + void CodeEditorMenuItem_BeforeQueryStatus(object sender, EventArgs e) + { + var menuItem = sender as OleMenuCommand; + if (menuItem != null) + { + if (!package.DisableConverterInContextMenu) + { + menuItem.Visible = !CodeConversion.GetVBSelectionInCurrentView(ServiceProvider)?.StreamSelectionSpan.IsEmpty ?? false; + } + else + { + menuItem.Visible = false; + } + } + } + + void ProjectItemMenuItem_BeforeQueryStatus(object sender, EventArgs e) + { + var menuItem = sender as OleMenuCommand; + if (menuItem != null) + { + menuItem.Visible = false; + menuItem.Enabled = false; + + if (!package.DisableConverterInContextMenu) + { + string itemPath = VisualStudioInteraction.GetSingleSelectedItemPath(); + var fileInfo = new FileInfo(itemPath); + if (!CodeConversion.IsVBFileName(fileInfo.Name)) + return; + + menuItem.Visible = true; + menuItem.Enabled = true; + } + } + } + + void CodeEditorMenuItemCallback(object sender, EventArgs e) + { + string selectedText = CodeConversion.GetVBSelectionInCurrentView(ServiceProvider)?.StreamSelectionSpan.GetText(); + CodeConversion.PerformVBToCSConversion(ServiceProvider, selectedText); + } + + async void ProjectItemMenuItemCallback(object sender, EventArgs e) + { + string itemPath = VisualStudioInteraction.GetSingleSelectedItemPath(); + var fileInfo = new FileInfo(itemPath); + if (!CodeConversion.IsVBFileName(fileInfo.Name)) + return; + + try + { + using (StreamReader reader = new StreamReader(itemPath)) + { + string csCode = await reader.ReadToEndAsync(); + CodeConversion.PerformVBToCSConversion(ServiceProvider, csCode); + } + } + catch (Exception ex) + { + VisualStudioInteraction.ShowException(ServiceProvider, CodeConversion.VBToCSConversionTitle, ex); + } + } + } +} diff --git a/Vsix/ConvertCSToVBCommandPackage.cs b/Vsix/REConverterPackage.cs similarity index 93% rename from Vsix/ConvertCSToVBCommandPackage.cs rename to Vsix/REConverterPackage.cs index 29a07cf0..229c839c 100644 --- a/Vsix/ConvertCSToVBCommandPackage.cs +++ b/Vsix/REConverterPackage.cs @@ -40,9 +40,9 @@ namespace RefactoringEssentials.VsExtension [ProvideMenuResource("Menus.ctmenu", 1)] [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExistsAndFullyLoaded_string)] [ProvideOptionPage(typeof(GeneralOptionsDialogPage), "Refactoring Essentials", "General", 0, 0, true)] - [Guid(ConvertCSToVBCommandPackage.PackageGuidString)] + [Guid(REConverterPackage.PackageGuidString)] [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "pkgdef, VS and vsixmanifest are valid VS terms")] - public sealed class ConvertCSToVBCommandPackage : Package + public sealed class REConverterPackage : Package { /// /// ConvertCSToVBCommandPackage GUID string. @@ -50,9 +50,9 @@ public sealed class ConvertCSToVBCommandPackage : Package public const string PackageGuidString = "2bc6f609-6f6e-4c54-a908-791dd169911d"; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of package class. /// - public ConvertCSToVBCommandPackage() + public REConverterPackage() { // Inside this method you can place any initialization code that does not require // any Visual Studio service because at this point the package object is created but @@ -69,6 +69,7 @@ public ConvertCSToVBCommandPackage() protected override void Initialize() { ConvertCSToVBCommand.Initialize(this); + ConvertVBToCSCommand.Initialize(this); base.Initialize(); } diff --git a/Vsix/ConvertCSToVBCommandPackage.vsct b/Vsix/REConverterPackage.vsct similarity index 62% rename from Vsix/ConvertCSToVBCommandPackage.vsct rename to Vsix/REConverterPackage.vsct index c7c28711..2dd13cbf 100644 --- a/Vsix/ConvertCSToVBCommandPackage.vsct +++ b/Vsix/REConverterPackage.vsct @@ -4,7 +4,7 @@ - + @@ -18,6 +18,7 @@ + + + + + + - + @@ -57,6 +84,9 @@ + + + diff --git a/Vsix/VSPackage.resx b/Vsix/VSPackage.resx index 5376a5eb..63904226 100644 --- a/Vsix/VSPackage.resx +++ b/Vsix/VSPackage.resx @@ -1,27 +1,17 @@  - - @@ -127,11 +117,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ConvertCSToVBCommand Extension + Refactoring Essentials - ConvertCSToVBCommand Visual Studio Extension Detailed Info + Refactoring Essentials Extension Details \ No newline at end of file diff --git a/Vsix/Vsix.csproj b/Vsix/Vsix.csproj index 245f8058..937441a1 100644 --- a/Vsix/Vsix.csproj +++ b/Vsix/Vsix.csproj @@ -68,7 +68,7 @@ /rootsuffix Roslyn - + Menus.ctmenu Designer @@ -110,8 +110,9 @@ + - + Component From 4c1e442213d742fa8d7db849e07b136def4b4f0f Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Mon, 3 Oct 2016 01:21:58 +0200 Subject: [PATCH 015/236] Excluded VS 15 from VSIX manifest for now, since it's currently not compatible. --- Vsix/source.extension.tt | 6 +++--- Vsix/source.extension.vsixmanifest | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Vsix/source.extension.tt b/Vsix/source.extension.tt index 68ed7cd9..3acd47df 100644 --- a/Vsix/source.extension.tt +++ b/Vsix/source.extension.tt @@ -15,9 +15,9 @@ Images\refactoringessentials-preview.png - - - + + + diff --git a/Vsix/source.extension.vsixmanifest b/Vsix/source.extension.vsixmanifest index 8e3be36b..bd454135 100644 --- a/Vsix/source.extension.vsixmanifest +++ b/Vsix/source.extension.vsixmanifest @@ -12,9 +12,9 @@ Images\refactoringessentials-preview.png - - - + + + From 990af96bce2bd494314e4c95ee5b7d98a74fd19f Mon Sep 17 00:00:00 2001 From: Christoph Wille Date: Mon, 3 Oct 2016 14:09:37 +0200 Subject: [PATCH 016/236] Publish Web site https://roslyncodeconverter.azurewebsites.net/ --- .../App_Start/SwaggerConfig.cs | 23 ++++++++++++++++--- .../CodeConverterWebApp.csproj | 20 ++++++++-------- CodeConverterWebApp/Web.config | 6 ++--- CodeConverterWebApp/packages.config | 10 ++++---- 4 files changed, 38 insertions(+), 21 deletions(-) diff --git a/CodeConverterWebApp/App_Start/SwaggerConfig.cs b/CodeConverterWebApp/App_Start/SwaggerConfig.cs index 3d1521d4..64f51558 100644 --- a/CodeConverterWebApp/App_Start/SwaggerConfig.cs +++ b/CodeConverterWebApp/App_Start/SwaggerConfig.cs @@ -26,13 +26,13 @@ public static void Register() // the docs is taken as the default. If your API supports multiple schemes and you want to be explicit // about them, you can use the "Schemes" option as shown below. // - c.Schemes(new[] { "https" }); + //c.Schemes(new[] { "http", "https" }); // Use "SingleApiVersion" to describe a single version API. Swagger 2.0 includes an "Info" object to // hold additional metadata for an API. Version and title are required but you can also provide // additional fields by chaining methods off SingleApiVersion. // - c.SingleApiVersion("v1", "RoslynCodeConverter"); + c.SingleApiVersion("v1", "CodeConverterWebApp"); // If your API has multiple versions, use "MultipleApiVersions" instead of "SingleApiVersion". // In this case, you must provide a lambda that tells Swashbuckle which actions should be @@ -57,6 +57,7 @@ public static void Register() //c.BasicAuth("basic") // .Description("Basic HTTP Authentication"); // + // NOTE: You must also configure 'EnableApiKeySupport' below in the SwaggerUI section //c.ApiKey("apiKey") // .Description("API Key Authentication") // .Name("apiKey") @@ -204,6 +205,11 @@ public static void Register() // //c.DocExpansion(DocExpansion.List); + // Specify which HTTP operations will have the 'Try it out!' option. An empty paramter list disables + // it for all operations. + // + //c.SupportedSubmitMethods("GET", "HEAD"); + // Use the CustomAsset option to provide your own version of assets used in the swagger-ui. // It's typically used to instruct Swashbuckle to return your version instead of the default // when a request is made for "index.html". As with all custom content, the file must be included @@ -222,7 +228,18 @@ public static void Register() // If your API supports the OAuth2 Implicit flow, and you've described it correctly, according to // the Swagger 2.0 specification, you can enable UI support as shown below. // - //c.EnableOAuth2Support("test-client-id", "test-realm", "Swagger UI"); + //c.EnableOAuth2Support( + // clientId: "test-client-id", + // clientSecret: null, + // realm: "test-realm", + // appName: "Swagger UI" + // //additionalQueryStringParams: new Dictionary() { { "foo", "bar" } } + //); + + // If your API supports ApiKey, you can override the default values. + // "apiKeyIn" can either be "query" or "header" + // + //c.EnableApiKeySupport("apiKey", "header"); }); } } diff --git a/CodeConverterWebApp/CodeConverterWebApp.csproj b/CodeConverterWebApp/CodeConverterWebApp.csproj index 05d4db93..3f57a776 100644 --- a/CodeConverterWebApp/CodeConverterWebApp.csproj +++ b/CodeConverterWebApp/CodeConverterWebApp.csproj @@ -1,7 +1,7 @@  - - + + Debug @@ -43,17 +43,17 @@ 4 - - ..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll + + ..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.2\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll True - - ..\packages\Newtonsoft.Json.8.0.3\lib\net45\Newtonsoft.Json.dll + + ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll True - ..\packages\Swashbuckle.Core.5.3.2\lib\net40\Swashbuckle.Core.dll + ..\packages\Swashbuckle.Core.5.4.0\lib\net40\Swashbuckle.Core.dll True @@ -134,7 +134,7 @@ - + @@ -207,8 +207,8 @@ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - + + + \ No newline at end of file diff --git a/DocGenerator.2017/Properties/AssemblyInfo.cs b/DocGenerator.2017/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..c8bd4539 --- /dev/null +++ b/DocGenerator.2017/Properties/AssemblyInfo.cs @@ -0,0 +1,5 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("Refactoring Essentials Documentation Generator")] \ No newline at end of file diff --git a/DocGenerator.2017/packages.config b/DocGenerator.2017/packages.config new file mode 100644 index 00000000..af56ed4c --- /dev/null +++ b/DocGenerator.2017/packages.config @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RefactoringEssentials.2017.sln b/RefactoringEssentials.2017.sln new file mode 100644 index 00000000..9786f9a4 --- /dev/null +++ b/RefactoringEssentials.2017.sln @@ -0,0 +1,211 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.25920.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{CF2B2ADB-325E-49D2-8718-2FBEFE973476}" + ProjectSection(SolutionItems) = preProject + .nuget\packages.config = .nuget\packages.config + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{E7481F91-77A4-49F6-ACC7-B8145827C384}" + ProjectSection(SolutionItems) = preProject + README.md = README.md + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Vsix", "Vsix.2017\Vsix.csproj", "{99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}" + ProjectSection(ProjectDependencies) = postProject + {7FB64621-DF93-48DE-995D-8CB0804F6003} = {7FB64621-DF93-48DE-995D-8CB0804F6003} + {31E950AF-20E9-43AB-8CB7-134598FB8A6D} = {31E950AF-20E9-43AB-8CB7-134598FB8A6D} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RefactoringEssentials", "RefactoringEssentials.2017\RefactoringEssentials.csproj", "{C465A5DC-AD28-49A2-89C0-F81838814A7E}" + ProjectSection(ProjectDependencies) = postProject + {31E950AF-20E9-43AB-8CB7-134598FB8A6D} = {31E950AF-20E9-43AB-8CB7-134598FB8A6D} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Demonstration", "Demonstration\Demonstration.csproj", "{203FF5F7-8F0A-43C5-8BB5-723C492A42DA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BuildTools", "BuildTools\BuildTools.csproj", "{31E950AF-20E9-43AB-8CB7-134598FB8A6D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests.2017\Tests.csproj", "{21DBA1CE-AF55-4159-B04B-B8C621BE8921}" +EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Demonstration.VB", "Demonstration.VB\Demonstration.VB.vbproj", "{9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocGenerator", "DocGenerator.2017\DocGenerator.csproj", "{7FB64621-DF93-48DE-995D-8CB0804F6003}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 + Mono_Debug|Any CPU = Mono_Debug|Any CPU + Mono_Debug|x86 = Mono_Debug|x86 + Mono_Release|Any CPU = Mono_Release|Any CPU + Mono_Release|x86 = Mono_Release|x86 + net_4_5_Debug|Any CPU = net_4_5_Debug|Any CPU + net_4_5_Debug|x86 = net_4_5_Debug|x86 + net_4_5_Release|Any CPU = net_4_5_Release|Any CPU + net_4_5_Release|x86 = net_4_5_Release|x86 + Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Debug|x86.ActiveCfg = Debug|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Debug|x86.Build.0 = Debug|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Mono_Debug|Any CPU.ActiveCfg = Mono_Debug|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Mono_Debug|Any CPU.Build.0 = Mono_Debug|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Mono_Debug|x86.ActiveCfg = Mono_Debug|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Mono_Release|Any CPU.ActiveCfg = Mono_Release|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Mono_Release|Any CPU.Build.0 = Mono_Release|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Mono_Release|x86.ActiveCfg = Mono_Release|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Debug|Any CPU.Build.0 = Debug|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Debug|x86.ActiveCfg = Debug|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Debug|x86.Build.0 = Debug|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Release|Any CPU.ActiveCfg = Release|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Release|Any CPU.Build.0 = Release|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Release|x86.ActiveCfg = Release|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Release|x86.Build.0 = Release|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Release|Any CPU.Build.0 = Release|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Release|x86.ActiveCfg = Release|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Release|x86.Build.0 = Release|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Debug|x86.ActiveCfg = Debug|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Debug|x86.Build.0 = Debug|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Mono_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Mono_Debug|Any CPU.Build.0 = Debug|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Mono_Debug|x86.ActiveCfg = Debug|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Mono_Release|Any CPU.ActiveCfg = Release|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Mono_Release|Any CPU.Build.0 = Release|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Mono_Release|x86.ActiveCfg = Release|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.net_4_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.net_4_5_Debug|Any CPU.Build.0 = Debug|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.net_4_5_Debug|x86.ActiveCfg = Debug|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.net_4_5_Debug|x86.Build.0 = Debug|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.net_4_5_Release|Any CPU.ActiveCfg = Release|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.net_4_5_Release|Any CPU.Build.0 = Release|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.net_4_5_Release|x86.ActiveCfg = Release|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.net_4_5_Release|x86.Build.0 = Release|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Release|Any CPU.Build.0 = Release|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Release|x86.ActiveCfg = Release|Any CPU + {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Release|x86.Build.0 = Release|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Debug|x86.ActiveCfg = Debug|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Debug|x86.Build.0 = Debug|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Mono_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Mono_Debug|x86.ActiveCfg = Debug|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Mono_Release|Any CPU.ActiveCfg = Release|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Mono_Release|x86.ActiveCfg = Release|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Debug|Any CPU.Build.0 = Debug|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Debug|x86.ActiveCfg = Debug|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Debug|x86.Build.0 = Debug|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Release|Any CPU.ActiveCfg = Release|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Release|Any CPU.Build.0 = Release|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Release|x86.ActiveCfg = Release|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Release|x86.Build.0 = Release|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Release|Any CPU.Build.0 = Release|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Release|x86.ActiveCfg = Release|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Release|x86.Build.0 = Release|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Debug|x86.ActiveCfg = Debug|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Debug|x86.Build.0 = Debug|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Mono_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Mono_Debug|x86.ActiveCfg = Debug|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Mono_Release|Any CPU.ActiveCfg = Release|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Mono_Release|x86.ActiveCfg = Release|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Debug|Any CPU.Build.0 = Debug|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Debug|x86.ActiveCfg = Debug|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Debug|x86.Build.0 = Debug|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Release|Any CPU.ActiveCfg = Release|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Release|Any CPU.Build.0 = Release|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Release|x86.ActiveCfg = Release|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Release|x86.Build.0 = Release|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Release|Any CPU.Build.0 = Release|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Release|x86.ActiveCfg = Release|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Release|x86.Build.0 = Release|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Debug|x86.ActiveCfg = Debug|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Debug|x86.Build.0 = Debug|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Mono_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Mono_Debug|Any CPU.Build.0 = Debug|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Mono_Debug|x86.ActiveCfg = Debug|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Mono_Release|Any CPU.ActiveCfg = Release|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Mono_Release|Any CPU.Build.0 = Release|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Mono_Release|x86.ActiveCfg = Release|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Debug|Any CPU.Build.0 = Debug|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Debug|x86.ActiveCfg = Debug|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Debug|x86.Build.0 = Debug|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Release|Any CPU.ActiveCfg = Release|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Release|Any CPU.Build.0 = Release|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Release|x86.ActiveCfg = Release|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Release|x86.Build.0 = Release|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Release|Any CPU.Build.0 = Release|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Release|x86.ActiveCfg = Release|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Release|x86.Build.0 = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Debug|x86.ActiveCfg = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Debug|x86.Build.0 = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Debug|Any CPU.Build.0 = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Debug|x86.ActiveCfg = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Debug|x86.Build.0 = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Release|Any CPU.ActiveCfg = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Release|Any CPU.Build.0 = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Release|x86.ActiveCfg = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Release|x86.Build.0 = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Debug|Any CPU.Build.0 = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Debug|x86.ActiveCfg = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Debug|x86.Build.0 = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Release|Any CPU.ActiveCfg = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Release|Any CPU.Build.0 = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Release|x86.ActiveCfg = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Release|x86.Build.0 = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Release|Any CPU.Build.0 = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Release|x86.ActiveCfg = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Release|x86.Build.0 = Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Debug|x86.ActiveCfg = Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Debug|x86.Build.0 = Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Debug|Any CPU.ActiveCfg = Mono_Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Debug|Any CPU.Build.0 = Mono_Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Debug|x86.ActiveCfg = Mono_Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Debug|x86.Build.0 = Mono_Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Release|Any CPU.ActiveCfg = Mono_Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Release|Any CPU.Build.0 = Mono_Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Release|x86.ActiveCfg = Mono_Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Release|x86.Build.0 = Mono_Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Debug|Any CPU.Build.0 = Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Debug|x86.ActiveCfg = Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Debug|x86.Build.0 = Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Release|Any CPU.ActiveCfg = Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Release|Any CPU.Build.0 = Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Release|x86.ActiveCfg = Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Release|x86.Build.0 = Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Release|Any CPU.Build.0 = Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Release|x86.ActiveCfg = Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/RefactoringEssentials.2017/CodeAnalyzers.CSharp.html b/RefactoringEssentials.2017/CodeAnalyzers.CSharp.html new file mode 100644 index 00000000..c18e745c --- /dev/null +++ b/RefactoringEssentials.2017/CodeAnalyzers.CSharp.html @@ -0,0 +1,142 @@ + + + + + + + + + +

Supported Code Analyzers

+

120 code analyzers for C#

+
    +
  • Suggests using the class declaring a static function when calling it (AccessToStaticMemberViaDerivedTypeAnalyzer)
  • +
  • When initializing explicitly typed local variable or array type, array creation expression can be replaced with array initializer. (ArrayCreationCanBeReplacedWithArrayInitializerAnalyzer)
  • +
  • Asynchronous methods should return a Task instead of void (AvoidAsyncVoidAnalyzer)
  • +
  • Base parameter has 'params' modifier, but missing in overrider (BaseMemberHasParamsAnalyzer)
  • +
  • Call to base member with implicit default parameters (BaseMethodCallWithDefaultParameterAnalyzer)
  • +
  • Parameter name differs in base declaration (BaseMethodParameterNameMismatchAnalyzer)
  • +
  • Bitwise operation on enum which has no [Flags] attribute (BitwiseOperatorOnEnumWithoutFlagsAnalyzer)
  • +
  • Finds potentially erroneous calls to Object.Equals (CallToObjectEqualsViaBaseAnalyzer)
  • +
  • Possible compare of value type with 'null' (CompareNonConstrainedGenericWithNullAnalyzer)
  • +
  • Comparison of floating point numbers with equality operator (CompareOfFloatsByEqualityOperatorAnalyzer)
  • +
  • '?:' expression has identical true and false branches (ConditionalTernaryEqualBranchAnalyzer)
  • +
  • Expression is always 'true' or always 'false' (ConditionIsAlwaysTrueOrFalseAnalyzer)
  • +
  • Condition is always 'true' or always 'false' (ConstantConditionAnalyzer)
  • +
  • Finds redundant null coalescing expressions such as expr ?? expr (ConstantNullCoalescingConditionAnalyzer)
  • +
  • Convert anonymous method to method group (ConvertClosureToMethodGroupAnalyzer)
  • +
  • '?:' expression can be converted to '??' expression (ConvertConditionalTernaryToNullCoalescingAnalyzer)
  • +
  • Convert 'if-do-while' to 'while' statement (ConvertIfDoToWhileAnalyzer)
  • +
  • 'if' statement can be re-written as 'switch' statement (ConvertIfStatementToSwitchStatementAnalyzer)
  • +
  • Convert 'if' to '&&' expression (ConvertIfToAndExpressionAnalyzer)
  • +
  • Convert 'if' to '||' expression (ConvertIfToOrExpressionAnalyzer)
  • +
  • Convert 'Nullable<T>' to the short form 'T?' (ConvertNullableToShortFormAnalyzer)
  • +
  • If all fields, properties and methods members are static, the class can be made static. (ConvertToStaticTypeAnalyzer)
  • +
  • Delegate subtraction has unpredictable result (DelegateSubtractionAnalyzer)
  • +
  • Warns about calls to virtual member functions occuring in the constructor (DoNotCallOverridableMethodsInConstructorAnalyzer)
  • +
  • Double negation is redundant (DoubleNegationOperatorAnalyzer)
  • +
  • An empty public constructor without parameters is redundant. (EmptyConstructorAnalyzer)
  • +
  • Empty destructor is redundant (EmptyDestructorAnalyzer)
  • +
  • Empty control statement body (EmptyEmbeddedStatementAnalyzer)
  • +
  • A catch clause that catches System.Exception and has an empty body (EmptyGeneralCatchClauseAnalyzer)
  • +
  • Empty namespace declaration is redundant (EmptyNamespaceAnalyzer)
  • +
  • Empty statement is redundant (EmptyStatementAnalyzer)
  • +
  • The default underlying type of enums is int, so defining it explicitly is redundant. (EnumUnderlyingTypeIsIntAnalyzer)
  • +
  • Comparing equal expression for equality is usually useless (EqualExpressionComparisonAnalyzer)
  • +
  • Event unsubscription via anonymous delegate is useless (EventUnsubscriptionViaAnonymousDelegateAnalyzer)
  • +
  • Convert field to readonly (FieldCanBeMadeReadOnlyAnalyzer)
  • +
  • 'for' loop control variable is never modified (ForControlVariableIsNeverModifiedAnalyzer)
  • +
  • Finds issues with format strings (FormatStringProblemAnalyzer)
  • +
  • 'true' is redundant as for statement condition (ForStatementConditionIsTrueAnalyzer)
  • +
  • Function does not reach its end or a 'return' statement by any of possible execution paths (FunctionNeverReturnsAnalyzer)
  • +
  • If an extension method is called as static method convert it to method syntax (InvokeAsExtensionMethodAnalyzer)
  • +
  • Local variable has the same name as a member and hides it (LocalVariableHidesMemberAnalyzer)
  • +
  • Local variable is never used (LocalVariableNotUsedAnalyzer)
  • +
  • Lowercase 'l' is often confused with '1' (LongLiteralEndingLowerLAnalyzer)
  • +
  • Member hides static member from outer class (MemberHidesStaticFromOuterClassAnalyzer)
  • +
  • Method with optional parameter is hidden by overload (MethodOverloadWithOptionalParameterAnalyzer)
  • +
  • Suggest the usage of the nameof operator (NameOfSuggestionAnalyzer)
  • +
  • Non public methods are not found by NUnit (NonPublicMethodWithTestAttributeAnalyzer)
  • +
  • Non-readonly field referenced in 'GetHashCode()' (NonReadonlyReferencedInGetHashCodeAnalyzer)
  • +
  • Shows NotImplementedException throws in the quick task bar (NotImplementedExceptionAnalyzer)
  • +
  • Cannot resolve symbol in text argument (NotResolvedInTextAnalyzer)
  • +
  • Possible unassigned object created by 'new' (ObjectCreationAsStatementAnalyzer)
  • +
  • Operator Is can be used instead of comparing object GetType() and instances of System.Type object (OperatorIsCanBeUsedAnalyzer)
  • +
  • C# doesn't support optional 'ref' or 'out' parameters (OptionalParameterRefOutAnalyzer)
  • +
  • Parameter has the same name as a member and hides it (ParameterHidesMemberAnalyzer)
  • +
  • Parameter is assigned but its value is never used (ParameterOnlyAssignedAnalyzer)
  • +
  • Parameter name differs in partial method definition (PartialMethodParameterNameMismatchAnalyzer)
  • +
  • Class is declared partial but has only one part (PartialTypeWithSinglePartAnalyzer)
  • +
  • Possible mistaken call to 'object.GetType()' (PossibleMistakenCallToGetTypeAnalyzer)
  • +
  • Constructor in abstract class should not be public (PublicConstructorInAbstractClassAnalyzer)
  • +
  • Redundant explicit property name (RedundantAnonymousTypePropertyNameAnalyzer)
  • +
  • Redundant explicit argument name specification (RedundantArgumentNameAnalyzer)
  • +
  • Parentheses are redundant if attribute has no arguments (RedundantAttributeParenthesesAnalyzer)
  • +
  • This is generated by the compiler and can be safely removed (RedundantBaseConstructorCallAnalyzer)
  • +
  • 'base.' is redundant and can safely be removed (RedundantBaseQualifierAnalyzer)
  • +
  • Redundant case label (RedundantCaseLabelAnalyzer)
  • +
  • Check for inequality before assignment is redundant if (x != value) x = value; (RedundantCheckBeforeAssignmentAnalyzer)
  • +
  • Redundant comma in array initializer (RedundantCommaInArrayInitializerAnalyzer)
  • +
  • Initializing field with default value is redundant (RedundantDefaultFieldInitializerAnalyzer)
  • +
  • Explicit delegate creation expression is redundant (RedundantDelegateCreationAnalyzer)
  • +
  • Redundant empty 'default' switch branch (RedundantEmptyDefaultSwitchBranchAnalyzer)
  • +
  • Redundant empty finally block (RedundantEmptyFinallyBlockAnalyzer)
  • +
  • Redundant explicit size in array creation (RedundantExplicitArraySizeAnalyzer)
  • +
  • Value types are implicitly convertible to nullables (RedundantExplicitNullableCreationAnalyzer)
  • +
  • Redundant 'else' keyword (RedundantIfElseBlockAnalyzer)
  • +
  • Removes 'internal' modifiers that are not required (RedundantInternalAnalyzer)
  • +
  • When object creation uses object or collection initializer, empty argument list is redundant (RedundantObjectCreationArgumentListAnalyzer)
  • +
  • Removes 'private' modifiers that are not required (RedundantPrivateAnalyzer)
  • +
  • Redundant 'string.ToCharArray()' call (RedundantStringToCharArrayCallAnalyzer)
  • +
  • Redundant conditional expression (RedundantTernaryExpressionAnalyzer)
  • +
  • RedundantToStringCallAnalyzer
  • +
  • Unsafe modifier in redundant in unsafe context or when no unsafe constructs are used (RedundantUnsafeContextAnalyzer)
  • +
  • Remove redundant statement (RemoveRedundantOrStatementAnalyzer)
  • +
  • Replace with call to FirstOrDefault<T>() (ReplaceWithFirstOrDefaultAnalyzer)
  • +
  • Replace with call to LastOrDefault<T>() (ReplaceWithLastOrDefaultAnalyzer)
  • +
  • Replace with call to OfType<T> (ReplaceWithOfTypeAnalyzer)
  • +
  • Replace with call to OfType<T>().Any() (ReplaceWithOfTypeAnyAnalyzer)
  • +
  • Replace with call to OfType<T>().Count() (ReplaceWithOfTypeCountAnalyzer)
  • +
  • Replace with call to OfType<T>().First() (ReplaceWithOfTypeFirstAnalyzer)
  • +
  • Replace with call to OfType<T>().FirstOrDefault() (ReplaceWithOfTypeFirstOrDefaultAnalyzer)
  • +
  • Replace with call to OfType<T>().Last() (ReplaceWithOfTypeLastAnalyzer)
  • +
  • Replace with call to OfType<T>().LastOrDefault() (ReplaceWithOfTypeLastOrDefaultAnalyzer)
  • +
  • Replace with call to OfType<T>().LongCount() (ReplaceWithOfTypeLongCountAnalyzer)
  • +
  • Replace with call to OfType<T>().Single() (ReplaceWithOfTypeSingleAnalyzer)
  • +
  • Replace with call to OfType<T>().SingleOrDefault() (ReplaceWithOfTypeSingleOrDefaultAnalyzer)
  • +
  • Replace with call to OfType<T>().Where() (ReplaceWithOfTypeWhereAnalyzer)
  • +
  • Replace with simple assignment (ReplaceWithSimpleAssignmentAnalyzer)
  • +
  • Redundant Where() call with predicate followed by Any() (ReplaceWithSingleCallToAnyAnalyzer)
  • +
  • Redundant Where() call with predicate followed by Count() (ReplaceWithSingleCallToCountAnalyzer)
  • +
  • Redundant Where() call with predicate followed by First() (ReplaceWithSingleCallToFirstAnalyzer)
  • +
  • Redundant Where() call with predicate followed by FirstOrDefault() (ReplaceWithSingleCallToFirstOrDefaultAnalyzer)
  • +
  • Redundant Where() call with predicate followed by Last() (ReplaceWithSingleCallToLastAnalyzer)
  • +
  • Redundant Where() call with predicate followed by LastOrDefault() (ReplaceWithSingleCallToLastOrDefaultAnalyzer)
  • +
  • Redundant Where() call with predicate followed by LongCount() (ReplaceWithSingleCallToLongCountAnalyzer)
  • +
  • Redundant Where() call with predicate followed by Single() (ReplaceWithSingleCallToSingleAnalyzer)
  • +
  • Redundant Where() call with predicate followed by SingleOrDefault() (ReplaceWithSingleCallToSingleOrDefaultAnalyzer)
  • +
  • Uses shorter string.IsNullOrEmpty call instead of a longer condition (ReplaceWithStringIsNullOrEmptyAnalyzer)
  • +
  • 'sealed' modifier is redundant in sealed classes (SealedMemberInSealedClassAnalyzer)
  • +
  • Conditional expression can be simplified (SimplifyConditionalTernaryExpressionAnalyzer)
  • +
  • Warns about static fields in generic types (StaticFieldOrAutoPropertyInGenericTypeAnalyzer)
  • +
  • Warns when a culture-aware 'string.CompareTo' call is used by default (StringCompareToIsCultureSpecificAnalyzer)
  • +
  • Warns when a culture-aware 'EndsWith' call is used by default. (StringEndsWithIsCultureSpecificAnalyzer)
  • +
  • Warns when a culture-aware 'IndexOf' call is used by default. (StringIndexOfIsCultureSpecificAnalyzer)
  • +
  • Warns when a culture-aware 'LastIndexOf' call is used by default. (StringLastIndexOfIsCultureSpecificAnalyzer)
  • +
  • Warns when a culture-aware 'StartsWith' call is used by default. (StringStartsWithIsCultureSpecificAnalyzer)
  • +
  • Use 'var' keyword when possible (SuggestUseVarKeywordEvidentAnalyzer)
  • +
  • [ThreadStatic] doesn't work with instance fields (ThreadStaticAtInstanceFieldAnalyzer)
  • +
  • Parameter is never used (UnusedParameterAnalyzer)
  • +
  • Type parameter is never used (UnusedTypeParameterAnalyzer)
  • +
  • Warns about property or indexer setters and event adders or removers that do not use the value parameter (ValueParameterNotUsedAnalyzer)
  • +
  • Validate Xml docs (XmlDocAnalyzer)
  • +
+ + \ No newline at end of file diff --git a/RefactoringEssentials.2017/CodeAnalyzers.VB.html b/RefactoringEssentials.2017/CodeAnalyzers.VB.html new file mode 100644 index 00000000..fb1f9e71 --- /dev/null +++ b/RefactoringEssentials.2017/CodeAnalyzers.VB.html @@ -0,0 +1,24 @@ + + + + + + + + + +

Supported Code Analyzers

+

2 code analyzers for Visual Basic

+
    +
  • Suggest the usage of the NameOf operator (NameOfSuggestionAnalyzer)
  • +
  • Non public methods are not found by NUnit (NonPublicMethodWithTestAttributeAnalyzer)
  • +
+ + \ No newline at end of file diff --git a/RefactoringEssentials.2017/CodeAnalyzers.html.template b/RefactoringEssentials.2017/CodeAnalyzers.html.template new file mode 100644 index 00000000..fda84f5b --- /dev/null +++ b/RefactoringEssentials.2017/CodeAnalyzers.html.template @@ -0,0 +1,26 @@ + + + + + + + + + + + +

Supported Code Analyzers

+

+
    + +
+ + + \ No newline at end of file diff --git a/RefactoringEssentials.2017/CodeFixes.CSharp.html b/RefactoringEssentials.2017/CodeFixes.CSharp.html new file mode 100644 index 00000000..a79c25a1 --- /dev/null +++ b/RefactoringEssentials.2017/CodeFixes.CSharp.html @@ -0,0 +1,31 @@ + + + + + + + + + +

Additional Supported Code Fixes

+

9 code fixes for C#

+
    +
  • CS0108UseNewKeywordIfHidingIntendedCodeFixProvider
  • +
  • CS0152DuplicateCaseLabelValueCodeFixProvider
  • +
  • CS0162UnreachableCodeDetectedCodeFixProvider
  • +
  • CS0164LabelHasNotBeenReferencedCodeFixProvider
  • +
  • CS0759RedundantPartialMethodCodeFixProvider
  • +
  • CS1105ExtensionMethodMustBeDeclaredStaticCodeFixProvider
  • +
  • CS1520MethodMustHaveAReturnTypeCodeFixProvider
  • +
  • InvalidConversionCodeFixProvider
  • +
  • ReturnMustNotBeFollowedByAnyExpressionCodeFixProvider
  • +
+ + \ No newline at end of file diff --git a/RefactoringEssentials.2017/CodeFixes.VB.html b/RefactoringEssentials.2017/CodeFixes.VB.html new file mode 100644 index 00000000..bc36900d --- /dev/null +++ b/RefactoringEssentials.2017/CodeFixes.VB.html @@ -0,0 +1,21 @@ + + + + + + + + + +

Additional Supported Code Fixes

+

0 code fixes for Visual Basic

+
    + + \ No newline at end of file diff --git a/RefactoringEssentials.2017/CodeFixes.html.template b/RefactoringEssentials.2017/CodeFixes.html.template new file mode 100644 index 00000000..aeb42862 --- /dev/null +++ b/RefactoringEssentials.2017/CodeFixes.html.template @@ -0,0 +1,22 @@ + + + + + + + + + +

    Additional Supported Code Fixes

    +

    +
      +
    + + \ No newline at end of file diff --git a/RefactoringEssentials.2017/CodeRefactorings.CSharp.html b/RefactoringEssentials.2017/CodeRefactorings.CSharp.html new file mode 100644 index 00000000..5e30708e --- /dev/null +++ b/RefactoringEssentials.2017/CodeRefactorings.CSharp.html @@ -0,0 +1,125 @@ + + + + + + + + + +

    Supported Refactorings

    +

    103 code refactorings for C#

    +
      +
    • Adds another accessor (AddAnotherAccessorCodeRefactoringProvider)
    • +
    • Add braces (AddBracesCodeRefactoringProvider)
    • +
    • 'catch' to 'catch (Exception)' (AddCatchExceptionCodeRefactoringProvider)
    • +
    • Add an exception description to the xml documentation (AddExceptionDescriptionCodeRefactoringProvider)
    • +
    • Add name for argument (AddNameToArgumentCodeRefactoringProvider)
    • +
    • Introduce format item (AddNewFormatItemCodeRefactoringProvider)
    • +
    • Add null check (AddNullCheckCodeRefactoringProvider)
    • +
    • Add one or more optional parameters to an invocation, using their default values (AddOptionalParameterToInvocationCodeRefactoringProvider)
    • +
    • Check array index value (CheckArrayIndexValueCodeRefactoringProvider)
    • +
    • Check collection index value (CheckCollectionIndexValueCodeRefactoringProvider)
    • +
    • Check dictionary key value (CheckDictionaryKeyValueCodeRefactoringProvider)
    • +
    • Check if parameter is null (CheckIfParameterIsNullCodeRefactoringProvider)
    • +
    • Check StringBuilder index value (CheckStringBuilderIndexValueCodeRefactoringProvider)
    • +
    • Check string index value (CheckStringIndexValueCodeRefactoringProvider)
    • +
    • Compute constant value (ComputeConstantValueCodeRefactoringProvider)
    • +
    • Add a Contract to specify the return value must not be null (ContractEnsuresNotNullReturnCodeRefactoringProvider)
    • +
    • Add a Contract to specify the parameter must not be null (ContractRequiresNotNullCodeRefactoringProvider)
    • +
    • Convert anonymous method to lambda expression (ConvertAnonymousMethodToLambdaCodeRefactoringProvider)
    • +
    • Convert auto-property to computed propertyy (ConvertAutoPropertyToPropertyCodeRefactoringProvider)
    • +
    • Replace bitwise flag comparison with call to 'Enum.HasFlag' (ConvertBitwiseFlagComparisonToHasFlagsCodeRefactoringProvider)
    • +
    • Convert '??' to '?:' (ConvertCoalescingToConditionalExpressionCodeRefactoringProvider)
    • +
    • Convert dec to hex. (ConvertDecToHexCodeRefactoringProvider)
    • +
    • Convert do...while to while (ConvertDoWhileToWhileLoopCodeRefactoringProvider)
    • +
    • Convert '==' to 'object.Equals()' (ConvertEqualityOperatorToEqualsCodeRefactoringProvider)
    • +
    • Convert '==' to 'object.ReferenceEquals()' (ConvertEqualityOperatorToReferenceEqualsCodeRefactoringProvider)
    • +
    • Convert 'Equals' call to '==' or '!=' (ConvertEqualsToEqualityOperatorCodeRefactoringProvider)
    • +
    • Convert explicit to implict implementation (ConvertExplicitToImplicitImplementationCodeRefactoringProvider)
    • +
    • Convert expression body member to statement body (ConvertExpressionBodyToStatementBodyCodeRefactoringProvider)
    • +
    • Convert 'foreach' loop to 'for' (ConvertForeachToForCodeRefactoringProvider)
    • +
    • Convert 'for' loop to 'while' (ConvertForToWhileCodeRefactoringProvider)
    • +
    • Replace 'Enum.HasFlag' call with bitwise flag comparison (ConvertHasFlagsToBitwiseFlagComparisonCodeRefactoringProvider)
    • +
    • Convert hex to dec. (ConvertHexToDecCodeRefactoringProvider)
    • +
    • Convert 'if' to '?:' (ConvertIfStatementToConditionalTernaryExpressionCodeRefactoringProvider)
    • +
    • Convert 'if' to '??' expression (ConvertIfStatementToNullCoalescingExpressionAction)
    • +
    • Convert 'if' to 'return' (ConvertIfStatementToReturnStatementAction)
    • +
    • Convert 'if' to 'switch' (ConvertIfStatementToSwitchStatementCodeRefactoringProvider)
    • +
    • Convert implict to explicit implementation (ConvertImplicitToExplicitImplementationCodeRefactoringProvider)
    • +
    • Convert instance to static method (ConvertInstanceToStaticMethodCodeRefactoringProvider)
    • +
    • Convert string interpolation to 'string.Format' (ConvertInterpolatedStringToStringFormatCodeRefactoringProvider)
    • +
    • Converts expression of lambda body to statement (ConvertLambdaBodyExpressionToStatementCodeRefactoringProvider)
    • +
    • Converts statement of lambda body to expression (ConvertLambdaStatementToExpressionCodeRefactoringProvider)
    • +
    • Convert lambda to anonymous method (ConvertLambdaToAnonymousMethodCodeRefactoringProvider)
    • +
    • Convert method group to anoymous method (ConvertMethodGroupToAnonymousMethodCodeRefactoringProvider)
    • +
    • Convert method group to lambda expression (ConvertMethodGroupToLambdaCodeRefactoringProvider)
    • +
    • Convert '*'/'/' to '<<'/'>>' (ConvertMultiplyToShiftCodeRefactoringProvider)
    • +
    • Convert 'ReferenceEquals' call to '==' or '!=' (ConvertReferenceEqualsToEqualityOperatorCodeRefactoringProvider)
    • +
    • Convert '<<'/'>>' to '*'/'/' (ConvertShiftToMultiplyCodeRefactoringProvider)
    • +
    • Convert statement body member to expression body (ConvertStatementBodyToExpressionBodyCodeRefactoringProvider)
    • +
    • Convert 'string.Format' to string interpolation (ConvertStringFormatToInterpolatedStringCodeRefactoringProvider)
    • +
    • Convert 'switch' to 'if' (ConvertSwitchToIfCodeRefactoringProvider)
    • +
    • Convert 'return' to 'if' (ConvertTernaryExpressionToIfStatementCodeRefactoringProvider)
    • +
    • Convert while loop to do...while (ConvertWhileToDoWhileLoopCodeRefactoringProvider)
    • +
    • Copy comments from base (CopyCommentsFromBaseCodeRefactoringProvider)
    • +
    • Create changed event for property (CreateChangedEventCodeRefactoringProvider)
    • +
    • Create custom event implementation (CreateCustomEventImplementationAction)
    • +
    • Create delegate (CreateDelegateAction)
    • +
    • Create event invocator (CreateEventInvocatorCodeRefactoringProvider)
    • +
    • Create overload without parameter (CreateOverloadWithoutParameterCodeRefactoringProvider)
    • +
    • Extract anonymous method (ExtractAnonymousMethodCodeRefactoringProvider)
    • +
    • Extract field (ExtractWhileConditionToInternalIfStatementCodeRefactoringProvider)
    • +
    • Swap 'Equals' target and argument (FlipEqualsTargetAndArgumentCodeRefactoringProvider)
    • +
    • Flip an operator operands (FlipOperatorArgumentsCodeRefactoringProvider)
    • +
    • Flip an relational operator operands (FlipRelationalOperatorArgumentsCodeRefactoringProvider)
    • +
    • Generate switch labels (GenerateSwitchLabelsCodeRefactoringProvider)
    • +
    • Import static class with using directive in file (ImportStaticClassWithUsingCodeRefactoringProvider)
    • +
    • Initialize auto property from constructor parameter (InitializeAutoPropertyFromConstructorParameterCodeRefactoringProvider)
    • +
    • Initialize field from constructor parameter (InitializeFieldFromConstructorParameterCodeRefactoringProvider)
    • +
    • Insert anonymous method signature (InsertAnonymousMethodSignatureCodeRefactoringProvider)
    • +
    • Invert conditional operator (InvertConditionalOperatorCodeRefactoringProvider)
    • +
    • Invert if (InvertIfCodeRefactoringProvider)
    • +
    • Invert logical expression (InvertLogicalExpressionCodeRefactoringProvider)
    • +
    • Invoke as static method (InvokeAsStaticMethodCodeRefactoringProvider)
    • +
    • Iterate via 'foreach' (IterateViaForeachAction)
    • +
    • Join local variable declaration and assignment (JoinLocalVariableDeclarationAndAssignmentCodeRefactoringProvider)
    • +
    • Join string literal (JoinStringCodeRefactoringProvider)
    • +
    • Merge nested 'if' (MergeNestedIfAction)
    • +
    • Negate 'is' expression (NegateIsExpressionCodeRefactoringProvider)
    • +
    • Negate a relational expression (NegateLogicalExpressionCodeRefactoringProvider)
    • +
    • put inside 'using' (PutInsideUsingAction)
    • +
    • Remove braces (RemoveBracesCodeRefactoringProvider)
    • +
    • 'catch (Exception)' to 'catch' (RemoveCatchExceptionCodeRefactoringProvider)
    • +
    • Remove #region/#endregion directives (RemoveRegionEndRegionDirectivesCodeRefactoringProvider)
    • +
    • Replace assignment with postfix expression (ReplaceAssignmentWithPostfixExpressionCodeRefactoringProvider)
    • +
    • Replace auto-property with property that uses a backing field (ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider)
    • +
    • Convert cast to 'as'. (ReplaceDirectCastWithSafeCastCodeRefactoringProvider)
    • +
    • Replace type with 'var' (ReplaceExplicitTypeWithVarCodeRefactoringProvider)
    • +
    • Replace operator assignment with assignment (ReplaceOperatorAssignmentWithAssignmentCodeRefactoringProvider)
    • +
    • Replace postfix expression with assignment (ReplacePostfixExpressionWithAssignmentCodeRefactoringProvider)
    • +
    • Replace property that uses a backing field with auto-property (ReplacePropertyWithBackingFieldWithAutoPropertyCodeRefactoringProvider)
    • +
    • Convert 'as' to cast. (ReplaceSafeCastWithDirectCastCodeRefactoringProvider)
    • +
    • Replaces 'var' with explicit type specification (ReplaceVarWithExplicitTypeCodeRefactoringProvider)
    • +
    • Replace assignment with operator assignment (ReplaceWithOperatorAssignmentCodeRefactoringProvider)
    • +
    • Reverse the direction of a for (ReverseDirectionForForLoopCodeRefactoringProvider)
    • +
    • Split declaration list (SplitDeclarationListCodeRefactoringProvider)
    • +
    • Split 'if' with '&&' condition in two nested 'if' statements (SplitIfWithAndConditionInTwoCodeRefactoringProvider)
    • +
    • Split 'if' with '||' condition in two 'if' statements (SplitIfWithOrConditionInTwoCodeRefactoringProvider)
    • +
    • Split local variable declaration and assignment (SplitLocalVariableDeclarationAndAssignmentCodeRefactoringProvider)
    • +
    • Split string literal (SplitStringCodeRefactoringProvider)
    • +
    • Make abstract member virtual (ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider)
    • +
    • Use 'as' and check for null (UseAsAndNullCheckCodeRefactoringProvider)
    • +
    • Use string.Format() (UseStringFormatAction)
    • +
    • Use System.Environment.NewLine (UseSystemEnvironmentNewLineCodeRefactoringProvider)
    • +
    • Use string.Empty (UseSystemStringEmptyCodeRefactoringProvider)
    • +
    + + \ No newline at end of file diff --git a/RefactoringEssentials.2017/CodeRefactorings.VB.html b/RefactoringEssentials.2017/CodeRefactorings.VB.html new file mode 100644 index 00000000..199d6d34 --- /dev/null +++ b/RefactoringEssentials.2017/CodeRefactorings.VB.html @@ -0,0 +1,41 @@ + + + + + + + + + +

    Supported Refactorings

    +

    19 code refactorings for Visual Basic

    +
      +
    • Adds another accessor (AddAnotherAccessorCodeRefactoringProvider)
    • +
    • Add check for Nothing (AddCheckForNothingCodeRefactoringProvider)
    • +
    • Check dictionary key value (CheckDictionaryKeyValueCodeRefactoringProvider)
    • +
    • Check if parameter is Nothing (CheckIfParameterIsNothingCodeRefactoringProvider)
    • +
    • Compute constant value (ComputeConstantValueCodeRefactoringProvider)
    • +
    • Convert dec to hex. (ConvertDecToHexCodeRefactoringProvider)
    • +
    • Convert Do...Loop While/Until to Do While/Until...Loop (ConvertDoLoopWhileToDoWhileLoopCodeRefactoringProvider)
    • +
    • Convert Do While/Until...Loop to Do...Loop While/Until (ConvertDoWhileLoopToDoLoopWhileCodeRefactoringProvider)
    • +
    • Convert hex to dec. (ConvertHexToDecCodeRefactoringProvider)
    • +
    • Convert 'If' to 'Select Case' (ConvertIfStatementToSelectCaseStatementCodeRefactoringProvider)
    • +
    • Convert 'Select Case' to 'If' (ConvertSelectCaseToIfCodeRefactoringProvider)
    • +
    • Convert to custom event (ConvertToCustomEventCodeRefactoringProvider)
    • +
    • Copy comments from base (CopyCommentsFromBaseCodeRefactoringProvider)
    • +
    • Create changed event for property (CreateChangedEventCodeRefactoringProvider)
    • +
    • Create overload without parameter (CreateOverloadWithoutParameterCodeRefactoringProvider)
    • +
    • Invert if (InvertIfCodeRefactoringProvider)
    • +
    • Invert logical expression (InvertLogicalExpressionCodeRefactoringProvider)
    • +
    • Convert cast to 'TryCast'. (ReplaceDirectCastWithSafeCastCodeRefactoringProvider)
    • +
    • Convert 'TryCast' to cast. (ReplaceSafeCastWithDirectCastCodeRefactoringProvider)
    • +
    + + \ No newline at end of file diff --git a/RefactoringEssentials.2017/CodeRefactorings.html.template b/RefactoringEssentials.2017/CodeRefactorings.html.template new file mode 100644 index 00000000..d4f4c9bc --- /dev/null +++ b/RefactoringEssentials.2017/CodeRefactorings.html.template @@ -0,0 +1,22 @@ + + + + + + + + + +

    Supported Refactorings

    +

    +
      +
    + + \ No newline at end of file diff --git a/RefactoringEssentials.2017/Images/refactoringessentials-logo32.png b/RefactoringEssentials.2017/Images/refactoringessentials-logo32.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ca515a3e0aa45b4ce223225efb439753fbb696 GIT binary patch literal 1028 zcmV+f1pE7mP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&19eG6K~z{ry_a7|6j2n$UHVHz6cvi@?%aWj zDCni4pa_JZGKzYUD9cvcnGHkK(w(_b5ClO%5d`&S5D^7MP!QFl7L=eq6g@=$qlXBB z2o*uM@2uYG?wzx{qk+LMcE9i3bIzT6@7%Q_m&;9?j4j(Tw%@~fQDMcXxVF5ECcbiB zR9I1wNqXB*;PcUBM-AtfYXF{fg*?o83RYC4tJ*4&o!at$wDZ8sGZTahUEp2BvBX$g&)%9WoAE=01<1Wxm zos8vYGnTi9^K_h~w*yD>L4B-#F6Y<9TIV@&xk`P{|3`(<@d)_h+TOt!{;7asG+Wtf ztaF`X$-S9G*GewN#1-Cd)OZJes~UmnSl(I~PeBg!W~}T6<>{d48u*XF_+)Gztos1% zd~VFKq`v|&5A(4?zR;H~6pTds5cnR9nQNZ+gdEBz;-RKw;TXRO+6cyd#}XbfpKkC$ zCuOJR)A`kp9z78x8lEgv8Wd9FXh|`Va}CQ{7b#6ABydpInEflZ7|+j?-M*O1Wx|Rk zle6av6~z%U&E+y-MHBTloEm;Nm&=4Mj3?l20Ybh>3%NxFVGU11XNr_S`1gbH3AqW{ zOVC$~_A_tbCktxK2M|+9O!NH1zWBdDQf2i-1PvMSP zEQFB#`lSY~1MA&`T&tC)6A}(t{*sAJLL14yt9x{l(dL3j*KMdc;vY4}-tN06h&lz^C4Z$J+0000 +<#@ output extension=".cs" #> +<#@ include file="../../RefactoringEssentials/Versioning.t4.template" #> +<# ReadVersions(Path.Combine(Path.GetDirectoryName(Host.TemplateFile), "../RefactoringEssentials.version")); #> +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyCompany("ICSharpCode")] +[assembly: AssemblyProduct("Refactoring Essentials for Visual Studio 2017")] +[assembly: AssemblyCopyright("Copyright 2010-2016 AlphaSierraPapa and Xamarin Inc.")] +[assembly: AssemblyVersion("<#= generatedFullVersion #>")] +[assembly: AssemblyFileVersion("<#= generatedNuGetVersion #>")] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/RefactoringEssentials.2017/RefactoringEssentials.Library.nuspec b/RefactoringEssentials.2017/RefactoringEssentials.Library.nuspec new file mode 100644 index 00000000..50ed67f1 --- /dev/null +++ b/RefactoringEssentials.2017/RefactoringEssentials.Library.nuspec @@ -0,0 +1,36 @@ + + + + + RefactoringEssentials.Library + 5.0.0 + Refactoring Essentials + IC#Code + IC#Code + https://visualstudiogallery.msdn.microsoft.com/site/68c1575b-e0bf-420d-a94b-1b0f4bcdcbcc/eula?licenseType=None + http://vsrefactoringessentials.com/ + https://raw.githubusercontent.com/icsharpcode/RefactoringEssentials/master/RefactoringEssentials/Images/refactoringessentials-logo32.png + false + Analyzers and Code Fixes as a library, intended for IDE builders + Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 for more information. + Copyright (c) 2014-2016 AlphaSierraPapa + VS 2017 Roslyn Analyzer Refactoring + + + + + + + + + + + + + + + + + + + diff --git a/RefactoringEssentials.2017/RefactoringEssentials.Library.tt b/RefactoringEssentials.2017/RefactoringEssentials.Library.tt new file mode 100644 index 00000000..5cb4ef4c --- /dev/null +++ b/RefactoringEssentials.2017/RefactoringEssentials.Library.tt @@ -0,0 +1,39 @@ +<#@ template debug="false" hostspecific="true" language="C#" #> +<#@ output extension=".nuspec" #> + +<#@ include file="Versioning.t4.template" #> +<# ReadVersions(Path.Combine(Path.GetDirectoryName(Host.TemplateFile), "RefactoringEssentials.version")); #> + + + RefactoringEssentials.Library + <#= generatedNuGetVersion #> + Refactoring Essentials + IC#Code + IC#Code + https://visualstudiogallery.msdn.microsoft.com/site/68c1575b-e0bf-420d-a94b-1b0f4bcdcbcc/eula?licenseType=None + http://vsrefactoringessentials.com/ + https://raw.githubusercontent.com/icsharpcode/RefactoringEssentials/master/RefactoringEssentials/Images/refactoringessentials-logo32.png + false + Analyzers and Code Fixes as a library, intended for IDE builders + Please see <#= releaseNotesLink #> for more information. + <#= copyright #> + VS 2017 Roslyn Analyzer Refactoring + + + + + + + + + + + + + + + + + + + diff --git a/RefactoringEssentials.2017/RefactoringEssentials.csproj b/RefactoringEssentials.2017/RefactoringEssentials.csproj new file mode 100644 index 00000000..2e85264e --- /dev/null +++ b/RefactoringEssentials.2017/RefactoringEssentials.csproj @@ -0,0 +1,1916 @@ + + + + + + 11.0 + Debug + AnyCPU + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + {C465A5DC-AD28-49A2-89C0-F81838814A7E} + Library + Properties + RefactoringEssentials + RefactoringEssentials + Profile7 + v4.5 + ..\ + true + + + + + true + full + false + ..\bin\Debug\ + TRACE;DEBUG + prompt + 4 + false + true + + + pdbonly + true + ..\bin\Release\ + TRACE + prompt + 4 + true + true + + + false + + + false + + + + + + + + Common\CodeContractsCodeRefactoringProvider.cs + + + Common\NotPortedYetAttribute.cs + + + Common\RoslynReflectionUsageAttribute.cs + + + Common\SpecializedCodeRefactoringProvider.cs + + + Converter\CodeConverter.cs + + + Converter\CodeWithOptions.cs + + + Converter\ConversionResult.cs + + + CSharp\CodeFixes\Custom\CS0108UseNewKeywordIfHidingIntendedCodeFixProvider.cs + + + CSharp\CodeFixes\Custom\CS0152DuplicateCaseLabelValueCodeFixProvider.cs + + + CSharp\CodeFixes\Custom\CS0162UnreachableCodeDetectedCodeFixProvider.cs + + + CSharp\CodeFixes\Custom\CS0164LabelHasNotBeenReferencedCodeFixProvider.cs + + + CSharp\CodeFixes\Custom\CS0759RedundantPartialMethodCodeFixProvider.cs + + + CSharp\CodeFixes\Custom\CS1105ExtensionMethodMustBeDeclaredStaticCodeFixProvider.cs + + + CSharp\CodeFixes\Custom\CS1520MethodMustHaveAReturnTypeCodeFixProvider.cs + + + CSharp\CodeFixes\Custom\InvalidConversionCodeFixProvider.cs + + + CSharp\CodeFixes\Custom\ReturnMustNotBeFollowedByAnyExpressionCodeFixProvider.cs + + + CSharp\CodeRefactorings\Custom\AddBracesCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\AddNullCheckCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\AddOptionalParameterToInvocationCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\ConvertBitwiseFlagComparisonToHasFlagsCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\ConvertDoWhileToWhileLoopCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\ConvertForToWhileCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\ConvertHasFlagsToBitwiseFlagComparisonCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\ConvertInterpolatedStringToStringFormatCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\ConvertMultiplyToShiftCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\ConvertShiftToMultiplyCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\ConvertStringFormatToInterpolatedStringCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\ConvertWhileToDoWhileLoopCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\CreateChangedEventCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\ExtractWhileConditionToInternalIfStatementCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\GenerateSwitchLabelsCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\InvertLogicalExpressionCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\NegateIsExpressionCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\RemoveBracesCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\ReplaceAssignmentWithPostfixExpressionCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\ReplaceOperatorAssignmentWithAssignmentCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\ReplacePostfixExpressionWithAssignmentCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\ReplaceWithOperatorAssignmentCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Custom\ReverseDirectionForForLoopCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\AddAnotherAccessorCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\AddCatchExceptionCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\AddExceptionDescriptionCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\AddNameToArgumentCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\AddNewFormatItemCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\CheckArrayIndexValueCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\CheckCollectionIndexValueCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\CheckDictionaryKeyValueCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\CheckIfParameterIsNullCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\CheckStringBuilderIndexValueCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\CheckStringIndexValueCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ComputeConstantValueCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ContractEnsuresNotNullReturnRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ContractRequiresNotNullCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertAnonymousMethodToLambdaCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertAutoPropertyToPropertyCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertCoalescingToConditionalExpressionCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertDecToHexCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertEqualityOperatorToEqualsCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertEqualityOperatorToReferenceEqualsCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertEqualsToEqualityOperatorCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertExplicitToImplicitImplementationCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertExpressionBodyToStatementBodyCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertForeachToForCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertHexToDecCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertIfStatementToConditionalTernaryExpressionCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertIfStatementToSwitchStatementCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertImplicitToExplicitImplementationCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertInstanceToStaticMethodCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertLambdaBodyExpressionToStatementCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertLambdaStatementToExpressionCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertLambdaToAnonymousMethodCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertMethodGroupToAnonymousMethodCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertMethodGroupToLambdaCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertReferenceEqualsToEqualityOperatorCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertStatementBodyToExpressionBodyCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertSwitchToIfCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ConvertTernaryExpressionToIfStatementCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\CopyCommentsFromBaseCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\CreateEventInvocatorCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\FlipEqualsTargetAndArgumentCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\FlipOperatorOperandsCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\FlipRelationalOperatorArgumentsCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ImportStaticClassWithUsingCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\InitializeAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\InitializeFieldFromConstructorParameterCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\InsertAnonymousMethodSignatureCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\InvertConditionalOperatorCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\InvertIfCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\InvokeAsStaticMethodCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\JoinLocalVariableDeclarationAndAssignmentCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\JoinStringCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\MergeNestedIfAction.cs + + + CSharp\CodeRefactorings\Synced\NegateLogicalExpressionCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\RemoveCatchExceptionCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\RemoveRegionEndRegionDirectivesCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ReplaceDirectCastWithSafeCastCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ReplaceExplicitTypeWithVarCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ReplacePropertyWithBackingFieldWithAutoPropertyCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ReplaceSafeCastWithDirectCastCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ReplaceVarWithExplicitTypeCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\SplitDeclarationListCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\SplitIfWithAndConditionInTwoCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\SplitIfWithOrConditionInTwoCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\SplitLocalVariableDeclarationAndAssignmentCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\SplitStringCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\UseAsAndNullCheckCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\UseSystemEnvironmentNewLineCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Synced\UseSystemStringEmptyCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Uncategorized\AutoLinqSumAction.cs + + + CSharp\CodeRefactorings\Uncategorized\ChangeAccessModifierAction.cs + + + CSharp\CodeRefactorings\Uncategorized\ConvertIfStatementToNullCoalescingExpressionAction.cs + + + CSharp\CodeRefactorings\Uncategorized\ConvertIfStatementToReturnStatementAction.cs + + + CSharp\CodeRefactorings\Uncategorized\CreateCustomEventImplementationAction.cs + + + CSharp\CodeRefactorings\Uncategorized\CreateDelegateAction.cs + + + CSharp\CodeRefactorings\Uncategorized\CreateIndexerAction.cs + + + CSharp\CodeRefactorings\Uncategorized\CreateOverloadWithoutParameterCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Uncategorized\ExtractAnonymousMethodCodeRefactoringProvider.cs + + + CSharp\CodeRefactorings\Uncategorized\GenerateGetterAction.cs + + + CSharp\CodeRefactorings\Uncategorized\IntroduceConstantAction.cs + + + CSharp\CodeRefactorings\Uncategorized\IterateViaForeachAction.cs + + + CSharp\CodeRefactorings\Uncategorized\LinqFluentToQueryAction.cs + + + CSharp\CodeRefactorings\Uncategorized\LinqQueryToFluentAction.cs + + + CSharp\CodeRefactorings\Uncategorized\MoveToOuterScopeAction.cs + + + CSharp\CodeRefactorings\Uncategorized\PutInsideUsingAction.cs + + + CSharp\CodeRefactorings\Uncategorized\UseStringFormatAction.cs + + + CSharp\Converter\MethodBodyVisitor.cs + + + CSharp\Converter\NodesVisitor.cs + + + CSharp\Converter\VisualBasicConverter.cs + + + CSharp\ConvertUnitTestToVB.cs + + + CSharp\Diagnostics\CodeActionFactory.cs + + + CSharp\Diagnostics\CSharpDiagnosticIDs.cs + + + CSharp\Diagnostics\Custom\AdditionalOfTypeAnalyzer.cs + + + CSharp\Diagnostics\Custom\AdditionalOfTypeCodeFixProvider.cs + + + CSharp\Diagnostics\Custom\AvoidAsyncVoidAnalyzer.cs + + + CSharp\Diagnostics\Custom\BaseMethodParameterNameMismatchAnalyzer.cs + + + CSharp\Diagnostics\Custom\BaseMethodParameterNameMismatchCodeFixProvider.cs + + + CSharp\Diagnostics\Custom\CallToObjectEqualsViaBaseAnalyzer.cs + + + CSharp\Diagnostics\Custom\CallToObjectEqualsViaBaseCodeFixProvider.cs + + + CSharp\Diagnostics\Custom\CheckNamespaceAnalyzer.cs + + + CSharp\Diagnostics\Custom\ConstantConditionAnalyzer.cs + + + CSharp\Diagnostics\Custom\ConstantConditionCodeFixProvider.cs + + + CSharp\Diagnostics\Custom\ConvertIfToAndExpressionAnalyzer.cs + + + CSharp\Diagnostics\Custom\ConvertIfToAndExpressionCodeFixProvider.cs + + + CSharp\Diagnostics\Custom\LockThisAnalyzer.cs + + + CSharp\Diagnostics\Custom\LockThisCodeFixProvider.cs + + + CSharp\Diagnostics\Custom\NameOfSuggestionAnalyzer.cs + + + CSharp\Diagnostics\Custom\NameOfSuggestionCodeFixProvider.cs + + + CSharp\Diagnostics\Custom\NegativeRelationalExpressionAnalyzer.cs + + + CSharp\Diagnostics\Custom\NegativeRelationalExpressionCodeFixProvider.cs + + + CSharp\Diagnostics\Custom\NotImplementedExceptionAnalyzer.cs + + + CSharp\Diagnostics\Custom\ParameterOnlyAssignedAnalyzer.cs + + + CSharp\Diagnostics\Custom\ParameterOnlyAssignedCodeFixProvider.cs + + + CSharp\Diagnostics\Custom\RedundantAssignmentAnalyzer.cs + + + CSharp\Diagnostics\Custom\RedundantAssignmentCodeFixProvider.cs + + + CSharp\Diagnostics\Custom\RedundantInternalAnalyzer.cs + + + CSharp\Diagnostics\Custom\RedundantInternalCodeFixProvider.cs + + + CSharp\Diagnostics\Custom\RedundantPrivateAnalyzer.cs + + + CSharp\Diagnostics\Custom\RedundantPrivateCodeFixProvider.cs + + + CSharp\Diagnostics\Custom\RoslynUsageAnalyzer.cs + + + CSharp\Diagnostics\Custom\StaticEventSubscriptionAnalyzer.cs + + + CSharp\Diagnostics\Custom\VariableOnlyAssignedAnalyzer.cs + + + CSharp\Diagnostics\Custom\XmlDocAnalyzer.cs + + + CSharp\Diagnostics\DiagnosticAnalyzerCategories.cs + + + CSharp\Diagnostics\DiagnosticAnalyzerMarker.cs + + + CSharp\Diagnostics\DiagnosticCustomTags.cs + + + CSharp\Diagnostics\DiagnosticFactory.cs + + + CSharp\Diagnostics\DocumentChangeAction.cs + + + CSharp\Diagnostics\InsertionAction.cs + + + CSharp\Diagnostics\InsertionResult.cs + + + CSharp\Diagnostics\NRefactoryCodeAction.cs + + + CSharp\Diagnostics\Synced\CodeQuality\BaseMethodCallWithDefaultParameterAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\BitwiseOperatorOnEnumWithoutFlagsAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\CompareNonConstrainedGenericWithNullAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\CompareNonConstrainedGenericWithNullCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\CodeQuality\CompareOfFloatsByEqualityOperatorAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\CompareOfFloatsByEqualityOperatorCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\CodeQuality\ConditionalTernaryEqualBranchAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\ConditionalTernaryEqualBranchCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\CodeQuality\DelegateSubtractionAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\DoNotCallOverridableMethodsInConstructorAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\EmptyGeneralCatchClauseAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\EqualExpressionComparisonAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\EqualExpressionComparisonCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\CodeQuality\EventUnsubscriptionViaAnonymousDelegateAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\ForControlVariableIsNeverModifiedAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\FormatStringProblemAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\FunctionNeverReturnsAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\LocalVariableHidesMemberAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\LongLiteralEndingLowerLAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\LongLiteralEndingLowerLCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\CodeQuality\MemberHidesStaticFromOuterClassAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\MethodOverloadWithOptionalParameterAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\NonReadonlyReferencedInGetHashCodeAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\NotResolvedInTextAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\NotResolvedInTextIssueCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\CodeQuality\ObjectCreationAsStatementAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\OperatorIsCanBeUsedAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\OperatorIsCanBeUsedIssueCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\CodeQuality\OptionalParameterHierarchyMismatchAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\OptionalParameterHierarchyMismatchCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\CodeQuality\OptionalParameterRefOutAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\ParameterHidesMemberAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\PartialMethodParameterNameMismatchAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\PartialMethodParameterNameMismatchCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\CodeQuality\PolymorphicFieldLikeEventInvocationAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\PossibleAssignmentToReadonlyFieldAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\PossibleAssignmentToReadonlyFieldCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\CodeQuality\PossibleMultipleEnumerationAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\PossibleMultipleEnumerationCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\CodeQuality\StaticFieldOrAutoPropertyInGenericTypeAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\ThreadStaticAtInstanceFieldAnalyzer.cs + + + CSharp\Diagnostics\Synced\CodeQuality\ThreadStaticAtInstanceFieldCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\CodeQuality\ValueParameterNotUsedAnalyzer.cs + + + CSharp\Diagnostics\Synced\CompilerWarnings\CS1573ParameterHasNoMatchingParamTagAnalyzer.cs + + + CSharp\Diagnostics\Synced\ConstraintViolations\InconsistentNaming\AffectedEntity.cs + + + CSharp\Diagnostics\Synced\ConstraintViolations\InconsistentNaming\DefaultRules.cs + + + CSharp\Diagnostics\Synced\ConstraintViolations\InconsistentNaming\InconsistentNamingAnalyzer.cs + + + CSharp\Diagnostics\Synced\ConstraintViolations\InconsistentNaming\Modifiers.cs + + + CSharp\Diagnostics\Synced\ConstraintViolations\InconsistentNaming\NamingConventionService.cs + + + CSharp\Diagnostics\Synced\ConstraintViolations\InconsistentNaming\NamingRule.cs + + + CSharp\Diagnostics\Synced\ConstraintViolations\InconsistentNaming\NamingStyle.cs + + + CSharp\Diagnostics\Synced\NUnit\NonPublicMethodWithTestAttributeAnalyzer.cs + + + CSharp\Diagnostics\Synced\NUnit\NonPublicMethodWithTestAttributeCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\Opportunities\ConvertClosureToMethodGroupAnalyzer.cs + + + CSharp\Diagnostics\Synced\Opportunities\ConvertClosureToMethodGroupCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\Opportunities\ConvertConditionalTernaryToNullCoalescingAnalyzer.cs + + + CSharp\Diagnostics\Synced\Opportunities\ConvertConditionalTernaryToNullCoalescingCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\Opportunities\ConvertIfStatementToNullCoalescingExpressionAnalyzer.cs + + + CSharp\Diagnostics\Synced\Opportunities\ConvertIfStatementToNullCoalescingExpressionCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\Opportunities\ConvertIfStatementToSwitchStatementAnalyzer.cs + + + CSharp\Diagnostics\Synced\Opportunities\ConvertIfStatementToSwitchStatementCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\Opportunities\ConvertNullableToShortFormAnalyzer.cs + + + CSharp\Diagnostics\Synced\Opportunities\ConvertNullableToShortFormCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\Opportunities\ConvertToAutoPropertyAnalyzer.cs + + + CSharp\Diagnostics\Synced\Opportunities\ConvertToAutoPropertyCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\Opportunities\ConvertToLambdaExpressionAnalyzer.cs + + + CSharp\Diagnostics\Synced\Opportunities\ConvertToLambdaExpressionCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\Opportunities\ConvertToStaticTypeAnalyzer.cs + + + CSharp\Diagnostics\Synced\Opportunities\ConvertToStaticTypeCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\Opportunities\ForCanBeConvertedToForeachAnalyzer.cs + + + CSharp\Diagnostics\Synced\Opportunities\ForCanBeConvertedToForeachCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\Opportunities\InvokeAsExtensionMethodAnalyzer.cs + + + CSharp\Diagnostics\Synced\Opportunities\InvokeAsExtensionMethodCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\Opportunities\SuggestUseVarKeywordEvidentAnalyzer.cs + + + CSharp\Diagnostics\Synced\Opportunities\SuggestUseVarKeywordEvidentCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\AccessToStaticMemberViaDerivedTypeAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\AccessToStaticMemberViaDerivedTypeCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\BaseMemberHasParamsAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\BaseMemberHasParamsCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ConvertIfDoToWhileAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ConvertIfDoToWhileCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ConvertIfToOrExpressionAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ConvertIfToOrExpressionCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ConvertToConstantAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ConvertToConstantCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\EmptyEmbeddedStatementAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\EmptyEmbeddedStatementCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\FieldCanBeMadeReadOnlyAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\FieldCanBeMadeReadOnlyCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\MemberCanBeMadeStaticAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\MemberCanBeMadeStaticCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ParameterCanBeDeclaredWithBaseTypeAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ParameterCanBeDeclaredWithBaseTypeCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\PossibleMistakenCallToGetTypeAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\PossibleMistakenCallToGetTypeCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\PublicConstructorInAbstractClass.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\PublicConstructorInAbstractClassCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReferenceEqualsWithValueTypeAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReferenceEqualsWithValueTypeCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithFirstOrDefaultAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithFirstOrDefaultCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithLastOrDefaultAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithLastOrDefaultCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeAny.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeAnyCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeCountAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeCountCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeFirstAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeFirstCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeFirstOrDefaultAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeFirstOrDefaultCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeLastAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeLastCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeLastOrDefaultAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeLastOrDefaultCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeLongCountAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeLongCountCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeSingleAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeSingleCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeSingleOrDefaultAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeSingleOrDefaultCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeWhereAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithOfTypeWhereCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSimpleAssignmentAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSimpleAssignmentCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToAnyAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToAnyCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToCountAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToCountFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToFirstAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToFirstCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToFirstOrDefaultAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToFirstOrDefaultCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToLastAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToLastCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToLastOrDefaultAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToLastOrDefaultCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToLongCountAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToLongCountCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToSingleAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToSingleCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToSingleOrDefaultAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithSingleCallToSingleOrDefaultFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithStringIsNullOrEmptyAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\ReplaceWithStringIsNullOrEmptyCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\SimplifyConditionalTernaryExpressionAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\SimplifyConditionalTernaryExpressionCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\SimplifyLinqExpressionAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\SimplifyLinqExpressionCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\StringCompareIsCultureSpecificAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\StringCompareIsCultureSpecificCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\StringCompareToIsCultureSpecificAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\StringCompareToIsCultureSpecificCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\StringEndsWithIsCultureSpecificAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\StringIndexOfIsCultureSpecificAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\StringLastIndexOfIsCultureSpecificAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\StringMethodIsCultureSpecificCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\StringStartsWithIsCultureSpecificAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\UseArrayCreationExpressionAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\UseArrayCreationExpressionCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\UseIsOperatorAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\UseIsOperatorCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\UseMethodAnyAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\UseMethodAnyCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\UseMethodIsInstanceOfTypeAnalyzer.cs + + + CSharp\Diagnostics\Synced\PracticesAndImprovements\UseMethodIsInstanceOfTypeCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\ArrayCreationCanBeReplacedWithArrayInitializerAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\ArrayCreationCanBeReplacedWithArrayInitializerCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\ConditionIsAlwaysTrueOrFalseAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\ConditionIsAlwaysTrueOrFalseCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\ConstantNullCoalescingConditionAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\ConstantNullCoalescingConditionCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\DoubleNegationOperatorAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\DoubleNegationOperatorCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\EmptyStatementAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\EmptyStatementCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\ForStatementConditionIsTrueAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\ForStatementConditionIsTrueCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantAnonymousTypePropertyNameAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantAnonymousTypePropertyNameCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantArgumentDefaultValueAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantArgumentDefaultValueCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantArgumentNameAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantArgumentNameCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantAttributeParenthesesAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantAttributeParenthesesCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantBaseQualifierAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantBaseQualifierCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantBoolCompareAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantBoolCompareCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantCaseLabelAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantCaseLabelCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantCatchClauseAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantCatchClauseCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantCheckBeforeAssignmentAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantCheckBeforeAssignmentCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantCommaInArrayInitializerAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantCommaInArrayInitializerCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantComparisonWithNullAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantComparisonWithNullCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantDelegateCreationAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantDelegateCreationCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantEmptyDefaultSwitchBranchAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantEmptyDefaultSwitchBranchCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantEmptyFinallyBlockAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantEmptyFinallyBlockCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantEnumerableCastCallAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantEnumerableCastCallCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantExplicitArrayCreationAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantExplicitArrayCreationCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantExplicitArraySizeAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantExplicitArraySizeCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantExplicitNullableCreationAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantExplicitNullableCreationCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantExtendsListEntryAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantExtendsListEntryCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantIfElseBlockAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantIfElseBlockCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantLambdaParameterTypeAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantLambdaParameterTypeCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantLambdaSignatureParenthesesAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantLambdaSignatureParenthesesCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantLogicalConditionalExpressionOperandAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantLogicalConditionalExpressionOperandCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantObjectCreationArgumentListAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantObjectCreationArgumentListCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantObjectOrCollectionInitializerAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantObjectOrCollectionInitializerCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantStringToCharArrayCallAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantStringToCharArrayCallCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantTernaryExpressionAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantTernaryExpressionCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantToStringCallAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantToStringCallCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantUnsafeContextAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RedundantUnsafeContextCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RemoveRedundantOrStatementAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\RemoveRedundantOrStatementCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\UnusedAnonymousMethodSignatureAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInCode\UnusedAnonymousMethodSignatureCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\EmptyConstructorAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\EmptyConstructorCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\EmptyDestructorAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\EmptyDestructorCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\EmptyNamespaceAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\EmptyNamespaceCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\EnumUnderlyingTypeIsIntAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\EnumUnderlyingTypeIsIntCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\LocalVariableNotUsedAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\LocalVariableNotUsedCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\PartialTypeWithSinglePartAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\PartialTypeWithSinglePartCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\RedundantBaseConstructorCallAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\RedundantBaseConstructorCallCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\RedundantDefaultFieldInitializerAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\RedundantDefaultFieldInitializerCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\RedundantOverriddenMemberAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\RedundantOverriddenMemberCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\SealedMemberInSealedClassAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\SealedMemberInSealedClassCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\UnusedParameterAnalyzer.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\UnusedParameterCodeFixProvider.cs + + + CSharp\Diagnostics\Synced\RedundanciesInDeclaration\UnusedTypeParameterAnalyzer.cs + + + CSharp\SyntaxExtensions.cs + + + Samples\CSharp\SampleAnalyzer.cs + + + Samples\CSharp\SampleCodeFixProvider.cs + + + Samples\CSharp\SampleCodeRefactoringProvider.cs + + + Util\Analysis\ControlFlow.cs + + + Util\Analysis\ReachabilityAnalysis.cs + + + Util\AnnotationTable.cs + + + Util\CaseCorrector.cs + + + Util\ClassDeclarationSyntaxExtensions.cs + + + Util\CodeFixContextExtensions.cs + + + Util\CommonAccessibilityUtilities.cs + + + Util\CompilationExtensions.cs + + + Util\CompilationUnitSyntaxExtensions.cs + + + Util\CompositieFormatStringParser\CompositeFormatStringParser.cs + + + Util\CompositieFormatStringParser\FormatItem.cs + + + Util\CompositieFormatStringParser\FormatStringSegmentBase.cs + + + Util\CompositieFormatStringParser\IFormatStringError.cs + + + Util\CompositieFormatStringParser\IFormatStringSegment.cs + + + Util\CompositieFormatStringParser\TextSegment.cs + + + Util\CSharpSyntaxContext.cs + + + Util\CSharpUtil.cs + + + Util\EnumerableExtensions.cs + + + Util\ExpressionSyntaxExtensions.cs + + + Util\FindTokenHelper.cs + + + Util\Flow\FlowAnalysis.cs + + + Util\Flow\FlowAnalyzer.cs + + + Util\Flow\FlowLocation.cs + + + Util\Flow\FlowState.cs + + + Util\Flow\NullFlowState.cs + + + Util\FormatStringHelper.cs + + + Util\GeneratedCodeRecognition.cs + + + Util\GettextCatalog.cs + + + Util\HelpLink.cs + + + Util\IAssemblySymbolExtensions.cs + + + Util\INamespaceOrTypeSymbolExtensions.cs + + + Util\ISymbolExtensions.cs + + + Util\ITypeParameterSymbolExtensions.cs + + + Util\ITypeSymbolExtensions.cs + + + Util\Matcher.cs + + + Util\NameGenerator.cs + + + Util\NameProposalService.cs + + + Util\NamespaceDeclarationSyntaxExtensions.cs + + + Util\NameSyntaxComparer.cs + + + Util\NRefactory6Host.cs + + + Util\ObjectExtensions.cs + + + Util\RefactoringHelpers.cs + + + Util\ReflectionCompatibilityExtensions.cs + + + Util\RoslynReflection.cs + + + Util\SignatureComparer.cs + + + Util\SpecializedCollections.cs + + + Util\SpeculationAnalyzer.cs + + + Util\StringExtensions.cs + + + Util\StringPclExtensions.cs + + + Util\SymbolExtensions.cs + + + Util\SyntaxExtensions.cs + + + Util\SyntaxNodeExtensions.cs + + + Util\SyntaxTokenExtensions.cs + + + Util\SyntaxTriviaExtensions.cs + + + Util\SyntaxTriviaListExtensions.cs + + + Util\TokenComparer.cs + + + Util\TypeExtensions.cs + + + Util\TypeGenerator.cs + + + Util\TypeGuessing.cs + + + Util\TypeSyntaxComparer.cs + + + Util\UnicodeNewline.cs + + + Util\UsingsAndExternAliasesDirectiveComparer.cs + + + Util\ValueTuple.cs + + + Util\ValueTuple`2.cs + + + Util\VBSyntaxExtensions.cs + + + Util\VBUtil.cs + + + Util\WordParser.cs + + + VB\CodeRefactorings\AddAnotherAccessorCodeRefactoringProvider.cs + + + VB\CodeRefactorings\AddCheckForNothingCodeRefactoringProvider.cs + + + VB\CodeRefactorings\CheckDictionaryKeyValueCodeRefactoringProvider.cs + + + VB\CodeRefactorings\CheckIfParameterIsNothingCodeRefactoringProvider.cs + + + VB\CodeRefactorings\ComputeConstantValueCodeRefactoringProvider.cs + + + VB\CodeRefactorings\ConvertDecToHexCodeRefactoringProvider.cs + + + VB\CodeRefactorings\ConvertDoLoopWhileToDoWhileLoopCodeRefactoringProvider.cs + + + VB\CodeRefactorings\ConvertDoWhileLoopToDoLoopWhileCodeRefactoringProvider.cs + + + VB\CodeRefactorings\ConvertHexToDecCodeRefactoringProvider.cs + + + VB\CodeRefactorings\ConvertIfStatementToSelectCaseStatementCodeRefactoringProvider.cs + + + VB\CodeRefactorings\ConvertSelectCaseToIfCodeRefactoringProvider.cs + + + VB\CodeRefactorings\ConvertToCustomEventCodeRefactoringProvider.cs + + + VB\CodeRefactorings\CopyCommentsFromBaseCodeRefactoringProvider.cs + + + VB\CodeRefactorings\CreateChangedEventCodeRefactoringProvider.cs + + + VB\CodeRefactorings\CreateOverloadWithoutParameterCodeRefactoringProvider.cs + + + VB\CodeRefactorings\InvertIfCodeRefactoringProvider.cs + + + VB\CodeRefactorings\InvertLogicalExpressionCodeRefactoringProvider.cs + + + VB\CodeRefactorings\ReplaceDirectCastWithSafeCastCodeRefactoringProvider.cs + + + VB\CodeRefactorings\ReplaceSafeCastWithDirectCastCodeRefactoringProvider.cs + + + VB\Converter\ConversionExtensions.cs + + + VB\Converter\CSharpConverter.cs + + + VB\Converter\MethodBodyVisitor.cs + + + VB\Converter\NodesVisitor.cs + + + VB\Diagnostics\Custom\NameOfSuggestionAnalyzer.cs + + + VB\Diagnostics\Custom\NameOfSuggestionCodeFixProvider.cs + + + VB\Diagnostics\Synced\NUnit\NonPublicMethodWithTestAttributeAnalyzer.cs + + + VB\Diagnostics\Synced\NUnit\NonPublicMethodWithTestAttributeCodeFixProvider.cs + + + VB\Diagnostics\VBDiagnosticIDs.cs + + + Xml\AXmlAttribute.cs + + + Xml\AXmlDocument.cs + + + Xml\AXmlElement.cs + + + Xml\AXmlObject.cs + + + Xml\AXmlParser.cs + + + Xml\AXmlReader.cs + + + Xml\AXmlTag.cs + + + Xml\AXmlText.cs + + + Xml\AXmlVisitor.cs + + + Xml\DocumentationElement.cs + + + Xml\IncrementalParserState.cs + + + Xml\InternalDocument.cs + + + Xml\LazyInit.cs + + + Xml\Log.cs + + + Xml\ObjectIterator.cs + + + Xml\ReuseEqualityComparer.cs + + + Xml\SyntaxError.cs + + + Xml\TagMatchingHeuristics.cs + + + Xml\TagReader.cs + + + Xml\TextType.cs + + + Xml\TokenReader.cs + + + Xml\TreeTraversal.cs + + + + True + True + AssemblyInfoBase.tt + + + + + ..\packages\Microsoft.CodeAnalysis.Common.1.2.1\lib\portable-net45+win8\Microsoft.CodeAnalysis.dll + True + + + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.1\lib\portable-net45+win8\Microsoft.CodeAnalysis.CSharp.dll + True + + + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.1\lib\portable-net45+win8\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + True + + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.1\lib\portable-net45+win8\Microsoft.CodeAnalysis.VisualBasic.dll + True + + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.1\lib\portable-net45+win8\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + True + + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.1\lib\portable-net45+win8\Microsoft.CodeAnalysis.Workspaces.dll + True + + + ..\packages\System.Collections.Immutable.1.1.37\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + True + + + ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.AttributedModel.dll + False + + + ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Convention.dll + False + + + ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Hosting.dll + False + + + ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Runtime.dll + False + + + ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.TypedParts.dll + False + + + ..\packages\System.Reflection.Metadata.1.2.0\lib\portable-net45+win8\System.Reflection.Metadata.dll + True + + + + + TextTemplatingFileGenerator + RefactoringEssentials.Library.nuspec + Designer + + + TextTemplatingFileGenerator + RefactoringEssentials.nuspec + Designer + + + buildlibrarypackage.cmd + PreserveNewest + + + buildpackage.cmd + PreserveNewest + + + buildpackages_appveyor.cmd + PreserveNewest + + + Xml\ICSharpCode.NRefactory.Xml.csproj + + + TextTemplatingFileGenerator + AssemblyInfoBase.cs + + + + tools\install.ps1 + PreserveNewest + + + tools\uninstall.ps1 + PreserveNewest + + + Util\Reflection.md + + + + True + True + RefactoringEssentials.Library.tt + + + + True + True + RefactoringEssentials.tt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + $(SolutionDir)\.nuget\NuGet.exe + mono $(NuGet) + + + + + + + + false + ..\..\..\build\bin + 4 + true + + + false + ..\..\..\build\bin + 4 + true + + \ No newline at end of file diff --git a/RefactoringEssentials.2017/RefactoringEssentials.nuspec b/RefactoringEssentials.2017/RefactoringEssentials.nuspec new file mode 100644 index 00000000..ca917405 --- /dev/null +++ b/RefactoringEssentials.2017/RefactoringEssentials.nuspec @@ -0,0 +1,27 @@ + + + + + RefactoringEssentials + 5.0.0 + Refactoring Essentials + IC#Code + IC#Code + https://visualstudiogallery.msdn.microsoft.com/site/68c1575b-e0bf-420d-a94b-1b0f4bcdcbcc/eula?licenseType=None + http://vsrefactoringessentials.com/ + https://raw.githubusercontent.com/icsharpcode/RefactoringEssentials/master/RefactoringEssentials/Images/refactoringessentials-logo32.png + false + Analyzers and Code Fixes for Visual Studio 2017 (Roslyn-based). Intended for build integration. If you need Visual Studio integration only, please check out the VSIX (Visual Studio extension) from our Web site. + + Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 for more information. + + Copyright (c) 2014-2016 AlphaSierraPapa + VS 2017 Roslyn Analyzer Refactoring + true + + + + + + + diff --git a/RefactoringEssentials.2017/RefactoringEssentials.tt b/RefactoringEssentials.2017/RefactoringEssentials.tt new file mode 100644 index 00000000..18c3a0ab --- /dev/null +++ b/RefactoringEssentials.2017/RefactoringEssentials.tt @@ -0,0 +1,30 @@ +<#@ template debug="false" hostspecific="true" language="C#" #> +<#@ output extension=".nuspec" #> + +<#@ include file="Versioning.t4.template" #> +<# ReadVersions(Path.Combine(Path.GetDirectoryName(Host.TemplateFile), "RefactoringEssentials.version")); #> + + + RefactoringEssentials + <#= generatedNuGetVersion #> + Refactoring Essentials + IC#Code + IC#Code + https://visualstudiogallery.msdn.microsoft.com/site/68c1575b-e0bf-420d-a94b-1b0f4bcdcbcc/eula?licenseType=None + http://vsrefactoringessentials.com/ + https://raw.githubusercontent.com/icsharpcode/RefactoringEssentials/master/RefactoringEssentials/Images/refactoringessentials-logo32.png + false + Analyzers and Code Fixes for Visual Studio 2017 (Roslyn-based). Intended for build integration. If you need Visual Studio integration only, please check out the VSIX (Visual Studio extension) from our Web site. + + Please see <#= releaseNotesLink #> for more information. + + <#= copyright #> + VS 2017 Roslyn Analyzer Refactoring + true + + + + + + + diff --git a/RefactoringEssentials.2017/RefactoringEssentials.version b/RefactoringEssentials.2017/RefactoringEssentials.version new file mode 100644 index 00000000..4beffd99 --- /dev/null +++ b/RefactoringEssentials.2017/RefactoringEssentials.version @@ -0,0 +1,4 @@ +nuget_version=5.0.0 +full_version=5.0.0.0 +release_notes_link=https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 +copyright=Copyright (c) 2014-2016 AlphaSierraPapa \ No newline at end of file diff --git a/RefactoringEssentials.2017/Versioning.t4.template b/RefactoringEssentials.2017/Versioning.t4.template new file mode 100644 index 00000000..fe145926 --- /dev/null +++ b/RefactoringEssentials.2017/Versioning.t4.template @@ -0,0 +1,78 @@ +<#@ assembly name="System.Core.dll" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="System.Text" #> +<#@ import namespace="System.IO" #> +<#@ import namespace="System.Collections.Generic" #> +<#+ +string generatedAppVeyorVersion = ""; +string generatedNuGetVersion = ""; +string generatedFullVersion = ""; +string generatedShortVersion = ""; +string generatedRevision = ""; +string releaseNotesLink = ""; +string copyright = ""; + +void ReadVersions(string inputFileName) +{ + if (File.Exists(inputFileName)) + { + try + { + string[] settings = File.ReadAllLines(inputFileName); + foreach (string setting in settings) + { + string[] settingParts = setting.Split(new char[] { '=' }, 2); + switch (settingParts[0]) + { + case "release_notes_link": + if (settingParts.Length > 1) + { + releaseNotesLink = settingParts[1]; + } + break; + + case "copyright": + if (settingParts.Length > 1) + { + copyright = settingParts[1]; + } + break; + + case "nuget_version": + if (settingParts.Length > 1) + { + generatedNuGetVersion = settingParts[1]; + } + break; + + case "full_version": + if (settingParts.Length > 1) + { + generatedFullVersion = settingParts[1]; + if (!string.IsNullOrEmpty(generatedFullVersion)) + { + Version version = new Version(generatedFullVersion); + generatedShortVersion = string.Format("{0}.{1}.{2}", version.Major, version.Minor, version.Build); + generatedAppVeyorVersion = string.Format("{0}.{1}", version.Major, version.Minor); + } + } + break; + } + } + } + catch (Exception) + { + } + + if (File.Exists(Path.Combine(Path.Combine(Path.GetDirectoryName(Host.TemplateFile), "bin"), "__debug.versioning"))) + { + DateTime now = DateTime.Now; + generatedRevision = ((int) (((now - (new DateTime(now.Year, 1, 1))).TotalMinutes / 20) + ((now.Year - 2016) * 10000))).ToString(); + } + else + { + generatedRevision = "0"; + } + } +} +#> \ No newline at end of file diff --git a/RefactoringEssentials.2017/missing.md b/RefactoringEssentials.2017/missing.md new file mode 100644 index 00000000..31ea15dc --- /dev/null +++ b/RefactoringEssentials.2017/missing.md @@ -0,0 +1,57 @@ +Things not ported yet +===================== + +*Refactorings* + +**C#** + +* AutoLinqSumAction +* ChangeAccessModifierAction +* CreateIndexerAction +* GenerateGetterAction +* IntroduceConstantAction +* LinqFluentToQueryAction +* LinqQueryToFluentAction +* MoveToOuterScopeAction + +*Analyzers* + +**C#** + +* AdditionalOfTypeAnalyzer +* CheckNamespaceAnalyzer +* ConvertIfStatementToNullCoalescingExpressionAnalyzer +* ConvertToAutoPropertyAnalyzer +* ConvertToConstantAnalyzer +* ConvertToLambdaExpressionAnalyzer +* ForCanBeConvertedToForeachAnalyzer +* LockThisAnalyzer +* NegativeRelationalExpressionAnalyzer +* OptionalParameterHierarchyMismatchAnalyzer +* ParameterCanBeDeclaredWithBaseTypeAnalyzer +* PolymorphicFieldLikeEventInvocationAnalyzer +* PossibleAssignmentToReadonlyFieldAnalyzer +* PossibleMultipleEnumerationAnalyzer +* RedundantArgumentDefaultValueAnalyzer +* RedundantAssignmentAnalyzer +* RedundantBoolCompareAnalyzer +* RedundantCatchClauseAnalyzer +* RedundantComparisonWithNullAnalyzer +* RedundantEnumerableCastCallAnalyzer +* RedundantExplicitArrayCreationAnalyzer +* RedundantExtendsListEntryAnalyzer +* RedundantLambdaParameterTypeAnalyzer +* RedundantLambdaSignatureParenthesesAnalyzer +* RedundantLogicalConditionalExpressionOperandAnalyzer +* RedundantObjectOrCollectionInitializerAnalyzer +* RedundantOverriddenMemberAnalyzer +* ReferenceEqualsWithValueTypeAnalyzer +* SimplifyLinqExpressionAnalyzer +* StaticEventSubscriptionAnalyzer +* StringCompareIsCultureSpecificAnalyzer +* UnusedAnonymousMethodSignatureAnalyzer +* UseArrayCreationExpressionAnalyzer +* UseIsOperatorAnalyzer +* UseMethodAnyAnalyzer +* UseMethodIsInstanceOfTypeAnalyzer + diff --git a/RefactoringEssentials.2017/packages.config b/RefactoringEssentials.2017/packages.config new file mode 100644 index 00000000..884cb6ff --- /dev/null +++ b/RefactoringEssentials.2017/packages.config @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Tests.2017/Properties/AssemblyInfo.cs b/Tests.2017/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..ce28e079 --- /dev/null +++ b/Tests.2017/Properties/AssemblyInfo.cs @@ -0,0 +1,5 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("Tests for Refactoring Essentials")] diff --git a/Tests.2017/Tests.csproj b/Tests.2017/Tests.csproj new file mode 100644 index 00000000..95959719 --- /dev/null +++ b/Tests.2017/Tests.csproj @@ -0,0 +1,1119 @@ + + + + + Debug + AnyCPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921} + Library + RefactoringEssentials.Tests + v4.5.2 + ..\ + true + + + + + + true + full + false + ..\bin\Debug\ + DEBUG;UNIMPLEMENTED_CONVERTER_FEATURE_TESTS + prompt + 4 + false + RefactoringEssentials.Tests + + + full + true + ..\bin\Release\ + prompt + 4 + false + RefactoringEssentials.Tests + + + false + bin\Debug_Mono + 4 + Tests + + + false + bin\Mono_Release + 4 + Tests + + + false + + + + + + + + ..\packages\Microsoft.CodeAnalysis.Common.1.2.1\lib\net45\Microsoft.CodeAnalysis.dll + True + + + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.1\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + True + + + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.1\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + True + + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + True + + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + True + + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + True + + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + True + + + + + ..\packages\System.Collections.Immutable.1.1.37\lib\dotnet\System.Collections.Immutable.dll + True + + + + ..\packages\System.Reflection.Metadata.1.2.0\lib\portable-net45+win8\System.Reflection.Metadata.dll + True + + + + + + ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.AttributedModel.dll + + + ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Convention.dll + + + ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Hosting.dll + + + ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Runtime.dll + + + ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.TypedParts.dll + + + ..\packages\NUnit.3.0.1\lib\net45\nunit.framework.dll + + + + + Properties\AssemblyInfoBase.cs + AssemblyInfoBase.tt + True + True + + + Common\CodeFixTestBase.cs + + + Common\CodeRefactoringTestBase.cs + + + Common\ConverterTestBase.cs + + + Common\DiagnosticTestBase.cs + + + Common\Utils.cs + + + CSharp\CodeFixes\CS0108UseNewKeywordIfHidingIntendedTests.cs + + + CSharp\CodeFixes\CS0152DuplicateCaseLabelValueTests.cs + + + CSharp\CodeFixes\CS0164LabelHasNotBeenReferencedTests.cs + + + CSharp\CodeFixes\CS0759RedundantPartialMethodTests.cs + + + CSharp\CodeFixes\CS1105ExtensionMethodMustBeDeclaredStaticTests.cs + + + CSharp\CodeFixes\CS1520MethodMustHaveAReturnTypeTests.cs + + + CSharp\CodeFixes\CSharpCodeFixTestBase.cs + + + CSharp\CodeFixes\InvalidConversionTests.cs + + + CSharp\CodeFixes\ReturnMustNotBeFollowedByAnyExpressionCodeFixProviderTests.cs + + + CSharp\CodeFixes\UnreachableCodeTests.cs + + + CSharp\CodeRefactorings\AddAnotherAccessorTests.cs + + + CSharp\CodeRefactorings\AddArgumentNameTests.cs + + + CSharp\CodeRefactorings\AddBracesTests.cs + + + CSharp\CodeRefactorings\AddCatchExceptionTests.cs + + + CSharp\CodeRefactorings\AddExceptionDescriptionTests.cs + + + CSharp\CodeRefactorings\AddNullCheckTests.cs + + + CSharp\CodeRefactorings\AddOptionalParameterToInvocationTests.cs + + + CSharp\CodeRefactorings\AutoLinqSumTests.cs + + + CSharp\CodeRefactorings\ChangeAccessModifierTests.cs + + + CSharp\CodeRefactorings\CheckArrayIndexValueTests.cs + + + CSharp\CodeRefactorings\CheckCollectionIndexValueTests.cs + + + CSharp\CodeRefactorings\CheckDictionaryKeyValueTests.cs + + + CSharp\CodeRefactorings\CheckIfParameterIsNullTests.cs + + + CSharp\CodeRefactorings\CheckStringBuilderIndexValueTests.cs + + + CSharp\CodeRefactorings\CheckStringIndexValueTests.cs + + + CSharp\CodeRefactorings\ComputeConstantValueTests.cs + + + CSharp\CodeRefactorings\ContractEnsuresNotNullReturnTests.cs + + + CSharp\CodeRefactorings\ContractRequiresNotNullTests.cs + + + CSharp\CodeRefactorings\ConvertAnonymousMethodToLambdaTests.cs + + + CSharp\CodeRefactorings\ConvertAutoPropertyToPropertyTests.cs + + + CSharp\CodeRefactorings\ConvertBitwiseFlagComparisonToHasFlagsTests.cs + + + CSharp\CodeRefactorings\ConvertCoalescingToConditionalExpressionTests.cs + + + CSharp\CodeRefactorings\ConvertDecToHexTests.cs + + + CSharp\CodeRefactorings\ConvertDoWhileToWhileLoopTests.cs + + + CSharp\CodeRefactorings\ConvertEqualityOperatorToEqualsTests.cs + + + CSharp\CodeRefactorings\ConvertEqualityOperatorToReferenceEqualsTests.cs + + + CSharp\CodeRefactorings\ConvertEqualsToEqualityOperatorTests.cs + + + CSharp\CodeRefactorings\ConvertExplicitToImplicitImplementationTests.cs + + + CSharp\CodeRefactorings\ConvertExpressionBodyToStatementBodyTests.cs + + + CSharp\CodeRefactorings\ConvertForeachToForTests.cs + + + CSharp\CodeRefactorings\ConvertForToWhileTests.cs + + + CSharp\CodeRefactorings\ConvertHasFlagsToBitwiseFlagComparisonTests.cs + + + CSharp\CodeRefactorings\ConvertHexToDecTests.cs + + + CSharp\CodeRefactorings\ConvertIfStatementToConditionalTernaryExpressionTests.cs + + + CSharp\CodeRefactorings\ConvertIfStatementToNullCoalescingExpressionActionTests.cs + + + CSharp\CodeRefactorings\ConvertIfStatementToReturnStatementActionTests.cs + + + CSharp\CodeRefactorings\ConvertIfStatementToSwitchStatementTests.cs + + + CSharp\CodeRefactorings\ConvertImplicitToExplicittImplementationTests.cs + + + CSharp\CodeRefactorings\ConvertInstanceToStaticMethodCodeRefactoringTests.cs + + + CSharp\CodeRefactorings\ConvertInterpolatedStringToStringFormatTests.cs + + + CSharp\CodeRefactorings\ConvertLambdaBodyExpressionToStatementTests.cs + + + CSharp\CodeRefactorings\ConvertLambdaStatementToExpressionTests.cs + + + CSharp\CodeRefactorings\ConvertLamdaToAnonymousMethodTests.cs + + + CSharp\CodeRefactorings\ConvertMethodGroupToAnonymousMethodTests.cs + + + CSharp\CodeRefactorings\ConvertMethodGroupToLambdaTests.cs + + + CSharp\CodeRefactorings\ConvertMultiplyToShiftTests.cs + + + CSharp\CodeRefactorings\ConvertReferenceEqualsToEqualityOperatorTests.cs + + + CSharp\CodeRefactorings\ConvertShiftToMultiplyTests.cs + + + CSharp\CodeRefactorings\ConvertStatementBodyToExpressionBodyTests.cs + + + CSharp\CodeRefactorings\ConvertStringFormatToInterpolatedStringTests.cs + + + CSharp\CodeRefactorings\ConvertSwitchToIfTests.cs + + + CSharp\CodeRefactorings\ConvertTernaryExpressionToIfStatementCodeRefactoringProviderTests.cs + + + CSharp\CodeRefactorings\ConvertWhileToDoWhileLoopTests.cs + + + CSharp\CodeRefactorings\CopyCommentsFromBaseTests.cs + + + CSharp\CodeRefactorings\CreateChangedEventTests.cs + + + CSharp\CodeRefactorings\CreateCustomEventImplementationTests.cs + + + CSharp\CodeRefactorings\CreateDelegateTests.cs + + + CSharp\CodeRefactorings\CreateEventInvocatorTests.cs + + + CSharp\CodeRefactorings\CreateIndexerTests.cs + + + CSharp\CodeRefactorings\CreateOverloadWithoutParameterTests.cs + + + CSharp\CodeRefactorings\CSharpCodeRefactoringTestBase.cs + + + CSharp\CodeRefactorings\ExtractAnonymousMethodTests.cs + + + CSharp\CodeRefactorings\ExtractWhileConditionToInternalIfStatementTests.cs + + + CSharp\CodeRefactorings\FlipEqualsTargetAndArgumentTests.cs + + + CSharp\CodeRefactorings\FlipOperatorArguments.cs + + + CSharp\CodeRefactorings\FlipRelationalOperatorArgumentsTests.cs + + + CSharp\CodeRefactorings\GenerateGetterTests.cs + + + CSharp\CodeRefactorings\GenerateSwitchLabelsTests.cs + + + CSharp\CodeRefactorings\ImportStaticClassWithUsingTests.cs + + + CSharp\CodeRefactorings\InitializeAutoPropertyFromConstructorParameterTests.cs + + + CSharp\CodeRefactorings\InitializeFieldFromConstructorParameterTests.cs + + + CSharp\CodeRefactorings\InsertAnonymousMethodSignatureTests.cs + + + CSharp\CodeRefactorings\IntroduceConstantTests.cs + + + CSharp\CodeRefactorings\IntroduceFormatItemTests.cs + + + CSharp\CodeRefactorings\InvertConditionalOperatorTests.cs + + + CSharp\CodeRefactorings\InvertIfTests.cs + + + CSharp\CodeRefactorings\InvertLogicalExpressionTests.cs + + + CSharp\CodeRefactorings\InvokeAsStaticMethodTests.cs + + + CSharp\CodeRefactorings\IterateViaForeachTests.cs + + + CSharp\CodeRefactorings\JoinLocalVariableDeclarationAndAssignmentTests.cs + + + CSharp\CodeRefactorings\JoinStringTests.cs + + + CSharp\CodeRefactorings\LinqFluentToQueryTests.cs + + + CSharp\CodeRefactorings\LinqQueryToFluentTests.cs + + + CSharp\CodeRefactorings\MergeNestedIfTests.cs + + + CSharp\CodeRefactorings\MoveToOuterScopeTests.cs + + + CSharp\CodeRefactorings\NegateIsExpressionTests.cs + + + CSharp\CodeRefactorings\NegateLogicalExpressionTests.cs + + + CSharp\CodeRefactorings\PutInsideUsingTests.cs + + + CSharp\CodeRefactorings\RemoveBracesTests.cs + + + CSharp\CodeRefactorings\RemoveCatchExceptionTests.cs + + + CSharp\CodeRefactorings\RemoveRegionEndRegionDirectivesTests.cs + + + CSharp\CodeRefactorings\ReplaceAssignmentWithPostfixExpressionTests.cs + + + CSharp\CodeRefactorings\ReplaceAutoPropertyWithPropertyAndBackingFieldTests.cs + + + CSharp\CodeRefactorings\ReplaceDirectCastWithSafeCastTest.cs + + + CSharp\CodeRefactorings\ReplaceExplicitTypeWithVarTests.cs + + + CSharp\CodeRefactorings\ReplaceOperatorAssignmentWithAssignmentTests.cs + + + CSharp\CodeRefactorings\ReplacePostfixExpressionWithAssignmentTests.cs + + + CSharp\CodeRefactorings\ReplacePropertyWithBackingFieldWithAutoPropertyTests.cs + + + CSharp\CodeRefactorings\ReplaceSafeCastWithDirectCastTests.cs + + + CSharp\CodeRefactorings\ReplaceVarWithExplicitTypeTests.cs + + + CSharp\CodeRefactorings\ReplaceWithOperatorAssignmentTests.cs + + + CSharp\CodeRefactorings\ReverseDirectionForForLoopTests.cs + + + CSharp\CodeRefactorings\SplitIfWithAndConditionInTwoTests.cs + + + CSharp\CodeRefactorings\SplitIfWithOrConditionInTwoTests.cs + + + CSharp\CodeRefactorings\SplitLocalVariableDeclarationAndAssignmentTests.cs + + + CSharp\CodeRefactorings\SplitStringTests.cs + + + CSharp\CodeRefactorings\SplitVariableIntoSeveralOnesTests.cs + + + CSharp\CodeRefactorings\ToAbstractVirtualNonVirtualConversionTests.cs + + + CSharp\CodeRefactorings\UseAsAndNullCheckTests.cs + + + CSharp\CodeRefactorings\UseStringFormatTests.cs + + + CSharp\CodeRefactorings\UseSystemEnvironmentNewLineTests.cs + + + CSharp\CodeRefactorings\UseSystemStringEmptyTests.cs + + + CSharp\Diagnostics\AccessToStaticMemberViaDerivedTypeTests.cs + + + CSharp\Diagnostics\AdditionalOfTypeTests.cs + + + CSharp\Diagnostics\ArrayCreationCanBeReplacedWithArrayInitializerTests.cs + + + CSharp\Diagnostics\AvoidAsyncVoidTests.cs + + + CSharp\Diagnostics\BaseMemberHasParamsTests.cs + + + CSharp\Diagnostics\BaseMethodCallWithDefaultParameterTests.cs + + + CSharp\Diagnostics\BaseMethodParameterNameMismatchTests.cs + + + CSharp\Diagnostics\BitwiseOperatorOnEnumWithoutFlagsTests.cs + + + CSharp\Diagnostics\CallToObjectEqualsViaBaseTests.cs + + + CSharp\Diagnostics\CheckNamespaceTests.cs + + + CSharp\Diagnostics\CompareNonConstrainedGenericWithNullTests.cs + + + CSharp\Diagnostics\CompareOfFloatsByEqualityOperatorTests.cs + + + CSharp\Diagnostics\ConditionalTernaryEqualBranchTests.cs + + + CSharp\Diagnostics\ConditionIsAlwaysTrueOrFalseTests.cs + + + CSharp\Diagnostics\ConstantConditionTests.cs + + + CSharp\Diagnostics\ConstantNullCoalescingConditionTests.cs + + + CSharp\Diagnostics\ConvertClosureToMethodGroupTests.cs + + + CSharp\Diagnostics\ConvertConditionalTernaryToNullCoalescingTests.cs + + + CSharp\Diagnostics\ConvertIfDoToWhileTests.cs + + + CSharp\Diagnostics\ConvertIfStatementToSwitchStatementTests.cs + + + CSharp\Diagnostics\ConvertIfToAndExpressionTests.cs + + + CSharp\Diagnostics\ConvertIfToOrExpressionTests.cs + + + CSharp\Diagnostics\ConvertNullableToShortFormTests.cs + + + CSharp\Diagnostics\ConvertToAutoPropertyTests.cs + + + CSharp\Diagnostics\ConvertToConstantTests.cs + + + CSharp\Diagnostics\ConvertToLambdaExpressionTests.cs + + + CSharp\Diagnostics\ConvertToStaticTypeTests.cs + + + CSharp\Diagnostics\CS1573ParameterHasNoMatchingParamTagTests.cs + + + CSharp\Diagnostics\CSharpDiagnosticTestBase.cs + + + CSharp\Diagnostics\DelegateSubtractionTests.cs + + + CSharp\Diagnostics\DoNotCallOverridableMethodsInConstructorTests.cs + + + CSharp\Diagnostics\DoubleNegationOperatorTests.cs + + + CSharp\Diagnostics\EmptyConstructorTests.cs + + + CSharp\Diagnostics\EmptyDestructorTests.cs + + + CSharp\Diagnostics\EmptyEmbeddedStatementTests.cs + + + CSharp\Diagnostics\EmptyGeneralCatchClauseTests.cs + + + CSharp\Diagnostics\EmptyNamespaceTests.cs + + + CSharp\Diagnostics\EmptyStatementIssueTests.cs + + + CSharp\Diagnostics\EnumUnderlyingTypeIsIntTests.cs + + + CSharp\Diagnostics\EqualExpressionComparisonTests.cs + + + CSharp\Diagnostics\EventUnsubscriptionViaAnonymousDelegateTests.cs + + + CSharp\Diagnostics\FieldCanBeMadeReadOnlyTests.cs + + + CSharp\Diagnostics\ForCanBeConvertedToForeachTests.cs + + + CSharp\Diagnostics\ForControlVariableIsNeverModifiedTests.cs + + + CSharp\Diagnostics\FormatStringProblemTests.cs + + + CSharp\Diagnostics\ForStatementConditionIsTrueTests.cs + + + CSharp\Diagnostics\FunctionNeverReturnsTests.cs + + + CSharp\Diagnostics\LocalVariableHidesMemberTests.cs + + + CSharp\Diagnostics\LocalVariableNotUsedIssueTests.cs + + + CSharp\Diagnostics\LockThisTests.cs + + + CSharp\Diagnostics\LongLiteralEndingLowerLTests.cs + + + CSharp\Diagnostics\MemberCanBeMadeStaticTests.cs + + + CSharp\Diagnostics\MemberHidesStaticFromOuterClassTests.cs + + + CSharp\Diagnostics\MethodOverloadWithOptionalParameterTests.cs + + + CSharp\Diagnostics\NameOfSuggestionTests.cs + + + CSharp\Diagnostics\NegativeRelationalExpressionTests.cs + + + CSharp\Diagnostics\NonPublicMethodWithTestAttributeTests.cs + + + CSharp\Diagnostics\NonReadonlyReferencedInGetHashCodeTests.cs + + + CSharp\Diagnostics\NotImplementedExceptionInspectorTests.cs + + + CSharp\Diagnostics\NotResolvedInTextTests.cs + + + CSharp\Diagnostics\ObjectCreationAsStatementTests.cs + + + CSharp\Diagnostics\OperatorIsCanBeUsedTests.cs + + + CSharp\Diagnostics\OptionalParameterHierarchyMismatchTests.cs + + + CSharp\Diagnostics\OptionalParameterRefOutTests.cs + + + CSharp\Diagnostics\ParameterCanBeDemotedIssue\ParameterCanBeDeclaredWithBaseTypeIssueTests.cs + + + CSharp\Diagnostics\ParameterHidesMemberTests.cs + + + CSharp\Diagnostics\ParameterOnlyAssignedTests.cs + + + CSharp\Diagnostics\PartialMethodParameterNameMismatchTests.cs + + + CSharp\Diagnostics\PartialTypeWithSinglePartTests.cs + + + CSharp\Diagnostics\PolymorphicFieldLikeEventInvocationTests.cs + + + CSharp\Diagnostics\PossibleAssignmentToReadonlyFieldTests.cs + + + CSharp\Diagnostics\PossibleMistakenCallToGetTypeTests.cs + + + CSharp\Diagnostics\PossibleMultipleEnumerationTests.cs + + + CSharp\Diagnostics\PublicConstructorInAbstractClassTests.cs + + + CSharp\Diagnostics\RedundantAnonymousTypePropertyNameTests.cs + + + CSharp\Diagnostics\RedundantArgumentDefaultValueTests.cs + + + CSharp\Diagnostics\RedundantArgumentNameTests.cs + + + CSharp\Diagnostics\RedundantAssignmentIssueTests.cs + + + CSharp\Diagnostics\RedundantAttributeParenthesesTests.cs + + + CSharp\Diagnostics\RedundantBaseConstructorTests.cs + + + CSharp\Diagnostics\RedundantBaseQualifierTests.cs + + + CSharp\Diagnostics\RedundantBoolCompareTests.cs + + + CSharp\Diagnostics\RedundantCaseLabelTests.cs + + + CSharp\Diagnostics\RedundantCatchClauseTests.cs + + + CSharp\Diagnostics\RedundantCheckBeforeAssignmentTests.cs + + + CSharp\Diagnostics\RedundantCommaInArrayInitializerTests.cs + + + CSharp\Diagnostics\RedundantComparisonWithNullTests.cs + + + CSharp\Diagnostics\RedundantDefaultFieldInitializerTests.cs + + + CSharp\Diagnostics\RedundantDelegateCreationTests.cs + + + CSharp\Diagnostics\RedundantEmptyDefaultSwitchBranchTests.cs + + + CSharp\Diagnostics\RedundantEmptyFinallyBlockTests.cs + + + CSharp\Diagnostics\RedundantEnumerableCastCallTests.cs + + + CSharp\Diagnostics\RedundantExplicitArrayCreationTests.cs + + + CSharp\Diagnostics\RedundantExplicitArraySizeTests.cs + + + CSharp\Diagnostics\RedundantExplicitNullableCreationTests.cs + + + CSharp\Diagnostics\RedundantExtendsListEntryTests.cs + + + CSharp\Diagnostics\RedundantIfElseBlockTests.cs + + + CSharp\Diagnostics\RedundantInternalInspectorTests.cs + + + CSharp\Diagnostics\RedundantLambdaParameterTypeTests.cs + + + CSharp\Diagnostics\RedundantLambdaSignatureParenthesesTests.cs + + + CSharp\Diagnostics\RedundantLogicalConditionalExpressionOperandTests.cs + + + CSharp\Diagnostics\RedundantObjectCreationArgumentListTests.cs + + + CSharp\Diagnostics\RedundantObjectOrCollectionInitializerTests.cs + + + CSharp\Diagnostics\RedundantOverriddenMemberTests.cs + + + CSharp\Diagnostics\RedundantPrivateInspectorTests.cs + + + CSharp\Diagnostics\RedundantStringToCharArrayCallTests.cs + + + CSharp\Diagnostics\RedundantTernaryExpressionTests.cs + + + CSharp\Diagnostics\RedundantToStringCallTests.cs + + + CSharp\Diagnostics\RedundantUnsafeContextTests.cs + + + CSharp\Diagnostics\ReferenceEqualsWithValueTypeTests.cs + + + CSharp\Diagnostics\RemoveRedundantOrStatementTests.cs + + + CSharp\Diagnostics\ReplaceWithFirstOrDefaultTests.cs + + + CSharp\Diagnostics\ReplaceWithLastOrDefaultTests.cs + + + CSharp\Diagnostics\ReplaceWithOfTypeAnyTests.cs + + + CSharp\Diagnostics\ReplaceWithOfTypeCountTests.cs + + + CSharp\Diagnostics\ReplaceWithOfTypeFirstOrDefaultTests.cs + + + CSharp\Diagnostics\ReplaceWithOfTypeFirstTests.cs + + + CSharp\Diagnostics\ReplaceWithOfTypeLastOrDefaultTests.cs + + + CSharp\Diagnostics\ReplaceWithOfTypeLastTests.cs + + + CSharp\Diagnostics\ReplaceWithOfTypeLongCountTests.cs + + + CSharp\Diagnostics\ReplaceWithOfTypeSingleOrDefaultTests.cs + + + CSharp\Diagnostics\ReplaceWithOfTypeSingleTests.cs + + + CSharp\Diagnostics\ReplaceWithOfTypeTests.cs + + + CSharp\Diagnostics\ReplaceWithOfTypeWhereTests.cs + + + CSharp\Diagnostics\ReplaceWithSimpleAssignmentTests.cs + + + CSharp\Diagnostics\ReplaceWithSingleCallToCountTests.cs + + + CSharp\Diagnostics\ReplaceWithSingleCallToFirstOrDefaultTests.cs + + + CSharp\Diagnostics\ReplaceWithSingleCallToFirstTests.cs + + + CSharp\Diagnostics\ReplaceWithSingleCallToLastOrDefaultTests.cs + + + CSharp\Diagnostics\ReplaceWithSingleCallToLastTests.cs + + + CSharp\Diagnostics\ReplaceWithSingleCallToLongCountTests.cs + + + CSharp\Diagnostics\ReplaceWithSingleCallToSingleOrDefaultTests.cs + + + CSharp\Diagnostics\ReplaceWithSingleCallToSingleTests.cs + + + CSharp\Diagnostics\ReplaceWithStringIsNullOrEmptyTests.cs + + + CSharp\Diagnostics\RoslynUsageTests.cs + + + CSharp\Diagnostics\SealedMemberInSealedClassTests.cs + + + CSharp\Diagnostics\SimplifyConditionalTernaryExpressionTests.cs + + + CSharp\Diagnostics\StaticConstructorParameterTests.cs + + + CSharp\Diagnostics\StaticEventSubscriptionTests.cs + + + CSharp\Diagnostics\StaticFieldOrAutoPropertyInGenericTypeTests.cs + + + CSharp\Diagnostics\StaticMethodInvocationToExtensionMethodInvocationTests.cs + + + CSharp\Diagnostics\StringCompareIsCultureSpecificTests.cs + + + CSharp\Diagnostics\StringCompareToIsCultureSpecificTests.cs + + + CSharp\Diagnostics\StringEndsWithIsCultureSpecificTests.cs + + + CSharp\Diagnostics\StringIndexOfIsCultureSpecificTests.cs + + + CSharp\Diagnostics\StringLastIndexOfIsCultureSpecificTests.cs + + + CSharp\Diagnostics\StringStartsWithIsCultureSpecificTests.cs + + + CSharp\Diagnostics\SuggestUseVarKeywordEvidentTests.cs + + + CSharp\Diagnostics\ThreadStaticAtInstanceFieldTests.cs + + + CSharp\Diagnostics\UnusedAnonymousMethodSignatureTests.cs + + + CSharp\Diagnostics\UnusedParameterTests.cs + + + CSharp\Diagnostics\UnusedTypeParameterTests.cs + + + CSharp\Diagnostics\UseArrayCreationExpressionTests.cs + + + CSharp\Diagnostics\UseIsOperatorTests.cs + + + CSharp\Diagnostics\UseMethodAnyTests.cs + + + CSharp\Diagnostics\UseMethodIsInstanceOfTypeTests.cs + + + CSharp\Diagnostics\ValueParameterNotUsedTests.cs + + + CSharp\Diagnostics\XmlDocTests.cs + + + Samples\CSharp\SampleCodeRefactoringTests.cs + + + SymbolChecksTest.cs + + + VB\CodeRefactorings\AddAnotherAccessorTests.cs + + + VB\CodeRefactorings\AddCheckForNothingTests.cs + + + VB\CodeRefactorings\CheckDictionaryKeyValueTests.cs + + + VB\CodeRefactorings\CheckIfParameterIsNothingTests.cs + + + VB\CodeRefactorings\ComputeConstantValueTests.cs + + + VB\CodeRefactorings\ConvertDecToHexTests.cs + + + VB\CodeRefactorings\ConvertDoLoopWhileToDoWhileLoopTests.cs + + + VB\CodeRefactorings\ConvertDoWhileLoopToDoLoopWhileTests.cs + + + VB\CodeRefactorings\ConvertHexToDecTests.cs + + + VB\CodeRefactorings\ConvertIfStatementToSelectCaseStatementTests.cs + + + VB\CodeRefactorings\ConvertSelectCaseToIfTests.cs + + + VB\CodeRefactorings\ConvertToCustomEventTests.cs + + + VB\CodeRefactorings\CopyCommentsFromBaseTests.cs + + + VB\CodeRefactorings\CreateChangedEventTests.cs + + + VB\CodeRefactorings\CreateOverloadWithoutParameterTests.cs + + + VB\CodeRefactorings\InvertIfTests.cs + + + VB\CodeRefactorings\InvertLogicalExpressionTests.cs + + + VB\CodeRefactorings\ReplaceDirectCastWithSafeCastTests.cs + + + VB\CodeRefactorings\ReplaceSafeCastWithDirectCastTests.cs + + + VB\CodeRefactorings\VBCodeRefactoringTestBase.cs + + + VB\Converter\ExpressionTests.cs + + + VB\Converter\MemberTests.cs + + + VB\Converter\NamespaceLevelTests.cs + + + VB\Converter\SpecialConversionTests.cs + + + VB\Converter\StatementTests.cs + + + VB\Converter\TypeCastTests.cs + + + VB\Diagnostics\NameOfSuggestionTests.cs + + + VB\Diagnostics\NonPublicMethodWithTestAttributeTests.cs + + + VB\Diagnostics\VBDiagnosticTestBase.cs + + + + + + + + + + + {C465A5DC-AD28-49A2-89C0-F81838814A7E} + RefactoringEssentials + + + + + + + + + + + + + Properties\AssemblyInfoBase.tt + TextTemplatingFileGenerator + AssemblyInfoBase.cs + + + + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Tests.2017/app.config b/Tests.2017/app.config new file mode 100644 index 00000000..5e1c3598 --- /dev/null +++ b/Tests.2017/app.config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests.2017/packages.config b/Tests.2017/packages.config new file mode 100644 index 00000000..95e2118e --- /dev/null +++ b/Tests.2017/packages.config @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Vsix.2017/Vsix.csproj b/Vsix.2017/Vsix.csproj new file mode 100644 index 00000000..a759c72a --- /dev/null +++ b/Vsix.2017/Vsix.csproj @@ -0,0 +1,346 @@ + + + + + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + Debug + AnyCPU + 2.0 + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7} + {82B43B9B-A64C-4715-B499-D71E9CA2BD60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + RefactoringEssentials + + + true + true + + + + + 14.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + false + + + + + + + + Debug + AnyCPU + 2.0 + {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7} + Library + Properties + RefactoringEssentials.VsExtension + RefactoringEssentials.VsExtension.2017 + v4.5 + true + true + true + true + true + true + Roslyn + + + true + full + false + ..\bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\bin\Release\ + TRACE + prompt + 4 + + + Program + $(DevEnvDir)devenv.exe + /rootsuffix Roslyn + + + + Images\refactoringessentials-logo90.png + PreserveNewest + + + Images\refactoringessentials-preview.png + PreserveNewest + + + license.txt + Always + + + REConverterPackage.vsct + + + TextTemplatingFileGenerator + source.extension.vsixmanifest + Designer + + + + + True + True + source.extension.tt + + + + + {c465a5dc-ad28-49a2-89c0-f81838814a7e} + RefactoringEssentials + DebugSymbolsProjectOutputGroup + DebugSymbolsProjectOutputGroup + + + + + + + + False + + + False + + + False + + + False + + + + + False + + + ..\packages\Microsoft.VisualStudio.CoreUtility.14.2.25123\lib\net45\Microsoft.VisualStudio.CoreUtility.dll + True + + + ..\packages\Microsoft.VisualStudio.Editor.14.2.25123\lib\net45\Microsoft.VisualStudio.Editor.dll + True + + + ..\packages\Microsoft.VisualStudio.Imaging.14.2.25123\lib\net45\Microsoft.VisualStudio.Imaging.dll + True + + + ..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6070\lib\Microsoft.VisualStudio.OLE.Interop.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.14.0.14.2.25123\lib\Microsoft.VisualStudio.Shell.14.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.10.0.10.0.30319\lib\net40\Microsoft.VisualStudio.Shell.Immutable.10.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.11.0.11.0.50727\lib\net45\Microsoft.VisualStudio.Shell.Immutable.11.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.12.0.12.0.21003\lib\net45\Microsoft.VisualStudio.Shell.Immutable.12.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Immutable.14.0.14.2.25123\lib\net45\Microsoft.VisualStudio.Shell.Immutable.14.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.7.10.6071\lib\Microsoft.VisualStudio.Shell.Interop.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.10.0.10.0.30319\lib\Microsoft.VisualStudio.Shell.Interop.10.0.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.11.0.11.0.61030\lib\Microsoft.VisualStudio.Shell.Interop.11.0.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.12.0.12.0.30110\lib\Microsoft.VisualStudio.Shell.Interop.12.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.8.0.8.0.50727\lib\Microsoft.VisualStudio.Shell.Interop.8.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.9.0.9.0.30729\lib\Microsoft.VisualStudio.Shell.Interop.9.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Text.Data.14.2.25123\lib\net45\Microsoft.VisualStudio.Text.Data.dll + True + + + ..\packages\Microsoft.VisualStudio.Text.Logic.14.2.25123\lib\net45\Microsoft.VisualStudio.Text.Logic.dll + True + + + ..\packages\Microsoft.VisualStudio.Text.UI.14.2.25123\lib\net45\Microsoft.VisualStudio.Text.UI.dll + True + + + ..\packages\Microsoft.VisualStudio.Text.UI.Wpf.14.2.25123\lib\net45\Microsoft.VisualStudio.Text.UI.Wpf.dll + True + + + ..\packages\Microsoft.VisualStudio.TextManager.Interop.7.10.6070\lib\Microsoft.VisualStudio.TextManager.Interop.dll + True + + + ..\packages\Microsoft.VisualStudio.TextManager.Interop.8.0.8.0.50727\lib\Microsoft.VisualStudio.TextManager.Interop.8.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Threading.14.1.114\lib\net45\Microsoft.VisualStudio.Threading.dll + True + + + ..\packages\Microsoft.VisualStudio.Utilities.14.2.25123\lib\net45\Microsoft.VisualStudio.Utilities.dll + True + + + ..\packages\Microsoft.VisualStudio.Validation.14.1.111\lib\net45\Microsoft.VisualStudio.Validation.dll + True + + + + False + + + + + + + + + + + + + + False + .NET Framework 3.5 SP1 + false + + + + + CodeConversion.cs + + + ConvertCSToVBCommand.cs + + + ConvertVBToCSCommand.cs + + + GeneralOptionsDialogPage.cs + Component + + + GeneralOptionsDialogPageControl.cs + UserControl + + + GeneralOptionsDialogPageControl.designer.cs + GeneralOptionsDialogPageControl.cs + + + REConverterPackage.cs + + + VisualStudioInteraction.cs + + + + + GeneralOptionsDialogPageControl.resx + GeneralOptionsDialogPageControl.cs + + + VSPackage.resx + Designer + + + + + + + + RefactoringEssentials.DocGenerator.exe + + + + false + bin\Debug_Mono + 4 + Vsix + + + false + bin\Mono_Release + 4 + Vsix + + + + \ No newline at end of file diff --git a/Vsix.2017/app.config b/Vsix.2017/app.config new file mode 100644 index 00000000..63bf6b7b --- /dev/null +++ b/Vsix.2017/app.config @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Vsix.2017/packages.config b/Vsix.2017/packages.config new file mode 100644 index 00000000..f6daabf4 --- /dev/null +++ b/Vsix.2017/packages.config @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Vsix.2017/source.extension.tt b/Vsix.2017/source.extension.tt new file mode 100644 index 00000000..5f4bbb01 --- /dev/null +++ b/Vsix.2017/source.extension.tt @@ -0,0 +1,35 @@ +<#@ template debug="false" hostspecific="true" language="C#" #> +<#@ output extension=".vsixmanifest" #> + +<#@ include file="../RefactoringEssentials.2017/Versioning.t4.template" once="true" #> +<# ReadVersions(Path.Combine(Path.GetDirectoryName(Host.TemplateFile), "../RefactoringEssentials.2017/RefactoringEssentials.version")); #> + + + + Refactoring Essentials for Visual Studio 2017 + Free refactorings for C# and Visual Basic (VB) - plus more! + license.txt + <#= releaseNotesLink #> + <#= releaseNotesLink #> + Images\refactoringessentials-logo90.png + Images\refactoringessentials-preview.png + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Vsix.2017/source.extension.vsixmanifest b/Vsix.2017/source.extension.vsixmanifest new file mode 100644 index 00000000..afeabcac --- /dev/null +++ b/Vsix.2017/source.extension.vsixmanifest @@ -0,0 +1,32 @@ + + + + + + Refactoring Essentials for Visual Studio 2017 + Free refactorings for C# and Visual Basic (VB) - plus more! + license.txt + https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 + https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 + Images\refactoringessentials-logo90.png + Images\refactoringessentials-preview.png + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Vsix/source.extension.tt b/Vsix/source.extension.tt index 75fdb4be..3acd47df 100644 --- a/Vsix/source.extension.tt +++ b/Vsix/source.extension.tt @@ -15,9 +15,9 @@ Images\refactoringessentials-preview.png - - - + + + diff --git a/Vsix/source.extension.vsixmanifest b/Vsix/source.extension.vsixmanifest index 80fa3701..bd454135 100644 --- a/Vsix/source.extension.vsixmanifest +++ b/Vsix/source.extension.vsixmanifest @@ -12,9 +12,9 @@ Images\refactoringessentials-preview.png - - - + + + From c5d09618c99cda6a0d710aef385f75bb68efa25e Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sat, 26 Nov 2016 10:08:44 +0100 Subject: [PATCH 030/236] Select correct VSIX manifest for detection of VSIXGallery release version. --- .gitignore | 1 + BuildTools/appveyor.tt | 2 +- BuildTools/appveyor.yml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index ab0b27cc..9b77e826 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ obj /lib/*.dll _ReSharper*/* .vs +Backup*/* # User-specific folders *.sln.ide/ diff --git a/BuildTools/appveyor.tt b/BuildTools/appveyor.tt index cdde2347..5fede4a3 100644 --- a/BuildTools/appveyor.tt +++ b/BuildTools/appveyor.tt @@ -46,7 +46,7 @@ - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex before_build: - - ps: Vsix-IncrementVsixVersion | Vsix-UpdateBuildVersion + - ps: ".\Vsix\source.extension.vsixmanifest" | Vsix-IncrementVsixVersion | Vsix-UpdateBuildVersion - cmd: nuget restore RefactoringEssentials.sln build_script: diff --git a/BuildTools/appveyor.yml b/BuildTools/appveyor.yml index 822c9267..891fdc08 100644 --- a/BuildTools/appveyor.yml +++ b/BuildTools/appveyor.yml @@ -43,7 +43,7 @@ - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex before_build: - - ps: Vsix-IncrementVsixVersion | Vsix-UpdateBuildVersion + - ps: ".\Vsix\source.extension.vsixmanifest" | Vsix-IncrementVsixVersion | Vsix-UpdateBuildVersion - cmd: nuget restore RefactoringEssentials.sln build_script: From ebf084613565115ee7fc888dafe2bdf235b75555 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sat, 26 Nov 2016 10:10:43 +0100 Subject: [PATCH 031/236] Attempt 2. --- BuildTools/appveyor.tt | 2 +- BuildTools/appveyor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BuildTools/appveyor.tt b/BuildTools/appveyor.tt index 5fede4a3..a6ab367b 100644 --- a/BuildTools/appveyor.tt +++ b/BuildTools/appveyor.tt @@ -46,7 +46,7 @@ - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex before_build: - - ps: ".\Vsix\source.extension.vsixmanifest" | Vsix-IncrementVsixVersion | Vsix-UpdateBuildVersion + - ps: Vsix-IncrementVsixVersion | ".\Vsix\source.extension.vsixmanifest" | Vsix-UpdateBuildVersion - cmd: nuget restore RefactoringEssentials.sln build_script: diff --git a/BuildTools/appveyor.yml b/BuildTools/appveyor.yml index 891fdc08..3380a974 100644 --- a/BuildTools/appveyor.yml +++ b/BuildTools/appveyor.yml @@ -43,7 +43,7 @@ - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex before_build: - - ps: ".\Vsix\source.extension.vsixmanifest" | Vsix-IncrementVsixVersion | Vsix-UpdateBuildVersion + - ps: Vsix-IncrementVsixVersion | ".\Vsix\source.extension.vsixmanifest" | Vsix-UpdateBuildVersion - cmd: nuget restore RefactoringEssentials.sln build_script: From e23e3da4b4f259a03ccb81ea34207117ed775358 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sat, 26 Nov 2016 10:24:40 +0100 Subject: [PATCH 032/236] Error in expression :-) --- BuildTools/appveyor.tt | 2 +- BuildTools/appveyor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BuildTools/appveyor.tt b/BuildTools/appveyor.tt index a6ab367b..ec86a244 100644 --- a/BuildTools/appveyor.tt +++ b/BuildTools/appveyor.tt @@ -46,7 +46,7 @@ - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex before_build: - - ps: Vsix-IncrementVsixVersion | ".\Vsix\source.extension.vsixmanifest" | Vsix-UpdateBuildVersion + - ps: Vsix-IncrementVsixVersion ".\Vsix\source.extension.vsixmanifest" | Vsix-UpdateBuildVersion - cmd: nuget restore RefactoringEssentials.sln build_script: diff --git a/BuildTools/appveyor.yml b/BuildTools/appveyor.yml index 3380a974..675edb80 100644 --- a/BuildTools/appveyor.yml +++ b/BuildTools/appveyor.yml @@ -43,7 +43,7 @@ - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex before_build: - - ps: Vsix-IncrementVsixVersion | ".\Vsix\source.extension.vsixmanifest" | Vsix-UpdateBuildVersion + - ps: Vsix-IncrementVsixVersion ".\Vsix\source.extension.vsixmanifest" | Vsix-UpdateBuildVersion - cmd: nuget restore RefactoringEssentials.sln build_script: From cf20ff169f09dcb2863100c43c03f89b6c2ce68b Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sat, 26 Nov 2016 11:00:19 +0100 Subject: [PATCH 033/236] AppVeyor build configuration for VS 2017. --- BuildTools/appveyor.2017.tt | 15 +++++++++------ BuildTools/appveyor.2017.yml | 15 +++++++++------ RefactoringEssentials.2017.sln | 5 ----- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/BuildTools/appveyor.2017.tt b/BuildTools/appveyor.2017.tt index bc0d2aa1..feb4c9a4 100644 --- a/BuildTools/appveyor.2017.tt +++ b/BuildTools/appveyor.2017.tt @@ -8,16 +8,19 @@ - release version: <#= generatedAppVeyorVersion #>.{build} + configuration: Release - os: Visual Studio 2015 + image: Visual Studio 2017 RC install: - - cmd: set PATH=C:\Program Files (x86)\MSBuild\14.0\Bin;%PATH% - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex before_build: - cmd: nuget restore RefactoringEssentials.sln + build: + project: RefactoringEssentials.sln + build_script: - msbuild RefactoringEssentials.sln /p:configuration=Release /p:DeployExtension=false /p:ZipPackageCompressionLevel=normal /v:m @@ -38,19 +41,19 @@ - master version: <#= generatedAppVeyorVersion #>.{build} + configuration: Release - os: Visual Studio 2015 + image: Visual Studio 2017 RC install: - - cmd: set PATH=C:\Program Files (x86)\MSBuild\14.0\Bin;%PATH% - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex before_build: - ps: Vsix-IncrementVsixVersion | Vsix-UpdateBuildVersion - cmd: nuget restore RefactoringEssentials.sln - build_script: - - msbuild RefactoringEssentials.sln /p:configuration=Release /p:DeployExtension=false /p:ZipPackageCompressionLevel=normal /v:m + build: + project: RefactoringEssentials.sln after_test: - ps: Vsix-PushArtifacts | Vsix-PublishToGallery diff --git a/BuildTools/appveyor.2017.yml b/BuildTools/appveyor.2017.yml index ce569ad9..9a4a4c85 100644 --- a/BuildTools/appveyor.2017.yml +++ b/BuildTools/appveyor.2017.yml @@ -5,16 +5,19 @@ - release version: 5.0.{build} + configuration: Release - os: Visual Studio 2015 + image: Visual Studio 2017 RC install: - - cmd: set PATH=C:\Program Files (x86)\MSBuild\14.0\Bin;%PATH% - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex before_build: - cmd: nuget restore RefactoringEssentials.sln + build: + project: RefactoringEssentials.sln + build_script: - msbuild RefactoringEssentials.sln /p:configuration=Release /p:DeployExtension=false /p:ZipPackageCompressionLevel=normal /v:m @@ -35,19 +38,19 @@ - master version: 5.0.{build} + configuration: Release - os: Visual Studio 2015 + image: Visual Studio 2017 RC install: - - cmd: set PATH=C:\Program Files (x86)\MSBuild\14.0\Bin;%PATH% - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex before_build: - ps: Vsix-IncrementVsixVersion | Vsix-UpdateBuildVersion - cmd: nuget restore RefactoringEssentials.sln - build_script: - - msbuild RefactoringEssentials.sln /p:configuration=Release /p:DeployExtension=false /p:ZipPackageCompressionLevel=normal /v:m + build: + project: RefactoringEssentials.sln after_test: - ps: Vsix-PushArtifacts | Vsix-PublishToGallery diff --git a/RefactoringEssentials.2017.sln b/RefactoringEssentials.2017.sln index 9786f9a4..d22a5a65 100644 --- a/RefactoringEssentials.2017.sln +++ b/RefactoringEssentials.2017.sln @@ -3,11 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.25920.0 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{CF2B2ADB-325E-49D2-8718-2FBEFE973476}" - ProjectSection(SolutionItems) = preProject - .nuget\packages.config = .nuget\packages.config - EndProjectSection -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{E7481F91-77A4-49F6-ACC7-B8145827C384}" ProjectSection(SolutionItems) = preProject README.md = README.md From ae2765a57a0bd433aeb6f76dbb54c12a5ad540d8 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sat, 26 Nov 2016 11:07:20 +0100 Subject: [PATCH 034/236] Selecting correct (VS 2017) solution. --- BuildTools/appveyor.2017.tt | 11 ++++------- BuildTools/appveyor.2017.yml | 11 ++++------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/BuildTools/appveyor.2017.tt b/BuildTools/appveyor.2017.tt index feb4c9a4..3c0ccedd 100644 --- a/BuildTools/appveyor.2017.tt +++ b/BuildTools/appveyor.2017.tt @@ -16,14 +16,11 @@ - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex before_build: - - cmd: nuget restore RefactoringEssentials.sln + - cmd: nuget restore RefactoringEssentials.2017.sln build: - project: RefactoringEssentials.sln + project: RefactoringEssentials.2017.sln - build_script: - - msbuild RefactoringEssentials.sln /p:configuration=Release /p:DeployExtension=false /p:ZipPackageCompressionLevel=normal /v:m - after_test: - cmd: nuget pack bin\Release\RefactoringEssentials.nuspec -NoPackageAnalysis -BasePath bin\Release -OutputDirectory bin\Release - cmd: nuget pack bin\Release\RefactoringEssentials.Library.nuspec -NoPackageAnalysis -BasePath bin\Release -OutputDirectory bin\Release @@ -50,10 +47,10 @@ before_build: - ps: Vsix-IncrementVsixVersion | Vsix-UpdateBuildVersion - - cmd: nuget restore RefactoringEssentials.sln + - cmd: nuget restore RefactoringEssentials.2017.sln build: - project: RefactoringEssentials.sln + project: RefactoringEssentials.2017.sln after_test: - ps: Vsix-PushArtifacts | Vsix-PublishToGallery diff --git a/BuildTools/appveyor.2017.yml b/BuildTools/appveyor.2017.yml index 9a4a4c85..01e274c3 100644 --- a/BuildTools/appveyor.2017.yml +++ b/BuildTools/appveyor.2017.yml @@ -13,14 +13,11 @@ - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex before_build: - - cmd: nuget restore RefactoringEssentials.sln + - cmd: nuget restore RefactoringEssentials.2017.sln build: - project: RefactoringEssentials.sln + project: RefactoringEssentials.2017.sln - build_script: - - msbuild RefactoringEssentials.sln /p:configuration=Release /p:DeployExtension=false /p:ZipPackageCompressionLevel=normal /v:m - after_test: - cmd: nuget pack bin\Release\RefactoringEssentials.nuspec -NoPackageAnalysis -BasePath bin\Release -OutputDirectory bin\Release - cmd: nuget pack bin\Release\RefactoringEssentials.Library.nuspec -NoPackageAnalysis -BasePath bin\Release -OutputDirectory bin\Release @@ -47,10 +44,10 @@ before_build: - ps: Vsix-IncrementVsixVersion | Vsix-UpdateBuildVersion - - cmd: nuget restore RefactoringEssentials.sln + - cmd: nuget restore RefactoringEssentials.2017.sln build: - project: RefactoringEssentials.sln + project: RefactoringEssentials.2017.sln after_test: - ps: Vsix-PushArtifacts | Vsix-PublishToGallery From 39097c32f523c9e774fbafc72797230b04cc02c5 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sat, 26 Nov 2016 11:09:22 +0100 Subject: [PATCH 035/236] Selection of correct (VS 2017) manifest. --- BuildTools/appveyor.2017.tt | 2 +- BuildTools/appveyor.2017.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BuildTools/appveyor.2017.tt b/BuildTools/appveyor.2017.tt index 3c0ccedd..3dbf93d7 100644 --- a/BuildTools/appveyor.2017.tt +++ b/BuildTools/appveyor.2017.tt @@ -46,7 +46,7 @@ - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex before_build: - - ps: Vsix-IncrementVsixVersion | Vsix-UpdateBuildVersion + - ps: Vsix-IncrementVsixVersion ".\Vsix.2017\source.extension.vsixmanifest" | Vsix-UpdateBuildVersion - cmd: nuget restore RefactoringEssentials.2017.sln build: diff --git a/BuildTools/appveyor.2017.yml b/BuildTools/appveyor.2017.yml index 01e274c3..24e4e896 100644 --- a/BuildTools/appveyor.2017.yml +++ b/BuildTools/appveyor.2017.yml @@ -43,7 +43,7 @@ - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex before_build: - - ps: Vsix-IncrementVsixVersion | Vsix-UpdateBuildVersion + - ps: Vsix-IncrementVsixVersion ".\Vsix.2017\source.extension.vsixmanifest" | Vsix-UpdateBuildVersion - cmd: nuget restore RefactoringEssentials.2017.sln build: From 48703ea64e7193a98c148475987e99e125d376b7 Mon Sep 17 00:00:00 2001 From: Christoph Wille Date: Sat, 26 Nov 2016 12:14:25 +0100 Subject: [PATCH 036/236] Mini-update to code converter Web site --- CodeConverterWebApp/Global.asax.cs | 2 +- CodeConverterWebApp/Views/Home/About.cshtml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CodeConverterWebApp/Global.asax.cs b/CodeConverterWebApp/Global.asax.cs index 0f72547a..6c7d88d6 100644 --- a/CodeConverterWebApp/Global.asax.cs +++ b/CodeConverterWebApp/Global.asax.cs @@ -17,7 +17,7 @@ void Application_Start(object sender, EventArgs e) // Code that runs on application startup AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register); - RouteConfig.RegisterRoutes(RouteTable.Routes); + RouteConfig.RegisterRoutes(RouteTable.Routes); } } } \ No newline at end of file diff --git a/CodeConverterWebApp/Views/Home/About.cshtml b/CodeConverterWebApp/Views/Home/About.cshtml index 2c702f4f..578148a9 100644 --- a/CodeConverterWebApp/Views/Home/About.cshtml +++ b/CodeConverterWebApp/Views/Home/About.cshtml @@ -19,7 +19,7 @@

    This service is brought to you by the same people that created http://codeconverter.sharpdevelop.net/. - In comparison, this service today supports only C# to VB.NET, however in their respective latest versions - whereas the NRefactory-based + In comparison, this service today supports only C# to VB.NET (and vice versa), however in their respective latest versions - whereas the NRefactory-based older service is C# 5.0 only (and won't be updated any more).

    From b73730bb93531b15cecef41146f33dd31df6c4d5 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sat, 26 Nov 2016 12:17:14 +0100 Subject: [PATCH 037/236] Updated README.md with 4.* and 5.* build status icons. --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index cb5baeb2..d4e49adb 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ not tied to Windows / Visual Studio. # Project Build Status -Branch | Status ---- | --- -*master* (Development) | [![Build status](https://ci.appveyor.com/api/projects/status/5463mskexnsa0176/branch/master?svg=true)](https://ci.appveyor.com/project/icsharpcode/refactoringessentials/branch/master) -*release* (Latest Release) | [![Build status](https://ci.appveyor.com/api/projects/status/5463mskexnsa0176/branch/release?svg=true)](https://ci.appveyor.com/project/icsharpcode/refactoringessentials/branch/release) \ No newline at end of file +Branch | Status 4.* (VS 2015) | Status 5.* (VS 2017) +--- | --- | --- +*master* (Development) | [![Build status](https://ci.appveyor.com/api/projects/status/5463mskexnsa0176/branch/master?svg=true)](https://ci.appveyor.com/project/icsharpcode/refactoringessentials/branch/master) | [![Build status](https://ci.appveyor.com/api/projects/status/r01wr5xdclj24y20/branch/master?svg=true)](https://ci.appveyor.com/project/icsharpcode/refactoringessentials-wgnsw/branch/master) +*release* (Latest Release) | [![Build status](https://ci.appveyor.com/api/projects/status/5463mskexnsa0176/branch/release?svg=true)](https://ci.appveyor.com/project/icsharpcode/refactoringessentials/branch/release) | [![Build status](https://ci.appveyor.com/api/projects/status/r01wr5xdclj24y20/branch/release?svg=true)](https://ci.appveyor.com/project/icsharpcode/refactoringessentials-wgnsw/branch/release) \ No newline at end of file From cf2648b5646f1f04efd24644ac00a990fa972ce6 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sat, 26 Nov 2016 13:10:33 +0100 Subject: [PATCH 038/236] Removed unneeded assembly files from VSIX packages. --- Vsix.2017/Vsix.csproj | 5 ++++- Vsix/Vsix.csproj | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Vsix.2017/Vsix.csproj b/Vsix.2017/Vsix.csproj index a759c72a..0527d0dc 100644 --- a/Vsix.2017/Vsix.csproj +++ b/Vsix.2017/Vsix.csproj @@ -60,7 +60,7 @@ true true true - true + false Roslyn @@ -89,14 +89,17 @@ Images\refactoringessentials-logo90.png PreserveNewest + true Images\refactoringessentials-preview.png PreserveNewest + true license.txt Always + true REConverterPackage.vsct diff --git a/Vsix/Vsix.csproj b/Vsix/Vsix.csproj index 937441a1..e3e77051 100644 --- a/Vsix/Vsix.csproj +++ b/Vsix/Vsix.csproj @@ -40,7 +40,7 @@ true true true - true + false Roslyn From a2aa5b0999ed8e8b17afcd04c3c551c68633aa8d Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sat, 26 Nov 2016 23:30:15 +0100 Subject: [PATCH 039/236] Turned RefactoringEssentials.2017 to a .NETStandard 1.3 and Roslyn 2.0-rc based project. --- .nuget/NuGet.exe | Bin 3744336 -> 3957976 bytes DocGenerator.2017/DocGenerator.csproj | 110 +++++++- DocGenerator.2017/app.config | 16 ++ DocGenerator.2017/packages.config | 70 +++-- RefactoringEssentials.2017.sln | 53 ++-- .../Properties/AssemblyInfoBase.tt | 2 +- .../RefactoringEssentials.csproj | 256 ++++-------------- RefactoringEssentials.2017/packages.config | 14 - ...irtualConversionCodeRefactoringProvider.cs | 4 +- RefactoringEssentials/Xml/AXmlAttribute.cs | 2 +- RefactoringEssentials/Xml/AXmlTag.cs | 2 +- RefactoringEssentials/Xml/AXmlText.cs | 4 +- RefactoringEssentials/Xml/Log.cs | 2 +- Tests.2017/Tests.csproj | 123 +++++++-- Tests.2017/app.config | 40 +-- Tests.2017/packages.config | 74 +++-- Vsix.2017/Vsix.csproj | 19 +- Vsix.2017/app.config | 16 +- 18 files changed, 447 insertions(+), 360 deletions(-) create mode 100644 DocGenerator.2017/app.config delete mode 100644 RefactoringEssentials.2017/packages.config diff --git a/.nuget/NuGet.exe b/.nuget/NuGet.exe index a9c681c8edabc82e736dd5077d5040317ac42c15..6bb79fe5379d098fabcabf69f3e5c9e8214c229b 100644 GIT binary patch literal 3957976 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

    u`~u-4R_QwH34fjNiJ#YXwiBMQTDPA`_yNKP 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

    q?zIcAk{U|VH1Lr>$qLBDkJ%l8D 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%0Dr|q4 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®FbQ_ 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%0D-B$lcXj(!M5VY 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 &075Qv=WA+vP92B5(O=;-8ki!KUdW03zHFK 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

    Kr!IOq6Q7?TzDzy)-fY;^MGt18Mq3kykJ!_S6 zOgX#-1Z{OPX1L(8Oix5$Q+TVPv$dh@mDo%0ApR0w_$%a)^$nXhg)i_P#CwCvY_glv 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 z%0AEJm~z+)!rF#${zP&*0rEvM+|o5n`yW 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� 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

    atVm+*N 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

    E-dX(#V9smO0CBt?_5MK z`#-;P0wao1F(ufDzBD4Sq6!pM-v^o6M6p>2`%D`rOcQj^Ae4DZjab~c;a12p4pAnA ziBlT81swM8z+viq6}oU<|Lr|v1(8G*bSq@l=QCV{Y|7srPhF&oqp#hSznD|L9u*4-ri;q;Ukbp3oy>YBLhc`Y6cejaXXQW+z{OSbFf#GciUs)A7i{LN z^R$mbQiS@FaY5Y&P$R5->6YXSHOmRzz7kKk4|yX!yE zce1amGTeYgm(X$w-6uaLIHxKFOyw?=+Su6z)uyGK!c&M)7C!m|)QXB#U9k}(K%&f0 zB*d+#YZE4uN4P<3_*l=B+U8-I1O>^)9V{U@EN@rB}OfU%2IJTD^hKy6m!D=50SWVc%w@( zCwqaS-xP7IRNW|3tkB!Y4k?OCr6@$z;nLmAzaqkV{g~|Q6PKgR2ED?DEp;%Qc z2^GV{-Nez-TM_R2{J|{co$?4ismNGVol4j$#j9WUj))R|JU)Q@gbj<0KK7N;Sc^(H z*qLBc!Q{^Wa(^0z?1XOB+u1*34`Hl`k>!jL3}f@&5Sxyij>=G|SpLVtu#z*FTvF>)81)Itb4 zjqXKmR9EvCg!7a99a{}QF-SvA9T`EJn32pp1trA|jH1QmC?JHrr9-1kCkN`w<8K!6%PwOBoY?=*rbHj(v8CzIoh)dTJ>mFV-E8_Ij?k&(WbDWE6 zKJj@Y=HH9~9{r)shxi6zs6p08>|(p}ZuDmq4>l6x2IYaquJ>r!WR%)PS5_*Gvg@ty_j(16mdlS)Onkl(2bzxZAkwywPSnoW zXt{zoT6b=7Vy5Xa^c%$9l9x5aomH+>lcTAngWXZFV%NeC71>XB8pB{PlR=MS1Vk9Y z9zs}P$dolPji8t&aJDLBsM7Szd3Y;k zG{PvGItWi8*Ji)vvMRU3-GhQ*TBr>ar>a!jt2o--o;6$Op;B`zz zg#DqUvIEN*A^;Hp2)lj5`GSypn99hYLQx#fEO{hLd8U$aP-O+WD{_MP8J$DXG>a<; zr>n7;cuWu;SmN!oq&u@estsfZ4VukDwDg@pRee{ z@s#Ko1CUwhxO(cfw7Oico?g-0>aJ7bGRlsL-WY|_BggDV*u`mjDehIe45%n_iDe?f zZ7G&B`imHz)>0m9Eeu}#6k{1((Zihpb3Dwact*Si)JOCX5x+|G+!ae1eu%q;h+b0c zoO8c0Rb2jj;W0pN6ux^QTh!cmYtCXtt(>M#btF8slwwd^g8D+=JA{c)LJZf#lqOXF zGqqc+@9>7mh8m;DK1O&16hsj9jlSsa*oToApQeV1spDb~DpRknoU2n^M=(EJQBdn* zz2VtK&nk>&9;WWX(gtJJFa1#VVBTMScGp!=ifh3HXUYyUu!>O8qU7l3VIjtozb7yI zhvGfgqEisVT1?*Tf#s_zAR1nSrR;01UI-H}F(Hu}R9Wd<>T;@xBdYOn7CL7Ff2dQ+ zDcLq7Impf9OZisJ1mUbJ1;w5kTR1WK%CAiCik4mN^r?}Mzc6PrRWD(p6vGxJG}JDB zke1DCFl-kxr|<<+HSWS&Ow3>>tZDYqWn7~ex1gHWh{{@YD)9jOav*1-rs(fOA3rY5 z&}A&Tb4z)mQmY8_6?)J@aur%XF>#82#zCf+^id33gu~-OCa9wr6z|wM3oivcg$(bU zY3zu9qB@4r#itGs{$Mn4#eObdl84ZB)H!vDN`SgbHNM9ZP3ZM8bmA@RTNnx-%0s3U zR77{?2~~#%up37QrXLUx`T=DM*`j_PoqcET$RBj z_hME(-A+a%CSYqWIw@jCN@m~C4<*o#^_eIl9MSU5M0=Vp-;LR$$~TNFFc+YBCgosUm&KDMt=5e?tPbVm_mY@5XN~G8XK<)f zH;O2+hNsdnp;P|hNVPkyo|vl@9jN=2e1p*dF{f=1&1{jM9llLW@-WfYD^PLs5aSn9k7*6IuNqGenrbBvigrIp zgWaq*gBnx_ihhGijn-y7Drsdto1o)|$+E(XmXMPSJCLE2F_GX_=&HoEX%G!Q+J?7K z{0zF|m2>!eF&nxEE*t;;t@>hcDpYRVa7tQ#o(}g^jB`27FCU{uNcZ}@a#;F>KAv%9Ss$Ef5-D&o8iV0V25lI-koDev}Lbs17Tr^NS6?u%?s6G{Fqm2;Gk|ZiAsRZ(JRj;hr#KrkY}qrP!sM zi(CXL){vL(M_fi&Y!{)69q7#>hx}-{7TqG;~b1hG;>)_ z3KY?Y^_ni%BBN^MweS)$HhUuR>BokY92tN;H?JO#J9l@6vBc>a;YL2hK)_HeReJ%f ztrdM5AxwjrS!lB`Uq{ib2$I5Kp*B~>#|T#|RNneW=gES6g@03k82nLRB^m9S zZ0AED16ocx5vq?XgGu^^SmzI=D*N!3C^m8=j3JcS1M~w}Md$GkEdH9vz*Kg6RU((s zDHAOuduS86H;Q_OtFN)*K-HKUW@C1#Sc|4X1&idAtW9$=Z-d}SPw*h>M+ft zm}GHko#uF1N`W>}45k@gsM3x3&p&_g>#l;Z`2}nBzf<4e7k`B3G&k|ZK-drWY%W+7 zg;#+xxoZkf8WqKOpLj+dUG%Q70}@kfZ<;OoUXPa0)ru{89C@RW6D3nv{P+Z;+Ma-Q zoba~JTy4;GDdz)p-+LB2RyVjP?iaN;cVHMfxu;gxk!ZjxewX|DzOlw-flDnv=n+z zah>`|6 z?u-9SU$u$fc!+vlxVQRE3dCAM>3C=+2qQ$L3t_0@T&d#3(4%t@{$-+Z^ha7lU!t~$ z%5U|xoS63qagrm1*!y2+WuGxNF)!K71or(#lKU5rwOYPmEY zLK)Za8)S4X6jK-3ITiKy{>nRACkr~)yHj6W^|#w9ZeFGAjFq=@PPVm2b- zDys}tX~rYOx~t^_$&r9V2(GGXfI+Rm;BmseR&kmw7M4IC%77Tae%{J_^%M&+5bNzM z0vT{l1a@bXz@H6)u}|@p(TyY*6*>{R%R@M{>SDeN?Pam^Ig2`>_%C(k?h8ND1(4?n zMG$%{K#QWsGlJ|ThL*W4af9mPt7F;-Tfxo~8E@uEGldTjqj&zIG+W9w9MzFIjfbnE z{ZxeM`bH|I>mIg zs8#qN%7UE2X(D9iUpZc&(OX~iLPt0uByO@=0E4$(Y7Ic@3 z<}DXtk9B%N#p?|VWpmy;rXbuM?^GCrqRU3{rdP+|YbwlKS1H;23nLq%%J@txrk{qn z$S?zI4NF;Lt53iXoVFoWmu$~|aJZl^`xk7Yvb5C&CHP30e1DRQQA zk)&VM(-5ozEl&R2`Rc03;)bCUb*M&nops_m%8_?hAH;G?rz;||Me&QECE6D+E)p*n z^H4T?a-lF02G8hET*rz*k}nUV5c10lyG)_#2ns%a7&AiQj4XbJK0=p$C`KjDBSPKj zwK~Ul7_8Kl>4Oy=PsuriE#-Cc=Pu1o$`F>Ks2EC}Fjn`y4MQxN{upi0`F9ylRA}+( z14Nt+op$6u{McW~WpsY{6*^dy4nngaBI~IN1cN$7os?TKRz?np6z{N^d{(wunL01|pLqci`|@?pIF>5s%-G3B!zmRr ze4%>ye6n3jd7E-$6deRVj7SZYjB;yAMWin%oG)XudXE$iZjxaeI=ij}0tpa3adoaB zY`aj@Q+`BnMnC0-K0h;cgXq7j<*(#fOV)fkT|m+NxR&yK-R<%s>4@t_fpku?VzxeI zWJ?%d>dU!d1V}01qSwk47;0ZtSaj+-)R^SxPbS1pUA0>LJZfiKcPrE3#l+UbuMgQ|-n6=V@YpxfK#7To%4`r4qi`oLzSr zrGIFcmPj`eg{dWT5`|((x+DL{Tq==UA)&WIBb1ndYj1@v6Qz8sEP6XDS3QcNJM^E2 zmsaUqv>&aUUoyaz@J1BfM0#=iRw+SK45u^nH1YU7Eys(Nj^g<9ueip7-|M^m4_^s$tB0deL zSFIor35s`{bWZJR*XIj!pJqpj=m;4rCKQdI6&wCy{8$w$71@>SK`bR@^j-x08mWld z`pG`=Q>Q}Nqd$)-g(%~6hQYK69!e-1CK(;eP#jI6h*;@`nXiZh=HV?OiOKznN3>Cb zR*E`E75{XeHO-Y!x4Ka{WI@AzMKPzgH*T&iEamQ)RpiGOxytAUwG#KyquT%Gz{OKrN5S?RMpNwRkg@l+n z5M60eW3Fjl6wx-hl?Z5yfrXElVu`^N!*Rk?L(Qs+v=H1v9@-n}Ul)bPhqlEF{jW~M zrWF@;yCQ53(FHS6;%D)F#5PAE9tzzo`WtU=L&MDb8v1$s9?>}I9VtYCQq6wU zSi|1j{a6~jqIiqN0{j#!Tb%cYUY`Z~!7qZ&i!k%xj*7mY_^t#|Y_3yWE1K#O^1tq$ zi7moezb}dlq<1_J0{|`}PDoL+)f^d1n6%QC>3&U%Rebt&&J-Xf5Em|`s13gm=|kA& zGl?BLXN#k7Bv9gGX`25_d&_*}iMP->s__;%mLKU%{dKJujS*f}O77~1%I@I-LV83c zi8)%R)pdsULY_a)c78LoG34WI@DCl-k^NmViX z1tDjZsB1anq!Q7Q4p93E?SfK^vaGAkRKxL-6`Q8HFe@*v655AuLNR<5ZhyjdT`^-2 zeJ4YWm>tO_ZAJ(wNIaG38hI#N0m~;|M4epclJ}*_MezbT$BZDKLua?8ym)c^M)u zOM2lCVNsk&mr3by>8drt?cfk8_RhBTMXU2f zM+$SD`&(D(Y{`^LBinW}I5M-|4$VYK?}6%blbIQLibd|LnxV?T&%{MJw_T zuQXgicMBPjp-~g?fnsGj9!1QZYcIAGE%>`56@-Z$u3JQXQgP^brB? zbe?sDfC^IjPQpHoE&~DM#IZV8yP{eW*`c`a9&wI_U@j(lX!NDj{tR|Bm`TuM(Tva7 z<1$_`N*k(*%xeFIPbT&nJmkK24xAY94dY6#ngMQO-6rTin{b&EVWV{4O;o3Dx)Eg# z(HXg6Z6kUZB2cYf#i2&87rIhW(dvxS)C?gyEk!12I?p!cnre5(gFw#{DQ>}N z6_}#bRqYQ6UpFO}GrDG|;)S!C94!wfxDSEU$YP2kG5s6t;B-c7;>5)}B0kPjFpu+Q zn$x0tpkJo9Z__=y=&9-Mg8^eK2HbcOS7&-esG2ZO5~GdiJ&MLPb?-=cp9K&0VE9

    gt|@rrlN16 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

    9zD!W!R&0Y)Zpyd+2o5G-fcVmRv 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

    x4)BdgdV_?M1t7FU}ls>IKNlf6BeA(7z)_? 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�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�H?s7>kZa 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

    j5h_yN4(`Z(zwoll0)mCy`^ z0_BBU4RMK7zciid+-|T)*@kO(z(6wvR&J-rbwQ}Zsg7frU2c*x$oP1GH>F@(4mZ!I zZ%nr<4znUjuc*a_ZA$e%cBX?<9-}!se4a902J(@TEvnJ*HMDaz&L;}Ym@GCyBG{!Y(u6DPsrQZQRH{k?5~bU*xHPeD{Nc=9Xe@6UC-(z02mDb)GcC1P>0r0wzgLrGyI1`y*jW z)NJI3df!qDrt8Q6iC9#A)H$;w*XQ1u`e9a3kIJ3Q$Z@dyB1<>61Ehx?O|NrP?K`O1 z(QbQ!dpdFo}GRu6lINrP4;(k%_?iz`A3gg#(3Fad5ts-3L6cS-SX*3lg} zqbpSNH* zNabXO(&}wTGeVpgqD2J!@7sTbe}pUHVd#b9Fu<>`@$VnuTKH%9ANX|#X_K%Y#$gyv z!xaA=g_BsSgHl)U@1G%TX*;`UXB-YuYZ^;=TlZ1>8FE?TJmzL?{OrpRes(py^WFi< z9HHMq2=7i&`i#H6e1Q5B{C|iM9ER;|JWr%NOWj53F~&GXOJ9fZi_Or-|HGGE)OjhT zhWNg)?x#PX{0saWg;!w<|2@Y4d-(3>Jrt!*idM66{B9FC(=OKK?wdYElVJ+D1xy)mPFZMB(dhFw~@XoLH(dr3GbC&n;-y@U=-?Qfl>T)%Y z8gMK}^$2D50r8&T&SUABeGJfojPzgTwRKVLvacsHdg2ks96sm)lZNPffEiBkt=PW@ zDj;r#Uz}ka!w|mSlJWFqOr!+G(Y?UY{vb;X}%Kg`UP-<)7_^u=x;U{uV7v!%Aaqh!rQuSwY)ghO?ZYKB2)C0i=G- z^~uwAF^f~Ah2J$xKfnl1Y;}P%e`)4>%{%CUZ9c?bcpXrK*r_mL%VVUThw$fS{bmWS zIB}BPV1QrK;60F|*eE-s@*ZfD*t(0-q&e~l?Z<1}l~#nO{GyN2hatR2EO-W3;PIe;p%gYVG8K{DSV0l_tDcn=DC9Y*ov+K`#3~yc(q7rZ|h5$>w%2k>E=s; zLgHRmF;`vNtCiC4e0U0YBs#^ z_@~qzZeG6ZCPqVSqwERmX(jg112KvmdTRJ_ET!%t1>xk#IR#`<>uN5O?jcVlozlV! zjE!rq^bgGZExDCTuzP5MoQw2B4jVq`Vm7DJ!xZxgzxWZ~M-EUh}eFNUWu7o7zg<)sQ7)3 zi}-!QUOwTRl_N~UZKNK^IExy;B5xi`4_P~3u>ApA=lIWLuGpVM{f9_ZTIbqPYKM1s z@QdRJzf<19x<^t+B}s(Uhi&LN94MWR0T+x3{udjpG4-HNser}Wao#dxgvAhM@u7= z8lgVLu+Ha8e7!>dZ1)Ak!Cy>_ya0mVfr7pkR`LH1l=OAf;X1I7CalPO$%?NStW>Rm zLim9$Gtp;)_QQK=dBZP12K*XKX#e+MM*k)XAfcs@*ugKVMP&Z}4x#oZgNs6d%!{>B z%Z@moBZrXr%!~{&IIy^1Q>9d*cLvR#z>wedn&CYkF&P2b=NWnjDt`H`tkpBjhpd_q zbzEdAGH_+Yrtp2DWOyHWTwkiaWi7P-G1(0TyprY}{3VW%opaT}Kt7{6(pMERIV+OV%@tJ)h$_|&TpkLoA57hqm?Qo-}@u*Z-QA;jVAU^A}`?gOF+wlu`kn}|%tLt_TYo4v*Uw%OO zKGKM7oMTdzC?L7wFHoCUu5_Q52cCSAxY{fwI((nkY4$nu;@NY2SKFE!ddfT|urWEPtNYVp@kC zz(CbLDvbyD0v&x+Qe;#QI*G^7B%%s*hWWdaM(Tcmv_#9{=|%LwHB!Tst_Na^Q`U~m zgleUxa1>Ohgj4;tnfn;&%3;9Aev`^J%Y_dgp_Rn7fLH&%{20r&x|m6;zh84?Ri*8t zvUXICT5}^ca7|_AJIjx@IkxCLcrU?ARht|>oYgj9X8nIiY|kZ9xSL}|ZYns}_n9^O zPrYKzeg>uJ+l0@vD10SsVmy>SbRbYOA$%toQ)Vpxc@rtb6gq=gavQl+^y!eo(SH1W zHpAT()-O}HIg{|^WoqrBUveJsmYdD;q$Y*%+|hL|s@EFX7Z=sYN5!>HuDiChyd$ut zB+gxwp>t8a_NXqZk&WtWVmzfCsfZ?$8Xtt^4!(UXGsbrFa|Cy1HqNbfja`h6 zrZYJ!W#Vyk*v%MiWv;W^XpOlt*V(nRk+12D764S|bw;jx<^8 zAsfk`^A#J;sOE z&rx?O+UFS{2)7Rm{oIaqhYTHAebfkFm#(=zaf>7ldQt6shGp4_jL+Tt%v0Sb)d(M} zm3bvR!AO{^tNABbeCAGnzzq;}1Zpa`hpvRL1b376{SDIoO?o&)`G1$M5uitCt9Hh; zFmXAaEJ|A2)NW3zt$v17<$HNK^(*v{N1jeP8ln{KJNGg8_RmUq=d(?bN3;x+pMjK@ zMn8c)9Ik$6<0vsp?FglBqnyjrtjOhcm&NZ@reulc(^7#S|v8MByBl?3`>DUhX`TODjLMi^2|31P0WqiMG z*7Fi!&3~~hOLN0QSDraKzblx(JHRp9cS6ToXN`Q*Ya;!A1q^Vge`Dg|=__SVMQ+*`iSNh!?bv{p8N_0z8pCC76 zUOuAmu8%3ar<5#PqC2W*s%_h}(MsAaODbGdmNlI7Kl|_CAjC@gdWcocjXUK>^uSRr zQv#NyLnmLgJ>vw=P>$L!AxVBn8dIwq9PL3l){o*?r@mj8ZDn-%>rK)9xn)ZpndSVPbQwOb<6Bnl zV`}8oJGoBu@%@07j`Eg1E-krAiC@y6M(&!m`-!d(+wDv1T<|H9pQHQBz`LA-}RP_2`))_k0*wUTderQM^|8r%g+h=HcJUmP_os7}w{Ha%*1OWgc}EdP)##i2o+dI&{i% z<@i#qOt1R-ay9BW9d2H(c1!2`c3!<5tc6Q)-0cI5)I9>noJ?bZS8)O@i&nX6^5Fx; z#QzCxjlaS#?C*z;q158I5gb0804MeZYYlgQy)XDrenpQS@!4{)vFNr!N@YtEc=7{0 znH-~ffx<880e;=^elk3V99g}UJ;;2{i;_%35me_7pSg#F@J`xoQ&$bYY5TMZQSPmT zjU2Y*kSVBxG{;dMoBu-L8f(Izns#3(8z|W*mDTIowEHQ0iaEhfpjPSrPxt7h)g(7k zu0b7-o1i%_4L>Ij4j+`9mpcd1%OM-Dr&w`n0f(3^b`U=DjXBONQEd2a>0f8hPcS}i zl7hqiijY2pcaabp0wT-_?<-HzeUPw~q?E$3_WcjvpblR)VM;6}e@<B7_hX{Kn4-OwF#L{CNSK_AftL6&P3&OTWLfOiBRYNq)|4{37QHuIB zvASG)u5h_?A3oW!7RhbdW(u(IcEZQnZj+m5bN!etljEokMf{-;d=uQ3S`$|GBL;in zW)I{P65-4Cm~w8{gi*j=0HLjXgSv6};4Yx798LH(MtcMp<@?3H_NwbLKxvGc%InA< zn4dIa+|hu1%D@tOWq^|AdH9UtJH12hVer)p*dMdKV*DBa!Wc7ty+-?#C%Wr-f-gum zq?_*X-V`G+jpY~AJE4z!l8<}F81K>w*U=D0Nyja{J1WK6b2kY6Y6YuAK1152|AKzx z0J`Cbl3Y<8Bm7qJV^%I<&HXx#i?j0e6S}yX##=&<%b-hb_kC8FqGg3CK7($tJuM$qNdk63&M}a;IOPAUnE||aws84VOY4^|*O+3~b z;p3-h=NY6D;ra~ulu)YCAD|3_J-x(Zl;C=?2L{R(r8bg%u_yXrzRN)FtRb|7RH@s9 zeYVRn5xbinoqQjYBUF9pSVli+NVJl&NzHM$_Gwq3Mo6^1JLT%NM?-ikZRvWlW%Em~ zw@W9FXo&?`EyTy&38`$CGHE;M(cBZz#lCh z#Ew5 z;-*75z>}h0_^_4Fy=g^ICvsm!K7vxS3%@)Cp5#&j5oAxx@+FU&kEJzuMa)D5PeDgT zz%OB%D2MQP2@D}GVYqL$^YX1~Z`3V@LA@^J2uVB1GS184&^>0WoI2dRsGYoKR!{ho zNQw6eCl459kZ`h%!v~a&^oMKsd3ZmMjS1K{OtV$VoM_4QK(XO!pVPp-Ko5C~0U-A(*XQO4j26405cG#F#KhJBeF|cwrW{|Td?{;1?bn>s}h{+pU;ls*yj=Ge>?mY*7Fv$RQfa@ z!y~bW<4t$*>n?t68IzEbji5>MKP)TDEJec}yE zmwF1cl+Q}+Wn@2f>wREm5h?aDWw-CWQa5N?`{5Ug_u(dWCVClFOQXEhqehhWs!fxo z%YK248}oFpW@)w>HKMioHC6j1O)x^lEJ#F7m0E7;rSNj9tDXVIeOT`IFmH~XD?lFw ze&rQpgP)Zt<(@^sFWd8P+ZGBPQu(@b&=wQ>1l9Zv>+hXuWFeh{7x@ZAV7Qx#h^{@2ELakI>yf z)$p?Nz_{;V39qB{D%w=f*Yn)6!7hTXCb`HsnsvN_uul=i;i}J zwJc+y!zaH1pW+FUW6YkAaL9v3Dpq8K|LW=v1b(C!Ke&Ao-ud0Eath0L zu)m+vkREt1>0dow7~5}EuOq%RX9F5XgodrpulyI+hIk|U;jwm(S+VV3ruAiQ#iIH; z$9!9**(>lr!aJWToae1%Dm4!$Q0nu`ttU#_$kqfmh>31*WUKzMt~0e7Mu0JzOXtnM z64NB7OUyI+yFWt0aVL@bnn#uK_^jo>M_H~OzVKnG4`FR^h?TN~{6A@Xy7I|}M7b|7 zQ;vQG^U{9t5Hj~$jEqwKZun6oH>Gh`CMgjmHvuh0VzyA0C>0z~p@c(^@QT++%;Ap&O=v>ZlF*sa7 zcpDke5&rSep?;6i4~4hhu)(yKNcl-}c|JWYd)YV5mwW}duwQ2_g_~@PEu>kHh4GLf zZdJiQBBCFEaJ2avZi{xkExnR~OAySYO!c6D zEj8I0<=c_8@d$a;U#Q8bFO9(9KKluP@C>|r4a>8Re>d^3ga7yObq)2`@GoFboCL}9 zu0LkWH=FpIx*QjmbKp$Ew>h|SFe}T*dzjnKRV}abyhL(G759RGi#?s+>mqIGeiiLp z=-kCFL36x5jx_%?itsT>mJo4CNTkjQJ*=hDM6BGy{t&%SA!R5>$q2azKr{;*WjT$j z;VDAhX-MbbnlYW>^UKx@KPUFhCKt|{_6SLV`!6J0j102V+2U->No7j;A8^`;droC4 zXH~HUaR#bgmTTjl=Na{ILaSYmJC_>IF{2hvXw9odIh!m~VB*#JDh7+E*JOdsoTc0n1g6i(vJ?Mp3;`DM7f44yQ%o&Q8n zIL$n_%nQH{+-PnY?k{17@`5r`VEOzqw7)J|3-W99wOOud=?7Fk;?(ZvGfnoALC7MWf8>Ac*?DK1e8 zT;Re|Lg5#bGU~mclu_mdrHtw>C}k9NK`En_3rZO!Tu{oe{K8U#!55S=?7X0qVcykp zwJC2>)Bru~)L7#g#q~u>M_gH=7I0_bT7pXp)-v2$u$JN4g0&3y7OZ8sxL_^A%>`>2 zt}a;1aChNag3AlmGTdIUmf^ab*-bq15?mG6KjxhB;u;a>m#hiAU#h0y{t`6}|Cgv~ zG_XWXqk|=C8Z9hQ)97J|nnn{#)HJ$Ss;1D!5;cuJmZ)ho0$(~kKL@bko9Ei;3Z#6X z*Z7Xv;eILPWy?qUu*)PDs|V^>qMp#k!u5v2Z=3iiPVLO)Ol`C}QDyMh^?u zGiq3(p3uU=^^6i0u4i;09)LO>MBKN_Q)@WvWg@;`x-4+~l4S+2FICoX`BG&Ke=k+m zaQ0GV4Noss)^PJuWep!MRn~Cul4S+&E>+fW?NVh8zvh%}`487-^W&U7&_x z?m{&LZx^UxSi3-t%iwGt^Ee-$@{*Us*>;VKaJE_FVw^2&Tn1;$8kfP@vc_d_wybd( zoGoiy24~9}m%-Vx#$|A}S>s}yEo)o`XUiIfvz$Cs#SxV}V9!}%p@8tyMq(`aCcnnnvt)fAdoqNdTt5;b!gVRQt; zk4PcO=Qoc=7O7Fv$l^7fMi#A^Xk@XPIgKn@-4JvH2M}=GMar0Eg22Jg_ew_-%3kD<8PrQqxrYclJS7AXH)RSJ6+-K zo79f9{}x&S-M?`wLi2CfiqZQUwqmsYhOHQ#zhNsz<8RoC(f1p+Vzm8+tr%UuaVtX8 zZ`g{_^BcBewEXAU)OcY$>(=shBOSkS8=&GhY(r@HjoL5@exo*we&47Kquw`a!)W)7 z+Azv}qc)6g->40v+Ba-NX!ecTFp7PnHjG}^FGF+9-JLK;VkatZ)`~Rx2DL$*OV<{< zT(Y)N1ye^psFS73Qa9l*C=YKx<*e+)ir8bs;<$}Qgw}zma1!Xv{YTAq9yAJ z4J}pIC}^p=Mn9iWf}A4Ki)V}|rz*P&zpcNLp=a~Lr}J_n-CUv+DCELYLJJp^GOWL# zl;QUUr3{lVC}lW%K`Fz|3rZOtUQo&~?!r=nTNjivEV`hS;meE{Q)Xb!dL1|Fr6aB^ zQ46@Ua4o^51#1~@Em+HNZNXZGdkfYwTwJi0;pT$13|AMdWw^U=Ey3jlYZ-1YSj%wz zvpV+jhCZI=3;g*be9xpEP|7b*|TUZA|-^rg!iHeb5D;qj%*8wOvxyy5Pp%Ny2S zy1e1*rOO+pE>K=@^wQ-GJ10_ySppGT#32iJ~&nRQzdPWxu*E6bExSr9(!u5Ke^2RoCc#sk%n{OV$zQ6bBH!7IlM-yIH;8> z4r-=~gW9R$poXeAsHG|nYO0EZ+N$L68mr=<)~YzDxyy5!LyH*RkJdjeXQGvzeH%|c zU#IJ}@QT*g!0YwjoR^-^oR>b)oR{9woR@ymoR=QcoR_}SoR?m-243$^&3Wlr&3Wl# zvwiRWNnV|&WMjlHGBMr@vM|(n7KR$m!cd=C7-}yILtSNIsF^Gb^^l42v7Uut9A{w| zqnmSWtsaZ4?>xpyl@F(O7+h?@(rKU}o2a81o7YVvHY%zS8@1MmjVf%!MtwG7qjDRu zQPYjssP<-T-Uk}7(IFbK(L4O?)zsV)o=U^{+41{?+{rng7(;ZPP>2-$7a_gY3y{=x z0g@UnKvJ&-NNTeHNgWm-sks6q^;LxQS}H(NHw8#)WEP1R9)!0`>iGaThaWH0a2s=4 znL~D(sbr|lgV#_+9;l@X25PE;f!eBIpvEc~sI>|PYOaET+N)yl8mwTT7AqL2$uo1x z!qb%To6fY~tM7lqne=kn{(E)!PM=M9M5PUQyjH7usMu;A>b9DP>aFIXhO2p~U4=GRi{fl zsXATaN!95RPpVFrdD3*c#FMJiB_8VZ^jv!y_ClPKp7F@jEweLNOXyDH4Om3s)hu4$ zl`K?uB@4A($wFmUvQXEREL3$R3pHKILPb}zcs*CLP|cMr)bfcmEwAirn(dPZ6%TQp zeyi}J+zPzcY%!i{Eyh!)#ds>T7*A~$R*0s`3enV9A({#+Mtgk~qN%PzG_^H5 zHM5JQy4nUHDVI|HDU5vY`{caHejMg8!%C?4Vb9i229j(114&^0TcDzgvo2Y z0TXrKfQcS(_I-!FzQgAM^bCc*f_J8NNnEJs=zO3VmpDNqF7E|RxabB=xabE>xabH? zxabK@xabN^xabQ_xabUxxV$$s;i5Y<;i5kr8rSx@@j0vGIjK9%7obGl*(k5$OcWKH ziJ~?$QB+|jih9dLQCXQNYA6#$wPd5bE;3P6Kqkt@n&Z)nK5p2VkI28nHgj9f+HmiT zqsDgqxMS&QJ9T7ZL>rkHuZ%1Vb&-XkDzY%tL>7jM$ih$$Ss1Dz3qvhrV!RTvFw{X7 zhAKEY9-|4TF>jP2yI8MekjSrM@H(hqpeiaDsF4Z=DyD*g`l(=`nkpEmtqKMzt%||x zu7ZIotYDxfPmC)otRJ9N8d*a;Q-&bNo`5i|O!U_#X6|x0 zI=wXG5)C!t^15omMXfdAqW+q2QIk!$sM97~)NT_l>bVIQHQtEJ>%IvWy`Tvf{o&O6 z;sMv?jNUuq1pV`>&dO)o{`B4nUyy$26m|mf&NO1!14aLFihaSa-kwJGTXA>bvYh7r zNajuN%WUdZfB*O79kRFGE%&bci~D!)ET`$*Ejg{YS7KW4PDyF$K1pfmE=g(W9!Y8G z4oPXL{-m^2cT!raH!-bOXHr_KFDWh6HAst7DDFAT+~fVL4@Fzoef0efadxa9XLD)0 zc+18}++|{X{AFPnhglfLV-|*SnT26|W?>koSs2D^7KU+~iShB9g<%|LVHnSE_G2{e z0itB(X}!0XQgpGKm{KA(DW#9ogp`cVgp`cQgp`cLgp`cGgp`cBgp`c6gp`c1q?A6c z5>hgn5>ncT1Sj`hmp1}jlU8>47V4kNrx=kS%_H~K(H~CFb3OL`^2xU^ zZPuVWPiVj*ZcxqQeV~$s4p7NL?N_o;^_48tdnF5%Udcj@SF%vu)hu4ul`K?rB@4BD zY)*~mq@5pG9X^$h>2zC+6}1*(y+(_$RAv#DdMv_Hg+*9uuLw)U6=A8fA}rNai1nH( z!cs{^Sn6kEP79bZ>+b*@QPcTahE7|Jm_%t!n7r;9Fj0jKn5fAHOjKwCChD~T6V=;* ziCS*JL}fQ&@;Yz8MAbK7q6f^5Yx*9r>F)aZ>?bmA#`&S)9Hra7t#w=JZm`7F`9gC} zafrs8-Yc4N(lwfL(m$GV(n*?f(o>pp(p{Qz(r21-(s3GddhcnxVa<8zW3%&&7p4DnPxb@ck^l9CSY7Mdk>9a~ zJ3qI#gzh|Qc9tcLMI5P`#rsbs3*DxYh2B!hLMN$Yp>I^O&?PEa=n0i9bbx9WulGt8 zs=JbfT0S$^hrmvXbE4v#vZnZ06#dBcM@`ZPd9M!N>A4AyD7pcU*K{=xRb9bDqA-4^4i*J3<%T8yVYi}BQDF`jy?zU8ZNx_PHe#ce8?jN@jo7I3Mr>4lBQ|na8M>LV+ev-6JWJe_|uK$mczz86RDw86SP586Tab z86Ul*86VxG86W+m86O>`A)oh@W_)y&W_&4Qemv)M(?7}c?bIIP*}WB8GIqG@@O&hm zi<)qx*)`r2hR%x`F^LN`VedfQfF?fQdfSfQb&%fQjDHfQhcsgvt9! z11362115UN?B1*^qJHRqLj7mw#vk+8PWROuqWDS=M&t2n6IDh}#(cFiuFW;3DK*;$Mwbf?({ETYsNYH!D!7t`8m?raimO??jw@NH8Pqs0HG1_aj z5KWC1qN&Y7G&Na>rWOm))L9r(7Rqebt@OqY5ZgvQZ!wJ^cpTeQnLj} zYP0}JO%@=j!2%>TSAe9(3Xs%P5z=d@07=ahAgPfL3$E4P>Gi|CuPpekO`>pN;Y{pNV3;XQCMEva@46da+CL znyh!?#KWI+?G$@5@D#+YsWGBxZj3GEogAgePEj(#ExWcdh`Op6ywWNdsJaRUDzJiq zYOG+OGAkIU(h3GDwt|7`tzz&>u3(_5D;TJ7St znnRRX$>FtG#X)seaZsOC98_o(2Q^y7L6uf39)mp_ty~+~}W19QO zx5qdiaiSk8JGx77oldLpqR|Sx*Jm-F+APLXm&JH$vKUW27UQYKVmx(NjHd=G@Lqq# zcxta0Pu~WW=8T5oz^D$$wA}8Yju6pBBa+>0g}opKvGi$NUEs-NgWj+sh|QR zwNrqkYKo9vF9k>{r2t8d99hyxf0f-Wwq^bFoj!_i(gqdayf(6NR7N(Ay2!>+71=my zA{$3VWaFrZY#h~4fb&|&#!(5`IO^aS&auJU=iy|zw zQG}&Fim=p35tceB!cr?mSn8z+OU)Ewy>5!I)J_qW`uSvD3-R0|){yXCj5~fN@(xdn z!pTuP@<(SQJDseBS2VN+Uazm_ywqNEUh1+rFE!homwIl_ORYEOr4KacrAMrR*ZW6v zUV2M&-jsG5r^1{Sr@1aGf7|lzC;TrbMa;JKV;J#^OpNz}EDUv?g`tMCFw|!jhT6-* zP*+(PY9y#p);JE z(<#3Dt;}Gmx-lZXC#{#BROmKJk)5_H8AR1p3|`L_3{-Lj12tU1K=oEIP`4EfRBQzU zwOYYIl~yr$eO53~nH3DwmK&KLFd*gf>;nV<7B zQ`hCU+b({SFh`S3cv5t_oS!tEF7c%5bcrWbr%ODkI$h#P)#(yXs!o@9Qgyn-ld98Y zo-~~<@ucc>iHABpJ=fC>>+9nxb(=Nlt}SlBA_}i&@%pZ0p}H$ssO?G?D!Y<}x~^oQ zsw-Kj=}HzVx|+r7xsruyu4JK>kEf}zzlXpjIzS)QX}1C`nk`0qtrnuG(Lyw}S%{`4 z3(?eKA(|R2L{oc(Xlkw)?X^~jrp5}<)YgeD>8C!DbFm*tKlOtA{3PvZr!!@^PG41c zQCJ1uYpfVgl@;Tuvtm4zR*a|Cit$uiF`jxW##3<>c(1u)JXKeWr|!-!=?7!d`M$2Z zP|wlnu^E?Wvk{lqX%jALwh0&Y+k}f+Zo)-fH{qhjn{ZL@O}ME2MqJ(pnsCt*nsCt{ zHkP!#IEFo6%g}j4BPMZ%CQRNJ8Zgln8Zgll8Zglj8Zglh8Zglf8Zgld8ZglbnlO1E zXuw1lXuw1dIF+v8;d3Hxv40W#V~Fi^U(F$kujKGrui~J}t2n6dDh?{Uii4W2;-H$V zIH=<)4l1~k!)v#SgQ~6Kpk7a=>$N}YWZ+`TM?E@E5cG^MOdn<2uocRVX3G>tk+TzmMSX3Qa>`!HLZnr<-3P+ddRiulSAIC z!*{xB!Xp}Mz~l8+%|q=~^H7J?Jk(@05A|8iL#bwaT_1=Vwx^Kco{WsyF4>aQPe$a%AzR-j#rQaUwexgmE?N==0J6~wR zv(#@-%g=JZJ%xu}P<>x1{q~gnr1aZUcvAZ9DLg6t_7t9!etQZ}O20jgXSv^=!jsZ( zPvN1?ug7VJb5&d2$uz^({JcCBc-Eh!fm1cENWcEu=`sA*>%T_l7tick;wjJQTHbe_ z$+hTB&*WP4uV->CdfYR)7JcxUT#H`$Os+*geJ0nU=RTurd0&1e*P?enlWWo6kI#8; zSi|qH3cAxJsLq2c(Bi7aXz!DSXgXgZnqF3jraKj)={JRFI!Ga!o=}LU%8Sunw}ogb zu@IdyhXQTkJqHVOpBI*tw#?D#t{K%|rc)ZR8Rqu+9^O%HAP6TmjWb}Qh=mJjx0s| zVCHn9Eei_ir|3L}*C)&f)C8$o*6=+d%G1}|55KYww{ z#o2f(7iZ(GT%3)!@^L!e%Ej4uD;Gx{T%5+?G}8ytW5iqQ^v#irYseq9Wa~7v23Ap6 zb5^gv#;jClV^(UnF)Nkbn3cM3%t}{i%u3H_%t}XT&g%W9F)Q7uF)O`lX4Yj(W{hr% zUrqFhH>Q1Q9@%+NC4=})6@&Md3I_T}1p_^!f`R@}!9XvlV4&_R7^v|I2I{$r!E3jI zfjX^VNYNyE&^L=TIfqQsvub%J3ZiIJ(nj0~XO|HH+71B@1<0$wIAG zvQV#;EYxfz3w2w`LhV+vP`}kIUc;3v)Nv&XwS0V9jbW{SW&g~K15Bej?N*>gv&Cqy z)j~8iT8O4L3(?eMA(~n&L{o!>XlkzzP0bafz19lR)L0>!+L~EM{aD7559PTD%zjOd zDreStQt+MLn(&D78t`}xR`XDe)jZT?H4hb9%|oqL^H8?E%cs}a7`hLkmZyXAxkMkge;{D5wesrM95Og5Ftw`Lxe1)3=y)FGDOI7N{f)Clp#Wv zQZhmgu13gZS=+N6VO@MArIYALNatf?F&!ggF&*P#F&(2~F&$%KF&!gfF&*P!F&(2J zA)Swf#dM5>#dM5=3qKckzz)G1@~^geXl;HYZ5H+iUXhmTp?@O7+QfI|cRf>8&uIMG zb+OWnOX8^!myfw7T#U;mT#Vf&T#WA~T+~1lF6yKS7q!%ci+XFsQ>qKk=%*N5yyg%}OsC%}DQcn4F$kOHNNcC8wumlG9Tc$>|yU$>|y2$>|xx z8R>nTCZ}gCCZ}h-owPmX=y&#GPv6g~;~6|%`&inV8=>VWL`n=6A$>F!AQ_hhNJeM@ zlCfHVWYiWQ8NUTcMsfj?F4qd5!1IL^W_g0nD;-7E~FHWTCHH4DQ?&B8E7&!opF zo(aOK2N(x-@mhtK*sZ|(I4;IBri<~6?_xY-y%^89FUC^?#dzwW7*B0f;Jr?Y@zhK) zp87d@R@@x(uG`XQ!6+Crz&oN3%(=$zD(DoGi4cusA-pOw5Y#~if{~wrV60~#7~L5N z#&ZUO5uAZw%w{2clx83pml+5~;>L6&V$SAUSz(w;aa~S%lQoA*28q-v1|PW<42kt7M_lDp{zuN){@vl7*_PWTEmZS*X5B7Amls#jCKAg-WbsS?Y0Nr&@d}@p6xA z95L798bi$YxKJT>r2>ku)WVUz7Pe%xfxQNp`P}lZ{5$_|=gC>= zCFV2I`#4Wd&)7~*&v;Hw&lpZl&$vxa&sa@P&-hGE&zQ_e@8d8zJ!3C9J>%^d;tjLv zkK}LPdCz(W#!Mx?kJgd0F%ox~7$19C7{*@~hB26hVH{>*7>ijL#$y(SF`0#7TxMc? zY-V8?pII2|sm{eHPS(09eFLlob*^|c4}qR)4#G!g27iQ4D)3$-#ds>F7*G9d#473cHo`ZyLo$9UpmX+02GLLzgI7@n z19eovKqXZ$P)ijIR8s{5^;E$?MO83RQ&kLJRTT`>RRsf;bzxI_KvB8{ME08-1V|n|FXlY}9@uHmd&goa(QOvN6jz zRJ=W5>n73KXSwUwfAp>hC-=n_;Y6DSIIqfV z9QBxuqY|@m)L=G_>dVGaciA{9E*nR!72v$evT@W`Hg2r-(l!UHU)X)Db5fTi)_43U z`g*6RF1mZF&O;B|pB(gR`;(3yYk$(wW9?5mdaV6PM~}5X>FBZcCmlW3{-mSF+MgWs zYWtIp9&3Nn(NxLNxYfX(gh$@}@l^YcJ1>8sk~{LJQ${92)R2Yn3dle(>N60G^b7=} zI|IRp&Ok7VGZ2j23Po0JRFb8o?qvohkl)d zUiIsA^q60#qsRO@9X;mP>F6=PPDhXVbvk;?uhY?Eew~9}_3L!>m|v%(&98@Jgm4y# z>crLpf?ww$;MX|__3Lzm`E@$N{5lvV+qbvlBP z_|6bvYg0H!6*EKkd{5htF}Kpwp7Xx1J#;(`ev|vy!aGzrZark9V0~6Myru7~JhydU z`uJ!&uE<~H#vRW|-D#%)RdOw_q0DPhN0}&UDHBCKWumC5OcZsMiK4bLQPfv9%4;kW zMV)1$sI_Ajy?Ppmo@Iz#oHOSbW@99BGci7HvoMU>EDU2d3&V)b!Z2R5FpSnL3}ZD5 z!${4<_&CkNFiNv9jL}!a88!W$hX)=SDmSuZIMWxb?4l=YJGP}WPzLs>5=7p1+V zJe2j4@=%Q4O++Tjvmd=zWp;mC{^;4&IFAIYY#5!OH`PA{T72#J5{u4?VmDrJK(_@H zo_EJdCwB%pz;|Iau75>5EsuAuL0R|wn5A>i=A5Fs#++W0O*yI9rkvDsQ%uQ_(U~}cZNz9 zdO;-%)nCa%y;rhO;gu}ZbR`Q_T**S+R+f3S82azlFHI) zyCIusycwI--wMK(1?v*(1?wm(1?xR(1?v5(TvS|MI$zPMk6+Q$F+3T zulE1@qlNx%z0L{Nd5QS8;Jx8D?m7v=io6I^SC>zqsBS`Mu|@jh~LU zHh%iu+W6^qYvZTat&N{fw>EzI+}il*a%<%G9=A4rI^5d$>2GJ}{Ou$0u50q71)iM1 z3=LN8@yteloaf%`_wY7k?icTzyG!qrIq0{SQgnWpm{OcADW&(Qgp_ofgp~A+gp_oE zgp|~BLQ1MKAtm*dkdjJCO6g-hAtj?XAtmGRm41ZS{t)-Z_~%``%ziIXGV{HUjmhsB z5tH9D4ko{6?N5HsI-mTWH9h$~>v!^d*6PgnzAh)fXAMq%&w4x2ub=q+fgk&|Bb=KY z@5#5Ptx9lGp9R2VUT8pPB(|iV{y_d<&H{Vf<;~*n zj3Y<)mK;k@+bJX)Bl^h1cy(l9sEsTPm63&^F0wFGMHYsd$ih$&Ss3ae6XVs8g`pO* zFjT^;h*6wNZM&wrNSyda;%)RBA5|mYFm^`1VT6o)!#EiEhP6HN4eNB|8`j*&H>{u0 zZ+tC`e8aLH`GzHW22aM|ycE0xYuJ{a^|J*yB?)cvGQ4Kq0ILP)b(+u^$*-g0B@ z3~Iy8mQvu_@g*={Ci9dQvf-&Q*-3zZK)@g2i}xWig(PT7mbzTa2eW7vt&SCoYO|!r39|^EM?o z(M!SgyiT%l)JHasy2!>+57{{CAREW{&&DzCvvG{~0-TTYY#ie|8^^dlH9YaD|Lm5{ zEAK>m-McoS7%TBzi1jgEgk_u;VHxX1SjKx1mN8$1W!x8G8T&<8#(yE!YoG{A9TZ`y zg#+k&ZAkC(w!0vGrzc}EznDg1dm)XF;n_5d)!8(R$=NiFz1cL3vDq|?rP(x$nb|aq zjfFHm24>T+u4mJ*PT$aZ7@VbTCu783<_^w(-+5h9I;s1FbiV!<(=i4X(=iSf(=iqn z(=i?v(=jF%(=jd<(=j#@()svUOve~mOvgAmgmbPQ$oS}%9|K`rc-22)5uV!$DcoD( zXB)R&UD>nbj$M`!{7rF_>+*MXJRGl)bfd>p`Is(7i?L{r%dV^KaS7Ji;}Wd3$0b;6 zk4v!D9+zOPJubmodt8FG_P7kI?Qsd#+T#)|HF+`~WnFc;6B=*N!>ZFc`TM}nn%POj z(L2owk)nelq*p-!k{T#LQUL`>#(x2l(O-aM>=z&z`2|SEeG$?}eF2g&Uw~x9pN=EG zKlAvBv>|AfFyr`0=85&BMm#s%`F{mkBEJ~zqrVVM1r(yGf7})3ei+VA)2Zv zL{k~XXs?b!G!;^arbHTh^E!_;ntv;$TH9KL2s_9cyb~6-_i} z^@?fCN;^Qj3jQsno`-)Nx~0s=P5PJ)k+OcZkNU^pD1@beHRO?y?oVyIj|s zugh%7HF2Ts&;wojHN<(=d=2kIYrO_tX|30wN3Hc5bgZ>rgZ{PFYtYTsdJTHpTCYK; zTk|!%@2&M3biuV=gP!==oG04&;awSH(;_ek6Q~jy=^Vr^t82b)63SvO%GcWxA(5KaMQEa!cDKb z*21fFcj1I%t@#S#TWh_7cds>GfgZNTE6~Z-cm?{|8m~ZCTjLezZEL&&9d3=6B?OJxOHZ{G{fb;%<#Oy`MGZq=Pl(q-Qnd zq)RpBq%Sq)q!Tser1v!Cq}w#+^#0P6laA7qlOD1;?;+UPjVJHV$=@9r**z5h(0O*e zzouJ3YQQ2sQO)9=p^}AOP{~5|SF%v=l`K?vB?~oO$wC!ZvQW3xEMBRVEYxNt3)Ofg zO^w(gcgOE{(04v{I;_Hr0xR%dd&PLFt{6|f72~P2VmvigjHkMa@zhl@o{Fl#do2~? zsiI;$^>Z>!KUe&oAv_1zDW?!AnkhnhwG<$!lL90aQh=m33XoJq0g`$sKvD?>NNS)6 z>7%~@$+#~-GU6}JMLcG;Y_?u^_doP!lzcgOp0!g!LpD)HGd8c5Mr>42BQ~n45gV1( zh>hxN#70FnVxvkMu~E6r*u0t>u~FfT*r@v1oe*QH-%8n~um)Cff#$5<4H~o36&kbB z9U8OJB^tBREgG}ZH5#+hJsPvpMVhmEH)+gDS82>jceyavr|5r&cYf&%5l(2iD}QjZ z#*@&mZpI}}(um9ZM-wi(MiVZ2MH4PML=!IhLK7~!K@%=|Koc%1zY&+$dlN3Iya^Yz zeYvmS{xbqwGPk?!pUS-H_wd}4-|57RT5rZjy*J~d=9}?R z_s#gI{bqdBe=|OMKtn$71I_s81N5*N4Q64e zvn&j?l!c*QvM|&{7KU-3iSeX0=drx@T+CeJiuMIIYbcNlVwo zaaQ^~ejmTd{EXe?^o-l&^o-f$^o-Z!^o-Ty^o-Nw^o-Gr^gce5(=#@c(=#qN;&{XU z8k`?^+n=L|*;d^hecAV*v>%1^dV&T|udif~n5<&(QCh*kxUFDdBv&vnwksGI?G+4+ z{|W{wqJn`MsbcV|sbHXvDj2A&SA$ae``Fy^sc*tLGpays9q{Iv>&_khKvcLR&m;85 zJ4h3sHWS7-Sk=ozbgfDuQnXxz^cpTeQo996YPJALtrj4u(E=p3S%9P_3y{=e5z=e0 z07>l?AgQ?tWZcGW%etYeqW45kA#yt6=dU>z@pH)eh@V5wNBkUeKH}$)^ASIXoR9c9 zA?G809yu5BbIAFKpF=X@PgykgTLt@6dvtxC&gF}-67_{xANNIAMt%{Nv0sE` z^cP_n|3z3Tpa@G16k(}?Laf(85td3Q!cq&z_1txwn}l~93{O0_bNKK^_d8*ArvN4K zpN;a7pNV43XQCMGnJC72CW;ZBiDGPLq8QbgD8_R(%13f0iZPstV)UL}eQN+l-&oDS z>Hl~h8RG!Fo#vrm;dmrx#60oecaC1oA(36l;p4oDgHd0_K@C)KP!Uxe)JGKu)l$Vl z?No74NtGO4S5+KTSrrF0_uf!*rl|h>>@Q@_3oVMCpB@z1>8=TnXs-c}*IzXcHCW9< z9ai&Di`6{TV>J&oSyM{*;gCbj`K$i>}wm@AbYme)_=L_~{R8)d0NR>#;anbQ)0wTD++k?VYC( zO&^o(s`bYayCiEJk~!6{4x5LNrzK#hgmw)3t}smY$Qoz(eT^ zT$jE9#?N}T*I-p{d!6jvNZ}b=MKrzkt9b3N`6~2?HD85ZvgWJMbJlzndefS(LJwQ> zRp@nVz6w2Y?N{;Mx#p|TW7m8Ydhus-ZrLAm^;4=(>yDy};>mdSVsO&z+PK9T*Tn7p za4p<)!L@MH`_{ru$6E_GeQqt>bhou|)6>?%O($CuxA(8LaMQKc!cDI_)pwxbN_qVL zxZxPfRzt>Tp8D_89AdjZA7`q|ImEXrIlMnranOgVIOsQ39Q2hc4*EwG2YsT7gMLuO zLETq!czsuKP{&mqDdW6Y%VWD+?2L%v7_d|0>?pF1U39uOcCX+yu~XY?VyEiY#7;k0 z6FZ$^P3-iLHL=rO*2GTVSsS}|q&2bAtJcI$7u$)wWP7k{JN|CU#q`;W{#a_q^W5`q z9t}@wbl&#NuPKiAjIZf^@R?qd?)XfvNzZ(y*QAp^(`(XSpXoK}y3h2Q^x|iFO*-^5 zzNYu>XL?P#`7^yHJ^qu}$MZe@eLnSxy{cG^u$8{~{Q~hd$J>r6-maaPUC*rLmo{OI z{NDf9#!s(b8$W%0ZT$4`wei!h*Tzq8UK>Ascy0Xj+%@uhe_b0ty>xB-^v#1?vKFhm zw$#C}tKlK{SN?`8wL9`Od|JBB*Rs-!Pi3U{zLT7uK9ZcCzL1=rI!{hd-6p4}4wKVU zSIOzAlZ^B}?vv9qj+4_fF3;$@w>M;0{cU$a;_%5}+!lYcB@wL8nRM}2g_n4&!29?t z#xq`v@r>VMJma|-&-gCJGv15wjQ?Uh^-zKL`Y6UzFU5H3=kk(%&WWaOif$gu6IhR2 ztfn1#ihV^-P5DG$4f(v@n(D;C4Q8UKwoDXtm5HK)GEvk@CW@-aL^1xeQ9jZ$QH<$K6r=apT=Z^A&vhhrvoR96 znHV3pSr|rb7KSmKg<-^IVHmGj7)EOrhOwH3VWehae4J)s7^PVl#;DBHV8ruK=Fw4O z{XMN%OZ=T5TiuqG#W-a*x~alT>{j4?92esm)5UnkcQKx^UW{kl7vrgcVm$RwjHfm# z@Lngycxt8?PyL*ZRWa0$%@0hDH!9Ggono|CP9d7QDMV8>g=lJ~5KYAtqN$fcG}Tgw zrdEp4UMYoW>ZA}&mHcX6CHLJ$X=NTs8}wB-dl$D#BhRWgW)w9wW%LSb$Vk;SWTX-s zGE$ul8L8NYj8t($Mk>1@Bh}uN(K|pxM!G^nMmoibC8y|r-}OU_aH9GGoY!_Xjtb7k zQK#8Bsxcc!&1K`LtZW?hlZ~TF3UFQv**HdgHjZ&UJKK%^;VnO#rDslIHftizoA5~7 zH{kI)sOF(As(GlBY98vQnuj{7=Ao{td8o5$9_p?EkJn)}4|Q41L!EB*b=RK{iND(r zjUslT)cDO%H~pTJJF?@eYnz&Lihdh&dM!8Qq^_HCQsYfIsrROw)P7S=`an}odO}l9 z`a@$*?-fls=^ITs=^>xSJ~5mVioYAKU@bbynwZ5;*23&vWev>qmNhWbVb;J*pIHMl z-DVBU^qe&?(|OjwO#fL6vv;92Fw=|Hz)VN_BzB!SN9wOiF8a}0c*Tv@!0WxJIWL{4 zIWK*vIWJwPIWIk^IWHZkIWPUEIWOI34ZPlan)A|mn)BxR4rV~^%1X382h+}Xa(Hum zC!IIXcT#zCeJ7PS*LPBRbA2b3H`jMkd2@Xyl{eRSQh9TIC!IIXcT#zCeJ7QdzO#|q z-vRIFPT)!g@scVA?-~^h^oI%tIza^kHDAF%byqM@#}y1zYy|_gS;gR0SiwNORWMLl zC+C!fH_YDldfJvZl3$Y+eLKv879vGSMM$rp0wk4FfTUsykW@+mk_st6QW*tEDxv^M zB@`jO0t%3f`~oB+es}cx{iamUU`rz#^)tX7TE&WTA>GS*WH; z7OJX}h3cwgp~@;*sJ2QLs;-*FtFMxUDy(D)y)?XC@cLjszdj9#ot9X)z9cKvTmHSD z*L%IR5~TLh@{!g{%SDD>S}rp5(sGfZmzIkRy|i3p=%wW%LoY2C8G32?Nb9BLB111N z7s-e}W|7?Av0*3SZMtu{zY3=WV4ty^3YCqKD9^LZ=`0MRISa!$&cZN) zvoMU^EDWPI6XWAG3&Tjw!k8;#v|!KtU6I*t#44V!(l;~PJ7YKHX)K)C8@*TZWEm2! zT!K_r&PSRn=OfLP^O5Gt`ABo+e5AQ@KGIw{A8D>!f>c+|N17|=BN_4U4UzC+e1~_b z;@l>@wFfIdc!v9lJOzTcu3qC<;aYI&COo2s20UIH)jU*6H4k-D%|jJc^H5XOJXBaU z5A{~fL-jS_@mj3rp)#v^sM8Zeouc1_cZ2?1#t64Xn>U=kY3qUf{wV0O2q!u$zXY6#8wu<$5;k}v6g{g%w-@Ldl?AEU zchI>bY3aIn%}OuPnvveeYI1r;YI1tUX>xi-X>xkTXmWZ+XmWbSXL5Q*XGVG-o5|@J znaSywycBCgcYM$Bwx98s_PJroE;c7sGLD$@(lNxmm#!j~ymS?@TLD;OB*6%3603I-~nf`Q7YV4zZ}7`$>S7^tKQ1}f{+yt3k+%F1Z0 z7%OTj#CjbSVX2@ZEVWaFrD}?>)JqYTN-4rpBSl!MqY&$LQG}%;im=qeA!y-i`Fr1e zGgy-!S?$S4E%Bb5+DCX|YQ}V8YDRHlYQ}A1YDQ{eYQ|<_YDQyXYQ|r3Y9DclsTpI5 zsmG$~p3KlbkY0=Su$Q80KJ_rF=2EXl)pY8ysG3ea7FE-!$D(RF^;lF*ryh%{>C|IU zHJy4as^(I!M%8rcv8b9(&8U(!g|J(%znkK$?3=)@qObkx0NxvmRq8l>w7a4Sk3?bv z9v`FCJdECI9>#Sw4at8|oA%`aTq` z;_WC{S^v;ImY?x-#yvS{3OoPalW!k6tj9;sXf)>({Wj+GT5ifoT{q>V#+!0d?@c+W z{idAsfu@}Fgr=PIhsK=VE1GiBH=1(NLrzb7Nbm@x!EUv4oE7V4zADh-3&m*f0EK93 zy%0@R7ow@(LNt|Hh^8hB(Ntd{nmQ{+dqowZshvVJRU&g?Q$6D09GC5z>CYUy^R*0} z<{B}H{+cj(EjD1HE*mgWqYap-*9J_~ZUZLjxB(M2-GGVuZo=fX-hhd^Z@@$kxSX!w zcm*l6qJy4xQ$A61Lq4zRW_(n3Gd}9O86Q>NjE`Dx#z)0B4I@lpK^`Md`-=uhh847&Y_n_ zt8?h((dry}d9*r@UK*{=p_fOib7-pMjbWM(WG48&`;A|@kw`u`|9z*Iq;zR~UIUAK zjP}KJjO)d8jNrv|jMc?-jLOAyjK9TnjI@MwKBgAaF?tr$F;0$$cco*LvLkaGSliPz zy~!u>3Q!Uw*(e_|nJC6jCW_INiDGPJq8MqJD8^kTicy$}VoYYEe1vAA7_XTqM(@QC zz5Tg1J$vS!yD4j3wnBYQA{)_-C))7ub@>kU-g#X^Hi`CTY+eP8*r<+1Y*bAnHma!+ z8&%ebjp}Q}MpZUqqgtD>c@;Neqq-ZhQS~Q3ku|7?-8%MFS(DlprC*cw>yE5u+ZiAq z%O`l=AX?cjM2eb=kY2e3NUF2|NktYQslEavl~#bHstS-)Pyv!^DMET>6dIZW=L(BAPIHg*0HIVj3_}K@FIws0K__SOX?1t^pGj*no+OY{KLf+JK3Q zZNNkYpUqY973rN~*H+YeRda}HD>=Mgt2n6CDh_J2ii7H`;-D_8IH<@f4r;NAgDR}# z@cOIbpz^9XsJV?*%{`V8;2lv`c(xC-Vi*-Z6tz8Z7v!htoqd%IqPHprueJ&XYOR8S zN~>U?&MFwFvI+)jtb&0Gt6-qMsu;YwDj2A(3Wli>m_569PSk{$xg`JVzT(^RTXa^? zN*_24IW_`IL5`2WmXT8s3DqoK6_qSh zNF@u^QprN)RI*S-l`K?LB@5M6$wH-7vv}22vQUAQEL7w1p&HTN=nCgu>CHXzGlCEN zvoF@uyCHkcOHiG5E6}3ZVzk$4A(|R3L{poEXlk+$O)VCpslh@twO5Fy=8Dl?YlUcP ztPo9Y9T}=*OIonI(xTxhGK`!)mfs&rua2kqoXAVx>8S`ON-Ds44Q1n~o@^X-lZ~Td zvT@W(HjXOE#!(;HI4Yw6=QWXyqZ+bt)WMm&xE{{9yZ7qwolctYh;AD2cpX*qP*>GF z)LAtTbyv+p9ai&Dm(@JfX*CaZ+knUGxSEH$uI8c6SH_|9?Om9cU!B`aMRwX=nTg3` z5LH((cs*AzP{|bx)Nlm@)myr051e>#Bh0xp;}W$s;_|v{!bJr(;i49sa8Z>_xTw!2 zTvTckE^4+37uDN{%j>ua7Zu%vi`rgUQ^(WOw(t11-?0h(o)Z=KcWXWwjy!)gbcs@? zu03wdD2~yT(fdY2M!H8sMtVp?MmkADM*2xZM!HHvMtVy_MmkJWM(;BX8R<3+8R5FUOrX#M2+k4?!xaopx;imts%o~r7KC#1STV}1I8L2{~_)HPfyGQ|& z9#Md#0~8>s?*b&%TY#iC3y@S^0g}2ZLVDE{AgPH0BqRRdB{}8!JvlA*ip;KVx?juR ztFqJcvi$pjoGp7<_Pc!`-?@VyOU&=cOe~(i+mc-ak0tuCTVS|z;9bFdC@0}7&nowM zVZS2ZekkvVJu5$*7luve-gzL*IDh(@%=d1~74G|4-|OBU?ml?x_6a_5gE7-kot#?*6)z$9=iW`!XZ<$Q^c{2<}Vy|JQ=PBXxnd z_hR1erlfc%pB^N?2>$@b$n5NL;YQr&#ubPc-ODa)}!urb77JtvF@T-Yvdz*B_tc=EPGcE*@33xhddp+U?+tO=`y-l@y1!O-rJqar-tuLkCs|&X>tI(P z&XdP!G4LX7mEHBSE3C$po=5}#T&c@1%C52L%VzNo3d<<85sOzyitg1GsbA9YM)NdR z7(snTL=6;hSN_Ly46DkQ2r8`K)hl5=f2?(sYcwgJ_)gm7I%Zrg8@F8+mHm>LzlM}e zQvYKqc5oGpMcBF*>ZzaesrqzRTa?QbdwGdiFGtV3!cON$(u2ha;g)krt;K37k8y5E zA47YBrS1z|hW1!p_lo2fz6cHBdyIReEDCE94E8>d8E-EvmCI75cn`^j#2lhd&tJl) zzHeFRxAFKdln!Q+cX}=+Pk z2`5_JPwc7A-$&H%J)4sEem~xN-4^HWOg_i2B~~B#QWTv%cf|eFx!wOn{{BGz{!Bjk zYbXD{@U65$cjUe$reD1$C4Se(w~a@BEaO*6f8eT*`)~%3D(=?sMV!f%|iJ z#{EP%mF=f~B>#?kTRzwCKbN00jn**weA)}&kz5`YhPNf<+w$j3hxqSgu37@9yIPM^HMow^rs-w&A=|H;ev7AetlhP(Jr4Mk;0CfnRKtL^7-q$vWoYg??r#)j>M|}?X6)R5BZ!TMy4`{h&2=-~fhj~=OSO9{$|`$e#zq%da!_jE6QxuPG-og9($ zI$MO+Y)4A#uCNVfbTFR2D`{1^hh)c9zcdex%!TZF17}%lts__c^*Yh$+us-E#J!4Z zKGzth-XZ+o~EqSru-;$sH;C7wV^7+2}X7+?;=~h%OpUHRMNN9g9RsMy8 zrNO2gkq7dTd;d(X@Ib0=$DML+U;lbAZ5TDG+&zbSL$LPi%I&jH^e)|VzVcrP;ox2g zKjR2egt?!(eLXZ$pGf#ZENB2>j^Bz1Fl__bK>U!SOv%0aYso9F_m%I!>7$>18sW`V zuJD2epJF$r-_XddiX6tOp$kz%viH2aG2v)~-~BQnwdJQbbwU*u;7)G%l$Yg>?BLz= z-Zn6e0K?wz?{&XSzy8So{KVgh$mobpjNtIP{c?x>)LI{UZ4A#2J9pJA3XKD%L{T0G z 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

    P!%aBS7G9X@ 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 z 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

    `$7q0mOk)0&n7L;_vmCI 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

    S!LAcQfFx?Hrq0eITQ>_vDsF1 zOam}1#THx5F~@;nDYn@9j%np&w%SIHIn&8(wJjavpXh(KZ5-pD=zq2y9OHLaez9F0 z<9AnnvArGB0hT{QE&po!I_4@cD}@>47(dc(vqK%@N7`+6j4*Lr-ELP3lW%T^owcyD z-8S8q@yR!Qv%d+<@3xO){Ik^`c84$pW*oFwJAc>;`>7W9MSp|VpLUUBo`MW5|7o`+ zG4|zRW~XgeR<-&oRp!^N%f8PPH~W#uOXnnBr%v&$d{(@|20K zrFgLh!sMF+A;Z>Nyjbfb8Lpp;7waI*`jQPHQwknt73<`f)4-Gyrn_T$g2@r4k7M$| z915mHvHp&k1g5$$d5(DzOkFUEVnda&E5I}mW{qQ3f?+!>S!}B?i|qz5$3v!6v2D)I zPB15dDP3%*V@jWcU#=1+d;eH=&gNx`Ra7SX5Xf-G-?vybVaA(UV9titzQx7~6Hk7Y zEjCq{0&@anxk)oQG%#LuFE$V-wXR%pry_gdxm%5>4OAB+Mxz zhea5|@Vl{yhzrXK)-}~*lUeD)i+h?EBwQGmklN0u2pVjV^NgYSqGTN3+tsa}Y z&+@6ZTx!eamh-LYov%z=CfTxub?xSkeA(r4Tbw_g_O{AMRnvOC@#WI!Oz;OXA(Z z*=t6Rrz8Pnp(KoaCW#@xN|MOB!_5{MWE)8y*;`UVj+9i9Gb9b0ewM_MEsr*xQ^>)REHXw?KyHuyda4oHAxcr zR+2%iW6TzLWHU(#*-cVK4wf{KlO%0qoWvJ&x0odfBF{)7$TCSB`B{=ee8-y3S){+D zfDD(Ekqaa>vmow@gu7wA;de<^ob%nN)pJSk~A_}l0&i*=TnQ$&(|Z8 z3bII2N4}S|kPVJAeZ0H4b9R>mkl~Ura*-s4+duhnyrSB4Z`azo|Rv(|7V+Wc8CIkztYya-JlQWF;l!AxRZkAZZ|9O4^9$B-6*& z&+XGk5<~_{oKG=1olla)k+dX*+$PB)Pf7~NVo4cUC8;6noNO94k?kd({%)U$#E+aR z2_X|CQRH?>0+}aCBkxLb$d8gDvi>QiVFd|F>c~No7IK=z8*;a}LJ~mok}&eDB!(=L zB$1ya8DxV~O~X9WS5iU_l~j?lBn>1ZX(O{GzCGM6UX%op41T;kc&?d&<-r2CO=B_U*pB#N9RNg&rs(#U<195P>0L{>^F zNRNc+Q%81`w2(t3-o4x{MoR)nRuV=Yk;ITik|grIB!g^lhUt?>c9)cp;S%S{b?05; zQb_~3Thd0}l=ud?XZfv@6f#qiMP8B=kgp_VWW%#eRt?!l z(nL;|c=mStWF>y&F-ZtnCW#_{N)kw5lu1t`he>kCg%al~aOcsuRZ>A-mei4zk`}Vw z*(S@ok2_}%NdSpU!pLMv40%YBM5>Yu@}ne=^gPF;myrD>RU{#4AlFOU$XtnUUw4aT zk|5HSM36qCO?n(TM3O?zlVp*cq<}mpDI@PoYDinsM7BzrbWhmrJXqpK&X9zVYb8^Z>gytBlQ43;=o=sNEb$4R2d7)b)TMv_MEl;n`7Bt@husURyQ z&egY0diM)V=N7W9#JNVc^IcsMKu(v0kt-!JWVR%Uye!EepGfk^Uy>5C#f7F}6$wik z$O)1*GG5|bC+ci5T@pkdl|+!YByr?RNeZzpGJUehmXZRpkEDzoBdH-5N}9-2iD$6e z`5}oPnJ)<;DMdDno=sfbhE;i`_ zWPeE*IZYBnu9hT`ha?$fktC1&C@CT9Ut-d$$ZnDba+IWvTqyBH+%0BEf=EdcLEe?b zkzXV!WYbGcpDZ#!Qb3NAl#%h08gjd&iIgRtgWS%`CC;^X&U3Lw5<+^8HGQJU07(KF zDM=$^B{^i4q=?LuRFLJ8IoU_Pi-aWw&QS! z3prEb9qP`>N&?6ek}&eIB!;Xv!DJTWSr5=35Rjw)R6g-Ceo024s$zOlT5lF=`9H% z`%9uoT#`V>OVY?JNe+2hQbcN!3i5}fj%;_OY1l%Jl6a%;7HLTUc|a0ImP%sCpOPf9 z!(@}?Tx;UI!jG2ZkqMF#@}Q)O)Fch$Z%G^3DPyvHhr3w^OM=KKNd&o05=S1Aq>zP@ zEYg$|kae#z>1AXWNewwt(nQ8cJV&^lr%C+C6Os_}jwFh-B+iuz&f~nv)uvAx*+-H? zPL>prjHH4*C~>Y-a3(L3w2+@9-Xq;(dR}AF1IT`oFmjqChFl{_B1K6CSt7|Jzeq|* zuWLQh$aINsn7hSuk|44|5<%9v&SW|NHt#$>{Upx6%{y|uB#T@rDIgC? z%E(el4f$QtMEYEB(mhAHS%*se$c2&+a+@TIyedf`-$>HPMpH~y4%tUiL{5`bkn1IN za_1S`OVU72 zlC+VlB)+5Fvx<@+@{S~e{4R+jTTeCVDdZ4I78xZeAX!NnnJcLwHAxd$Bk{!C&i)%s zx*r)R2_Xqd6uDNCK#GzyvRINsT9P8t^CpvCLBf(ca)P9VOptg-xLeGY1dxg(jI5Nz zkaeb+^d!<(l0k+^^2kM!5;9X#MV^&3kh-Le{4Mbv<8IMsy6F={4wgiaF_JiPt0aZI zD#;?>N(zW?hRG@;`$=lZnUW@Qqr`Kp+j*YEk9;NxA?xH!Rut(kNg#1a8o5%ELyD3j zvP@DzI&L;ubz~<=3yDdbD+8RL_X&~!GDi|dmP%qsTarY!n`zQB$S_GB880az1xXco zNzy<*mb8&SCBEa_E&R8b^dPdYB!V0-i6i4ADP)!;i##JKAj>3W`$P8QC~*(rZY6NfS9%;yKanbD6}C+$9MiuSufFN=X9w z*BvH3jqEDPAxBG!$fc4Ba=WCCyd-HMpG&+axm&Dtr%4YW0ZAA+ND@QNlq8XBBpGCm zB#*o)DIwoTs>r|YGJP6IP|`*Ym-tS0w>VD{L~fKg*GV|9pShAavP6Zqbwkkbgg9vckwfNenqhl0y2_a)7QDnL#fs`a^WSJy~tdSIvUXPkS6(lUFBPU5($V7?v z9CwR*Bmtx%2_s)hVn~n2OnMUOE6E_oNb<-Pk`gjUQbm?X8p!Vw=b9epoqwCTCfzsM zm8c|$Tr7zocS_>O8z~Btc}Cr%hG_IY|;nCP`Ar97z`W zkEDS7A}J$VJY%wINJP>^MoT>ByPc;?{K&Hs=XxgRC*@N~6j^JY$x0x*NYcm%Ne)R% zipbrP3bH^_M^;N(NY7_Yx_6A*aG)fBjFNbuz3Q0?{$la0xQjwIAuOv0ZTQ=!U zWH*WDLbr2F;z!0xLP%Z`MP8F6knbdEWV07cdJc(5ipcqr3UZsIj=U~uA*&_ci`*?X zf6-(GkRg&Va)Bg<sqPLl+XDUvW!lEjc@k|ffWWRN}; zlb%NokvLa(Iqx>-NvcRr(mKjhfFyt%ED0m$NMgthk|Z)$l0n{)iGd@gAs-i0R1 zbD7(44~ZW+NfJV?kwlTXk_7U;B#l^Ala)iZmlTm<66eY`=MftxsU!DDTF63)H|?I) zk_3<~-ZtrBWQZh&oG(ctvm_bh6-gfXMp8mHUSzVWNLbQ9j+3;J@e<$V?iRO8f=F2s zK|Yeik-sD3m#U?$3Y%Pf* z10@OMWJwyCAju(jNQy{VQb9hH)REsMEo8GLrlI!=cZ&g%0CKD(j9em#Ava5sNJ)}G zK9S^+j-@8OglsFRB8N&E$oY~sl9Tu*x?4Oe2_hd$B1qSFOnMyIL6Slamt>I(B?aUb zNf{|iYRG4jCepQL(mj*h&O1u{$dQr|a29%55~=QGwE$) zcZqMZyTu4e5E&DtPMb>%W^hqE)OVUVGl0(jw6p^Wt3i6nwjx3b4kZ&d4tK2RA^?~UVKz5ddk;5c0 zWV9rSOp#=ehb4Jrp`?U-E2$#?`q1=gAUjLi$YB!S)$SIfB|+pmNd$RV5=Y*aq>%3= zS!Bby=~F=ZOUlRyNe#JF(nM~Rc&>3fKQHkkA4x*U-;yY@^+%>p0y$8UMlO=%kb5Q0 zb)wGi<#!|%r0d6KavkX}X(6Xeyw|#OW=I0aYmzYXlO%?0^NGnyB1cOy$Ye<#c~VkB zmPo3|_mT#(?x!ZJjqEJ(UFU8wR1!qal0=ZJByr?kNeX#Il0`m|6p%k9Wn}ZuOv4(o zx1@<2Bk^4Cb{;SBBlk!`$Xk*q@}ney^jcxk)5u^+4mn3sM5aqB$a9i9vO>~A*7@9I zd8fEr^pgaT<0WC_N=Xd4SCT{)NHWMONgmm#VbV*;UXm&jmo$(`k~VU`#FurqSSSf1 zt0fU+lP^qq9N9k@%4@k`OXW z5=CB?B#^HpX=Hd0J43t2AlPIc#Wd}Xo%$PSV)GE5Rf z#!8aN-I5HlK$1sROG-%3uT6Rt87OHWqa_^}tT?ixB!vu< zWRXiH1>{ai8F^h&Lz??7uS9V@eCrRqaBuNV?NW9bBv)+&dkZ&YmWZhLJJ%;QiNg_u}GRP&8JaVg~gp?&! zq%LV79p9PsHWHBdrn_4lA_*c%Nd&n`5=Tms6tY~BMcR@A())YUr;J1-HDr{eiDV_7 z8E)sf5rqvBt>Mgq=Nh+sU!YhOnM6$Eb-prZgILKfLtpHBacX8$WloX`BjoZ{J)y?JTgd9 zLe7*_ktvb}GFQ?@-jz7lsXOnzze|G1R%=Xp1c^xE$Z3)kl96PQ`y~ZrfuxLlBdH6bA)zoAd^9h@_32Bk|qtZgG<& zh&(NcAazL`vHmn!DP#vp7CA!VTwCwFR#TEPa+{=vyew%VUrIcAcaHZjlkP|QNkYg- zNfenNNg#71X=JG+hqNU{WV^pjdIcFKsUzbhEuL11+j*(P zkF+HrWV^LZdK4KZNg(4TX`~>@A&VqMWR0YP^jXJb)sdl+7Lt;9?{&AhOAmB@LvH*JQPk!zIqAES%pdVLm!yG=l(dm?65j*v7Pm=)$n%m2QkTS$KP4$-%MDGREOLOPfSe*JBaAc}?P(<92RH{7A<}Cf)h`hV%OAEr}unB?;sdNgA0b$su=3ipa~73i7F>j@VzR z!Jk`NNNBY#UuNN=BMSVaa&8pvsqHZob_ zd&u3QAPFL`OCrdZk~p%~CMG?F>>$Y^LnQ^|97!3ODybn)OPa{X63@eK=kEVD>3(Dv zNeDSc5=ACR63G3MG_pvNLw=DIku5hh=@n#%q>h{?X(2Nu-lDt3Q<4C(ToOk9ki?KJ zdz$nlGDwm^5|TV}jiiJ;B&i~AOB%>(NgLUCGn4Ln#NA>~Nf0?s5<$|EI5JC;Lgq=b z$Z|;mStBVUJ$soxHDrLKiHwwZ9(6m9mH3fak`OXa5=E9v637}!8tJ*Y>61eSNQ%hm z66f$LyD3l@}VSyth0rgoJaPSl#o%9 zDsqdYfy|e*k(CnPTz3oamL@BR>@JBQ$4KJHWs($fwpMdWfx1-VC3N8XUMkfy}@guBIt zTbp#}(?`zha8F4XIYAObCQ6dXeUc3FmL!j?l9Ui%ACq21_LVe{(C$s!j?3dn7eGV+R~hI}PyB5MUqmZ#))-bvy|4wr!IC<1hNOjDEAc+%Zt<`rfGm=Pksl>7q}O&PJ&6pK zWRP){`r=!K~}m` zX7=d1cbAU)o_4-(tB7oB%fp>gLd>^x4YJC}?@S(S)sWshxLXXinn*&2A4_t`uaY9N!H%Y31=&$jM+Qq;$O#hfJa>zfB!Ju?2_yGQ zV#rI9BvO-PkX4dA(tRh>xrA&bsUia;4df_E8#zbfd)D1zvLuM)B@yH)NgP=uNg*pG zS;YRbyUxFr47Li$W|A_}S5iX`k~EPMC7$Qp&KFDk$PJPZa-SrMydX&+?@H3hDoGCM z7BpKFku4+@WDiLlIb700&X9PYcej`#2_R2N!pJ9*7_xR>(F=C3)l;NeOve zQbj(LG>~q)n5;IktHf7!w>VA`L?%lj$RmRY4LM5E zM9!6XUT`~KC-EcqNkYggk|^?#B!T=UNh6!=W*X*@-6cij2uTGwUs6YIlC+S=CEgd^ zEtX0G$WM|m;@jQyi6MJPlE^WV405T&`TU{tjy+3KLY|dWkq;yd)>^CfZQ21yEeSdvBFloXJak}}e*zv)v$wvjZEK@!i)Zs(IFe&ljV2)SJn zMV^-=kWVCOq-)6Z$syZIipXJ-3Ua=rj?9p>kY^;`SKKW=lmw8!C1GTnJxre%a@=QX$USrR{zm4uMTB~fIVB!T=PNh7@nm_9k=AW0E9M^Zs< zl+=-uq=mdM@mAa|{*nZcZT2?lVPuFThMX%&A~{J0d0vu7R!B<7+WVNSDzclTfgCGo zBNHUP*WE4dlQ^G5b>8c$k_hsXB#!jj*QBSAL6R(Tyrh6!Dk&p5Ney{i(nJQ zk}xt(5<_m6B#{>+8RQd59_g~bNiQMWNUF#|k_K{?q>WrB@hxz-cvuodUXw(SPb6{V z4@nBy^Z?T^i}aTikRv5!WVED)Tq9{B_ewl(x}9H=_>m7KA>>y{6xn#7X_!EEm86lw zB{^iYq=;N6sUQzX>d5Po7V^2o`RcW=b;1^O8LBsicH-8)DL{$WD?5a-^hn#gYw&wt#rwm-yV`H>Nl z5HeX3MIM(VkWVCOWZj`=at_&7Qbf*{IG?q4wzx%7M_!k-ke?*p#qL?X4mDW;w3+Eb^$NfGm-ek(Q)}Y#CiEb@+|fcz*aBbyv$`qYpC zk|uJ3#PhD(d4j}`%$9_ZiX@7xlq8UKhMV*>(pQp0hDnOZMUo0KQ&LBsm9&th67Mp1 zi|-`?#Cx>q6GnEF#E>D9ByzeWgG`jcPn7tPdnF-cz9fo#ElD8W zV@!G)*;SH5hD(abSV;xBSyD$Hm9&tB67T!&7GFsMNVj86pD@x#5Tj=hG#A61jZmt>HGBzfd?NeP)GsUmkt8psQhHnK?K`^eqm zb4d_cBZ(mE#!crq(npd)_L5|gsHA|LDk&qENNUIwNfWtS;`!L^{FKCxyd?=CpGcy} z50V73)`@1XG_r*xhxC^ek)e_bayjYSkVKHKC!0QTq>m(p43cD#QzQlC z3P~BcQ&K}-kTj8o#PgZkx$7yWk00qP2_Yv)qR4fU1oDg|jeH@=Ase4+vWmzcNd-Ay zQb+EPw2*}o?+SN|-y{KK`_oKT7#SgnA(JIZ|k|Oesq=I}UsUuy^HCZjBm&E&(yG4IV0EtS%$QhCtGC`6=Zjoe=xsp8c zrlf?dkW`UBBn`xOp4p;}^p*I&cDLA15=4%YM36Hiab%n%h1?*?BC{n0vS;3)y0f z>FoWMM_v*@PLza^%Ox@74oMPuL6Si}lH`#;B_(A23rwFXvaO_n>?>&_M@f85cZ;(m zLF95t1eqa;BM(Ya$V-we@~*_Wn~C$j`mLmlbh*%MQA0MBG?Bg%&nkD$Are1wmL!B+ zEr}xcNfJm!l14t41NcW3P zALo86&RGFT92qQ0A*V>3JFqxsO^_6jyrhggD5)XONt(z)iD$Jtxi0Y|t0W=hFG&kxwUONkg}wX)FmyX zE%CP8E&P|6J^>^w2_tcdbMG7Hr!p-`B6&#$c}kK;mPtxTOHxHPN}E0nBqV7g$4GoX zyM4w=g2-)>2vU~Bk&h)Qq~mgvo<;gd3P?m!M$VMfkZUDP)>6p=F}6(lXGBhw`PM`)R3zsO=OP5^PAh}Er}m#NPTDCLbklp^zr`gP97);ASX(~$OK6Yxl58nUY2B#&m?)onrzZb$TpHH z5|K2JGbC-~YKiX;cZ&xkL1cj>f_yEBBkN>LpA@pAB#T5P1>}558JRArAx}w~$a0CN z?RNe{;zzc;%Jc~#gCtQTAxR+DNYcndk{t53q=>ARR1ojgCf&JrlJlwyN?J%%;{DS- zCMgLZSxFcvN@7S=l0=%44C1}U^vNSZNePKcsz_4OK(dlHQk3}qa<_O-5=6RRYtkdg z9+Ehckfe|qk}UG7q=5V&DI>kFGg&p{NJ$f!Ao2X|c78Qb)#1TF6|9x5MgujeRKzApWeG97cvqV#u|UB=VvpgR~@h zWTzX<k_eKK#F3{ZDda1ObB`)#a<3cB z;VmOFXlo6KZCa)=~^TrPBTN{Mr?E2p!6nwgwKj*=9S zt0fiWc}X2vEomX!PB)XiUEQqXB?06{iF3~^r%y!^L%x$F5&sM`IfEQ3$s=PWCFFid z6{$%Yh?O&w+sJMbpT})@k|c;^B@yH~NgVk~l0yD{v&qUL5lI0#OHxLrN@~bck|t7@ zc)GcryUsLOeq<*}2sug;MaD`J$X${&GGCHIR!NG8?-r9@LH3o@k<%nCtT&)ZC&8nU;fi5xHS^l&?0Ch;SANeFpC5=B0iB#^%) zX{7h@viM|v1Q(51(2bVFp`qQkh>&F+MIXV=OtO>8%Y7# z>@G98j2t4VA(u*;$o&$}zuc^MC4R(nx0xJ5c9KMqm?VKrkff10k{q&BQbgL43bNg7 zlU_%LNm|HwiP!6HQIG_XMUpVGMiN8%++(tmNK}$RQj$D!x1@wrB~@gNq=5wPHCb(B zn8dfPyG2?OMCM2$NKFz)ItpfT3JFTG$Vf>6$wM3GY@31osKjpQXcgld$fUQBZ6w}}+$|!K0CI*Tj9e{=ArDBB$O1_Q`C5`k)_K_UDIq&csz_AQK+cu4 zk*N~j#_kr6NrK2?Nd);p5=S;Fnm#F{za)#qBn9MRNg0_bsUgoun#gjA$LDtbP2xv- zJ!1NVkbNalBrZuHmrK&fU6LH~ilm5qE~y~h9yRH8WP3>q87lE^;%+fo55Z1X&^UA+Q?%P-@n~07DElQGN}gLlgJ=R202@jN2Wp`<0L_3k|csWD2XFWBq`)KNfz1qDU)76j+K;=Ya}(~c}Wxb zUgGKHcHZV`Gue+ED+wV}BvIrgNdoyvl18?F#!Sv3CrFCOjgkuTnxu~WDrq4*&oh&~ zo4Z>aDhVLxO2WuZk{I%&B#A7OWRTw^dBp#$NiQJ>NUF$bk_K{>q>apx`26k`3nfA1 zJ4poD@HvwnM82avraVdQK{47pvB zMBbKUkiR8)WcQa$RtY&>Qblf-G>|tWZRBf-Z!33;^!Tr?=aAio}mRE(sy;Nuo&iS4~y|*;|rEl9C*9m!ya+ zl~j;!ubIhpWPqfFjFxz}cDJ}w5HHL|JKxL+B8N#L$aRu9@`faZbbG_h$sz|z3dkf$8F@)kL;jRB zk-iJeWY0Ek=Tjwq(klvPe}sV{Y^7DjhrFLA-773$lH<%(&a5Pr;h9) zX(4AzyaBh*9g+aDL=r~6mc)>53r$uM*;5>96MN&qdl+=(9B~7I3Qj_J`(e1Od#E%>;2_ctBqR73H1hP<)Mt+jy zkj>vQ=|yCaq=Jl=)RCJdE#xJMcPDp?uO$Iw+TKu(vmkqHvt&hF$pBtfJsi69?J;>hok6tdYe(M1rCNVw5C+Op%0gpl7PQDn1EO`im^wBt_&_ zNdRY#7Mw2*5g-o4!|o{0Rtc=mNWzbWw}-$+8pzgC;{C=!$;ki#Wu5<_m6B#{>-8RRob9`XEW(o4wpk}7hj zq=B3(X(KmDeEYduJShnx%OnxxH%T1v|77~4kOL)InI4-ZEL9 z{oT%eC4M9(2_ctBqR2gx1oEaNjjWdBkWGI!=|vtFB3%Nz&J;2>!o+N<0 zF9{>ROJd08znDHrBrM4wCra|j1W5_GOHxH%mNbyhByHpmiEp60#b&>nK0#zJNdy@o zi6a+DQphw(7I{okK;D*=k#8k6WbHMkPZQZ*;u++2K1kw6PM3s`Ns=gXrzC;ABuOKm zN^(e--%Ot((nnH34wTf9grtRBC2{Vm?7XwxF9{%TNW#chk{Gh~@1{=@*-4T?4wK}O z^CczZ7D*L(Nzy=8O4`W!f0%UNf$kQ2NrK49k_d8*B#t~LNg?k^vdG_(0DE|k=e8zoJoDDfQXc79XhN4}JVkggunCyMlzB#=RpG;*dShfI+ak-3rz z@~)(g{4QxBTXi#iyob44L?i*^Y)KfIDv2RaN|MNONe1~-l1KV102v_( zBV!~nyN$A~Ii6LB5yNk)9iwbmt!K&b!SZ zi8sdUM-o70NWw^25<|X_ICph-Ca<@#$;u#mN%F`kk`i*Aq>4NtX&@g++DLbw$?}bG z)B8z+$Vrk2a=j#uJS|BfDNfQ|$@f_!N9wzZ4qa-0@q9lsUk|dD1k~FeFl0!a~6p=NO3bMiG zW{WzqgQSHFlz5MKw-_l2AQwr($aF~zd0di27E3b7_mVuap5HVqA$=uPBr0hjqa|(R zdWr7@cZ&xlL1cj>f~=Ipk?vcVJ}IQHB#Vrc6p+c1GV-XThP*FnBAzWxmM89Z-c{m9 zj+caxt0c~S@SXShxsn9(p(KrT-^yg=kliIkBrd5S<0N(DHc1P4UgAB`?NgTokUu41 zWXs;BPYgLgl0;6CWROXcJaUhuguEuHA`M9c>9(~=ZzJ1Dd?&eE93}}ODM{J^ZKPv6ljS?r-C|ow5IIy5LC%-Nk(?xjJS)i}A4>{I*X>Pu8QDQnLk^cT zkqafB)7;KCO8m%NNeEdYi6TEr63E6om_BJFB*`HoBt_&BNd>t@Qb*=VoNo?r-u>Q} zcu#lbcS!)*d`HtKjD#gIQ#jFI>f?iRO5 zobM!XHhobNLB5d05%10>D~0rzWRc?~1!SD0jN~OX4$ysECq<~y6DI+gQYRD={6WMBCGud;V+xaMoADJu(Ax}x7$Vy29*(_`(r;)=X zIplIl5qV5fK|Yhzk&X8=lUv9^67Tu$7MDr_NKO()o|43nWs)TFt0aT;+~1_K;#pyL5c=wAC@#N+7S>@!WYZnw{hShG51W{(r>v$nO*I>@>k z8DqTaK`HxVZBX>sW3}+?FG)F`Y84<6B!!vt^i-L#%;a zJ4V|w+?sQ#o4$!H<7^pWIo|=$(Q$Rp*ZX$qxWV4^SZhG1OzWB0rAtSnQ%3&RF;Cl% z&#~61|B@^1IU}u`I_1kQeeKCvTaLF@cgm!Wuq}C8PO@U--1H-CdBB!athvZYTOPON zG|RbDzv<(7#_BlT@{V`p%P!~J$Lv$GIue#2x!jg{_E~3GLF77HUbN*bYZP*;EpOR! zwlx;H$Cf3wB&`xswB;jP&a)~=*_KtdTwv9Z*KKLplCqq8_d9+5gIr<-E_3(#*p`m6 z)iKt}b;`^h|2eQr$J(}xvz+_#+t0fm)p6FEPWiISas9ehie-=1^1mF<*C9nR!{Emv6c zI_00q6Rnp!<)6tDt;NjQ+MctsebywajSNMuw04-#ncm|fTl(3@OtwOu^3UYSR=89C znLOEwx@UD{n3J)_A`c>0S%v>M=W46?|K?n6l{srEXI*1`_5aSg)>{4l&broFU#~Ie zHGiGeqf`EAc%9X=Q>JySu_rsv#r4+6|993D>lF7GJ*QKwyWL}Ycm~_ARr{tywa7a zwrpkhxyec*_i@a0D?HgfW}YohpBdJ*$a|7C$oCTGzUod^*8|O2$xfNp(bJX_?erPe zrySGQ7UvxxXU)0FIqRR-*v-!Wwf{H2+aUXxgniaOa=0x+?6YpsF^-&PA9JhZjs9Ia zkIDa!jJ1!s^M7QbEwd#{IqUxa5$CKq|0B*>4@*Yc>DSvb_kU!XEsy_?+-i&c;$*M$ z*us8G{4a5~cvf;5$Jod*jyT7>XwB_>#3pyX&#z-Y8n0N3J7rSG)%G#YPr<8J$JNe> zlRIYHGSYq}ylVOWOPuGuV(oxDYaiptd@GK;ZOgrO)>HHO`z#9q-xlkS%XoyV*Z< z=J}dy%Uf2gQ|5Qvw0lR#1$O#ED~)_&pXEx{J*%T(%QN;_3#~Q(B`?_WwiUR}&HBkc zrkCAkk(KBa_qE|<{l^;HDgR_Gwr07<^spjbJ1(}<7h7|f)5{iT&SI;A^hcIhHRNzx zoJVY_)#w!WQFW!+DKmO>-MdT2efDFx)CyhiG@Q|6Q(GSHlrXZ5Ept01f}CzozQ;~~ z$BH9aNeU@RvPeTxKsGwa%qb)LOKQkyNfVhR@l0_$zbx@1Ur0j82186%6bVZb$k~!K za+@TFye26kt0fg=tAkBe9T_5NAy-JeS$B()B!GM)2_st^VkXCs;gTeBg(QQ_ljM=_ zBqe0?p=NRwIZDz%u9dWrrzO4{+%3MA1d%NcHIpOAVUjp9UXnr{lVp(*( z*L&yHJ48}LE|oNqCnTP!?pYs6{7BcRnH+MZV|!a(wSP|Ev2vXiPwIFmoIVx7NMCUvZ`#raM2i8ZQI zuI~8LmbG56IzF|o<(N$mcjYr{96A*x|B-e7aeYmH9KdhgU+3OW zBNpPDuMi8_LMDU|VzF2lLI^|OX@r?ZpOu76Stf)=V`vsa2xCbm3?byJePu!{7Hfp> z>wV7qd_EWZ876&2T?@52#!O}T05Nn`VwpKCUqfi6=b8lpp*9P%nB`Y4CCoA z%tGdnS;aB`f>4`7W&_I<$Qg)McQ zsay<4N5W2Kxe~EAVrU!gWUga5Dk3Qls=7{xw91%)fII{Fmnj~K#;k_?+pLwMW-V&- zu4a=GaS8I!KHbf1VYvcAec#P&XITWHRpoBxAWMBj;##OKmHAznhrT~fGn?M0dzxiR z#DggH1!DFz>HFh|5l=v9FYjr#uyjPEi}UnAzLKSk<*L+Y5Ngj9Go58qMCjY%lzGxA zINnieiaCcRB_gF#!p6Z6s(p&t$C4Y7%!esY*f<-qN#&7JDfCg0YSyvnF`sI7uv~^x zvG*MiFEN zWPdZIm0~K5xhxrGiK+0&*%cXPQMTRqc0j z%)#aW%fk@5Dmla~enQ1O4=F^cL(S|}sy**QXsc$KiSi<`QhW=c@qCz>%JLh8_WNOG zx|FaG1!_bcW)`sgJ0kO0rbASo3YHwmg{bQ=vxent$YoN7q;wlQPmhs3JeU0%r=&!h^&)REv80flw*#M zNIdp6%>V@vNo2VILZdFvOpy{cu7FT`PBe#EsP7~vneo_?bW|=x%nI~trkTfbE0@YQ z`&gPe=45k%sS&YbpATSjO$RPc8|z>mVF^>kmn4umE~Xvji|HC)l#aBV_6E#K913&?rd{} z)s;Mcu~c?!ZGKW znJk|}X#1RJ4oKdrUmo-fJE;R?Gbj8f#%yZ3Q6(jWe zXReurElF!Oz1o>;=CJ71&RnxhiE$C~&|aQvRs@9Zx6Cz%0`fg-zuc_Df71L+{n~{8 zJDwI^Pepqw%}x~)xth4q?BY^iA%@OYH=09I zDveDL8b3Fh<1DeWwM<9}8}Si|?^64HPskMX;zlz;%KDi7Aas}bCNo`%+NZR|ZZ@+5 zLSJgW#mo)J!H`)*KnT5_Ww?G~+OV+B)7a^3aG{YqtKQRQo@q>mPY~{}I#wkC?0vs6D~jJETNs{|L|&6OtujCStypF>Ne`5n0D_RYXRmR2jEGXk@-? z7Jf>3s*EPc_sFx(tdY`Sya?F@dEXrRjAFvZyO2L2ADN>8aj+iv*sT3r#e9hvTE%^0 zu4DNLvMpjhH5=DcOmwvT*KC#&HjF~mp8uL{QlfLz7iRqbs8n<$d|^&ViRSsjw7!&? zMFR4qqOLE@IF@}OQ>7#-kz1a={y%7@D~a4+U2kTy=zFm1&3u+)ktYkK)|AO9_jIASF`9RE+E?$@gaJca*0}tVGNekRQx+Db?a-2#x0- z%uJTIAv9KhFmqT2IA)`n$FiAYHkz}gbbH&Ljq6-w9yN=kyzV7K=x+0J7+dbGDS|I(*!$lY%>4 zhQVfT+3# zHYr&OQEg8BS;=D%Zu2inUV*6g)NUpT8y`Vb?fK&*)yARE8uIM9#cY;RWsD$ZLbkaz zASSM2el*FV z?NY+VaS`d0vc#ALNkCmOR?2TwYKc+I5^EJm2^;eu|3ZvuwMbbXQ_XoSt4&ID#b{Z* zQo3XGTxVNDQmVx=l%nlpTO%y5L8xE0HO}%S$2gWTLG7s)6CC4MaV&Z^cC7>!JsZ1L zvJyE*(H%2kr3EAfz3{Befb0YDtvrQ6VBHQwrD(PK5< z8eq|5KHeH)(PKW|8e!4nIo=v$(c?MZnqbjKQ@j=TJ8g|Mv3i8ZTkE7m|E`BpQo_cr zXfti+cx(6%Dit=;BQo))lEWiX5krS+*f<_SE4_GYkfi`}B(_GpHO^85$%SlV#l@;p zmq7BQlv_%!fXsqyYprHk2%&8_*&4T1Oie`69VNy4#TbPsHQ6e5mE4UOI-@06oh&OM z=OJc0D?_N5mmt*U?X4P?w;&fGW_zoNuSBbnB^g33 z+|g=gIRHYn?`XA3iO$bES?wyuI2JJ#$h?y^CZ${G+LNqtDH~!=Kuir{lB_tN+Ppqy zHslT|2~wh~og^z&iOftbOtP}2L^JPf(Kk@&nvpW!g*-c3v!z5c?`##RJdw5N&Q@7K zmdR4JO5}Qj&U(984N{_Y?P4`?%#Emvw$CnB3(FD+ZJ%8%`j!gK63ZYo=98@smZu>! zw}?gZ z(8__v*gjSX3$58`5AI{lR}$G5X;y`lCB|=P^ZO{3X3dGCenrP~npL}%>S^eFwN=xs z29|$8Xsf1K%~Ea@`#@;#>}###82Wqnr^vjomAf_NsT2nwhGu|$tr98KLa$r)wI*1O zLCl~mWyP!73m_Y$#Isxg`5rRWN@Q68*(4=}MXv^@S!pbKH8{=6WT{7~Ur{RE%4T^C zLU#_+t$ZnK%ry|2TlTXGIA%S>Ma+IyAG$7vvBtS4yRf*&UK)H3cLMa)ed4 zo!Vjz$V_>Twz9V;Sz)lw>rBnag>!Rp+R zGIz)9#W6Fi9+m?l(#N8oftg_qupEUL+FyCr7)w6Oi54C$keNwn?mfw(?{`pLBuAj9 zGp)pctgL{{g3PjV146S+fmINY*@!vSDhkNikkhP^fY24< z>DK&!oR659kTm#TGQI*vdkONWIjno++r26=rhQzRvC*v@7!wDu;{bHtyUw8zOJmb zx}=1S9WGR>om#7pWmgDo=i97dmZ=b0dERD?OQ|#t;!?L;%~MprXus2lse4u!=Es?QK@#KGf#0aSuvWBJvJC%hMg%hP`NEJzBWdN}NXRiMH@9D@}>eTddbgmlEA#y;dfd(p#+88e!3Ge%ESD z|7+$CtX3(}E7m@%onv&KK5KkGRZ8di*lOILq~7=dZEi%HKeMtklza|(5c0WY9QfC| z{%a*jiPrUnmGrlmFRU6V(S8kDbsVGHGiVh~|7&}`w1y7)Yh7PkHJPeC8_}M}(4Jwd zpT)k&G@gQdYmG{Yw&y!*TuOAme`lp0^4B~+So2wQo>8k#N_5oyXk{O&O3}!C9(Da} z)kul%(_gGcDbdE@AM$jgu2{Q>B?r^3RUEpOW`hpRU0z6(1innO0+#m_BtuitNtW=m`mvv zCfUiyP#!$VgW5ks?Yr2iEX|OwAiLV@Sg6!S$nJLGv43sPo_2$ju<;m5(MZ_aEyG=@TtR8F+a?HMnp{HLCvD@*c z3YE%+Bts6hJC#JB&FNa{W{Jb;~3qq<7|2hg|6t|L0!k9 zJ;&J%QZ{(Hr@8hz7TwcaJ9#FR+TiJ)=Gy5jx~I7|U02XuP~Fqx?J|zhJv~A9)czQ? z&qVD}`HE#mBxZ~yFCy+7RqDiuB(j_okqpRb$UHM5$3xDAoDz|9A(uc-iwHeAJP$Ja zFESr;MnvdYVk&jkUxey9Tg#;DkhuaeV8OJP)Yljz!m15viT-byJ(e5!u2mjEZ%M z>Q_{@j!3i2tlE4p+8nmqxGtS}k-eHlXI^BlW6_xx*@G-P^CEjxO1IFn%_4hTimK~D z)V0VKr^x*knYAkIcq!eUp0z6NWEP#L(xx{|Fk^dq)~dAASo9oKX{WR3IjYjmV9|3_ zrJc#5=cr0MTS;V&s??$SNsCQdCb#s_jyh zN9catWS2?V;OVh(lU>E4$Hq-|1B)ITH`y&LdTi9#?JRn1)Yx58RPE2A_M7cKj?w${ z7JGdUc zf8A=AvFN>XtKBF?op;uv)UEa$%%^lV*XN5`yGlw}gU%-6{yFrSoYj-Kls+7=m zEw;y`Y>3hG>SEhERrV`J&#SlF2`qYEt+P{D^t@VcXRzpb^$t6SMbE2CYd=y~-Xdp?VvSDWnGfY3SRKD&cO&#MpEy#b+lb(uY`Br>nI*h#1Tb&Ivw1yaJ| zY;3U)P-?kdEJbaxPo$KpQu42gG?P4RSFq^g;$gdvMenai>~<+C^C0p(Vs}YVnKwvT z$EEZUx56G|(V17+qbxe}qc*)ofc3Mu2yOlzc^q^QiBq@+uUj>E_7Y!+SDV|G4^ zuIn+oNJ>~#AoH)t^SE6qMP)YdRP*C@`QP%i+O>bn(`q-d=ox9H-NvG4iIsL2i|*G- zdss?XzMbcyu9fz<6jl2qDb{Q?e)Jjb2|Ha%x6m`&D!YV5_jHwA&Z2v|%C2S6Eo`%! zS#%5A>~<*|V)VJP&F)bWIafYu_e-fa7GsOi)8kLtgHo!+Ll7D*PuasPuR-Ws`IJ4z zvK~U`?x*bumMsvv;&|E?XHZY8#Wt6!n07m!B?Uq;?RJus=nDTCyIe}xI0!L2qdgsV zC(99#6v*>--FGykr+){Y}?sWspq7ykd8;ltYeythVV%GK#r_ zrOQsiUzKP^($^O~c2lv6X-3S6DAjAP!xbHsqGw>vfxKt0#yXYcNyJ=Gr;Wwjc@z`9M*GPwkfO#a-6h^+7fPu&icsn& zl-gw1u*_u{(`ypD3PK~{XDyTT`xjBs?_d0EH>tYBk$Ap^#@Nqx3rijH&=~vKZevNp zU-l{H7rTRHPYA{QVt27T!)v6?cCRjlcbq9^v)#{f7c$dxgX8uf%Ss5{bsV=xSk`ba zw%AEm(DtboA3$iVZn4u?zT}u+?LwB#9P_JP!VlNAse2{BHNl%?WUZ28G(VT_Z<@&M}ESxSKt<74cLR7k8-6p(2U)9DFF7Q}J- z0&+CObu!ARUrS}46Cs|H8<0~VzB4-@r$a){oPeASiF4)$8^3+2T zoiZt^r%jNZojNJ1)H2Awopvtu5lTG{+099~TIC@r!Tw5dGNhLAp1BSftY?snzJqtGYFaLj09r7hD>uN0x{I) z{Ty*kbT4m2%>GVBKz@c~IEmM)m~YTik^`NTfcy%X?xY7K7VjTrI;8;#K@M@+00{XwrLKUS;tU4l8pteXBp^3HPIbluQVluXv943wClh&YgUoi~0Rpx6Dvo+*OCzs_`$WD-}oq~Yu3c1Fq3dlZ?Yn@J( zCX|{EDR+7Tau{Tx(-)9qAU8P4*Q?rBq0~u`MNV2kPK8uDnE^Q$a-&nq@-j+Y3aN3* z12PYCvr`k0YazEfeNv)#n-@E2H&E@>;$7sSv(;iJLy4Tj>1?&wDGUhB&$m0p|B#Y^ z(5!yDGe00ys?Mnh2*uPnwE>~`H0zzlfY6(gOPm%dOAPvJ*CO=dPNze~i1lbQorxNq z)hrt!be3s!dRczwn7f@m79Z;uin-evR1!H`-Q$e^LyQWweRe>p+fe&Gj$oMvSt2EY za&HNr+JjFxg)Dl7w#unx(JQo7P7{k>p|v@^ zEP933<_xgt)!>s(+>NS*dNuf@lcXdv#-4Ig0z&P1%E{nTdbRwtlO-iA`q5_U`_oP? z$LRHQyOYl`Uvo^mQ^+y;3DRerVvZT-zCYuXs+dT7o^|F2gxd40Qxy=J0iJW}0zxyu z^G=f#_157x*zzwry;9ViFa}xe^atb*$ZO7MKtgy|_jM<`T5hpOd){<%148Y2(Nb8+q7Cj@acWPMljPyUJjz!N%|8v?|^lbB`)5)S|n=hR~ zmfcW$BWfRVhFK1Q+%F~WX4S7#Aj=_NISDM6Lmros$x;h>3bMhO&2lfKLrM_~U4y8J`fb4 zFw5uI^0eOg$w{nLEgXl?TH+@sRZ68X8Q0Aev&qSn61czNbV^w&S2FKo4{mb00@5#K zgk>7?P|TQS?1J>+MnypCe3jUDzejPD?uo!WqGf^2abrK~Ye zMJbZsocwxK>LLg|5AeHF7?9r(^M_Ls5Nj>2*4?UrOoGI?byC)tS0E3G>E_-+nemlf z$o3H1ZD>$(2P6j)=ce4LYCrEF!=NuGOm;H@QU=-1%?`-*kVH2>AT^MGxrI{JnD-+y zmD<@g?xxI@MjM1?(PTH7<#k9MVv^l-DN78JM#!#i8OMAIc?7b%+a#r0=vgbp?Pbxk zR*E~oqGzo=+_-yWzl5H(_HdI}^lY=Io5!MOn?2n^7Co~~acf!h%r?bsV$m~Os@uz= zXSP&#fQ4q8C(w(%+##0#p-PtVq%($Oh#G=oP`?)17`V70jTgIZ#u=~3eEI(qauEAD4z^!5V4MOMl z1Kb7{J%?wwJuG?-&v5%$^gMQ;JHn#pu>;)+7ClEzcdh%>_R(|Hbhm&-p9>Cht6228 z;2^hwMV|{Y-7Xe=F35EISoFEzVAr}|)uqn`2fGO@`dn~`o5P~d1&6o=EP9?l)U9IC z^ZcQ11B*UiWVu}|`h1b)_Oa-5!C|iTfNGCE7aZm$u;_XIa5t4j&+~`787z7ZKf*0$ z(R26_Zkd$m)p534t70N6#%#AaAoS&^Y`0%Z*syVD@g0nWBi*=WYGK&e8bT}TBi&S% z9U=6@?@?~aGK#4;_JH)E)X{E*l(3Njq3h*bH{n5*Cl~SsVshQ&fDA#7cWWO~F()JD zTgVKzmE~-f6J4u?V$_$w>D)BaO<~b*(avVGX%!^3tOG>VX z9D>?UcN1S$ax=?pw~Xac2=(F&H}4e{^9<)X)1A-qN<^Aj-i$~O3*BR;ex2!#v3wbk z{M9P+pAl(g`PWstlz5e5qHji@>E=qow+$~-+we>`Pl>0mM$dFhSoF2$nQpn1u-F@! zt+%K>%~GmG7KE+U#>XI9cL*-DH>yiuJIbRxmsKX zp^;hW#<47b(0)JLO<<{k&|W^YRty@_+(HWvN1#kp<| zi+&^HTz8OV<^}40!ntnB8fszmeUKuzK}xrw-_bbF?Fb0H!FRr!)kUS&#Ok*xi`^V4 z_!cF4L3_E_t&-AZ=y%_W-2oQ;?pv`t!lK`OD|RP1Pb>2H*gM5;-0Nz;>-RV=atm1W zdmIenUiL?DLt`(GYGlirL9y&+QWT5F?1?}IFKQvyQogIw?C1ccrPxxt;!qTfQQa64J_+g@R}PYS*y z&tq(nJIXQyp?$H)o&6To9yUm5UsSriQmVx-kZm!ds$9`aG5E_q{;ETAqnjh8JM!Lo zwOhcVzs*wZ7PII(RMl=7i=Gpz-6|=s3q2=PyEPo6zYKGe+sLB719OwRLW+9xcSp46 zCU-RpeVZj2QsauZWxvEUw0Tb{i7ZD&Bx9ZG`&p258PmdY5hN3Gi`yqfT}9FxvbVYu zO2mA`(EBpAuJxYUK9!IoP^#8VV_6J27IK@LAth|w4at+z$g&DD3$oZvd!O=j8~TjD z*v)6r>x9K_8H-*gEOr}N^r~R7+sUF=1&iH57QHH1>{=hFy7ad-7P}cz@C*amLo?E1 zx8-BCeU2@}lMk|m$)76uoO^M*yN+ceOP$;KnTo+DFlA5c-2s+KEO)pQEIYF-ap!-o zN~N(hxa+=9k_Dmm-05}_eGRjI4E)ZK0) z%Po*H#N6Yi4XK#>AmxxIH=E^gmiycSmKPwEh`HZgA!U8c8VH@6n%zDn-uDnXGd8=% zSCo0Zx6^zrX;Sd(5|G=Fr`gS7Ig@3Xo5OM$%Y$wKOF5(gr5`KvE!`ZVOBEpkW*cdC6@J$Wf4&-C-$9465rS$SZFA z*Q$km+`?DgWKxSTQP^tAYri|;F&zaY`<=mbyc)xIOaXKiDUGc=zVwf zx71TLR%vc|-|dl7ZM2{iz5V*W8~2^u8pe|>AGrA}G**8??R{<;%PWXc(#Y~=L^`E( zd$i>zWT}3ZK8X2ttnr~crX+^OVF>cEn=(SRcYB{BhPHFRo6YidL<*I}&^X){rTX1s zDb)ta&Qi)bhDI-a#kAjT)$hsO+y;pexiL|>6A~+i0&+jZ6z#Fmm{y1-(#@zm1F^+G zK-NGUQDRX{y|FV!CVd6h6?v9UA|O*ldqB29df>;&0M^admqvbX39$bOK0#E_Ke*T&Ms2+ItN z!y^!rCNOmIZ;g8&gw~>IBF?3KvEEw=p*297NR(1-{0yP%lzm02lqE*&b+{fxo_$4? zl%>XYkXevvq9Gs@lP;P$PcmZY*NFBP9RZ=QYVR-deX70MpqMjJ>Hsk(AQwO~M7xxw z#$Je_Z$VEN10gwnjQt_BFAfqpaZ2cyP$(u-@#&Wb6VtEKc?}X-v5zg}>gw_B#VoXZ(4tb7f+nQRq!FwGsk0W!A=w|k-Ei%s#DcevByJD_~ya&k> zB`owrVL#+V(JrN1=r!a?qDxAp(Ttcc5Ob19-xGmOmf{zGOaIl(9Gq@ijKc8KPr*Rcb2; zZRfK@;SNf6glvtNvqT-s9uUfWwrFPAAF?B2&Jo4(Lyk*~!y&W|FA~jC)|j+rqdez} z5h>j<^z}trEfb5@P{`=9Wvv z5SOZjOhL?LVua;x&U2ZVU}=F+PfH?m-4l>~QL02(J5hV8ja{&&rP}9;gn&@YbZ=*#XkzJRxk3ylseXL~p;`1wk+U<&`k1dF2O`gvB9A5Edc5%sDHHQqj)TyC zze-fG+yp6=H~EQo^cKg&36*mg{-CatVvXf2+PQrkgj z`z#i{EXP4;eqJobIM0=kBIH>t##tWVnA=6gE^>=`Z$c=~?V^h1*ND`x>|Lc}YL&#C z4Y?SZZx;O~WmdWuUe5zQR)KM1vFiD+Tj=0>%58bm9XIs$SnVj4snOBv(_ zDeWvPAk^jt(ZTXD(o(-Kdn3JCNrtkrA&nv>AT$#07THqP#Oiwv_lP+x`o6@yqEyOK`5S5vAkV#G zf`wKWDk>qfN|K;ynPN zvGJ5BMs?eaL4- zuaxNcc~-1bF_F8M&x)adtVWxk71o~75kZGWV`3Bnjnn+EJws{?7jmVOs zzB&9Uq)X&UiCzVCi2@ZP#~7{fyF`hUZe!2sc*+ZV`E}92@)qvf&>5{;v`C4rD!WC8 zl<5BI7OSOf@Seba{}Q!#iwTz3Sl$qsd&zO=eFFIwF+HM;{GR zS}XbkLdW}CVkjVVy!Q%x_!nb7x_90d87z8b^^PcD(d(A?gtd<pNTFOilN`E84zMBl~Us;5%OQr%tABU zu8=Q;n5JUrIxZD5C=vrQ4YFR8NQsW;FGYuxYU6I)$EMo95?ui~7^OCdqIAlPuhF7k zM?;21nUoE3eMl|*PE<)*A9D&~4#DyDy=YM4wL#|KSNwhuEnJFb5{mgj^y)l_nTb3b z#RQiM)!_aiSs|XC3@ukB8sJ`qw;3N{35EPbj2*VRXsECi)dk~W!Wscq^ys5 z0Mdw3<6>Pv?w68zfa=#Lh*<&IBC=T~*Q)m&wul^-yolto+zfd_mda;&4MM+Fv_%xK z`~jge{uVKt<*?iEq&KeCw}?WPDS&1qbwgnu9A|FA&;iW8Er2Q!yEs)?GeP3 zBW5ozNyao7zd{y6_VI?LMBgBu>W!*ALfo!?#bc^B&ay3}6;C5f^(^^8>~2G6p5|pp ziMDw^FH4C?LaDn^*M43OODbfUl>EQt+25=9Tb>NBhD&8|dosK_mczL{8D0}hF2@|` zwXo!K%z<7T%WRIB?sc%7$1&5rE-BG|9psHk2^*Ip<}tMSU{6f{>vqoa;*~^JAX#1_ zi(Y|bc_~t&nGf>{{+8zmuaHY!fx4bVT}ODuEai~rrIh|HPqx?mw>(FAE2PvL)hI=8 z(H`Y>a-Mr2uOZLTUYC@xco;&z1$MNzE|7;-GCAIaiZPx-49$nfcq0c<-@`^HA?Jg@jT6|)C~TA1gR<|>&Ep`M=T)k&!| zj)rVT%t>CelqFK^KHQV>#PL)ry0)3+#Y>5nd-X4OOR4;WzcA$>%sXR zK0!}g)zIsx1zv%aE`vthPN?fTuSQDP*oZu|<;%Smj?rUvp_h~|^T=x%TKnDLje8xVTlug+@<2tD0b?{x-*o&dbV z>kSBv@Fm`ul;{;ugO@Uk`X0R>ey5izrQX;MTYeU{*qvUNlqCl3i?bkidC8|!sd{4y zq!@CKSHzM5xfIgmB@|Lj^a`liOOk?bP+W{T95KyaD$C(0MY7DxV3`3ahdk(Ivz!)@ zJSp|YMUX`@rs-_eo+}~skQQ%9N_37|?u|%MztczOl;z$S3(e28eU^Jg=g6%QnUNm$ z28vWK^o+E^OFB>0RgJnHKwT@m0x26}=z954$Yb6dDbXwF$Gv72eFfd>b+XX25cG6J zt2ZE}T0Sp9-#={iMx@}YWr%4*=9S)fK%Rp<;boss?TN0R+q`@!>tmLng>=XDNv~1L zhL|?UD=77p*U2$2K)NAMd+`@gp7k-GLVBenvW!DMfV6wbER*lRIvnzhm&!5?vL5oR zm(FqmWEk?Cm&tMwWFw@*%Vw#B`~rF2%Vl{0@;l@OFQ26oVtt6aE8c9Den<$?=@qg3 z4A~a)l2^jA?GoIlg}m&|XPE{`hP>icu$&0l3$og)VJU&^4|&yVkfP2qheFnP%>kj& z(&e>EQSSyGg_zg9q+&H%^trOzOOaA7ZbD{SlXQD&EDewuDAgTVt1pAl-LN;jOc@hh znfG|vT~&tw-}1cYmHaKw2l!GX)uoQpGSvQo zSHVI@CEY3g(5w4fsgJzIfY2)LBd=46I?K?R`eUzGO7s`*KJofk^fR}gcmpi@N!?Gp zAr}1^W*1>gRGl@#aVg8(;H&M_nwV5V{BZ zsW+-b{2CGbWC^xU*a$V?t#E9gPrWjh9U%0#(a*d#mSmOzZ-Rw>pOLoD=U&fcD$f+e z+=7+ff4zPw(Z8gB;U$$&%=*Y*(!cPESoB}gzwlb5bVq*i>I*OBKUAt(WFRxGvA^)L zmB>*?e>?udD-H;)69&B!DbY7O2E9@i{bt9YH=jkn*)izVN>RU&L74}=4whXnR4c3X z-Z+=iZ-1=!;^tBdyAA#J$9gYCO7!iI|9NQ~qu>7c(#w$&Ht4rDYO&>qyaFkeQW_u| zyml_7-_aQM`dRcl8sB&$EczXdZ#?62)t|u(nhZ(AhaSH^*RGWtEL~lzJSpB=O=F@AoTvlCeJEW zy`UD-`xj$gQb1^h_Oq845PJXO7q2)V^!~+WuRI{M(i`_00zxaaEna6pXodEx*B20a zBjY!3I3Tpvn(*-RI&!~L3u%S+yO$UcTA}^nrAb*T?=n z%B$!_$S-C&97i0*#Q7yGGawWb=g()E%`ubw3YH5vW|CjaGM8hv@*7ynIc6)rnMHr8 zZ)<-AOA>#nZ)?AuB?fxjz z+0IX9aqm)n8{%V#f5PCaiXTO)_PzdGux8KK70HHkp_6J%1!!f(~ z!z>FqW*2{qW$Do|M(js;y3e0rxeYOsq=+)LPn#h0w$848Jj*i>YR|5I63aUf%CnoF z!ZO5pcJtF&euYq*clR?{67N!N-rdh(nGT_`n&RiN91Wqdn&Qu9$%oK0RD1YEEN4J= zMD2U{B`oJd=(yO^FJrkJLdV6Peg#W8gwCE*{2G=T2%Wp9_zf%#5Zb4yeiKVGg!XBw zzk+4K40YwQm*2*6BZS(#m)|L+QnaEJ^=ogxi{*I;#q8~`W9jCYef)lw4AlZ=p{9!58@(S?;$N~O%Ku(5a_~}q^S0sg_!AnofP#x8jYxf z{C*aCAB{#`rk`{T=hSq==&q+=`6pIB^9z#N(+nrl172Q znniy}qrmT#5*;n4`h7~|@6op-VwjoKG9#$JS+=2uC<-(gYLt5O;Q@+RbTzd0a% zkTd+YfP4-)%O8>wHfAEvH;{Auq?=V;vsupd=dfH1*@&1Te;vy_$S;ud{e;_9sYQ_3 zkMT^PpTa`Fq_Y*|Vn2;#F=7%Sm-t0>s?Vo<{-%n(r)dlr^zMsNEs|$*`)=y)h)dj^|>u0j))x`oon?x; z*gMzzbu4toFO<^6LT7V|xxsH?p|d%~+~Bvd(5he#q{8oDp;ZCBpIhN~vCv9}V#0ne z3$0`*ChYgK=oQf-e~?A5h!*)HEPCZo>5sAKl|!YEA3&thEA)z}$`>qpMO5V{u;>-h zjeZh~UJ>2sr?TkPMYW&KqE{EyeijR@E@;f(Vn4nO@6+T$P8KIS4mO#$L1oY z#vhPUZ+wqEcpcNC4SyLs?@HKHz7;?VwQth8vSx9VS~Qy^Z{b-@$;KxsYoyG^-GmRuD0&= z=Sv9-eYJJ3U&S$JApV?M4QUla9vIEKdj_EP#dhQ{iykY;~?g~sX>DZ?x@Rw-tgKgvR5m136p z6H4UPpjFC)e$jojeZo>`t3Kr8M=fa_%6&Q&rI!0~QkEK5qVESm9`?(n)En1Aj)FYm zSFzj(p}$kF@N1-W8T41G;}P?yUneCxKR@O-DiQT4MXS@t{AMXt;vopFP9O7I|5oa8 zf3=iu`D>N=$o#mU_&{_o)0(Z-&yo^0o3#A3MUpuPMpBb8SGnV>aUsXASba%rV_DC!$mxWOYQ& zfZPx1^5@9RON|R4%OS7(^QA;rU){14R=GBPQS5QVbo+HOW{G(Hbklem@`m5YEv!Hc zoiE<-n_2FGJTGHbuyjCPk5@sl1`dES9+guLsQN$HCD7V-;Zo!{50V*Z5u0eR2QT1kR83h%=gbU(pc z#{Sq7D&`U8Q6u%ZEOGfK}FhDI^gwANd_D)sR$3zd!VpidhMvFYJBlk4Om{ z-H;5#eCAKE^g|AZ4EPgItGd2}90U2>A8S_ z$OgZH`<8>g{*>n=eMxD0(lNH z;&-vom&s_Xe(zf^P^l%xmyj1RGJo*XST?h4^lMq12UN_cpZp?~syB9oyn@U>`qoP- z&t8!CA;0*AQo3TYApMZde!|PDg(pJ3hHUY3ST2T)LVop!rG$;EArp`Zzwk9GgCh|3jtwOC*qI39Gp$;jp z8@kO~g;ob*a*${1&^jsIhW=~mHlYy~{Y>&UA<<2BslVprq13h^{9pX*wjW1(WkZW& zooClj0*kIIC6pm0x;6F;Wl5XW0y?hU^u}l@iU9 z7Mdd^IzOlBeocy9hNBy$B4Td~St_MWmfGOym}#MMm02VrW*K6pg=(aPja0}ANP4JO zm5R}M_6x0eliD0@Plm4D*3Z&JML&TvJ=7K`^&~PM6zY|-Ax4+V4CSmO#Fi?=A=+R3w;NX zVonOBy{+~Ieea#_W6um_u+aD3=|1+%P&P|CN_~zN=7(}w4u^axr9euh$m5ukLxn8o zbIi%1Ib3Q!auxb@MJR=1 zzJ**bC0&X-U(oouGBomu8XK_>PP6=M!Xi--;G@`EI7cIC=c)Neo|_{vl!w+5w?>5Wv?I^ri0C{^ z{*k945<_`jMX99`p*-(G?urQI`4ndiTZ_`xbIxTV9@FX&XKg zDw0xZl;CZPLlCnf)W$+@f8;(8vrSgqaXRh&9U6LMTl_$b=9=EM!7U zvwSv$&}gK!Erbx-d|&VDdSBFvmgr~ulo~O@*t&< zH~h&g`4Ady_@+OVr4VvEG9CU5mSV`AkhlEVETxcpA=GQy(P!yf;bknnogG<= zL5B8PAN%WBZidia>tlbDEag*Q2>Qg|!lJ$q^of5B%e^Q?d(l3BKg;6~+5`0Yhgj%~ zMKsFdQ~xLneX)o}S$yiBV0i_l=nCFver;GT_ihN?Rs75!VEF>_Bc|(fzr(T#GA<;M zMLluQ?@wacj12Xs-=D>z&Zxie&t*|()L;1XSc1>WGomm3`7FCZ=#1z~e-X=}5IW!Z z%3s2A41~@%zVcVHoWhv_e>KawoEh*pu;g=Qt-p!odd{r%x3b*EnXmorEDv(#YkwC@ zD}>gKZ~Ox+??C8R+c*AEA&az+IWy?bSTEO#{QI22}y<|1(GMFJO;^x92kh- zBIQL$9waqT#PS}5-tBWlpqgbhv7AytqvJ5^^i#m_RSfCP)S3*uX@T%=`|y zACehJn<8cE^Ha2EAg2VJ7%6nMum_S8Xk$_19L^1Nuq2|?N64HP$lF$ynhE&=azUVA zs+8j(>me5f(tJ|RhWrM(B+$xo8B2a(daTS8L$q)3Ycvoaka8EqgcJsvf>NG=>;}0$ zFv+rlGdBe$44L^DvOhAn1V$_=!;mz{ZGmc6$~fdCNJU_LM=3kKfPEC?u0Z=vQVxP# z0l7Djx{H)KkV?psK=iI8725fbTF3(dCsAhTJE2cO9tmi>OSuY}S0PISMJ%O|w;)Y{ zAr|vsyg(Q7OkiveS*iw^?;tM(QumbdBxC~eQXpSQjrI~GY7pnxfdZDVA=^P-4HUBY zU&OT($ZLUOmQ+>4s0LEa7|CdpDuA%{R#1futm@)G1k$f`gQOBdvP$m+oK zeP!kg$kmX(Kt0P3kQ*VN1(NrZnW?QLuOmOFGBu;`1ApmX4DhC4tG!Vu|s6d zZ$aWAhF&>S$|}hIkT^X$H7v(M67-bAq|nm@XFzt-jl-pEM5)UlNqXWDQlehM{s*$Z zo^+%X3qrsCX6ThH`$6tU<`8}2D497D(hNCVPoE`a-sKoC0ZG?q93zF+`Bjh%y@=&B zl==j6ygtElA1@pOvb!lJ(Mbc)`=qQ3ET zs@}_@zVURbKER^B%9pK=vZ$|XW$TkH>g!tBdLTpgP>r2CO;2D^W9LrOlUdXk!RF{` zEb5D3bM!10^|i0l^;{P9wXf6l0v7evu(^5(i~4HVT)m2g&h+TZs%Pj8Eb0qoXXq^~ zt(dE~V6L92cd)3heVwWIvZ$|pouv=3sIPsUrH`_xuYKj{lPv0MUpacwXWy^7_y zi>7FU@8GDXH?XL$Vx6bAu&A$Mov(MWsIOw3ulKU3uVP)G53rnY9>!F3;^?W5vgAST zfaK|uEb6ORd3xY@Ie*rnKT~m5aG{>SqP~iCp`Og5zKV5`p2niSigl5m#iG87b+Mky zqP~iCv0lKUzAQFRFJW1Y9@6i@d3qI#`f}DKdIO94a@Hk!3(F8n(QnWBdIyX8`q+HE zmqmSD>r#DyMSWfCQhij&B8`qRUt$w%O6+ZZLCx3dV=SeRKOxuYNtx82I_*J7)VH{9 ztaq@qLbiikulr7vnGYd0>>>-V}p((vpFOcG+ zku!U|xs6t;PbxvpQnF`@Qob5U7V0V0^M!=(0+;IbLc(`=OZ7$}72X}*QoTir_j{*I z?~$dvJG^Cj{wdT}h4v!aI_hdZt|OpDUY}PYug}jx4=Xq$ug~W|7JEY1 zvFAbV)JJ7oUVrY=$0LO9SKg%?r&52y_baRPd=_=5_#VAe2w(qs7iX3Fq!g_aQ$g2T zs`WrN)f4{CTD6|eqMp;N){9uwbDGt9GmHAhO0_<~qMrAx){WC-&FWdsYCVHRJfK#ovb4Gmur$+B#p=WsMsz{CA&!WDGQ=^Ya z(bQ9rHTr~*@N=3q`t&(872)SJYxHau^_*snULr)!XZi(QqbHnBr7FDne4m~yq+6rs z69_n@8?A@m&LLwX^LdUo<*y_!WmU-_`!8c~X#XM9-ii;yx%gFX=<^z7s#dcqmu z{?L<>kLu|WLRY9B(;Fg$o>gqrJ0paif_z*biV!*$EY*EyhHIwh5TDSKBZQvQY|^tM zgr3TLQZI@SdNT1Ty*@(d`O2sD4i@!gsAheTMLjqAj2?ZKY+XJ5`m8>kWfsn0=_{ z+j=w0I>C>AdBpLFVZd^c_ z8Z95C(ji~yc`P?TPKJD`2l8ZwzRGweWUZbfq)uyvTmbn-96_)T*LxteulrVS6dAb$ zFGuEEy)QzpfqbWr36bxkE`bc`2^UgZ-BIf8rr+!7EcCve+mQKQFJPg!n^r=G^(9ig z_W+OR?JVkzKqLA9m!h}pP(34h%0;p*dfO_!nRA1lDK(|x=}AIrv~^fs)tDQ<>A5UFLvF{tzu)x+ zA;Yn1nf{@-3#stYb2oI) zZo}_o^yg2#@Dl2?lt&7^_NGEI=b^(L0xAvA(?Qg3HD5b``SoAn+cHQLdTHpmt| ze?HY*E4~lX3He7axm31wIx_D=wBX!)DRj?w4P=|(sE`_s-fj2=BqliHGRo9w7opS; zBsQ2?AWK~jp;CIVNl1;h2=X(;2&P>rGxd zEYCushH&j7n0&R&v_o{rj=>3*ZpaRhU4qetlnI}UCI)>s{9DF_RERG%(EF?sgIPCH zrcC=3^}N-ACvAiA#Ztau*)5pDvKg`)+S)x>bd$_XeN~p49_+eViU~=hhi*&A{IGJ6M&63T@8yl*gDNS$^tGKV0uZ!nJ~9dZ;TIoK?uR+|es0kU7vSSaez zE{2>AIUtzJay?5*u$kp{NG>u5274pqV#q zQaE#Bu#@E&2(9y{22;yrJ+mQ?qEvRUIznE6oDm$jU1lysrWV z>sgLpERWqc1dY2yCYIiHwjW9r2Mbu}jlMI5bg|Ieda3oBg7H#|ARj~Of+=-US|Q&+>VwTJZ$d^P4+T>mkeStx2}nb*p5tZxP~PWnG8sC zF!~{?2X_Y`vmws}(^-y!Tn2d|Sn{yU-B5 zK4H3=@n*0=NR3vFOoPa@N%5X#=m>TRsn8xn=1F8af{Bk(%@x`+kXImYsr^sPE0A{~ z%RT9Wd<1#hlW!qwA)TI3%^M)^Y$d-#-t~mqie8U1{H?@>bOlR9f5Pt#TM;Z5QltHi zQqz!G5$qJwt*QR33?@HDQ_-!dK7SBw7E-2#-oTL&rB(%d9+w%_=l=zhm&&=i4>E@% zvpU!+q+84%nu?Et)1Q!;*~lD=%*VkcLS%-ft1pO;jftgv88TVOd>YIX(k8ZOEJn=?`W-Df>fngQoqt$l(yc8+%?lvk1luDriy`ZReVkc|%sr5AgGov+c|shvY6Zbt)^ZH;Tiwk*CNDE6M zgvMr!1lw5lh0xfHkzl73?@V|@u!l2;B10p=HU!rQDf1lzp^;!4f&-j61@b!D+87+- z%sG%QA!9P*)x0Sf-7J=ccqcqPo3kmH!a~n_&{)|Yg1Id8<;Q1n?l%@J6e6D>UW1x{ z4wgj7mylnBW6x5}b=rKiz8>;>aC(cB>mk2F{s^W5twO?Y2HqTOXQ69xbS&5$?35zrPb%u! z9PAe&pPi&@x&H(Qg@m`$e}cI$Qh&nRsTLX&Ql@pG^`lWwR4Dx=nNizmOvv}L6t!>J zHq;d%v<*%T&3#2?)V{?R%4`b@ZC|mW>{m(3v_7s8o5NZ}u z=i7i%=b}^~)G9MRtz(LIp^$dYY!AtY=%G%|><+nBNDpTY;7l;IhBL=-CK&4H%o&^s zg$6luDQ7~V5zgGi86z~tnZ=wjLKB?1AF>dwn<4Ern)Vvs3y=ySJ|T6!_c>#Q49*O2 z#tOxA=4Z~>p+wI3-jem$p(M`i3ZZFtLMfa%975CXgi>WjI|D*<%ngk%qyE%smqMx` zaiQdPDc3;gO3wD7QkDgfhmqMKWV|k>!aJhv5K0hIr`?6jlOmJNQqQtesF>M z%gc}#P-@puAIn>icF45QkdRuf3-UH(w~+QGwO*?YLq3A+8A|C8{n7O0Q?&0P`-bMS z9KwXPF1dB0Hl@~x+0ztGUzBz4+FC^d?D_6wzUO1TyCE98LC(7RF^ATb;8yD60a z9!YqMJ1kTvB)r8P7Fxrij*N$g(z>Wrx2CqQBSOtAYWqqH4MhlTUq^-#SIAOo`#LI= z8zHoP9UZC{65g89LybbhTT^x zAF^bGiXvoRWR4HDuzZ9}IwUiM$=vF0&PgotZqD(@WO+hQC7cR5#S^-la~@>Qf9g5i z%h1yev_Cw<6RPJDlnM*gb2a3w&?NWpYxM9&NKR<9M^5QR$U?|Dp~RI^Xbkyp-MDug z%3%q-jV%tD^Fu8xJ45Kr19_nymc3Xm3=Of&fZT&p7ll$kpqgv7lOR;{C82yF;iWS_ zR3xNMJ0F=3Q1kpyA4@*u0n~G8C~1}K;mw@M50$bkf;@)IWua=88pxB7%R|wy32WesF@|Y6K~Q$JvW5nK9;4vgiJv02@SDqfJAM?ovcvqCo(e$iG|dLhFF5{;LHJ17s~jQGBw&B zkZF+mP`?oQ{sg+8`%q{oLiR=G;gIv0tobOEIvDauC^Aq@^K;o& zKI8;so(y#fsnc$QoCbL+l-)0Du7~78nnRUBYP6-0D^RhTJT-@oOpYvh-DwhE6BVa zDq%SR@&@FMP&v!R5IVDZGgKv{!gni#-kIMKTEbEVp*w3Gp++g*dFET8wg{ojTcI8) z+Jh)XcMO+@0&A&<_&yPY?$o>;%3@L1Qr->a2`SSWxvh6Y4MM{AyWb17a4Fi`yo;%L zFVw;E97^>-R)o5Qg!d9FLVYshd&|oVu)GhUDP0j7V)@LIQ7K|dsn07y(O=V4g!|JI zN)%G3twX5~(RxoPBSJodtO^xG$RK2Os3Af&LHa^#gy8x->iGlmWoU#mhnP8?rkx>q7}Fc`PHL=`2@6l91UDN@uy5Wm9OL5P5{%ADJIQ4N|nc1Ea*1 zw;w~jLgbrx=~~=Rq4IBK>x)p&;V3m0s$#hlaxCQM&=QvWA+#6$CDg$3BFnF#CYCo@ z#zQSED_MREwXv*&(BAL&PzOtElcr^%tv^CtER(zsp9uA`Y~*_W4E3>`c8uK5{}mcw z`GqrohlW@-vrL9YS*CW$sn{GEXR#r3(fXE9@pp1=kem;RGM2C;L4p{mGR5d&IT~^a zGBL&k%N$4nWUApCqI&p>8P@q&BSDJqB4lVQh&7U>XxBlmMX6XLlcj`ZJ7aEy+=PtZ z$d8axNWdr+QY+pju^6Ho9YQL66{zQKNYLnFp{KNJh4iw}`^O#=(kDf1gHH+>|DL9z zOshpb^frl*kugkyYwy&<_wn1oC}vs3Vj0aWU$EH50LwUp&TSkceZ8z_#}#;12yMj~ zT`aR8uRwM%v=Nc<&W(38&@}$K^*PAUmD2xDXy0=AJCT|5P>M#ygiERKDu(4MWIE7# zSZ@7yTQT=S-i^$}G(vi|k`~Bn$WE%yG4DV=gCrO!8@8UVosCQ(a?4$d%+5xRkl|Q0 zrMnopQljV@^$0S%7zIMY*Qj?fN`&B78`}CsWXgre_gT?3qFszCSx@Yz$k068#i(W( z@??pWs4b8QQBR|g@P0ngXb}=VpHDQ}xE|H#M5CSSQGHG{x`c%LoM`k$)I(z!5{-d> z)icc)WKqjvnlZ$pme(|6ltnG~X~r0fTFTRm2^O^`Ofx2>M5$#u&2To-(ve>fptWV1 zk-*}1%k^iPFa-ci><-!6=w&&9WnUw8 zlxnWi&Vi&Lv!78ZL@v`b$N@&Z6yMdzoB&BN8d+|FP$tD_;d&N9PJbhxo0bx>17gr5bKXvHyT7{K#E37rwww15&a`&$~2nxH-sdQ zNulYY{v2tvvSgsB4z)Z94EXb@82D?&ZAbdEQgSkyXyywM^{iRrR&2kLmELr9%A{ZvhxKwFtckC5XAJS;nLgxqT&|&u1Bd37Rh4so`}s$0%Y^t)Fcq{YjZ} zAHDB=ca%EENRgtg;I_^&@>o8B(A~Flj5e0_kiAjrT%%V=xb6(dB^NhJt zwBLBT<{9%?VtV9UooAG@s41Oi^t0H=9Eo}^F|xOanl&};^NoBVa=NI8ml{Pv!qc8_ z1pe82DlRkPg@mX5a-)SsP5Tu_w6-ng*l?`cvlSRVDN$%_n=VEVLo`IUrLF-|e4VkxIvUxyxB+kTA7-dm4FEj#EsE6I&w|;Ihl36a|X}`rt zW4Rh~Gupbv$QBar&n-rd5ZRwnk;&&$>TKs$qnJh2e5+B(qH4ZX%^y8n3f-d~>fusK z!lfESJ>mX@>rrQwVNqw5p2VoL%3F;lswb+#`%P4a;b$cBe3ix$ml>ThqtVEa#hB9D zj2Y3Csq-CuGmgTLMMk<1yyY7ix++p`E*|hh@-{LYA17s^&_TcuyKx4)Ua(CDW5NEEjt+!cyXi zHdXey#*=uKmpw^gS>;J4%aA8|EZcmb`drL1&68@D!#!zc$?>F<mlV_D{j z&nKtiBTo`pHh7ZC61z(EFqF}h7KWltJeKJuiUWz3T`EP)SI4@X#1Jkhq3 zeV*+}JWGKmDJ-R)WU|zIlE<>llVTxw(;8$sw&i<`QkEe|myk-9pCEL8c&||}MQq)x zMW&rIGzNGrq{irE`5UEf!dZ8X(Zdq^KY1LiG1jo`>PbIK3gkOc&!7;wU)>Jg(~h&(p! z2zk_)5VA-+5jF1xdE96>s1&}Z067fugi&Bh$%Ujtnhe7xk@aLjo-$ITXxAWf3FH~0 zcxTGgXr+)_ATJoxcac&Dp=-G>86_;wLGD22Wn)x`thp9*^%bKbkxI$$@ZN_^o6#X; zIBEq-JqUT#7-#te@+9OnqhOloq4q7LRYjDiDx+uLZiIiFcMi#^(0A(SjX0&KW`ZM z5%M|YEu%q-b}mZYh!N568bi~mKNx)tp=;Fd8F_oiskjM3$I~vOU{5LcQK>g@#olPx zOO*0{f4y(C2?>uCdEe+@c?zXQ(E9sEmlV;%UxW;D<`rbNKvo(fEbl;~e)Y z$YY6JgEyr^J~Fz5;4RjWt08?x$$qk)!yvaoJ~L+QFY7rCau?)tql+aM@-E~XqdG-q z3Lzgt291V;rIbUygA5tYAyOWKY=nGoq(w-~7)Bo%y)3QBOo#kxq|cP4-h~_l`OO$& z`37<}WQ$RfDlKj)L3|+0IN8 zB9}!2#Ba7s@tupzYmkuH$#NB>Lr4!xnI~&l?uWcDGW|m27^)A26dpmX4@Z^Hme*2j zvs6fh_7qC3L&i3jq)|rphklW5Z}tcY|905k9FZBH+S6`tj3iGleD2lT;RU zKEJ)0&aw|Ohl+YKg)H)=LehoI<;?MrlOgeDu8=Zc4&+QB`BKDodJ$v?b4-Yw^G`u` zH=~cDX_xXYB*~l*BIonBkOR!Lqr-E49CEOk6CvCFg6nMNya=%&hns2Xa;|1(ESIB)wAVVy%w~BGd(mkqb+nnoGVesWUp?B)W4RWk_7a(Vmc@_*g%q(gKxp5a zZkDh-523wZx>?Dx9Fm4ov&?FiPaw3N&N3TVMj&*@=NPkzWy&Y=cgitlE6XmBV^Ghr zW;;tNgi0N2cCut~sbkGvmORL8l*%ysSmqoZrR}kdWPoKpWM3g8EH`keGR=IJseMzlQXz#bdqD0KQp}PDp|h_{vy|mz z2ra=(vyvsplWHkqonIm{LsGOWk!goynNa0wnfPH=+D_^(ea`` zBC|i_e6vqToz{O!l$HURXBM0!r*srG|AVuyOU)7?6+Sw?pN>qvS(Sl0yFXCt>JsTUFlk2Cb6h1T?@<%7Imeo#LN*=rag;3{}26HXqE_( zJ^UPUi>aL<+fw~0HGM3qKc%L@qWV*6#tV`4(B8PzoE{7@zO5HoY-Sn}jJH-{IAtbz%7n>-8zwVg-VGr;Y&bq@w`-Ep8m1cq{C0k#I`Fy9D zETlV1W$rS&SX4cCo0CGiqIxgEnK??`V|L|G55x7`XZ8sh_UfrM3(l5Pq3XHcY!OnX zQ9Xa5o;ow_9Lm&aZ(vP`9>@4Gvsy@n?+Xa+qaHNtSwqU{PnVjplTgN0CWH&5dRX zi#pqR+)QOrXFHFZ87#Cvq_&otSu8JdTT9IxmN&USPndZut2y(8S-|ogWHEk4Hkm~% zn<0ClKTT#S%l4n+DO$*rW+h89Bvr@~7Ig;ll-a} zoPNF#aV(&7{uj(vA!S+(xAlVA#qt#70@VDX*(an{dml0%(rQLuK=nwu1M-SFD5OUF z8kvV7ubM>{QKm+lggggXX7;fJ`|)0V$m?dx#WFJu@*(66vr0&vwlCxh$eU(kg!}|~ z$DF)OmO25M&~NxHY&w@q$%e#1J}`4wE`{t0S!EVpAv4!Q_JQ=8O)PXIIt22e*;61h zcOf$y@{ws=Ddic+m5?vYF(GyMk`;$2^+uxew5pp})8ZvteWn24lX1(dVM#>QoYHNd; z%aX;i(adL=&$7uZVp+&CYE}!u(^ZfvwDp6jT`OyT0rC;{t3R6YLgfCi9+@#SIYOR> z{A{L4(RxtoHOMb!wya0ot>_ezBSrfJnNK0Vnt2hj2{LY$M#v=OH?uNAtlu$q&TMA+ z9QEu9`NNF9j{02V%RVMbT-E=}Op~Jhf(*@{zsy{ge^~xDdswV5aVCswxxX~w-nnd z5K^P<1{p-gwNe+z%s~)Zd*iH<2w9Izyfs!rnOZHA>q)TYE|hWs6^6Hc0#MeXUXr5&Ec;strBqLyw(Wq- z9AM33iDOBzx>#mHXxb07(#p1O{U9qtNcarxAZwnGI^PK>MO(o^Rs+i!o;0)MdD6~u zr6)Z?B5NKJ5*|}}kToi#*1H>ckd=5F^|02b?gk!YC9$Zxfd^SBEH|MoTI&wBGFk5P zBu_|%H}>FQD_=;N?}=P_W_7St#F-aSY9}n68CD5rIv~@8RLYDv<|aW7u^JY)+QsaCEKJe>!j%wbkWIc3W5&UhuALh7^$$e|+B$KqQn z3My5nr6WT}t65gBkQ(g-NIKd& z#_E&eUHv}R8W0j*UdLKvQoMV|$6DHAs(F#PcYGY`Io3*Gq5Hxl8CFt+WI>Lz(jw$^ z$nn-(A>n(+Cs@@oSa-DOQzMwqSls7Yk*}orj*u}6RmNUYdr~6 ziuvQa+mq=mOFc7{U_PH{%@8siwO{%aEl)@>3ynRv404jSMo6t@e}i{EK(eesA>qB& zY-?Odc%k(I-;781RTWS$hU-=H2|Y!ybxu8?_FNrcc{#ralMgtTDV zFS8QwrncmLVOm?RvgQd1k5#+cTEaq47}5MGwAxtI=(R$tLr8@-f*!t#nhUMOd*oF7 z2$7|dSpN1Tg(a{~F6BZim1WP9Ra-4AYK=ncQnbtORi*l+h`I5mXg%d#Y8|6qQS*C{ zBCAJ8nNMA-EVkCLT!$+aG*^qQ0U>hBCArBOiI5Lb&&}3kgnSJtv2v=ZtupN(wDmjW zRx6=K&Q-N_ms&}+GBXF6sS~&wX8D##xdLKA%B*}LHQGW*0%VcZ$WjB@9a3(^-!Dr& z3z-2~Y$ex8d7Y)wYGL^tLT%k)H9tU^;V8A=xYL^Zh%7aX44t9fWfcjj(Y8R2K&iW| zHA04?)V`(4G9H!nsC~=bR<@K_wQsq{s^pB?liXtsaz^cK?zIvh6ZOQZecioQE{odN zRa^B!$~5a+d@BL{sj(VmCMpp^-S3MuiuC1>2d#jR;V4z=L919ug_e$b3Xyrp3M`fLN452kl`f=4I}4c` zka^ge%Q7EwE2P2dlH#3{JYtP<=0;>Hka@(?o}ilLl+xDyh?OHm_K-45g{rqEU{^+!&)QAk4#$UI7@=dCglD|*?x2!nmnO5a{Pc&PkFKe@)9!7c(R)1IZs+3 zYf;o%RNO+4|W#tPAuRp7-A|YkI;CJ}0 z5PsFJvPxt>GB4H-JVud=FG(mYwhk_n+Jz^klAA+mKk>h)T!5klL=hgL^~ z&{1!-)$p{K3U3L1Z1uCKCHRTuG|P-y7JXJFi&}zxR<)1{-(2*Eww*q!SqR>M0qMeW z@3Yz>WHsb-EATAUT%#>OW&ko^rL~aMX-gnKK-O8&&x_W*<^G*jE~HFrL5B8q!&U=l z)S9r~(q53I)S9rtYG6@o!X_)>MVV1+!jINCi&_)Ltm>C2Q=@gGt-sKpU##YrrL2QQ z{fTQ|R@W=C9<{doVKuf%QESUzR`#n>)Y>v>^$97{enCA3>e+1hUXwLX8N#noh-N3U z1X;GR^H`=q_CO}uj$THkaD;^%1et2*3c;Jw@#Px2o)Bwyab^}Wha=;+Cs?u}CqROB zTDz?063ASLY4@>Q1DOYL?2I>LW)b8nNSxgz1YcdjmFS0+yZHb>}3zK)UhPl6D%)q&3oJNoz#}xPTxkUz3rq3c^|T$of;t@Lk_a5r1&~e z4{cwm_7WjwzAgxD@2PepXXq_PlsU|9W>Hr>4zt@>dbys%?GBc&xt_!A9v1cc;s|>U zi~4e&!~^Ihgj74 z^HH|*u2_QJIlxi&kdQjf7?$hLQFioul&Qn}?W7!S&tOSrNw*7ygqP_oyHZH4_7%q4 ztVe%l*?lbOC`DJyjlrEngrET*UWlC7CLw{l+r`e+{w?k~m z8Fpc}EcF0nXUN(15|*bRdqK{#+gV4nUE{(9+tBp7eET_q?J@pt#&cwGRU=dr;r-$T1X+}Iy>_N*%rMm;YLW2ox^f3 zGPgjkw})7sVkx%MSIJTxkj2O>u(O4Pua7OX=SlIdk1e!|q=@Td_oCE7yPAcrkCEJB zH$+GsiLLPyX+C4(T*T>52=w9ki_&ML(>;Q}Uiv4YNJj*BOGwl-=*@-Lz5ZZ4n zvXg~`$DNkjGi1iQ@>XuA38~e-N2wseHPD(of} zdW!!=)U()b5fW~FvE3#!Uh9kP9w}Ni&Zud$^I|*kLow|_Xeui03?XIO@91GWYQDps z%bC~_ymb?Dr#+9whI|aU%PwKr4e|}7%C2HL0J0HskDarI+A7m#LH>YL+l4~HXL|S9 z#s86dDdOwKG^O|1jV$lok8cP6P0}1uil*W|yC*_iWNPh^2uXz8Z~HzH(=O)EzK{p( zqzFlcJZNV|$cc~!J3m5lA&=RW5pp$TsofkQm5`_Go(Q2a($Co=5%MfD&)dF_!~J;! z(rPC~$O_0Sc4mZp23cnJOYyFlEw=|*&c=MEIkwy$VYwJWBLtS)V=Om7=-ha@J;Cw- zWD9CuZfl=Vf4ZZVLZ(g%=@UKlwLpT9PTR-wE@THGhLG;4k0JD?h)z3^MX$lR7BcVJ zC9;&5^U07EcHmQ4^Ds)C0O_$EmI+T1SYkI|?Zv%-9(y{=G{|Y9R0<0{AxqooN;{S1 zFl5e0W~H4jMYK+9%St;tLh_OM!0r+vpDeo((rfodWa!-HLwit)?|9UF3o;+tBP??u zl|shU_2)CYT9y)hUX4fXecb~1~)H}RF7!BT=LrMneh*|{tadQ!ylh9^}lUwP8R60=d&)4{U4Cw(j@ zc{0j!jVIAx(Ny4$Glb5FzVgmV&ORtg8$=HWY)53|{*bOqthEy(WEk^j(5{l=dlL1G zL5A!lLdtwELVg$0$e9GpXW9zBx0^Y$C(rrs?KaM+E7HSu2WQk3>0!HvGq0m&s%O2u zhBMs|+IH64146>boe_ITNS$vrj!m&0c>k(BDkOYvGh)vhpt&&|rKWwvt`btC4dcp* zjZz!zULoP5!$!OBU!^wM?Q7*+{S&2Vu5Pj?Sc0=~g%kCR+6iA%rcBg49rB}{BP3k& zPj;S=aDRTXD}~@Z3ia%ZQe$=(%ZV&M+uAo&bGV*gY@d*DJ-^r~LTa>fF7>Nj!14^s zxZV7(dVaH8|5eX#c0ZT;m`nX`JA+%d{)e3)B;5KRcE-Ol6L!|WG81-@kQ!|QHPf8` z({B4$slV(Fnel!*{AEvHCtCN8JAc{9Eb30pUv?@>+N>yT^CaFPYp1hhLZ)mc$zoCK z>ZCoFMXjrob{>mbS2x@FsubTn*=!fFr0_bw#V%n<<8^+EUCENknSbnRmNPl?kKG_e z?6qh=uQ^RZ>a=;3L7(x`qHk&1@$No|35jy>FaEmqPq1C=0GZ;6I*SX-Cf=ID@&JA} zo!uT$DrPe>^k$(cPQ7R=ypBzA8Y5(P(bgIvav#1AB-$C28Q;`Ra?6czMp)t?wB^P) z<1CNy+}PHcWO;$-#loV&uL@X^H5E^A>Zd{L)4#c@rEn5vn{zuM%9I;hf^Zz5)|3}IpboLdl`SJgV zTIa)=H<8(TD&GH(^#4b`|BtAxAYAj0$jsVmDz+WPb3j|kbjX=o$&=X6=WQkQj-dIG z5<^#?u2~*2r7@4=s@e+t2Jt(satZooqGp;d-Dzhz7DCHZce+?gF`kVwL8q7HRL%sQ zewK5&o{%%has_8X&M3#kEI#j82aDdCLTF5;YWmg+0yoR4#=S!he4>Du0@XQ6#KEuHP1CKj~>6PO3a7U+)GwROlj?Ms!y4Sy>Gr}^+_l|dR##lyp{_NyTvZ&S* zoakY>lvV2qjv+)IJu9#*c6MgSjMtxCoHQZfGnrkSLaygmv_yEq*} zhGW&1va8c2q|EmQww+qEwX3s+Giq5RI{jRaS{8}U5Q|zC)0|NjwJfGN6I_qlkL~7Y z>*bWH^X^U}3+?MDGu=sLIfOIQoeUP**HLBCIjs2Vn&Zs^1{*E>xm)CNxXMZOkWH?ss!w+yA&aC3h0Zt-IALJpdQ7KLr z%NS&-kX{zrhd&27(CK3d{D?6XLIzprSkMVM$QfbT6`2o&jI+#yP+JE(^&4cL=Rl~f zgPlf}DW?-hcS6Po#|*lkc9UwGo9%|YP3vb{z0i!r+_6FvfUQkcW~AS37`8N?(}o! zMr3Sc4tJa%spcB(LCB7fBb)@5Hz9jL(wtP5wUGTGM>?4-TOfx(j&ibDcKsP6v>``3 zIV`6_PKKmARV=qcav`&v29_5g7ekJ5npnPp6he-5T3B}a1#hl^WH@asXF+a*9OsO% z)Iw?@$2$`&t050TPH?oJ=(ehYsbc&-yTiVT#!;mR< z*05ASj)L6eWNjleOCZNV7C5aek3zB_B~CxfOOOxH`a&l#MV9J<(BAJBCxK-MLVM9$ zon$HAl$JWBLc;IMEp;k|$k9-9&{nBaEo3-K{gx?pmi()p+nh!ra*pMo)NM|m6tQm5 zul{mpfQ5b+%txl&84@xat9~z+JHBX|3R%xJB9j&&3n3LwrxdY9-?EPL=&$?DRld>Lft*dmRW5WHRs}Plr5g~LH;tnT4$Z)Kx z=T0YGNR39L&hA26cRIyFQzNZYoeb#K&Jl{3zwMx9kT zfvIA-d&{&+O;-$!qprgB)hZ`mWaM0Z0yS4VNfGiqd%#)tbSQ?V2JyGLip7BJDlWFlp zjgxu7N%GO$kaP77OxKG}ijZM%M9_;)DvRp#%T5N1>T{cu&7%7Jnp4T5`uw`n$)fuF zrZd5!`uvuY5=;FVj#7Q@bn;nLpWk&Fg~+8t*W%uDnuUb-Nbfmq5t&X**LzM^gwPt* z<*bR2_aWU*?sjthQDehaI`df6$g7o3y%0I_Y7I)Qbb9?_jS}Om)lX?94;G&PFpS0~Ap8MRFRaQa!)GX2xZjgzHle3XkG{^g9bs1Zt=9pCmcLnEg4 zKxVU37*A58sWDyuIF&4FOjnfK!=lD?O>ql$kfmtE)B&hxTeq5p#z&D%b=z2IdMJDJjVc7?ACM4vx3MtbvAQwOkw}<6y7SkPM zxe7vSxaCIgL^aEGp2jsEo4#Sk>cHA z7BwCz-YsWQu}-o@<`nPG2)_O7mP=kOe(d6?)LLTWYI&)~qkm+uVkno;lPj`$n?a0(2v!|Q53)Nh!t$?&a_I4YD)M+0o&NL~%L4Jnp?`E>ZOh`Gvtz_95GJ#BryM$#Q z$Tm}OF6B0{%!I^34t85uG9Yn~8EzZPX^_1khq#?A=R=N$9O|xNDS(^^Np%NVZe}^m z9b>74WFvF9J0YYF&}L&0wKXRo6m}a@$yFR88gG1oJ1RszK@&n-7rIG%Q4hmg z(?#BvqMjNH3vC7TgxWkeN0gH10CA}25;sps_$jta+$I)P&wO`MNcbtXd^eCpt%r}x zm$`{T!dug2sz3Twn63o06_$k%x>pjGyLoPeAw@-+yc@E@ecaZB*Q+l(T zwI8*<$a@}Sfjh82iTr*y&7TFXaR5p9d5{u!28((gWTD$E#XC2?#U13#Af}XBzr`K@ zPbMdYYLN-I61v#6$Wa54-Iw(;?qL9(8+J4uXt8 z8r>n5S&%^-i5_<+S!P3MeE3ptt2_rnU)_DelPmut75|ai|47rnq)S(Ksh)6+qi8DX zw3m?i2|awmohzhVdkaEO96aF`Nb!DGHhKM_Cxd=NDNkZX@ZPY0gcONVa?WoXgR6mV zd4%i$X?Dwxrq;u69Bpx{goK|YZE@>4^C9{}d+g`kM$UW-p*{BVZVPAVm-v3D`31L) zGk+kHDx{M$p-Gu}(e2^Po)F5s==KSb`|u1%tDBTgJq+)|UvdkCRQQfWDeBKlZod@m z3<#Ba$&H>Rrc21lkeA(jA$8h83$W!vUU7|MC?kK-p96W-O<#=1vzH0EcfBGPcA#b@|EWbkT7E*GY%;=l(!~x`Ow?{~=M)El19k=p$nVANm>005ou^a+< z3DWJ33#rAOf3ytgajPqQ9uT@-7nYe2>Q7is|BqbyAGsFtGv3z} zE>#No9#iT`%w4$G|I=3T05UXACY({@K*I6@GW7fXQ@2Y@SNJOfpSyiRhGW&;($C!i zo*U|J>F4eUXVe&ves_#BYV=XRJINV!xAY4)`eZqu)!ouBTtmoktQrUMr5n!~x?4)) zsK0clb4HB}`N~b^4BaiI%vWwIXVh4c0XLm9beHq6_b>v`&Ekw2J+juF%Ne?(N}088 z9%s~elCRx-&d?oI%6#n>aYiloZ`@)QwcNjPOIXw$)oeHHsIGHcIHT^Uu5;Ttqwc7F>vnQR-BJD4?d6QRqxzlO#~F1;^*eWvGwN>X zkUPQ|b+>fL9p{X?Tl&2_$r*LG^n2HrMN2t+M}F8fgoN+N54#DRQQO6OH<3kc7wg?5 z7PVchcTL6XXnt7T3k%)1t*O zH!5z86z|BmOX2cv8Xu~8<%mm z%&58Hj~f&co`?RpNftE^{c*+TP^mI)W4e6)%OBUovInMu&OH5b9V|3gY266K%{`Y& z)o5wRT!tR%ar0QthTH%N#uW%D({6y=4hh9IvD^Wvf*5gaT0YcA-+i|Hv4&$#|SL36$_k`ZQ_#)a03%z~u z)vcruZ&0E2IbM~Dxfc?T?JF$NQPEl)enE#N#Ii$Nj_6PLxV)pP$Lr6Iarv^(zQc}> z(mK%kj&UU{8IX5{R0_d6TDi|V#Z|MYKJTPz_IjA0L|0Rh5Z59~bw{Z_C&aa}s6Owk zO2y1PRMY;Ctox6vd;I?g{>qx2XoNZE_3ND1nPp}|CKd~A3!xFhY_UuxghnP?=vZ2B z@>c4dyfucr#XD~ygb-Td9g7ViG;<9S`r>-9SOe$Jow+w;1f*Y)~!UO%qa z^?DQ8L#_nTuXiC~R}O}J0y)6nA?optB(wazQ9{oh68*^+h;7xU*2RJTbQaaZ1N|97 z*87e{&4*!x$$|bH8KbEsf1p2~MfKu9e=&>d#cY4M5X=<8y*S8U$D(?1u)m2#_2LkJ zn-F}>0dE`(qhCq>i3_RCvR~ATL;b!Lo_vRx!~97?y4`*y`_oudzmomwQZ&`(WPfR% zSQ>bWF1Mc}{9Qu4HqY~qv#2(w_!BOoQo}K-%}4uFg><{iXTCpANR4(1YW@{1obN9Z z6491IXbm3Y@8_5+IA(!=l4I6FXq_JCuH`C7%rxAY+(q_)q`Q)UGuRoB#jebU(0+QN zDP^YGJhJ2IyYYC&yc0u@%+pD`7$Pk#zK^#=4JkBA>I}1 za(^p}nzv`Uzem<1{$V$u)N;ReF|}vCZwxJ@<#U1G$FlowN)m*4+t>yEuoQQ_U*J#X z7`4@1;7=FgZBZBai&@kbwZh-PqPD1u{M%U6QeEk{^SvcTN7_sL$x%{+Uaa!x3-SK( z3;cybBEArMLHkaDzeLD--=UCuQR*^(8O!mI2ZU4!@p^i>zmY}t>vI1lDQ@2{_uH4q z{X+HYa(_09>Q|vZewB<-$Al~W*+OdYgi7uySNro>RzjN5p4I+hArY+@@-*Zce`O=jpmMO=o>>Vs&SGKVn>&ht01+K&v$Tr{Tip}y* zS5jCyUCCnk(v^IcDGOA4N?B&QQpb|!N()PlD_tyWTp3{bhb!YOPr4F+ne4?@R}xu% za3zgpFU+eZ*H;e9A+8j%oajoq5bwY8I)7u7{1;o)8h>k)Y=x}#cSQ+}h`!0cElNH? z%+3BmA@WZ9myn3R=yK|X+%oBXqH=$WkP0y#iQY=M)!!yWjz^-JZ}oR_Oar!XI$N&r z_i)U=A#?<&@Nbhb+RKnpU{LP=p z@(0W9{uCj&OEV=_o94qgy}zGhf)J{w+CR=Q^C0vM^csKil~nU^Olu8}`tRZ$XMbsw z?1y@4{jpbx?7mEtG9h*TM3x+udVey@N|pwH4$D<6|MVBKL|7XARV>vk_xYQIc-LQ> z{4GN8Z5_nWQr+Y)zFM}K{y`Gao=yG^A>MQ02mGTfYMzP*{Ygbs%DapHpg&tkxAr`0 zJ_PkV=+9^Afuum1{B=US^XEtWjZ%Eu5OX|Y9`X0He8tl2pRt;9$x?LX@~FQ~ihH*6 zZ-1i{Jok&$PDMTc_KyjPXmPQz+BuL`f88~r%~}wW4|&EvB&0$+3PSI4KIflvEyYB% z#VjxQn}yV9%OO{x)Jy(;j=3IkJ*3m0T1=&CwFsmP^18oHNJP6EavNl`zj}?VxfMcp z`QGr43z4%5(9Dx>_>-@fEu>Li_n=gdI&+w=u3_JDMg60B@(OCE|L*^~G3tEY6LmiC z$yStl0J(bIQeQ(J*+u?>&^5^0ZpmTD-|s7xw4UEt1Hj3Y;$D`%lk^EF2tKkFQ7di>>{s2KH5dzhJ5PE4%9=X zw(lYoGqj6*2pMr@f=i9=B2?--CDYX!{LvM)20c-0&=dNC(stA{?v_&P!V|TYJyC1f z6SbCqa_doR*^{{4J*_YU=}|HbF;*ZeO7@2Y z1NlPaKkT89aG*=baExkCVxa#9dHkUnBeM{b7#LbBh31Dm8**S^Y@HOEoswjBAooTo zC!nV!2L&dD$T=jbUvmOOw@^$CZkNPr7b521K-zi|Ib$UCbZ(%KMfLQMK#P!wM)O`? zj#5d1aJj69=DjS292UrBp?NRYK@Jb}vRsW^6f-ZdjinM&1vxS>!14g37LpPeVtE15 z2stV+!Lo(r=s^6fGW!tA{6LuHSI9#sl^U4CV)&#S6G&k>j^)@uI?H(w%C#Vn#j+am z7$hx_!*V;zae-WxhapcQ=J-G!%PSDdenOyxKLU zlE6fiOd{s=K;8z*Ug1+uoU;Q3LU7lb-}}oB6btc2JD(XS)QkKh6E~QJ>rUW zKgd~uHYq;(YHApAPN0KJ-Gdg=-LP{4JshL%NfLrC;MYC%3&@d>rGYUKX4E$52@xwpxErxS7}O05iZ2#IK) za?Hhn!rLjPE9M8tQpDs3idgpCQ`WO8P|V`6TpB20nFm>kQU!d>>=NtZGRS3tQW0~j zb{b-?fm|Nw5K^NpgRFyG5g1^(0#Xhs3}jcyHkU$fhg=z0%CZ4+5YA+-3KX*32cb8o zt_~Cn@vgFq0;NLaUO?-;C{QV+%cs`h>Od8XT866w)hueAt`5{m(Ny182U=KYtD~M? z6X;-3OXJ!=r;rNm8MN>y;#Depn zNW`c1rW*pK9PM0HMNb&jNW3>+&*&IK6uV z1w!PAyVyN3&MHtOWH?T(oqGc%ENboC8z^T{Yo{?#B_&3!oyI^li&{JP1sYh?+Ib+b ziAAlQ2LnwkYVAA}Xl7Asrzz0FqSns80$yM%i&|gL1+s;7$EfAp9w=f_%jfw(dz8@fc`>k! zMJ=C~0)s*#+Uw{A#k>+ot)ccrv@P7PR|8E#x?|KDd@YcDmpB5%s5SU{AeV)<7Frsc z0|ik+dv|wWl!dmRJ+Ni=1SX<{_V>2}4YjgnwMD%h(CehAwewCOQ^;_PT02_;B`j*~ z^aYx^l-i=+4Ro-mE$Y2MAB)-&wg!e+)Yh^skoXVEUasxH(x9Ww`+-~`T`|A&^7$Z8 zBxE>7Z3!O++Jtn+s4byi?YZtV#E+Fs-E(@ZHUmrJ<3Lh9<&xWm1^FaUC1f~GJ$)Mp zbV-R(r3M1wyQ!2M7dH!~J`K!aF;Med$Y+6Mmbs84AfE@)gveZ}kikH;5P2jy3o;bw z5i%TeDvtag4>>m zNTQUO<&ay2q(wcqiD>_Xd;l2>EM=kg3`4#TB-|@w-Z(NwyAAK3{uoFWQlm8^=6l49 z2l7~`J-G3y{TwLfQf-KdhfD-|Ip!6J4*4yR+(+z*n7m_GxR9P=CG zNXTD-29DWxuUKs{MANqk@t(QF=mSD3d~*>)XTmZ15K9(>#_h!DV=Py3%x?MwOBKiL zrpIoi7FPHkgPf0CQ}lQt-9Gg+XNqpi7;$}Zv4}~zPm~gJ6(m;Azn{c=$~jH%5HcL2 zp7>1D=WL=F?`c<@Uc{oV9ro0-AE20s_TG88szuESdXta}?M1Y(7P7BCC}cQBJwu$K zCp{=@R!=YkdX^B3dq=5_C>78Pgw$$RKc#7H5M8h4QtAnmq31m$>ru}lO}(v2ih9=O z=#xU^m%%rqo&)sphbczxl^;M3)F)X!L-tQ0v-Q}2$rzf`X$W$V9?!A^F*_l1berX8 z$T;L+J&9$vz43&1I_?$dDJ*+IDAyr+8jA%Ttb*1$u?FH%jfDrHbX}Ufn#Cv|4u8+x5?sLzDdVDkWt6Nj! z3Kr_VN2RE71&j0!Dej)KSfBBjh;c^|oTz8AsAr=m=}TFj!&1EvJlppNE{SHwsy=^+V{){2aYY z$m>%^Ad_^jK(Bj(N_EAILwZo^JiRMQwm_EZ<3eh*X$iP;fh^P0TV<{ggkmnxi-q7V ze#jtXg~rFY}Ff>M|08A58c!>_>+LP(GxvwvcX3t(^kBPRMYK z8ZU9VJ}#s}`&)$^1$U+Hds_DWZq!2~Y_HTSg>-3Z8D6C~LqGy_` z^`0o1g*LC&liOs?k0a(N$hCUxGosDzn78ZnWGPx3VyN%e=@~-g)x-%xvV?e79M|bN zLcG2EIz3m4yDwj-=Lzx7gxBbWLge0kB5Gcvw@UG;@z14tyO4-ajejoHyEsOT@wid% zo`9{5;V_riq&OyyL>4Pl&kmW)~S=1Z?H|yhE56xvk_a$!DwP$JhRQSF{Df&Mx z(|tlBzCHGl|EFd8433!%p_qtnb4)tNMD#gAyyt_r=-Djl`QUoJfkjddOc5wTw-+eE7wb-ghnLZs#iwIWhk{lPj07r>a}HP&oz+S^n8{=2#q_vU9S>S zp(SB1!5a`$r8h*$dLf-Gx1bb_F}p(_W%)bHox1(JSYr5^HO@RybB#VHO8$;|YW0*T zp)o@BdM?XDD0Met{;AhV@x2V8r>^(u%|dX_26+fE_v!6X@)YDDef$N=UW4xe$7-)Z z9@R%*B*FVlkXe|ax<&WBB!zmh1u>87O)NCq{Kt@1z3^pOPsyn9N5~lDX}yCbcHdZS`rdfARv%#5A94WX8GV#xHslz{v%2<*%yldz6Y`vHvz!jO z7}Bn1u&jivfjqD0u&jan4f2AXF9fqmK<obm~JxrGz_j-+F5YnZm2pNtkUm}l(oAnGK-f?5IUL-|(64_}C@MgVONUi(Dhs}C3i~8b2 zx85(LUQ=Iucth7;6-(Yd`t|6^Lh5}lqh|WHX^)=D(&tJ#%QvnJO2HRdWP5t_5g}fi zdvxtJ*;5lSJJHh~J)LDHg#Ity)SIG&zRdELZoe)|%}317DAlWDapBiJJp=L=WQ!}y zSo&O1BLv=cMU4=6Pj3=6%OlC22~)JKdYcq{{~%V|AF@riyC{1FzGM(9#st2vCkgSc z2jACIgm~A3@9Sx@l-OEmo}Bmf%qTen;|4#_^Q8FJqh{K>`}G1L5nm02j%@vUF~{5w zp*MOy(n~q!X$aN)kzOfdL@pa`{#YN4l0?XWp1zrSA^)uogM6mv3GsTdUGEa&^iTq8FBIb4Hy+W;g~)Zf2<;is+l6>N-Jx$2;`MZgKJfq5 zv%}q5-oSFEaTlI!h0uSTC*MKny3&=Yd(M#eSHDs9Or6Oxs$@ECnWv+LJ6)kIljK`h z=AqOw$ak(}u#730N=suEV!q!+u7UjE%K0c&4jFf46{H68lPk338z4XHqfyI{-Z`4k zm-fgde?3Y)hWh}&>Lo&k}>-1p?R zu>hr3{JfiXm@yzkE{%5)bGR`sqzlivasLN$gpsqAN_F8$D(*T$=DACi-euT{Bkhr{ zbZo*qzBubnab+D!ksR$xHH7{>Q(bw8kcCE}kQ&W^Jc&2`7a3(jWSgm9i;adT387Sm(G(?zKu$J>r1<8e zo&}K8j8P%p-OJOAF(Jb-YKfg@OtPpYmSy-pl>Jgmeu zg_e!%bOm&_kuAi#3wn-`C!}1v3^5DQ!gGvrj!}1n&M|sf)E%L7jkb?ud(?VA&*&4< z6{EJ6^NrY#DdzRv)E$^*MzfHJmWz?hbT4v(BjGm`^!oolz%awC^F)Hsfp5M)nZ()H}|X z8hJwGNcb&SJEcbF|0t$jn?$L8$c;vy5P6s8bI46b>ag5?rdt^8{59?)8F@my`#%w* znnm6Jxy2adQaVZvqn=xgF(Go>pnE&(jf}6vy3n4(_=KH^xz*S-BIRI|BB?OSzLwe3 zA@ohs4Mr===@8m4DvdEA^6Qy&SLAO-!VX!g05KDYxy@*2DTT!Chxu!aJ|P&P4WX~o zRvBX)(+u$=rpn0tM%J?#5{CTUSjzG_Q!YN-l)lW%NWzA*9Zjh?1Ki^+xhe*`9+?&z+FFjSQ9)NF$`dD2tNEApbO)Sr#Ft z1JbDePp7LnKR3EU_aSL}_C)P*o~ZrQlU&ri88vS-T175zHqnhnyAW@G-)MAkjLLPN z(aSM(&y)6@`;2~$QQ7Y|202FU@An&{9HZK^$r$Gtb==rwXy4Kj8;(;ge8BJtsc^rh z_khtNq(-|Az1V_YJZQv!N2O}DD#$00CL>db+qio=7oA2MBYOtrd7T$C z6GB((u1r-kT)m^}nK~aaG)tH#r$A`Ff-OdqY_oeOu+L}_B9DI8q8ELJ_LE!}bY!~` z@}A)n;;r|sD%bRLQ8UeK@5v<)Iv4e%!&VENW4{Z-Z+ z7m_u9XLPdYEMvx)5U=L%jY%QHaq3>>_eSb(Vj0G%dzC*J#VqPx<&Q=yi@H}iZj1_% z`ykzu`N=5yUDl)al%I_f7PY7RY?KS>j#GQeFGdy1EVP;G`Ne2pQTxt>u}MgU?-0b$ zJ~&}Cvm6bfeQ?5PV_C>CzZxAZXL8K1Mvsu;IJFP{X7sVBeegG9fJ?oDk%Y9(|85Mi zdTMGW0>jWLs0zT#55ndw60IEQhxXNsA@ z@;hSaovf*5CYPG#;JGkjrkO=TymdOwEQ^xe_Qzc#vq4C=I}6_)X0sHZTBm!M?JQ~y z?qPNcS?@EDD<1XiVJ7}1dqFeE(K_A3OcSy>X097kz%lb7`-)QAgw$&%K`h9gW}@bE z{|ovs8fvJTfHV?mqDcvD}Xs+6%&F zHJ75JG1U_`8(7qRo0(>_5br+rOtW1`g-^{DJk#tH67i|If@hk&9P`8g?h0V39$;?c zm=4I9LI!1w_>Wr(nPpBy2^|3rG!u3cTY^@7gr?;oX0}-974^9Prw5tgD4{oh4>EIv49BVe$~k7PjPV7+_%}z)9J7F9)W7G! zW)a8CrWhPa4mL|UM*W}8HOo2X7_MioSLI|lG!^|^uqV* z795SRcPE+KghYJHQHqW>N#>x85j`b2)YNw0weN?SJ|UR7oz8Yp&tc{a7IhwVgc%l6 zqg{%cS7E6hWnv-Y*FCi#^C+%{q?&cpsAf50VI5?F*(hWmT9FpQ&hxX91Wsx~51o!75w6!cUCpbpEceB{keAGhkO@YN` zypRfa=A{gC2FIwkRx`}7kl{G>zUPT%E{l5K^CYu@MZGtAvbl{#y*HX^Cd5(p;W+ia z=P70ui+bPlRI`#ry*GNA*~OyX8_hDcJ-jtog{85?)T5*ha)y}{B@aN(GTVd<$Eo*o z&ow((R8P+}dsx(4ndg~(LL$C!Q$1jThUYM)$E_hO9RGgp>>Efm~}gPp6o2tqV()-u@^yllPLPwz6Dj z_6jN2K4)2D&e)q`Dl~eBmwIu%8IBU_MTwadB{VW*t(hvMJBCV8ziu>}qGBj}#B7a{ zEok8_W=B*h>U+5vn?TtyLYv#O!K@Mz(c)*yUR0Xn9HT=%L_L2q6ZVm%4rIB_46_`` za=V$vaso@0xs>H}mOIP>mRy#|x+U1bXkn2vfRY-+KZ${Ibw$)~bkl`2-dW*K! zOxTy&BZZd6-DbX!^|BP|xz|kI&x@hH-)|NRsqn2uF8V)x&@5%S1491=51N%iYP3y| zpHR<3X0?nF$LC2%li3s{Q~j7{z#NT|y&?ZLC!-_)dE89E*L9+=ms?F+h`a)#?5$>< z5O3a|C(TA#${pqPq}j|dYLwSgW-G_2QC?4(9UP-(xqRB};utl{<m#K3MeW!1=kVGNFacZ8)&1MqEsCgzgo2f#!$Ek1db(`rd>KlCB zW+uxQ$WG@H-DWO}`YK^6&qRJdQ^>^93}OpN+o?HlF{oqAfM z?RJ11FWO_)vFru85&h~hds&hoHITQ=6hoHEV)?I`%W@%PBVu~Za+V^FdE0CeQmd6i zni2Dk*=$lhwc5RqXCZy&fF+i^m>ZLhB=4EYHc5pRI7Gv&9+)rJYzj(w4yCq0J}`YD zS!y%n6G*>V#!XwwgdGHn&mTPsn}VV%?9$NIl{6xGH6hd#&?lALb$$D;L`Nr&IX<`{Q$5=Wb^wq+hW;jun+6JNQ-|u?~p_p1NlWX3~$~jodiHONUOoEj#SIP>+{ES>PtYVhc5Zdbe zRyoTpECH)uNR4(Ei*AjuEJe*ZsM)Z_S&AXcA*O}NgT(gSz+zePLcD7k+X_qZy@Z&R zC}mr7Sl)ur{$*P!EOg8)Kupj|W1(Z_H9|6_XzEB3vT~y2M#MN)UXJ-9Ab?Kkz-TaAW2ryVH6|fCCH&xe6lR{ zA^Jt%3pmWmVEGo(jhMr&5|-U&$7)+4$yP7Revm=P5mxvJSj)`R zWYI9Tna(^~v#9qJ zF0^JGOQpQo2`;p3Ar%_Ed3PsjzR;=^;@wNR(5e>VT?JfdHONx#RltQ-6AN7h&>7JR ztA&NG0;s1etah$PT?OP>ogAaC0`jb07WHNDi>z%d>dW94S%WO<%it@m5f=4j@RioM z5brABVr!CP)K$R6mT!SrhVE5BzLg-P!l$kR@-3TV)K$PGRwBo!tAI4*)Ir6Nsz{+Ep387_JV70K!gB0Mu=`yQL zNW_-~`3KhEWmYH0tb$Ok%dH-kbr5RL<<>TqYL2XvMQ^Ld_kxzj~!LgQXR+_BE2Qkl{G>Er6@6IULi87}`^=vQjuk zU0YpkrE!e9wz}HNgxd4S#2Dnz7BAm)yYENW2L=m zjn%`_4WTVzjkS&CJuESbx!xLJ`2s>Q*IOejKX6QmHO8{%!7`@AniMh|r@kq0gB5$6 zT&IbMp(EQ3R)Ub>xcQhfpN_O^EuCXhIcBYu$T8}AaGjOJG3t77ot4V+@M3wCD7DgA zUVu=WORX#+5nm2!rheUM<*?*&n{Tx8Sk!&mo2+6X>wTM7PM=E^aF z<<_8(8f_oQ+laZqa+J_pt9M&zQ9|!QH&|Iwl7SZf(<&Cy9iv*< zXjQYQ7H+hfSX6uNv)ZF#s6F>vLs2m#4_I~vEsf#0^xfrbhYwjxS=3C1O;#O?ni26~ ztB*y^i1;rn{zO@in#u4HE0aadWY}z#v#1#nAGJDJ)QpIaS(8HK63as0|80$(L^W5q z?{`08O$dqj)U$vmtk{!fcJ)l5)ruDq@u_DDt(ML)>eiG3Ta`lAYcw||W&g;kixOIfA6uJ*498Fm-RB>$ zv~y*4HKXRBl_w-3>S;mELzcbNi=h^NZ50VA7csO9N3BvJ5$#p9hhlbGRV)J#dd4wk zHM9K0^1ao?GCfJg{9p~T9K`aYHOZpp@E^A_&X;{(gqRo6!k?@%7WItd7pp}`jaGn| zUc^jT;~cXVvRz2*GODLWdl2$7 ztTc{U1X%$2%gW)H%OR&iG&`527P1@?V;9I$7;7!(Ql4Trv2?P;+Ji#mk%Z22r`lst zatZ3$-PV>`vA3NkB;uai>}_uovfii8 zZT7YYWsJ7>VR-Kt{YtR)3n`cUUgS-XeeEn38WB_hnPC?Q@!ogX-!2v6&CRmEUA{sr z4fjhQx}AHG6!j*BX^*XxqGn>T?aqs(sF_%TcH<>d)EqAd*sUyTZk7Y=Nfz}*j05eC zOJyk%`Xa_bcI9OxHQJm{@mv&p?p(Wr#X;Yf&=-*HULnIVM?mgCPm}C%j#&h`8*;ck z$#MqdK1i}1d%3JRkL3t^2Fq&5!-$z@&k<7LTiGSA@sG4qrD)ee=*s0tJBOtdLL(AW z>@q3t=#iuBIw9URc9h-6qPDT4?f5H1-{aIaHs8)JH~Dh(jC(QX+bZJwTEOWjpTXAadu}R<%(#%kZwr2-N&N7H@eUs6e9N>8YjHi z&bU%8F`5I1MwBhKGg*dF4~-~0(MGlSbx%G1W89s>owt*Bky9a=u4EzROvovAmZ(QQ zi+mgHInB-&BJX(o53%Vl*fl(Q%Hrj6EY1; zEYFTzP1z&bZ;*W;EA31n-uzMd_EHvgBw1zGv8W?SfjuU~+v+Z}^=srhjZMb4Y*6!M zc9S| z#T4UxHSAiul0{uNU2B(IM=_Ye0PR_hQrFq7LcFi4t+CtIP)wJmz8bd1o@7y9XIo=u zTrb+AEkr#lQO_E?h2>mGp^%Ic8AIO@n~N*NHFmj>8f_I~)*$A3dx&G!L+B_`V$Zoj zma225P)M!z802P@DzUp*+95Ra?OHo_EtRU#UWaTz%sM+>NJQHXsfLu=Hpl!0p>L$# zXwP8@9wDDn-DIb-90R!-15?MC`UGX@%Tk_X&}6 z7e5DCZ^y5rHsiYcLU}LcR(pn!h;QO*c`xNwJIpcP?2s`P_8g8m5Kq8q`>C)~I7ZDv zv%yXivOTU4ZKiLDZm{!YOpLmw-e4CA@vfjZ*d;<_FR0BM>~dKuPQ9^GY1jRKr7G9i=L5yOjDR>vGG-Bo*%H6vZ&dfAF%Vd9(5h}fL*}#sOz`~>|z#m9rvJJ%A&609<(dDo;T3<-E54d zu^WVR#e4vX7t$|9Q}Z@A+2NaMX+*T1~I#5`w<|pma3X+IMGaj#m zwAt-KYP3I){c6ZFcJT&^snP6tvDi!S28~_Hax{cyhkM>GXE}-G1-nW}L^~I97fQWo z$5zUERzaSGbl3?jYap*cUb1bL4G@}T?qxfX!kQTKq;C7xzBE7*#V(Bko)XrAzhkUgYVkoENZUl_w3BSQ7>dJ8j-lw z&JiMW?Hj}lDt3twZ(i#U>{1rB&3|B*2`P8Ko%exVDJ0@k+w%u@9m}6+p^ch9v>RFW zI}+az5z;KAOH*4yzunHF<`4hKj=hcAJRGCuwf@Ae6C!)D5cLe$O+sWZvLV~;%-gAy zw^x2;XAAN6%CGEPj!}E%h@HqdE={eA@9b(8wMBhzH?gQS z_=DXhCFUYzzX84Y(YEgp^~Br?*#P;;?vbLY{rwkvLWsA&PuPWbQYpE2)0x$;b`{H` zsE5w$ezOOJVAc)@?M=ViLoA=OOxmL?aVaw94||+tCd;4pq>zYq41{X_%l1`McDY5> zqs>~dFiIYPObPZ1@y>*&2Dh=O^WLe!0Ty*`JT*APqRxbO4~__l_~@wqC~Dq4IL1Op z^(TZ(vMfOh>AYoHFt$dt(03JtW(=4Xj2AK-qrP7`EocjgXl00@clM_Ri#SHTvp+4^ z$fDla_XP)7)VXL}P`itAdEbKEGnmez<_U}sW(&a^m&ireM0*8`IY!O;yH~K0MP1eI z9UPAmx~knLSXwJ{Q449NwHd)y7Ih~_5B3X*XidoVES8TE9ATlk;9i25!NfYMN6!7& z1F?d+LTa>jlzJCp2TNJrgwV{2!C)oJ=PaRM9m~&8jV${gCF=TOriK!-6yJmbrf5n8SmG zEHuU=gj~tNL6+E~@k{|SFE|z@$3jwqDGjooc*Ic6M+fUzLXZr^%n#xsSuBkcAaobv zn4r#b8YBlX#|D#x)N1FkEC^O}Og`ii#H0m#S+0j%4>>+K5GA)k(u4LtDOZg~F%Lo( z2MdJMYo(BvAtwd*5Hz09?P$g zpHS-bU?EG~d|B#@U@^-P5IT-!2TNH_giNB;nZXv8^C5J0aaOR6gEE^zu zI#aZqV2>2{+TomF{6@K)>0Z-5h&d;i#zOmY5ORJnJ4z0MEDz>J$>ER-g3TuJ0k0LG3}Ay$dl~7*EZD z%`BflY)EZzh=t~DJ{VFT9FLM?Aom0_9+LIYKjZ0;jlrBK$%Q-+%#V^QA^!?)5>l(} zKrWJ&U~-e}1xW<*RIp7*y+(Hw>mbhrwTERcEmg{k!PI}rQhP(%5%X%WL`c0D-_i|v zJ-CTu<{)MZq$}uqM3zc}3_;!qrbfx{ke*-@OEzK>W@3Jy;26s#5EJs>;L>KQr&gou zf@H{+VBe#%<_KbF>wP!a&r-|sUT~1*5lA{pZ4HjGZ04A4!3mZxSl$n6kI9<PoA*mo*>#q~T}fs+&6P}+i(JWLiMUe2a*r$3EYG>p%rfFiC(Ay^srK}9?0LM(RlqXal`@u-U1?ys=2Og8BGy+cOP(9k!*a7L zgDe|enP7R=m4s(xFaGPw9F{L#NoO%nP;FkyGS8JFmXlnmWLf3PCYBprX=iD4rH`e> zl@XQ)-M(wja+}>4on_FKWR_oD$z<6-UG*Z5Ww9$IEcvcfvy{2g%+lmaC(CQD^s{{A z${5S=2=t>F8N3K+}jJeXxGUXK2!cLY0UFm1J zYe4;9jIr$aOo{I$*^A@dQel={S5jH7b0wQ)lPd)*TU{xWqS5(kGtOJgP~t0;t5zFC zOeZ85O6nBZ@hu>nXF|fE@z`NvQ*5exO+JZ;~YXcLTa?%aDM2A92_cT zdHAFl?NCTksD(vGsnZ}wgmN}hJvCYqWEJG7P%g^?mZL-YET=-~{BVA#m?alN=ZC4G zGM1|#bbfejsG21Lq4UE9p$3*Z2<1u(ZDM%@awX)rPz%cokO<_2P@9l??QO`-KVinv zkgr=VjfV5&h>k@eo#nlLDT_miLTa>~knb?YBO{d0F;hR9B4$iFDOAm3LFhfQlS6|n zhp?OyN_s=)8bEd$J#t#8R0wK@+=Uiqg$6iAJ1thb7qTQ|_sCNFLLP#g5z1zn1)*<6 zWry-uj)%O8n$HUP-W2P?y$g{ODik8`uhKbfPN*bG=s9CfXhN3q9q=)}M1+~`&k1R7 zQ9Z*kY6QhOq4X%B5ftZ!%2?D0it|F7ghaISP|x{@IX^Tm1f#sT=JP|D|CRkZ9c_LL z{W?F?#IhXn6l7UQ@0BrQwRn;PSsq%-as^_#A-SP~D0v%lL8yeK8vDhEkQJd;mSU9J z4#7N0Z;R!l-3XzWm7!#ozd=SI`Jo(^dpPEj&^XH@kRK6qX=qYNz4k1G)@eZ~{vFxo zS0MBT-({gxmbW0Z)mb03)VQfMVM%0JeqGVsxvoF z4)sg%-G)-1;7!{{LgOqgkQK=FNXYjA)q@%BAT+-2k?Hb5UsOQPhHkK;Lt&pceliOvfCNA}KXwDZ>Iw4hvX$$$j zl=3-*dircAF-rb{nCC(bEcE|=Kjei_-w>6m)fR5XXmRxYrBM9;WIYq8rwuVLhf;*p zYI~m^tGxtyCA5@d&Ugp^Xpqj(CXONLhrAZ59Hx3|v{@)c(iQT3CFKOj7m)5y3(I+s zQAkfHc|^t(L4Jn36>1hztK9+F?Lf>A5USfjF|}GZ*Yi#&{To?ow=-h3Kd0gOd#FlC zy|yoeM*F-MYUP;O5ITx(4YjkJ$+9if!&1ufeyE@25ta`^BP{Ph;?bTDLm8to`?ruV zq(79!vPU-FYlD0g%4L}iSqk|il+UsVav5YGRLHUdas%YkP$^3(q!RL3s7#9c-~D+g z^(V?+uN{Y@=(#xdejX}kxd){hQR<6OAIp=Fhavw9`F@tANS=m#6-sB>4A~6%I@JD) zjOk_hCe#%r?;>VrDEC*{_YXK`EY!mC1>`%#{16&qq4_F*g^Y(Pf0LzlB4+p5c#A(2 z{$0v%5F7GaXjDkOw)>g*Mm%IPlrbsWa~^uS0zLgR)Fh-v>ws*4;8V#g|AO2E+0B{p zhphQdmZ?sYkb3Q6$YqG}Ica~&m}Abxs5D5Nlf`lkVu~PpI0GyJwC5|L_IIjSN+8!m{7xOq?T|7^z-bgB z|1a`!G}fIqDZcv3aPLrilz82l(++2q{@hm-@>u_g=5N~}Q z?v%2qejV=gv8Y_hjvXgzcDIdWCq;_y1Jq30#ylsD<#Wz8&&d$t<(lWTu&7+~9BmKT zQ$*HKO(%ded4D5sd~QOocsXMjcJI?74jbJtu)JEcOrTt_=~ zQrv!}I*ly8v*rGk>NIgZDp#r#A1`ZGxl)}x7S*p~oE9Nou49}oDLx%F(=uG(^s>z2 zTnn6ST#w4Nz)73FYpw-OHH*rX<_rk&a-})rQhf6`*YVCI%L2}Iyc4^ZtXbtc-YH~J z{W{+1WKp?JaN_r-QeLhToJ1+UlR4KyCy8YV=UV8b2=TU!g-#=j%C*oLV^O&lIcW*I z=33LcCm=PMZ|pUEHrzoeq|#IoGL97uTb5o$4g* zCu>%@PIbyyRKHGhdWCqoPIHE&xcyqej~lPJVnU)fF-i|SXlGsvQHo#`a`Ma}Lp>P#m?if_?n zxJQEh>ue{B;knKzi^_GbldkWY>pZ7Qh?na;r%8&N>wKq$TKA$(Q2hy2L4Dp?^=xb%|5V^{8cd zi8H{Wa$Vvihjz`i$|)7%4E1YT;m8;Mh5aQ)3bjGFl zPUc)!Ig>0)I2UI7o+)cqxvp{wSyaESaynU5uB)B+1E`dj>uM)aiZ7RQt#*=FuHam& zofIM7wz1l2WKp?RJ7X*=*ELSstX*?mn%e~yM>zz8TM=itaokv|{qz+H2dIE_NQTqRDM z6yJY1*IK88rJZxFb-K77m20h&G+WlJa;W) z%A6h{Uam4{P>Q=H+~SO|e9F0QamKhFmFpH~>A}0^y2WW>QMuMT6GFUP>z#zTRI0-F z4fpF-M`s!5T(>%5A>LMZt5eCM*3PZY0E^01;mkQi)a)K|s9cp!e3I;`%JnyAsSvMUe{+hY_@6hYDUx>cb8D!Z9 z?P);Foz6&9DXRHSXH1B9Km1N7;V^Hh-X}^G3-RXrs&-1H#N=U|`R%xuTkVVpiTG^f zdKjhZow2BT{v#y!aH@GY=1|;8?u6Xq^azRg4nwJZ@Fvbir%#HO26-Pb8=V=+R4SsK z4f!ABK_^KFo?AhFg#63NWLd-Vs8hnS-{+VK`xksY+^Lk}-obm^LACgGPgmcpcV(*T zmnW*tPdg2w9=R_5ME2*Lb|JD~Rk%am?r2AN%aFdC+~E`m@s{DsPLULM8NTeynI}s5 z)SHQ2PBP2i&@Y-nuFFXk(j7zdeos9JcXyqU6e?AtH6msoNVk)Cl$TwHyy2uo$pMfz zojNJn15^r2zSoIAno31{Dp#+QFQh_zvxA;H^g4ws^c@y@R?_Q~upEAzd^hK9r;KG0 zgx zQ(vFc#iC~F>vQ^87TzoCdDrP@*~0a_>kP3h`Ag1c^`7IK?=3@W&wEb7{}DY(s6FpF ziBYlyveiizBHuqf2lBp?CPdDAc{tX^hfXfbCuq+xkdK^VmNCde$S2Mq%U~y+V?s8>-x(^4)sx6F*OfGuvs}qxxz3eBmWN#_7vlAFr_&(Co%3O*(=0{I`EUuAGkU>7 zb3TxK>-0rQA>=z}C`zt{j5(7+YBl=b*?^})-#e+tdfVYz#Qfl7OY!~w_7v>~>^tMm zQkJ*T=GgB@@`QNzmdBkU7WI$zlhZ6j&Yw_@ntyV}IY#|k{p=(ykXzJesQGrp{OoiJ zsqp;)se}CD^svM)#gZ4&$1)SrDx_bEyLbQM#HNXUX*=)1lP(dHDaDtBQg1>goNSg8 zAX|mxvYf>+zdHFW7jw+7PLUKh*KbZqlzfJIesdbQR542Z2>HX=#6o8de+X%2xdk!P z=1@#)R6Wy$baG6`|L|QV%*^?x)5FpQp_o6NZ7jE=9=b~U%Nby)gV0&!U(SdSZ+&Uu z2_bUr%s@Rc;Tgx#67%Nj+%23aMDEKDVs;DXNbym7XiJz9&SjzYP|TEY0gLKsY`BPJ z8~Q#QF|pxNmW^m3t&6GQa+ZHXXkAPVSF=11IRd424>z#%Ku!?S#PT8JbjY-D3(HrK z93kyOyz?<%IN^A?)%}8)<%scxON7*De?hK<#DzyVhMr~L35gGXU6=b7PBmSqrH%Ljz(ST13i6>ef#&7~5OI7<`R=Y%VTc>e_lhc`*_J&01Y-VY8p zvpfNz^?q=;jirNQ=7u|1dO2opxJQb+4;~Wki;|1coQ0^?baqpXc1yxz0J)Ifq5PSLD`Uju3C0FAo+7 zk>mVQlvNQd=NNUQzAacI^KrM}ZNXJi0&7uv9a7yEY+!i?QZJ;Lh29zaFl0fng@xW3 z`-G59Qrw&?gPs47q-@zgFCynwq^b-WEFVE$6_U*Iiz}%t`{m&cav~;;B?9RYlEHEk zgnpHk!7P?+2>o^{gSkSM1!hBNet3JZNQzbk89+X_2UiKH)e3Mn`Um8Wpmw&{6WnvX zMZt&=Zx**Gm?p)Y#VrbENfEQSm}GocC|JlsvpAB)!4jVYAWMP^eX>8KI@ln@o5kH3 z>=q(N+Jg{tSFq0~H0xd(j6H|y+#91twwho(iyGN#gRMd;w8zo*amZ&`Fy&m)QXz*! zRs?&5RA?_CCLOXWn4BZFpxDZ1K<)|V2=PX(`+|j1+%f9DU^|N%qZ)#dnX-mzjCwd& zEkxGmeB`_)7<=B{^=S&W3aQZEM159a{mWN93`p{^K7t(W7Kt|=Yj()s_h$skqbrX^4E=28-lq)dSmvW^p%k3gWW@3$UDKQoH!p$f7av4(xsSv3$uOg|{)Cck2tsw<8Ej{H*p)#c zvVUF>F$u+#k2gEr8BF?zqzjR$UJA?G)w+(7wMXzxKj6jCUpH||@G`7)SU zD(g)BvkNg_26JvCsnr7c*vEvF3Xx@vJObBJg3EDLj8%$snbq@9FEfag2`o6dYwkUi&V(>!CaOz z5pxk%7ylS6Ww{(O1u^}>PL@&#t+4$in0>R%XAvX;*G>n5+l0tgoPkuo24im(E!CDI zCJ*v^utrF4%wv#`U&mL3f=w(hK(0p2U%^c*Z*q*Lcd>lVF~jtJmY*RvAk_%HsGQ2` zjiDNrL-x^)+oWi-FdKx#>3NkT7&9R&Ap7cFEJs2fg~aQXx67C_AkRWZ>-8)JkhdWF z>6?Z0#>|Jj57}Su^2wKwv3hHjES+NdAqjfg9a5G-{(>B&7qe`Dj5-p}O6v_Qlxi&G zP<62)0`@* zx3hGxIC}BjGUhYRXM#RvnUr53^O1A1-p;b$Y$=E9rORbZGGqy2j?l-fAgR)(L+*tf zsh0`qjVXdW202RC>L{i+W+CKx$T4~f%L9;h$gz4g%Tp}J>-9ovwJnf$5Hm@ST`BYF zfqV{0)00_-SWeP&SPm$_7=@UV^#T^hl@cL%Lq3Fl?-Gc)v6_lX*68xTWB{L}PqA>K8j)Aiu}vd3utvj;UiT~86>jiQ-)E{hsPr|E@4 zyb*hvUgj5+HBE1lB1X0mDR|SYp85clg?HhiJ|xriqK8SUw9g?lYnq`~vh=fL>#>b8 zM$N3w){BHxXnPQIAo4j!Z+S%K9CsPs8U)GFv(`u%&vKrg)FkC-$W+AS>g6n1kbKC6 zdJD^CkgFhhdg5A{su)6Zt&8-G$EB39T%zZ&+|4peFA!4YUR$267qP^>Bk!Kf)=OB_ z+bL)3Wm3d!=O&asTW=O3k5&sHm+AdNysa}w*P5w5-Yj>n9%NB7*tvR^klvW}Si!y+ z`OMXq3#ro{N1baSg?ft+xlO;v5#(~c-6yLNbEV!bC7|}YtMwk1XOK@LVy@Qvgm`BP zSL@mnRKo@CnZnij7%AdRf!^(WwVupEX9^_6`b3}5IqWrhrcdbo&-3&=mX}dF9jUL? zONDsn4kdbv5ZSILP{Zr=oj##d*X#X0X+g{l`jAiBAUEm->!=lSo6;|?OfO=gRXX$y zkutr6WjpFazuYptlI2T?OjXVDgDdq?w2^c0Oq572TjVuMO1fP-Zy1|tamKs+oSsrp_ zIm=V7G_t(lN~aKSv?siiZS*AC?CSztp z=xcf_^mZxk?6gi#Y^NAGWBeKU)al7S8Fdua1L!+_LbJ;I^#Pwm5YwPHy)N^)0cFwA zp;1rkAd$b6lMu5;&yf;Xftb@FO?n>7I#&vW)CJyxOcyalLgZFHS4f!Mt@wfYc?y6?GGk9~t`xGbRVd#=^vSw2MRbY1H)-C+6Nl{A+4LKTz45^<$S zh^+I4sPkibCkySF1(0SvvD51xniV{u2Yqq{VxG_^3h9lZXN73q@}!>ci=k9c>4h9a z$J}d?>M1?;P0G19hRV7b@{C@Lp&HtMJz{yIjeD;{mGsB0H5DjBWL#9wwror!y*&cr=YXX2iy zGjUJUnYbtFOxzQ7PVI?0r}jjhQ+uM$sXbBW)UJ$BXGxx@bD~#NOGl{lrq^6iXGtBd zsI#OuT~TLAZ@Z$-LAJP}&YQNnqRw~T-Am|vXZv14XD%P?C3FV#kt^y9=o44e+0CbW z37y@1?uwedf8mOny?^D3n!SJRikiKD$Q+w|$(QpDV* z2C4e=K^B_ZkbJMlZl;_UXe28kKj?`*xgYYQo+8AX$@J?*LcBAMpY&})ssd`o!cTe^ zOD^h6_o;uwPTOL+GB%&-x&Xy2tU0u5A%xOF-S@_(hLrS%6eDml)6! zSZW|NLmSY8Eb89PuX=<<-Mjf!Pi1*+1x80anfRNY#7tj+}qjb6M!# zdM3V}FsK&`@s25f=sRSLd$sTny-9vThG`=?W)thLRniNS}6Wq(NZ^6OejH!*FQ0# zlz+rz2$8EOcOajbP>zfdU)G@d3=0(qk)?M-hKIU2hSsHg1Bnd{3Gv!BGBoi$s*lW> z=HVklnL_HcUpmn1NVQL>REU=<5Gohq)j1GK*eFhnr{>#pQKRyhg3uFymDNqTu5CY zb9k&a52?n5s#$Va#)nq1OrDSP7{uryt&8%J=bpDiLZN0M-qnL}s6|MfmWKYRMoc(V z@-d~7d+$n!5lZ_+^q9N%nxPCK-ZnKuxiSV{vyyLkFhlt)s#ncW5zA>P>we^Hg-Te? zgER^$XPFCm9AbwSvdo7(C1kk}uU8|Xv~E#D?M}qdwuppsKb7(XgjQKZLWL}^vP46r zLgcn+Mb1uWhY;@!XhNumMV%!jhq68s{Uf#o?RCkaTo&3EBu9h_gn0d&5-OGA9xqZt z;^$OndDJ60 zCS>@e1Ckn==#wpwV?)_OyyM_;p=u$rT{qxZaD1pqNN>#QW8`mVVyKnnA(ly@PL?NF zP6&0ew6UBR+Qsq)OIm1<T^u$&w+q{Mx(1K0d;H)nDP0r=|}{SO(T zYUsv{P&G_fsYa+8p5ltC;i;~u8cuOV)iA>qRm0OlsiKDRp34sO>eNs+w?frtYAAN72r&!Sp!MyP;A)$q(vA&aU{R;Wmbw`Wcdl?d_nsOh1FQrtai zdT5mtu}6K3R!k4Iu+Th;>nZC_*St$6Gh|!#PQ9H!U4Q2bJ7;;sp%O|yv>q3DZFV%WTS*V8Puq&|U4YD8< z`?ZWY3epQ%7)tR;d@7!;2(_|gA?7$pU1+CIE`ijC0=+UHidh7CI5g2G&q5vx{W~dtAm(bwj!5$!_v>#>ZcR=Pq{tPv-JPIj;{2fZ@moe`` zRzik{%Y{^Ee?p#s>=PbfiMEH4YI`8RL9)V;-$|+hhg=n_ef9k??W}N$kczDLb5rAzT!cnM0PlrW9Ta$G)iQL3xvq02@;U%?C^3Sb=nQcM~CEu z8-y&=?uHx=IWOGIF;7B{gPb2u9F#pqk^{*LR|@fFR%FCr z+2KtrKkth-K?&&;;*ILF!`p;-SNUd#V|P>O%L3{u-|TQai@M4;JDkAs4r)kO`3l0x zEW@r=lEGrTlE-q1D|3nL+QD+1D}5~Ix)S?`Y}Y(jl2}%_ zlFIU!D_Jb+O~nP_0+vl~Oc{%MYimJxIm^#(Of$>A*Qh$TvmEJ4H_KF423Y2}691=c zMWrhS%fqguv8eaK7KC$H)cary!bL3VeXs@LN|smMeCk;~aHWOi4_7v`95he0tA}N> zD?==oxRNj=Td~NMWR@pf$zXZMl{}W8T`6HnyjGQ7&2pA2jV#x?(#CR+D?3;=xYEb6 z*_GJ8WSxI-C5h$G5>qsceALs z$QFbLSc2E78piLDtvJ~ggJqU0X+o+3H$u{WreAjk%UzI4j3fo&ES3hyVj(#!gFEnk z&0i>0o)j@7su3~$QnU?7^*H46@Q%N!K5`s;PDp|_N{rZVB8JY|t_&x!d=8n8`dk?{ zSOy?JZ6Zk)g7>psj}`vN=gROZpL`9O7mkmioR^81xJmf(W4KfZt`#6v7;L5$P^(>D< zS|E3Y`&l+ZUW3$x`$teJ*+26z8@xNLjU@5Tt(JuoS=5|=dDvi4=MF2vX)Nm8p)Q=m zqRt&whVxm}nZl}YDT_K&SRJkuf-9V;;fJWhC8Vk>_tq*(~Qwj7TY(U5z?+CHKc z+LuW69i%>-!?K&@zHpP2z^EJKk^27ddY17JI#S;sZj&O)8bCe|ga z5lBU)Y-(EaD-#7#q*xAc#?EYIF(~I zoE4)v8}WX~a2m(ljC>A6K97boIY#wQQ#hMr?neyuPg6Kg#)wwX9jLY8YM&$_pS9sO z&gU7Via?$Sx3jzjq3gX*gg3M7bY%z20OSafs+(osQtZ7#dZdWbPY^Q1F^3_Ba(*%# z8z=klXb4?Nelk2pNL64O$E*)0a?AxBvp#Id7?E>2a(*hD%BlW~m@^?yhp}n!*D*rv z8=hQ;7}__UabwiJ(c;Q-#LPrK&${vgg!<5vKFGy;#l+u;>tkp|t4cL`0_4AldES+? zST?#+0-@e`LCJ`FA=DeLjD7)f9r9^YF{8U#UUWs9kF}|YdC8SSSYCGJSje4-+2qQ( zEUzdTQ36?wm{(m{3TcM4yYf8bIY@^qpF=t!Z|)_ZLbim{cwRU7IuX|N=kY&tWedyauJo|%bme!JFI*X2 zCiD5y6`kcPS0=LbxN;`T*RIThB%r0euH3-#jVm=QyIg5v`JXGVv3%>wCoJE&@*5?bfoC93Ax1NTES(U#2CEqnmX9D*x@M$E5oK)5dB<6&B?QOz+E5VN?AWEID#(nlB#95V?q%h1vhMzf3& zrN51wM;h_*@~Efg5^+WXi@NF6$AbNgY9Vqq_%Z6dztP7r>S*;ZBXd8IPmDTR{maM_(h;MM z7Y7(k9HWjY2O6>ai?(a@b4;Isog^b? z4CT`iqmDb{jZHqG<4)M<5mKRDjeL$mKDLoCmQrEeDULD|ArWJukUAmfLXwSYA+=f+ zQWZdsFp~a7scN-{A!U%Gj8c{tA{W(#sY*+`b6jVs4&88X?(Wtj~5 z1~SE{WZANRthO6+x)C{0_6BW>z)8ckGmKm*B4_%=O*cw?av)-+8+}p&=OSnNea$ci zSZHhsA!dd#oaEB$l=I2 z+el@p;+V6IG?o<{bGDJm(g>kzXy+K&EH6Un8rnHV9?J(1>eX|N0+#O})T`$j#VlF{ zR_~+q9HW%w07!2M|Ob`docAp-j{-yi;&L+MxsxOA$i7_ zL>cot$6R7Guq54vuPr0yQX~Hm88Zpe0J+R)5mKw24|y3rv7-X3a$%fowRQ_A$JR3s!lpC4jrCbjwgxqHI2*HR1Spd1+SQV5pk3wo73k^*t zk!uE4LKYd#LaGAKA%>2Fi;WhRcOkU4d9l&X(g(R8sg@XA!GP;D|3PUCC zN+YJ)NDhgzglvS|Wt6l08!=lTON|{Y$3s4V)EE=Pl&V(Cf%HL^89j!~=Mo4#Nm^&5 zm{P8V>^m9vT#QzhO31$;D~$w8#;k;dA*+oVmKI1l3_Cucz(GSY0B>LtWb4c8bo zEFVIse;zejgy37EkV}y2QDZ1Vsp_=9AWI>S8Oc$SS}pPRSZy6-ouN5Wj)!~(dB*5s zp)Z5)fjnoFOpy7UijRQm4&@j6>-!8f8Mfd|oyd3XymJO~kxxG_%mX z{v#o;7@LI1I#XG%8assG`@+ciIK;ea#2+DBN|Fv~H)@2)oHHREMk5R5d=8}3Xc6M& z{HB2>Xjm&PM*bU7mXeN`-;s*i^)|`S&QrtVv-A1((amRTHQgs_mEOf`2MK{MpVvZqU7>z%g?uN3u5Vm>k6i!L z=L$UuNUMfC`2lU;TZUE1YhPYW0gl4-6s;%!jQM9i`yro~Q6DeWUs!wj+bF-#w`gf* z{=Hj6lBaOA@+3VoMtc?SYx=>B8Hb!-N6tSONypIkl6&SgFJT>{5%EbF*T;S_QiXKH z&~yDCA=QA9;ftZ)`+!mG6UygTqs%9_AB=h%jXt5A2aR?iy)mkvcN=3;sXo0is-Jfo z`7Ek`b{q9Vsx;LrrZlh30Z;a~s-Np_fm4S4`?1QH=cN;m!iBy5J zA>&Y=-A0~}-WauYb{oY)YPAaxbC`j@UL*Qsu6p`pZaWQO~*jWuyx6#<9PQEEywmrhfj*$n^=m{cMj>AY@r!7HUX$@ienk zigqL9S3K*gnGGDXjALTV7LIwul}?U%-j!~SdDoSGj`_}&*ooBAWm?=FvaA?0S%~+( zi(%$+DQ=I&nr%Y7Q6kpdCdC~kV$GdW#3=DU^kJ+y#6qJ4$p|wriAtAipZXyq%_N`v z4%x>{72=H&0kc?$+~@ZoCeBPaf%55%Q}gG2%_JdJ0a{N>zps5wgC&ZV(muAYnJiPq z(CWTXr(k8HnJvUyV-|0gvZys?qs^=nsVrIgSfmw>G z_OYn7h2zWt7HS2ZUyL({Sf~|JVow&W(9*EI==eU)OcWxI-7`_vI5Q%|>%)JW*(|CL z$D8>q>bbx1W`hv#cRJo|79zK49&#RUw)&(1qMO}5nFk4*v6E##)B14Q%9a@~MLV18 zY?&ECWSuLJ$})3=cy+eTG8R?mh*`~|>KrjAri-$~)}b0k%zP7_3(AkxvG#ha7F@ zX6&8wF=l}fFXv;-QlD%4I!DQd1bu|Io{N!l2mAw=v69x zqB%y0SJosm=#wtQOfpk^@;T%LGh2u(oqFsF7y=AItoIx>F?$?N>n#nBc z3qe!OR4Hy*Q_U8AzoQIW-xp2KAdUhvZ%6Vnz3igvebS!(~M_n#hyuTd75b^NO8-W zX(kKt$~xaHXHo6SHCtI!S-EDxIaHQ6+sQRcrMR=5TyvomG28hAzsg**k%eYEBo~waV$ZyMk1=nh8QWG;}wf zE6vS9 zUPR0ZkS4R_QkioXgr3k}Yjz5$(gq=P*8iB&m z^@&uiX8mPUy0-;4nuT*nysi9_StLaE53MtQ*=!VYd*I9)Yq1VQN8ijUP8U$iQ0SLHaBzW>fC&*+0CM^3~V*~Sk#q)t>zGm+Fo1DvO;QUMIalk zC_!&*H5-J~YO^484Q;ErUPx~Y{hDZ2xs7YsK0^JzwwaqmOqI5Bk9;2XT{Go!%DFeD z5c$wp_pX`FGT)V~D=4N`TL_^qJHKnT2|kky(73wY>|xpJ#taCl z)jolUFPWOfMY29Wa?B31{3?mc3cCZDuIJ~OxZ z;vi<2m0aq@Q0XJAG@l%Un0>4=DcXZ*J3U`H${J$X z067^k`&v0S%KDJdzOkQG;uBgkFvbebmoaZ3W*SnBwYpe7hMWsIz*>HjjQN>!KG5p( z3FVw<#g}<8l=GohlaLB+#1h=aLq3OD?Ke|Qg%*a;2#{nAv77**>xW5J_AN4II%Ez~ zC0UzUE`!X2{M(9@%a~grqme3TZDv^tp`3MVNJy1NLdPcE%DRnGdE-yWsubewEg`E_ zh&QVYS(}7-PXUCi0T%TXK*$#GLOYU2^_a$mLz|!Ex#8=8zs4JXd%V1I0Gs9LI z%PVfG9G1^qDPsBEl}eT|cdB;Pv#6_}VXKAZXg6lFkg9-Ml^3>luoO&_YpB9jH_N1{ zG2(7=*y>?99r@6x6}I|V&Y2venOMIXwgy-(a$|;AmTbq9C|Fq?wqkFm-lz&Z1j!RJ zMv54FZ^52vSj|46U-ty7T}X$R1JoksaH~hgXagAMNshD@TI%3{*q#SE4XQBB9#T;*~XDR1YldMi56bUHQIxc&nj>4X(qp&CHnCpo;!g`{P)Sl2=;#Z^XdrJ#svfD0-`2aFy zFZmHN)!HfgN6xiqlsLoc^9kJxIMW*R3B^peV($>!OKf+FIm;U36N<^UihQ#FX?Wtv zYL*fh|BjqPo@=!TsR(?CYn7DhTx%1@sP}>7Se+d6`=5B90q%C?s8)%6GVv zMe7DVq2uxeSX1GOm@(3QD_7iaA$g*%ReF+ydu@B?Jmoui4d08I@ejEWaw67(dNFhU zA=mvwDk1bc^-?|f4|x_>-uAA~3y9fU-uQ=f{X@R~hh+YvrBCa)ONA}y)n_EOm${cL z$1jfNkY3CqQ)0yGSx;X70l#&TYKPp)V*fco$WEV}0y)o`xKNHZFPc~f0?D<~S+2$# zC(aX+$+DJ5tz0WxiZ<>zjDDEOw)(Cp$rR*6sUgj{50ETYouwCGKE zehy{jTiHIj0&=O9xR_#UwV_|J1|O*|vkHXB?;PEPm^oGn$6RUQ%@v8bc44)$R6-IU z|Fv?K$b42pvc_Tsj#ban2ssQfS6JOb>a+`v#=D`AbCK0mEmLho+m}GDv|8_!vH_{? zhFoPe-9_Tvm$}+n&oYI7aaUVyEb2~8vDMBpgJX)VZ7k~E%{5jR%M~1Rjn%_KcXMbz zoM-j1RCCNcYmkNR?@-LOmbO&Za4pANYsE_u`v%QqN~{EqxeROGC{>A-#8QV^J-=-pXK6Exq2#mLmF@?$F&}?|V7=m0D#&dgIh@=SHhiNJU^HeoeHh{6?#WW7HSi z=3A>cpPDOVKJ%?cj#1;-O;$60hhx;(d%M-gF%Kdiin-ky#xZYm%pxn3W7LSf*vjUZKhUcU*jE=@ z`5dE0{v}o+$GnAO!Q+ToVwG@=Iu=x0WgPP%u3bEbm};w9NUgU2U9s9LkUOo+71Z|L zICU(z%gPo~75D&0hxZV3mz5`^RyzWzK7%Z^B6XCiR?C3=2&u7ZgjBh|(^{)RNS!wO z7kozxF|}6WN|~w{5;GOo53N3yn<1kh%dED0Wz15@p^!RDyH833#D=W2T7}@bzkIA3 zhODwO@0T%8BPJbkkJZmI3pJb$xz}obK*oHEmA5YuAy`Gk%j8>~Sgas?ob02{30HB`FyZOT@wR7h1ojiRkqCC8{y^m(hA zW7H`6ytRsB)F`^qYTy_(if*);S!ficXH;LXT7*;tXcP^h6)#wuIEF@1ifOYtIfh12 zifOZU2=T_u7p-nibunTly*5mH(b~l^YRr7e>gSkrj(N!%;utk%zHG%lO1)7Pn87hG zTVsUu#;H+slad$8YJ_~VG<2t(9fA#)+0TkR~{A;pj{t(vD~%;mT)apsG|w6Co6r%CVx zI?i{>5c7>y&2kzf3+ET#S!vHuOs)1I`kBW0AFT$Ka7K)_7^(U#qeaHVhViZ#$S+oz zkY(D}NJV$DezV#+W`D%|jq&hzOM6zPIt20%QVm+!EGdw+klj|fkP2-#@>vi0!`k+o zOm$EVo|l3AWfixQRA>_*9gx4RgpE>8gU}uoV`mAG<2=nFW9(d?+<2piA7y|A8D_b;?4?2+M9%U$H9^IW*Oto=SSK*gve{24(8Y+?H(Bu z*axEo)p;MgkL4f;&Fl8D2U#BA^W}hz&-&4x5Lm}^wt$@>q&H4osfe?)Sk#q@I6Fs3 zMZn~oiNXxFnm z#xX&=iA7y0)$R2xb8zi+0qT%jjqNEr;#E zCfQ?;rC{ERZDH6AELY5IYB&1f`XAF)YNOhu}_`0mm z2Ey$Bc_qG^vnq4HMRyzLWsE?GR@9^lk&kTCJ6m<&$J6!PKMlxm^1BSDPmhJ6S7c> zcFaC9vh9qm zQi>tpLvrmxmKw1MG`Rx-dcXR?y`?Nq~Mfwx^TSl&2Q#iX$uFhxlY%PFoDv0Um(CCeSI z)U&L2rG@1kS2nX`WT>)wSc+U3Vp-x!!VcMrCtXQq+2KkCOZ;gn=RB54u9UFMaiyB& zWmg(mremAZeXFbNHkQHDmF!?Krzz=^;=UL3Dm&$Us&iG~)f~BI@@jh`%T@@jRlC|w zmm+>Cv_A7{J6DLeR_z+QnMECC=Gi?gYOUHlyXFH~*6^9KtazN*jinw!_xf+OyQRc*Q!4B&<@QdF z8G@XGm@iZ@qh6((kLn*!R1NQNV^ohVR5Dui*dkX{k9necY_S`oddw5mW1grU^F;N} z5;q^!KTGUH(XOgMEm}%X^;X+KDWawHRByGNF2s8m)17uMi+c0YU3M{xdh^m!dm)Q@ z^HPo7z@px>RBN}gsCPQuZEs^yZ)aL&?-C;4H%Qk&mfM3qxf*-#ay#*3xxF4nE9OI1 z*g+vx0lMdMG2ZUJLbZJayFl-?n^+Kp*NKC2N^Z%0Hv9Wn1g9*5j# zr?7m<@_;>2mZj0NR1f1y*MoK*%P)x8fK(6J%|hz5VasB*O^`;rUx@eXe#9P>F@fQe zVzfsvk9x#T{)F09=f0)z5j&Md9lsv2(^w8d&NPayv2$3Cbft(T+m%X|Yh0;kS>j3y z%M-3_X4&pa56kpV<=TTa_7KY_|5K9CEnD%sn<|;*Z$9R(u`^f>NK>uIV>#265|&x6 zRI^mL(#W#fl{S_QuIymhF z%Ey)EEQj*UVU69)a+e#^&hn%y-7Foh46uCbO8jTC75lDG^)XmdT}fj(&y^gO>s={g zS?Nk8i(2)u#;#}CB(ofwsq)ESDRd=| zca7a9V!UI@8oSdcTSUw*DFOQa1szk? z+Wjmy1?7Bxtv$%1-etPh)^<`$s{-ebh}F7~&ssZ;{1qo<#D@(Wim^%-OsXt z}#9<=mXdw^vN%X9Xauc)jA+NUfV>|~aHmR38HW!OrY&+~Qx%fT!g z?Q$W#F=`9GU@sK1Eb#jIxE6)dU$7g6c-!;^yID%$pxyGy$qRN1OS&sK^yCHE+^IteSi5#!0DkbTa;3S_&I^HDLc+wCkWrqho7n#x+H zJ^Trt)kCVycB&As74O(-LU8Qnvfi;XSyVpn+BrgMwYk_cCm^5q?b2ScmEGA+mtF3Y z(-QD(yImv1%lRXFCyUCt+iv}a@~PEcM(HOY=bd)SE>EUHzO>VYRA@(Fd(B18J$AMb zuNA#^zE9}g`@MF9PtHR=-`Lv!M4bbtAfI`VZ|wlfnULFrjA2nL%D%M|rDzu*=1vil zqf+tu@IE__<-drbnP;C}D5N4V53&NOzPF2IjOa0n`Q9$~39TRd!Cvl@dy%T&?ibRb zsrkmw_7IDjrTk(yen;)<(9|sDce`0gm9`kA(=&#D*qd1FE9Fe)Puu7dy`ibK=zHvR z7PVgeZ#$1gz3EzutpA=;RcNb_^TVj&@Cg3JU&rXjA$0XA)|HNbh`M^|#ax3mOLXnR zlZt=HMgI`>W-~X{h>=(WLvvA2K0&GlkP)grBi@FH>zS^+hbu570apqkCqUv{8O|}I zT=|w|Usqn`RPnBS#bu3lWjACA>a(9KpK?B9TzL>e-xV6`${!F~%Xfe)Pjgubu53Wg zH19pom6?cn2&p_71EH8h-IySRu1I@wJjWd7#+(MBJ<}7qX0;JA&W%|Pp(hT4uFzFA z5_7?AG6^g|EAb*4EXcdm6v#6t$5h-I)M=LYZ%A$@|R%C!h9j)w0%8xQ$DYPF=l<(>4CB0VgH$#}2+Az1SlNgkk7 z71|Xjs}rT497z}AUA3MZStX<@@X}a0Z&c``C7<&A(a939=tOntt{$&xo1Y& zrHJiLZ_v$he<_u?y4#0*rn@o+IsXQk;mWlv=R|r$K2_QR2=(erH>L?P{7kG!j0}jF zI&BjqPDtusRA)SC0vQ82FOtPVsSbvmA1P&_oM|7+jWn>-V68R1x95V$m_0I|pAbXx zpGXl);ytli5cymbS;%rcBm%i4QuDX$v6+zLAo-DOZC}xc*FrKOvm*UMygN0sBN;Ii zQ>QiFj3+j5@8+^dvk-5un;WSfCSz_xK6F22Ze$zF4D>2J8B`eQVM&I()rW5fM}}DF z=#Ycbiy|4rWj-YNkm5+bkXr3Eq#`MabhB)QTmvbMWX8%=v;}X3%#Y;yq!My-q}(SR z;o;h?kv5j4s541k!o>dbDWH+ z!9CU{$eoeoQBr7+YJn_`C-+5C<0(eoPuY%`2O?QQYPI{2&we31hZrdkQm1{3(rH^f9BJcJXCQ`p^^wRR zr)q+H3VAe=KALi_)t-ffkk8skwU8?J$=~Kky%ceUlUDLHM_O6v3MYM$`H4u66nDP5 zE;7jZ+;@*0f7V5`{iv*pz6WV+h$4DQDS<^V}JbS0Y&la12si3~7%P9w>$O!|NcOk(5KFL{GqT3Xm<4bf4S@ z*&12SLVNgQkoO`DEVL)ILOzJ39VYWRi1YaC!?q13AIT1zh%xvD2u*b{!1h>UbbQhWISSijg+#`Xp;>2Ez&8ZPMh!%R>a_U zu{#nQq*Qg|cxxXT%979jPQa*o2+F44n@KhaQ zVxj?E=G=h#P|m}m)htgy(omn_(dLkh*@AY_C@~_cg{8c}srHE`uzbl9h(=geUm)*t z#zpg4;_BsCw{NuACtEQ3#Yf9oXw>=;vR|}`r3811zkrO14hgB%ZiZ0I*l5I{`qXNR zAiE$3L?^PW=9q+NmykM5-N!#DYM8PWtF!SvDcr|DBwEa(?(8Q;n|$&NV*VZ7$?`f< zy$%URGi{mAW|mMi$0zS1#)$5U$QpjYF?KXHD&skJQBtedfmQRqSk31W{cgQi(E|&AL9^jHchH1w}Cnn2$+8}p8j*n)ttbyDD znG|hgS;~?YO*vfVJR9;~#7vHM3aQm5orgO@ko0I5%RIysLr#h2A0f*+81*?8^*J@# z%3?z%Lo%W}gveD5mv`dsb~NcoS(aMoaC$V|C$!EXGg{!2DJbiVXtj`9cjZG?w25PW z?nTMid#6VODKcl08IbH~KFdhdnPPIH^**7P^P^oX2O{Pg)bKyi;88N41Mu5PLwzoa z<_f6_9E$y!=Bt-P^QDN9|03jbNwofGO6ASxFOBYEQM1$8(Trn6Ow3WpXAV-$jphoe z(rDzr5mFd!W}%UPA>{I?mMU{rbJ{DT1ybV9=K2&zOIQjZI@bFYM;EfFv+Uw%jgYE< zI&&$Gu97h^B}lajWfeyogj8rtAZsBd(LR<dD>W*_|v|ot4ez>9^EAyj?6R8#Q zOQzqWUAITGgvhqjOr|QD>l1p4?T%=Hlz>{VwJ2I71n+6TTCV$A6fNbLVfV>*qAre> zbIiUFnrkhNR&z`O$1I61=a}&vvn1LeMROnns9|-qndNxMpO8DFT|S9D3v1(}v6HA> z@(H8SkfqT=pBxIgJ6a=TnYQ^dJf#I$5luNkZqp3pd^BpfGCEO6MPMf61Kc%R8O`9B zIS|_JtD;#Pa|48WY*jRuV-|AE>S#X4tl*f{(ISp{h-2=FmIZAEWysMY@MGJ*^zm)r;Wm4Q<%6-vlDef%yzGxE*&2nj5+#hZ637us>5N-Df z&4e4GT`VtOCR_SobU=vr+j%I8ZpUB8h}Yl2Jx_d_`(anMLmq)NDjEGA+C?jDT^aEu zWFp$`%4pR;YoaM>vN!hIinURQSraYs$uvk)w8kgrKpu~_O{P?}+8}bi2(m7klrAN3 zf2?*HWPNnksZz#4u7^Au)uu?XA(fB~(PEa9A+?a_qm3-*bIitQY=%r#3R#7iw&-$} zyC4riUWzU}O~yP5c?z;AS~^wA(~wsnuST0#UV&`JZ1A<{dLiC+Z;!SLsngy;Oea#c zM|b(;J;>|P!0D88oknkL{S@*>G*d{G`z*to(QFp=EW?}8JeE(8GhHiqD_X#^3qt$G zThU^cUm@Qh=eMJ!EC)V-cg_f@WH}Zx1lb&|W|;yRIfG;s%M5JOv5+m%29~oCbC{53 zDcVI43-V61%_oOLwnpoxQA?||YY}rSjX7Byym7)_fla(2)DK8zOo2@%O~?8Uqx$tQVIDw+TfGB zAm2oLd~z@3+vtE#9)a{l*PkuR`Ww$qJ`MRXI^dIyke{Nd=Xf#gkYA#eEH|U)-+}xZ z-7KV5tAxA{`7K(0E~To~Y9XINevc;SNO=JA4P-DHm?`CP$WM?zq5~|gkUt=QMw8Ez zG3}7y*?6}`bQQ~1$Y{u(XjZO_`2un^AE&q6U>ki(qKEIp9#Amf}s zzD#A!!M1{ocgk6QLd@v1@wQB--X|u+bcR^|Ld=N}+c9Rzd`3Qq?*%{{CyV9gd_2XD zs|SZWIV}4jW;$YyaLQRiknjb#jErUcC{$I>jlwO!lGb)eNVaMUB{}ImL6lZAw?;Pjf1z1k}BN)0}D+^@Wbp zoK-Aw@5p|h>NK!C#r2u$G_y4G)6=Ir11xlmD@P4acZOK#7`IqRU@p~%XWfuYr(1}3 z+?nR|v8Yy@;WQNP-HJ1u7AfxDa)#5!qV|?EoK642;elF0JIcXDr;;RIR6|A1?C z*jr{e$t>?9=ckY=+eu~l4)TJKbe5QhWX#!4CQBlOV$ODQSdQeFbDTVuX&iHoQ^+!# zW6pJoS#IE%bDc64diIv;ljBsf&~s!|R*qA{vV`-Q>8xV8pYxgNGzyX1y#uMvbCzF8 zJ?3rq^PNT(wcT@_rfc@z?zv9lJd!%?DdfBb`Q$noEcDgO4zLUj5&wGA_cI7*{EcCo5#msW@S?GCBikamUvCwmx z)QU@;5|s)uG-_Syl(W!t^b|AOS;#`qgi_3GXE_T!6G|}!PCW}f6G|}!P7{lI-t#hN zJ&StY^D?K6MLice$7yF#&qdC0wy~&ZFy}g5Eb1A|xlRwu*WC6(r;ml6!KAhqI)g0q z8~h*Szm8TSw;=rne-RSTvK3o-59D$uf#oAe;2e@5%U6&CAXhjMAr*liAweOj9P=mS z2uP8W#xY|a##x(?OpbZ=UCh^Th2csko5e)TBX}n3N+*wnj;C}*=qjf`hMc)U11+6MMZBHS50CN%F~Sn1^5Iq?A!ig*FX2 zUxa*0ol2H`NCD(Vr=F!4axG-Ovx#LsWIp63C+lX>&!RqeK+2phpU~cNvoq!vimB7? zM5?s%kV$`|ttxl5}TwFi+i&3|rl zcCxfW=xwVDoPu&0^9E!EO0RU%D`b7TIo0h>jSx9*&=ZAKPLq_tPl%yk!9r&}3+-cc zw!YA56(UErM&!KES$G@e?2T-ToK-ApWLxZ{FQ6FjO2uL)Q;7FW&0?pFMLkoq*r{Yu zYmyf`)hbn^T%WnbX=EAiN*ha>D?3>7TomM*~EF&JlJ8+J`buFiiWh~@z^z)t0LY8q5 zn#JAa)Ua3(n#JAa)Jt*CSeH8MeL{QYQfHGCZDcpDZ6N0wXGln$b|mtlYfa0Xq}%1* z@;#n+pgn52(_BS@dt``t6{%J@o20li>N;n$5N|8jIXk7e*Q4s3ektO5)SJks&WXQ6 z>>CH3-@dqhl{5bw=_4NjqqakoW- zQ|gl-dbPo6_DSryxZmw`NeL`O&h#yO*g+HU*D>OG zNFwABC8OJqh|%`Pc7N0rb$s{aHKd|nw+b9-y*XoGcdg&Y2b`hviC? zPTRf3$zv&l&~LfLDHI|{<5?){S*KlyHyS_Z>|jx&@dl^iE~<}r4!gnW5rStqk#iyP z+2HiCoHaUDyGqD_6m2D9N`%BOrF`myR6trCgJlh3mO?feCyi_TD$0Ocu3=zv*PNs9(XG zPA-f3rM#(rDekZ7O($Q()M_uG&h$2bx1Dk!-X6Z$sqx7tsLy7n!6&_tt?EoOG7&Ayn1}P8Q3alVv_1Iyo$(@a#6_^P!WkVvy>mO~bSxIoFl-La=TS@*8^WV<&L8?4MEy{R+CBF+#kN zw%f^&G48Lj+bI&_jW*p*n=fXc9K4mn+2NBzAzwIsJ~;}q%Sl`&OIN?sADkcyy=jfU z!uf*}VW~k4=}m?|I4LaeMP!|Sa3)F-H9Q?T|KODRWG1BFX%*t#3H{mGB*goj{_Jd% z5~s$opPeo#F%2kvDc+Ltv$M-5bCL7U&Jas8Vu~TZIGM|-T^%tbHwmd1Qmdu5YT6>m zfRns}V(`9q#5@G~)yb|Cy&+oB0{P9!_elq2(5V;F8>5aFe>jaS>Ui;o(;_8K9WVZL z+Jsby(&>2dr<1;t%Bs*_Md_LNQr@3VrVwwN{^jHesnfP0rVFM2<&;SYd_{G}D6z+> zl&J#0LukF<9;cd99e+Tq_Bm4h?X(N=e#_c~9X_FvR-4c-C9rRk+@>)T2Bl~rNH6k< znGm~5^pBRxGHk*amRXNzV(%S3VMs`=_7wIXs^Rbn*{fwsGdbts6H0`5Ege3gT!^e8 z)o1vGYM;=Z+1LrId_plJCp7wmV)mJ^-X|0jH=)fZ6f852Z}VlqF%v zgbn3DtE!MWsXwzt0n-JpLO=x^y*LA(Gb3UKX_ITWX+)uCTI`8W`=W{;ibAFZh zlvvBP#vEi4r36SyASPszzmP=qb1Ed(UlAhbK@RfQhsd>%IDe}YwQY#Ed>`uX50N>@ z9OjQ(B9^W)|A8Ft4=9mW1I1raJi?zWMZMWf^mBwijWT+j#``lU)1HJoNLS%q+^TRR^LoRgX@96ni$R+-iXZDx%1R(8@EPs;}Z(U4xTb+SSFEZ2pEfJY( z+{{0b8Aj$Be_KQ*&)*@%`}LRS?^ELb`pfeVDUrYa_QidQdH(2UMTP3V9U(XRV?$&j zWQIR6L=J)6S3-LVuOn;k{ zT@%C^&fR#vdzQbKM88dRmVb~$zw>jJf0#s{_nYM(B@z3~e`BvT%Rf${_nEW&(e+~N zyC&$j!_D&hNW?kwvt_GT61^9l<&PuL=MQK3<4N>hbe2DXM873&BznI(%b!J}_p7t~IV5_&I?JCY#oJnD z`3t0YXM|??>q+z(p;`V$5`9K!mcN-K59?igpBDPNNXlFpAZc`EjAXMbvCoNhvDo*w zS9Cu~BtciwNX~a9n`Evlg(OQ|sUX?xNxDIj&GPC_nBr_oYhRpHDJ};Jz zzuFAB7Eil-^(`lm_RH9;Rs%=71w=wpd_{&EuixtQm#A<^GE^Zbn@`cp8^ z-%6s7CFc42N%W^+o`0A`9~I2=M>nWXoZiCc`Qu3RvBW%oB8fiUnCDL>(cAnye>#cY z=I8kfN%S^9&)-3!xA}SgQ6*9OSYn>vctO-tZG4Hlbn-EW^ZeN%ay#S>f1MOHtK!(W z*xw?h)6i#oiv6)KihjJze1AZSmznRch{!DPH$-F>_>Gss`?=d6FU9NUZhvt^ro>+# zkty+KHhTStU-b9-b3;V@qA&9ogoyY>f1kfxO1ZHDzhUQN>=ph#Dc+d32 z16d7u-rw`OTDoyEzQ6FUkC*(>Z>UyVklBRH%l?#RA>Pv8@MnaGSbDQRM@pxmj{%nX zdr0*0#tMJxGSN?`p^q-!@u$7%i8z*c-=8I=)c6TY7f-f!_zR?XOJCzJ4iT~RPJd;H zi1}ITU!ufkyr%XoUH%4=^Dk3xI_mN_ksN@Gc+*jrza^v}@m8fSf43Cxyw*qlgypJc zeO_ywKbu6q>1drlx2{{qOatUx$bf&4aD#$T`;gF2@);lH;*DjXjZS%(j7D!p>`vR@RNRJDY zlY9>mBRwuqMe>*E8P{$S19c?(y@Bl+*MJfO4N|a3 zK)1})8oPeS6KtsYkWy+Kjh_F9R%Zu>rFcE32YemjbC@2; zk)ksDUx~kW6R4t${yxnJjFaf^(`kYHHKHH&eR>F5Wd^2o3h|b8X&_&Ux4te7w1s4j zL947lKV|fH<>i5lwc-6t59CSl`k5YR4ata_uL=xMMt|#F9mwiZBh}w}*9W>t^tawk zfxw3Z z_cK3`B}FYu^s^w)LK*!l`<{T^En1ZtCu5x^VWjs3Dx@ql#JHwH9teyoaktfn1F`GF zm-TQUPl{UB|K%#&7E)5is=--t~0}Dv> z{WePj_KtCk5i26;7*_lfM;5b_bEIZ#CMWfY#2ge(t?kcgwx-H`tV@;+6q z#L=lZtM*=?M@p%2H~Km3Dm;;1RmB*ps%`8ZI&MP$6s z>BoUKDc)Y<<3Q{e;h9eZ0V!VQ(?Cf?W>a8EL}pW9BqVbwM)7$dwqNw@?Txntib(X{ z_{+e66jkB1Xtg6?Y*nrFUSe0ENJ^>k4#r-9%y)rSDXP_6$Z(*CTIqel4}tVAML*SY z4{#4Mqk)*Ogwz@zqMt_~zXVE1#J14{84qL+sLTK|t&l$h9a7Y?K7s6QPTnRm3w`1m zwAkkNF%w8e&}tBweas{&of96zU0!Q(m)Aa~P4diV_$D6}l1ifAhV(Zxog^L4L5ue+ z{msOJ@UL^91Df$X&ksF9wE%zYTuQ0&k!Xdb+h!HX=MeE5%{E6!CPd?HBxuFVyj`N7QsYNto`#%e z4wD>-%!`nzX7<-ABi`4v0&=F=OL7iLx|unoGFL%5k-5+uC)tgj#j(~u&D3v1rq(!M znYz|?iCHJ5)F?%(9<<6dN2FBCr_`6>9*;}S$=|A;k3}mnip$I)DGPn4Ld4!U%N!xm zf8Q$093#=&Se9vgC;D0FI}feI{A8Ivl6+TUNgi@#GD$V|tEyFk61n~Kq2?^JUrMcf zFV;@TRc7-bFS(LWveuOnk|9^>NZj+!W;2O<{@Lsz*?YMj z*8s_3u8ffcT#5ZZHHtG_Ng`P?SC1==aT%kkX4{p?BpAwR@U8y5+uNRoj zB)7YnE|Mx&21u5PgOXrIp0Jeqr{IxYsYtA(A||mGP^p`A%0ROQ|)Uh5U|pm=u~xBrif1uEjMDGbKb` zgUm70L*yRFTr-R04Yazf2Y>6(%p+-q>~}TpAvcRcG6P4v@gOovz0^rjh7=9yD`F^wJlZMG^fxVlIftJYrTUaVxAcYbc|8t}I&+v>>3Zr+<99hycUe!E(Mk-xtS8I`QmT#rL(k%k zNl%;Yl+jCn#_W>fE$cb6N40X#i#})O{Gn!5Fa0^QP>HXU*2Pk@h(xcQrDid;()BDg z9NKt?DP8?Bpn&VOy z`ff%);?AqJW^|NTR;jNXQh%X| zMj3r?&xhtT%IK@EADLN{5l>Euzoz$*nM)ac9d?~rM53?5t}_= z%__=>XS>AMyUit17W$sWNX4&!^=1QQUW16tdb64O(bsb~n5~r2f2VJQ*+Ch7{%51v zO_>jI)=1pHy3y>TjK1dEV-84J===CYoV!4##~h}NKL7KvIZFNL=f6HSjlIO$*)>6* zL;J)`kW%W?f2Z#gGe8-A7VA?pnKJq>kbY{WQAVGg>os#JqyJ`NuUQ~Pz0X0MS=wY4 zQAR(Dx5+G_%sZH|Kd~KtW>!$KTit4=lIU%9tC>!%^tQUy%%qIoR=+f}DWkX5 zFU>qD-nROcSwI=Rt$t+|Q$KoJ9WYBMqqo%ovyw7;Tis^XP)2X7+st~(=xueo*+?0^ zt!_74D5JO49cCM4^tQUg?4pd`RtL=?%IIx%&>W?V-d1;-Q2+Qk6Jr=TisSEHhs+!)-nROUStzC2_zByyIG^y1 zS*7}Mx885fCMn)|zi&l!m*QoH&BBPx4`yXV<_B{iA~Rx+M`T9K%zeX` z^|M(Z#aq_TW_v_t)a;MQjGDGDyq{mpX;Qp?elhDKGGk_2L}tv4oe8=v`nnYh)=5!4&&SeF4fd%_)K#db0+JHUI#9NX z5@+?Fg`64ek)m3?4M`8i9waggeQOU^&ncW2oGhg?Y6kl0K<2#Qf)H5;IX~DPBAXx= z1al8o%eoD%zJy#D>4%A))zYgW`N2Ucoj!dY@|NH*i9XkTOK?ny zq0e>S8qAt3=f}|Jx^D}%lIU~Yg~9m4MW)o~LxuHN)|_AtiMX00WNxsPWEh#1kUN5d ze^;&k_BO8gK;{SYk5F<(qNU8#l~4^ z^*^*K3l4|0ipkyESQyMdQugE1&!h2 z2GdCNY&;vBro^3%`d}l8o{go!nBzpx-fX-OER>>V<611eG1yNcW<$s;!IVTb_Sum2 zXYOq@1uIF!Y|KXHwcrqmn2j>X8^QGB!^gfXm@CB_`?6q*%D8XNSsrX7(QkcO9_%7{ z2tAA6UoF8Nl6uG-{I+Td_LD4{hx+re@YJ*)2qTcwm57wsQyyn%k&gCivESo(hR_4_@3XTeSRlolpEbepkc_x`yEd4Aa(IPZ!Fm#1;YYz?5?$f?;HY1;QWf@K={>wk24gGVWU55-g%t8Pv~~ z-~y8A)X$b+1&MxM?~7m+$$Nj|SOeGEz6dTM(eE(n4>pkKW6}O#Gs!LJSv+&JHP}jW z7exFX+#2j45%&!Ij8S|U?3PmM6VLUJOX*V?cNAX*hoyKU{VHf%YF70;e-%t2sk&AD z7XB)jPNJU)9SBY%(a(eq1hYwEEW8OEZ;aX&%#~8=t3u5ON-0nox1R065+%lY`0w%f z-}Ydg6tBV^!G0;~&E&@+vm=;ci<gLFXlw%Vjr8%IO7Lwr`kX(HoY?b_c; zR^r}4y1$jKMBYLABUBP|KJi>ycZO==o49CPc(vfjP`dQ{v+r)!j9RTNz4>lW@E`3FA84DkixL z%aVUz#_E+)YAk|?%n{b;)bMo?Z~0D_;;xH$YqAo#F8+>I@m4a4eBUYLNGmNwj)5Fy zWrau*TfrvY7Ei3vTO1>entxA&JkUI3ttOhA+Ygr26 zR)-Yzc7nehgu4x`UMb%8e2O)s#GS)atT82O4zcu8thjT;($!O1qMlQ&gb)$?)zd6H zM8rE|Q>=6;-W*P`N~A0_c239JGEw1FtMz=*bG5PmyLdtkl4=c;BtkxioM|;*ATr*! zRhrcrB0nILX4PFNGrqIY>VVO`jPtE}l1p4^B$)v@BpttQtY(rsAxGRGq?P0m$O%%~ zNtWM%d+?@;Oc%)u$SlCO`T16l68R~xWviNtL_KQe&xKrQb^KFEt;(op|t;7(?IU8?3vrRvt+vWH+S1Y9yHf**6dO9$4*CYK=DbS@Z90+-ucP<`jq+MY+{Tnd=~;o^q>)GLKN^K5LLN?^8ebS+RMl zo}Valzm=%OnDl|_`F<;fGL|dTD03l1)N{X8OqrV~^MF-JnfoDPTn|`nQmTzS+>7-) zT2)$!H;Scuzx5Vb)1-KN$VFDJ5_b=|$SPDK_mH=u=S5Z}iTIWg@`zOzBC{b?R#S-F z38}U^q|exHYe^YC=T3Q*Ncz5F#(4)qky)5P1{wjy3sqQI8te zYRG$5{A?kr=8qunTZK|;jiXO9j2{D^T4Ny#7?hm1O{I!Ju{&gOpe^-8OWyp+ojP$jY9U|hLAwyP0i0r^yTfeayLu4J6HEgwo$fwBs zX!V51C&>JtH5ejaK*p@`5Lt&-yRFz#QM0ON2$?85DMWsT>}#imh;b8sciUM~yxBO= zE>ao!E|grH?K#k1pfVGRY3&?nS5l@DBAzQb&|X6FgqvxVqSnPkEbBl!aIdJa))4FB z5XeDxMwyb`Byo0)lxpK8^m7z4huXe!k*PLTik|U#Kip1|qDJaR=I?fHh=^G|!Y&FC zF{?+}6(J&K^;mmJh=^G|(Qc8V-UlMqSHSKF5izTl-5(-iR!^}yqRXWEq{yCCA+#hG@ql+Fo1i`l>@67}NVS`wAu-UaoygU_@Blo7JBSM;1CrQA3eJ)ebfrP=k=N`EfS zv74z?Gv4@@iT5p^W4DLM1!$FScT+39A3N9Xr;LzHWX`jPLgWg_`Sw^yKi5GnuzmN- zt;LstQQQi-$c`h)BDvU3Ai1985<5ULljL7^DoH8HWp)Nh70Kmxwv=i^yvcAbmUV@l zuQGDqat~y>-Ap33=Y^0f?T!jj;bJ2JGj<%FugtMyA5bFxCg3B;Ty1BPoQjN)Ywg?+ zc?@!$Jx1~mWR^f~u^>=YP5~ob4!PMLqKsI}VhtA99hG9~>i2s)n3^^Q`yY0kB)zU?)1js#h$zmmMQKr;RsuAMN*uAzLB4QtY zubmnqN$97{&I=I^xzDZ-kyOb2cDoYaYAj29P8Zn&B%eSoMP`vbMA8otpYBEWh!k&c zyvQC?;(l@$*)flanmeO@bXz5m{OL-vlwDE!v%JX8lj41rtL#Q83ym`_R!d)Ow~>f- zk&Ox$+X=ODevE_G;K^}FjUD&6k|QAE8b_^NET!5ALS`XTYiHDnjN0=TLms!YLPVTx zuCr@M#AoLoWS+F^L!<(-#9s2G>L>Mnoc)G8YY&rr{{;R!fa*ac6E4DLuo&7VPDvfGrnTV|u3^^C}n2vT{vs*~?@y}~^8;QQ^@tWPC#6A9b&F&46A5rt` z_F#zo25Gjt>%}O%>A+C?PQm<`d-+je<~h|D{7>r%0-YU6oik|6Ke!&1CY<$Lych=~2zdv?t8a$U$H z>aQU0+W{%Hz6FotFQuTLb~~A*89ggWm7>NqRc5+L#MsjztL%&huV?w|#?F!A?SEF= zX)mbx(fglHyHHB0A@(*Gp`W#O;fo?uD)&g2K|Zu|UsAFf^$7XMPH0rJ5ppGDojpJz zj(>!7+s!YljQE_2R_pBruL@c0)6eg0u&b09gXl+`ecE6*P-g#5Ev=M^hlul08|(oo z-ua)6c1Dxv+55fov0W&|TNfYO#ZtjBzpW0m{x0CeRJyN`SHraiYxeu9pci>&GcHlKJiZbIllF#gXl6N7u zVdHbg5-F#5_^)ZcHj+B&$bCc$URur zRy$cq)Le*al}ec>MFz*uTkUkptbyDoTh)+cW8eHJ-v7MSULwUC*H*hhN|`aS3um#S z#j@;Xv2-u^u#=Uz74EQ8DWfagVW(5(e`xhAD%@c=k?0C{ z*ez1LdEQ~SNhvd&5AmcVW@Cq4`CqYgFEeP@NGUVULuMm>O$^!{QoK+1PP-?f)lR#Q zT3t!4cG?3GnO*h}W&VSVI0LiGHr^IX_j>-?j*;Tk^R*o(rOc>CtCuj+ukAoYX2?#a zOan5nBQs>DOYwUC#?Fjr^^KiPt=g&PZ|qzt+oHt!65G$Wc7K~(J5gUD^A>vk)*dF& zneXiO_ro*a**#Lcr4QTvQoL~u+k;Zd1Eg|uB;~fH!eOUv^QIPLf?q&E`6Uo^m6Ict$O^{R3 zYCqOSat~xG_N)7|9+JmMV%VURg+?C!p350%bpY$=7UQZmUPUGyGLhx37vha#63Y*f zOk^gpN+}(_wEfgKV_KDS#{ESRClpABE|a)zlX9$%6#{&${fa;l|=1^i1#cV#yX@_8@*Uo0eU`+ z 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

    nJI_&)Ql_DMeLu~Ydm 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

    no1b8p0d5TzFnHMoL^Dq$Q_;rxC0kEVN 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 z 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 =Y%no;iUb_iNIkkU5P{g7jqFk_ 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 z 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%0DGUA^~Q9 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 z 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

    Vc9xbzBwVkH|32cD0IN&d8uE?LkzV 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%0DnPk^EX@uYqIL5l6Kwr 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

    Z3a5WWD`@Ptw3Wz7<{moIRzviT6p^+r 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%0AqJ;agJ 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 Properties RefactoringEssentials.DocGenerator - v4.5.2 + v4.6.1 512 ..\ true @@ -50,30 +50,103 @@ 4 DocGenerator + + + - - ..\packages\Microsoft.CodeAnalysis.Common.1.2.1\lib\net45\Microsoft.CodeAnalysis.dll + + ..\packages\Microsoft.CodeAnalysis.Common.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.dll + True + + + ..\packages\Microsoft.CodeAnalysis.CSharp.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.dll + True + + + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.VisualBasic.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + True + + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.2.0.0-rc\lib\net46\Microsoft.CodeAnalysis.Workspaces.dll + True + + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.2.0.0-rc\lib\net46\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True - - ..\packages\System.Collections.Immutable.1.1.37\lib\dotnet\System.Collections.Immutable.dll + + ..\packages\System.AppContext.4.1.0\lib\net46\System.AppContext.dll True + + ..\packages\System.Collections.Immutable.1.2.0\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + True + + ..\Packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.AttributedModel.dll + + ..\packages\System.Console.4.0.0\lib\net46\System.Console.dll + True + - - ..\packages\System.Reflection.Metadata.1.2.0\lib\portable-net45+win8\System.Reflection.Metadata.dll + + ..\packages\System.Diagnostics.FileVersionInfo.4.0.0\lib\net46\System.Diagnostics.FileVersionInfo.dll + True + + + ..\packages\System.Diagnostics.StackTrace.4.0.1\lib\net46\System.Diagnostics.StackTrace.dll + True + + + ..\packages\System.IO.Compression.4.1.0\lib\net46\System.IO.Compression.dll + True + + + ..\packages\System.IO.FileSystem.4.0.1\lib\net46\System.IO.FileSystem.dll + True + + + ..\packages\System.IO.FileSystem.Primitives.4.0.1\lib\net46\System.IO.FileSystem.Primitives.dll + True + + + + ..\packages\System.Reflection.Metadata.1.4.1-beta-24430-01\lib\portable-net45+win8\System.Reflection.Metadata.dll + True + + + ..\packages\System.Security.Cryptography.Algorithms.4.2.0\lib\net461\System.Security.Cryptography.Algorithms.dll + True + + + ..\packages\System.Security.Cryptography.Encoding.4.0.0\lib\net46\System.Security.Cryptography.Encoding.dll + True + + + ..\packages\System.Security.Cryptography.Primitives.4.0.0\lib\net46\System.Security.Cryptography.Primitives.dll + True + + + ..\packages\System.Security.Cryptography.X509Certificates.4.1.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + True + + + ..\packages\System.Text.Encoding.CodePages.4.0.1\lib\net46\System.Text.Encoding.CodePages.dll + True + + + ..\packages\System.Threading.Thread.4.0.0\lib\net46\System.Threading.Thread.dll True @@ -82,6 +155,18 @@ + + ..\packages\System.Xml.XmlDocument.4.0.1\lib\net46\System.Xml.XmlDocument.dll + True + + + ..\packages\System.Xml.XPath.4.0.1\lib\net46\System.Xml.XPath.dll + True + + + ..\packages\System.Xml.XPath.XDocument.4.0.1\lib\net46\System.Xml.XPath.XDocument.dll + True + @@ -96,6 +181,7 @@ + @@ -114,7 +200,7 @@ - {c465a5dc-ad28-49a2-89c0-f81838814a7e} + {18236d33-b3e1-45dc-99e7-230633a228b6} RefactoringEssentials diff --git a/DocGenerator.2017/app.config b/DocGenerator.2017/app.config new file mode 100644 index 00000000..760f1b28 --- /dev/null +++ b/DocGenerator.2017/app.config @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/DocGenerator.2017/packages.config b/DocGenerator.2017/packages.config index af56ed4c..cc922ddb 100644 --- a/DocGenerator.2017/packages.config +++ b/DocGenerator.2017/packages.config @@ -1,25 +1,59 @@  - - - + + + + + + + - - - - + + + + + + + + + + + + - - + + + + + + + + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RefactoringEssentials.2017.sln b/RefactoringEssentials.2017.sln index d22a5a65..42ef3c04 100644 --- a/RefactoringEssentials.2017.sln +++ b/RefactoringEssentials.2017.sln @@ -14,11 +14,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Vsix", "Vsix.2017\Vsix.cspr {31E950AF-20E9-43AB-8CB7-134598FB8A6D} = {31E950AF-20E9-43AB-8CB7-134598FB8A6D} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RefactoringEssentials", "RefactoringEssentials.2017\RefactoringEssentials.csproj", "{C465A5DC-AD28-49A2-89C0-F81838814A7E}" - ProjectSection(ProjectDependencies) = postProject - {31E950AF-20E9-43AB-8CB7-134598FB8A6D} = {31E950AF-20E9-43AB-8CB7-134598FB8A6D} - EndProjectSection -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Demonstration", "Demonstration\Demonstration.csproj", "{203FF5F7-8F0A-43C5-8BB5-723C492A42DA}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BuildTools", "BuildTools\BuildTools.csproj", "{31E950AF-20E9-43AB-8CB7-134598FB8A6D}" @@ -29,6 +24,8 @@ Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Demonstration.VB", "Demonst EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocGenerator", "DocGenerator.2017\DocGenerator.csproj", "{7FB64621-DF93-48DE-995D-8CB0804F6003}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RefactoringEssentials", "RefactoringEssentials.2017\RefactoringEssentials.csproj", "{18236D33-B3E1-45DC-99E7-230633A228B6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -67,28 +64,6 @@ Global {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Release|Any CPU.Build.0 = Release|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Release|x86.ActiveCfg = Release|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Release|x86.Build.0 = Release|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Debug|x86.ActiveCfg = Debug|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Debug|x86.Build.0 = Debug|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Mono_Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Mono_Debug|Any CPU.Build.0 = Debug|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Mono_Debug|x86.ActiveCfg = Debug|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Mono_Release|Any CPU.ActiveCfg = Release|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Mono_Release|Any CPU.Build.0 = Release|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Mono_Release|x86.ActiveCfg = Release|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.net_4_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.net_4_5_Debug|Any CPU.Build.0 = Debug|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.net_4_5_Debug|x86.ActiveCfg = Debug|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.net_4_5_Debug|x86.Build.0 = Debug|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.net_4_5_Release|Any CPU.ActiveCfg = Release|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.net_4_5_Release|Any CPU.Build.0 = Release|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.net_4_5_Release|x86.ActiveCfg = Release|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.net_4_5_Release|x86.Build.0 = Release|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Release|Any CPU.Build.0 = Release|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Release|x86.ActiveCfg = Release|Any CPU - {C465A5DC-AD28-49A2-89C0-F81838814A7E}.Release|x86.Build.0 = Release|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Debug|Any CPU.Build.0 = Debug|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -199,6 +174,30 @@ Global {7FB64621-DF93-48DE-995D-8CB0804F6003}.Release|Any CPU.Build.0 = Release|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Release|x86.ActiveCfg = Release|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Release|x86.Build.0 = Release|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Debug|x86.ActiveCfg = Debug|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Debug|x86.Build.0 = Debug|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Debug|Any CPU.Build.0 = Debug|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Debug|x86.ActiveCfg = Debug|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Debug|x86.Build.0 = Debug|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Release|Any CPU.ActiveCfg = Release|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Release|Any CPU.Build.0 = Release|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Release|x86.ActiveCfg = Release|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Release|x86.Build.0 = Release|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Debug|Any CPU.Build.0 = Debug|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Debug|x86.ActiveCfg = Debug|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Debug|x86.Build.0 = Debug|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Release|Any CPU.ActiveCfg = Release|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Release|Any CPU.Build.0 = Release|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Release|x86.ActiveCfg = Release|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Release|x86.Build.0 = Release|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Release|Any CPU.Build.0 = Release|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Release|x86.ActiveCfg = Release|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/RefactoringEssentials.2017/Properties/AssemblyInfoBase.tt b/RefactoringEssentials.2017/Properties/AssemblyInfoBase.tt index 1e3a2e7f..1cb2c958 100644 --- a/RefactoringEssentials.2017/Properties/AssemblyInfoBase.tt +++ b/RefactoringEssentials.2017/Properties/AssemblyInfoBase.tt @@ -1,6 +1,6 @@ <#@ template debug="false" hostspecific="true" language="C#" #> <#@ output extension=".cs" #> -<#@ include file="../../RefactoringEssentials/Versioning.t4.template" #> +<#@ include file="../Versioning.t4.template" #> <# ReadVersions(Path.Combine(Path.GetDirectoryName(Host.TemplateFile), "../RefactoringEssentials.version")); #> using System.Reflection; using System.Runtime.CompilerServices; diff --git a/RefactoringEssentials.2017/RefactoringEssentials.csproj b/RefactoringEssentials.2017/RefactoringEssentials.csproj index 2e85264e..26e98eb5 100644 --- a/RefactoringEssentials.2017/RefactoringEssentials.csproj +++ b/RefactoringEssentials.2017/RefactoringEssentials.csproj @@ -1,54 +1,14 @@ - - - - - - 11.0 - Debug - AnyCPU - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - {C465A5DC-AD28-49A2-89C0-F81838814A7E} - Library - Properties - RefactoringEssentials - RefactoringEssentials - Profile7 - v4.5 - ..\ - true - - - + + - true - full - false - ..\bin\Debug\ - TRACE;DEBUG - prompt - 4 - false - true + ..\bin\Debug - pdbonly - true - ..\bin\Release\ - TRACE - prompt - 4 - true - true + ..\bin\Release - false - - - false - - - - + netstandard1.3 + $(PackageTargetFallback);portable-net45+win8+wp8+wpa81 @@ -1576,7 +1536,7 @@ Util\WordParser.cs - VB\CodeRefactorings\AddAnotherAccessorCodeRefactoringProvider.cs + Converter\AddAnotherAccessorCodeRefactoringProvider.cs VB\CodeRefactorings\AddCheckForNothingCodeRefactoringProvider.cs @@ -1727,190 +1687,92 @@ - True - True AssemblyInfoBase.tt + True + True - - ..\packages\Microsoft.CodeAnalysis.Common.1.2.1\lib\portable-net45+win8\Microsoft.CodeAnalysis.dll - True - - - ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.1\lib\portable-net45+win8\Microsoft.CodeAnalysis.CSharp.dll - True - - - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.1\lib\portable-net45+win8\Microsoft.CodeAnalysis.CSharp.Workspaces.dll - True - - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.1\lib\portable-net45+win8\Microsoft.CodeAnalysis.VisualBasic.dll - True - - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.1\lib\portable-net45+win8\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll - True - - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.1\lib\portable-net45+win8\Microsoft.CodeAnalysis.Workspaces.dll - True - - - ..\packages\System.Collections.Immutable.1.1.37\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll - True - - - ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.AttributedModel.dll - False - - - ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Convention.dll - False - - - ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Hosting.dll - False - - - ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Runtime.dll - False - - - ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.TypedParts.dll - False - - - ..\packages\System.Reflection.Metadata.1.2.0\lib\portable-net45+win8\System.Reflection.Metadata.dll - True - + + TextTemplatingFileGenerator + AssemblyInfoBase.cs + + + + + 2.0.0-rc + + + 2.0.0-rc + + + 1.6 + + + 1.0.0-alpha-20161104-2 + All + + + 4.1.1 + + + + - - TextTemplatingFileGenerator - RefactoringEssentials.Library.nuspec - Designer - - - TextTemplatingFileGenerator - RefactoringEssentials.nuspec - Designer - - buildlibrarypackage.cmd PreserveNewest + buildlibrarypackage.cmd - buildpackage.cmd PreserveNewest + buildpackage.cmd - buildpackages_appveyor.cmd PreserveNewest + buildpackages_appveyor.cmd - - Xml\ICSharpCode.NRefactory.Xml.csproj - - - TextTemplatingFileGenerator - AssemblyInfoBase.cs - - - tools\install.ps1 PreserveNewest + tools\install.ps1 - tools\uninstall.ps1 PreserveNewest + tools\uninstall.ps1 Util\Reflection.md - + + Xml\ICSharpCode.NRefactory.Xml.csproj + + + + + - True True + True RefactoringEssentials.Library.tt - + + TextTemplatingFileGenerator + RefactoringEssentials.Library.nuspec + - True True + True RefactoringEssentials.tt + + TextTemplatingFileGenerator + RefactoringEssentials.nuspec + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - $(SolutionDir)\.nuget\NuGet.exe - mono $(NuGet) - - - - - - - - false - ..\..\..\build\bin - 4 - true - - - false - ..\..\..\build\bin - 4 - true + false \ No newline at end of file diff --git a/RefactoringEssentials.2017/packages.config b/RefactoringEssentials.2017/packages.config deleted file mode 100644 index 884cb6ff..00000000 --- a/RefactoringEssentials.2017/packages.config +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs index b9a7cd89..d4f56165 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs @@ -315,7 +315,7 @@ static SyntaxNode MakeAbstractDeclaration(MemberDeclarationSyntax abstractDeclar var accessors = new List(); foreach (var accessor in property.AccessorList.Accessors) { - accessors.Add(SyntaxFactory.AccessorDeclaration(accessor.Kind(), accessor.AttributeLists, accessor.Modifiers, accessor.Keyword, null, SyntaxFactory.Token(SyntaxKind.SemicolonToken))); + accessors.Add(SyntaxFactory.AccessorDeclaration(accessor.Kind(), accessor.AttributeLists, accessor.Modifiers, accessor.Keyword, (BlockSyntax) null, SyntaxFactory.Token(SyntaxKind.SemicolonToken))); } return SyntaxFactory.PropertyDeclaration( property.AttributeLists, @@ -334,7 +334,7 @@ static SyntaxNode MakeAbstractDeclaration(MemberDeclarationSyntax abstractDeclar var accessors = new List(); foreach (var accessor in indexer.AccessorList.Accessors) { - accessors.Add(SyntaxFactory.AccessorDeclaration(accessor.Kind(), accessor.AttributeLists, accessor.Modifiers, accessor.Keyword, null, SyntaxFactory.Token(SyntaxKind.SemicolonToken))); + accessors.Add(SyntaxFactory.AccessorDeclaration(accessor.Kind(), accessor.AttributeLists, accessor.Modifiers, accessor.Keyword, (BlockSyntax) null, SyntaxFactory.Token(SyntaxKind.SemicolonToken))); } return SyntaxFactory.IndexerDeclaration( indexer.AttributeLists, diff --git a/RefactoringEssentials/Xml/AXmlAttribute.cs b/RefactoringEssentials/Xml/AXmlAttribute.cs index 7c9a91a0..28677ce1 100644 --- a/RefactoringEssentials/Xml/AXmlAttribute.cs +++ b/RefactoringEssentials/Xml/AXmlAttribute.cs @@ -25,7 +25,7 @@ namespace RefactoringEssentials.Xml ///

    /// Name-value pair in a tag /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1711:IdentifiersShouldNotHaveIncorrectSuffix")] + //[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1711:IdentifiersShouldNotHaveIncorrectSuffix")] public class AXmlAttribute : AXmlObject { internal AXmlAttribute(AXmlObject parent, int startOffset, InternalAttribute internalObject) diff --git a/RefactoringEssentials/Xml/AXmlTag.cs b/RefactoringEssentials/Xml/AXmlTag.cs index 27312368..770a8800 100644 --- a/RefactoringEssentials/Xml/AXmlTag.cs +++ b/RefactoringEssentials/Xml/AXmlTag.cs @@ -29,7 +29,7 @@ namespace RefactoringEssentials.Xml public class AXmlTag : AXmlObject { /// These identify the start of DTD elements - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes", Justification="ReadOnlyCollection is immutable")] + //[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes", Justification="ReadOnlyCollection is immutable")] public static readonly ReadOnlyCollection DtdNames = new ReadOnlyCollection( new string[] {" True if the text contains only whitespace characters

    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�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 %r=}=8(cL&=Joz&@ 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�>gt=z>67(#^H| zu(*uSmULB)5?6c2EJf88Om^wFqo|s^2OddBOy0U-N?e_53IR$DlI*|?&h6>5xp|FS zr(CWEx5nhMYkd7Q*LBQu)00Tm*Ceb1rFnQwaA0nL5}$01z{uqdN@`$TVL!Ej zb*sMl;|i_Lx31;2w!rlV3%u4A>b-@98U6*6^al&PxC^r4_SoF1Lg=z7J8wW@FLnI} zUZJR^^=}1Fab|1K(FLsoU{jW%*)TiS%Ap0$lBR1MMpY2!P71VP=DlWPJ6y`qIqNl> zs1Tc2?He5f{=!yPs*Sx=U-3rV*h{r>TB?pw%X-)rD;+(bslF2=`P7~{TavPdt<$;Nn_y++otVHU2=SxXIuH z)kWa}K;}z+h0D-cH@(eEIOHW9YL)PQ#TwrIeDOf;Z)LnCd^f>kA_8u~v3H9kTJ+>5 z!yCl^1OF(gCdI!Uzw8-*GzESFyz~U%pXQt4*V{TvfNifiDIPnDqOpEJh*8s$CQ7rw<||4B;5{{F1d_?j1n3(x$z`FA`M9MwYa$E--47~Y)|Wjy%}30)J^K| zE)=a2Thep3?kSsn)Q&b+&a9d4=nk$3wmz2p+$xm}GCH+p-06S8Q?obiy8TtgHersh zXmz`@l{*+Go}i$q^5Ii(Xf2~!PfZ}(OLJbZm2(?aDu>UBb|cXL($WZ-_v8+M7tht& zUcSi>GiB@cS<#L=MHqr>-JXlY%|@WpTd|_0dUzX+c=p{y=!wr)W0#8I(?)Y~`=@L^ zrf+0vIr20q?K_@D+A~rP@m!6zcaorS6+aVFrVfuXsI14EO32^#kq|Pfx~!kYvL&?} z{}L_O(vD~C=r%7LJbBh}IhjJ-`=1qFj;=iGxEyXF?hl^{`6M zt1YkG%^R*8&ujN~UQ-f0yS(V{JvYV&86*S_t%rX+Z#yxf*)Kc#OT&5-&3Y0I?q7HpYVp3H2^Bg;&e&WpFX2#e8nc5SyAuosQeH^dh={knwXcyjjLf2fuUzHDLo!j z4m^%a!g+CW4WDcwU1ImnDA)WQgRlb1RBNY_nJ$Zss=U2;n_Nd0(!3N#9wtRR zrn)z(lCM~0IySB33Ip?s0b!z&BGcl195@9Z+BG#w5W%e0i^=skvdr!BqWwIk1!Rwd z4vqTDpt{cXiqi&IUU5B$UoL{A-R-Z0a*Gk0hrHYUR_O(z`E_Z~$rQ}ASX1O8tp7~YIeRw+25)V4X0tv`?1M_ z2df-ITeRPcP7gFU$B5ThOHXJOKb2$hyviL#hmbA~eUJ{!{!R?9(%(0H#fVhjTTERIkreyny#V-U z%qya&z29{s+6#Fx)E(yKJsILhH7?_^6IG6EkW<}AgMbId1;>!l%K94I%~vU+NxI`o zPEvi^O`G=ZE?%&YqQgBOOZ{r4KChL!)esst%fpkj|AZO{8zYxNk05P4b}FFhGN_;% zl0h+ynv}Lv23>zz?<+@%=H@BNH=8EXGI{vX7QQzr z=UK-4!}NHM#Ld$fF4=u?FEdtju!f0@I2KPRa9oYrAsZ}j{73ysji@uo*kik0iaDqo zU@y;L=5W~Q8O$8O_K0)!-dmBPLy-aMJVv%soqpLIeV4c|q0QpvD?3Pig^_xAn^Xmk zpFt)msf|Mj)AcK-6M%@InUMlteCd?5onv!-X=$${Ya4SwgXU@Rm=iQs;!uIiIPm6i!KV$(|E7+u zyuG_iuOYtd-DVTHHT=@@4Mft9pc|<+j!7G*uEvQP@1qrXv|K*sN*ZE+GLNvk6eMg7 zF6#1F)#Y8pl#TJy<{1QK9oKuq5sGlPbzB98&k`-U2R|3PWNnw?WCEN6RyKh(H)~TI ztq?iplc#ChW-<-;k-~ki;Z|UHw2iyyucL?00m|6CKOSj2zBc_b{l8lHYsr1!C?@ac zcbpxe`~bI%?rvElm01{DY)6`F{1t>FT1)|tS+XN7HL~5n5fVKlf;d(-e%NkZc26;U z9(vkhhqZz3v$=&fz|;o$%co-#TI_ZGTRhLR;rV6~&Re}CwGQiU% zBRyF(frQ$xSwAtIQAZgdV&wV!NR)a3F;qFadQXy4I*ELe!ex_4DscHUqNg8xDiOD{ zDzUdy?9C85E5boB`2h9cx;@*E`Czp2_nD2(mC?i;x6zS(+&_tbijPzAxXd=rcwFOy zU^&l+SA86g){_el0qV84i?Q^u@ys4bT+P?7BD@y%r!fAeL)XZ*pk`}vXVCV+ud0Os zqgI_w!$vENZjq}_>hvnQRqE%wQm0(xS5EE&m+Gp0N8dz$-M)%v;de(I%zyWify z-8*Ln=lu`2Li>CAdt=s(RDmS=9M=_ZOa=9Im8xC7NumC2@^iJTr??>Kqi&XEmm_#720w%lB&D_w3B zKF(P4A?0D%whjNRqm_^`s^TG6bTKidt${8!vte5t&oXWl&MD4PhiDf!d(N$A^_^0TweY1ID zexwT|VAA$OAc7Hy~H~APp+|f-SFZh(XuuwmXl8c z_7PS-`yz6ch9r3eVDc$`>c63S+~nVEQ9M=hX(ftA(ut$Xktj2pH!hpu&Z%PatZA&| zXt9#dfNJrC0>hVRRBO)FqKzH%&k{z9X~j3M6dsjNQbqDP%O23@aV-0>n=RWiU1}fbsTIkx z|EhQ4DfaWmFRcz|M`M>{b@)UyQp);cfAn**N+$7<|ADtJ&^R)~{|)nYJ%ah{7-==1 zH|CEWd|DfYku6jk+ybrID8f>^(6FjL_#DC~ogx&)>f-BO7gLPeGiK_%^xe@;Ph>Jm zIr=^soH?luo;@#JNEP&qTn`4Xf^3E3Q+9iL^9kJ~_YMK5E#gdKea0&p#Z;S(*%Ih= zL|gJtwTt`LhRD_BzgZ^#Wf5wMPz*0oyQC!^Xm76id|r;OCDvJ!$}17`+032EpcPj} zjvFrS^x`0ns5nxtPog$IGqp}@A)-mS=ECN=DU->h?c}bW5!1fsyR2@emN^$~0v=5D zS#O1}Fcjy`LS3+s9+eF8(_SK{Yvg>in)sMXt|xxFldb9oq43z;Q^CmF=N9^e!b+*# z;k@W(d?-C(lCXi~tB{apd;O$tYW^>ov==?Wjdew4t3P{eiI`O&7 z+OfZT?{LIYHr43|iv3N)juG~N} zNJ7iFb*@cRbhe-F)muuESBr*eJv-YvF)=YN&;z%mC|Wc+{Y5+P`kM8o)lQa60b+E8 ze9-9ETcKi^9-xUPF0pVo%&k6kCE)X{UaUi5TAKE$;|Q3!Pf1ovg#q;`>%e(Xhs9)? ze2W@EDA<(ble(VDSzBpu86^EOZGt0!5B`msiY5= zblO6Ow`dLj!^i}KUHrjnTr29ZMA7#(m+UP3T z$wrg7(|IT|sb;FQ&cP8KfwYLZQp!9vqBV8~8F$*?8y9V|9}i^1gL~hjpiwtW^4PoB#vf9OSX#2XGt(--{l-2P2uZjnYkT|n-ZmLTzqIQ?EEu) zVY91H`b~jw6y?Uu2nQpv`~IA5=TlPD+bI;-P7%ILvL3s`0ohZzrsrgIAHO*81>O(6xL!IHBRoMm zJJ3E&u9_7+C_Mbt%eQd@f_9thJIkeA=6Y!bbB4BG>n|4U)pE%IWJ3G0^@d>DUaem! zmp0w&cgZDN)cR9$$pW?h2f1W!Sj`3;^qapE|BYFxnwI+KVt#;VuQe$ zMh4S_7y72OP4molg;8 zZ#Z&ccM*c{^A-9|CIPzqREmxw-Wx35n2Op_W7P2?0;8}S$<5BT@e_zJB~;_5B4yyPGak*zm!k>=&g4WD0Vu&kDzU?f z+)}YNf3wP%i*4Ow%a+VU%+@{ECHGS4S?ze6$B}rymOik(9CPqik?Wnw$S$CiL>o=8OGj<0n!)Q_|5 zi8B*jvYzI77R(0x?Utv_0`*OoMQ09}Va_BoK&|(f3$@hq4XmB1dYD> z9m3aQ&?1YHQLnp2`o8VqFEo25#-k3@-?rmxoz9oc@iVt=R*=$F zh~7ltJO5wll60PROPjpBUAk-qm2oGG0*s>6R^BY+qAojnz?;iCmV{}DtueLkm5g$g zXv>ez!x>vk&c|bf^)9m%aQ47bARGP3qK!J`{{E_dJ zu~@YE?>&m&_>%}N^e2DjD@D#<>>DS4wQqN^l{9VZQnWvLy;o^l>s4Qpq#8X_B4quF zE&soP$W#q%2c$1Z((h1VXa${N&v?$EgxuhDalDly`8%=Bd5r4rE}Dd)2MH>6P^Xyu zLl`(@Z0w82NJtUIcuzD(F8L?n0K!S~r(C=SZICrMM ze?&R0fAa`yV|Nm^MWmG8oXvYT zIlXG6KshGOjf2>Ld6;Cm9aXy+GZvQM|&L3fMO|54HZ4etb0c^(qHKNif&XOd#f z*cFW2RRKn_=QE=1+NjuDE?c{MgjOp%zg{(&HtbZpu&j-uTcM-Tr3yr5D)8mFaZ#WA zcuAj7=6Adz=SJh*`i#lr_pyEx!VBliAA0#|%VQP0Zw)gErrBC-Y74Y32aC+8un6fq zN^YTTnTIupz$uek@h*u>oYK7^x8X&a;-3VG>o1;+o?L5;b&}z9G$$W!C$>p$%icSa z2%6&QN;A>Z_0g==v{uApQ+p^Qxfe&Xw>R^5eAVdrM@A*a#VpbBigUf~Vnnw~F7^0Y z<4A_R-P+M)lV^7y>swr=mcB}y?G8(SzM$*9kM&NA6OSp9?qk*0?qii>J@>J`&(h?= z%jw1IyN~rQi<8~QIyt8E2EUK>ZpFivO-CftZf+_7M?Uj?toJBQ<7MOylhj2Uk}!&; zccX5_rd&i#x{viVARRNS_gUTRE7|m3;bLdyE*c}bo1cn36WqRQ^j=`$GDdlQ=c}2h zhw#FeOd>7zt~FIzx`FuE3@en@BV;~SXGgoGWA!M;Oh0NDX!HA6>$n)zniF3GUH4i2 zxn?juW8n*v`tzoeQR^MiXe-nY$wG{=8;OK1BMiNdieU1_SSyx{pR!ounFCY!q3&0} zSTuV7^g5akxLrs0S*6r3XFGIZf{?CNt@V7aKhQP_J5)p4wq@+_e#J*^E2&4cvhk!; z3^S8}HOoe3T3Y95{bsqw3`529yEi8Doq||0-wgxlf zHKPug$1Nrgl8fvV^YiD|8Xu6STSu+ClPw?-W+7n{lQz{Bz|%n~ji*8X|K7)nPV%jc zRMS(M0}6q?ErXc@n0SIJ=zi~44SHKk8rFF1JU=GA@;GZz^vpLPEWytU(O#r|z|vYf zvegl0!LP5gETQVv`&M@w`Vk(gM`4|Ay`K1gHG$%R9d- z&PY>?_5p|e#kuA!5T0o`Z^pf@aG6%ubD(+ggaX62m|#$szfL1?uBMr90|?*YXZ)R_ z!uiBoB~HJFI2(={9YvkJ+3So;Y4VG6rlJVEgCs*dR#6DTu5vU z@43~v?F3Smmy%oCNat0P!8D?-yJ%sS)~#AiiQ+DeH6#%>U1ZUUWV%+BL9*EB3cWNs z(_pW1bzilACHh!!Y8&6~w?Ge}5@K#P@)tR4eYMFoG%)fe#Tf7!njg)Z->M-VXHFT~ zX-bM2iq+G6uP5Gvsq`((Dz6hbn3g?-ZLA92xVmwQnKzgRlN%{0FHhHMm~-kmW#^k| zNe8^7FKd-_z}ebB%GQ)D=F#O%T@9_$sZW?KmcnN7r1Fp(_hSAo(&-_aK*i`+^^&oe z%secze$uwcQhnv@>17ip*;d@Fx*69(=#S%^o3FLLoZ2Lfp3!;_d8%0w*7B$suQ+YD z&56?AejR!Dlj!E)I)i`uc*H%(Zlr@-@HgXM!v~yrPqTHZz5O%BQXppK5GM6^&ml&H|qkNMG~oZdcQ0 zD1WYn<*ydrMH{k^a#^V}oNHn?7~Zc48%W=;2pb5;cy`0#{Y2P6`hFpp77k;wKh_v* z+;&6&nw3#voc=t{?5;MJcAUxegwA`t^`v5A`mp|Riiz%ZN_d-2OV2K08UebT&O&r4 z?uX&Et!B=RV^*7&of1;44Ktgd=El(o!UHV1F+}6zjq{B~>IUytkLVh|PM_J#Q&QV3 zK^*)DqrUMW&286PP}lf->|4n0SK3^26m#*?@oOxgIDRePbgrU5i4OHEWuUKO>1(n0 zD#zi$6@$?zW8y=aFVb@)#>w*i2QhbSMo=8Cq5rK^i@1|Vkj0E$agYhX1KlHkwiwqc zvYI9iat5?gsgW*{;FZ7$xQ>8PDZg^_FDJKIi)%yMUblE)=$Px0&A`k>VupOcgx8~# zCdHO)PB7->0SIP{Tgb;75;0-Oux> z8f-oR`S3j&dGV-bfF=F5a~6V%*6OQIs++!-iio>9(sez%bT=qnF5Cv?uItE~d?<9P zUj^&CMqlmGn*&mS-I#{mr0*(_tc8&9K4H>(pOw}<{T<_1Y2tkI>*DF7nx&RBzlM8V z;VwyyTT`yZ6AEm8V_J;66=T?9C@_4V+%$ygAGZp2M%=iYXydo3paCTbjEQQqF!B(X zx+&Ry(Z@w&<35oXCm-Nr5@R7*24PXm84y67d#$9uUFrGWq3^kIE_r}B;X!^Z8-clc z!eVJHGADXFw0*+rB0Q`d6hFshv8f=(lEPJgSEBlByaaOX-h3F(LK4!YA5tPoqPhNL zx#)`0hluj?a>;vu+c20Gxtv9I?B8i&kGOr##gMLa&h57K1V-|*nR%8pcG8vitk|{^ z#qBdgNZI%?*lgkbAmnD9!TXBG!TP)vN6j!fPTAgl74EpPEj2KHrz*MCw8C{#**&i{1s_GtvqU#ktc*GXYVzc4sd9!kg#;Abm#oxCh0kc#)}5)DHQEA z0la-POI9crT>Z;t(3r^J_JsQw7Rht0Wr`&~d?5C7qUW>8ozkU%vovsoZTIyRa;0?V zZ)i7U%%UBQELC0eUh}Ep$i8x}TH^MKQkorih+1|PQ|aE{&Jwg{o^T&M$B(0pZi>L0 z?W@$H-$KV{RQASeRkQH@^Hn_s)JYgL3u&?)#P^P@AmY4S*dC7^2P@`F^SY9I$jVd_ zwvOQNSbASZaqT-j{tm=n_NdQ3xplQaw`ZSH&a@VkQF9Mno4 z6b!IZV241JKUDFisuZ5MMB^3#rsD~(?&5^xpTPujE?;AwM^zB>vbcOHegGl=|zT_!h z1JAx!6|Ond9JDL2`!bk09QOVUW)6qlpTW#wu<&(ZU)X#=L8f;)6*xzDs+(MXDFvcy zG=5B!o8&1BG=AQ4&u{#?a8uEqCMH%!Cu3r}NO*?1Vl? zzAW87!g$p##1EOF*@fWgjC^*dO)1h4=R8q0+_MpE66v}U?!x6eqmUaXg+9!K3-$(c zxSOEH6J%`j#HQXr$kcP9FM|i0-fH7xmRoN8$I2!i=bW^g$2I0Nh&U-Pc!DJ*_qPM+ zvD-aM2{uY7PAxA@UT&lzg=o!GZr7oDxd__CcCI*W!ERfTTeaZV_%sK*P~Rso*NUk@ z+2ZnheUb$rU6NY)Ub|N7jFPDX{GjxcMK*dr4z;d>-jk7wp6h7}*SJQK#TWp_C6awi zEuC?FBm}lEy(QnrC@asIZ$j0s)qJ|7xeH{ZmsFWMz}6~eJFIj)JyFj!bi3EZ$<|b; zSs0iapf-$kia=fjx+eXmV7BvLRJ**d)h>5*wo5K+k~>>XlJ;pEG>jwf1DH#z4?LRo zf#0ZAa^t_yC!Om(ug8_w?XA3S?aV9A^15wuUKyQVR@z%yX>Xb_?ah54^9iT( ziImR2Ih}u+MkfbRs^OtlULTk-uMbYnE2EPWB-QZYR@#SWO#7k9X{XZ30Tk8ecTzf| zc~+m?D>9`%Ih;}r?{DRG?~Hlfx8b}vY@xhCH<<{(e_^T#rnIUM%!3}z08 zeIkRI!(pGyVCHbxBN@yb2J>=ipG@u1~8vm54Q|m;O9&N_r(a58w|TqHzrau84JYqQu?shvKS^i{uzM^p-&m6bczD4yB;OT z=5TX(K8kKUP_o*S;E`db-B))mnTMH#Yp$8dmGd*_M6obW?Cg zU^Z8UMO;Csht5Qag&tAK0H>{Lsg)*`@HH@vXVJS59|vW%p3;u{zKSfS(rII{ueWt zIVQ*dQWjXuVpZE0MneK3gWzg`o(|KezCB#Uu3-X zk+3J_U*KB1Ck|we4|@R!KV*D|AMrDRC38OPqdI;<8F`-HkW+hk>gPWoA03@JhMFFo z4}isfxPY3rRtRt0m_}kBM6EEcg!J^m9E z91i<#1~Uh+gX6KU155Q;ad@#Z2d+F7ke2CtSvqq#t|v2?IUKe&gPFr&-_Ky?aM)8B z%p4B;K?XC2!+w~-%;B&fWiWF%?CA_<4u}0XgPFr&KgnR`0H*T@(#hyA4rfvNRG%wn z@;sV$G$yEj*aMrt06{jwUQd+9^VRx-T2OeJZefP79$y1uY4|Ze8G>JSAb5ii>?;I< zHuV#Jq6F`p-vAZul?8weAc{;+5?hKPB3)A{vYoQ-9R(%Axh>i{~GP`ryPUFH? zCdfNO+g!(EkxLl1sT}R;e`M(oC+76@g04S(cZ5|(#F-NESI0BGark+=+rZB+0^WEL z6&rp5oU;$V>8SNf6?lMZT~G@Oza(0BvH9DMXqPG4L5e1*1qHNWOT(}E;eo#2b;Ny> z;vTHHf?7~=2wom^S%uY#9^5(Et$FS8 z_c7L}Q|mi_=*aR4WqCL#CIoHjC;Y|>`^S!GS1Q^OiY91NKLNd#3j3#yXm3`uBNa_h z3ktteVSn$1{c}g$w z8G0AJMyu4u@njkPY#DjG6r+Q{!`Yr{oNNzK&hyM^>)Mf71oxu_-%&;QTSpPzt|Git zMG(}20ww@Ub^ZS1gk^1?&7nJa25b?sk3-<5j&m6JeMIks->>9^e_7uz#K{Td5;uR} zk@@9>G%jZHoDkH40)o`iG-q%sZGWKoq$>m06OOa-HUB2x&==e%8t%Vz;C?G1jgwR` zL7Vyse--YpDoF%xrR~K1bp;$3Cs+s|bMw4&Aza8$hF=@*TNaDQ}~Y*-ln4``Y`!$-m2QTm|!k0 z-VyJs~jJA4uaA!n)(+R6afSyie(zix@0u&!wF$l#Agi zqLs{!yQj45ht0oJ=Y9Da8xkmFu+FJ=-H51$2^?yjgvp^YV~J%0SF0A*aE}LqZN*Dm z?c#<(R7lnQ6{l_YAhqiKey`{lW^;~lcKuZ7dh&7{H8YwrFU@cF6xY1|7^_aAUC zOx?x1(TJw*O>l3Vx|iYJBz3<8_ok^^s?MQu>bZ=7p-SqxMxO4}^PoIEsps?Z^rjxE zQHN%yp6@ASPU`uIJabdef90vBo~`b|GtWHh`X*EXX+0F@#o^_Ydu5K=EbXn;kE&HW z1d_BhS8T@r*8D$*f32eS;r|f+kLLeG{!!eU1|Gee?Fe7S_iFxc=6{&=?}2m_eGg8* zho#>m((h5}_n7p1oPWdVkd++Y={X^daZ>s{CH=lE{k}Z?z9Rh|ntso)Z!TQJ*ZTf2 zTIP4lb9NeXwLBUMEt%jUsQ;CX-&a6~&wY(o;vA0ayHcAz@V?4mUb%>2R~^!^3nBV^J|r(OxqNedxNW35;(T+i+U1Lgrv957ZtMr(kkS|v~yqcVA zt7L7`*cpgUr|!hJ*kj0h%cW!=*j{;3r=YVm(Q~(!05_`$uTc>MwV)8I2#jwPAuU5L zn!v5U4w9P~_qPz;B1Gp2k)Re7^5AI39g%KTq%lPj)Ph2nBIPGF|Ky@h0~bZNKwL_zmKOPLw_JL*J*6&RYgB zzoRaUJ+K2*e{?c^$@{6&!a#RiG?rrABO61<#c7?jDx@(16~nKOlMDEoPRgC_+L3f8 z1()oR)%||2yze0o^0rhSRWoXGr?O7Rg7W&=q{?r+F3s!0c3yJMlvl6m(Kt9)Z9F&4 zs~y$y;+aikljI^0Osj%jI_Svu2{?R*zSnV0OR$3>v$1BwDwQi#22KC%4%E0fEyL^E zWsr0IW#Cj_wXwVBo3x`^8CF@g$s1G#i54BbFIlay7GKHPyT+UhtS)Tn=0#bin^$Ug z&#y}`arc6{1PXUgNC->up$J!{WL^pN85SsaBoI5+@0jjGtt*NRL+oFNY$lwdQQHjYBt) z>_}auFmObx?z`;XDh~Knr1*x3=Al<*cz51pGyfock^J`!|gMlMW z?lr#l{^lIz*~Eyl#aBN}aT=FG_Jp7olw5`vQlfoQ8V3-ULyt-$-Z(qDlQ0hURiD^z z77epGtR^{+pGu)V>t5deJqd=?xEvhF7H8t_33WnCPHS(u7OyFrbj^0gGzNsx%N3;T z>uOx7Pr**8npAFQQ@M57&Z=VmT&fnhj*#OgZzf{$7Jims2VFL65o~0%83J=Wot&Sn z${ufH@wLsO#rrs4i=$(rUEk&Q8)}!6iT_W^)ZT~MnX+Vk{mzzqetqb^48EZLww9ZH zsP|{^!TMOsJ)vgy>v7%+jT34C)ve|k_Bt>NsUZA)oK`U1cvZpDmzslk`^DiA0^{&W zeyyX(9-ue6moN^kGUrS4v2q1ocQ)B}XtnO6gt-PzPzy2*oGlV-7}~M|i3W$`M2eym ziJVOqi7h0b6B1KR3Ti>7nsg*snF+~4kQ_urGZ8Kzg^m2hDkB+&zVoHKvdE^yKP~ z?KY_5IomiL65ibSh{+hY&&TCx$+l+lM%z0N;ovTMo7q$Wi+3+lA^8{-lgQ=5T(l+W zBd*_W)Y3ZMirQ^*jfP%mA5cBM4XVN%jclcvsz<>ug-%PaqP%w(P2gN``D`5MFQ51} zUtS+BVi2kOwU#!nqT$9_g=c#V3KPFKP&UuR(9JwEl-350(Hoka^+Hara=Rob{A&Lx^rn&<*r z1MXV@8t)>f2|+C=RMpwVh#T*2k)SrCj7AP$p=<3`=De(1rDff=v#jW{G+AmtvZ62i zCUnaIfpTkSPwq?OP{rxg%Qz+VqhGEJ+g%oZ)>68oyz-m=JX7OSD6qPVc577Q`zc=0 zJ;+$yiFEqoeI`Q2H-rAP8uQ6}NVn2vJ|1QIZx*~(!($1y$SmdQR2qut1vcF_Dx83K zVUx2~^Z?CKbi#;Z)9edx32gLHym8|iRh|6tm@=zX>?W*2@=NgZ`ttb!LTH{ zmLz@oekLTegP1Fh9Iq@Tj9({YJlYE~p)6Lr{7Ey$*47$Z*DEE9t>(~+OzfF`Xm zB}ul%a4BRz)>QP2Csm!w#bb?$68agBwNw{Xvw8&$@kJEp^sK%_UIywj(7~`i%Bo-RZQma zYfrx&G(aV)Z!c_aZRJ>)j*;b!8-!sEKf|4F)wjk@85&&o`ifRbWC>%>F1f{A>)j>c z&(c-alg^%D+CaMQ^`x_BnKqEFXFcicnWhb->s?Ped$wr<>1MAdojv0;L%M7(S>E`! z`ldAkeY3d;{bDUJf5O#JwYA);M+8@HD9~KWK53<~jrD|he0zFA%FGws-|D}{2|LV0 z+b<;1lb6!w^yF>$@ca=MCff5y%hZ98R4QQ+`NxGZ1&j|XZrAv>)=jL>z`xD+cswQy zc0J}OGAo^2h?A@7k7*FvpGrXVmT`&V!t?v0%~6xir5vnRmXl?7F&^K6oEkUM>3WJ| za<4o9bR~C(jiIKscG*@$-b75+F8%cLCWZ~I*=RFjHf|4_LC-p;ZiNRUAU7w_#IzP3QpDUDB{Z= zP{zt#F~*k>HWfH#368XM<$)ulrxKp+9w~+S7;CZRj_lVvi+ZCg+29}_KxAzzWA%Z(yxbK0y&m) zyp~#~AidlYyd(8w?NP3j3SCJFaCd1;y@E}kZi9Nfw`8Y;&*eqKxL~Y%}>TR zLJaBQ(==5f6meQV0c|SF=OZ;{4ZQJ~ct`qF%K~Di;(yn$ZoeJ`knK+uBK7Hk4cEEN zOqICXZUQUj3i+fP6h*7T?&7lF6cU@YGCB&;=HQ$^GaYt@&Mx7u85t?UCcsi4+V>?#GL*5}o3 zTR#p8N0>!Sy9zY6+VD++;}~DrD?93DI{r6XrQJZkp44OuiCl^MyJ@Xr=))6-0i{>| zx+~;E5VmnU|1I%uIR9kMGi0AiT^(=ebao-52ew2VcaJP0x1tHQJu#c95==`bs+N*% zaT~qqvh~~3bvJ2A=qo0do*iv>OJ?i7AUcK`=YTu&Q(CjnqGWUbpGxK}?b_{dDC;e+ z$JX09TY%k!^ssMmI|^^WXHXxXZ%FF*AK9NQI5*I`PjW)XM7^Gwgk!GbL_vf&gWJiLl^X<}97 z_5P{ofO)gDa-u(N9Q}#!rs_}ao6;*IM*>V=Y3X=v#V+7=5; zNhq22NQ>F3_`@veO+N3j!ufqOg>>a&IhbbKA7zP+IU2y7zk{-+O?l|dKMyB)YiB5l2rt`Z$+U_S=pX`fZx6x30tVtB# z@L20g=280_8tYxIr`XV7g9%x0%1XHz*=D8WD$8P8(zK9hn#3j2Vt&giby6`i{$XQo zJlg(VFP~&v2{4N&-!$gho>)_Q)x5q&(~a_)MVKKq3Bsm0>!iM$<};fJy|CUM!0iLu7S=tW9(f3;zrun{{j#+$9#wAXYN1>U?( zucq7$_J?GnXCQY2G)*DF=E^}-1Lu?J7SNFMXC<;%C0+zL-DaHpP)Yky3EL;J_ax>+ zR`NbLx?Mci`I>}r!+dfVVJRQKV>%yC_W)-{$DiSS=|#E{e=$hg3mML8Z5r(lPv26s zw#Rk)tVDZU`{j>?bho{|0V+jKadZj4E+>DmB`5ckYO#q!Yf2qPIIYJdwk1jHF^QEL zJRaMGC*)j{r>b54f`o}ty{!i%G^NM3K4>h#$$8l}SLA@_@gPH%<+zkxcGbcDG+@%_ zBX&`wQb(A^PUq7S1>^UfQE;o^_Fx3~J5@V=*FQktsL1wTAB`HL{?^uEGrgI^7?Un` z1*9xi{m=BQP5~n_gji#ktp{>6`DC)j+~{H=EFpa!T{UN#vR82q13Y72Yrke@3aS3e zh-Ros&*3ZtP_pjeB5(Q}jtRS^tk12P-seo;==0a?=w;_-Jk0Iuw}M9WwmYY5b7tqZ z-ZsB%8mM zMvGqH^$}zDw8OFP-du0kxfx`{m4j`fT#sPo()xk-A(mOMm$YhKzx6)EG`P@lj-?Zq zM4*mqY?C!CU(q-8nyjtDx!#0z5SQ`llw4?MG<~nYZ?Z1>4z3dN zy)JWr3)uD<%p4BeA%mI2VLN6pb2x0L3}y~sedP9KzDsGh+&K?IEVJ4t02E9>i-QDQ zmugntZeR&)anNrHmibR1Sqi{^S6^TNNyF(g5iRHHQwWNK{7r7bZs||92Vk#4ObBX0 zRw3bWD061f9O;O^Lo2?Z7SxV!??PyU+t(`D9U!4(PVvV zSM*ZiEYlcD*T!+Uhlsm$D`~hF=jvF_;rJXl8+%I@Ego*%M^JYY9+L0jf|UW{l*(?+ znJ?z5EC}CE1XuN7q4~6y{b~K=B5946ljnk#4a457EVF&xgIezS^`l$v31tNmuVcSo zd0TM6gYG9Moq>LUFAC!a^~sNaKp$_DLG;RplIIHIH$JG?aq7MF$ABKntK`kf@vcPEW(h+GdMf#{B z32H%MV?}yyN2I+K>Entds0B55?FipT;h#{rpcWK10SQ(0Nub@PN-HLh;ATO#2eHxh zB%i`->v7zl#x29DTJjlO2)LV)eAG>Wlg|QLl1{S^&rpZWRUNcEPqaKriU~n2NKAZb zSfroTgwn1iTVEX=^b4=&z7+td!|kjNck96Rd|~^XunF4KPx5)ZjW6({I|a9=@p#($ zF}yvcVWGKuN8J5daRs#?kNbq;Huva=`T|A$iqHybL3&nVY1o3F zRQJ+rdLi}9IJt!K#8#?gW3;)ca}%7peZ8%J?J>Kub{dmS(@RR8IsN9jxUnDAr?I|W zY&98nhf?|3-~1}{YJXF$I4oZGH30}4jguFUEN8z*YJ7Mrh-%(<<*uW)Uqc97Y9;NF zHol(XkbRfL(CyX!1C{mz3BE;^>5pdCKBYTtD#g!dwlv~*)y+n_D|zszsiGSQzluzT8&qWoQhUrTr272ZR(*tEcw z4M4ss^QHMw)ko_M1KUf?eBnjba+h{FLVwjD9}W<-^*VuL+W5ERXndRB@$c{xYX(^kABf9quJ$0e3@OI)@MwfsrU_D!E`2ZrP3 z-W?}~uUoPBhNPa+tPzLTVdXv7Np+zdYZh22OV@0F@u{=qm|T zsRPxQK{e>8xVx^6s@z6ZZlfwMC@)B{mKTCGHEpX1YsIjp=k)0(&3v5RFQW4dYzF;; zdRa1z(lDt#J9 z8F(NILV`br+C+jsj!(v?$`NKs_7{hvf#(warn0f`i5zQS{W=)o)OlRRY8qE+It=M$8hH!C@UMXD`p9aKm`wz@1L z+>n>&U5cKEdsJiU5V*Hwv?Ey&=7JDn>0t;9V}d0|f^><4iVk8N9ZIUkQCbrptzfT@ zRq;^og5($ge%f=txN$6=abfeim+jKa$YR0@vrp&B=PbYwcuKZl8b45}8o#3D#}Bfi zGdGP1NPoD4;pBD@TI27cF*v43jbp7ex#TduY}Op5&+L41guY$LG5RFG2Bo#Z;ELrD zCkLYElD@txO&#bp6)u$yzaa`w1k}$Fu+C5ozXf8e*PdMcH9$+|Nqz@7$KA*0Kz;Ii zd6GZy+v}7j2SFznARh&hJnwn1d|f^uKM0O=K+7t6$^Ym1 zSEl+C{4f09&Hs(`mrl5B2G#)M{HzPV_;vT`%kb|?zpA~Q@u^;GeWBZK)0{WUx`NyN z*4sTnJK$@|1DJ?PmA?ipUTli|)_%B`3BIUK&{e2*U2)pWkEnpo+W$7MC7!NYfBU1} z(>U?=FWQT+JXLP(Uz*nbYK|N%djJKUw|{wl+qnRzw|~adojiZGt*^UK?KbiX#5okHD4uogRsPryOa4u}XX= zjDrWgiPoL*m{1gwcY_VydkvqI_i9sQf{3KT9?8BlLYmff_C)773-OYF>C zSG84SW;S!J-T4gDgbpiyel=#fMIJ>6oUzA`-(Un|}!{al) zWNY?IBj6nmWoH8aS4ZkTXF%1Cx^?`N}IB3!6r1Xqe8S9 z$yQTGxpN+-;%E<>eLLC%%R#bcrpoFy7b(i_q-h>T3FG9wgmdDS7nYb?9B;)=OzuIP zu*O2oMu;_=;&vDN!-Wjgl~Q>ZlN$lqyvM>-?$~|<$~Nx=Y_!D5O$1;~EsjzfE?HiB zquVu=%JZ9nSAQxKqNsT^KiORoucPW4|Dg9x2x>u%f6A+FNui|gUI5lTp;gu({am0~ z3OS|PSwH9T(=PigvmYdSRR293bmAD0)aQNx*RgV~lIu9R-nT<^=EO_nI#00U<+@a^ zm&)~SxlWMlHn~p3mF4l()<8N5Cr-^r?*}{&@u-j&6=A&*WcJ&)Gkw zxpnaB^^~8db%C$^0NE64$-fDX$AsC;vfP=xf_T1bVnODwOC>g#Y(+2S25DBkwi%8B zJNXYdil)@FILSKvG_Mp~rIjz@w`|sy^^Z_J<>bGF26hh+2}0CmW~}1m_M9afo5?I- z^-mDB{vaDlM8$F*yV3ohsf6A5$GWb(k`p zU=<(`qp*vlDXiMnS6urEI80xO6E>B?Pz9|_6s=nb+b$3-ype>urFxVZTRS^NfI}73 zTWKWsuihMgJf`Nb>!0IAZvkhcMC5U`+uBpt{rA7?7RF=p^i>c#$^%sJr#G1zMQNr$}Tm-KBc51+H^=UcF*f}jLOzAc6VZ2P1FpdqU<6CMQ0UxwRKh# zCI_wRba+~s?;xS3_XSsE9UZVHw?t8V>Ej0a-m4sTL& zugtjU{k>ZD4xe^O)j~%_&auR9@|;>ltgY}^fnB{C?Y;xWBF392;}!fbWGpE~_IDr- zl!4J1{HxV}#`x%4v8DOl65D}h&gn#GCAVvc2@(KPyiVhkj6fsEXS+uK({`IHV5bvEw{TZF`8 z;srb}!AvOTlB*R1XG{uCTL(s5n8 zASwHIL&tj02U`%IyJaR3?G&z51(phL1zF?Wq)P6V1~lt~9(TX>#l5E;m;GW41-(qj)C=WW-hk0mCR7mQ<5ILE z`MyAXz-GsA4S80=N9MEsMlfcBWvM^M>vP_wRA(_=3QEAcExMFVVhsE_o&H`W|3SHio$I;{_d4n9HJKTZJ(}I~%$%Cfr79 zw~;!~qXTs(lW}7c&}=~}{#LElkt(dO1EpBfwvQRmK5FzrXbm^2w1v^lh#mH#TEe|8 z>kUp|#Myl@NbQyL1{y=)?%_H~63sWg8tcFk>p<3mIwOm;&^!UcMy0Z;)lZ>RPkb@! zJo7JS1h`JH)*skFtK1|2dclE7-ta?_fuVn8Lbwd!*k*Xmg{ZMP?qmyomK2ifp(Na| zoD0np+c{6nl(U5RNjVoM=UnuhzfblP!et1@p2BOcD*BlBs zXICxMAA$C2CD}@Wr--(d)e-V^Jlk{ns&W!C!#MUeXVMK?to1l(?xM zuLASFyp1sb&ePSGFtyg1J$4WEi;Q0)p|K3jCEQ4% z6XJo^?J33HCE*PDHRa@WL}4ZCJhIE|3l31)T(UK>`?;HBnD5O^R!SK!Jt}slSfd=q z6zxKd;ppJ{Y9KAett~l}W*<}L#HMPp1qwjvo)Isj1I3RU#*d9_^@pP&$fnD}aN`y0 z3FtTZ;NaZQHgD>tY2###*vx5^Qu$@NnN@N96bNGfF5FHyb4gG1JHiiA`AmH?ZAXw! zvOfL&+iuMC_vsGZnc#MDpeqc+ZMfQRf+;IoWj{ogjiuDxgrF7_mTI!nj1lgHi`NZ< z?G_Z0ZHVbog+Z6$J&zrNJHf&eCd=`Ld*q&-UpXHH*!ye)GLtxF=PlgcZVG?G9>JsE zr|7wG7awn5_B77doT@YL=CHaN8_!_oa2U<)@yy|{*Jdzt0JD87zWU>O2=d7#`b{@p zBsj+5ZUgH#*_J}Mxp%nNp!zkaT_ch9!8x`kaj^Qu-xu0EZK#vK;lb#}Fr{uwZ|>wT zgl7FyXBv+p^F!3mV`GqQEXUJg{X(u`nHnsvUriepninVvJVMv+K1^tX&RLld)Pllt zA_uruWn9P{C7Ef=+>)MLySCLCSQdZ++2}*Uqz(|aC4JiG4<(mFRkm}jYv;ya!B{Sg z>DTY5v*lm?i!F3cHL}C2NZ{zyi`+!r6NXQcQ|r8ccl1v3c(L_y6FsfJeTJ)~>%SFN z>u+)RC}~h_$tpCrQUZIy+OA;K7m`*b^*3&_m~0N09+sqvX2{2)MeNGX}oR@9>%Ai(L7A`b9P!kr&BYnIyh%i9c1mjo$vjG z?Wk+PHuY`@zJk5$eE3XtF`vSCU4)NOK#t$5cS?Pb`gahv{z~&AH90T+?1+C!tB*CC z7pl`}IUF7#efYS3KEaO#4F5KsPz3WdU$3ZX|N1;p8ash&LQo3|*n};eP(FqLyP<{A ziAV)UK(`@Sc?7=3&PsG~hBRRdn0L9@Sf}N9-cbDA#sk()m7f0I#;d6-_KTi|!Yc35 z^3*|PoX3XQgdfwV-`+Y{DM2uWB+n(v%AEi-l}jfy*_EKt!I^>@s|ZSV<7axR)j+k! zyz)5Z(p5IIgepdkuTeYhPH1mAJV%3TJAQOp&g9%I=RJsEw-Gk>6e4uMOzwN(DyA| z`U3J;c0p@r=WVV1ui7vgaLT^1%6nwA+tpson1lb9+#hKLjV`ssE(rU{8k-*`+e&=} zBgiZmGb5ZL;l&;^8XOv46s=}x>`#{Ua}|+_m4(@WRM>|Ru~h#N;97VgG1AiNP)NJ9 z^`9%5)Rx+wLem&NMYdskdP-W#uT3wdk54#W9339*e1(@ocE}fk`)F&c#(8u;o!LEu zQIKXYBIs#Zsf?+g9sq=e^bTa)d;{&AjpQ$ABp*oNgrF7_b|g~IT20VP z{E3l{TNDC)XsLE%W@%<*HGRNoQDHUJZtf&1Je0Z5i3;>BbZK37>*6uc%^fQ6-Ab-L z`$K7EQtPVBbQdV*9#@@^E!KBZ1g?3kgwH@=#v^s+;%;(1R_%8_#nL|gnbbfRQ_HxD zdAu~re@1#}zOkc_kExI*#RzIaVQ0$0y|K+pI^un?6;DtLvUnyLjVEMO7}KvyEwU@s zdbp{KZHg35Q-l?J;#|q&HcV=xBA93Ih;2;O_n>q>2f4n+q5HR>vcnw2AXE$N<0va~ z?5$J_?e{q-?4CaSWhZ9+r4;q_XZ>Yvv@5Oh5~UA+LsCNuUO-*LVq15L){i02h5m%i zKUAFhnE>1pACps!h5p{Pf47j=w?bqCm4!V?ST)bC*9G+P49J26RGMiWl`%yjt3S@h zyL|O0SLoSt#%g8dnL<(E7FBz@ij&&(EHTPL{U)oC6BS8wTKyCFxlv;`+@<>W+ksM| z68*1j2#Dd;3u}#!QsVF$jn^`u1rF%zDv1p@4yJ?kuGKElT9gDc^!EN?Zh~S@Y=3^z zKiR_SzkvTN>+2pM81k6GS5JX6+zqa=fz8eX>e8L|_>v>u*OvP~tMHw$AJj%wcw9c& zA);e?3TvP6Wdmq`>wuJ|bRFQ5_pK7~&8RFr$T|1J86cJUcW42Sp|7B)vm14#K3(H) z=F?tBsqBm> z%UfO2OF(_MD4Wq* zD(7;aSB}md4}>CSZ)U^AeCBHwbC7`b&f7DXIUM$m3}z08y)%QE!(mrtFmpKU>I`NM zhrKIl~S(rII{) z`@ilUmU|W@g3je~_quxx4BiV6ENVWbnZWak=-M3Y6o41wy)_xJ$FBu%%&F0v?~s3~R#tBkt@<5`dN6IZ zGQ5x=Mu0=`peGp)<(mvpJ$nkp%)72?t5y)5$&HY-S=^Wv9`P3wZ{Fv8brY=`pu|KN6UDG;yr353({pu=(rM8KX6;BwHk5i?*KgL|XD~0=8Fo$< zkNKicXV!n!tOFX;NW_X}jGg1vr`$%DRv)8f)HAzXCbPH9=HDSYhd$yIOHVZ=J%0X- zoLW1?b!&Td0g_KpBk1OJ$Xz>1IZzA~eJms4XX-1%FZiv!3;sCOR#a=iejBc?N^S4j zj>+3?Q0;DhiZJYKCPzcpF6nnB$KWi7V+GLkH%^8iTMpYIz#hl%OpYUzPWgB~4e>av zIXJ_cPz?|#Q*g5TaRMk>6eK6&XnqddtZreTq*OZz=%}C;6t*J~Z2%-ED_Ut-mZ+Hg zpCTWpXUVBJ!esW+`a5|Om1t<&tJ(B-4fdxwM_0t`{T&EL#5he+QE!k?2vUjm_n={W zI`F<8``D>;f5lA}^|-P~kE;YbtlMGT4(qF!&QeAjeZiFWt)e}F6PgLhM)2fuCwSZm zDLpL>+~%MM_j+)z2iIgmQ7XSJnlkZ}OaR)qF6u-R&Cx&6+YK)-PfX5GKGOZ4C$;~h z9lJg^{sjC~x_Q43JYI+Q4%N>nT8f0H^L;O0Mb)3+C*YTDlAFfCpTMsTlNWPvywNxC zzlHCg`6`pM8A?S*@U8h`ntlv@?&#S*)PW%7)8+6pVt|ZJ2A=IvO%DmVR6pBmcD7EX z-3(N$F3#?zXS{_>nlCvMyn$^scDw&9{7IFc9=l%NnbdIic3H*cs92-iAoWdZULQu% zxy_8!NXBEUcg0S5350SjzwD|7+1|(2(FTj7lFMMzXq(fsJ|K=Rz0BR*Gc$Xb(`g0j zFE)s4&r`a(BQ{yzaqB*8%9e(%sVybdQMK7{Hm+*v%jsT;4dbKAj%cwSG(a(IZqzlO zp&~@5Ss!e32_Ls75q~X1=++AIt#oYtGHT;cf+gV>^(izy&!>nL-z?bLqF#g8 z+S2v@zbCqtwDmV;&hTH-KA@F$$K>z>NcovT(Am}Tl=ZSS>6nXaKO)$Yb)Mq7SSwbk zo@aWXGf$PMIGW`kMH|O?%64lGxGOxLZhf>e8rK!oI~Q#U#PuB1CIU{?@lsJ3PRY6* zpF^n*pFr$0MAxS4VIiGfat`HLF~f8`mVmn(ZN%2B0PRUl7WNg;W=kpcWK%1gYDH^|BpWrHdKW zonu<8Y^Rv#DdnBOR~;AMr}I72%14E66ZO2<2fItv-cO+|lUz^RCPNEFr6DRii#7It zTKsRXpr%+8)Plk;AQ5W^1-(nLc1_dvdR>aN*>qN`eqg29Dxal^UOQ*9@Iva>n`|)N83YO6!jeB^#*&+=M&o6oTA^7pLI)D z^hQ{#sXl2qLk}q>*&54qYOBg+=x2x=Td&xiNGv z0?+bm10`p)ikPQ;L>&Hzj22XgABR_Q>Nf5GeQn_2rlRxWz?#G4ZTebAxhLC$nc8?5 znb;b@94Dk_q9>`J`W#xx>X00THxVx;^<}NE_Ug269TuAyZEeX(YqXSnaL4p~nw0LC z*4R3Z!`|SqabK0ETo(rG**#w5SZcncM`+4fZX&^`w+ zg(sJSDH!L7hfC~xI4jubHh&@6(*Z62UhXIV!e?{wFB*OrS2F+W=FjlMzszgvAPxwk zvsG8^@+SMrHhbNG)crPR^$vvA6Qgf0^OE)$u$yMCT{4|UTAMG`IgiXZ{ShQ*hbJ8L z-3<-qksM-4le@3OD7C4W+NQu?CV@8C?>6L!bC7fmlyth(rd}TAh)mN(quv=awd%+X z4&zxp9;rZQk;magu`=(QKJgl7gU4+zFW6b9b~Z5^XMQ=ymmg83ef8bZuCMvDDCYLT zw+7sPkLuD3lG+JgJ_mV?q4IrKwWQd1RJFnCf&gRc!i-I)MQF)H=cxT$NHs!DSy$={ zz5|p%k$Pw#8$2Cu!|S*alykioS#2=yRU&I2kxVIuUQJAe=cys4AJbSut?q21BgmGu zX6}ruqQli`o|07c=Jnx<*@p3Sv>XUpf$`j$^Oq|aoBNkj3VMyrMn{wMxGAu~#y;gR zq;o3Syq=Vfg>m%x=*_>#J^KqkK=dI^Li-vU;sBK{|f=Cu9)=}@hUpz*8`$}ekX49x7;5`$s=;^+ZS)Ze`*0}?T>qIzMtknUggF7^!f59yP6cNFED@B=V#%I(s0Re zWAfNUh8{KT?l~mZI?u_rU{;^r(?ZlZFx&9vv=Du4P~FrNotUk&ffHw7f+`a`Urfr zvYhpq#c(ZND%l5I5Xf(ZaEnSh6frw`=%=ALUIj$o5W~eI0tiqQb+ur ztolVJ0?|eA)qINLoNNZAM`i)5PX7uDvA@ftY7ZRMnA9_i8x^YIlcw@Fz4-$mnrn`l zZ7uL6Yk}Xf7Wj|X0mIq_x05v=;ae)&j3g zT{Ha!Yk{A(7Wjw8!}p`B{2nzie2X9Y$Y-sVqWi4#6BKm6p?!jH5Jo*VSnXOG4qCk5 zbQtppn|fq^O=KpAhb&Mw02{Ou{iXT}lU*^R8;CtEm+kw6Cx{Uq<|i)BHbcR4oa}c5 za!W!6?l22!1sllIn=2)VO&(UCFmv7&P+q5Khk3rSmF36#m|k0Jf|>HeBuIUQ(gnsZOfxqD?J2Rh;Xl(>{)T!tOdzL33C>5f02qvOvu z7umjj47PJ;muE01_3ez@{U5Icu1ap>z}w>H(+I5)zHg$Z|872$_xE$WpmV2plRj^( zjJc&&;N3;WisS?E%L;Xr1&2-IOUd~-s}Ie_0>}kggNbrGk(KZdL~orTxXa1jZeC z_Ko;`klz7&_6rktEw?qmmh20*UU?663+XtdBIc#CrHpahY)iLQ?Zos>o4y4gjHdW3}!@_d1eR=Q9zEg(m zNZg}(q~wDTl?)`0Dtb^`NGYfjK$5CO0_ z^ERsDOg=>JX3kGO%qIn_eDmOe6s{7t0=K|9Db&h-TOHAr#*$G$hS@5J1(OYNUYefZ z$))f#hZjOBd>dlb8BXU}-KH;0tY~tX2Y z>G7|sUO{=!?5%wS-bU3$RM-7#8=yX7XqRI9!c^FZ%oADb741^JmvlSqfj%w|Xw!f@ znEnc(caky;B|e$=eUubz4Jx_3&&vB}kgsSXC0t9_v1A^4#Xa$Pf_9d}KFrxGrSj%4 zX1r?crMOp*i~E89DQ?mBzlk2j&7YG(wyO9Oa;k9^v@$BF1vSJ$IxsWkncLd6km4@Uh!4Y-fms zc0r5b*I;PupS`NAT_oECVE!u`j&Nr^Kt5@e_Ur(cZ2J9m&tRPTSSmN4-{i4w4ak{(z9U3sX>L zEdwp|KM=>y+dBsj>FJy~`7O7Fqv#}SpCB8{$g9eK2IIHRJKwK-+cuu=p7Hxzt4|e!B+(_=w4y%4i!uw8Jcx=&pAQRV`g*7K_ z6FO&P?pYw|_6 zaT3(lb=wEl0C3*|p;B@yzY9?e$wC)wi`&7o-UqSm=HvH6osU!D{Dw0{#Q`EQmzM`^ zt~>Thbk9m{xwBVZ0>x%2tERgrWyeyT#bvr^tA*|4q>sGSrfol0z@n{Ywf$V_inh}H zAZ1T_$_w|$U%QUVAOnoIkzV!Rh|I1?_IDJL=a2!))5Y^Hr?Q3H+x*136Z1h;qOqOH zK+no|LbBM;4P(iszdVTtk8$*s7pm{YSHYKAkr^D(F8z4<$QV*4Aq*gOB|HyPS&m`| zQ>#i>?Nbm~HrQj^?|zqrr>cNWuDrli1-lyq(MY}f`TR3ZM;Na(TOWey|C9J{=U*)8 zPi=o^z8_J&3avh`_DAwhDN799D>noI>qaUSD+tUJh?WYc16cP;JW)Bks>X{;=WF^~ zfBk5~U*gsI=3M+AwYqz{bye1WQ+>i7!b%3P^$X`g>UO>V6hZArXl{9f;!{CO;mxf* zWwleq|5zGUM4?K7>O)xPp${iz^5iGl@R^^sSMjqKarBptB(6iS?t|^=RpYlb%+|sz z?8|`H_?w(V-mO2K8NG&#KQ5l?qJuHqEqO1}U(}p!7eVI?T=`j& zU($!Q)$Vfhk6>k^-d6Bgy92?F3Ti>&?WB+0FcBN*wdXmz>?zK4;V8p$b1^T3v4=|S zPNGT^#2@J_4R23AIZr@*(md+mXy}b}>d9T8na!RSh>*Jh+M`!_;5`6S#hiH$_~Fmk zBMDFUGfKB}pr4oJC~DamJX$GNJY_D(Te|%{gZ;fw@0m0qxmPR<2x)?u;|FCPtZi2S zG|=B0_jUL6hGE1ZMWUpies}6Ny+ZHADA>9IO;njEs`%3p*EweuS3|0}z7U#5_mN2R z)tr2{mVECAIx46I$==@F=AUv%+X(5iLK4)1WS(!XZ0^mK+LCI4&EVs{iQz3^>$@4> zzKK)>*HgGKI^Y>^YH{@MXvtZA_N6_7nELUFR{f~nN$n^kzoC}0smzN2a~J%aY?hjT z&T+J@IHI0cMg_H?a4@L$oKkv|V8I<0?Jv1#+qI$z+SHFl_u9hiWt5O5ceZ*2DQIf=u94C5w?IAo4Dw7n)2Bl61;V#Gl_St{ z@!|HxH`7*9KK)%9v-b=3IT3R*021=^q>P?4r8XI@5{xW74d-fBN z1Vo=aHDZDtEw}oio`p(rsPdp-B5qE^xUSwPl~gJDDyeakl!uaPx03Vzj^TU3?d#}F z9wel34PwfK)3K`bNlwI(#Y06d{7)J%#xrCe)$aY^xT@lSa=+~zx#umpVo-ZiKmLhilTdX3RKD_{GLv)M4c|L)B^v{ zO}%N1_H8zH#?hY98*4t7p0VjRI(Le0hQHeFNLHt!@25~WkNjJX#T{EL3Ti>dV&htH z(?O`)2BGq5<3{uEIYK*$ko7WxT2T8vwVuxAKXSM`3-_BU0YNRuF9R@bnakYPMl0Te z>!NpKIMQ>{W5z3v!<+xi(c7g(Pf!bL)9c4Xqehjof4Fz3teLd?yM~w3UeJkEW$&-l z?m$re3^=96b>Iw0OLm~~L7W;aRI`(ZgxK5H>m${K;e9DC1|b_G*Jar0t_z((N8^!g zSXg`p9mcB?R5TbZ)RY}<)=JVLnnR!tl2(~$--15$RGH^}(g&uo>a%@43l1apK>x&) zrIZS`O8gO~zBG~MTZ>U~EA>@^BAWK|exCiw){FH`_Uun#be-Z9CVK{6@(fJ&k#%x9vR15rToA+=qy9iD zv;M&}+3Jlf(fS7Z1}#5M&~F1T*srDC+vPM8Z&hgcO?p&PCWw5v<_~YC+a2yw*$`exrDw=CuaHhXegH`lg%6 zoc9@C6wdlIm&FQ~#Wd%8n#;ngx-~CGfZtQkQ;604&OAgTeex<8a|+E>IaYUXu_~wq z8LR#4^{waZu0O2Kw{LxCmrV;bFPk~^ZD34Ky>b^iwEmfWGY8%)SM^1;yAA9;?%J!= z#PbF1n>lEqeH(-=NHc{ce}E-uTZR3I=W%_{&j9c9{Bu4y2L5)Yc?-b5oNpdKqQ6UkqsQ5T>zr5Xlv^|=CVezFQ-Q0# zN*0GZ2&fil6>KS6kQN}Zy+CfyE)17ie(pk>D6+Zw1F4pRZ5;kokyuy8zg5^UYd(H zso>#`bt!C0L1ABXV)U)PaujiO0_GQ$>p~qWV*(mI>o66HY;zcp+59Eh zI^F7GF*<^DKCN`_v2+TJ59ibQ%$RhVQK3Bp+ozQWK`qGg5H>``p}RcWc$rhGi(Xpy z??t8(#X31M`-+V9(t=u$~xT)p|(r68^ffXiJHTBtQRtv zIe@9ZT92>(oFB*?>f{d7rz0FLswvH47T+AiA)Ss4W)6pyGMG7lsh(8$-l=?J0W2KV z=Jl?)_B|?CqfDfXheoG7wK?b=g;T}HKsZ@3NUtlSZ4OUQ*hA94t#Afn|90oNUdeFH z;kexy%pAakKV#D^qetoc?}EQVI72ChQ}`_;(_z8a&uGVq1x~=u%7qUS9w#RNSx|!j zZRl9s;RV3SV`Ph$5L+$chs*C`xX+g7+AfDhdmkLh^ngdoEZlZ74pqY&sM0 z$frfm!hp;m$WzE5Qanng0Upujdz>7nIOnwDBvS~I^{Tnr353G;$(+~T-QnMBuZ%Je zR5xL-s;{%zgV3`D(K{hlTS1IbK`kg8O}Aj?u(Bsu(pS34(CMJ3x2+ynqqUu^q^4R9 zt&k|AD$$q=P`Ncu?886XB6hdR7F77v7Wd+NH)Y;@BigZXvI+SPPr%xU7MY%-8_1DA zg&~zVyE42SH8{gvUYcq#vlhBDUDh)72R?pIjy{h29@Tj-ByA6J^H0)*8G81Dl@~jh z*9x{o!R|IV7s%fW-0d{aPOipXvfrbUYjBs%J#C?=hQ+YyLUZucg>wKq`W63y?x6jK zCzU&kaa=2gkG*O?>Z7uM?OAGf{4?UeuGU##JbjAz3v>ip2xr4X?J9m)Qd%%4JA^8} z@?VX^k5q*uf39YSbHFsuz|d65NctF>U+6DRRx*?|dvn#~Tv6YEjlxkuEhrp7m0R!@ z!`JQf=7b#nGT~n=d_gTJFm0O~j-hTb1R77AA=;g9#^VwMsv}fSzgli%?+Re_G2uvP z*&T(nn`-qbl9BXsRJ-E(L=q|_KP1ndpQ739zZZE8Vm3Ffud8shkvovIr!U#)eo2iy z+y`DdH`}$nqiantSa5(S;5GxC?*e4yyH<@-LdTL@~qF5elMEX_fh$alRAW)6p~pTW!lOyl+*d_M<| z>s?7-B7NQJ$(eZ7YgluacrP<3;#L2VLZ?^nHt38vsOK3YZ|XlQoyySk<_1buJk89~ zHwWoXw_`EyFQ!YWlsi?~x55lr`O|+k9%p`ir#E@Af)>;MK5Jz?y*c)q#hG9GG%Su9 zGq;YJG->_h<_C`Eh38b6rqGyWY>RJm?H$)Q1d?s(%*P~$)oB4?Cu*i<9yG^~!$YJ+ zXQfZUuC_79?J&KJ&#OM%%QRDS-0PVumg@TT)z!BUXU!L81!leXfo9h#!lR;R_3D%q z^{E_cF%6%?8BmyQ-30wZXS6lEe1Y_+Ee|2Zoq1e%9-p4ANNvI)7)+UN_Hrh~x3@Uv#JP})cnq@{ulpYr zl^%vyW(<>y$&<#D>WTEkzUus_ZiMecaUxolDpuPTv8$02sS<;nRa#ZG)>>Jq{*rS? zJ6uVh?F4sk zSL1JWZZ;7&A^!iEK4;3?XX)eK)ziN>SIIVpvRN%Fgdb5R;RW?Lg|M>aCjGVG|G0%y z2rstWYsddd3#Sl%+H!-x!#I8J#a6kCe zXX^mGpYXb?yPRs}Unf3G6!mU)?bR;5wp29C=1!`m;qi9K@ocoMjrbdX-)QrqcKkE) zTCovuok5L*>-bc&LaK$*%vDE*pM#+MdH+zhH>$oVe#Y-lrTyd|a{Z+Dd~D&Uma{pQ zzF}xx3KJ~U2P$qHv1I+pN|M3SBxz}gh!#dYdqzDA@k)-GtLQHqN{(fIXgfrO=0*$& z*)ru9)(YTxR8R{F$ARiMz{2FGC<;Ct_}Mc8>PTqWw$J7Sw{mi69{W z@id^f=5ez(@gkUvef~y<jH=0@zeM{KWTbTwifYuLPRzq=p`ufgp$*m;KZC4zi<34)vNFakv@rBNQLu{^1RAV zcPaT3pK^j>?zzcdaC$vu&hl4z=C62#159;LdOz6sv-dcUh*xkL?E!`G8mLQ-#&2Ug z_hO=Nx9j01t&&~AS*_ogDI~8GB|J~>Dox&v)Vr!?*(|7PF-%c9X3iku>3(D}It8SM zRi=Lfik4O5?|eBL`v;%6F8NTj|KwBq7eC`GkPRVBs#k_kdnax4)?)}L0IwDKp_fUZ6W3K6!kHq;LZgF_G>?8C@;lJxK4i&a#EmjvGTW(-;mu%; za40-{SF-3bEcE*o%rZ%pYDDKV zfZ^}PTYH}#_0Nl@u%$+OFPP5Yqe^#Ou*B9xzLY^9pH>-6!c*(#C!9qdLp7D1+K=`L zZh@8WL1RUUXG*Mk4PMFGOSA66&2p5I@6iW!muGIAOcoXPf}{u|q4pN5J5#5u7_F-- zhG$ixI{Ia`rRLMy>63UJMRV;=^=XuPsHxM+E>Ba7q4w? zP#Xm7ZESB3OHq?05|QlSjzHsa(eQ%Y7%vl{r36=2ioRB+SrM}DIHR+&Qdv)N(l>Uj z+`6OQsnMX9TZg>?_kGcwVfvF=;7E?9J6Rg6zP;t1T0Oeuo>slM<(^)>w&ku(Lq&|; zJj;#CNAvo5FtS2vxQ?dM_-rfAVD-V4dkyjT^9(PDl^G@zXQy=rI|}NUYU`zGsc+Ym z_6gFdtq)Lja09;7!I^x*EV);eHsn)#13$?*MoD#Vdi6W7FvPve`eyX)tF2)KRC&|a zZ7!$oz?j2fZ_Qxla2O?49O6zY&)5}{<5)p>AJG|gF`7OpS=2U$iN+>``wiLJqc$ML zje8l8($V@4u$8TM!er`KLv%6R-rd{+M>dE~BcwJPa-)J;P&vGl>@_~4!HryhPvhEk zuu=OUKMiq34LcW<=G$_Fri)MzAwexDECVT&2*@IAnTs$(5#FQ-f;RON>Y_TFLt0Nr zLqZbNg2H*C8WWJUBkgZ&h-{uhHt0q_2E)>gzF!#_FDlfc?*m@@K1e;C<;G`))L~3^ zmg|aw7WR5n#oAUh$HoHyI!2~bFr6($>Bl7yg;q)y9v3@Tl~xEi7e+%vc^Jv%VSVM{ z&B}wI78II7T98B9KuGh1B&Y?2cPXQz{8-WPhDUF6t6Y?sieg14s0DR-(S1&tf~hCO z)YzhH%dE^T|0wzaGSg)qzu{hqn_K5nn57ivizz`Zs1z;$xtnQ6nLwTuR@8o+5ca;f zZ0|7qP;Kc+(pOvhJp8aE|AN?}Mm;6AHi7KqaFG#9X|Xprx4BI&{SB2q%hJlIpcWJ^ z0jZT%$=->2T50_tP3w!E)|b+>eyFr0qyZBRcVV6HOPx&0b0vBVSv=$Q=V_v-{(Kn{ z=+=KlpN_^?^3J%R8bM0ATsX~1ncxT%>$umk{dDXN;xov#IB8m%2 z=s5*5#p9Vo!op?zG`G!3;0=<%TL>Q&)Pll$#5%T6jK8|ES2ynJ##>#Sg-!;rc3Bsq zoygy_p1;i@r~JK@FZtU-pSbZhK5^(!ex!2Ls_k0>uW|5A28POY#YyKC-8O#*HHz!% ziV6v~d?B$8BnFFX8PZyHL}Su(Dz_Jqfa=J%;hH+~us$7)MV0+1Njn#5R#zg1Vx?lqV98+j=4TF*rTb{q#R>}nFe=KgIA=>H+Hv*%!HDRNI zT2Qz`vetg^{op?@et(?u`yFvuw?1`M=|wTPjnZcPo*S;>hh^Wk09N)BagHZ!1JSDK zw)U|-Uux19e!lDSf7IpwJ$`u_ApcWL~FQgrFNN*IkXx?CmNhni!b9c#RvZea-xa&gUfy zzG|_|gM#*h(-)3;lOs;{fNE=j44(YL&*Ga|kNg@s@77#TZU4u}H(pw{Hw|sysg$To zw&8YY@Jh8eUA4Vgj_iI5Y3STlY3W=6-GOA!alFXSzWmONS+WgP--*l@ipgFAGoLR; zIwz)DF&DQW&g=Fj%ud}*iCMBZ!r!*3?L$aIXue)&E$sIfexmq;y1y__BC>vvGq0Ro zk7C%wLbNvWdksHL<8ZIRg0it%Yd-y@N$#s8cUF?Mx68SUr7jy>>9n%z>)Et2-2`ge zIcBM}1*tOE<3>M<35{KeoQ*-0<6D8YY=kf$-c7-p51RuXban@P_Y7_h;3vc}b$Caj z*Y<;{un<>fkVki#UjgT5%3s(QMz3HA&RME{eS^zPTa7VBv?~PI@_mJhm6`zO(yWd* z7m;)}Gu}<G7zYh5Wt1u&EF1UVa17t>FJ$d0#z)Y07T)Lw8$JKzOr~ z_cWLfiM_JHxGQMBIJ^Z|Avu3Ka}=}G|a*~H=&>QH@g>_{H zpPcWG2;BtxTg`%Z+t4Mp5ZX7ES<+|AnK6}tMd~&%YklW8{tL0ORj3fQRU|mrmUEp1 z`@-2H>iwI}ik@L?`~@=AJLt9F(h>G_78=jcF?JRk&*~F5p626X>a1HxT>;5ONUXQZ z4LrR_AAk}`SJ(mSF?T5S4ckyJcu&L7Cx;(WUq{#}iyUA^6zl@~;MQCu83TQgjpM=X z&VXgJ$>is_Qau@P4wmUsEO1?t{k?9!y%bv-5LiY z{~yKV!Ndz6qN4!tssM)w@L_c?d*!;9J%~~}l%P>TEht>C?uE;lneCqmc82pZ`Do9w z*tsZh=`3e$NpkiYxE(ZY%9O`xmBo0RtpCPJ45_tPHX?Qsl%~mIyhZ@RMPK#Ae8hgtl8u8G~d4=S{VFIfwD)w+&=NiY4d_99BevVMp^l{! zZlC)u_bZ>}+L3U#EFFw;mP`{_GA(6ESS^^TB($@eCgJ0U*>$mmfzm_l46D`#Lr~O6x~=G;1t=F}VPwG=lf39>eRCpS}MUSrv^F zbhADKL$UpC%fSM1^A=+>TLs$E#0Y_g6qJp!x+(nMncQv6^R#)@(?tQFoMq+tW$xFh zxu5cRG;x1V+}Z;`DB0vFgzQfoE|6Fp5H`d%yOvwgLcDCl~2yh?P@-= z$83(Mc=MZR(HE0r6<2%4(r9D^nII~Ab!0B| zDV?Sr4_Dy^TZDMOL6()f>(X^o@nW{Gu|JL?K^38eG-DtVm{Xwia9Iw)yMao{@+6&Rx@jB^L z|BjN97Y28psb#Y*ojJvDqZps5xyL}M#&bs%?v$3*NAlO{@3|*jz^?Sz!O0x1)+>ZV z8kp-{$xs!!v5Rst39J{!+}4|u(AOXpH&Dbe?)mRtNmi@3m84WK>WKs+}sY8vM{AWPgY-)@N5F>|?T@-rQe7 z^d*^|nXhN{p4I%?5#Wp(LjR`gTH8?C*^zQMj$l@TC+O1=u;HdhWWp)-?FgsYw-nCc zYi)z|-T_KX>p*ir3)q1f%p49oD1({9VFzb0b2#jf3}z089h$++0ZiwPnh*R{E`Lh@!z!|?!onc_XZ0Sv=>`~j?+dK=Zd$+B7gch%=y zG}8fc!l-VY2)R_zTS=wQGAR+ah}zO5^cZMrrn;F^ohC|})xJ1Fg>$+STV9$`Mf*fI z6!Q9-m7Fa%B~(cCo9bcuP_IM_i6xy5nby}FL%V)RZB;$LtCfW%pn6~Fdkz0k9i9NPN}snV22R@W(!5oIG=?`bAo>vpRJs-udP{6 zcd5A{OO$d=`Rb9a48^%V_RZSr)0;)9va*{Qt=_Y_0P7J`^(nh!@o&){WK2ER1?TDd zTyYg)%&!M+l!zNeI%?*Ms6w~w7MCI&NBu`M2ErxEq}xH})h(GNzc^2`Xm*t&hX3)n zLcI{wY$MHi@bX*7@U8qBqUK>G>vUp;scbt+q3KDba_h48R8Y9`CeAomHcN=%e8Y4) z-FCOHnCHoKCp17T0}tz4h2jAAkHQ5x`is0Iz1*yGmOMLcUW4rro7c$b;sp50$Lr@E zD&9GYusMP)*bd7x+Q}tESV|t@K(l(5288MK=`E$o>SK4NpkfWn88R|sw)PCGBL&qk z=TPaHz-t_LP>)9_V;bu2ZwL{dhPTtnY73=$BiCiySQAPq!i`yC&C}@p+Xw}F=Csqf zEQE_(=w4Rk=w;FpcWKv5z+}cr1uHwY#|A1LE%=A!YBDb zd1RXE&^d&=vy@g*^_AYj3ad(}E>+rw=iB30kG+l3HMTu1qjXDE)n|XgHl2F;i}hah z%gGhg{E}5vN8)K{P1{l=tM;9aWG$1CMwKz;_B7677HD5_Oh+KoS%cYFEghy$fKh?B zF<3GkKjJI-b{4ZYg7wyK_sUb0fwWsV6%sELMo@E!S}W=5e>za~Qa4fi63uyeXYG%C zx>s%n(&X-yBHrr@@MBsFa90)zqhtd8pSV4dVuB}vqDPs$ZuO*fUBbE6q6FgR%GBBsn=? zXrnUf`FJgMrRaSKtsM`1S)5=m&W~r~p?K-luw*FlQi9j<$!BsIbcVPFPFZ$G`@`QP zm5Y-)wnb{i6dhhs)RlyewUW$$aIzjh6|>P%Jqt|VlGhof-~N~yu%E+J#k!enkGnfM zi8T7xltwzezVd%g^n+mfsl)1tPUCKbC!Edk&LQ2&?Q~yxAQMxX?pIpr#!G*Je3+AI z^-c?Z42DAqgloZfJ`W3#dK;iDJTp6p6MW$rTc@wf}bez0zQ6KL?S> z6!v!H3 zpC_-UKv~nT83Xi3?*l$GC&qg01Kufc_v~t5jCG#}z{2^94kykzYA9M4n}fuGy)%QE z1DN(nRFCxMYw%RSueSue+PbOy&D^@_8cV&H+)hu`c)vWZQ64@ZR@1qCG1}3SSZf+y zg*OsqZw-ZpQ7*29CU;M@$Rl@ow2m}YT}$=w{}+wC^2VCsT1C3NYieeU~Q*12fGsOFObpzK8S{JZ(lZDuP z;bu9}y;Z2$fL300ms2*DW=L*UZ85fe8XWjdlTC7!zIF={xlxwf%D2=wpXM6Z?H4UJ z4e*~7;oJD(RXM?v+i^E8P_wo&T2`p;3O(O6F#0R@%p@x#ckpJ>K1DR~_BQtyl21FJ z<-cQ`|ITs#yWF4AyW72OdiOZs-tc8gJPyB8@3gA)XXW8D1Z_mx{LS~x&w=Fbw4UiK zOZ&F#SsfFrh2$Q>D#c_9Gx+XdEogbV5qA%d?1rg0_zdz%?t?BjN8W~H=lKJzV@B^7 zV~fU=?=?@3=I`KhXXdLW6i=!4St03sW?PbCTeGh@3LC3c%LhP1waQ|)ruoN~?X0K<1R=x(WM0?2Z7s!FlKVpW@kXM$u_wuQIQGokgFsjF`viTAL z&~3)yCFJRSmpPLmrjdo@SDGLW46Pyj&H3=f)nlnDab2}1IUR=6Qw!N*-Icu06t8Jb zWpbsLvdnsLrM8Gw1qWNnE0k?{;FN)64*+w@;SaFWv-*Wq+5Tao%IU!w|L;AarzAhv|Ehu~*r0@lPn6A2@F%t+1ZB?5Uldce z(fTrlo6IGNKHdl{hF3w(1L35G>t@Sz70m>iUE~LBRlN zsa>99<=-uS1#Rlb`Mn~Cv`R?d62F2r^%K4XzbvFSCB53W2?}2Z(7ZAi>pzP1uwn^n zLE$UPrS@*R%ck#Hb_rgUi^h9!sRRXW>c=^HZw_f4A(;dPZR*D)IHYMfBdE)zWVY!y zQhnupfiF;2Tu9k=Q1#r;oVV`A9do1D?rlztG}X7b^s{QF;rHZ0Fy?}oJ)1kUI8MF+ zndF=NRBuu}(fRvO^j+55Ru|rrWAa}u*$Ud!Pk0b2wMP(&)~DUpM?qc>kADZ?0&R3o z9@a|80o5J5(tQl8i&g<^-?iw*Cwm2t;`2VqoYimIcyuiN3w@IMRdwO|i<9qxnmoo& z>Qs`o$N91O%b2|Vu${NX@tU~M`x7}?{5g-GgIim286Cl1$k^=EzOS@717D%<7<%Q0 zTC!bR`kG5`PQEs#d{=bSr`r;&I*pjE(PIUNc@FnmWxBFb8Px#eb%giTiYv~`W{Tkn z@$ru_^OW4gd<~Q4CyBsh=ac*S`Un-XB z>Dh5z@sp=Tq!6Bw`&oXLXq*B^XS2@<_&h)OwMU@4$8*%)e*{eJ{RO@#tE}XsBl92g zt-Z)k_?oJ%rIW?OG*4gcr-Uiq&-fDW=X@0J7kq0k@e{tDi`NxxNqWKZWBhTit<7^G z`3AU4*d|$rnZ6`aYKye?GJa2=Hl=(n`He1FLJu9&U*b=GWf;m=Z07@SA|1|DehpZx zy~4NE*D)rG1_EK|f=EiUHTTm#h3?1?K?B3eBC%3qEBh?J#glDe>g2Gq?1t5S8}Jn9 z`Lx1jxynWIIPG_Nmo1c2T<1fZQ2h1uM7y%-$hbHmIurj~$!F%dG=P$AF^p&p z>&~SdI6T?Kc0$pO4N+3j45I<5^`j$N3 z=4Xh8{;<9-U-cu~Lwu8VTJx1wT>_Nps4}G7bd+DG?o@JVa4G4+C+ljVf2Up;RM)NwKeaPxZVb2if*(&S?R=%}C;6dq9_?gka!SX?)%?xW$W ziZ={`=Qgh1On1U=jTE>WHxN-g^5#>KW6pU{9Qu=vROb^qA=TAC5F+XJOh=~MVlh$C zu!HTIj`ABHO=+>;WKQYjvmX++6H(HTn~Nvr)}Gp%fxU(DukDuh32)V0k(*`e8p1YU z(lzX^u3#&yL#jdg}BpH)F%9ZKCL_MDR`$Y zY*}fmf1}z*leTf4+!NxkEj2+S##Vgos#kau7|3J>`Vn`7JuLnQ!cK&vPohau!{3Fb02fLv-9g6dA@&3E8YT#q7{@WjtM?q^x$hY<+=0(S+{kYaYnyZai zJq}`md8L$5lr1TvgdK47bdIpNjfTp8v@g?swm7#8n5$sg5j9@*a7_#BBPdDreOX_j zIoN_R>9mAr#ARqiiLorz7+bdNVX{*s?I^nsXk1sfUA>fU*&l&Q^On}t->2#nEe>6s z0)ezfjzuIazOQt>CeCp!FWb#`fwx;>JSzlpgFQ^5D?}3!5Q?&Z2*WhJq@p7>7QfTZT zChGdNbeo^ZQQb>aXNszz78D*+(l_Ri_7>7CAqi?h;c+1?&mrw2qz#26s0D@Z3yJkp zONjdl=?y{>)PlkaW#W_kVCY3mwpAv|NaPSnWFulE8}pMZMn_(Q@`U#lmFPa?u#M_X zuIQ~vSg()+eiEGpYOZT1XvXTMy;ipxIbKmgh99gJk5yFI8WQZuDVen>D&!KE^6P3U z3rs?Z9Lo1&lUbKa;Uwj?CE%{8ZWN93g369OE|08Uxrenz1 z{`D#P*CA{ZdK>F%jcu3&o54UP8YsCH!mgB8%a1ay0i7 z&Dp9{f?7~`Qk9Bq%vBv)tU5FYgzyyLcHdI6Gya9DBl!shW60X>B;OKg>}0Nbb{GJXi>B44Tdl@X!A0icb!m(3*&qA+8f~(M%iBpa!F65-RalfB-plb zGNe4cgQ=?2KG5-yKT{D<+_}Qj9u1ck^p)xUlTW$lE+H9%bO*d@e0;)WS^QkP3 zIUM%s3}z08-I2k}0Swzdp9D7BrucKJ4?;T*hl?etk=uN_A%rxYJG1!aaGG~zFmpKU z?hIxQhuxFG%mGYy7&+{Wwxg| z@LMhTp>6oo>K1MI!EN}o>dtNWVZc+-+PWvDX?l}VTs}*vZN~J*^40CwN4BW)-ts5g zaEZ_%k=8HnxCPBvbEk>!g(`IU{p{G3j474!cBPfd#nRa2BWqA)W7K) zqJ1gL9n>HAexXX#S8=udLFGl|R)Hon=wH*F@KU*5s_nhrM9qjG6`)Vn615Q^D(V!X z<^@EBnL^$HByJa(rNcamqdI0{?Q+YdbChUwwu>$oWR11jlClwFjb_BU+Jer-I8Ma6 z+M><{onV}`3fqXO#B8Ua#I&?k`ngCaiJtWf-1q7DHWl%8W}m7zx}&7Io&LNn6cV+F za0WjkI#G;+T0$YwuR}E~#zF0%km%Q;lMJd>P)PJ^P*xc}E?pD5zDa7iJ~>9|$7WZ) zU}s3C)hK?7_I~J&lz(9%!Zx}hHNB^xeDr;CSpMvcn5lo&7^zy0J!++7!-xUG3^z`qi*0ZztS#?@z8Z$PX z9KDq~zO(Y^b^KICF+~!VT?~(0{$$1;hh=byhKHun)hktQ(#T9}{Q~U`wV^is!5pD* z%VA%dSSh@d=)7)LNaoQ1vAl9UF<5%cm#;$$l1*@poB~uHj#2GJv+yKC_K0=|xMLlD z2s_DB$fUpQ4;+@0AIQhO=CBm{JlsP~uFU(TKYrtj7J#Nzin;u!iO)L%bx`eG#&^2P z;cNiCT_mgaZ~VfUC@om5N6e&BNv$qB$3~1Qa1OYs9^0MKMl1Z8o0wOS?^)m92%Nzk zozD|zm;Y6^CL<<3&$OiO(&{lYHJv7_-g1{qY9W+yOHeM7qKl;HBH={SMdBIBL^3uP z{!$wYK3f!yXzAIRzJ@d=f5$}|U7F=@+vxb4eBP=3C#^4cC4X`978qf_;s6!4FSA6h zWPog5SumS&y9vK}FSXDXRkmJf?e`em>JMiaUUjm%%D8SdxULGk1}$mXa{M4^?r!|7 zp`KR4vq+XbdzBWK3eORTN7Fu+Lu&|abD;@pLCw$S z!kY?ztHK4fpzu6oTn>wKnQz_)Limw|RjW5-%_^VM@K4Rn;aGRRv|X`C`5QMNpt#u@ z!L73`BpSw(En%WGZX_rq8p$ol`r)_5;Zy)|Z5U({VqS=ZY@WzYaAl}j{et+?d|_0j z)}GglihJ3K8D^g%oDYKd{AxN_+8rV9NW5oxuGO>9b6yN~xKL3t{9m?$)1GJy{v|E^ z860YGKo#vFIXLCQ!&#pdhZhhg7Qa@NE+R&4D{>H40_v{uP!WnR$u@j?hp&K9Haxb) zqaiD~0_0>n`8uq%(HSh1kF)t8Lj7edFih%9wg+e@JiJP(IWP}==p)l?6}#;L+~&!e zh1>oLol~*{vF1S1dZ(McL+S7irNbK>yzB_lf|JzYXoqYP`!7_&bpO1w$%%KXnqEqZ zwVgm871V;lkG+1;5y$MNp76!2y$(mqpO0*>eNk+)`Plh;(ePhJ|A$W6cb$GBP+UFd zI!b$h{1k$O9#^L!-5enN)S^-!{od4`lmq*u$7qGe7RPQ{pA{O5^hxLcwF98TI-~w& z)feganS)#c`$`5ghr_;_!OY>X2Q!#C9L9YBz4_h~U4wrw`0#6Sw&c;a;m*h?*@d5= z>~=T52!44|oa`!5_YrdG%WTe%4DS5x*wCKBSrF~2WYL50=HkPN!H>HwX2Xbl1xJL8JyqRsK zMR9E}5^E?Y7`4QyyQcf_9hJQ7KC|{N_7&}9U*Or>8gIwV-d?gF-}Hv^8s64WpWx>{ zDuUA)+DkTSj z&`xJ^wBZ)n7*(_}XFt-Z9cMMP(AY~=v!k)MK6U--{PcM332d)^?5k;i>*ZF6Hieb_ z75{`Z{yvI`g|>b5T~#_Ui^+bKKo}mGFA|DBgE4Xr@efcwlP(z!80an)%3(R>;p$%F zG~?T{!q}X~W!hP{z439NXoQy`&GXs=GN4qukWL0or$Ic-;#EjpNk5*!g;G1|O8Rhf zXmS&Y^%r?2H(|fLGH32%ygH|#)ce)W)|$ujJTXEIE;@+xsGpmO>E_$X*n-UQ9NVyrs#>4{-N3_g4ZE#=y)2+6g$XwxY}@fmT+VUB$HM z&aS*&$qymA;3UX34-nxUacwZQP1hOMmirji`#J^(bG$PhGv*JbqK=A=5vw19*IXE7 zI~2FwpYS9{HYOoInYe>8cZCMCIuv79$TS)Jl(%`H*b?@@iaz9Tsxxi=!nff+Jj~Ci z5DmNj2wroQlJDS5`)S_?YU}QQP0gSB*JbOPgH<0o!fjM0TKhMccy|+a z6(Q`-6mU*Q5wlxszQ?BbdY8lPA<(OxWNnJZbTGUzdK|>3P^!ykDM4E)ImDCe>7db_ ztVXvOiG^R#Z8(xm8`(v_9S&=UDeNV}INi2&NLSbu#_Wgp?36$;xs}aUZx~{AO%r|f zuXbjAanyT_kEt5>bj)+8+G8QyXz~~ghm)YmaRK&!+LCDBsU@favL97hz(4OhY~!ox&3Uq6FG#Z^<}Xx;lS zntb0eCjRlnpOf~fJ<*BKKfD#5oIoITaw$V;_wZW@D<@~;#>luB?&RvPCGVZ$>9A|B zWwt|&csjm3wEFnMyxr$sD@jTeSf1X7{!?oaJY#F70%Ym3a39x?d61>2t}+Wy4AkndAW8FIgF%Lt7l z?Nh}BRPSnj2SB#0d02d$rc?yApxQ&gMv*#pDBPxEdN}=*jP%gvOOehBjzGrYaCV6+ z#qN%t3B}%+H@kR_@;k;QZG$ncAKi>+!95aOHv?ey|J_hP+os&)%7pANUxWK#cfszA zm&4y?s6$!6;2vQH4lcdZD=aJW$io{*FG{_009o z%^UF_BbkInq%$W??&vJJwbEFB{Y+QAVEb^#ibnNx;thrbKK&ur!AVg#Mnjmk_e@^% z!!GbRDsJh=3Z^%FoZ{9W1H`Ke97dxVR9SK$eNIn&o}iuO@Ul%m%bUNL(aGW-KQ1l` zcmH$T6D;oIW79>jN>@$7t}6XO z**y!PFnL*3`mKCbe4$RHaGZXA0W1zbQ^-a5nT}j6f@+tG8T@~(;6nJ7e?&liXRqlp z!wTz5QHhi12uY5|nQ$AJg|!k$q2~$8J!qgGz?topts9LJ|77?qWVbXI0Dzfipf%g} zJ?7YD-*7wqv)$dq&H>yfOZbVyPeAjXu4&0qgZvnXFD0c)#8XECB$zY<`-Smg0wiY> zFCBB&jcy~-DUw_AGGPq2=MZ`_+r01O+fyFcdNK&8Wo|?(k9pwhH(;5n%0TZd4d_?S zK%bMH->rnkTOQ@ELk%A8RsVD@L^O%E9=|{^+a*{ltFSG52oIgiJZ^FMFeBMj-t6nE zZ&(^+%u*`dn;nR%@Afe}MjiCp>)p-yqgDPw?XwczGUXGPRrNwGXl+y%jN(v{P^KNx z6!<>X@~_ei=Mku@&Sl=W4?k_9!Rek`fjy#Q%YR~->?Y^_6PfKCX?5}{6dmOFh zza#b2CWKEv?r#O0rgXz=gfa;e2~#P09e=F>AL(4;kK2VNzJcVI^eNpoot=}SCl7+V zYPzlYt&c88^S6lBoekTIs}1^8PcVO%N&TPZ0H-T$W5=&Bk>|fDVdX2!x9mS?f8z{r z3u*mWpoOmwulKe_IbC43){x#>_9aXy>7W7pAJ)Ue+hyzFvfVFB#8-Ohhqrr@2~6gf z{*r!=Q@Bo&=9%9*lNnk6{|i;pm6?-1u#*44PwUR`HDeA_Zbue18{IMM{4S)~80AO# ze10u>sfOoga}kTR^V=~Qs|(cdbW`);9Ga7!Ub~pgFVh`0B~?f+@B~}_3&;5{8t1=w zod1$>{!7RC-#yNM**O1u#`!OIf5vC_ZSi-7hhuZw_%9|`8UTHM`IDc7Sdb2w~e1~UgRbj>AOTG?dUEO)pk@qs`K-uN+5(Eff=G1ZR! zy(glg0w!Qw7luvOwu^ysm(Cy_ntTE3GdEtSwja;72!n?hu{caqQgN8BkI#eSXc)XR zt*yR~oN*g($c6Uk}Y-Rg;Gbf?3;W{AN=YNKvv!G); zJeA>(<6Vs{J*c#BGlh&{tdv{~&kNMW4^&sGwoMU-gMP5>o^qH9Y{b|pCm*Kz%^6F? zEEJXoc(Lhf@-c@+-Wrew@+4Q6<{oTiw@HjaZmk-vo-%KGUSpNZQ*$bBaw>Fhv*0!k&%I%GC*3xa7BLie_7KF3xLJS%-~1+;-U5 z(_Nbqb=j$Imme~%+>!MAyL?RkGGm~bFzoBH>q}{Z5i7PD z?(1@GXxhP^$cWd?ChVG>GhH4{_;BVvBiioH%pIZ+e?4<=7~TIvAH(Tqqo;lu?Wp<3 z^yaTrtX4La57l3)y7ZlMp?22{FfJ^6K3Ps~9a z>dq?}%p4B;O$IXuux!n@RBf^TCxUb9#qV+1jdh!#tlQWk=VWCK>&3Ij#kFqU4VCBcV1U^!cGp2)pP*kF-eNfv~SWgW+sGt?}kHL}BBNIpBx-{CWm6 zhr|As!OY>Xzh^LW0Aro=DzI#U+_Hp!U?-dBw=@ct?Pb- zg$FAyb_$b2#?UQC+7BD`w6$TWvGlTgRQ>#$i*__cT+qbZ#RX198CeQh>?9?%rSSV;C^F4#5H7VR*fK zbq}Nt@e4_d5#SJBXfcSiiDzA!uXmb-1v? zpGex~p3dk%IJdPB(;b(vl5lLk*z4u#9{2QU)`D!EH9dM5$`_doO!~>CFlSU*rd)=5 zfhKU-^hC1AC&5~;;4v(n)+^~I&W(teakaF?l^#sDDA)nMJ+$+Up6K|qva;{CwalgPhRIpaV2K-^ef)XMf?4Vu78jfSk$ z(lwFy2k%xMbN#`w;Hj_iHt9H*38&cZGuDLj9>?j(`jxRbWjiOo9Gw6198D1kS!L#i z2RXoQh_W;O7(f*J{Q?0KVx)G6c_;hhLfHYqjt`J1@9O z;RU@utV&3)#VLz%h_MoPV0v~GR@Fz=F2|vLGH(URwRkzJ@ZKbor`PZInjFT|?31{XQK~DzId)T>WmgNR6%EXPAUM|9$qZ@%xm&T&2Vsep;bW#qkQI&cG`a zSyzSXvMiC-`J7z2B)B8twji>NW`M$t7=tN;tw;(_K(a zhf-WQ+qi^j%94i3*$!*bIjKcQ(~J~X&Ni;*tJ*u$ADLAqG7*gO!bWX#Co!h}UoAOJ zwu3eeNTE6oN0aw!z^R?Fl}3m{;~hFOFE$R>hZFQ8^o<*b@!^KQ1+FS3;MP8ZAUaBQ zA%vPy&Dx!4UMresrZkTdkz(U$eV}=azH#G7KG3wlRi(3XG=(sR=EUer(0o5M|4SQ8 zD^z%GhH|pT21o_XEE}c`(3;28uy?ECc^kEHf=2_$BRVi@%YIDgFU0s2W}U*tT{Pf; zVJU6ecz1tJiy@E)*HYJVJcbyOn$(-AOD!X zoCCjhU%qZMVSVq*?fr*GNhQ>c@(yu04~J&FMni2#>z)eV4=SwzrXNa-fUF%KMwtGx z?Y0I1JXCiBLJv2JSnXqSe%zcNm-8lbenQS$%&EJq;o`RQ(zf#>I9qew7|JFibC4!- zD`YTpIINh#%;B((3}z08l`@z)99GU?=5SbN1~Z4lx-ytK99GF-=5Sbd1~Z4ldNP7A7vIF zhfl~!E1SDuU(lRV6O(kU$cH&T6RY$=;}E97%RErrkXDJ9DZua2;^i%m=> zk>ng0iKwFBEZaQzYm_LjPmI|#A()ol<_tG=jDsm9?mFg&6y!}aKo z@5wyV*#tNKiqRo_uUCC(VyUoIAHD`=jV-#$sGt@U4xs*|Hwe&$X->sN)tSA-=8RnYZz{gsW);+etg1gYli%c~b$oIJve%Z_YEjw5cNxn3@@hgyjVYC)D5s_$P> z&>X}ceoL$1wpjZp?y}aH$GpuIKT}f&HP&*KW!YL_B-;3JA3yX?&r~w|Q7en}a~yoD zB`!gm`U(3`7R?QENZ%HctyToJAX}}p?ch}k&6&9f{|{|%0wz~c^>N?a?&)o2l1yft zNeGaHC0r&10tn1ZASNQ9AV@?pfZ_`X2%;Cei7dmk1Gs?(L_~I#O+-{gkWFRZ7YQiJ z78b{+wX-;r>Pfv6mAl@zXu;^;}2=}>ow_qu4@pbU#;7q0#6@8i*xb-q_bey}_ zmHPy_jWZSESpqQJ<~b)X#IqZKLOe(A6Fud6a(~g?>&v~u-5bb#in}+I`&4(&mHRYz zZzT8W?vCU>!`&OpeU`iD$$g%?HKrQzXHg`N8+@rjLyUzP@kRYT6ck?_5pP*K`kiy3w07b4}!FgWmjn@>iZkiaX$VY zqo^`48-F4GK5hwbV$2f2AKziWJBk3cSTc?uS#unxW2zWzF_@024wEl^Q)9~J!{!z9 z=q+#twElamOJJMv`CGpJ*i~{;kmfrW z^z54EJ1uyfvYc=EYVxgJ0mkTu{8R>(5P~|@m7a&R)jKGx7O17@$I3z5-MJ2lc4DCM zqPnJ&F`0tkDiF-S+OM$$t9v=XO|G%zVw9RH^*Na)xmz^+hy}J0wV>#4M2fEg);XZ_)N*_+ZoA8K9ggUFe#(Ah;8`Pb%t?r~wWMpohQYLLg2@ai zY$|LRY`C-6ldRXh@4!Ii<(%X0VD9q{*ZJ|+fnA{Smv0M)8I<|xA;^pV4m~Jm2w)?- zP+vb&f_qhhA4AiqpcWMW1n=BJj-~zegyy41_#F~|%14jNsYAI!^dfjOJEXH3{D~b> zKGmZ5DX35`RD%|z?V!#KB_@wO9yAxKFZ)D7QG&%|W0r`AfSu$!caREQ9nKA{EK1dWPPCGFzh!y-w-Ra}mn^9MvF;jTCFk z0u0iWNu=t-@KCoC=$f;}+p5nupp9~*^_hOZ;u*U3oR)F!ukOe)!t2TPPr0+Lnu>0x z=9Dk#e}SLgU`T z`X}*gcM!!A+^Gb2DZ#72=O$z0Yq{z#7o^3vm3*#0oH8l;6}e)5HuIw#TP*QYq1t&jk3-JjCq9NURcDR$ZY=L+jnM7oZPE=V;NBv#LnOFT1-S=WLJ}!)pG#V*CR-=+sG^&e>FBH(K2! z3A+MppY>VO@+3f$CtOgTVUJp~B>oj$cHdY(}A{7ls&s0Bs;rh2-Ic|+G#>~Erbz|jqlMHgkzt!khXw5}gVS1Juk z!K-ce=rN)Uin(`{`c@$940%Ys+9_ zzel^}X7$HhD`NP*WwBN>UOVg;tTHn|S9~2+V1-_2{CX@L1^bFk%swYB3Zn;UvIzZ^d77}-n-WA- zItRsMeMY16y`1*xgV$QGX_Vi?en1$!VNBT0i6FN2SxppA)1cCu8Sba6n(WjZ-~~1> zg_*A4KF5+Og_IHLNSu=Y04?R3TQFsSFv!KOx!H6o0{>kdH-3()dxjw&iTZ(=OF3fB^NAk|1J${f{ z&{z*N?D>8{1L}+owJu#gGz;-%vr`lQinPRFIa8Vc@I+cy#pp%wx+Ye!9Q_?nF*+T3 z&6I%ZLe~C$&AKSqs^+>;TDPgUT}>IP+x#GRIQq=GwdnajVg&a@kMgx)TZ|vW>0?4{ z!2M`6dmFqxIEqnx4Y+Dgk|EcH)lGEoTeqm9=c$yKo5}?MCNo&1D+pYn6~F`s7K2-= z0+`_7Z=i{}n<;<^4g}cHR1dk((~Pprqexom)Uh^a2$^3<@^b7wn6bk zE{xH8j94VAtZ4n^GMNCk@pnfU&j(d~69#U2n zll$bd^axUCJ>00YH-zvRAr#btqP!3?$t3jDL%+gl%sIJBkO=hONy9K7_+8fPjJI4z z4sezF=9x@*61Y(NwK5UZf}-E3a0xH%3Qnf}u2&z3UWOp{kD~xkz0{m#Hk2NP$1opj zax2DMQ=(VAM9hxyEWii-^$;<%9dTV=`B6rdYi&xN%gU|EKgYdbm&!6fK*136CiHdK zdjLO%K6~6UjGu-04Db0ZUSoX}JhApP=qzV#_*2?vb?0e5H2p+)KEU2>V%kwvV@Kh) z#SIx`H0tRt+&?9K?RR8JEKL}N=v97UF_MxtJPL_FNj(foTH-OyU*96rGLzIY?~<@j zPz#EFOZOg&Mnb~`Qi$5rpR~k_uB4I*^(`~#LZSOTq>Tz{K~X`yNgbuVSo;G($2cv~ zD-dYBcqY0=H-qm6wZDy+_&Jqs;41(N@gH%wyC8fz>;Y2_+Qr*xLFa&!h0AtY;8)aj zVBltZwPWzs|6rr_HD7VHMhu?It9{H-ia+)qE96%U#a~+Vv&E!+OTmF;e3QyNXhN3dJ5x=Ja-@PSz7S%jg#2y4-R3 zRC`$_P9<0Zwp$fv8;=t|z;}ZD1or&is`M_oik?@dTMN+S3FScU+k|roAu5BNn%Nw^ z$P=rdMK=E~P7?bXsKfT?w=3{pSGw&A0*@@ed}+9_NYfr5b`lYPi6sQ_7aM)cNn#efi4@_N~KNdX*XGm=y3xI zm^3ytJm*NVzW4x0a51al$;HCv+t!AB(``cDO__7ccNt?7at4vd+l1ttTd1q&Q9>uq zFVTF2oK#Qr4WqDo!8#_}yhn9unR`Os^&oi|75S~Hav1|rC*OE7Ke(sJJ=NV^a!+%2 zS?-FvyX97`d7G{~eN^?RzPf$d7tG=Gyd#B~!(lt5FmpI;#}sA`hwYTY%;B(irZ96j zj9J-W^nu4z8z@O*YlVdenFUUWawV5yUf12ib<-jl{Lho{>; zg_*-)OH-IR9QNK6W)6q#k;2U3u=k}fb2#k%Da;%W+cSlk!(kkMdfl7DVarmOIUKfE z3Nwep_D*5uaM(U6%p4B;UF(S+#*ZI%9{Fxq`=qCaTkmOzgr z$nKc`4-VT*iuQxJc8A~ZL7TI7BTF7F;jx(=eK5tBTqu;k_BTyx_V#IHxSlWz1!gPR z{MvH~_ZFdtKRGU3n(W!|rxO2=$H!vL(*{9@Op40r*{l;BjqCy)8T8IWUVKtJ4(>}9 z?p)52GPI}1-G7Aq@fYS5G^3jA3YH7tii%-d2!i^Yv;3U2rh-;1Q>HR?*Oh*h8t;V%g1i10hB4+yd zsHSY*G4KxHeghDZ*a4&pBg{q?LPSk(@MR63UIy%HtIdPD4i_?wwHDde2{{PZ>~yd+ zqB;u8$QDObOy))vKl(5~{k~23P;;B016uD0SP|nUrYd8sJu$VHuQ8tvHtBF%wx7$H z=z_{SP^ce+u%wc0(zL@bosEB%v=7jBwZGGGD#__9>*ra=a^@hG%W~@|Fw|ZoJSuAY zRN{x@j*mcjD(yH{FFZ0KhtDID{-i>#?&Zdqtj{c6RVH9= zzGvwwi?Mr;ouH6bvNir@%m~W#;7N?3oR$?@``gBVurYlsXI(6r-{M!OBjOhA&0ygP z<9`AQ>j!0OxUL$0RW&TA1w|cDUOzY!>C=kznj#5mK~X1>YCkjXpf*?(#{VLM)r(}{ zJG(!O{|&U(NwxG#Pv0-)eGYtdLY-}Dhw`A>jdf`u`ho=rA3DtzH=n@H_OfGN;}A$l zt^+r3;laT_3f$hHmct&upsG&-VS41iy|`@M$6r!r<6tWUldd$|;NT(XLI-PDIoc(F zf}Km|?S^zi7MnBsk3WC&xXmXcD7W`nw_EfJm3{b7a#-^os-SOnKl0&mX|wku|5Msu zTH23In6IF3mM^D+(A-R$&G$d0eZ$F|LGxVV+l(zOdg8(zl*P={dKeZ1tDMokE*=iR{Nn|zQh3YpD7}}2o*Dh*? zNUg!N7(8TSZKW;E$S0xQhek3c{`1|{OUTAIV-wz8Jr}Cjmwi*8d~~KhY|qZtH;m5W zv;6n4l99ueac^`H0Gm%3v#iCcKy7bq4$2R#mcq>8up?5KIe>9zH3pX6S(QaP!y};Z zgJ*e~#vGpJ6PYxPd#(Z|X+D*vF^A(hGKHA~SbC>*mD(zEhwai#+0r;qDo*AO+t@hm z#tWWOoah|Ym{piv7_p13vZ{xeRTs^^FT@ic zf<#02OC7W4QVgT>lqmX!V#xGOq`Jt%hudnpqta0dql*=$TdSqM_*i{12usmrgxb8J z_X19YmS>>lzrL&bT~ashs_sVWRMu@`MJF}qcUA3_H9DUJz0q)E(Sl?5fr zTus+2*}JPzfF^M8>qea=_egakHod!g7Nn#KqvNxb%+D*#vMlx`>9tD5aK(Hokkz(o zZEy$BgbB@`YS5gy$;v9rs@^d9y;fS#uF~EK0<2p_H}gey;K1+6QyARe@LCqTWU?4- zWZ{>VER8H1W^+OOD-u(T$_5=iE(+e7&FE@*lKG}D_&k~XhWcvUiS;`9WFtT7gtCvx z$7_OZwsO$DWEEu04Z>XfeL!jb9NR!fn{q353^Kp53zAzJbj@7w-axCGXRRGoi@8{P zkZ3aNi-^-iR4%P@bFK(HMc}FY@J6J?jvk`HqAr1Tp%$H42mfLWxU&%Rl5=I~L8_n_ zPm=QvoTWIFQy1FG?)(AHBrCgbqW+ptG>trlX3Ot++NBmP(RfBfnaMwRIR2!aG!WH- z(N?T}hGr4ag?&uvP!cU(GS!RIqv61ms^vlCQ9M3=7{L0U@OEqip$#?lG;rxMtS-4w#Ea{Z#TWMif&CX z$}bj5Ow~;q8{OrkP-nt_(09>uV%|&UIUq(gtuv~~H+f9KCua&iC82#vmqV);pV?3`lwhgPPP}{LlCtfL z+Li64o^9vq-by3eRmMezHEr6J@6ept1!>OCyEC09K8B5^Z7&iQYWL5d=wI>?`WRWG zxE6esFUm*3WWM?nyqh28wv2BU{t5j10e@f|d$N#UBbVOlJ+$8u4u-|GPu(8v- z-3;JuHcWcA)8P@bn1)a9qQi)oq1zQ5hjb>Afm+`-)gF7Yiq0eUGd)^HSDLW`3^FsG zbnnuV~O zOF6LT{aF&!rhoz|$5cLZZB2j-RErXy!O2_a3F=qB7tc=b#a~5?23;Qh2Zd{`qo; zjo8s!=uY*c;AyF3=N<)h6ErHQ1=Wwvgx{<19)$~PK~XPAu$Lvw_bK?Fl%jr2Cei(Z z_9~H}7Nl2A=8@oM3hEOn+?$?PAI_wDKta=$N>B@mP`N@+lbh~VJ=YSWt5`owt%st< zJZ3o$F%eA?$<`OV{WhQGBqv>|76F1i{qc{_$NDl9~%iGw+i9?dZf{>ySuu&=-FLeW4d-%m#<69 zz7S3H33dp#JSvn}jrr-z;X5C3xA+JwBlxq%)#sCObvTXTbr#R0?a&MUf|%0UYGM>p znz~DqgDPqNLRvW8iNs-7l!(@B0l5y5Z2{R)^0gncTTtpRHe%V5Xr4NfohEM zK+(<=9VHZ1o4`dB31xJ?y;plZOIL+`)0C|oCBmB$!WI~$D}mP5w;gF zVIKy^L8`0M+e}`zj;E>Ili`}~<|%N^$QC8tx0$Vqo76zQdC$d9v$7W79n{sPG@qD! zd~xJ^0EzTr$g{P2=_*Y3wDD6U#p@$4q420iWx`rzYNKoHq6*`Lw#Owi@2As(?Qy@T zewv^-zL7a+sy?=OT+}7k7btVFEVmz+R?kK>#$X~$qQxXk&M{#U!zE#IjtP@!FbR{h874V8EY|*fIXtqVg$W_V4iWLQ6zvZb@|O3>71Y3dWyg5ufYrk3Xr?+-_s z`)YH5^&@+W*Ta#@-sXt53J*^;WaGZy)yyWDTy1?zB^$iCcmv!%#ashIN&Y3PGqB>u z8zym6yNj==j)p%6RT+8re7Bb`D00}A_VWKZF0IL7|3g}xImnK6^b5#?Hu-am@#taq zORhI;JwStQH<~<=qaJWeDkV*HSRQVOO*w2h9#X?${r1I|gPwDV6YxYAA-A-9F42X! z?2s@VRtQU#U#iB>W(^nrOL-^oXoa1RdS93kJP9qYS~)*Us=*V3U^#K+=H-oyqiyZ+1No2Et>mx%qIRgNx--xcOb~J+I0^%-5!DlV9I-cWz1hVe4O&O z9bqPU?FpieD99twRelYcT0bPkKUYyK9pGmKo+t3b4RBw)vf(B_)vNRwgieK2{w&{v z*XUFEcoWhd@orOUa$4j4K}iPIWj=yiX@o=R)N%CZv?6d+&R1A(H@BJ5Pa0Hd4)TGW z@LG*#7{IXe@3d}iy_I3LDTu6YrUd^0|G(7Vz3P^z>K>#(Lpom%pw>U%)%W=h&?x1!z5y_7uw zRksg=!*kJJL1a#|lpEhhgi`g+%aicpgyEfGyazPe&DL`D5RkP+&x6NOX9`u0*QXG& zccw0ay|>N14peWlzi|fZrhiipwNn=Q{_+^D!n{&cXYmFkkGCLEdp`OAEW?atbkx2~ z^v-f&WSHm!Yy^XH$xLUA9INHoO11Sw`^H%ik=glW_KnInYU~?(SL%vxCgzq#~EekLTG&F9Jq2v0C+mD5%5Eo(8_NSH7zG0#-MB;@2| zf3fR%lvk;juafj`t{u7iGr2=IuTHe0$Cx|l?eF6K@Fnc8^|vek(lUwp7lNsn!qFVB zRqUR?unptN()iV`d*FXv?Rsj`t|QdXf6=aAN!qne^nn*ZmbUAs0sLRuRr&shc6rlw zRlffr{eRJ}(Z)21ma-=wVlQ-|t8$_GXm_zio3y2x>SNlZr=J_2W7% zys~NuxVrPc%h|8FFgJ~UTSdg*gRLfN{U2mDPSyHVRWJ)~B3F)a-aHjl{C(mR!4mlT zr0xYXgZn7o8_n`u-YAcRbg}|BnFqI`b}e3w1Lo>q$gt19LuYMkM&ziV78Lbs;7Co{ zS!S+&VkW_hjRb;PP%}Y0XT_UvYBRJRd0TEg+clmM8)}70bGxT?XGhG^?CeFO9RZ6brq1$&Tw7wwJt zmiFStiLjSJm$sz5UlP4FLA3G`-!VGy#3e}*_wOi zdoVM^NBjQc?A*$Gl^WJtiCDZ>{1ME2+Y!uwVWj=1%($>WuW{UG@4xF}6*Nw}QJ{(>F(u}O&{r;w(pvVeZzUkLCF0IK5 z{>!ulOMCLzeCNB2LeMvpQ546e&B`cRrDacf3TRE=$sE+3^fo03EP*dK@vD3;*kH^b zLeKCw;vQiYAtQ8%;b;Lddf#76Gy5!MaMeyv=8O}VClXP|r%7Kskp6N^^18u!4FGQ? zs59-;ShFCR&AYI($lD>hT%Jf~M~>IT<6+Ti+LvkPYnpZrX9L)gE5+Ys=E<>%4I#|M zAll03+TtHV^r|`PFQxc%5lMMz`45tM_XHZ{drnr1_|f+E?i|lldm9)6i><`7Jm}V5{Q0;r(a!lh}!BW;8;qcjz9KVBFsh^uE;YKRq4yr3bEhyTOnE-?uYqP;y(bz=~*>WpH z>ye`Q(%gK2iK!Z@iPD67J>pxE&M5?Hd=j5Nt=fPQ}gj8Ufrhm1wyT zzf%P|FH@jM1$vhXB&Y>NZ&iUZ_Oy!jHtJ-Li5N} z(O`ITyfeM42-cRHyAQ`T?)giOt1Wt0BW^y4Ym%h8Mnvr$yd;%Sgm`l|5Yf@z!^ia; zG;ir#Xqw?rH&TAP6K+=8@+Qu8OiKZR$>LyHLzujuFOqSs4Jcls#4nulz}XGX+8GNa z+sTi7-qz^RhD3u)o(VKl8C>~D?hUA4zMHf?q~(nBEaG9}Bk33;UjRvQSigf>G`KU~ zL!=C8Ba1r6*(qj}0#wmSg{fbDJ@i}Y?<4+*iV=Fj-Y>tJESZau1xw#6V4K;wlGLZ^%kQuo^OTD5_F0PY82&yl%TX) zl~Zw8k&GaBX6z0i*9dv_bJmBPCfM7Ox{fV7T+17u^9yRgO~#_m@2!Y2pTxM z=S6nh(c9n+@gcbUP8JWj;O^wsy#jj>40q?*n%d=%?zXZSTB62ffpwWwLKZ3qk>vcv^7!N2Mz^ArlvY-7t$o1 zC95yVNZeBEw=%f4P3vw{(7JxC7U^FXk+${$vWd14@--_UjJlcai_v^)y?#js>2^Xo zk2)U})PkaIh!ny8#pkTu_YRg`=5?WS2dT8^FC4bIU?-E-#Q?~dKDHFjWl&SU0Gz$? zfTq1L61X|4AsMuOJ$6LI~_wNuDw68u`$;GLe=j z(mu*sPz#C{Dr?rn^IAN|o3u$su>U90{@G@W?X{sTXM9w9xEa*Ngxx+#Ukp0B(>5*I z+rjIoY}WtSw3zAR4?Lxjfr@`JIuaiJv}uSwmh&ul^J zb;0kiQZ9sXx!MGp3)SWLP+Z`ZZ)PV`TzJ+T_T=F>9J5;BIPSl~(PnzLv%yijcp-Cr z*yJ|Y+mCKzjX82EEUri-IPwSCeUoNm|aRoQ1yQDz;u&{zHB&8d4-1r~nw^-r-|YjEM5 zwWLkg(GJQf2=*sjn&-J#7OKYtvHmET&e-~@3)_Psu-}Pv%uwGYkB}u>v?1Jmzfh~UaO89vu)!agr_^$%W{>Bv0Exd$NrPpKEog zD_4~^90K~}W&H7U#-z}_21?<0*FEeoT=z~VM|hhsXJG3Nr^V`i+VZ|A4}HpD3Gst&OZL4uuZih9)m4nb8tj zUjhDG`+#WG)&69k*&85M47vp81 ziz|dC58oA|PvC(^T??|>esr*CI~X;9>jcYR#F6azjc9KKSRcY)G`c1fEOLgkE1D{mg*E~Gk> zxx=kO>FSXeS8{_fX3=<{K_xB5AGF`S`Hc=DyR;r>E?6sg5R@CM9fsATbMZ$sy1dqN zac@epH(;(WzG`8k(&B@_2k%DLt&Kg)0m81Uc!i>=ly$2&*;C|Cb!rlmg##kG}MeF$nn zwxNuc(9R=glc07G6t?H$*VyKF3`qI66l2o3(pfC`#0L|WtfrrvXfgR=&|`Up-@>qv z#UCYs3@Sis7#}QxCqZ!ih73v721$ZiQ1o`Fq09bwA=DlMifDTPto&+XgWgq#3UUR)PkZN z$gzG?Cem_6I$V(iwV-H6A}yVq-`&TJ#2vC_qzdUS*5<*gbyn48GMzS)xz*N|_SVLP zgwt2#b)>FS4^MKD{9Wa~u2SNvJ);^lc4{o8EuJnKxD;OLt`y@>LJN1VH~`k&tEzk* z;k1sZhAVF)Cm%OPjslJ#Ao@5s&CJ={u1XR)##BVb4nV-OoJjL8Z`{awcjIc*WRAib zWo7hqcdp_{0E&xaNbG~eC%QV>Gb|=B*d>^An6EFx;H6-}25!d!=~*~$Anbv`p_lQ- zqMOXmatVE5 zp>Sp8lC8blJ>32$d zF|_dr>sy;d!@d#CD|X=$k&)cVRDAhDs=|gtyf(PKk>jIiC)RT6+^`?u(c9QOSpCTM zBTr}rn?XXBeZ2imoSWZOMN`V!>YF)uY+v8ah@FphXz}m8;CUA zI|PSak?s@QZEcSzm$_HVqrUhGRcp?8PR`dTpQR-VwseW!2|dhN>6-L1@NG`oyk57M z*SB~({NBTMZuCrzB7YTG8$!G6U6{_(+$69LbV24~ZDLzzmqy~T7ZfdVak`lr%-3(t z)ZJ04JDVH@wV-G}$vmi_O7kWx_%5f6giE<~fkWnsr_XG8jAOSDr{gq@2%W3lKaoTlhJi?ZL5mfalC3GB`k zW)5IF|4=EnCO=)Z2%{6gB*X7*blj^@J_pdruse*#;wtvadBIqm9zPIUO`g^I_(H-LkUXU7>R3qEqzAN9XFpM*B>C`ywsz!`f%aI{KQ0w2j=Ow$nJH z9q&!s(H!6gc3%oJ2eAHdSZNq1jXrUI8pj;OVITVy@K3al{aG5<9G=GmDa;%WTbaVl z;jjl&m^pxH+-Wkx5T3@}#pH<$-Zpn=NHF-$05YgqDI8W^=L+#>DLiY}vlJjpS6C>B zFTf)c)yY^XnEouPBJ?F8FzrDqGmBn3h;Uf##o3*3_G+iDdfY9HPA5^W&)009Q-0}q zSO`uZ4<{?ixbe_svfXVh-!Bo~7yX#g;`es5GeyGVA0qQ~t9uF2oyQAW*H4DW`#P;L zH+2SQLH%~*lg>>#tMs|)oC$OEDJhwtnoFT%N;4shRTe! z<7Qiw15O}=MVUIeoZK4bmeVz8Qnr~3HVs%21aGtWYKHjp)PHszl`NjDJH%fgurhD} zITYd(al@#_S3HYHZcCj+AlIg?OnASDxBiPv$u4b_Oi&BTl+17TC!FQ<2{?;&B%`Kt z;G5~ zg0@cVt4qd(t&=tmmVZ6n<6ILQv$?-Li7m%-$SW6XDa2;>GG*L2P48!n7K6oXxXDSzp+4 z$M-sJN2CzltO^r<)VgcaG5Kes$Hzd6zswf>kR)Mr6~FOpjuw(Jev+39{iR`|CWaG3 zi_DVX6=f5=MjyCMsn;mfW0^wTMGP;LpmqHug+fP4b(iGPADk3MR}(qfm2S8uakGp# z=^|*${&v+tF1nTY9E=o!6yk%SwE1>H!QT7a-s6eP`r{d@?iN)mU@)VCT2Qo`R>tq) zhgD@87}1aJ?PuaS5WGv1c}IQyNWu_)D}Ujwqj?cN3%f?80M3>L9kdbF`-Qm26gX_uzsp&YD7p#IWol!>uAw0bioZR*w57(=SN z9VV!|Lo#*8eMu{r)dl@Q`YfB1Zb#D9Zd#}s&y9RTdy;VE>wG-_SpA#r$jwBsl3RJR zb4YF&S}%h^c))$z5V!3 z!B>p-;XK3+5`6si1{ad>orcFAq4^*y{Gn3~nYK@}HvJNf0-hNHFqEwSm9f@^q$e{hmtpcdG@h>nB3JRI<@q)kgM| z^v`u7pY$o-O;Pu-*9kLE9yV;HACs{4mm8~PI?DT~mt;JvpJgXq5$F$hci(=p^0F&y8tMA~~1Ck&8swuzvknBJ~KjF1-}Q{T^gFLEYWss7vR7T%eWI zyM_0j1n-BGDa~5*`n>;iovuQsoW=T`T?L} zaBaePh|Kodw&piu9%g$@@=k98v$ZzF2*GcSA=_(-S?gaYZ}~Ih&+QHE294-a^LlQ@ zZDiXxshE5>=Yxg;ya$E1ZB*}y%fJtl{!OO3{;2A*2jB&@AR9>P9~$fXCOweHpm={m zEXAzF!h7ncDZ!mNI`I3{!s4Ylv-?3(HqOsxa`}^TF#(dG7UZWZ?7;VVS@5FT+aJ?V$yFYgD}?&^0d_tBLgrofDOq)NtUQj|kaVdbOZPGfB)`K=E2 zP=0T;7;%?9%_SXU`9Mr~Df!gSpq_Oeb|&A#%5y2I-?b=#e&j5GIY!Odd~2LPNE~;L z+~@KWaR*)(lFt+1>jHcjKzq>%V8_FGB~ZIqQZg!N0G~TLg5Qz%_2KmFV{<}=?{)>9I2|NY0py+?p zzWec`{!KcQXR@!kkGNyj59+JZDcXa2pV3fmQKh8HEgxAobx*f;armf4Or!1EF!vP% z?^7RL{s-!h#fjgP;vC_Dy9|k`VEo$qAy$$CZFNr46p@rZ3!GXPe27-Z;zL5{a zBlk4?PdWbC0Fp;Bbl8=c@G-#)*~WV+SH`C;t&-)E<;?@H4qTdEV`}96fkxiG*7tr{ zFdO8{2-6djN-Yf%1T3$LZpGO#1+o}*sLPL*A}`p>aMm7JD0PJV$hVoVLKm(z#i7Z} z^}e5^Ggom~@sdZTN|df|YTLjze9bNZYryXB14n&Q zw6e&hUnl)e>v5Lt%cv-;96Fg@q;8CbN&tHaK1iC{gOp7BhD+7z%YRE7u)Wc2&S}43 z#rP=D#Fvn##Tn>rhMCZ;85Fj(kJnL}$mrcl<2;R7px2m^ai7F)p7Q?>_uQRnqh#V& z3b|28>zIAK|Bao#^ejrw$zL<7At&LBoY#&y?cs%JB*U|=swvp@fnVcWF-o9-kKjw>2_+KPv zZheBt&7lNfl>pzR8lnT}rvRQ5;Cljm!~stU@O=Re1W^BDro_D}@#O@K3Ti>oLEhaH zUYoOf9RDLap9YVr{wGe*6ElsVXN280QU{YT`lzLLUYQT3QO5m9tGRhzB@e%ZQ|8IE z(Z+>fF>&@MP9n0>J@aH3E`N?OlASz8j2~IwU(-BFmOmc=z8>;xNv;~qO@1?;w1G|vbVtwQrZ@M z@HkAXqN8f3U@apcZ7Or7VrHq^g33^*?9gPjAE*)Pj7mkuX?q z6Tj1WFm=LNA^pQQe0GZ|OxoB^^cz)bMjNzTu)l(kd70iX7eiU4_U(@p{8Yw@e zL*}AG!OZi=ALC=UZ~dAS(-4b8)C+zMEPPz&;%%E!Uk=^91(UZ$@7!C3nZglYv?7`XvT zyU?#fZH@d!ZZvNR@0If2gty#P7#7&pcJWn!yBO2Yf}uI;x%QvOkR5_OR+xRuG!uF; zw)kq>kP62><0+c9AMKa4-g2gAd5G%mw^nbtk(tn)2jz`*v3AlFf@I!<2utna=pfRR^}Auq^{yr{*qY?7qXc4(-L9Zyc^6 zZ_%9c&^>W~Lby^(by{$0K)OPbpDwaO)?l7GscncwQ;@5_kg1-v8#OGb1^I?|66Wq2 z`5eT!ij|KoCqp~kZ0w@d)}hZ{xfzSycR2OapX*zEfx_y4%VfBYGQ5^@j0$Q&(I<&r z|9d9Vx{7q2A_;0iQB{#%%tV^ih$N^5MKvO^hC4!WU&_Rtt+>X#1ht?HGs;b0EUm7v z{&FVC93{D4Gze-z(Q@JaM<&vGiu7Ye64ZjCPZ0@bbEM+Fl8L*1g9bq@C__W_W0D-q zXM7#w_1@fz`JRk>2|ppD_^14+4~!2__k8KzZMXv#5OYPzX9=9 z?FP?8{fvBXRK7PQ`KJDx$I-EO7KxD7Zm}4|zg6jP8y8<|@(yS@T>VOKX%^zMQ(X#; zNrioqus+Shg=j9dXLIz-L zayL*Q-aR5)3g0zu-?Y0EW8rDjr2!b z-NoNfzmpsat`N-!yX~^rvTdS5CCwFGhi3u>jkL_~C;c&o&ysPVM=z|{MT4;5EvF{( zo;OdK6|7Sjz^{X#P)708?FydSZHsPlqwx!?mrlE@KAfSOr7yhKdQ^1ngd}J`KE=udC-TLma|Eqkcz4!vEGF_MWy{-{(u%CV@=?V9#3#8@I-LL6T zQ};NpCvkr6z2#wx>iwZ;`@&C)o*A>hMv`bN%DPGhA}TrTK~FT4nq#P|E101%G!vPM zIEwxTG#0~n3jKJMMO0IXoBM|K4r7dWm8g#>^Cou;Z zFH$qBJotJ0p%QHYUGj4`t#&UwE(yC2ryU~7&paxB|629eVW6@BJp2ZZWW`lqEuikt z38?rwgWI0(DCJMYN2h3NKajkS$<;6Ltz^?-x8R5fA=(Av*PH7ckDjT&J_f9(Y+2c$T}J7BuOanM(v zMD(6$D|BE7X9KHV2Bj!}nkr(ZdtxyK4*h2`%8~w1DR>o*4gwE#kk} z0=~{KC&sgD3;6jh;E%U}xBqHl{JXS(f4T+y;ui2{TEM3~GI733Tfk3j0l&8ey!+9K z@qf4l{PGs?ms`MRJ=Ow$3;2mG;19QecRfBa{tvZ)pVb2Xmlp7io|qW_AuZrnwt)Y> z1$_Ng6XQRi1^kp2@GD!u|J4G%`I8gp`^gsYD_g*4J~c6(kGFu|*aH4y3-~%uPmF)B z7Vy(sz#nV@f3*dC{bwf5_ropV7q)=k-2y)I*AwHfwSZsV0{(mp_~yTv82=$H;8(VQ zcRf2Xo?TkN=R6)xxV}1}Mf@MNfIr*<-u~N(>Dj&oe0dA_SuNoAw}8Lc0^aqziRsz3 z1^n`hCyxJ23;2;O@Lbjc{%{NU`oEtz-{Z!^Ww+@gY)X!2{f*hE)$F5m-v28$P&qe3 z6E6P}+B=g9ONiHei|GyR&n0j|?DeGfL={9#A#vij?mmjeuo!^*gxW5J$oCT`beVx=|{f?5!=oFd|~X{G2^0wr@P z$8DGt8T=SHx=N;wECEkfIgHO^voWv-@C0=}gZhpJYC-GzNl{m#+k_f(vi4dAIgFDR z-9Rv9Xos+&1&uc{3u9iCbQJ}wH)IiKQ3bpWiQq*iVCdQekMX~Ry4R7N{sfmSLH6t4 z$G_6+Z{~vD;Ay@mXb+onnZx(-?!wc{@fnb&}_Q{5r31_KWc)Xj*X+ zC*gQ$`r@|>m5Bj*qeDQDz2s}sC6@wl_aa9z%=VTf7TjAF0zg!I<%twSQ;?w39=&Vi z7c2S`EL_Dx&SqGwe#TnxN@Op`29r-pZF1cbOkU~knG4nlKFH4VGuBso+G~@xRXM_u z$LKVrwvorxX-ilz1#F$rWSyPmdRwN^@1%q->lD<2>V-`BT?#i@r=S+(vd&^A(%p(= zvQ9zk`f*ujDHG`)MKW2ZpmqJ2tkbL+NZQG%8z&R8W`K?i)(kjN8!z$H8JWN)@+_8y zRZ_er?!=g6;1C~;7#tYfNG(!y6%}eCw=E=Ohhv#>QSP(hNLM#WX{D#Ty;dY*cSl!8 zY2-HbA!}|DG-H~9=xiqXwua`5$zE{Pz0V}8lC5dg+mX3W? zcx>c$CI#yB;rl$qmxdKQC>D_~n*9ulkykPF>R@}ZUdd#2pR#&Tyg^V4ijGB4%&4`# z)v>xzQqqTrqOlx}NFLpu!EnDY{9G6WwV#RIE@J@5k|Qd!lienfY6>wN3N=e zxm=dzcB?-tKInny11r>&3a~di+hV42)n4UmJd=C0#?Vn?f(A|>LkY(`ULlwb=<~#z z%=MPGB&O_LByn?LTU>z8Cg(lfW&`sJM#D^cPW%ggDg%27Z~QRscBG}h<} z+*h?Tp^o5VN4gvqIpIEVdE{*IhxGlw$QaYKl1DxQF=_)~kIJe0o7>|*QT5<0clr3H zd<$m|-nL<%sT-r{T0fRyd>*DBsDr6NE}R)7hy}CS0)2jkMh`M5mDk*G)@G?^b&^R2 zr`6+N4-v!A+}yFa4rIB->WtD#Zr){p-bsPv{wImvR7Bo~*wa+W3(-|L=QjF8&g}et zv01j8$CvH?1|W1Hs>@P2WQZT5e$0TS%8>R&>4AQ!iEoX%dUPDV-1OSx;Hf>q4+2_A zWs@@!r)`Cm<7Y4f|BuKZSoKY6`B(?6&N6LYf3WO)!_cyzDu192mIinMX%aKqAu-Y>uh(68W#R|TNAI*&8T(AL{zpV6~mOdQ$wbFNZ`pHUv zy1LCLrP!c6w+?G%pt*Q0-STmr)-%CzDmVr{jw2U;nSNqc2XgVLI72Uj`b~~gn_sKA zYO!4W6+*eLKOkL&Lh(XsauO%D(PL2AS?-CbgNhyblo_ea=~!uA)?VcGoGl*8#lHa! z=K@Krw+P=#SY%RZN;*_!>FDDZx+M#LAF;jyooh98nwQ>`8tLn+ezxJBUfr+Zo>4um z;T~1BG@EAD^!Qn*7*%Ck-N?3}?uV%Tbyr-~aT@t0cR~G@fSR&;@uj)Lr%oDpC+?hi z67D2@-dy!cLKA>?0KWXZ8pPRiE?ae0ZzgJDP&YR+RfLd0?X*_(8>2*bRMrRfRioqA z!006LZ(3bXY1psq>~UU~rayg5`e*;^^s09qnSM>_bJ5dA0N0q({-p4?6Ry8-SS835 z-`)y|o+ORwa@BsT;Z^&celyVD8}twQ^|DLfUoxyz;xNB3krHKq1HXL_E9sPmEQJ=$>TKpVMQ2U)~!^fKz%;$hV7yXe~oY)=O8)J0^YmKI#MtAs= zQuFT4&Fh!b4fRA-4!!=9t1lty|dPhk7ke8Ug#~>yXYk84)(7kto>f2P*4ks zj)TE*t7Nqqjc}Z7sKI%j${PLIXt9qSTa!3q71q$(^7GNJEC1EC>Dy|+gd=~T?ya1T zuM(UBzHbO${3j3$>bN)OPSc``KdvK6`&}r`*V{i^!@$eabjpBLp%<2BrGw~2;&ZuT zZ^;0irE-$Gm%Aonau~Tg6}`Vx6EKhNF4LB$w8igAy$h~N?&hZU$`_??nS4g`RZsuU zVe~~@^%+!^^Ot_!S#sF)4D61un%_h>VCX+?{ynU&*97RGI;>7^0PL<=_ku37*Yi#4 zgxk4c^s|{vj=L$UDKWOVyV0WR*^bAMwL;zsU3Ztecjm6kQvU1JKu%o z1q~v3TeJm7<33+);cKPLB?@P`;y=;t(>SuU>lA)xt0(#e2eGE*R^ zRk^d?tH{`Q{<1i60gr!V?HDC*li3{Owtg=VE&o5*`qeqP#@dD8?~PuAD%m3bGyM-G zw7>9qQ+_ig=$PqaU+4Q;zh5*4&)*om2_EqdE04#!n0UEHeiO&jh1qXSfDh|(#+V&n z(RBGQAztl8z_8@_CBB8;_+@=yZ2GkGzMbOFWNwhI&bO6+-eog%$$&O`U4>sIC55@t z4*9ov?J`#4YwGHB1f4U2Df?3-%?q25xnjB2lj~Hu)|cyc zxi-Kx`!J@IzP{exUac}SD+`kmTlZ@?OW)>AglsrZDt#|cpJ^SKjbH^i#D_GaJg_y zPj`Z|HaoA-muv@nV-}Hm9^h@XOzl}E{|u|IcFU`2o>^t*-i;lo@=dm%z9&ldDV_Fq=oO7}u9+a}rDE8$S~Yku%ocn_ z!{@=1!rZKNX3UIEqY!2h%K6lxO`Ym-ou)r{d-Y|yY&2cf{(_ZG?KnI5D`V=1qQ~cq zuIJM2bWf$HJ=sz-AJ3Y9Udb-_g>fq zS+VBa?mU5g*}%R`AmaPX{B*`xtXz1V4^7eEpjo#D;!*g~;HG5ImFIoE`0v2Y>Vaj% zv$QEpy~SYdcEbS?vMAxm;DZFXt+Vau*m_psG6HO2U0@IQ5i74R0@Bqst!R-3 zVaA9)yW4uYOT}sBXjrr?09Leau+}1R-eT`sMo@ck`m6=dM)uPiu{LJx zyoWTtuyOHuTQrk)FCdp~tG!pdeD5zB$6M3>SE~IpO>lvl;1Kl$YuIqs{OE8-ir@LZ zaD3qGOyEW10-ODN9s`2mCh6)96d_%=Zms^Po%N`o7G!&D&+D6G(G}}EW|D5xNGhlW zS<<0BRgv|bGEp(;o8%&>1$k778;bRJW}*%@q6%t38G_CqOHiX8CkGz`lm6KHqP1LE zV?7n$2y{quL>S*Jr{?T1QAIZebhYNxRPWECXaSgwf?7IpYNyeHc01qK5^aHc;8kiv zZ7YWnln%(C~^L_Z6?;LP?gun zAxBJb-LJKx=*n4GN2wUEOPo?)JX;@3(lDtzQ=Gw@4qEVs(P!xLo#k24Ldns}v-Vl6 zvcu4o#BBlgx;stqSrTYDKWpQKTI}QaP?~0gOd4}1X*h)vC!X$%7-GHa+4<0{P0m9e zt==aNBL3xxx^$;TL)~RNh>u;!%cGk-Ni6Qg-6F+bsHJ`ib9Pd24u%EhVnjPs%x-X3 zkt%wtTEH_vP^a4IDrKUS)`+qmQF5~826L+S^er=P zP`gF<8-!4sG{?6=@JrhF8nthH4U)R#>h$guDU7d`=xzsdUT0yp8Q}bouXwF6=t#<@hVC(&pM!RjU4o2>!Z4$$q{5a9U;J5UGUipP{_f{Xqe*u$HmWoFk>7hb3 z!}jg`nw1^g`%+qG@#>m|{zCOs7FY=! zj+xF0GZ)Mco~OTDCp?Lr6wORN(HmE&gEt?)%#>6am`@N~=O3Eo>NjJ@fZqKIo-n=& z`c04o z3TiW>m&fL~sX_g1(CJC0g+9r<)JV}gO4X;R?gWjB;c0uLYdFe46G2119AAY8k;Bg$ z;dt&ak1DtJ8byiz#n0eq18DTmDsQ)S6QTkDu_dFmicJAPbfA_LQmlPed65jjJV50F9o`jBUug6qYLPN0uq%sD!qxnK|*O+oG7l$*Ecth~PR^Cw;%62DF`p(^{> zP(jjAm3nNbAZe&(!Lgx&cxe4y6fIpw3~AP0O@^a_T2SCu*!b0^!??^`>k~l*j z=M*)`W5M^*hgdW=FGvQGt9jIUX)$jGhR>;n&KvT1Gl7-t z9L*e6vU4<3Sni%-maN>3G;QE0kzBG#%=SOcW2#P{Da$rrE_yfdLJkF)(<_5ojfNgz zyRGhgibC6Ior0Q87tBsX8&Tuk1*H7Cn$X1oAs(H_mim^lDBx`3_*|${Lz{=D5)hma zY;Z}?d5&gP6j(53X+sWswA8}W3n_X~8jS`kllA}#|M( z+qxY3Z)4@qxj@T^o2~t78xjY;H1Z;Ga?u%-Xi!q`T*Ii!Tq4-LZfYXE+3k6C2frfb zE#OJ#KFyXaYNM^_SSE--cCo2CYcA^NGj&qvUn)S;O3r?LR(1cQ}dF~qcU_B%8BnntISQeV2b$FPs z&H8;bOw^IF>nB_1Z0LepDW@lEt_*tn9pdvK;$P*eMZ8sj&uJ|v^Xxn!&kK1%mcT!f zZUAe(tM&DI?hH-??QN>(r25k8Oln#R2}zzBfK>Vx)YYLnBiRzi^h5XQ?>$t4QcaWq zHwPG@x>Z<~)R_~LOz&-=DD)kwFg21lM-ryNQ_%DpRQO+(+9~N?&~3INZWoQ#w{!Np z*P*lDAl{*SkNtSZ&sp~$A7z=3hn(%+8i7DHGII927ql4-v%y{1tI_vMro(p!G@v)R zQPQtpvVLvtu_Mv5?S;af1Zk!C`_y%#zekz=ekQ{~hswqlwHzv271HXeNgvlU7it)v)o} z4Dn@2@yy-biS}52@A9(l$z79YZLxRKC>{prz(nV9)1dy{ROj)o;Oe^H3zlu*Z;;zv zw0CVjMb}B+E0k+odzVZErIP4xv_I))s|%Z^)n!%H=w4dy7KVkW9Bszfv=h2!38wFT z=w1T#mpoE*Gi5WuPlo*Idmngce>2NuPRIpA;JzDrC2q)>SYl{BKoWtNRL%|wdlzXP zn=81e%r?hMbGs+DVtsx&9!B3-BADPT%N=A1)$SrnO3=S`nCuy}SRw%b-)s-j^tCo(2ZZ5`S_ z;SuOctt%fk@@DbP)nOQM&Yb^e@~j%DJ8+*iI^sljK2c_spL5SUgP`{P-o-U6n+9f zNqRZ6{?o_#&zE06N&Gv<`F}3|lh-%G<;?okcGd%u^lICzU;D+Z|54%lM-!i%S^rZC z*H41)jdA|sp9t4a65cn?KTH1k&G7By-=pdO*tqcFap9-Qe@-+0h4TN61G6N*E9E!w zvbT?%S^v!nzq^_KLHYHQq<>0&{UrWZFXbn}H$2XN={W!G^6Mvw|MEEh`hOi8{x{3x+w=Gv9jsVwm;a`;!xgJuN)wc9uv9fn3_-~{OI6(_@vE~`)ol{L^$>NN#IMd-RX0uid&sYD zn)q#my{DPq`*Bv)&6Dtt$$vsK+(twu+(x8^T@v3$n1)^Aw-KgcmH4fPozlc-J?i47 zU!AA=4Fb#7Sk-;f1Z8Wi z>VXaasKhglU;~)5CPQl@2W==2JGtu5c;vOuboI1Q>a{LnJAKZ&<`Ri0>NQCeZoBka z5|2_$qQo01X5JWH20sffqdG~f_X3S-Ph9rIB?Bc=NoQPW@$X6cH0a#mk2(#dHG^z`Y1FO}G^%}NvIdZzwAMrSF^?xlsU}#=MQgFch#%$H(cfH>ipVSY z9F)G|P>3G`*1*+fxb9yA*ACiZy@HHk9IlzFwlY(HS z(ruZfdyRC3Vg1^U6qW7x9?$%(Lb3_lndoe=BK$aqPduMS>9A8N-lp9YPbb&WNPurM zeDj}k!F9O0_xgY&&+Hx#YL)8ru;K<Gw>b7 zN~%>=ezvmX^v-Hj_1q1ByGz_?qP}Wdk|sKj79~Vljnr<@>sr!G`FO@jl|8T&zuTnL z)xKMxVp=)gisXa7g(H)AYf%spQ681hhd}goGU%?9yDDqs>W}yiZP3^Xj=c(3=8+ZQ zY0?=cd%T`t%bi@;DnxqlyIs>gUdiqoJfyL)RWdgIr7=|)*2n0MvC>zGE@3F5U%tAq zwFbyG{||fb0VPLqwGFp=W_o5eNwc#_TA^J8D_Rl?UtL+n8Wr`JU(AuI`?h6~f>DpYMIod)_@~r>pM0 zb*t*BoDp(^r5gRT(&_XYJy(!g~;T|a^#`j1z+OFLM3a-L=W!22BD z&cLvUtEn6Otzc?M*3+;%b}qcp_ar7$j9# zBG=rS$oQDvZJ5%EyU@h|Pqh9?%iX!pF>ctS&#mI+FA+CfGBqqw3~G=8MsYS&RJM$H zxGOze8`MEkh2>v`bOt7~>0lj3_G%C+Tg6=MMpxKC(lAJ>u>5Nv@ASfkXZY4a@1O&L#Bvi{0oA2B^iN{oWk(fYJ%t9(!oJ&iEy$)4)y1?d*m zDS6xjcsj!Kvcxw87Ge4vLD0x5?pT=r0wkZR0SA_y*wm!uT)PZ&g z+s2CPOJ_*yl#IjKTK>7R?O$6*JjEt3sEzafEOH6?^*3a(ldhbUx`dWJF2l*h6!m^v z_8#ES!M7l5Hj+}ZF@8H{{uTS&Yn5@Idp(V3?>2!O;)eO6O=-lJ0pa&0es|LSq}Um{ z8U09>H&+MPA4&q`Nb<6`Hw=kcDqARN9);^S6D8N#tW$3IES(-JodMM3iZYl&&-w}$V8jJm9XfCC!sZ4 z!>Dt7nnv1>eib@?s2@RW9auW?y~TDOYp)At6~1y6)M~kz47GN>;|LawY#wBhbN&md%#$a z*W1MF*!K?nFvKg;Y4(JZ2(L(^*-IGpc4c`;GJ0p9QZcV|eWg6>f>%c=BuZgHiF?Us&|RlhB$2V64aM9pZKO%{w0( z;uYyM2f|5&SESJ#B#e5z4h9`~9YU`JFA|8CP%K`5iQ#om91%(nJrzUbH*qd?4B;Kv zZ;aQwf*0Oo4fEHbP~n#7jVHh6Fc=lD!-YjZJPED&HjMRn{grqnk9gtW5U)t5F>n&$ z6=^g_2%{daBS8mV1$rfTkwCnJV)6Q046myEMd=|t&l)1~=Qv)}G4x!FyR7o~p5TRN zB1622P~n#7jVHh6C>Ry5qlHC3JPEBi2F7~4-X~tqHO)CZ#4FNiz5^!_UXey~tT5{F zIu3N;bv(TiyhtEkLa}W_3`udt1COOzhMQ=%bW%g4FYG4w*58=*O3`}m>Y^%)+o_J;!fS`Dlg+)I+39YHXSdZ7=iPt5G+g1$migcP2;3UE;(r5;SQIFS&paZXy z=#}6_0`U@x#p@q2yw;B+Lg^tqA{yegW1LGJLwM0M(v-uXG4WsqBoxWnjsh!uZ6;* zAD)EPoC9M$UY`)J6=n{;9^w`0H0Q!egjb}|oF|NWyuJ%M@H(Gf30@=+FQHhxK8@jZ zaU2m!582 ztjFu$#B1;U-@HG>E7EB$hLZ@dNTaz#81;Bv3Oew*j9v*|BoHs5SiC-u;Z>EtC_RLC z5ktJbisMBcLwL_H+!;=`CRX9 zFYF)HUy)ApBRGlhiZq%Z3!@&d>p=%zH_$7=iv;2&6pPm=_-V(FRr!n3LwJ!YMC9-| zUeq!4Zj8Guyj=K`IQp+KynX@|Zi(LDAu{}$pW;XHx=~p4!;{dOn_#TRD?z-r`RU0$ zVg8DAnw#My!Yk5fZV^U3Ublh{ynaTn1TPYZmryKT$rxT|#}T3Q(BEQ+JRav##}Hoa z3DH~@UMa!r{TN=iL4{kQH=g{O+hJ6^?hqFJ@FcY6P8jR)@`%?ZH#~ZNh*zZ3+yy5Q zUXey~w=nAQx(9UNbuYaVyhtEkLa}(IV|cwDM}*QtcsM6SjEM5&UysFA0rHAllO^DZWpTuf6>KMXfH6eFdcr^-Mc(NwM z>mjIcOZ3K*U-K}Giq|8;q92}w*8CdAdc2y5*X-^NT3F@#%9LhiEgY7xBfyiSPMV^HCi=#3}8 z=JzlvUXKfles~gE^8}3bc#S4r?|80+zBC0@UJw&~CiuSlnP9!?^>B8}z+VbtUGBIv;DC3+=zkwCnJV)4qy@H#w> z2&IScI!=h!>2WS~4B=Uvkh?6r+5|5=zYyZ}GE}%FdgIBjSq!7%wM1C-!;{dOS75Bi ztDSg_pLF%a5U)t5c@<6~ydsU}HDT1_^*ZRl>kWD(c#%N7gktgPh~ZT=pF`;(yc`iC za!njB>KMX17a@09cy$V14lWV2^U-fYgRB(&yFFxKPMMZ8Yz z|NVv`UXf1oXE=%QiZq&cgi(*zUqA<5@6s#5iv;2&6pPo`rQt>Cp;3sRoxgu7ju&+d zxiRjt@ERw0C1QB}6)M~kz47GN{0&CM>pfx74^KjC-iNUsuWsUX{AZ~bL%brL<^wp1 z@QO5=4~0>W*WW=0UjLw1f)@$IODGnv@iDyKjw3?pAzb?#;`OgMmpX=UNo>en7GBE< zUS15Ze?o;@qBoxWnvY;qy#6ID`r%1v&Brj-<28YJtygK!gm^_d%_ndY;T35#p9-TM zug^dSUjL?7f)@$IODGnvo)})EKaKSmC_RMBZbL+7$GOxol!q}wL5A3(WuNlTqJzmQbuNiF%av@%kPV*I&WtCd~}UL+7Np;)|ddN3SsSGA9n z9>RTuAzoGGkvfKOJ7G9GDuhtk|d8lwp^v084(*~pB)h;ah;Ynys2aNT2O(9+r z+|{~5yds^Z6HX$$B8{d?81;CK1s!;eqgR3#3B*e%7O$x>ydI6`AW9GAV~8|=7OUN; zW2i00T^3&0pNRa`9>c2}D%=vi@#NQxhf(obPFVEAlhB$8FxKNWjd;EK&(k7UBAuoO zP9jF6(ew(V9KK|B<1Py?Z21CSxc@KAU+Y1ITcS6f{F*s1Dqiagi+*?#TC)L+^?0pK zyhb&i8SR~kbeav}B*H7wXuc(kdb~CQ9e8a_uLLg=h?h_-UhBm0dM}O$rH62G&89FaUYiMves~gEvpJ0Qc&$gg4!+>J z1H=3k=`>rwNrYFV(QGM`N zI?eWQ65$nTG&=~x;>G(yH$xk-A#vCdES?YE314iB-kG0dc^*IhF8D3ar?I`fD?cS# z8e2!o42!dwR$ zF2v>LP@Z@H5v-G(CA`!DJMYbpVa0|+{KJ81#imzm`*aq|v#E|=D+)Hb&gi6nJ*2T6 zwJ9_0YDbQ8=;JV+9Cd&@)sqT5SuEk4!@bL^J1rYfHO+la%W86!GHf|#(_Ng*6^IVQ zao91AoQZIqQO=oXsXXuY?ttV*jHA9k(6gspVA;@5eHQ1Soqz|usdn5kP`(KJv=IQ_ zm%^*lHWv2_NcC@kXV$g0;|YgHOEwW1w?v`tee^poame1H%e5|S+n>OFOpdduxJmdk zCg3k9lM)T4tJs?(EZ@?2R_3djkY;c?|=V&Ro{);34i+8K~%5nRh%h9Tc4UpmOdkkMhxeFmFj+xQydQ z_-Squkfwp`nVVs5#Lo6x7?`t>N#yQWxzh%>Ch%4yC*8b+7xY0G_gpkgdu)X4(bg>f zW`nmdTAcN^()6B>h~hNEnh2ZTCbt$$4$pqOaxe2%f}j5g6yvtv;RLd?rhQ?POA@%1 z7NN4i=xFX|Y4Zx(TMiEfY7oI=bZ|EYqaddPOQ94F2ZmDIo!n^y3p3NGduF?XCmWot z>oMvAIl|~x2~F$@R@{drIUo1@@m|d)CsTI~EB4UqTj>aELhlnoF=Gg2f3wqn2SS0H z7H)%XG8kCyz<2t;j~|>{BQ&zZn_M2yk?aG8Je%S4A4OqUABG&yMfrSLgR(pgC7}aN zWpU>Sco+ocl3iUL#XD(fbaFUwC>P12Hjpzsje-`4yj+1rU#NPnA$S}I)F3+yEaCGx zEZfx;1~TCKxN3*n!2iJj;-B{vQx*S6e;fb2Qg3Vxoyw+xHXHv^X~4dRjuYT8S-u!$ z7#prHVJ(0*iB^8a&N=~ggtLw0tHjZl@CD;_kmsTz9`x@U)86BLGH5Lj(+L2d2ft!f=dVcI#lnXzD`xONM3%h(PjPyHhZvX z!FSK#yBEJVgqRlhhP_N7x3~|Dlyi&w(kP-RuX%afouNXQ_X8(k_-ppZ4=4u+g}>%N zr5q#_{+feHkvnb>hC^VHyOhNMb)X$;X<`6vVh}dgV;hIzO!$Y1CUJAPbt4AV^KDBL z186osY#-!@HPMUk4WukUkkNWNE91l+D3=IQ<_O3o41Y}z(o0h&a;WZ7(gy7)`hAgQ zy>6wf?mqa#zgSd`gkHxj7Vz+!IL_W0-<>r4$AjM|Ck`jI^`}7hOQ7HwEAMY{{RObd`5@0<5r71jS(iZ_ zx{L+wU{t;~=UQBw9Uj!&nfi+rD#H^PC*X@Ki}CBDUo+JK=_Fdvp_w{K*_Bg3=#%S1 zCsj^`dDuG*zs1u@9wgJ8fuBiUt$%4}Z}>M4{uR%J0DEC);fwa?Y<$W?_;GPeY9YSG zbMWJ%+cXuIp_Is}oQEIl>vv%u_Rhy|@dAdA6Cd`Ro9=pHDxW z1fRv(9MdU# z;lnw%xS*2DtIUFOF~*qjLKPH1hxhJIi@99CtXyVb=Ti^%-i-eD^+f;KaY)=1y;G%K*87z&-w7Cu6w7DI><_`Qcp*u&CxsyM4 z;itJDSMT6TtGi*&C;3W9CZ-My>Daw0&A48zq&F*}nfJ^+aMUr3oRLdSJ4@;&WEmH? z%1_2g@cBEw)md84`yWPgau1|`tyh#20aUzbyiqe^>Tc`j_01t zFF&VJR*0lr-O66&fbz%Co{_< z@m+LdR~FU1<5BaQOL1G*B(ImJ_mgt?Ejaci6{wm~o9>9J!IcWbHIKj_tyA&fV}pv| ziepfs=ub5wyMWqu2# zf|=GkP0k!>+(&Rr_>Y2#s{42NB+O&@m1FZbxDF$7a?p7RI;mFfaWE%o`_Ff;cv0BC zF@2)VJOQE3;n*-Ms54U1pW81k{|AVMHH+3$8z8wQaGmB!aDy~Y%bgAT!)@^?xJHkM(CxU;tQ~2&Z0)pGcSUU1hc*==FP~pc&9cN=Kyo_62+@<#XZ? zJgxjXD15VGs)GZgS{2em#Ud;D?_gq)FkhjA%*M4B!9Xqd1{`X0q|K@{Icf7I$YDGB zLRCB3jq;jD8+3^1!`qbREefZ#r;cR!6pGuL@zxk)ZQceGL1N8;n-u;;TMCV1(o999 zObH_dslLN8o7{+yN~X*Luz06wLWXQQphG%~8mVk=(NUF-U!hyaT5zG4Td?-TLpE*Z z&+yY}YwF*N_N@6E0Fb^{5ONvi$tWFRUmG$iQhbL&#jO@u^A{?}HK2O)R9Re0Knk;8 zaISf>Gyh~As>Soc&w_k_ymK3kd=Eto@RofbUbbpc!1J&Br(w zMN1n8iHs7+v}KLDR)YPom@bL4RcPKP3K-K)4Lg6#D-)dJsi&DL~r&_aGMB1)6l&gEaK- zVDT?i-iZz|w}_A9CC&TPxg%-A-XS*ZQLuw>Pj{MKTxl*?nwL-@kz-?n)qkKc-~hGK zVnc^*Hg33g$5MTw`q z*w3mZ!E0m=W0Cy;W!QX(AKL+dW^MOU@-}RddJhlu?nQ-(G9DFXeX|EYsq&uu_?yC#(5M zl@H~||Cs4@5RL8S1NkY@qUm+Fq!;b}r%`&T{_jwKG0;Cqhlz5TpJchhPpW(ZKdOHL zjqT+UKP6gJ|2?9g_G&>mWl%JlVHp{vSk`i(dd~ zt{H!cFY^B|Kgse}{P<2IQehN+kpEqNO0;PH|GDIU+WjPcY&zLB;}eO;|L`^AlNiVU zWXHl3b=3+5iY&$VK>kKhH6EYT)*K!htIkV6}tclT`4t{I;1Kl(GoDbn{q2x*J zL2Gx}e+aqO?rHcnL@WPPTYFn%gGbZBsq#Ui=Ib9BgRtW;jgfK}#2% zLu!nRp+Y;qw4F&%|F%VW|ID|5HRzB+PUArd<1jh$X{V$ z%1p-{dAxB|NITz{I3i<7c)Nn*>^6KEnHSVZCt{v3n%tt1Yy(x+scRtCMauy2o(~> z+jY`WXH0_EGjJ7Pl%&q6@d%#N>&!b=)6{i-?d&w3Db2o1)>#kV^CYjASa1^NV&p&c zS}Kp#CENu}xF$f2dQ%uk6H)&DEePrKh%tN(k{e^sFWT{=vZ|IAOa{0={< z@?ZGz*F#6P{3jaQ%Wv~jqDA%N=_$+&(C)7fu^{|fjxS`oBuru@mg6TNV$1RGVIKA_ zX8LM5CexPVq=^5aPW%#zYdIz}D#wp4tsGxO|Nplfv-%IJn*YDbaZ1)}FJ}H(6y%@3 zBTa&=@*$1wA)9xv6G)Uie+ zBIA}Q#PJNjGM=GfDdU+d#7)9~8ijOei042sLd1Q7JicD(fDBJ z5^cIV%jf=_!u2=f0g(OC**xAWQ3O0J2`cYEbipi7w1|ZNHu7?FYtk*zYp&?u#CD!< z&YB)p=zC%wESJouI`dv@%I^g!=gs!uSqF|;;Vp=izXv2@Jy5&;F~+$G{A-yXTbgX zd7=$H`-d?r+Sid-)P$glJ1z~!+$F_bCoa?<$z5_0wqsZt>QKChR>u{YpflPV}GwJfopTCBLB!|VC(b2WN?wPI5FJQZ#7!@Z% znrmb$;LGfXi;X18Er_aFk;FhG8HhAx+@${}1X{Tm6!t-?xqp4AEZ&9y5Wd!gKMB-w zJHwmKp<8`>7_{FYXp;9@7$!||JSRMrHn>{}?xx)-?;*A(hC9yVi7Fj-YE<%`4%D%$ z5M>IP!F4uwcDPdCIbXc!ok)pNN&rEH?|HlXy6!?cLJ&62?Dr|>T* zB{lBSGEZ}(q{)Hs0v%3s7{2sOzvduV!ib zK~^kNwnN;85mNsH{`>_$4q9oBd%ft6dOv~c5iq36Prwa^n~(F8a7*$nk?6k%r{zD8 z9w!$!hfn1vK@Ks{vkEr}UL`t6n5l?(1XX~Q`hPRziuWTD>|?Kh;G;gD$b939TeC8p zB5ywsW}x3912wuOdYLv`!}oByBus-@h~F*rzYUwyBm~%4G!2SSzqW%1Pby8w9mVOO z&FyUJN8I_=F&0zE<(3`M)je~J^A60nN?a;^#5mZzy&}xR-h(z&eS>8B3|pkRL5(x$ zF$xSaC#rOwY{BzFtH9FisKBZ)UQ4`HU8;Oz^JEQO?@8*tbJB zaZZ0i%{bRCS?T2<7jf>ILHrrkoz68ND!P ze&Xatd84v$c6DO*G|5wyg&)+Ao8`sI!d*4w7J0a`z_$hCx<|`Hei^$gz6vXs*i?WzBlX|JT$5*zCLfkoWh?kS{ z9cirWR2}OHLXh+r+Y!WCoD>VdFcvfvXuj;ZTxT2_aW^h>$7fIL+%;6@F_e5}bV4Xe zRdte$m0dzf>&?hvX_ERW7OVNyvFd5A>__tcHRLgsT}j@( zhMcSHM)DptbSnI{p|a&Ka=g5k>RpnToFa5vO*gX>5l^SiV$ztIfp<;{0c)W(Osu~tj zjn>Lv2%o0na?-et>yB51Li!pv6Qp>=kYz0u$#--X*FiGGeF>_;uqKntB&8{GCTUmY zs6kqI|5Nm=7xndMXUE!_q%&h}&C=tswid}1);3zQk+qEx)U7QiInvr%r6*)kH&y^xG)PxYg}*jrQ5`l1 zYJM)dUkY`vK;4}|7ebl_d*pNOUUvwGQDw!*Y?^x$p_88~rbs#X1*0t+oW~H@^eFGI?OfeGiBq zOKSZ1l75irRQOxtNA{mRm-R6Hchxjm~?aU0{@32x8UR(;?W+N(r*vTl#5m#K$J4E-Bntu!08$7jUFq1eKz%iIEY}}FXZ*fRwjr@oeVPklqwkr z67aYlS!Ho3;A^$A<=x&hP{yrnJc%G%ot6{b-g9HJ zHL+N%UudJ0_n%+rn@9Qzynz&WhAS=1OAI4-Q zZjs(NsbDkdx8U7GApOZq;8zsc!NgnedWHshoK)!AV&HwyuirL zPZ!?g%$KYSS1lKR5|XhFBC3M9BVE^cL~u_WeK&eWeimA7;=nIWpJr!Wn14;VqORr0 zG{0-G28&yR7!X~4aQzf4adOQfkLqibJDGk%eL?uSWtF!nVFnyaSJ9nJIFq^>Na|g% z^2O7RN)X=?M*QTWn67qNXw|Qza{%P|hbb1F2^!=wmYjJEDIAhvOcn4sI_zl(t?$4p zqxGoYuGZ>-+#rWsNHF?41qrmLtUyh1>>2|%0kE?f-|zgcI&rw}^{}pc9fmF)*1ZnJ zXNu4tSNbtZKU(N~A9_o~>9>-0rU=#2`|mdU!qRO5m7lAq15WtJH;&R z@Qmi8nlCD|fvjC5S{r7(U5?-4x+D*h=|74^qA1g-4$t8Vu>y|BUSG)Bdl>z5(qYMeaAG{gWE| zr?e;h$t<7P3owP>DYov*${jyXAYF=!Q4qPNdm4%$Z=&KiWsb-86r_~YU|4uX^^3(= z;h87ELK3W|I z^h!dD_L20aorMVRGa}nISC4U^5tGcE3|jHIL4Hp}`5h=rdBg4=X7?t!XA--1YI1ub zmfJ^ZZpV!zz%-WItp*I$dEgMg(HePv<_ga7sHdJ~`1BFKL|9+!2!>Pq0{f zHqHH6iJSQfbnL-24&L|ZSU1P`no%?lyWuV(ZgiRUO#eP~k(C`Sl5;(CD#|>smf{Hs z?qbE}A*n=+3k|4sdO=dvo!Fl|@+*w<;_0j0MGIlU2GGu9jCTPWsD{dXX(ut{Je zSem&LXJZ)5CiqFquf$yTMx8B*%AG^`6t1h0tqNZMgNRkDr&|@$P6zsjE|hEvDSsk7 zGn-L9D{x`M_vW-U=pG$h)tS~^IyfJqyL4~>gqyBF=STPHpep6P5!`?SHb4I6xEDfu zG5N+^<1997PA7ck=@K~_a^Z+aLvk5zki(4_!BrS3sFe*+5(Dm%7+4jTo9RXguWF+N z<3wQm<>7zjth!wF26NRG5a=5u(|-cFD&Oqnn$4DsaZCRU#-hb+McZg6HyWo}wx)SZ zZj9Wv=5X^AQQM(2pIfpSV+3)D%x^U^dc_8ax-Ci)Z5uckSdVv>vgK{X=8o&5tsfov zoc6tQsHUCu_d~mc??w1O8vl(*O{q#?Cf(rw1^jOUI+gKH7F^-xfkxAmpW@ZD2oRTTduaJ zeq8w^KKCC3QRKoMK*TOVyak0qlfk||?kJKHu>%EgNl~zChh4d7*A9k5qDM-4BL#Un zO?(hB*_HF8CS1*)9eBDU{9t8*Vn1*!GG)4|%uBqsa|VVqsn{=m3po(`!M@9^nJAx! z56_q;9nO8f!1!`c6#EDX?1|b5+HGr$eN+sc{|98*x;j23cSpZS_imyy>92^Suq~yw z{oE_H817#ZOl4nT8@6e&f=RTF5}(imn*#~naYdw>ab*w?NNAlQ7x)Fm5HvyMO+^L! z056QPGscqKY03LHacP;5tXRSAxDsM8?-Z&|5F3#1V zB_#eD*&NOiAy>NSt*^AT-5+(1v(g=E=6y`4{hgPILDg7u3v|nMteFTqw^Og^G^pv3 z0O#Op9zEJGyDf3mVRHvI{4Wnx*c2wWV4|wUXxsJA1n@!dbGX`%*)NOH_6y0(+)NnQ zSk@25q)k%R7fZMbnR_^#!KDV+`l+`FB$m^D!E(FE)jN&tO=&a*CB$9YCY-NKNs?=2 zi%y!flbr}7Cj^|7WSY4QGph_Yk@EXkR%6$mNjSP^_BeZ@o>;_R4+oE^!;kzg~Ql%{?u`c3|>wBZP5pbj5twwh(DLa<-2waMQN zV$*`6-!$BDYb=vX=(rhnV5fLfbY3KaYHD}zCncFp*-kT?MzcwyeCE@Yot3t?`Sdww zVDu=d(p{(G+`g)syJvPd^N}X6AWe$zqw?S(r^``oU?)94=tZE0kXf0+cfwp8C0-MH z5llPXs9E|x>z#oPfHKKL7ybjbhuo5k`$fsh$`(oO3?!vsV$-8^1|)w6(10ct`UR_8w3@8v zjq3Ru>Ur(G;SM~J%ISQqoYGab2DW3)Ma5&2Lod6{HFJC<>0z9eF4E@Kb^hx3c|C*b zI`=upu4dC?y7LIa_G(av@NWIPCF}{a2Y_ts=g2p0_JkSOXUv_5p+5sZwA?`pN|{)G zM$0OJsdw|e0BQ?#rR z^LyHJOYzwHyT;~`zsExJ>oI@Pi^5;R>?8iJ4|Ce=tNxZa^hG_mAFO77{Gelkx=*?# zZk!3311NJKenf%f-n&K&l?~JO2UUmZjc*tx4!@TgrWo`8TbSCM%Mp<`V_`Z6cH(pp z;@H@aP9$(T7-p7#P8np(_mL!KUH(WFnlOieZToV}29AFvxWz+3MlWh4M_F?im}vDf z=5QD$!4HA*dm};_=Bs1Qwpfmq`G>b+;XZ{PBit8bG}zeBT$eVNz}$ojG2Id;KY-Ns z7$BoV$76w_y92lexBW+jHxM&;nJ6K#0MITKO$z8wp1 zJM0Xvfd`HK@4%ckN5G6{7|i~FuQ_85z$c$q2lP$6}7Sx<2DXSir=GImz6BA5rih)n{!EQGX{E zrtiZZmB9kcwhRV7H3uH&G07H$Ljn*4Qab!WwHspxj)GviGTFvM6cTJ#=Je1z4%k6W za@w-W<|&t2Y`bL+{4cS1oE*eM%jPZ;4=tOn%nE8rY(}q?p^t0=cn~ViAy#uDTMYCd zxL1uBT$>LL9kgK`?fe{}c{di;n}e_xklz~nIT}aT7G|yYI4lEvM}dHh%VFTs%Rx*w zYmSB}biwU0Fy&Jn=u0zYP#btZ;E_1=rcpWAzLbX{3WmG66vilv5dvnUf#T9KxQ*Av zKdp|}U%zp@II#Vu@rud*KaSVBXfwGekT5w6u^f39k}32z#IyKe&8%pxd&A+pg{T(ES|0Krlm9wP_&O?EdDmqX8CIya#K;Iyl{!8L+A3oBs(_VFYO6MZSI6r~N`*bgh z9tnwnMnk6bkmb<1J%Ne>K+Hre+j4MOWEe+5{Y;%+nI%nm=>^T{QfLsFEhS{0D$ z!j4dva7adND?;0}>$TH9YPjQF9KE%DR1RDz#TTYD56*D*KF^Nn^-SLfjEDC6h{AC| z0pSM_NxDqn^kg(?V%H8Zx_3TQckG#cBX_uyJ=xjmbH8Y?*DmQC2|a&@9=nKCHMMYZ zI4G+ctDPN^u>kNbXhUd`Yh)njKMi}a5kJS{w(HLjG%R)ho1awqbAE6W<`?)*fxjA; zQ3A$4G%j=yPX5IC|5QFTjmZB<`SfB${=bw@uWR`F9?i$X_rpG>71A)|9B!5SM0GHX z35oYCmMphKPY1Xdj_1H(lmU5gkn<@{BX^9*nu27W#YWUEF;sy9Mli16b1WAG3Tj!= z6txX3lxcXIojEXn%J2q9Q`v9UQleAd3~s>UJb3KXs!qgMm8!2r?kfLG^r4MyC|rOn z5MDT`sG;s|z^bt8uLpgyhETKo8-y+Cu>SZrbrr9JC>HYY6dw$ByFeh9kh7$pQ!a7z z1E~J(-C)u`b3K1!xM}L=h%mNrq~T4-J9%Hk{V+d{dm(;o9h^CoEeOcH zUm`7#dx!avW3T0}#CQ`#%aCR!<~teNAqZd6FCKT_63hnO!_lZO)6AL*K8}mCTJz*& zyFkoq!DV*bP0PlKz$s*6RYrh?@2rQqU>JTB{~>j_TfPdlEv8eh#0Oh*l9g*>RrA#_ z4}1S+)hrVvgJk+V9*ttkEeSXqvZzk}^GKddnNAtw!k1z1pOz&={~2gv&cRoa12W|#y-WihNI$$1lTwfSb5co=z`GlyBI?@-l8#)Y&gVD+@?0gyu;Gx3 z6Hwtb0xp<4LJXU(K(&(Vt|FGokLrTytP^G%G6fJ+@Btq0Ur3JIB233+{;v>Qp28Ba*AfCb^J z+)(E*5jiB&CS({u3_EkV+$_{@66oic`JJ>Jyhj`uwE&yeTe*TGK)7;_Ib+QSSRaIc7bRo)5lrFss4-jL9LU{=d}-# z*L&o+meUD&tmQmJMTzo*_;4*JEB6C`C3SA)<~mO@^h9eEG6iCEv!q5zRBox0&qnfO z3bJERlPBC^Z)ZfNSVn;TZ5geX7*q+Ry(d2H>`yE+tp6*w*6D7DbdzbrQkC^9V^B#i zYV4l?J>u!SrF#ky+t#0rs%4b;>y}vK`!5qrhOhzK4~rE9ny-s~&fs-4dl?;^Bs*}b z{#w#o@ zWco`WmLIM8cC@|!u)%qVupn)UJ&?y0SIJI)dtiV^iB5z+mD}s|HdF6O5(YB;SD?2k zQ@Nu~u!Vw}xyh93xo|!DIsVCT?Vy*E@wb3i<==tJu~9D_oC2QzDx-8~oyO4=I90qR z(|-+OW87po7-D|wp4sbsfc%zVe#82wzXQC$gM0o~@~w&9U3GqpiK0iQL@$saE~pzgK&p6iZf`-IIS7~Oqg<5 zCzVq2I#Z0xTJs?0WWhcQY;!h#n4y?$*%J;qon{CuJlrb7sBFG5aDhp_Ml6{u1QWRs z#$0pfJadl7ivQ=rIB*n4`lF$)70V>JOeY+11uHxQ-4tLB4&J;4{ZMpKoyFP8-E}bL z2;+Is+c!w2{{~a^o;tBsihWna$n@WYnEw`K@2!)~Q}%q3CDVT!Vo3e?IvQp-T<2=% zqBZT>*+I?+J9CuCe9PCN9-zzCm4-HQ$36Su(M< zWQ0kc>i#8sbDcJ4+WI;#!gc0Np*lr>IW}i2rK1Br{`81u6pT$-r#gkym$(^TI{UJz z(Z7(M%aUzu)T;TsLEg3WRBsp!EM0}s(7TgdFXQh7Z=_OUCs{_pnJ7+AezQ0=Is+To zxt<9Q_N+T;_+4Bc$A12A)aY1-^Ktkf*|W1%B{KO>_Sm3`ym_y8P0{{Gyd5nf{-UUr@_TB>6&AAC#+nuRq;7=mHBq=QN#8qwg}vWue)mlDZ5=tg!x8~OakPjOUU^-IMnNY2X+aI zqrwHc7DvwB1ETODAHayW*X1Yx$n3fax_Ggg4Q{&f^E%|(ZAAJ8$@Jf0L~|O^$}j4~ zJ0fv1RlGIm;pJL!19H$F=5zU3n@i+d1(IAYhD=+oEll=(2#_*!DyrzU=i0--uS-Qb zpQMG#91oPSOOypn%=Rs!d`GS$R4v2Xu*E>XM9S+^&aEeDJu%>xI6g%Yy%p-X$6f5W z^iAzJvoMMyReasxo8b4s*f^I0E|%8WIiDn(x672}Xm%ecEsF#2cn8)x_-0s!6Vju0 z{aqLf!(SiIEa^PnMwJi1F4Uu2*+{5m0Qzw^^H$)mJ z7tK1*PnmF_H;eplS2mHHWv8c~iFJO-w^{!Jq1AW5kXv+%yh4MV}G9V`miN- z10rnkKJms#k(As~;O~bR$Q)ku&Ud1mlyoeon7(;DQpMJ>MdDE+%SJQ6UiqVyPd8Qk zox=Rln?f2LQchDV^FRWv1@`rcy9K1y-Jg1hgL}Nl;iakk%B88QUnbywoW+)}7j3`h_5o=NYR9e?z14zN0 z)tdh8#KA4mSylSm{L`U)s;c4ZJYJ{pea<1uQ3>?)YUI?PF4aT-YxtU<#;P8<1MFBR zvqG9?ZO#&4GmbI|*E~+X)KiUk2OAc&z!!q=j4fV_qS>6)Z2|@h#SMHR6BAJ~X_*_2 z4!(F=m6zaJrzut1lU>0!CNkU49t!%9s$y!D3dTC_+9}NXZQ=;XZVI3AejYPtaOh^k zDu>J}>JT#t@$IBxy~upr9bqC3L^US9GY371@sKI{XwkU0>IpPw=zs9zn%~2ZM%gvr z5k>{a>6cx8l3nx7 zLA01LY`~Zog57`3<^jeroNQx<3jJR8kQsT|?H%S#c9>+6FpgXX+rbrIjH@IWGp9aMpsB9>I+Vt`u*%$xfGA*rsDWoQc5GZQXXh#TMs4Pm8k^1be9`COxoP;0{0b8TN`rASUr#9A?pb5h>a@F|lxn%fL&*O>@YlfM6rzRNzyI#IVS2v1JN>XRkB zwiv7zF9tfr)`?=UG9rc?$ef_XC@3}lFOix-&KI-X?iL$GTWmO5N7qmM(mOM`al1NB zo^uLhrix7btj-B2ciM?y-y-ZmTo{tw!a8Wd%w+%*uc8)y1cnZWCCfD7UJ`re5v_^T zFM#AM0_4bIKYMpWV$DR|CB=EPgKa9#%5`DN;Z~@x4^z0UedStIhJ$T4cC@WB`iB-ejc#d$Z@sK30PRJ2oA&L)7a0Q zsXSfh|8)A#VS3*nnKD@SzXyH!Y^L%|o%oDMoXnVb16nn9d&%6~450E?+n25m{`k3zAJh7QtMX&@8Z7895;L4^T`B$=h-@eW~;iE_-Hqzvkb2AOxKEG_74 z{1WQKt4^7~yn`;lMRkF`MO(fp0pJ>2o6P+hDw#HK6`{s>$2%WvHj!olGxU?$+OT=w zk+N<1(Ftf7ZGH_cliKrR61mZ>W6Xn$3YVTV`NsIIB(%cEY_2s(EUlM>)EJPQ7_G_D z&>fJWN?Shfw&wkX)Wj)_l!O&M3k<{a?b;(~$2d>Rtm`ZRd^4D)iMF|@8U2^wurb}c z&%!r{HrN%8(!KjGYFcH3UNJt@GQpp{J6wn!WzBvItbQIFPxn6elcu$1`w{>8Gu}LN z_GRSbAAD+^y%+6NlI}g>(tj)rRPVUUheNY(A`AZkYxZwxUsXgWeb{@=?16}%`n31D z**iq`6|P zoI*mbv6|bzqL?>DoibPEBodWP#LRAKqO!4=VRRDPqJY%3V=WG<4+m4g=p$@|$}AXV zwKZv%NsbOl2bV7t}4L&?Z99G zLn_Q<>xo#@r~S?F6dJSIdCtj^SLn{7D=|*oKy5Zw4tR?9M>p5m)2OAGC zJ4ruq_<{;BjmQ=1OUT3==>E-T0JuZce9r5ZYQ`~t==6=TRc3dHDHgzqv4xAo7JJ$Gj+Cx57=vcS{pvkDM4^` z`h&Vg_a+q%K~9&-64OA;V#venbK*=oOF|%2utMn21VZe*LZ~+qnt`kML=)N=NtuLn zY36E42nP*{d8;!6S#pi)u-t~LI%>kQKg*NT|4HP{1y*PPoevwpQ)~c(n1{jS<*#sm zS0u_Cmc^3+!Wl&HeCs~0^g2sarHED#_kC37N+6 zf5M7N$0bMZ#%k?3jPu-)LeZB5BD{<|14<2X7}P>ZKrqtGZDx7xx?ptz5cbHH%w z=raRylRmdw4f4f>0@JW~1g&iB3ru&lGPxzMsFhg+@TpEL4MN{q5|-F|1xf#}2$$`` z1hSs<3S{waW3G4w#}j*J)qZ0MXSJMZ~>~ael`YhP)oWSyHiR2P}_y2~F8d-b323D~6p)yXhNV5+4 zVQ&$r#UIeYdvJiNL^>j^+2Qu*00OGjSmk2t78X)WVsrjI_Ljr@acBZ;8s!Y`0A;Ht zCacj1L8?Y01gRPgfb<<=aV-Lkro>{9LJgiuxRvWbwo@`cf_d2cF@B5JlRQXf44E5X z%_U3x*sfoI3}$kE0&4N6bRfv217tG8?Jp9UO!Sm6333oWlO21hOJ~YZAUxo7H%N^>)6!>*dsvVLfe%wtOkg9Ihq8}5334GSz@jIsY&IW1R|K5S`h75ySA{py-k3nN~ z`c&U%+97XLeQN~VE{CqK!HvBfX$TT#1A&LX(#Fgp;xbv9kkfTZJ!8kIlv%vMC}43z zZ_>!NUSUZe)65Ynf9G%xDq+?a0)OoUrUf2s#lF*F)wj_I*t5&4*yFku3E<&S#JgK$ zOSY`Yz#@UL7W!=t4aDegV5v%w(C?gc2Fx3efFE-7*Wt&Y>2_}2Z>3wU*eMH8<@{>w z?19wC0gKbN`dX6!K5~BC2C6n00TWg;Ato}3YcY|@L<7i$C=GQC5@3vPAgeacKK8kSN9=o;wtc(t-AG^!^?W$FXrA1Y){4-wCuQ& zE?F*PpG0H!(7b9cib-;XB$SNh-&iJ%E9UG|D4s?*04;uKTZ!y`-$?J)|AFi_B7504(!1?9l10y366&^qttYlA4i~4J96ofww~6zIV>_*-)!{CJp(CHxFBblL``WZhyr zgxQ@n1HtKit8b;?FavNqb{ty+=yvEa}$0V`lo^HnVVt8LcF;JU;k_rx58R@4Me5~ zZ5xtqUa|sYA&iQ%VcKJ|2ho%JDA4Ty$ywZHClPdyR*SRVR=WRiJ_c89!``0}Hr>hh z4oo=R#QS)UgU;OrKmQSEv1?D-PcLjz8w~7%V`=jW+gnc5P=Uwjpx`qKY?unAP%3PD zAjP^IyX+_%-kIAyv)$Po&DYa^I4 zTmeDE4MLodL(|6=7(`9mfZCwc21^aH!@v^WkH(=^b&fzqw*Hn#5HS8hZTRO!_A=uK zGwE;Re|7xh#)2w3l}!U}HvVN^2KMU;sB(`O>_TZR%%N#4O{dW`j;0rA>V^saV!z*V zG)=^wAThu_XcH_=3`*;L3`(15X<`74@9l9+xu@pokC4+71~V=7 zYqOrS9OU+*9C~J~69gC67dJ^W9sB2Gi(AmnG&u)Bes9(LH|TBiC-$OR@Mg(HQLg_k zXnh0B+>_e+Q~1arRPQYg@2&Oe61xTqIoILS9O?|0)fSLtj#%VBkN%SF=CJNM#O*8- z1Gk9h+#AY_W;nW=Ufcl7c!T4K0kB=cVj%|j588^BCI--m4;$EhG#;NLG-f46BN&-$ zec3GU&F@PY-Lru0iXsYF8zy;$lX0i5?&tvHOX^TY5M$_f&`Yy*FVkZ`^^dX%{ZRNj=9f z>@Q&`k(}^9teRqyFm%ssmNP#GNW7B_q=Pv#uMMW+o$MX_9gfUh>^I2G0BLhK%uSd* zmoR3`Xh@ojI1DzxFP36ieQ{8D;Vi;F`H>LXfL_L}2=P+8$w%@MvMu%t|sXi3YJTuDS zQW^h>zku^W`c>#~lSlZC0C#XQt*eICDYR}HTBp*wM`&G{*3&}kG+KWgTBp${;9n<9~^Y?xT-AF5%-C9m~iCjT(yqxq=ir<@~DmmUs&@qWf>6^Jf(3MCY z(JlG7ucN})p@yh1TBso^j1MY^3PZlAZ(N0eTIBh8BEj-e@Zoyg(p;;nu~n|tpsRkk z>a?y1gVnhvxy$1Pp)SkSkaSjvj+I)CQgh-u2(;y{PA(HnV&nNa1lExxlW1826HVf0 z2~4&M6e$Rup{KIw{~yatk{l{Bm$4 z88MZIs>C_oZiGb}wibNEyeQKhHwiF#*?-dajlRt^-3-~DV~q80x}NiLGvTjc9uh~m(A)fyQqe|lHsXc75N_As7A-cP%b~?rxGTet68fowlr9&egDZQdbndP6sZBh7O6*_Yk9m#^_gwFk+;2 z1==v23($Uq7!W_u@FKm^#GtgbElmudalVPuh((5>n_B>QS+Z+$D|JM!Q#)k#V z4T7~i`Ak!@+vj17 z+9Mk`(2rRDh@?18cq+JHM`4;J-FFF-22!(!jKA3F#4rXaT;)VYI9amVvE4!QLZncJ zIl}D(mz~1Ev1Uwj2_oCzaPJ{mD3DB-_Jpv|i=V^4eGebi&B zEnqxE21l9`Bt`-CVNgY3urFHoN@LeA0B;CrIUKZLQId3;9e4c-r~{C63NK>wqKq{P zABP@$*x_*Jn(Rps8W`{krC!z#02SgN4Wljny z7}YW`ZcD1n!0?_t2F7ji$`TlaLEDFJ=N_2P1s=u6&~R{I0TfI=hsoz_7*c;5*aPY~ zQ2pJi?J6MDM)P~9Xp+un#yk#lvzKl2PeDA*6R_#o{b_G4VHYeTbMks@e{ni+$$33> ziQX3`cR%ZbT{=XrJHq5pW?1Ntz__drk zPn0LfH(BnHZ>roYU--4W8dBwnVo*=Vi@CkrjjvatO+EcgJtZOV)cVOW6s^yWPO8V`kzBnWpbU^?i71U#K`o&fS9W~r_>4W z5$PmTbxy4l+cVNhrsza3Zr((cp)aA|AI49Rb`uk>lpt8qAJH@Amj;;5fn&Vl_B8X| zdSY%buZyo&qD=w%3aS7Q3I4MXq#iBbZO&g{zDzKB4xEPm`(XFXA7O@D|9O0yTs{)> z0!-MCiN!ozS9%A&;Jyf&*%<}CG99X`q1}h^)AOuk`d4BdKdZts>V)@=gvk_P-$^)A zLmxMc`8W?gW(|Lk%m(N0VQ}(ktWQda%xiFp z)kwAZKEs3cNPk82$O90)CC|fQaZ7{{H=a+xho_8iHOd$mLz&wkgZ8%xG_xD3kGx)z zkHyK|X~P+$CbJ_|G?`r}^A<8}zS+Z3VBUj1i_-_WX7P3wyQDDBrMni$?@nhe{&;K> zk>xkW{acXXcWufBFIHS2S1n;xlrtT{s_5e2W|yQ**s2Bs3CoJ!u77f_sD%G>@GliU zzFhz0RWIBEd?vn}zvmz6i}3G(_GA28d6u*FLH|im&Ne}^v2NZ}zW;~4_kfb4I@*R? z-7`I5gEYH4vkD-Iu*=m72_e$%0zx7q8IXt~=L~AGg9sY+umodFGC60A$vNkojSZAJl#c#{GwLoFvdoJx3@UpEB#wYB7pKR}tiLT>x4N;k z9))ceo-1h9s}_)vu; zI%V1^ptp12?h?4W2JUWwyL;g75x9HOW%|T}v`}w57%u-R#5%JiMIaXLiwm^p=0t8y zPBYB)P#pX2C*n2ejCgr8<$|~r3*u5LD#etFN;0LQa!jf0=7cX&g?d#=-V_r#aAi(g zTU+sPpqZ1jY&gy?ZMT~f^^UDyHx*mMru2Jt4F!|02Oq!3*3Y0vTlt-_|0g~cHt0!(m02T)4-@K2Q|4^$Fdg?noO7kns3@otn@~? zf6=(NRK-2x7sS0);vQPbw?X+53cksDd~d6YD|~-u+}kDYVU>Ivl`o;-i+AK|r}vJk zxWe~m#4Xon4oyLqG|>&aq@WF7aamP;-noQ<#>+xP<7L^Q@k&t!bDo6QPVb~_<`vWf z?-~5`a?HD$Ew_7KK$;=h2_kCm*dk$pmjIsbN+UK z^zn|rzqm1fj=0+Y?)>~ zXZ^Ww-2%Uqc7xI;z`P&PLweE5K0>l%=3V@D!4BMP?Td8W3tssTfS7i?58-$p;Rl=7 z5d>}jV|+B`n(#W;UC{Zw1JQ>{PPR8WN$(Q`Vp5LVc~beKLDc&c07Uv5oCyz$t+xfQ z735Hv#J01D`KNk#i?!jl;eHs^xgHAAe5j<$@edQ%dz;a2g7v>{L-{GYFY^} zUjQ*IC+6cUB;etIX1~OD{3FGU`A3Nx_m2?Qd`TXMi$CiZ;kpHWDUT-QL4f&36%Wqi z9|?GzAn_glL~&#OZ^e!KCy9%3t_L;&9ewOtFXy%W{ z6p4!(=P`23Kc9}B|BB^tF8ukg;o~(rDDEf?08rTOP>;g2E)3FoJ)$tJH;9Xk^x|q-uM>aPzZR}r z;FqSgRntm9Ra&)Qd_JIkm&AAcJH(CocZ#e1;_c$k`nSP#3;a^rZAzPfihl7AebX=& z^!20vmu3*LUHBJHeau&^0x|PXI&t$aI%qfFiW@iI!3}M8 z^GSs|r+7dEdO{(DiAP}zLYR0I=7%uxD6AO5!~@uzF~j<)D=q^+{w7W}xUf9k-%q?_ zLV^7w@L9SsGyemM&_9wGA`b(pzX&AM+uBWrO`Gx_#c-xUJYWLY(IHGc3j1{k6OY1< z31Q+<*l$9ZcocSQ2osOOejCEXqp;&bn0OR+d2&m%GXq`L6vR(m?{Dacx#{4gc#k{!)f92 za3z2n`aQfi#q9bk{DvJP7-?GByJRThoQhoYVf7jNlYs85HmKay$k~JmkTn z1oKWQxgIKzy7=co(eEIhW(5N^D_$Lhb|=v^D;OwQ0WOaX<`Nl?de9bL4eG3(f&l~e*a_S(K;^}}oUOR}V1 z8xB7<>VQ;3ES_kN<-8lsf)! zakXBxi$Ck<;JO8VY3i5K)DuuuuN<-UybGEb5ID@V&rZ8C-pG7L^eVlp_C2QG$-m0l zXBW-^svGx4A`PA49&^R}K=EEzymJ+AR1`059gD2`2zdGTi3Npmya>!+ zvjieHCVQtc*B!S&EXj5=9y!Y$gx(KOa>1~pI@sVf$j$WzvpCR&|agzHL;)?dN@ z8>Z=VNt07tVUQSqD~rKE5yR|_hLT^J*|Z{Hc5%|6XrD2f4i^k84*+IwthLEaI1PBb zX|hCQ8|-v3QTl?hIM#JE`V30SnCC46NK;uNY#+Q#zktkD?zMSqCm%6E9@^i?L=Yaa#9jV%HJbNVNgXn z$=icd5-c9h3D=kgm9Ok0IK(m+X*zk9=lpxaG-qUO=?9keKOh-wN}^?Sunbp$c#hWz zZ$r0%WC?FM_#52<0|J8zyT-sfi>Wri2o4r46j>9J>-r-3B3AmZ!VHiy49j6jt9R>A zri9!-ZsT$@8#W!~KQzKWX;wwqhHO3>%!b`sP`)W^sV=2U`{;PU)p)?$pMYRepgArF7+Wz)&W3iB8~5bMxtfVHf*Kj7VU)GQpbuD~{)wQCzFrZFz=_+S% zo#tX!3#a+Jtkql68Cqm57~)y66aI#M#qIKIUcf<3*^+O2$02hZ`JH-L32pcwwBrSh zzf-xJR;i5~gm!|U@pmd4l%kD}ph@lYP7*Z!j`E=NrMue25FP4dTOlg{Y>60^c}fWy z6_Hu0xKW8(O3;V^B|g*J<+=@=skszSb*zbAL+!?YL986g(v~M;(%m=UJMSQ;*`2Qj zS^a4!v%Cuk?vh9hxG|Q(coddd7A@Ofne4=7(3Lr_D8xX+&`FCs80*9Q;wz($c+WkbgJ>)VC>)yXl4a`K=Lge$ef& zU$5H_+F`1*I?mFbemSbrbinCMv#k&|-k z5w5;qU(YTgXnmJJO4&N0sk#KIY7bK77RV$jdZ=@^Tca_^j)pw4gD5`%xtETW{j+Ru zB0vq@i@-VItpI<}H7Hln<(rZ+M9a90J-(*^HQxZyxv>R$qKwV!GL^jlt&wS>?xgC< zI3!HYE^LQbI8u+BZ(+1a%N>CDR7q9@q@y+AO@^CE;PrU8ow1pCy~|rUM8;uHsJK}ho<`eE;GME*@CN5&Mok)O-2wbA)`KQwh}_|~9tQeA z;7VepiVAO~df2*C-fD<~;>zNqC1!A~X&TGWZh>NmumEBiD?QVSX$PRo=#YZPSB-zajz~zL(GL-+38uGi|G@$3! z+!y7Y(0W6inPa!;;u~8VoF1+%wOYRgRsK1W&FxdU#;dLD3gmR@`2lnrPR?5!bRtcy zOA)WELhL(vtTh++-XgQZxyAbM54af??>eB-(a%8Bg$5!AucI`!S9!#$3F6uA5)9)h;w-0?6)3+~um(aH#eV5X=KYf?ccL06Ar*95@m(%Cb z_Xqms(su=Y2hw*XeSP#@1z*^IC9QKH<0`0gIw3UO*oEieHMVr$jiFT^3bpKJivx2p zRWjGChZh{oy2#|d7l7rhh`hm5!DbocrCc_>czvKH`aVVAnBm?y1UDwz%n_yFlD~pC!7k)5k7ImgIKaitX{`^1{EYI z$9xOw0R0p58v@#YH4_Z`@U?+^UEp3HxHkmujdW=z77yYh&P^dqJb-cjy(wJ&X`cP; zwR1NSuC9Xzg~8f6Wx#UCRwBLX6)CGmIr_{5+cq16v28ZNuX&6= z6ofl)Bu_$l)`dK{B`lL~V_$1K`6sb4%FF_)>*U7|haG++G&K&wS+>3%QQr9nI@yKW z=2yTFBOzlnNWe{=OD{7uE9cBmQR&-&Bhx&?lz9cn!K4A?gb zsIo)-wA|a)kbBKQ?%Bf6@wX8-=5H%*+}}=I$i2OK;{Fcmas3_Dlkj&EkIKEZ__O|2 zaNPpGRPN|dFDS;fjOMJ)QL)@6Zr?_!{FL5Eq-s*|_`-n%m?k4`Mzbjm~ zz%S)GLAeqTaE+GPS^>{PB(~$v6*uO4;>P_0#Rbnk^~C+WdR+fd^(6d*#A7x@-SFp# zKkFX=*Ddf%rI@Hv5MZVQv0Qi3<$YppZBpBsth=$BvDWc6=@Jo znM@TP^*#EtuBh>J9zsh+rhmU>+OZ1p7kbJUac&lQg*{&ewY z{nOyO1%7GbSJ1>05GFn>1MZWV7RYnIM0fmq#f|y*iECysU+)or*1sFBTi}<`^{ZP3oI$$kO4_`{6s_>aJmb1MxnQQw4oj_h-F3k=0fow!Zts3t)` z1)~3$!v3SA-3C~IuT=qWN}3fRmdyX5fl-x#e#(9W#I<@ORj<5`m`jWQ)7{2g1;7+47rFAPa8M5%gs$Psume~}UWUfY{!`TBK zsbtKE{xKh~VG0b}#@9nXSw4#ss@aFuQ?t8@*_n#9N_3v5r#QkT~;DC=Ti}<< zv9iiRz#uuMAwPZ<$nmwrcl>{fYi6?EeLYfT%;|b9<2X}M^oa6KkM6Y-2%Uq>#E9?fFLDdJ0{Of0-iaE?f4mS zWBxF4<9>^{;MuC4xZfroUmH{ngBX=QxS&_+8@0{N=?po3q@E__O|U zaNPpGlyZ+!Cctc2Rc_oXHY=dLs>FBvmBhuFC~@QdD&itNtBFU4zRBXx`YXbPWgoxF ztXG*45DvIud6Cy<0k7#29cLKCjrkjh8}~O77rbVO$85!ftuKBYZh(u!4fs`Ft1B-8 z%xq0ql-K3~udO7y<8Li)%->SnxIbH5@Y+T^nyxLxpY=C~>lXN>yw*@&1XQPs^>B-T z*ZvaS@edF;=I<+R+@B*ZcdzN3gg#y>9EkG*cc%&Ak-wC~$T8j6I2Fson zmd&<-tVaoZ$3I-$nBOmM+&@}e$a;i&;{K81(XuIuKkNH&-2%T<=&33+0TpGVdpx%b zcpfjY9sf9SWBv)^V*jPMnk~N-f7U-1u3O-ja+szZ2ne&KG?vUly0#B^oGJ0K|54nS ze}=fwpu|-kr-?u7p9*;IS2^G%^8+$^0X34namE&)L_L_YMK?i-oS^ zUm|YIzf9b?f2p`;TQ=W|#E<=naIrrTzsh?ZTq*G#|0;2@M^W6k zf3>*E;}7D``j^9X3;a?Z>naZdDtMggViDDL*E50uX@c`UfsG#RkQP7~sOFB9>?);)CiPu}#ib2KERx@hfCe+^#&j+9?v7#`vLxjZrYJ-?|lGr?fIRVoO5Z^#XY!g zem;IWyiXa&`x~)~3(y0&y2!!_yxNtnLQrVD#vM+GB=^%ex_ERdY{F(MbRRHHxgNiG zR~!lH2X4v-)Ac}Oe!{qjyn0WG@`HeeD&UV%j?f6_EU-J=7TO)e1EPT49>T<VV~+r*9g zcZh3tLGJsvh(GJ!4A(92OY7x&S}zGOy9ISE9J|=Q_6m61FYz7!0dZsggW|^hhs0GL z_lZC2-wW3*@Jo5DuRI8-;BmL+2X6ShlNOJhe;1v0|8D)dhfaQZq~E_6-Y)CZ0N+vk znBvD3AKfM+u$)jHBuKjwDbgiLx`F~%2;w}MgG$nMckw<1_l`!?zHMQaSvV}Tenl?s zCW_#7StE=0lN|W;i)SlyGKB0q7f~g|%af{Q1@Ld{z}HCD#{YdC_`7xB(^IwSoLUFI zs1CdOGgf!|sO?p*HF%%4~5;4k@RZTyuRYRkD}9r%TH;IGtyryFb2f4+`9 z|E>dH=B?WDPpw0L=Q{AK>%iZx1E1JbTmCt9;MdoI|Gf@;tLEDD&#nW1y$*cX(Asn+ z*MZNe1HZox{NpcIc;UhQ(vyk8r>S*Er;$5g|Qabi<>9IL&{ zER zAy}b~oRwkU$~$lmgu6HO06igwRVB;(0A085dPuCtM+3uq`HY%lX0>pBAW>xdqg#9h z=l`m1D#wlq#o#J~t2evxu&PWC$e&}=bjO1^qOU!Go98OzcIDlzIglZLG>Fk|_&6xJ1^&v~s(K}w91U#8CN@e7)7!5@_NEn# zaX(rkgiQ#0Ws~c2%)$u2OKop2WMgq}{ODVt8A+Z1_X&a6*a0ZlcDP65K;};_%*Nq> zxKes@Ng=i#qaXvh!hF?u`5N)0e7VY9BOdR;NecGv zm+Q+r0Z4ccz>no?X1{rn)rW>ooC_piR(sQ8mSwPy=!L~xW3OD8k3`f)pX)(EGVYl9&PRu`mj+ujB z-=h}?Jn0npp~~ilXf^Hvew#l0gl#gs*KYx6|G)m0iO)3tlDAAAMh}LJV!uVxOHtx4 zAhhnieuoQ=T_6(g^`k5I`q5M8UcY{cs~*J zQu|)NqZlXu8o1ZE*Y6DqRdKK1UjeCmuiw$6g@*NCdduV;$fieA-i0r6uivjF|NeK} z>vzoHJo>+T{cshizHsv2z1Ob``)fXA)j{2%|D(V^Wz0bSBn;#ow*L;s{H`eo%d;~L z5I7EVi^y+KwyH~FOp9Cz*!MbhK*p6>*Z1so4lXyQ z*EM-T~OIW4^(beHgM}#{t3;7}(|h-13vPflX_uH3JyGjnKu$m7hVE zYOB&U3t&B}BCdT+(!$m`>$nK*Yap|kM``~8K_Q-!d5t<@4Kjg@!>l7g=lBSn_mNGt z(>@9*4WA+63K=qr2`V$iea~c?^n~fbkVW+5;v>lHCQVT)ABVz^&WkFTSihnjnWjzi z?SzO-J6->C$|I6*hmbcFATYe1cy+Mi!z9?y9+5{ys?G&r-%%J<)b@=4;@h0n;8x z_3aeUu}uupRJF;+9tf`rL9CdVWBq59j>@5L;+!gSc;B)?et@4)SjDmBU7^!7EsX7$ zX0Qs8z&}hgb%@i;c&0IerZ|o)ke^ZJSE8cfdPd<)rST{5(z4{vZ7)aKEsgn zbi&#Y%AsjGOL+`|2;ScZrAcwlj^Kz@I>>p-GTHVdF74Dh4@p|vLyB`W&UXM8Ka13* zzrjD?UdXz{lcOE|43zVuW+~~sC`*^EZ)zSDT4jNJZ&o7WFR zWedfW4ye?rFGOZzd))JIv>uNvJ|}+IRT)M*s|4=YH-KI)sJPN2^$Q}$8}9Ao*u%QJ z0c1NLvgI#Awxw~Fz%)S||8wM=Dp;6YUd$YwkHnejZ21XPi12ARCx0IXj`@iuDK^fL zkT2m|Jr`)+QB5m;87ZePq?|4z)q?aY3^X%1<*sOVt&?19707p?(2kgMe@s-!5!fWN9#p|*%uc`A>+&+M zst7;DOWyDoqVIU# zB>DHhWA1zN;5-@*P5J-swCD8Uzka8EQf%$Fpo~iTP;?Ia#0{aoOvSUL1zq(-2*x3S zSJ~EM#l{ikDNO_X1Mc-@-H(B)`(>f~`F}x_uutYW6xxGtl{#A>wbJOUZC%4}({M(u z3U}q5_uD1hDZj;qm(@8x=bSuLkis{mWpTujU!+QOi9}f*hiapB2kANUmcw`zPC}aj z#&KY?5?WiMJYI_{#|Xobub^KTX1#{*J4F`FNS;>WwD3_l((N=RZL=aMc+%O}W-|PE z>Ig4Aok3Knu7nhu2Ic1s%+FtAIP2(VAm8&IUu+(Pb|cY_5i|yJoE`7|2H)t$I3dCI z-DCL`w{T~JhZ!|`yl@ZlJ8F@M$@S9!?nmWx5oXxz2Fn?xw)fMmc-uYp9Nx6mA%%Ddo-L;tHQNz+$-V#b9LiB(sSmS8g-)w z8CAD#Jd8ZLpK*2k!6bJzpobNq8-9KB>LlQ?A`ns>7AfJO@DI4Ru!MgrCCosxDJw!| z5ZbNfion2fMbMY_l2Q$tczc6Zg5YxT59BCaQWiM$jRn*IS870XAk;e0Z!L3Kc!sXQ z>V?z~Fny*E6{qihD14=ZbCOiPws$fP#c9&aObA}Bkh9Ih)>fR1%L2?4WPr@;U26@{ zeh{=v^(&mW(XwNS2`zsIY%9F5cac=3j$XvII)##t(^|2>KB9HzAZq_4=S9}KuxL&P9Ysd@bb zWwi?gm!#0N#H{5J?Ma4*2-ZbHsXrGN^u@KMIbti&rYz#WsjgZWp`< zrPvy2%PsH^xOcEE>y=pylq<7}ZG+J6B-*=}N_X@#P;N~yAMwSA4bdQLmNV-uZD!9x zzEazY>HsuOmrNdSuwKXfH?;sYeOiWpV*2a?5lT564S!C<8M7)}?P&|k;riNL2`elo zEzjqPC#QK)p4{tE18+Fe^8)c=`8|ojq9jPPmKTb& zykyGOC~cZ|1w^)ehD<=4bZ`gcmuT;1J7B5JN!Ku51>Kru|1oN6sqEjDLRWc)TE7F$ zzfc}0R-tnp2DsCc!Y@@uu?w|F^sj9ZAl1^5>wAJre8%DEQd3G^u$&A8)FU!;Ja$ph zZag*!;vI)^u*ph=MJwrSos^L~7+w?kD)q2^Kt9mJR0MAqj2b!yE5jaEAN9)E;eCKS z!^?DPQ?-?h%IF;rDN4g=g|fu_nwZ}f3F+sc(6xyz*Eh)sVRqJn2=%AG)+>j$ z*03BZ^zcsyhu&huub<-f9QoT9`y*d`uh2UbW_e7;iiAt3UlvN{BYV`SBSS50 z4R-Cd_ozs zO`ZxHoTRg``H3A{ZorYcFAXFrS1j1Z&k7&IOstghunns{^j*l6KMhE_Rurv z;Djz6a~6L6v+2$H=g=weL+zoPqb0fv_-)R^4|Ol*YiJLBk7@pY+#dQq)A&p5p&v>U zLA}uN`vZx;fY7@3&<_R2E)a?KP`Y9drKgTP^dpJmm;+ID>)As;7M#!?T8XLcL+zoT z5U-X!RHD?jhknX9d5`UWus!r33RPhboeM~G8d$1FyQ5D1jkNxI_RvEio7zJUgD+wa z{Y>)je}_Hv^TB!afA-M-C3}Im$7f(P#@Gd{KbGwIk#AqW*GIVS6@sGm71}g9Qo?jg zP#MO(LytmPz}}&ipeS_l`&IqkjNhXsO|Txr{?9L@?VXPv8F$-$i3M%lmr>dS)R4bs z465`6Kxl+HNcIZ-fW0Y+^5&qv9blr>Z}V5|87WQ&gK%rfdhidpFH&v6o(oJ08ECe^ zVBlQ{noZpYU;>fyE`lFJPkw2+oB+zp#Q=zTMQ-h)(GYia7Kb6h-ZH?!1M?ga#gs_Y z_7kx+3G#yVoX0B9pufeZr7dBsC>8p-J;?xt=A2LLAS{9gY0~ zc7ge6ev9-5Jgf{JEWoREc()Fd`r9dj*Fgyzx@jnFX)vAqYP8x~o06HvmL~5K$U^GP znPxf3r=zi4?qh2a!6a&rO%+Fs9LVKBLx~GAGV%L^Cu|=rm zAXM*8;nfH&4FkE8fdiBry)}KjBjRXuV8wv80P|aI$mqf<9 zT=QwDUhMh@H46__v+&SBgLPY5#QL3Sp*}I~SLpfSu7oOe4cyn^4u#79{WIwl_@VT-7W(`y z)88!YPd^`x>UykpqTp8v|7{75zBGRoG9wl@CE#=$UzZ9BCb?frr`tLyZSgL_e@ZzP z2<*G}UT1F3yBe|0Y>2`&8`@}CHG^ZcOXFltX}^R-@~#28TE%qhjO$$sNR|DjLG}!N zQ|2Yn965=Thdl@yxj^hP%~2lCA+s+Etwh1roEr2wHhhY#$5?R%GOue}e1E0iH{rVj zH+>O|HZe@*>i?n~`RgDiF73S@PD3~PSK33p8}Nn02saXla|k@fDUCa!;>oYaDOSmt z(U_d@ICl_X79$&X9Ki|lqId`S_j0pNXYqFUaSbg5%ije09sLY6+aRaIyFVT8W&~Vn z*2D^5Ypf48&$)PpnRdt4xb_oq7KXMbN7f4djkJ{PPN6+tjLfE!$EX%y%4%jJhf9|I zZ&1`2Xa6bHAfTo8$8WWKh)^nK_NL+cyIS;6>LI--p{+m-g!=yR0d`7~YMEq^hM2{9;rHb< zz+!m{D!o*)s`SLA4;v6%$2$X9;b}7I{p2c%T78%;{p$}Rw{2RH!69Mh6Ydwtsq!O@ z^_;L#%Kpl;^=nRP*JK3qJPkve4t7-Xsi^>nG*!0sGMx4bo{guur`*Ij%SLCcYdU8~ zEf)XMA}^IWwUQx-3p)~nYV56y%bqYBIQbt?Z#iMU6O|V86K+<-Ryu2~U?7(ve9*i* zCU?#|qLGRbJC(gZs~2iF~~tFf}&VG)$-!C0g# zF5!-`nY9k`Lk3JG?cKswZpnDDw(U6izm7&V(GHUBE3_qII)}DZV-M{0rChDBB@X-$ zG4p?m97QwxPeq<*p$fo5BD7Tzp; zb9e9MjC0SRII(gZ23E$ol5y@G6enJe!@$ZoS1`_fgW|a5I1H?e^Lxg*e^8u6ISvD( zaf%NN!cG!v8&67~piVqG#OA$>KI|h~&yRbTj`UmTKQtE|w1LX7i@e@`a;*7%E z(K+Z=Dd6OXfhx1v`<{~uTE+Y)NS#xS2FvbS3b!1a8%gF?KpMO6BysOH_-UfWRb$+O zfLpXg+~El9WP8a_R#ALg<37VOadRMhdzf!~I37d2T@ew(=ucHfZ;3`{7^1I(=&E+| z?Fn)lggFrL~BaA z?+muXmd*@5`+c}(-DvHGDCnFqHmH3-Mod>1PG3M%DQOI8O%Z@9G_;DRX>4sq% z1iFPCCR&ziPil~|?8BA6S`yK+3~f%0iZdiEtx6o-v)v>(S|^Igze*hC)vR>ZugxoA zodEHM5+{dw=a>>OydaXs!j~?)nl}4N|&l)KLg9vFsM|)R)`yGR48GM*DTF;=+4BVI|r=}9md0hxHOQ< z?PydT{R}kQBZk?5(Ojr$cOalO(Va%@mV~*JUrF3+oD|9Jf^@+J_P}OGM!|#a7#n5g z%$0Pkk;s&qum(JbE;=CIiBAS8=)Q?ad9+$;rq~qB z6f=#|s#`Oej4ZC9H3#X;G)n6a+cIr5SC%n6X zM_*(X8qPt-0)-2W^YI^@YtBGk?*iDhaKpJK=b(Sa|5(7j!GAbs<$iqGE)}VJpH-bX zU^^8d%Q#{4D~;z|&uo?O!oN|Ns^3(c-{37kKEt5O&?$8nLWA>xEJ^_LgN3YNj{h7S z&Ic0K)u7!5+WFBypnmfjf^fROyj9OEjo!4e`zRpdGD3ug`U+a^3IM_){urqSTE4c9 zW)}FHmi4LN0nJ2i|FAn|n)NRU4I5)}%!n#u(uh*mUke-(YrTEz&n!TsM${DU65Fc^0ndOYg`FI?ns^?X;oADF2Qs>9LZ(hN_$hcbalBV*~uCU4-JLozXv1Z zuaBEF`)#DU@4$zgx&2JP?6&KV(T5IZZhxFU?iKEL>EqGR{setINZFsH?+C_C(RT@b zY5E4BHT5^Z$2LX2xL=Uwc3iT81fZ#fbD5=)wy-$`J*dtQ%V%skaYT|8{91V~6Z0Fv z0Bx`-!bj$`Pb!bK1D-MSlmZ|N`~Dr_E>n+h`5a+AzRD0cndMOxMTR)^CGA zW%NSAHNP9Ie(+m1D8m9}mbHK)v$1Ta43B$B#T`B>m!FFr0clI>Uqb3QO5fM*DyV)P zpcxpyMn;TZiW%6wzCo(zN0#)o&X2YJjDfL(^5pM>s8}0}2vwsEG<08w!80Lk04DjS zq|}iXN9v;J>}vhjK3Q4;6#Y=T(U4B>U)G!EM5s2rDpzFHYKbcq7B1!tY{dZ?PCO!s zTmodmO;IUy9hrDEk!_e##GzmW`6H8wUl2Lf)|yThS%q6tB9G`@Z24H(Xi1xen(eKP znZ~G0!>eUVMP;&z&FEaQI#FcH2?=unLlrs9v{eMEz9`pW zSI6Vak61kd-G@MT!bPh8We0M{mi50(n|CJAaszhj@XYX@@yva_BrzAM;IhX!(-ztE zm=CJ?2%TPx=(47*tm_Z#Bp*iA{TTmIT@mj*So;klcQa{YWK||u`p21VQ=klo%=uJ{f<7Ocm^nN7KL^jkT25r;6;#% zzDILT3Z^kxUZzJ8y4@&p+QUd?S)9q9z zIVFW1+#<)G437&*VRLRE{k&Z(t6E(?A*o5jhDBVLFU`ir!&X|lqE=dH+){m6*wOYh zVNja?N7~cNtXS3UX`=8dx2IPEB$cPtdJtu>!XSD6N7_@ZoNKh5q*SsdF>PQj*7N_X zilw|KwZqc%EMcvNJ{?Pim@}3%mi#?b*j*`VsqT^5EB&69o-2w+6k!(fDuUp6GArTS z5#0&aytwO?AiKcM-kXnr#$;r+txH2P%nR9Mgc#%AgSgVIEJIqZC>jC(yAdR_p=cDx zyN@wgH)&Qw45|haLzMkW+y{tDZ7IN|;!qpcg-wd|G9`Ou+?tN>6`7AU8$h_!%A4D) za--6m));Oulnh!+YqHKqq{*Zm8`RfY()=2DC<^`9{v@yE5~!7(iITh>a^gu+0BJ?7&Z9K~Kd2z!|_HUkA4FQ}Pa5erJ6 z_bBzOm~6U%z2Y%`!8q0G@)fj4AV7;N3TY?0ob53Vi|HKd4bv+sqLj1;YA`Xvf-b5h z9_nlJ76JszEmR!-b<=oaApqU8hQJ!4Gt*;h9}G;XXsPZlM1;vuL_-Fp-HhG~By$p} zimeS!rXi>Xz?Av!vr09k*1~XSw9~4~qnSoh)we_rwvPOln(S;VGi1$8I1A=HZJ2dB z+?81-<(gL-n9ACXM~gu5^+7qmEOY*Ggmv^Y(CmgB$Hc)YcNlU7Q}K;KF*_JjcU3Xa z?9Q0^zhmr7JHhBC_2zLj8Y+XieRJLngm#9X-V+R4>qC*f$Uijm~=y(JB_Mm1hF4DdLST!3EY^z#{hh)!5{|^>Cc2qGIuu>o;N34&3|WB8$DM({7Vz^16^r|eK1QvA zN%s>vG5=FKasO|0U^@Iv+_?WaU40heBYLy`hja@3(0w_3pkBHQ_^pp3P(I%2xfuMW zQa)SPy>$7j!A*=bXQG_dSaA=KfG`X7vfVt1`r4F=Tpjflh=!Kqf51QBPGF5L2vWZ0i9ZG3?V|f>&5gd$VG4Cm96@AOVN+fwk^~yD!C=jgB?EyictzvSk zZ6&xtPLE;%hzT3cD+9lS_^SV)&Dhp0*04vk{}_d~MVs3+DVtpWY4DR3>HkP!)Ud!| z{v$L}7M`DxiQ2Yk1Z{W~8ZmUg@%N0&a@6}5){f+BaHLmDzHbAm3P=S8G%>@${I(IK zar-t8LqrJ(!^Co}YjPaw`wAs24(1_N0u*4+!>`3WQs0|1Kd`FVIWq(^FjjEdNMTg5*3~+9 zJSx6)IQkfLb-$FhJ_qi4z|Bt#`kAlMP_Z~fN3;ihmRG+YLwkzY+o0)cm22$28f2Uk z*28JYcKMZOuwinX2Dnumixgm~Xa#l$+%O<3hw`pKaVZU&R1t*UMisF}*~l7-;~Z0xIJqJyLXZMs;Ys_wE~|*jzrN&^_c53Aa3#_a$kJJD4Y8S;{^5wAd%^(W zZY{koIuJ0~GZ_?MGH|_{kUO!N;%w8tjc4$Q%@rP3;k{?rS$2O2OuX9$zwTl1x*3+j zt`L~?uR6%kYlBMG(n8~|Ty(m^DOkx7bO1}hY)#k6iwP^xUbGq}w{noeA`ws_F# zhFhDP!hIN3TbmuOV?_62Kyk3GBdiCesxD_^7x4GH43Ykoeb*7l|l>nXTQ8v2pGpVEZwA$a2cpQyg6mYBPM9ur5!k*U!*mK7KI&Hz5=1oEzuD9B9= zYKAF7Hq6aRdRG%Ang0_@3!CJUvag^u-F*&|pO)P*tqm5GSlt}+4H$Lwva-nLn3co& z*U{SOGYpH~>%f!)t1TACS3%yjHg|K$6^rJw@IDlqScZDfksFrOxx0nS<6&!I z5Fv^#y7H5n>&=?$&0(%XFe#VqO65{@oho$g=Rt`U)0Rw&JgIEq1!!i|tY+-KM-jKm zfqHB^Yn#=K<*#O0a%z>~B-1M6iImkJt+kuOvO2=LVUqfJhO7uVH)Na2zW`P!Ebm3Q z4YFj6ZK)jYFpIefu3Tu>l!}=cONg^J_FWc?O;ovB?3FU!R7=Lnvr>V4+w2{#-NmihAT^!!d==Jn=zZU!WT5x` zhfd7@j!xYFo(}ZB0lMZj25+f1O z@so67eu_@qPtyS(+_4Wni^<2OH|yiFcJSec^4VMX@Y}o*u!D ze`!C5Fr48@$o`T|AP;T3tiPrWwR+eP9Y--;lc`r<)78%0VVq(+aw|WErqDnR`#5%1 zEJo*mnMYi%E6GVEYc~$aH7@3+U{uY;9Chi!u{4sjPT5bv2^a!b+rdgcjs%E*4=ecu z{G*_cZi&!MDPxt8C1D_^bUH$}LDr+O^AzkG>a#CzQIYvM*{;?d@`rz_^5@=_bx~B< zyD|xxjlCl_T-IdXj#>&vD=eL-(SU58F|y}0}Wm4*pjUCSsfT0C8{M04>2oq(=o zd|LtsQE52Fh$K9OPAhCqC(G#L1kh9Y1&fnT4BueKm!#p?3`6ySCn+A?NS`X%uQ;K^ zD0~=4?1#`W+6QzwBPV;p@X|y%_yGp5wG|+;wS8o8PedjrYobbGIj}te2fK&hwXl%v z{fHO9MuafZQkdBi6T9v;L#pA6WWRu_P~ftuoYv6kT_e7(#R`&sH6Zy7l6GRkh~sf2imfk`f(I^kx1l3Z9k9Xb17NeD-L@dlG5?bh zx}h6mDTW-5&lnYCzkcvmNCN_rm7{>P?qq9hG0lwOK=p8qK>!+x%0Q!uj!_wF!)?Mb zKy3w^i#)Q+++-<}Liw%*5m)bD zt%^{!i#AMLDZcXBT6oR;NnTW8XP0?ZMF`D*HVt{Y233dOHp1`NpXA3`__k$!RS|w( z+O`v35C0@DrfvH&uc`8OhE z^V6}5@QYlrTZbRZXxB2ost7-?jCK=V%jbT)u4|s{{tIyT5ZuVsy+4wMJAwbOuq0Mh2nJ0DwJ(7AKd zuz8z!Ld2C{?;QYS8OyvYL8Racb?-fR@qiYhu|Ixc>~TwM@!i;QTW)#zwh=Pk`@otV zfXgJj4+v&lp1VC4?i|R{)^{Y*S!$;uLAu3i88VPP7eXdZ;BPNyZwJx`#X11d7}?n- z`?Lpg43hB$eX(XlV~gG53}nwkKLYTATn>L4!d`LpFzT3`H7|uOBkea6h73 z&R>F&zXC1iFDM{?F9NMFe?KOk5OL+#`vd^Z-%llo6ktlnulG0nMDusu9cTMNMwZEV zp8+e(-!cjBbAqG!J6H1ePZjw~se}Bz0752C;IHNleUiTds>mBc%K1xCgZ#Y^0jU%C zt2F47{1s3I4MGOzuM2_GBl)&xVL4W5+9<_?;!U@8$v?tO7$zQsF<$uQT$kO})@C+< z!q8>)+2$1Jk0_XNY`<~8i;m-uCjrC*Ee5bW8A4ZrxE3}J;Rhnm?85R0N@K;{F{fea z@}P?$dZWF7&}72whiP5fO|0|=>8W0#ar>&`p79If<|XcgntTcUF}?>?#f|d)skrkb z?!=mW3H>p?2Uo?7^8Kl}he+HNYVsxY$M_yv6*tQFr{W$aaWSc`QND!!7~lC-aie^H zDsDmIu2_>Vp+ClVK~>x+-+FPwwy~#HW__tn>NSr1et`yz%8M{ok06ZRiZB*o5JqoB z7_&JDqqicASrLTMTM(th_XP6iySu{c$ zE5sx1x)j#SFyO3Cm+g86!uhAs^(?Iz-SidBuW!NRMxWsj%X}oL{njuDT?px-UlFoF zyH8omD{0W)1JXJke{~~%4^Q9NW={e0SHY$CC)2V{t#UDz+!H-^8s_`kYAgY;L)Shg zCg+TO)P?+JVrPIvFfhOpwK|;wf4Lg6Ij5}C@G7O5y{x{W682FO!R&Cx-y(>=1|z}@ zw`LG^%P^{2Ajs^f1Q>r5>|&gN9>KckO$B)z1j-o?f;TK~LV(-j@>dMTi||H}*dP;D zb5`FP>oN|(xJxeK;w;h$3b#6L1be2ouL2B zN7Ah!D!blCdv(7&|houYor8etuGnYAXiY7YtX5O=sbV1sUN4R)i@ z*^_er{i$pxaWh}C%6k}zLSEkn31LzlfqcQnL`Egod^NU?O@UvN1wMfJFYJ=s+s+voM|N4 z7>N5e3&6~8haxcVVTTC%6N;HgnF|qFemd)sUlSOuFW?wbANXPsI26FjIj*oSW5)D68M@E3znC;9D!Ge@d;C)J`|koiaC+b zc7B?*Fdmf0_fQwVka<|x5Tpm|;)MQ~&U8^#+^Ej<>O#^o(-PTDR7B+rpo6P?m-B(B7ow%?- ze)4;|^pzS3llS_c03%I`oKo>yK?O6Uv5b!C!ZC--6ZylVKw#}_%!_mk43i1U(Um$uA^xLYS z8A)rdBOQ4(!mtt8KIt7_!i_7T{JVhol2xJuuWFmy0dc%n@ryoia=_$#{ggf~huplH zWi)RGxk6pKYuCG+C^THL-(vqlylV&J{k{?}E`9m+z-z&K0y8o2v{;V6vA8jR6LI7I zrs87wnk62y68drfSK`n5GvK-fe(9p{0T`fKtOW#^Re)HMDQ?YzOg99)c9-amzpJ=0 ze>ZXC{vP5gi(SN@^>>Er7Wkzs<|qpSLKc$lqGRqx`t+cZ79Fz=yJO93OgGIe~s`GRT%S#vfUcU_G{tm_{WGF^N$rb?*B$ymF;NpXZ@q#x&?lz zY<(&l0Tr@Mw)2mmTALRkAoHVGp}6rq+_3O{%(|p5iHm-bUGzbp4Y5Ws-sqgcsg&_u zp?gv=5ZqO+KIUb~gs)K_F254iPV760St}y$ZAf2iAbS;Hu-2G7L_LBZ?dipw;B;c| z4u3iK@05Kbxh|1)2(~F=wc2VMWw|R4;eHYLu@Q2O(7znA6x}iNk$i3kA6pgB{n5&T zg!OS`XtBJ5z_yp1Y#DdFdH7B%AN1!ar#B$JboI7*o4IA1x9CVa+bL{c;sFt~y`6*n z+9hyzrOW#scSHD{lqDwF9^}+9Ws&SYHXm~^B=8x_cKSBu#Yx-OEa67FB(yiM_ht<=9!la{s?A$RTu&-?*04|4pIq=N8QbELd+Bp9I2FUb=#pCF+P zZh_dgc?TcuiCq2;)YwMbe2mYglsN>#_I!zyr7%~T!!B_=3fe3Suozaju?|z3yAVkU zd7H!AGYQ~$yJ^F0C7f<*Fjra3>!2-r`Y-hsz?;){9Kfd{4tGZ8@_%I8$;6W03-EY6 z9AeULcH|4)y@{sP z0Q*ZLbmL|U<-wt(c9Eww6(yXC5)MKF!YL&@l!W!dFYMP8!ttE>7NY%hz6AXn+kHYQ^H0Wj)6F;05*JcTyktTU{RlK)F6>nd60` z0e5bxpbteso5S$anCxYt;`sjXib5snA1Ty?)}T!gHR1gWRi}MwhH^_Cz_nJO)y+m6 zDaEE#Q1nTU$3Hb6S&kL965J}V#Lp5W$i;Bpd!IG@Wu5n;uVW?GfeYkmXWRzv(`>`$ zBLoFPEsOTq!@I+R@9prNUd-HRP&3QWh#-oC97%}9B{*TcHQMj|wxEB*{2OyyE3=$6 z@j&UvQgT-;p+R@V9#Fd@+0Y|5r1e4-p@0jZ~c6{A0}PXYga@qqrLuqpn(ucgD{=cD5ZbVWXeUb@PN&V{#q^?`?)Z zId5%f%h(*OTX^t@#6YI=N3tb3C|l(EjxM$Pa!O;iwI(tHxNmo3xX(dWT>IvI(1DIc zDvx-*>mX|y+tra|?|p>j+U2=)*?(Q$eeKDWSdmdi`+g|{+gfKm%LPx^t_r)cAE%xr z9#E|uGq2!_+o8hrH)i}4+k6Vw9E#GX+7a5n?k?^QQnK~G?@{!&3-=1mz}|dRgFI~6 z>3*UJUY9kpxCdEdZ0Q%zR_1Gv?Td|sszrc@J#f@10{Fx_@V)E6FRcUrQyqAERBgVS z)PW!Pd#9$HPh3+Qeo`GeD?V2ne^wp%O?BWe*MT=JtWAHFI`Dn!z#pjtZ+gBq{q5?& z@2UgOyil9Yr*-me(h{}H>x!3Z)7i5Q{>63RZ`Og2T(UOb-Rrl^uX6lUjp|#J zTQD%_In}lXw}xwU)K4)i?>tr05{FykGh{>qxoy zBUy_X+&Gj&Pzb7S$h1n>MazcoRILX&-UO}ufue`n{>h?;^4B{Cqnle0?{CW9W9c1m z`>1)!fjlfZjL*LYmMk;Pn|3*0@HXkL4pkC5!J`z(;HM$~E2sdC3DuA8M3iL08x4>= zdzk+>(3`wwe0w{hqGP+WX#6p6CwzJP623Fx@$Qun6;q2{_{DQmlXG%!fSlH~$^tH9%c0P+MPsAO95ObT&#k!t$G#Gt1AhVqspZ&c9SshjQT{_IKMu&8ff%_4+lv9Qv3mxB zTWk}@2hMYEgshf(SJdkk&IEFJunlQBj3T0@UA`$kgUul+mZ zcf2GBr)6e|W0UYV*a;7JRO8|eDe{j8?{JX%4E@uFU1RKWIu{v*eq|%@{t7hF(&99z zy#v!F$TX0s^n?ko5&lLy={3Ra3=W=sG5aXw2w8kUo#TKKjN( zZSK$0cM4$#(f1gA^WYl`@>Y9$E|*(|8ILP0A2da-cz*_4YyY9Z7!e+Mia{E5<$b)B z8RtRzcz^Sy`LnV3*MAuB7LKpbvAt0kj=UxC(_cVnkv|^Klc|FlLc0J?hA;U z)xk!_jyVD9iw~4%Dp+BcaN6W{0FVE$&PxB@%NdYfsi6Hmr(TrmQFLP>ySWva(-|a0 z?I3AfMfy3o4zAQ#*k6N!fQYUyuVFQA7}mLztc83p`6;S}@)B0z%MfEJ&T!*^NN5?+ z!40MEs-36{;WolcJ3%5gBrs;*!nJJXJ09j1X_&Vgg7Oa~-jZ&mtm$Sx=x(lk(ZqE( zmt*E5I;O@c1Y(uL`y8Va^rE#$lzgbitcx)IsVefb=-OsgP*Ale$X>HFYXNC~{L2ZA z7?B?;Egc01gUH&F=24T{t-nF8Avg*g)G~7bLc(KzVigF_{OKV()#{);j88AV6;W%Q z^^+?W8{`yHqdYE|lv7CPpKn5q(E~kGSpJEWe#mjS@DgNM4!Xd*5vU%vWT(6F1I&8C z!S&|nOGT^L@sda{#$KulyRn=LEZdH4Yin!HV_Nrc>#TL>Uo2P89m4;HI!EjkvLDVua!xqMa(5Nk$5}U`6T!n384(ScuP26&2hoHlCx(+f zw9EzvhN%Yx2ZpKkL=Fu1%r1Q^LS!q6Sr5X=<$OT|<_yjh^9-_{pO&!}4BcDrTpCD{!BvhYv%WbvIS zsFv734%cA@L%3T!M-&28Th4}mz%80*9M?VA25zq%{RW6=82=#EH4ns5Q=x1Q@ zyg?ZK#K;H+1I>{jRy=c^Z$n7PFv83CWLW$gF3H((FAS@tP94B_otvneDDhTQ20)d5z|aoUOM zT&CUAPDC=9b=nPbH=)yI?P`{Pm^{O=i2BNK_6J9ya`BA*g{WCjt1qGx^Dm||;2zDI zhg&6}t`lNrLNwJ^sMBr@8Y3yYRHWXZKXlArpw;Bka$IK2?&dXox$Uzt^JKb3#db$c zem^$cxS&?*%d`iGc4ML!upe7zX4nTi)?VPb1m*s9AonGdw7_4@!C>U79;O-=uYj0( z3LFVLh6!V9H%DU(Yp63qU;@H=KpEEGJRB3?-$v!(S@7S05YB@C0sL_m{7N`o7U3r= z{Cb7oDDYOS7pzZm_;VtI;F?(iYK&}M*d@%dvfjWL)Gg{3%Y(#d=F8bZzT6C!D9>By z47leoy;_ijXhE_ra1Y^l#2w3W95MDxc+D)73oh*gW2fB}>$_fLEo*PG@QQq)7KFb{ z#v0KfV~k@lhxykH0BWT-6cuMN?HHX-`!-N)doc!C10#h3wt=8tIJrrG4r#eoLq?_= zLnhk`d??rQCNb;mp0-^efbS2}mG_6~K_J(3IjZ2HPuQxsG@R?^uOmC!dBg7Jr8>Kb zJvNT4-q&YbUEjt!Y?E~X@Rw!Yohx}4^KU~Iy zc&D z?Hc4+8ix}eVdgvjV{~GY4gRC>2d^+8mE&>S&J~cv%V99&y5+SMxsA(_?*e{hSzkgF zc_ONxfpP;5r_>iRMNEtCMM#Ju($tMxF7TEi;&8PaZ&V>lCWhNRshIeW%U6Mp*#l|r z#ol;~Aq8R;C@TCCxDNtbMWo1ST1f!(coAR^g0xuH2AtWqkL6Bmq zU%g-QDt2Pwgk(emv%QPJ8he`gz7794UbDd*j(=t<`xJH;C*U8qs9TrgUyLpICY<;S z0J{bMtc?5{HEFzct%ExzSto9UI2_lWguFa=@)X^;R*I+LkL#UB1MW?fTN)fyzJ^5c zK7>~0^W{WQg^z*7`v+nCff%arF;Er02L_>CK{QqP7^n*0gM-knB$_IG3@j^rjomjR z@xeR_mb5BePg-S4H9hn~OuFoURFzA|-vdDa=EYUe5B;i$*P-`9o-2$@|@mX)(1<&9ksEA4@tc~XhWd`@`QDWk8<0fvY8cqc@6^NGZ zejFuQ(nO(%a%($ZB9P7PvS!=bgqM_?yenbtYd2f5-t(0KEScg$D(z(Fh+j%tQ#`br zvj<#Kh5Ca_ssg!(soc>-1e?k^%HbZ4hRm@1Ibh(8fQ*Puopr)pi)n<)3{^!~pAcT8 zN^GOT8dW(CFSMFiQgSPmXDG$GPhYOfS{g*%0`n-7iA=80$WlR(?uYzZJQHYm`albr zJ#af-LD-&}wH$lVv6>@$iFj+KwTF5yD78iiD+xJ&71*SEKmI<{#w*RzikdRpAuDvi zVGe}Qok~#7-2!ON>;iD`pxrv8%fO03pljOc+NM#$vd?WFxT4ep6JG08RF%u&`c?3U z0AB?71raztt?Tej``CMMsfvVs32xl9#saoJ`iLm~KLh6pz%K-x((!LqY^UNaM`nA7 zFJos)Y`E*o*a_3g4uGfSo)j3NCI5B*Ml}0LC~9j6bf%$0Ei5!xLpa36y-QGb+z;Ah zaW=jo`>vbOx-b*)|A!41^Fn@uOs))z*eZVaaV$5ZpE|2G8L!pg+cBXHda;s zNJP)G?8bBj@kRWKS$RSS@KD!JiG6d%|Hs~UhsjYKeUD}~-CmGRcYCJ*l8|(#MnXsk z5GRp@$WanG=V0Q99YoM-mLo@zb4DbaY)m#_zyyN{BA8&nn4GgsFmQaoU)A)^hC4}o z-yeRT?|JWeZo8*LRdsiDcXf4jx0K!N`fE#WWko2VrQEQY@UN0mQ+`uj=B6z7?NV+x ze1-+at6+2z;X*oK*tisoFDr%0vCYm4DDDi>C>5gWQfLdg?9jzYVk%?+TpA@Un~)|{ zHs(GeR$wfd1c(yD3MV5GS|!+saB>BTplL)iF$LU(+bgkvll4!1`TB=@3QCA>F<||J zIykcgpmHq~X)nu!3o9ds&Wxw*T1e&g%~{?^Zr>Ax{x{|J{oE#m(I^W~ro&(FrTwMhHsHxBA4|Ec+-sjqv?XL=g&X`3ruSUVO3oDZ zaAT1>5_LKOh{X~%Xodj>u0`Sj!)Tx8av8`f)CS4Ktk$v3C=2?z>ohp~AEv_z?*_X7 zId=q|c+HF5CspK@iRd_Cm)pC^`;@(jZIKD%)nV3+CH|@7B_qV6tdFH3F6PaxDtbvR zbNjYyWSJlnT|kBnM607tI@1utKUa41UF{we$aEZYiw~pkRZ2(Kvtz1&%t#TCqxPwD zCL!xCD0i?C2(h~Xsrcq_Tr4h21DP^pX%JacV$9WgOgY0wYdwA(ZJ^%*g9Y6{kE|13 zEd{v2Sm5yn1+QU4D0m$|{^hdAGRf6@sC?8uKs%l8@ChdR;CaLK5XQdj#2svnhFye25-*%K%TRT@(e`)bI&XSbfzQ5@WQ-#Bx%z%fH%k=HGf8r+VgL zOT(WF&dFbejkx^L_HzKup|l+ zV!1_qy;Ke^6)Ed>>0ZKwYS^0m4f|J(p6*&~H+Z`i9BJmL(VSS5N*A>txf(Ru#WSDj zN-L{0C$^I&iR?l8NNcS{w4Kv9MXP^NX=~WMj5#X{>|?^u4sbkI&&-g|33EMHj*rAV zfe3_ge28EFMi_M|l$Z8nf4x)YVlR9SUE1{_Qe`m*-^H#zm#U28u~xG1X*oq*K0s~Ya1^#!h5ho)2*$+!-z#vUg4M$a8O;CBXtl|ejDH%fXoG!-;;}yO*f)j zv#s@R{yjW)IIy2T4b>o3o}RN%YDg4q!7>O2Y+kPH$+gaMeY4)Zd?Vr-Aot&ZN=TWb z0WquKQvQmFirOqA`@Ba2H!PDBo1@s)1x+b)0$1dCyOJuebmpqR0(oPdv=R=iw}XGN zl4WCg@(!d-AGpmQC^5G+WbkO}q$eUCqt1Q@Ksg4u0w@c!QoigmIPwvdkM`PW!PtNs z>^U%H>I7qi567`7-9U*VD9wq(!5gChsjhw7#<~n}JsY(Z_X_h!dIE7tCAoeZh&uJp zFd`|wS~h{c0)J2H&+JvB(DEJKj8u!66H#=(1A+BoE0Xp*;b)EB1W1u3huVr%?2>VE z(|L1kXT%;>{_q?!$jNNuh{vNI#L62hTa-~f!N&a<^mTKbvWPPoD(H_e00!@4K0=!F zJaYn~ywVIll`{`y=M$L$?#Y^w{JIWeP6f{4!{)=hq92s8ZNrE8N5EdAKGl{kzE)Nd zf0v4Qj1}<#5Os7j(j0}?c-wmTkVmPHQ!RZu%VAC;8S;xE<|EFQM-DP#&; zlf`Tut05XI_iGLxJxvsQ8q~h60CUaRMCF=u=;+v?wwdQkdz^v7W20wP1DJY!duq_C zRL!S`tV-!Ar7sz$hOJ6*GBtdl=%p1-e|fL^Lcj@*;hf)fIg-?nRi6f76ezJDz>-9S zrTpWNM~-Z@i8vCRP71Mgkwv(Eq|I3flZ&v?c`iglcUA)F5}CPe_-Ox3l%uovM7SV7 z23cF1yht7_9)YMx9LYXeXJ3$iNnB0{C}>4#k+S;ljlddot4R}8XB|Fz#ak*dYkvSQ zoj{Hte~AZ(5q6>t6A!{ld}Pi;g@L~=U|o`rQqEMwUk2LsGH4kM(cyU-)_)a4gc`N+ zgztCw(x8;=`QRLjyqW|!+TKZlbwv%VOMuLLN2?MU^h&UX0!KE6wG=+fU{PjSz&c%s z4o};_chKWq|9MaWndLbSD)-}_5_!4>*&-S|k#(+SzUQNS?=qjc5W@)az0hmEp%dGj zH6XuU%X}|J`QAgmRDr)zT&xM?Su6ng8-XkbjxrYks<{|H{&>8hRj>96{mkx z5RE3l4|@fwxw$61H(~7+T>pNgFqbg*WAHU}UB)!7c^n^@5Ld+LDu?Shq$we2qy^;o zIS9dw^%o@UBJb7BITjTl4+(4^Cr+9xkysuWoR=NW))_K+STAc z01AFR#3RdOgb)q3^yz@QC*Vxono3V866EcLB@+yn?FZqGR>Z@1u>1LQo!gh!_Yz=6 z)+!gfAf0`u>_*hNZX&v4_2Dre5&`&5m*r2vPh-lb;R^T32_yvk2LaKl{ngr4d$0nE z)PT3=nC$`lGB*=gn0(CPodJX zIRhmAWKzJ9mLDvivb(tqEYeb!X|Airs?U>6?PP0E6t6fMm%-IF1QHX;=84*;)mb6B z_r-Pgbl%+n7Q6VPT|3vdcd#G46!nAm*?&?6IzqQRG-j@YS!xIR!prOntAKDHMk!h8 z=2o`Vb;n(V^-2Wm1HzI+(W*=iL%tqVA25Q7g=*P ze0T??CJY<8({@4@&n=rPKpNI^NZZZubF}@9n63Umzcpn_t2yjTY|^?5Y4!{GGW(ssapL*QbZkQg9k|02F8rCntB{~K5zqA>6# zkWlfaWF?lKDgrEKUcT*91}EK+$p|GH86mKOu-W*Rd*GnQ78;#xreh1WA!e7bl=8D+6R|$^`yu+-Q0`q&^@bv4KPiE>{9a zHKhG^k}HV}`mpdp3*KHi3@~00I(taS3m~L|5%j=mTC}H1lC)6%B6>+_ZlwZHv z#=6qYJoz=aLno^uoAfkK``d5=wRhDVBti)me0ZTV>o12N*B_7HwuztM41}}?DR5fjDKE*n!K5agO(@@((`WWfIy6P6v#)0K;CoN83a-;a>(Z zHuN5r_YLaMA(te~UGhm&Z~G<2#N=z9(;jG?{=0*PXhTn#`E8a%PpBzq?#m%Sp$@?Z zp(f4U0yc~9(q|dmW~XtOGk|cpm%{SB1GrXY>dF;#3xY3Euq^JitG)|Q^a3(xCdA(B zy}t5#+-ob{qn9+eD=`&~QRD&ID}R8z5d5X8xGRrUpZNol^>&Gzw1eAaE&ST={fxeI+=q}Zk(5Xp1Qo2iAyKhpa$kF!2CLbSugp$5aSc*OoXuag_{hU#8tYp;?IS3 za8m_-DUNd#2Lmc_OmYk4JO2jokJe3{!!FOi=mg>{FsJK3h6;@WzKiNMs_)0~DfV~F zk99g3n0M-|!Roer^G#HSfkK~Ik$lrE{#-Z!ZmPg9rS)8;l>uhuGQQy$NbTys04pN< zMvz^8Ypz)tO2S3=?PjNWq?Nyv55A3PYZrR(zOK0XtZSS2b72l{s=zO$@jRuG0s62j z=+gNvDQDfj1I%DDh^JlGDsUm%;elsbN?>UQEg%lBX2VtK&4sJcDeyyqpAX=vdHgnO z;D_}}*t|31T=>5SY>eG*a194Er)zVBVGJ7aA$F+!YY~R0W++Nv;P$V>XQv}iNpXt! zEj}?>;U5`%T&M!y>(1+9`C9qTmD4|AeuvZ$T^cguuW)2tY&SFZhg5)k3MUyMfrT9C zoCdyeR&tuA6EyuDPSc8F_KL4&zPppT6v;@(0f*YPbU){$lQli(3vN#Qz%uH-&+uJj zb1;5HhIJ9?et;mdlRcGO$G+{!oc$lkKaZhen`?7x8|nMbKS~<6z(lmyr7QNj^td*M zZCB432)cffJf3+DOy60PCh2hA{aMoV?`Lj6DXUUi9vO{vJxqt^tUPQI^~X1+Qn3Wq zERJiR`LcO9{{F%|!Lz`QcmBBDK%&x_iyEC&o&O?6VTK%1V1eic4Q36!^v09pM=S9JLMzx{r%TU$qipi=wa_j@Vt{FmSFc-gx80dp(2n+=nc^^3K zx+6i}^YXJnu9+;|6A375N}7JsnUYK+_AZs<)zFEZj!#BqJg#j*5A*ynBb*d&jav%{ zF|6AM$yyt_))$tBgn9l>ZuXM|r-77tiqa`nGKy^oCdP7K61x1T4fcqT`EC`0?3R z++HRx6UejVe=Q}$Hu(>bZFzPq=tQ~sOrK)(2jdgGo1ZzwnH})qU4Lj4!m9R{)(`(P zWQRd5w%ycI=YOFdCE5Q*zuNt;)MKA-i}XC_I7{8CZ=Qo!&LXdHKSMmI5QO3WbPW@a zhT-aT4HFN-?0lBicKm?#{Rp_swzl#@y@O@BlM#Mton>#%$e%&Z;j$S`jgcOli8TUq zqp`ZUo#UEM08plQ(PTN;O{Nt)3}_@TmrZ#1J@^!T)|>z;Qf4KJ;OXF4bj60WnwOA68q@g~a5blLOCp_rr}U9b=U;>IM#M+? zd&#x)IZC86o_`X+IGKbTFZPe;M;*p;>GhPg@JwXfjZa~;(>00Vu!u01f~jzZ^aoJy zYn&YK!1K~|7!K;7$UP1@%a^YVo{&YT#GAi`5qmZRbA?HRRUzI30KMJ{{l;+|nFOxS|Op4_@XvDAx?oT0CXhT2ubX7zRd%qffo21b69t} zwjn&tJP4WjTsFt3%FGcOsc@T-TU1W|a}Zv9l>K-nc&B+l)VOy5@m$hLId$qL+*1JhJY6RSMXt>-S!b%x&RVP>~Y4^a+MGhYtVG$L_qc=XJ@ zCyH&tcV+%6%{)3b44t^N^8jY_X5!@GA+%Ry428A?uB#F0peSs}hOWc#m62v_#K|XV zBAL=<@|JNZe+tM(6dM@#L$gMsua;!76Y8m!R4Y$(qgN(NjgN^}=jG<4v~x?^>7quO zXLx9)){ZvDoIHg)a|ny=(4=p3J%p3qV$T-6pxVZ#YeiX&7z>g)-$`Hsp#|H(2J<7D zO1QONz&4mPW^)J@PAd-F=;2~acP;&K6lMfdU^i1N*jk!&h1)U!JcxbEXi&gL2lIoG zgO%t3Q$|(f8+=0-)|8OG*4mW>u>670viZwt40sM!IZWgKBoab1gVK+zN_yo^ooVjoZ3eTxP zEY$%8W?OyNZisSi&0;;*&OEkLy4oij9XX5-0pSV^D~)&|zKB~LN+Rtl@MG6@8U({u zhzK3sj5L^^$IWW5o+lcd!vVjAw0LVG)F#LC#os$Qpj1!ftb-e2fxsEx4kDsc;r7k^co#L%R-O zIFr?rO0vy11?m1~ZXhS<|KI9$}h_ypp9^G0c!q@YPj68fDU2-Y8Vehmvjly z+K1yqJM+4N)QZCq>;`9T#1E4AUd@hOm4jtZt+x~F-0Z4=SuRsjUczkR3>NssS*SL< z*4rF@JT->jU`qyfGtyjzGMKAb5UGTCemY(hup{EEV`CfhZb{9FZmO) z?>bcSYd_~0A+Lmf0Q=3fTBAnb8bxqovs5P{r`DNkfuJ;#u#K=rIUn<>tXsr`WC**! zhKWbRF0^6d(Xfkbn0PeoVjCtNgwbB+3-rIGqzndkpQnnKAyH314AYn-xy#~U(0Uqa zJYiPsQDl+I-wHLGG1r0U_H89Ku3NFGFGp%{hNRn`l4PQ5PXq;Z;C`-Ku!Xh*g2UC& zjlh!yy8ffYy#{=?F;|DbC)LOvqnE8P(!iW)9J{$@dIXttwq%#ziPU-`I~3Qffz(7u zEs)MSx*2Jp2OU?OR+FrMjF6FvFynL`OW>Gcds11Z7!E+@wo|n<|_&LNtzXI4|K}SQFpuW1RYy244h2K?oJ-n}7-^&^LvH*5!qV7}1s@ zm0O@S%~7aNJNwu%hA@T^#?ldt%@oEAh0&leh7rc*gt12rj6u#>pldk!Gg2-^55Lo9NdVc}^Z7e%ngozDi)(|1N?sdCI<}U9gOREv`W>p; z^CibRH91=19E^-}nCp>k%JV3`Ygo$Sx;1%QnRgq(#z@V3gJ6>!>(%7Q#W@%m=P)-C z+n$1r?NVI7CT|<_ZY$UrX>Jlkl6Zrf#O-lnMoMCHGjgb2$+ohcOFSnB)FWgJ@#Y-I z>+)JaMLgU_Yu1rYfa+g{>2%GEd#>0_{#Tf2vA-qbkN+h<079yK!y4KKkv454M#fd{ zbEv8BqNXJ+<4Xfi6YC;8vOoDi1eEj?F3j{cABcHT18r1;X>eTKjEt+>-w~J^yJ$&M z=i@;i3~*xXuej8HZv1zo!>LJ@z0PK|10yjtYL4=I_sy+k9V70a_f79`utBqZdchE+= zX&bo(LQVU7Auk3*UcYK?0awGn6L2!6ROmCkHJxs?Or2|uR4X^*C|AjNdZM%1BeqVr zaL#x~{nV91_H{1$05Js$eHKAHsOwMVkmq<&C zFWycYX=sx|ZKR=1MjG0L)xhG4R?*NF2g{PQ878T2fi0>K6_U9U?d6 zVw`zsPNy}bIYAk{rLK$Pd@EcM-dtyG(Ux+)!FPv@A=K|cKPs2z`gQoI@1o#|OH$!S z@0Zmh?4e}sh{9&%08+Gc#Md+&M~W7S30)-C`Sr+35W)y|^fq32{-LarmC^MeR!<{! z_F9Zul<2IwQcaXEPOGrlj(k_|9l52f4-1dAI$P~)dF(i6i&u2oZo%S|Ytv5FO)q;A z}jGvowlQ#dF-}AA@v;>Ac`Hn6zP~0=54rq^*}4spNf*Ef5^=c8Jrz zJ?3}fTDBb5@V;@46$$=zmIY)r{$8ze*bUFHNG4d>!k))gF_*3 zd8R`pif%U2CgCLvJj9A&3#uSaL{6|Py2D(s)SnOzy^M@#<6lmhBd`jA&Hh51Witjy zVCcFL(pT0#Hgj;xj@;*AUO*y$eYC3+v@t#AiZ;IvK5PMuKu+AMs~>=bPe_HOajVYR zV3xKWMlxsTU7XdpRv(J997y6!kUASQs7>~dlpQ(hQ>uovHPTSH7s|D}maHL&PV6hEgfRg_Ji|aPC z7QVDG5QP3Ydjt}8o9PUeW5gY6Qn#`@3sQgBJLQu-rjVf2ssx@@Cla=^7lt>SoODEg)Z68-x>)Vocn~b z8`C2PE0`&_OPrZUP4o6lfQ3VT7U+nYZ%2k9Xdl+AoZ4L*A^y%$@a5c8VelMSt@B6$ zW97W2nZk6tM(Ii_QzO~8mEcMpOHS^Zn;f@+>+gVM7&9miq5?^khM9GlA3>zb^>@OT zSr0$9s)^0@x2X;$v97-hfQ&kOM#`zzGf{&^ys)uwvU60qCQZ5VY+w4%Vj*%!<(meI&yz6<0uZ zsA@GmO1n4W`H$Ij5xmKS zcQE1I%XCLX>E>AGv~^IGE{xJ0x0rN=DBW|PEE?~TlFqVkRHtK{^RPdOqn4=CWjKbo zDyHQ@Zd;EFKHiLctf9p%%GL*)%lcsSG?We7&Cu2`()A$Y17{Gh==ZVc zGN=I9p$PW3g-#qOppcrWC>UDYvIa#5QK)K(k*Z)xq@+EX6BV5Trz&D3^N3`QmP3xm zMQ9ja+^PmmC(&$&6-Y-nBh3SV)sjl(*-XvsCaWM{a45@yb7V1^!^_c7y%nKhcya3* zG-F~kj8rrk^kHyKGpno*G;_<*aMvh8!|>uZHE2wXhLMT}69k#5IomgyVmTVBts*oG zFK%0dX4x1GBNYwWpS;LD(Y{K* zlpSk_ZFa!m&j1<=cy_!RhkUC^KA&nxS2UQQEFMb9H8R$fGHc$X=*L%=y!qEBMhif> z_QefmV_77twpQreY!9v+IfBVpxKz!3X|a1NO$4Ls<8?DKUu8$C zq}J9^(t+y0S(C6m*`UIK4%rDz$>yC>D_2HXqO_b@u@|1EH1X~SSC(9rl>LP*Bz4Al zrBqXjn`h3b)>=zo1e>uTK*NLVCx@ZO)QcTW+CLnAEcpDHNRW|B7cz1qhfwPu3N=G% zP4|2+Yr4{ept51k>56P6?OhtvwG1<)or$ElT@A~QCCeTGLOQw`X&z$hk4BlQDwTCZ zTjJlKTx$zl-8+yCt6;8_iesaA8!)K-$Yp@+MAymH4$wB?a_)p*KvI7meoBgqH+xZB zWJ+x^fNQi)Y!X^oHR-GdJnIMzo*}Cjx34MII2KDsNk+;o$h?QAw3}jidIVstOIQhm zWeuJeiHx3jUIj-}$N2+ACXZ}xlCm$qo}@4CP=j^37%L+MYjMY#WaHyxjFcfD+}}9_a5fY;<$Q9K(9NyefL`(m?FkyY zsAj5Dvk>wLF1M%E2ORF0`bYEU82prY=7lBUnN@a*%QXTBHj;L$ZRba-+L?ULI^S68 zd>M9d5PB@|*LP{19|ynI`SB!;m%x;|>aVSHJ?pfI)RpexWiiB+EG-iaa%v4{c|c`p ztF1H-U`lW{U2I+)s;|l0Pwt4^O!DgZDAI9s7K(Gs6u`!HKAdAj(zA38L^y82!`$hK z-Au3xB<#5<0b;Jk$QY9;bi&rnOXvzrdJ}1;jUtb=&lLE2y7U9ow3z$3!K-%902_vXz-O$(4sT;D_Fk>aXuiqG`2aS^4bCmVw>4?3+M~J< z;Z=K7$1_NBdOq_HHRqwtA*}9=2*k+jvP;>3u`~Qw|8l_ir|8QW$@?6zEhUL}tw}s7 zPRvM2Y@WrSTrW0h*w7^|)RMM??%!-9?cmKhk^48BgR&CW*tvLs-l52JrTrTg!T%=O zvJrB2t08B_m>fn5IsW;Oi0kDMiL`$K{1^l>r>=*ov2x4i?cT;++1juR4xO_%aLjBS zqtH&bvwdjqD;^XTVRzUt@o3ncHcUJkc9#tkkA~fC!^ERu_t-G;Agl%VeenIO?Rw#Z zpAlch2Ol%YaGCANVq5uO%9aw$#kwa;_9%FD38n_X6FtDReNR{XG&Gjyc3r~- zyC=(bb1B9U-2(uJ%|;&JK@4lDw52G@3*9e^ zO1@W3IiSS1A`TJ_CQ= zYxzk$C_BRbXv4&VFxoR>XF~p5!+k8*ly<`8igjK5XdutucO{WH|IE@@WNZiy!5GIr z57_rv*y2GV>Mp;4yJIi>`zpe#`1dgc6&s*=RXRM`RrB#+Kz54qCh78YpN_{TBHpA5 z$P-0SyzA8#^CmS%#eK?JXm9v?Qme9sPQ=LE(alJ0AspQYZ%U5e)Z|z#&cVny2k)9$ z&@79|d3(MumJaWtm6MyTDlhT7F*Y8e?*D^EvS z4&*i_hsg-q5_2HhTx9=!oKYv2cQvukp!8|PqToWnrxJ#Gpf>;*PaARSzjcfB|- zBjdcDFFEoxIo6MJFfz`e*j@*3xJHz3K~3Hb;=GKE^LoDIIHV@WhH(x?#yJ$*L4r-R zRdZWQNbWSrOYCC8yPIW~@SFfz^|*mUMDNozWGQ{Lxx#jepfbqdF+Zm@05IJJuN zS8&;G72^~;L}_Re6`7qJg^v%bp>PvYsGQG8rI4H-?YLtzCEjsgf}sh-3J)J%gK1M@ zQm$vDVj|beG;Hl{I1NJsLIVyJI~Q$lBOH804X(}NdS_%@@BYgeWU;T$T^4MszQQkP z>6g&x#oMVJ9XTa|baLu?TuE1$HQ^OadI2_F|~5YCJdGO`+B zog%DLgxE;M(-X=GFkCE0sAioA+#eM$CQQQ0^J);ziV-rh8ezR6tXG7X#&DD+LRepc zP%Rpp>m!7b9aF5h?Y9Z~d!KepEA$()EoVEXSgOfQWa!QLNG|psha0){?fkj@MdqhU|lF!5;EUu~FpH0&uGCLRrY+J=co!=ABW;?b~YZJ2m8Y@rPkkA^*G!^ERu z&)YEZXxIxjOgtL)q74&|hW*WkiATd;vSH%UFlmA1^=)RJVZxfe-kFEEJy7q#=3s2v zzlPvyC_KbuA6DjM_mUMb&GEU9EW)`p>t}}Ik!2mF2!Bs%Yv#>Sr9I!d<8ppT3F4g*g|&03A9~?ys0bW4 zf1UNg^6>Q2Zv;nyQU1T7$S59F)?(e#V%xFBbY^0tXlrfNL^>3;@7q_(SZ?39ZhF!7 zeN&zNF-Pww`Q(In))i7{*Y_=`QS-(O=yY(S!&*oS8@}sNgFN9O7Usce7))A{2{S+r zy5NZ6*G!F*FYX8=!_J`^z`?36{|&c%)gUcXZjhFV&Pb)z{;k)%$tucn zMWoZ*m?!r{_Lhy2y=6mMju%De-y1M7>$&)b=6djoo`x?DrB!89b3=2JwW@4r!J#`l ztVBFJNcI-?2k*JT-Z1kE-(dF$PUnR84|?s53I%?7LTIoXDuKOFsNNADtW8c#{?5_I zuHyP<01S*XWzKpS@%7Ms^CN8@!mmAhof5l|0~SkzX9y#UZJj8)lwrYQ2*+rt$k4j9 zkL(ZkK=w7az_M2LVU0gXnX@2~UA8mf&La`#V=yds(`Et` zq?7`~{C5x*X{VM#Xj)z=!zPdvE0K{K*AxokM4WrQ7ey+;u^#;Gp|)x4dLEE)yl)45 zK*DZL2vxLj@XtaC!Cf>clzRi6E^0t1AfJsG{~Y|lN;P0m+CP_H8J-`#0R_@S!Mw_V z-I0uhh}&4w^CF-;Im68|5K|T{jK%{lHo5Q`KI@dxARr2d2}&v9v1&eBEg_>scuprf zbtEmf$pCy`@b`ENG!if&dPTPJYdgyytojkxdD=NXvWIt_`Ob%P`Y|VXDD7+q_h4x| zsh@1uN{mTKVdI+-aMvL(;($mXyAvAS*fmU&vY{bz`*e9;5kvX-``uFStev<1iE6{V z^%flNL-3QXe78&-=zI&XdD2w1|L{+QSLsEbW{{!9f+uzhrTvGS5P_IS5i_L;UN16e z=qIaC+_H+JL}DhVX*3$UYh5(V*RbMAWn<=v@b{$lLT8AkPDbjgKvfyUR6MyR$KG)c zM#eeR$E*9RRm;(Mrt9KB+Qyr6CfCJ}anOi1vp^>0k)aa@I9I@b2-B7JF<2qGpwyzE zS=}k(G!fkAWGM((fjjy7NzRQakSV;2*suMp>}pg z9i@DUHh-IK&ozR0Kpn!~v0>uTuy<{kcr@%i8zvrv#rJc_*;VrtYJnT(yaQ)2;^(lA z@|$7?)_X(Di?#L1``*VR?V(I7FZ5JrDBV1%&(~D72m2Id?ZcSA_&!K<{Y@YpbC1+B zo6>dzT+P;)fm9q#r_xR3f4;(-?PbJbGrtBE+*?C1me7p63Z#KJ6PA@{in30o5f5-Q zWW3Y%?MX0~T<`p*I&^N~gdNy=U$@2neZp{5F^4N5&!HPrYaE z2-e5{=l9IbWf_0XJ#!yw1K4$OLGsUIXwCgGOoKLb=1Cg2z(l-ChOS&CLr={ea(d5P zD0w{d8rZ$Bd*+Ig#$G*BnbNL%Mg#wmOh*pJ94?axfBHv9ja!(Oi&o zsI5MxwvGlN_jV$_s05U$Ga=nB7-=v4TXxasg~aWmmJ;?}`l z9hZ^R)nxmZL}$Z)i(9YB>do_9j)DxQZN9UpQ!OHWv}rkX*^5cYy8O?&sym<{uGU8ZS@*|s>ZXr zdX1m2@vO#P<4@Cg)?=^nr)xaxx7YYHG@kWd6`zuE`%J{U=1jad;5f-qXb|~Zllv|9 z^UF1RT$Ro-w{U!Of-4|N%w_k$aH`$o4oEb?UKnNPqI>)RY+%Iy&`E|r!l`KUvy>*L zs-j8T{A`V9_Fm)9(RjkGig)E*v2)}2s6;42zf#gjj!(#4ujffx<8{(b*{e*`X$Jz4 zRabCEc#d;E)64T-P_m%kC*)V2dqeH$EKuL|Jv3+k-NGX$hvjA=ZFLAmV8V$@sXm=YQ5)GR#T}4R{U}JcJg}Auo~%w9<5iWHTfgq17bg zVE{`T`ZACbTK;h~bWGaRAz%k3rz%DswoUY!XKCa~ND->?VDYb;k@_o_LG9XDw95l-ELK%+#`4sEny5p>*d5TK{q> zt29JqCTWPM7Aj-PYoRhmNQi2oGNzh@(hVSJ2x@|AJHYvP!pv?VTe)<5q`UzA#df2L z`7|CdD(-E4qkJ6s2|XO+$j@|=<^{|xVGsRH3DblQ%QYl%VV-45>MEF&E|byyg)Y~z z;sHIJKevT@A^Wj6WdnF|2?T)Q_6_{{TVNKQGD$)k@Eu%${alX>-xK6Z3jAsLVxl{fW3%#Rpy3Om7r8f8y7?XT=Ckn<^MJC z_oVV%{$B;$9o>vHFQOWX*VQBom<+Qek};BN%5gqsN3;qDb0~n}7rP!=L|BDgZtx0D&Su%<6<5YK>nqH@!PXnL_9#7{{;=JW#j|4 z+E@SqBMJ!PpZid8*ILA28)_IA-n}w!rOq`>!e(p1Bq=MEte~H8w-@y;2b12L&_YJ&nSOM^^7QDslYpUo7R?#(5MT|5rql#>U zARlR;j=EhJ%d1v14Dh)V$+sT7MEUpj@)Su2;;A|rXNE^9Y5#sa(q9Ao@pxk}|MMC~ zt>y7JqN*jsxw}|&IlEL~jzpNNHTANk%5P$F%+wmbN+}$}3T`9d2-S~HGW6&`DwQ5TJ}NtN$_Hkj3rEr_sff$Fw2RHF(21mmyh`glvT!d@c=i*`=kvMkA|gen0PcSZNtQa zu$GCf4y~^E$Ko|5nvzYargT%Lsjey8RNvIl)M);Nkr2^MO<@N4-KPFwowx&pHJS$0 ztdg=4-K^2gHPQ8?!uCg%eQ(ruB>bv&)cBh;o_KqWzggpnxYzhwG@h6%;!$@^2$T90 z59$G7{cV_dG;Dwk6A!|uo23wjjRx?bYj9jHRct^ivj%)6G|?ESX@4K3oyxS0eWlGf zA>d*k2RhqpF?Qf)(#gmG4hH}1fGCs#y0O#v-cx1@wKtBr4(agr9fE%gpZOhrC_qbo zb3MNDJAvg49$v;h<7L5e$Tmq3&5102aj}Ie$mNY0_SN!r_+`<`VvT8L0EVn?7B>p& znr4c4Kd76f8oM8u$*iYK^JLhJAPx`%8Rbaa`n|{HrH^f(k;tJrlTl7-8wOFv5n!~n zpxDAcWG&uYHUQrQe^07A9)KAs1F+#hE(5KOMG3J}`UC14PwYrkh0GRD4HX0EF=bsi zY-JG>W(IPH*q^ifUAdOh_d9ME9w;z}A7Y-eoKik6-Vvv<(WSYR)^m4CyeU%u{z}=D zqA=19x5Dm{G#=mJ#DPJ7W2A+2a}!vhG}J{flVYoJH_`_;Bbxg5Tj0WK1;63%>CJ_= z(JAmlHSBmO5E^!Vo7?eY&%5YbUiT2z9SA0@JK;iie-|BdH-5u==*@-q(kbvmLB1v+ z`EBmQPc%jho!H=XqdfPrJi+~lfHtXkOHE53#g={m(H-54G_M1i|0jIccP)eLY5zg^ zMHGApo{X7^wlZ%p(Zl#=g2|XR$G_amUT!RFKxgOTl)#G79YK_biJq4N*sv zs6PXKM>iwQKY*|J`g!I`CT#Xr;}J1$PfNJ$nv zhHTj&jY8K4kHg>4wI^x?ql*6*d^KVZQg0Ve)B2M^b$$kk@$k0{5u7Js0iscj94)wE zt#4?j{3nne39)z{{{S}Qp2TNo2A4F#MJ|cPtpQxwj-Q|LpF(ha`4o8;GEi_i`a;4` zvQru8Yb($|;K)h$3ft%e>p`Rs+vzo1Gqs0zQ@4R9*n=BNa{xwUC@X_N{YV*s8LIk{ z%8d6j-g65CE+SqjRplJ@fWjdur4*!{{D~ES^QRb(|Fjg`Eikcv2q^Nquq%<38cz9B z;O9MS#~}g(IG2`Ax{QEErMAvrA0=hAD`!3?oLPB85&MYnu7VadNDhoRu^;(GCR`6@e}qXAr@#$ z^V+8HKeSlb=L7bTK4EtZ_WFdsI^aLN2>5!>xK5578?pL)2GyTGALFyGibRhIeOysw4P=9?+)t2=E%!*z^0MOSUK*5+9p(hbL5(rDe4gk2-m-x8IAFPj zVMqo5Y0sRE9(KrDX=iAIJCC8bTK+AJLD^J##W&+R*1UhI%8R$p7Mr)6hI0S(vaw(| zi3V-9e?P(Ux&;PT^h>*s{3POoQ>S5~#a#3R#zV|SkJCwnf1zU*f&wMEDXNh5aJEx$p%#1%4>(cLg@TYhY6k^fY0g8^Qi3^LpXy zbQ0kkbdupe=s*H{ldjpGL+)$z=EA?zDeyy4y(g&nZFWR5(RugPb|b3V?itX5wqtNb z+m+{sthWraQJ*Cq(2uZ@HcUJkHp+&HM|h-8>|^1@sOX_LP);-jbXM#cnNZxMIg+kz z+j88tEuLk4y#NLv54{MNZ9xZZLC3s|-|!WBbK$FW3jELtdS5Dt-{v*^SUmR4yM?TS z|Icj^o|AUgL*`5L=3NI{l6_od=I15Q9xF zaIG*Bp9SrL$V8B%p3bpD!T8cA0L(;0r1k}M?d|6Kp@_!*B09C0=ZY%SZN_tS;6`11Bptv@ni- z=S=Q^*fg_Cb0?13X?FDVqaywA$=c+(fLA0a%?v()x!O#rSYpbBJ!rlfc72rp1(XoMI=_QnL>LG^jw%MW~Q76H&}pj zG&(SYCjX!fnFDulor^XJ{=wpX3M~G{+NwhHPlSkGRr@arK6jX<_i`Ht2*pnK)}Og&1BtRI*6&P z7s%pVpOKCJ!MZ38!07^<|9O_wn;Rj-qlH^Yord{uk*pI@3Mg}`<^MW4*YhUf;D*qp zk;e50z!B48^=i#NV{fi##hsmUxmXNJ)+>j)3$M3Jl>ALtNa>dKW1wFa=T8U=@3l%$ggQ*_MRAU90Vi^rkq6!@WX(U+*B)I5HhcahA>MUeIP5j>FhmSu-W z;bBW_!*oE1A~?rvg!s2e$Mq2%jl_euq~SQJ0v&XQQb&n*V8Q%1u-V>YmEv9ds=J3! z2YBUHZB_GM^j!yU6Zee~?tzMX03E0=>1ZAFr#BZi(JAml>)>mt1AbT3fwd8Shiz$E zQ61(A{CH+CeoK@w?S&d)fb5V|Y(+4@m8B!_mMw7G;F#VpPVC&OY1uJ(lsI zsEo_93|=^f4#s3UTE(7qLT<$rjraO)4{rB6}sjFvfqmI=E6yI3j9#A{v~Ab+k8a!v$7oVd_X+U zMtEj2BcAA>gC{!ZB*V?<0M87%x`f=A-dwm5odQ1;&%Xr^zjXrVMP5&0f7Rw=X*?|H_CanjL)KOwij zT07Wh9SoQp>Yyw89co=AwSy5@?{u9K1NsyoIVjSohK39l0mC`;DT-8q6!{l(_N2i~ z9aFXg(lYeeRQ^SXM<;s$p*I(9O{c&QZSe1;!TDXm@3eD#SQvh+v%p>WK#7j?OLXW4up4|rwjCGs z3CcSUqrN_2x$#a_ff1g+5kTR5)Tc?6URB*!1JlJYt{UZ8SJ%Io^SJqVMdgVT)oRvzV#Y5 z5gZy^e+*JIx_&2TX`FKyPB-cLBk1B3>oRoHu0N7)#`Q%SK%4 z9}9&+WY>wM72Y9oMMNm>ing`$|1R+Nq+TVDe~z+ubTiWYhlK{!qlpBxQMOTGrlk?@ z^|}581hkr?(JOd(FgpArp(>j;sg4gsy^Qj=46v`*$ukiP@N8dW29KcOy{9xDEvjqI zrg3@;M-rO{sYO&ht7BC!?celA`c9c_l6ElKIbV=AZz=>9 zr?qPkewDW?53C*u6?||g*_eiqso)DVA&!@kXRS!Y@dWb65l93ci54WwY3Jm;v@1Y= z30%S3(Rgt%%8K#g06K~AKsw3rAUc>Yd~uWEY`W%4pbPh>Hy7?lr@#*#Mt%ehsd@Z1 zUn7~!PbmAXrLqql)8~Bs73p~|qUQ(#_QJ#HB*Me#==gOgy}57>odQ1;@lS%7-xcE* z=If)QIta%{V-xDdhUt7AMbIvy*>#++g+B@m^%DNF$e!@W;nzUwOJ&s$$!vX8p_5wp z66%)*7TNrl199YNMRbma%)(c||7Iol4_OHeU{;2&eg59?cC=*{;OPboF&JZ3dL z-ADh$KKe=2M~?+r=%Yu|NrcDH(LQ<IY$@J#Jljs!qp>RJ$sve;4Zy)gD7SwzmITmF)aa6_Zzm7` zC}nIlFG7Mx4P^+TRZVL3R$6(+Bi`iHGUz(=C+5vx491VnwSJ0bE^&x0ucrO^SETKc zw9hRDuAZ0ug=zJ?Y*mKEotIU*oJN+R#VooEimM;fDz2&wONPr8Tn8=|*9vF@FUD1s z!Rj5kZy)WY_fh8w!S|=d;u{Zq$rxW%h9xT-G;*lN^st)Zp*Jo+bU^SAGheXPXtzN!pM##2KC*9yxmNu3Q{qO^K{!BR|H#D>U!_5Om}QLcqg zTG_7p{sL0Rxf8Yt{U~<8b?HX;KtP+#V8~?>O1*#DSr_S-M%lbMd%~y&Gwoyq7?0@$ zNJ@VF1Oh}wVUiL>2q}T?r{L9%5aQ-M{QQW?@BeO}5zB71)iv9ff%4Nxxos32gYh#A zW?tGdLO5`Sfu7d<*C=a=$ApUPKzV(8cMzIBmA`WM>R|dHcSS*I0O)KLtNNZcMu|2< z_QFVX!$21|#N_rsMBS33Q(7Lu(%b1|y58(E zBunph8Dp3y_>O{W?Hv(6k*Es0jPDUrBTL&mA`D?ckN01?BLepdM%w;<@RiwREGzZ* zKf^9#Y;7I=uU&@ox}&#lWn}?|OJw)w8vS*w_rxH0>KlBBo@)CVo8YxJ0mmWYYy5-x z91kii*@B0k;qT!e+B64up;d$v*m#7kihtP;z&F>;GvJOx8(DQg#rcT%@M^_IYv*`- zj1Ni)ImNm%JAA@4V%!ZU!>@X2%#)1Zd?|r&SK&A9{lo*@2*aDj8YUj0OV89SCw%M| zVJP7G-S`b$FnYZB;aD&-B3$RWe$Eld&%gY(B$BK6Zq#ui|3K+;DnFN6-o~!V&+gLa zYW)0X>2q~{t~bFZUW1=kmp<3z=l7-0Y525r4flDUP*R-y^oe*pWi2M2N#At(egj{T zKEnqGy4PmdX_aB?Fzn&Vuyq;sZDrVc3~ODX0^a%zTca{;1BM+?8MYzA4rdtYQ(87+ z*g2J98zU?(TR-PVTejPfu6q;axR<_7>3bTFWOi>xACy3|yJyh1BEx3VcM4u^?4Cv6 znhe{Vz8C1*g1&d?+mgPenQklkzGB$c^racL4SlcCw=I2-5$|^Ny-nZt^o?ii4)l?S zyLY7TTgL80-{ZF+c4zwd+GO`G^d0sSe7n+j1F`K!-xG}8oxXvSkarLIUV9Q@d%|b; zUJ}k8sEhH^ht#&Iq7TKU_!WIs@rfk#k-dNgQsv%slHopOIFrsy;9MR! zgCC*#p^S7Zb!A?76P-kOGo5633mr2MGEjIUy}9rPIt6~HsMI8)62DC=MI}4G68;3j z?}^|)z>Hq_M>>h{K03+pemW*c`1jJA3-6&*;D^HRFYx(o+AaK{kdL8%UTD2HLSVxO{1d?3K&qLT<;rlY#uztNiuU!+suhgQY_sSJKs=yo{{bGm1HMadE_{bhfgeh9v(U_MGlUHYI?H)vCBklr zV1LEDUidj3T+~A+8GcE}>_$8D&*;sCpVBGtLs1MA6#O=OSUYp0IX^UuamIe|p>>;j1_zN9vo1f{;g+I|L@I#4!X&m(K{H|&n)dNfh z?8shcICyZ8_ByLnr|rXDXE~4xd!3P>6!$7C4|E|f9z22AiMhS(7)t)Z(tuGhj=Ww9 zM&s{K9!P`-RPcbFvzBC{UG0_+5e zc06s?m#=tdSN3)7ZnBmuCoP>dw;?Upcc%SDsPs|q zy7GoPUWBEzxdr=4eiPyxCo>hBe}H)cvdLz{RBm#6{z>*5n*o|#ED+`7lBU))!C8<> z8k{suE@+J-7=$c5WB?ezV68EDlHO4&GyXvm7fc4%&^9OSFNIEkt79|%(&{NUtkF8i zI9mb0>e9BJKWPP+kKkOS8*PoGd=C!?F4fb|63m?q5he$^J-LIhKF>7DTVpBzQ)Im+ zK-Uk30hg_4z_xfep0Cjho`DEgJj3hyKm=RJDnuxDzhD=fDvA+VJhK3A%|+vB=mXDr zuHd26obp@I-GgqlXN;mWu5rSd7U8%A+pJj_Q??K6XLg5>4wDAiGf6i>TE!o(7pGGf zkBgquj)1kwY2>@+Rp+$OFJk+=$t$8?bim-DcD|VoI6+r5rj5}tt%FV??4+Y(+Gu)n z;V3!DAB*K;GB*T^Iz-D4HUA5(#L~kx!flh%RT7)(!0>3M5`6!>POFYvfJnJ!|7p_ew z5w1fg8Lmr5k5f&jHy5r&r@#+|-!Aa^t;ea9&$Jxt5&pUn{F%%MTR}Ro6{G`OK{~V* zq^o!~rWdw?bPD`XJc9%eziaWVPdpn$c(!LoFWj0=BHV^fGTfF9@N7p{Z4$SlHy3V6 zr@#-zGg$EOJGMy#uf?`;dGZf9n%5BdT0TtH|Z;O8pA zOky6~IUikUXojL(#n~v9H9YX)?@7%>H3h>l7It(q(kz8!EufWa4l{u;ng%wRoiT=q zol=|JX^xN)ye7QATjV-Pi!q>ifM|f5VF?BkN*KQkj||jc3)UDn3Yss~>v}M!=O)bap4h}8Hn(Ncejm`a=TbpyuZ7?SrsK#UMYCP5+ z$@+Cp0kAfb_R%?l7E>j&YQf#mwH?x=FVabL8^+1B1^nL=9fXN+)W*A??M1Z^G@#7H5CMlLuj-++8d zOcgB|=NLq7qI}E6qBK`lt=x3t=dOQ7XUvqC?$@XNBgBFq9LQCra8qMl1uq3P)NMiP zMhGu4(hNg&iFsU^=F!&AYM^OTrHPAGrKzmzlvz?P@||&v39+r+Z#gE=;I4K|*bKOW zEkPjHJBNchj0uO*NrZ>d(J^5Ty}9rZIt6~{m@pg#NzLPT)tI1qrx}3VtKR8d(4&jv z3R(AGrC?ktur?&XFhCVR?=%8 zL*14wPeRPe{7sOfG>k;@3IN!D@%s<-U^#XVN16+ET*tL zC!i(n7!;j0I16Wj`m6*USCn720gb`l5x?9{e(=KE=p@2F(9w?ZdwO%>t#k_fP<|OL z{K9YT7$~!ay)FFP6863k?E9J53-6(m2=Aqn4F5<6ed9j5+9&R&Hy7STr@#+I)gh?( z9rp=que%-b91!7ooEg3FVLFNM&vcUEBXof0QE`*uV{{eYL-gjt2k8{}q4+ulAHU1- zr5&0cZ_jqcJ#SQ4wI`DP3~+#5K(qW9XWuFH)pPppt2>ZxKcf2;5&*pt9q5(lXkYys zz0fPsDeyxH93uqsyP~gF-cgisCW77_Nw4;yhs*j9b!iEooKn_Ps><;bClP*5CmDW02krf(xXJJODZRPy6FLQcC>hHN8T^jzv#F=p2=%uM z>kk&sTuZBZMwfy0UCSdjijZyXhK!6}P$Ae96g4uvj6qY~U>(e6W(V*N58<6vZVSF8 z>zW4PR`=zFhnLj>?G|@s9ULCjfjbO^!9{*_aFHJ!t@B^Busu>(erRFGN@4k3QRn6F ze;uJ?^<1L0cXRBdqW*&q8^n zc45{y5AnfhOnYV=s4O-jnU%sD;Kv*?BHlVdy*N+=M{`R^+PUu} z9z?zGF8rv(&(~J*vny|s1f86h=OL$CEa2Dd&i27V-|8FpWEqZ+>b({CQSSrkB*GRt zI$k!@n+pffDeyzv<=PHXmGp$~W$^%>vtu3bK#0~3jEL_fFy{H{5H!XnU#BD`|I!7 zW;DXCm05p7dd`gK*_eR6a6>wYa3eZecN@@~3)iPp;D;h!K@ju1qVDXu&3ys8!Upz| zvH>4;q4lCV)t+U4UiRAnfMkc+jg4Fq4Ascawks5?9)##fbL z$?9y5;5ukAb*8*a#UqlvN}6TaILnO zI@2;7{VUQQBWcUbrWa9$W8*SZWmvK@94ENS%%&HC>-ZQ~RfZ+Qb%NkJbTRd%ZF6Fb zt182i;W|lhmDyPLS}tvylYd3pQzY#rOH_ta<1$obSh6zA7hGlb+>0o~X}==v>5{h0 zo_i5+&-fK-&y=)f=GlvYdzPeqeKGZ@?Q^!IZRlE(vFRM9t+5j)Axl0soh$gt%)Waq zhw|xpF}|t{OV-Bc3$8Ld@m_IhJzTIvY1K~rLZ&SqNn!lI_|DxrXtRZ%+jT>=oj9pe zdAiP75puvqq}g+Q?k~@opXMGQHg=&u8jMKjZpT8f%@4cFo1OB{g|zCA!*?eZ7%D?% zou`rNV!}xH%OPsSnb=2>y-g^IWKG#t-*p2a<=b!%lDQI0(U8bb2SD*R>H<`buj$r- zs+eR~+UAGhVFihLzD(aN-2icpo2fHb05Z3nxh;*GUZ-%W>zHG(jg5y(aj#I87yaNZ zQ#_h{4hqte^l+7u?pNc14U3AIXqpq1uh}^b{!3WC_Fy=6VqxMPj7K?fN_!+e{pI0z z(hZ4V0z8euMEsKU{LyFxe+5S3<70kI(vLcSMfJ2KGyY0UE|(YiE5kcyRzDo`2ZhnG zajwOi(`GWF{8gB=>{1G?|CHP(dMW91{VpW&a47>e>#5KblLRP@U^}VD{#vcpk9o^& z5{FJ~asCZlmkFG5gN`20E~>cJDrpt3E8X7jnQidiLqjI`CvQDiLaTnH9DSk6v+hANB_l|=1aFJC@ z_6_bfbmC1~Hay=<$r1^kmc`Ax@HWdW6xb_^!s~o__{-@T(pq_rR%{B+a60dFaN3*q zLa6=P<*1Y3!f2hgCD&nIxD}m5xHX+*xD6e(9omB4T(~)%0zY)QHc6Ii{Elshc%Jhn z5PAjRyTPg`UU(b_j$k!_Z1uW^{A|dT)Aj;a+qK{LltjSsH}jHTSA=&;Dw{zAb_s zFs~QRrUQ!tI>|6k$4p~W`Sj+(gXk3ap(rK`3VxgENEYp5DotZU)ZW^qr@f34JQf&7%kg+8zfxdx3$D@F!+ z16_YTWWmND^nNnT^S=CBQRfX&ij2QL5&)9ecc*1*BW125kk@(Y7cm&u#?pQfDjb(?WV^DrR-sfJ>F*v=T zV@Tv5nuszghs6tZ0-T-H-Sk%la_lx%YS-%YywY zI@rIWqm6hqz1Y8^Q{ab|6SvN_8Zym ze4n8W_dncQK5AJ0P+j{?r2FZJ?&nDttZ3;Z!e{6t!)NJ0&$m$AWcVCiGlNz66ur6d zuXGCh(BiBn#o@P^#j4cy&p2m+uA7N(q2TkvcbG95zDvgq--81)z5-qUL6DpuITck+ zQ~L02gu%iBJvD1K2TTm&d^G_##xb?o1GVEn#8EIMen}ri3MeR^p99ih3*?0*Ec2`m zD(ws(*9rHvZXt~?Ms@Nz(xOg2rjrOip_2?hrGq;8jIP$jNA%{x59t*6p>?r_)CIre zx)_SHd#3`=t7F30Vnb)f4;VcYq*=?E8tZ^aVhrY%Zmt_Wv7u8fAg zVcB?-j?SB8@^3s2=~Jq$_#N=tsq9<$arF^vVQawa=w_r@6ZF}Rs^imGXYkr~d`ih% zP`_t={GIiI>c#aW+3u`429e<9c8|ab%Cp^+`)s}f;&-8++sz$&`#V`_6Bv_Z_olyZmNQL24f&xtH|QK z4w;z&6h!+iMW2U5kq$0jbNadP4<9M!d+aZ#+x{XRq(s;mHcUJSYnhmF4BS6R`o7AaE^Mzu_Jm*!iXOmzkE za*P!Z2(|O}-K^t(MRh!AIO@;~+vp_1b~-9k<><|Yt#k_f&^n$jb;hCE?kvPfgf71b){hZHoG8MEK?12 zG8k0uXW6{sxhRM~ltWdjc%Jpwd&RS?zadq;!1`kgI~l6#{H2g_VAAXg__7{pP8Kgj zVzV0pB1>~#btEHQD{kaF16AP!AEU*%T(?VJ_M5aJtd6OeE1b?uv=(MWCW_!0!cNzJ z2YIp3OBK(zLO3j9#m>kDjtn>{PqGv(ZYy5V1bNGoQnNfbD6BV@MwOjLuMZz~I9!{+;a z=#{5qb>;WtY!~M}hhc{>?Bo(WGE4q}4rg{gv#P~GrpZ528OFBBAA%%h>BvMQ4uHK> zdplnk*$YMJCa+k&tdLPpWZqZ)4|{I{9Y=BekB?_ovzH`$wbHI^0Wvlcjf}yVYbAp* zH#T6fA>3fj1PEb3i<97Gg%U_exWb);014&@3Xc6K5X{JF*Q=U9^$qI_YWaxlM_*S-(o_eJt;`>utV{;47UZ!#g)S@MB(mV98HB_GO>hvhq)gnQL9`AAgH;=>$9#+|{} zj_T=rRQRC<+g1w3Z*w@nY&&GV)0Vx5xO+p~=P|8U{T?4?6OLuhlTs>}JP@Iz5=FR1xFrf$8DxYr7C zU&FK*H}ipUGan`(FMh#SjGOtW@I!Gg6x{qaN5*(jr;|8j9;9N5>m=3d_cQNx!@Tbx zZj77xz_^)@aNNvSjGOtW+=^e#dk4vz-*w|=*oQx4Tc^z?FQ^lQU1r1NMZ+$)Ve*2o zxDAi-w^cBrRH{D)G{)aQVj{qDtUVXc2T%sO;ogII!WOt6^w>eyeRv=7an_|@9t3xK zh8byg1l?v4eq!SmjD;va1Hkv7;!Bvn3qt5l40m<-6TFEa(}_;mEJk`=>fRo{BdNm! zn62D!zTzR`;vPK3#{G9Zj#~Ur$>2}K*34Y++zALH&1`XSTHs;UQNPqtqWS;|U<(UP zKft1uQ8cr2LwUMpt>XM1_R=F#o(kDUfBR8@MuBt;XFh{uI6rSG0-ND+Ba1!rK1d3_ zh@h6zAP|)2AQ!sE)4`VzSbdN*_@Skf2ZgxmZp7cHjudgAW4$mA(+mCxbh$)@$$~Ef z!Du53TQtBq03MAAq=PqB#imug+&kZzYwe#U#VEgv z((;&MO9ZaF%>-{D&_P%_ct_vDvWACNBxUjmGe4L+;-M93J+tCCduByie46Pn+SR&D z1;Yf%j9#MD)z8KyO=Nj$P8}a`N{x3i{ z+@$iyaAH0IVZX+|2ra(%z`pN|QQ6pM`xvSe`@SE?qtCh4l{??d70Sp@*j8h{JDNm; zvtYo)bx@0Q5%4{#Z6szs*qwpWPLgtBB)TGaAiG*bjLj|( za3q!)x-k;27A15mq`CZO)K8{Zhn(4AHzM2QZEo2^6;*%A;%RY@VR5gJ?|OChGla$U z)ML^PJp<>4KlCCwH$bh@JM;qHNBkYY(sC8ZdWIQkc4f=-$JA44XL}_4jp9p~4@okN zNYyR9B-anN0lL96U{zxQEf*o1tFzCQ(O~pwQHj+Y`+0gm+ zL)tvpS5P-U0Unii1gm+9)=Q{1>Sk6jbn_xs=nyK@>;^X1_cffu{4CnklfvT)#c7ls zMv0;wb}SIYjxb%Z4pNO}bd`qzh|xQFsHgasapAX2WCmDCp(pqLf~BKM#(IfNfQ1lH zuqEzQgX+PO229yf$x?0d1P`_`a>MhL*0Wr5;(tI(}u3_C*N9tT5WBc z7)=iei&DXHf<}{0)TFJAvpdq1(7mm`?;qD&qOw+& zvjem(=VZ+K6zi=W_wX!0lvpR9US|c!H-^9zL7a@{Vu6D{!Bs_O5$5i3b%?#iXFOd- zm%OGe|7%<=rfnSd*v}y-Vx!3mk|OL%8zwIr_6r*(F9_p#WFnH8DmVd&PA-GY`kGL> zsmFE%4bK8sc`@20=LKJZ9>X}`RX%W@2_H?>*Z9z3+3)y@ttNa__@Tpr-J#|DWB9GZ zGVM#IILAR_Jx5yI!6&ITxXyt-TXuYj3k|7?W+8xVA+P z8BdhIfnw#Gd^wCrQSwLtE>A%>$W4 zQ9e_~0>2EjTw0DVYHJSWfk)e=1xO>e3O+(6f(PTwd$?bP;c3e33pXsud(b{4NlYqDYXd)A~mVUCZI&2 z(df#NN=ijrE&+oY+mqAKPx-tWh>)D2Z*vO3!nsJ_*%yZgrCDZY@-{|1@6Z71}FFxs&|`;)4P_6&Ynpcm=b+h4-xECQT3O zfdRtw*TiX2KcxfSpeJyhv@?B8?H{;5fqu9bMRq;2I#Coer54gw$hd8eSwpdAlQZ8| z`;g}t^4y`9gcdi*10Xm}2r3}h4^9_?l0gy?2}NnCdU;H$&`yP}R>y3hbamlAxMzXv zW#m!bN9xI|woaw(A==76h9Bk(;qg?=a&u2`(}}2j9Knuw>?oLTLS%#G)50xW0g1N!S^J2i-mvSy3zDL{XB~ zi&u%3+W4(DfhKJNO`$kjSzYAxRcwF#9cT7^YJXWi|L&9VIjkqG{ZG#4qVpz-@e1=O zQ#E6LRCp+b%$6t|u$vG8_L)8uN*!is-l*!7s%wHsF`p2w>FShdpyw;U61biV3`r=z znk?U&l?lfe8$#6tFu4IezmaEzb zcOM?Q`lv`VwCQ?()8&F3dr8p$psi(2Z!5_=>}F`Ka(iwcg&M_4sW!qOmWeKH((M z>!i1Ps%!RP>wDQw+D8V3!m5An56u67F#k?w<5ef~k*H4LL&+%ewWC_#qrwj*V~LQ# zZ%anxn_{2;25}z};_hWy+*8K~?y2LWsk#Oqx{tSquN~FZ_^9whv)EU%;CFlY3|3>+%iDTqg$Yc@cr#+fB}H9U3+Gpo`G!$D~4cU6GD zO?tF@|S^f^%huM!}u|7T{iLf*zW!(QKNmC)Q!AzJbLmPtq)|apW-behyso}p1 zWIe--H2VW(`C*)sf(60Bxd@jUsfm0@Q$ou4j^bzW+vT_cEWMy751t~;)PX&mFqD~;zX@#)L2zV9AD&q1X}6+>Jbc&;h2&ie6#%ICUQE*RmT zl^?fYHbyLt-jVfCo5*{?Y|5vV7mRCeM@eLSB`-*iusdv+ylB{+HcVa+HW!k92+TIK zIWf}S*SlE$it@p`@I6!?%$)c#+uGqCa<@qq_Rbz0vZ|~NxN_2)*-X(ngY-skgO4x+ zoc3`5f>EhTGI$T89lcBwb z_5pnF3Eb$qONx#4zQlQE2%u(L$uiiM$^76vl-Ht*+75N|Kai#zg!*d^#2or-fDcuQ z{e11HLU}-A@k2G%fugbaZIzA_`?ulU;%jcsw8NX1z0MFq2tjma5fKgf${(~5N@gw1zIcl(>Y}7`F!CN@`bW}i*VE84x;ujl0W`D_<+0jj zd%TbMM^n2jM_kV^Bh6<~?x7tTz?Kp0A^~Hh`5eG(?X#SN&d@!erh8IBoCqK)i)@37 zl`_ZKDvEcbz(XHNS^9#{0J?k$pofX359dO7=29j`_h63)Iv9CY@0DoyHPdo7^M@=a zR1JfJA0mMrEL?_nctyQnCkP-7m<^D_%&`UwY(bX;x~9`Z8-4mZYBQm&-^X0>yr0i= zVzgBm2Wcn-BU0Cn4n!!b7qzHQ)_<}d19PxvZwV^&CbbO)~Fs6JX>Y74&60!#>sr1N_NY)|7$%E(=+a`$9!rIo2 zrzvXro1FcSBo)K4fH<6?2OyQ%LUW0AnoM1UCNiPLano%H^@Z?QO*wZHBasYS9+yO8 ztRZ2k;%?2U;>n+=J3p+lh50-}?aV4?R50Qq6N9fKjX4aFE#gm#7Hvj!rJX(T zo)x+>rFnRVVS|NMZfMQP1Wz*f9*ituaj*tVC~Y2=%^06ho}%ib^9eJhGp{W~0~eN$ z_tIiRf`f}T(B7mpL;Ij$RF7&Pl8AsKO{KA|gk;ug~iD>O-2)>dT2pQ$C(@1OMfL;0N^O{(K~= z2k@c#azDOyRQKhh!VlG#M}TYoG5r1reVLX!hEM>a84cB-$6n(cB0$NQeI2!CdD8G~q>l;m|^`E#7+l#E!vq8eO3W!bqZnbiVSkE`Y70hA=_ho9P=Cej&$sW-H8~?J@bRtYL}dQ5Ooct(+reRt0)OjG_Ua);7l@85=W$<(>_&p8xqI!QV^GXsL$VX6H)Wc=lq|oX;o)_O z-vjDNR$!rr!JPdy_(`OKs{qRgE^OC`^ALfXeeZqQn#UcT_fjNXt2G<}BR%PW9ot?UsD4%sWnWa5LxDX?&&i<^OyHZ#5fBNp8 zocOa@*jU%{6kBhi`ddDl%;}UZw`q_oUtDu4zG}-~s?P|Fth&)S*L({Qqt@S4p9L6n z3)?Qnhs4iuA~WFgX+F7jQeHp{!ibo0l9K0n?u_thl%XPufg zwvGW%^9F2ywTk?XX0adPuCz;9bn(+Q#>p{dV61dHW!48zwbqVQGE`%#~AWF zKNHmzAx-?0erkQtG@Ud>XN;=Bw=2+4s2<5U zn{B6hq-$2r$$*RU&Ra$;a={e?|G%njC%8xm-60AVZ z)@;bHCd`2)rDaLuwP&eH`#nGSIYH1E+mg{b8y*FrO>+;RaVuo9w6cC?lxrHiDOwM* zDkcu3<>oWFj2>fMTcyKsF+$%)4wELJ1XxYgR6Ye|2_6={gwsg_J4Lg}qh^#)Hs;7f z_?1rs&UNqB);`TgTrc=keuQj-P4Xz7ut^@{BT@YgALeoVR-fQ&NA*cQD*RBJWKe7p zew*LoN9qIZ!P+FNvkv~3+ayM0Tx6kpiD+}%0#!HE)~!r!>TsMxt1q&p)ohYAB>gcA z9oHu56BxHbAlf8+icP|oacq(qlEyRNhq#PqldLH))+VWkjN2qL2{)EaB1y)!N!DVT z^7+Vp44Y&*iK??nEQt~p@7X%_^G~#Pb7JXap8(&P4Y5A%D-dqFeA-UCixp**)g}2eLc%1Bj3xPtCi!balD{#@-x)m2NK;`h z$1s=o@ag)&`*@u45QKLM8Un}UDgIm#B| zI?E3LyB=YSFoQap;Z*z`LS&(dtO8w)Uul~9#ob!cQzyZ%JR*zW)HTGNt2au50S>6# zBpe$bASdxT%h$h|uP4yS)QGFjO*xUOz;wxG&#ka1z2Z zjfXUg6I*jIgV9s}9Hf9?vq^YC0&&Tp3BQ;+F+QG%q6B(D5+81bqLmI(cn{Kyja7x> z2r>vBNhG#jLOXBf$sm$*N&`F6>}nk1CbkaeIy|5Pp&>+ur&#TH1Eg6>uN4mml}u)IG?zAm))~rz{Q5@I zjF55*gNGT3GqhqH30e_^5c0)SzA(hx!XY7iXyjcke8zdGu%?QJWPyak5>h;+EF+v; z;sP@Si1I|B3?|{n!DU~ib;zMGRg7f;#2n;#{KMciJ_p%lS75-H`QF&Laa* zn5cEmDew!GeJq$394nrQ!mUuFC4x?T_`zfiqF&UxN(BE-2^6b3Ayw^Z5K`8V1yjPT znpBXR`jDN#9MNfp5lL1~MJtJ2K&T!=$d-2j^T6YYs;{xXM?^{KrJsU=%TKa&D6+!7o7MQ0!c=bB z3+@06Nr`%I9!xm{Yv;w}{1MoSL@19ZMYJr1!)mGY(B(|v^D$j!EgV#|;7NI@YuDewwR7>8h0@8tt z&GMrPl{lh ztYf6GF5i{wGG8ZiR?4l^f1IW@E122Jxs^3$mE0=*iy5Q)3|~g1ZDxaO|JpkuxAM>} z4VhiX%v91CX-+^MW*b;{VVisbSe7C0XPH%ZuG@TrL`*HM#fd?9_a=%#CL`e8g6SN_ zl;ux%*Vq#!3EI^@FtMk z;$`N8nn}w@!AV6ro@c_{uo=WsI+4k|6B0)WL!IR&*33~yWof|K?(0^T?sc|~_Ca3Y zoHZMRD*U<59uqeHw!X*LE^zi&? zfTmc$-xy%nM`KYFIz6m!OH}{Pz}6u(o<@B zwFopmSOdVC47Ht^d5elOmLP5IN8-%#LzB5U$#21>Dy#WfYdbir*4ctO%}dC#A{nt_ z`Q226>qT%0Q89X|pBnvMa35-`IU$c0J;5*y1*XF_83_rRj%*31Z8<4KrI*MIss!W6 z?b{fPFixJ@9Irr_a)NymCr&?GV-CgyWTQEWY9AgkG7Oxog~2A0$HlnoJqlG2{S7{oz6h-np-hDyvL$pThE<-%eN-< zInk|9R`QeF3Z+C@tKv*sh*zohH?h1^@{^q0q$zV)p}9!~yMi>|mTT+(DFNE^c@+W0 z(UuPuLbSvTIhpZpg|e4xg^6+oq=6oxjxcOuEUb|0P=*z1HCN0PqcUJYfs^YX!wO4i zNkmNWC4!+aBXqvd;%|ki#yt1PmR^KTV*zMnY{`Ok;h)d9@jpBKE?q*Xh+s{eEnSSz zF;H@HHV%9ma-u<^ltE?>13>2~Jy>!W9{js}=rJJBXHGq&b<&Tfp*$ZA~K-;=ZGIg`+W_$-CoO$ zkxKjh4PbZFz!+)1McN-|0K2mW#>jDLr$NzBM=VdWPv_QnHV&J{mb7i|0#@2K4+Etm zqYKO<`I!dj#|XVxpc!dSC-fQkX$eh%oe)=j z5K#pfNvD%I?U;5(c)qECWwhHeFqg>rbErkr7^Zy&aVdDHzKt#|*aaV9OQ!1K${mb} zQUH_aT@l@j5IL|AzCKw7I00gE(%@`ETd2WHJVoM`t5f_nx!K~yg{o!(7;d=2v7lW(aqF4tnt z1Uvl7qxFFI!~q!xz_SGKv3kIJAw}I66pshqR8LAm}Tw z6?%plsoL%wz?wZ!(bXpq=H{A5{D%m)CrWR=&B*WIC*PXHcu<_7Z+7n}faa z5$uDX{6yS6j}CL9S;DVLF!@*yxkaT^VB71=zLk=pGjW$O|}-8F~(6T9Zh*`Xsq^5c0>|6C%xb!LAq@ zyPg6%g$8@)sCf|BGZSEb^sR+uUgiPhfJKuFxR-&Bh+@HTL_yarqf#=cNXY=AKZ|I6m5r%#uW9f(U|}j5Q`|O&n^wJ5@UIK) z!F4PoKDM8Rp}@8LaMJQ9J1{XPc`XS_JTswaA_$zGE36M_k&wd*ZH1G(}uf zeQ4KiZ^L@#f?<{dWry*e6C4u2g~$hs7}a(r*!0bE2jzUGSCYZD9wyZjLM{bs?U>p% zq(_IzddcUQ$A}0Jj}f6&VxfrbYWdA$Da5wLnHq-x zpVoUMX^KzRpKmK=sF1Ib!&BouNEz-gm;9Ep)3&$I2+v*LJc>;{f%3F32lLU;`tnUE!Jv&kM|M(1%QQ)AV!KeL(+sPUT;Y8B2%bKf|2Tyh=xB| zKR)z%9sqt~=noA@ULq20tc;Y#s**2bs27+{zdNBwsw?1d=rTBug~oV;h2~IV72svRK|e`j$rr-5 zX11cphR1e}*uwu#sE7*xOuX=nvxR@Vf!g2K3eU*Vg>TWqw`k$f##-Zr|5F3H*J_1l zH(i4 zpjiL;T$ORToLbTE2%K6k+8|!9afy*ytn*QwDk5#lr8eafe8TxSm)>na_lFvn7&)3t z@FJ5-@EC_&Y9EJ7Gr*+CbsTbOlrDJC%$BToI86b zKCeDb*IAZ0G0`-MIpk+ecTR&eE~JkAGiaxd{U-=_%Ev(;WIZUKzpzMju1hOJz+WxP zL|G2~xq%695I~g-Bb5nMGR;j${x`^mO~>*&H(7U#XFIOyE5HB2YJk$?szFx@y9tlHr(gC|bR3IW?mVz?A020Bt3_b(hyLDBfVWuy&W802GqO6FaA=$D zmV|02Lg@W3*bvcg<$#Zg5Dl|BfB*FiohRE;K5E*r*6f~vG1hQh@#K;$i-XSF#eg2J7`Hp?-IHeB7K-7iWtY$ELd42N0LB&;N0J0&!?gONv+ zymlXjAaKPmJwODwTae?O(Fl@=8nqvj=NX)a;GIbuHn+XsP^0hEYLt<+8WlEXO6)y+ zVImKMorX@uHP1t5G^d15aNnl^A)6=+U&0d+9uNb!es`8k`PP<9=y-H}XKq=?qdf0) zYlz`zNULYwK>vw`wJLDBGAs`nz<%775vsWek`rnZzaNLoMlnPGXej5qET`JCjI0?d z;Q;+2BrdNc4M4}~)o#=~#CF7A*~*%^7#X&BsS2aSkWn<^>gGx*YQ4zc=|b72m*<;S zlo6Qris8;^t>NWnW3VzItYj}837w7~ilM*PU5=oy> z{@Ps$D<;P11kr$Ad!~l;n%8cU*URXyJ}NJT-ThO*?jf+v^F9gQJwFBPUIIJqWAG|( z_9m?IW>kVt#+!X4uZ16zm-1%Gr-0p8U=RElyuO^zv|p_ZqY_w)htdwSq%&M@G)_J5 zFL|Exv3afo`8%MN=cokMg4I0h4v$4T^}{GX4wU>J``G+uBHcl?{6;1CWcBn}$!prC zA1!OX?A`xdEw51tK6%*=mi(4|On%CTLp}xUp#pow$Kcg+e7;tWQ3*atIrNU{!-!)j z0ax08@{Z}}P~J!S?7=~!@0ccaeUK5m*ZvEjxjYDSg5$?Bo-j*~;v-RA%7^(Peyd;N zYe)6Vd{p?M``RvrKKGB|w^@cC;#He3gcA zZCE!-7}zP!kpkmZ2*f3%e9971zKpZ4ZBWv9=0kLK{6|9P5;&spPsV1>PNq~5-VBHMI3NF3_; z&-jP%IUblPjyJqB{8jv~hkvXmtqZ3EZzjU#;9s11_{N-G5-pW$l~R1-%tP}-s7{lm zJUM;1`^OXW6$_RKh-F-tA-XESNY8mm&hZ@0Iv#wx)4^u^6p{}1-{avmjaPFy@$uG+ z274ui^Hv;Z8Pi5xnIxwRMG`MJ9#GU0YTNhZT*QjVxVLmIb|@3;z(V_^#W@N1k0G4b zU%{&qhpiKU)*EB`*@`uABSkoTvR1wJL#~`>S(P%#Js|Ktm>e)?#~9VY6KluBDW|2wj^z}`kl-j|nF-gG znzm1igSd}X9GmFbXXa?0*wy|Kh;+=8a@wX?TG9>~JS=!R%g2Ccbf@fxRrwgxmX`rB z)}$4KP1l56l~=_{UN}SEbRY{SohqDiJnAs$LayPR8Y#JGCpuDHSTbrDHU^vEug3V8 z*4T_Klr9%lzx8hRJ?$KDn7&hPcLcp(5qbwRo8dhC91GnIim>i^B|OSiS`R-#1-gSP zjRu%PfFT0>6aeM9__R{0_1odR4E$duelNg0sBf+SAf`rlL$Gon>q^GSU|q0-4nBef z#{y|EjGtyXJ3SSA1@A39POpGyPGN6=78xFgIEqhR(9fKHhMdH?y?>NfzDWxK$BfO5 zputy}+j028Iv1|ifd}V!e&M+4Cb*ajSi>f^`@se0^^4Q2qdueA7sYk|F9uqJ|rHjcF`I3~~t*JQi;8i?u{W~BK! z8U7|JD=NuMmgMU!$qD$$3g42!H}Kx<_&6m+3K7on>oJn`vSim=9OO*@hSE>p;O?OL z_&S=W)o4a-O=qs(WUeR1ay`lB+WGOh+BUtqGkt-T%Z$^_O5-26v;auFU|Z&NH-5@b zLsGQZI`_`C7HdPFf31#As<#?^<+@nGt5YHCDU4 z?$~Y|@K0p+L1*@dcK!8y=c%dc!{OaaUjPMPCtoKzW&!kArhGPX%kpzRK1Edo=OCzA z4th@o+aR>XNt-UPKc7gVEZ;_K)MB3(jaA=b{bZRvE%r~6AGz4RylKvw3solO!f(G8 zDhqQ2o1>zzp14ic*PKvCTPMnzEq{mPG*Z}7Iuq#ALLvOO*apA?NwbsVpJavYo+JTL zEZkDP#DnTUZtY0Q>58Z(-r9jJNlDC-p3fPh*I>JW@UU?`uL@$+4kAYnr^Nowm08ww z3U&Ei;Y>JHKd`^8qx#u;Kbb18!z8L&bGWxc>g*6_&9havxQ=lyd&IV#lq?VZMvO1< zx`J9?1<1Ew~Ro7U7>XyF;A}{7wlr*$y5;E>OS<|wXGT8LRIW(lc zAD=jaXnC}pM$*8xONTaI#@cvSgDAt|!^Y#;+M5Fb|6=AI)3}MDZDNXJYrK#6{Zt(1 zfxez$Mw)BL%JcDE74#vU>JvYObcUN9Q_KKsf|f}>)Sg508;}nW`2~WUk>*+;S5-T- zpaFPJ4VaMvY_3C!W-p+w#sSLsRYNbe#BwEWL!K&p^p;{c>zZBw*VrAFBP;gpw+JU= zM#X73PIQfQ0elTON^D5mBIiGzCV2=cVG4E{L)$hKXCoHp`%-pBn(N8fv1D|j*e<6N z?_i(91F%@m(B>A#Zr6Z(;~K9RX>I^=nZKTL5$L14x zuyLRsnq5O%WN1-ClFgZ9xzNr?a}&t+0s&s!0K7#Fn2`c(Zbph0wVPZs1G!kaPDhe$ zby&{95YahP<&L0QY$Z+%rJbieQNsL-r}{r$(K%h0I4`^%bkHSd&=$ zofO4_M;vQt9*0;*na8eh2`5nh5F}`KmeSsycTh-wcB-@Pt+qdV#aXv#=R9?sd$#b} zTe=Q))NB;SRtO5LGCxtq`{xiY)KRSTP)AYV165a2x(0P++f6_4eVaH2??u(AjDc0iXv+*3O z(H7^Q>kWM-Cb>J~eZ=2}l6x7r+cV5aa~qH+hIVOyn@_mQ1&)#Cb`r6P5&_)g!?kYt zM*yg{QU^t@kMfTh#zMJ?@=x$?2AB%UkA3Gnr2UT6k%3-v(hq>KwWzESxK)&;8IXGmc!-dm_H zmBgGxbCV(HFZh)zaTI~w=~wZK27g=HT#a`;uE8U?7C!r&NuP?J*GtqGMlmXxHMOf^zdbA zF3!LZ@lE1P#~XnJiw-zp2X_M-djiML{}Q1xP~h?is@iA(ocD316aPX*_|q|bGlnK- z{h9P|TDlmk>>c@Jvd#-Ya-Nj2ejWL}2v_=sc5kTM?O3@tfx4byMw+{jlZyG!9u2_T z*MJ!*z~*kGK;KPq9NM!X$wDT%S@1K`+#~n}c&`TF9csXg6ku~NQs5GTT1U-#;T#Ih z{_|O0*IPQ9`h81~U=;%56s}3m?Y}_aRLA@zrgjOl%ix5~6GseBgglhz0LAbmyg>-} zhY#Ud$cogt7d*$;`#=ok6M7mAO?quQwOHgNOhGkP8Tp03TUGiYjSUgZ)@p8h|e8og9zG9NId`w?)v)plb z5z~1h(MpiIR&;BsEGf|8fNqr6wpJJO!HbK5uly^B1m`AyjVI1mff0f3Q&QbBJIWIu?u4X*8Se_3;qR}+GDfW!83RA9BJM;z1T7QIO zu7r2ZrQqonoUGhc4Fp$vjDpR9Wo|4!HK}+$?v>@TIfj<%HMg^sUhsi z63XAPirZW|S3t?9$;gSjvNuDBO&!ZAhBKB^V;MmGRuRrAz{vx`WwB@@^<$=1=cirz zUnf`Bu)eX^6X(qxj1u*ZK8rn%dxoC`>#kL~Sma{259H!{skH7sx$G99W zUK*6*IM4W@8Y{E-URR+|z8RJyu38O{Q+Yr9EOJU;04Cf`dnHB$#ofa>oehZ{o8R4n zjgb4pn%(Z1k|D0?623w+V2m)h&&?h#lE55)bIKmB-o4iO!SO(O>LFwnYdpH8U4IdfenapsyfpRJGm}hM?F}xGuPU#rF7C}--0-ra)pamqi$L+=FlnpHI zCMUhOqy|stZ9vbW)N+luIGHq1>2*r*X`%#Zc_CP9u2r_v)D;Ub?fHo*Z1%2#X|g4a z_3U^#KQ}R5rdC=68i@;lIkzpRfZR4N{xGkAi^rAWNVOw(Y}Kv<59Of?C;d3ib*$$h zZZyFNk20K1ZpmfmWJLl0^wo1d^|$!vmVzAqOGW&+=0K1k`*$*>ECR~E!uMboMg}#L znIJToMJL+z!p{Sh?tobbz|nG3#mDBN7uR!DhGfCE5(eRd0|{bdth?U+#0cm14FpIt z9~Wo1*pzm*615)?MC(IG6BR;t0ebMcSq?5GW#6UzlRY~!B#&*BR$bieP?ud#Uc2TX z5bp*2oku)!4v&`03#4>ZexnBjiYF_+w;PB@?KTXKi0I^vFq8?zWJ8D`(T`vk#M&V` zanS#D48qLe_>uXTR_q1RKMdcFMyMB@BEP50FWL&uVpd>)5eKexNSI*+HQA>*7GDt* z_vtr@N50*Z!<6vnb925VtA%1L84JhpOBUSOhv9|tZD>lZiPolei`?RY?9XU7UySGy zctT1Jtyr(AQ5cglUq#e}Go>sdltplvZwesKfSLmFM>i~E<+bp~k%Th^X+aflPO3{*IdWat5^ z@Ibr|KQbY18YC#MiU{?|D$bG60>365Uc2o#c14hbOl1F>`4Lbe6RO2ja5smfq&Mn3 zU^(;>UgKyibgw1)pJxN{Dnhn3_<{!a-onuiK(+^=0AGRrl0Kfx(UATg;O>XhDSRC| zF6KG;D&9x@1L!&7#X&v8j5J@z=9GvK>1^1sp;Jngz9)F@B}zJ@QUPC!=7-8OZK%@S zL@5pdSkn9$0Qro|o~3(g*pIo=dx%fVl?{i353P)@U>WJpLceE}cFiN4)D`WL%a+*) z7ZpJenk4>68lO2{)fU!4PUZk_3F|<+`Ad)t6CPNrgs#9BW#|XgseV8;TJWX0vC03E?I!&fGyj~!5`+rb+*&3D+crHF<{s`-mNgC!me?k z>bK}Zxz{_#@2SD6)k-Dnh!naNVh~ZxmbidH8dXg!LOfZS%e+_c81{mShXRL=n*rj= z&gu#jQDjMRXxA&UQKx~Z+$Kcl-zT`GvDq}E%A$S8{aO~*%BXm~OW*;CAN&g1jTm0R zSs*TgwEDn<$J=op)I8Z~MG#6;O7;Rh#Q641LQa!{9Aa#6HejtfETV~vYICJMVx?tG zJ%oHqISY`_!^Bg_G_@}Z1&N&~gv;y*Eg#$mt+{kx+|SsY0#~8yNgA#=Xi9k)2;Yxb z*tB&HCZ$pPz(9o_R|w7<3r2m! zzlq~IcPu!?^|;0Ly|H1a>Yq@UgyctURo500a-aH>gh`aIAQm5n*e~#6#Z$}ZI_x)} zQe5UD#K%xY?SL@9t%LDwc6BgM*TIaIF;{H=XX;?wcy@KTo~?&#$dBWQ=jvd1S3v|8 z;?nkk$sE|WKecS&DSeg=A)GH`lIICm>)?P7Qu>Llmzo4CZ@ZkOFg#u$&YJDAXK1@v zv!xBiP}3x|IJE1BB+sf@Eu%XiS}~^{f`KO}6dNWq5`1w`z?jJ=*^$ozZY(?08<;U4 zg5x30Wm?5DVvSNg1VD88IH?We+#GLTzNgXL`C81}IbO`2&(_QxMvgLfIQETlI82K9 zG3E}(z)=c%P(pL3#mlvfXTp?eX~Tf=OHoQGOlt~HfVX@IIKc^&Z-5Pr_5ya( zA8J`8OtP31PeOciFAIIahcKW$b2&vdY|zL<;WEw-@cui(6*KOsDxI((V71}g_21%nXWN@QS~_rdhZIqcCB(S~rG82|@00`O^xXJ3 z!c>k8?5D_J_2vL;g)6zw?4CJ?Mufi4u(cvaGKGa$d^tS6AZ39xXWRl@zc5lWnOw3Z zN+@m_7+_2SV;{bU%lHockq}Gzvl8WtBQQ#&IK=}qkMU{XZ*9zSqKm^vah&_^k}bU~ zqZ@BlGu7jxeL4Gd4apFvPT-8bhC<}sTw5-mYg3FcxR4$P<^UL8LGle$oQz4QLn@HX%3NaFCeL@UKB>#lzriAk{4`Uc5ty? zz_zbWz`RbFSYH_L1Qc#%XCj304}=@F?(QE*FRqd1lv?(|Zpf$?9~|;TA16m2-qJZR z7jQI#`s&H(bWjoE?8Qht2tbS#tgB*-V!_a#1(w5(^|e!kUf-edLowvQRXQe5{NyrB zl>s1VqC-2_4|+s>H>ga(Nk1k1$WuWKJm9ARN_@adgeTUcO_8c|@r3$kRcDgxIBy7l z>d#C5C-?^IEV|ATs`51ik&D)Gk7HmTXOIjP^H_|b?s7AbhP0wIIO|smA=)R`lr3E< z(B!W|^Q{h=Wr?7_EYPd~h2~owG`-ys^a4Ul73I?jeP(d6M8;f21R*t1|3zv#kwV#s z=>_(>?5jRdPI3-L+^sqtgIKAgg6InNH4X~@lrWv3;pxe>nH#8))^K(sTl!f9*D%Aw z!`HQS>R>VpSiYNQeZ)LxOMPE?3JAx`89q z^1_wS#HaUaQO7LD*PE1&LdFe6ANmS%Ak9Fz0u3{nsoc;lD2}RgcxkLt+LPg7LfV`P zW8GMq-u6&Mz|#RAB9~#4x*F@@A%N0Hc0g0bCz`d*Pjtxew?dkA9OlWRS%+gVJm6*J z?E`d(IXqxHm(cUPg$W(7Jh;t5Z!cyaVrxH=PZ}o+0HTAsln(8#L9Jz=t2}9gf(jR? zi1&R|##pkM*jLWk{R$ySMGn@D(%&TKK>bnaFW@L6&cRgB_FFvIlYGf1kX{KEPgfhP zDmFT-O=Yhs$T^WEOXSiuCshXkgmFbwAx;d!p9l_y5flq-g{!%WNXxYa8D|Wy4)s;k zSI)h4>gyVKovg2Yc!fgm!nvZ9m$yZq=vpatgc@|sGqR-<5ZUIAbR2}82#|z_(5nW&MoC?1aCaQA}d zmrJUTCuJoZHW;|)Vg=hK2Rl^f@aHCFug0H9KNfYK7_*YTiT4rz3$&6R1zkPEj5H6z z%BmT4T7Rw1n$Rro5C;`#AYFkJ#buwd*Ff_kOeNzxd|)< z(rOK`{2SzxPZe-ZUYHm#M;7EM)u*^haw#u_2)+x!!SQj_2^em`G(#OD00R^1 zQ&=>ZUsGye)8I_`nai=9G6NVoSCaWw75>)n477x-seM=E=MnkKO907=N1TNJjbF>Vubi>eXodDyYLCcDB zvZXiHa=Oy#LV<-qGa?|mNke9g?Vl_-heJ;O!u&Bl%_h4SZ?-xzN_KBQ=ks_9W0Ktq z=WJE`SUhJ-eyoFZ$?jd|K!z;X;GFwvA79>mOYDypm(4zSf>NjSZ~S=Xmmn%rdYA7~ zicINMc_*=%($fNSv%EiuclFes5_7p~Utc$)cJVlX?A+@BE8_sNU#|mPOfsYkZ*HU@ z74{_*pH#36X~Xe>21Iitbr=C#8_C$QSHbx{g8xeXyOJBu>#eQB@CA3+zbP44UggCO z)vKF;6r)kI#O3PZ9S*-HCxyQD5{4`xLzj+t(Zr!IU8ZzzF^YBiCGwt8uf*?Ik+ZIE zLD6MiE-ikczo8tiS8Ok|IU^lEnc#H!SPycW!l+)#J8O{-_=CQG5iwq{LVjP6-{wroPPgBwdAQZFJaHHU52#XLh6F)qnX9iI+X8qvF*U`cH{hU+CXJoVgc2 z5u}w1h5eVpo=v4aKCJphKOk(qU-Uj;wsylO_KW_Tc>bUJMYTL5TAuHIRC#!2+w2`&84}POZ;vYTB^A$ z;&RPPYQqjtxU)paC9b(xT8=naGhnc}P-vMUfK1M@hK*A?#Yn7yGMyb8xUxBD0_(~x znumePHYIJ-zN~R}B_3zPn@0fwGSQ(gE|5>SNN+keTkpSYvme>LK+H+15zi9AtZkJCwgeh#y?jEE}u@t+X$w6iJ z8nMI^yZ4SKPKSxpQR0)3I9W`J(b%a@scbTGa;>RLrYIe!9@2@e@*H+X<=g>jbCa-* znN#$-w3c(^ay3N+)F(iNi%^3!&536YM+UeMNWz2?_|+63>Bu+BnUotS4QiLu|Gbr= zpXLl!%~Ke1zAUZ@y0QOTyK1>MXbVE*{I+IUx+W8vx#r*i)L00_Q>n>7?1_=ahZE7Q zuQ?&t#W|&^679ET?4pN!Ay=rCdUr-c0YsGXs-dYGhOIi`LJ7HNC}KhnqZ7Fd%;an? z-8NbK>D=U8b4;8B1qM?p&+X141T={}2ke_Y8BmCZfnker5R{m7=B{++Zotmm4Wu&{ zd36JJ!)|aVenn_&!=Eq@SNv_hD5lJ#e6)GWgEZFuu|bVFo>%%(G5Vey zMPC=r_MVUCmKKv}X|0$uLk>)WFJPAF> zZ}5a(cnlKlc;$CM3LN0(afGt{OI<+1o1`Kz^lp-BgGZoADoBN~DR>6yLSf|9hO93e z^=vH)%k7Ki37`&s3qo*U^mMkPZ16O{aFtF9@=K}M7x+WtRXkMU*FYR|kv@T57_1s; z7V>a>0zIWv6LgPL=}%^S7!B&1g;q>2l~!Unz$Qqem%agBHI0V{0}4rG5sD5fjtwFl ziPE)XsbGPmX0sDR&_$8WGnS}GU~)-?-T*fxaQyp0B6rr zj1xIL8||+ax{~xq+I)uB4WqQH3QIM-UR|hmU}1vw5mmtY+ao{>p7y0KKel(Pj|$G) zpec(oNA7&D3a!Y6Ap?9QsvGiwMRHK6iHS{SA9UuZIE=Ooy|-z;?=BgIx8D2&6kC|s?;4RF3Q6=_-p&akzLhuAd~Cneb?QM^q8KXEjCg-jnG zev-lysp7A&a>jz!aaOKIx6M8*m&UhgJUKsRd|uEE`2mTSZaU^&u>5T0oG5Bx_^Ha?5Om!+G-J7(`9q6^+J?*g-nC4MOI zs3k~YJ?mPUPNrAj;3UA>YEs^7T~5|I5-9UJ@LC|`W8n^5T)zEosEPAIoS3#y$iQ~(9xP(Ydh2Sqp z0?`qpj^_V20PCk}arJ|MLlKKrOj@tfQ_2Nj&5qnm%jtw#U{>s1>Ca^lmXcQpg*H?f zT5?uP-YI#lA>@3QOcCT#@Vc`Ngh;rq zd7pQ*j=2nC_iKUxCEmK=yk)x>n%NblhaU+v0Zf)k~eQ*I?(@+gEHgmHBLtQ&D zgLxi8|396&xp3^Mn@G>oLhF?}9zAzM&FekF5`WTZ8tnt}P7~^5b>eK#UiWSA3niTj|HKIS_3Pc9YV+l91Zy6C|W)+Jsaf$o`*_{S^K9hkVd6 zf|!5F2i{}a$@Zx$IqxCdkT2ofm8atlm?vSg9!TP~+mtwf>E2VPr4-1H+P#3@P$&r* zcfnktr$FZB!g;F_<|L83TVVqkjPpQSpIv{C?Odnf<|R#qqaA<-UF1h37CwYGG$CIm z5X00H&7+jBp_K0(PN)f84SK%lJPZog2<1arz|yGpkZx4bNBs>7PtHSojaMk$y5*FP z5IoP3HcD2Aa#eYyI+6n#>`aO%opTYYoi&&m&*i$9_=K#pxp26OR%@i{W0O=W|DDc* zi0=Cz*Yiiz0sDJffsOTt0(?Z;|7rc%#e^u6mJjFdLOy4(e1kXt0Ztj+E}|95aeia% zt%pzu+}VIufwS^?cO#SSC19Lr#W^Fjs$>De9)y(^Rwa9!m>fn`X(Y=~VxAa3nW8O1vM`+s#%|6k8J|ac=m7uOb&adpy3VhUL?uiRBq4zcu1c z$U*60LW(H7vM6L+ik?97(G)#hLuol)uMy%xfeI?RRwMYq*Wf4NUfXEJmLEI=7Z$GH z)n*-yUaVZ`-4$z!TpW3EbPvshzA?rZ3On;tz^)~*Z-T|)oik(N)jM3)Cala=430`* z>(8|sUFw&9Bb9Bv<6;)m4{Zts`k%bxqG=1lxhal$kUk!t$jk1#Pv7j*IrT4*09))xcZG7MgT2 zg#_ME=&wxwx(L&mro{->4aeDJ!CRgzK5_(>3W+%qV8uaZc~Vqzd94|azs!$CJ`b`7 zXgVmKbs{{N$-$-TOqyyymWm@A!t@7LGU12IM_&NG{xu?e8v>t-619ZIh~v!Am1mTi zbm0_~bV7i2MVY0f`V#*1wKa`&@I?;jrOfes=!=1PHh6+1CBppRMP!G$QUt@1_7Xmt zQ$ZPw?B5qbsbDEyQ^8UA4R_(~f@}kMLJVj4G(2UUp@KW@;b_q z<;%!&=J7Ha+%{pPa3ly8C+u_B2L@-Vi=|gzKTFqNo$3~=^C@n{>H>Xi%ZK?LP(Tv5 z!3SipN!He{i!!ih zvpy#6`lkYBa1Pba_E!DWG*8AKCaA!Nyqhw#5FvfQJ1j4|nAJhX;Fo|wVgg7qD>Mwh zb)4|@mSe;3H%|C9F0~$X# z2ftX-3Iv#2rasj^G3V^KpF<4jw{%S%h{zQ(C3=Kh`tEUHLPplH1g}GL`^DX`8&q)4 zeleT_XmaKQ7~W2#b9o~!ZJ}gJ7WTHJX>4?x-M6HBfNow697@cQsAQG6U)()|{e#VL zEnkVE&Aub*ThDPTi=m{|UMp7l?z(1gu%o&Y-z)q@VOW<-fO3Gm{xVDqo=bQ-CewYd zd@4GJ@>C`{4FT}%kN8IeqWlMx#_WOctY2YFGFSy4dJSl0N8lCLjK&4i5Ec9goUs1Y zymKn@n}htk!Jk32rUdX*;{1WE?m6=cp?^)+xCn?GxRXsPL2n>;2vYDSo~ht1{Pw1T zKjP6MS3kf_{6yO^_}fJOf!c>L9EtNBv-b z!M_j{e1M;UwumYl%*JeCijqy(uy0twCYW9dmyqt$rA3St9G^#m=ddjV>%C$Xhy_~f z!F0!!A*{iC8p{rXeTv=xbm1_KJJcNwLJdQ6bm2f99NWuaJ?60IUbaPp= z52`?xT{2X82t*@D)?4}!fs-=%f*q7Kd9gV`b#g8~%$!*XIHe97rt63Jw-Z{1<-s!D682{n`!IOHeivLCUe+d61lz$9=AO8zbEt}!P!t-vG z6A?ZavKq?chu}(a?otF|Z*II%Zh@dk3T1&SH1paB)P!N1tTz1W_KM!gIbc`&L*Q4f)#p^b8sq_vM_mHqkQmf@aD^FY^DQE4^}+I?yej zfQ5Zk3TZgXaGXo6V?wScll#T0I}^aI@KNRfsQMYa0T=t9LqO7|QVs@siC|^Yi&1;% zI4@+~3S(px*_`U0Hjlj_7yV}aR5<8K73Q*!Pd(Z_cil&mGatftI}scJR4wVyWxhK; z(!xUF;Rdex970@kG-jwk%iBty9-Sei1_`jqZCC1rhA>jdY0^k3Nf*v!&LczqDcTj3 zBGja^UMp$bvICXVNtg-i)Ro zXSgPVaLjxzL$_Sr6)Xaa`6y=*Ufl(6#Pf_BG~;{nJXl8S0L(9S&m_`CBq$_9z6(KXD?_eSVCr$8Vc46>f zoTfz25)pVo6&OI1`t6$J?6l2+-^*a;lrjyY?FQtI)r%Y^3kEb{F$;^kWs|-dNKY5h zV#D#ZWIG8tl1CVC%XcpP-ax;-piKiX#%4SYAPe#giQ?NeKKkxxfG;rQR4qp^jAB^S zMMQ+bUm?S{it=bp1f7a!9}SaA3t^8XtfhCdf<^RC3BMzHx-`JTuN1})*t~+3B_x7h zMFC>v?PkcKVdg_M`oW5+^=Vhtv^KA4`iZ&vhNF?m$GM^2NmO@3Rbi*i66_kT?k?}0OW@qD?typuEh-F@`z7QBG$2eO zr@@J(P!dK&0w*tkLlfB>VFS&0cPo40HTV^C*WfVO(<|-dD^;KKVp3;{~ikSrVrxbI`O5GP8gq*b_f8;Ixqv!lky(iVN|R?B4^w zem@IuN!kRdLti--PJnDOc{#0bBHJMbIkyH0>oS7$6|yISEST+TkXVmpSpnNuO4_dc zY_I3%_mPJEE(H$boo_66<^tsej(zTb)gkrhUqzaA|C_wFt2nod*yFyuR@s=j4eAr) zb8{w8qH>~^++3OmELd%2TXKt=uCj@`xa9{ey-H0Ha-3r}E<$I`VgN(V7Bj-ha4**N zGH6MSJ!pZH5HI^bDNnDn$`(#R%hTa3{+yc53o*h!3;4}){J6mx_=R2B<^;%lKFZ)N zJq+pwb|r^ew!U@%lr|&IxyXPE6EA+yhXQB|N_P4Imet!YVLBR*%IJ9o`1%NDzGYgqgT60LF6j54<&LrXLj?)0s0#`Ixf(9z{7Hi7#U=8O1f|KH5aq_(?!B%brC)2nU{#u+} zvx?5Sz`q@M?3#0tOvbzVDh@4KHRyV>)2Cp51PJhsfD&7rC)Mm}P(l1+#X6|<(SkBE zXb$g`alNEM^oG6SYvQa^mkl%o;Gc6XLi1y0i1Le#y{9vM$ol1c-015#+mmiD@=Yex zH`!#9g?yXnZ~|^2=iI$*OLDWDdpEmDHlT^eMIZ*n zEfAKfq9R3spddCB1P)pFh8jW7+?jf@QQ$1g zkJ5bzDI90G1eIm4)F@(rh3KZekb`F~LU0ytPQS5HCxNGe3-eNpluF!fbR3@IyVDgAeA4#z-(ZrjR~=^ua=CMOHM zDpQumiU0R$tom=$5Zz?FcaqY8<|3Tv;{(!8t55R?(C4lKUdne8UjA^)J2I)EB9S_2D>-FT$uGBS|jrINq z1D!aSzz7I9TOWt_q<^ZwX2eY^Hd1$i^J0k&REE-r5G~xVd$~<2%Db6Vlv1{u>YyEI z-?+q==E&hgo@1o8DL&T%p60#p_gx8A+}XI0-t1gBP7lJ%W;Ps?BQb})YaNLQr6(IO zMX2m5@O$o-UbF7=8?!c2Zn0W5o<6>anNWlU%SBiFye2BVw=n)a*Fi;vzZdR*pGAt# z{Gf&;=YLW1DH2%g)x)5muk>JY73$_dVAkFw)B@X^ZPmdE?`Rb60nI7aSI$$D`U0OG zq4fpPTpXTdAaVG{hU?|&zUc-P{1ATHGyKdcvQP1PC$P|%SIO3&In+q{?6E0ZF*8$= zL%MazLPWTFz$Eq7&q=#KnibY+B|TJW9mY?n&>L*Z=oM;KWk$uI<0gZjh6deiIU0%{ z#>k@!Pk)!ojFLh21+G8uM^mP|HiC6a$o$qAl#%vuvSGLwv!1v0nWCBEwE9mdo;Nn! zehtIpHbKpcfP?Fnn@#-Vpt1ILCwG#$IK7f^&~+Q@fRmRHzm#5rvz3A+y;Rmu<|Agg zi_a0{fP;IF z^pe6hkUw7e4t1`MykiTkziX9bT{nFw9-Gynk1HN)B0y9;)@m(I?gA}0dp({mKc%@n zTb*E((n)=rx2t50uQPur9-DlU;9KCION%>~DJ9mXDrSd+6=q@Tsm|lo{x^b4e}pYI zFqqdQ-vyCF1&xlI(C`<>$6DPT7v6qkm&4Ldlm~nRg~_ot041LX&+#r|8y$52uI3Q> z%hHl^!P7cP&^@IkQ97iX8ecXdNKu+WJBS`|$L@0AGEAlLK%$(gKAL>T1{sq)N?B)* z$qiP+S|})ojvC>Xf}WRfsNb_kB>55{Io@zH&6Ba9R5$^D{c(-nlc~J9HXhNeelz`q z-08!q-MMGUFHVley_+D9P>_~_1oWW|m2G|XH03=u6f7$yk0h{9&g1q|$kN;B zVQw9OQhE$AHlGdzs+lUQoIVeLbn?L#f%KOQVv`>Nu>7)7Xxq9KRJbcCKkLW`ZQ1Wa$WBgpfiLp~~3q*{6cLE(pc54$44}lDx1+o~1>39p|Oyr8O zeP%SOknq_4Fm+3H>{&BX!X+mtVB9#Xkv@XN*Sb77ijAYP_(avOwHw-oh{eIHKHo-% z_gDh3e{Q}w;dHFpM7z0h?tJ1zRhwuJZ=Ab8U$OJw$B5|G_5yV!fAmd=K(qt%7;M!S^ABq~OA6bsar04huBvA?0%`Ti^ms~X{8EQcse3gT z6|8q?!9AK)30O`nu(n~~`C+siAI+*<76y6D`XFz$YWiZO@Cf2Q$>^vCWeZl(teoRf z`dG>wc5I)Bb8||=p*5?rFth-|aPUqTY-584!g6vlpz$G>JxAe{SV}J~f0W z`8iD-CPL>awa?_IW)e&W*=Ts1=_$O+bW2;RzgyhPHEX3*%LS!WiwK?m7Zr|ts4oRc z4p-Gb<=)dhYnOB%x7&10Ks9}^r%Q_2cy4LRADve6HSkT=aI;tuwO^vu0v!yMJRYp9 zLoV>Yy5oPU{AIf-x&EoDhdB8GxHhk-n1C#lSi=xrO(M)MUu1_1#OY~7X643B4{T=l zfM3L6hR3>^nn_?{)?%JOa2l`N_sZeMr=n*1Lo$&q(v33j&={(}s9|377TUZW7Ycps z-&7dl8?%p+(^WipVqB04?F^MK6a6)Al-j=_84b#R;vM)_$>s{e6SaTF0@>WGGVIQa zZ=eFRc!Za4q<}cCL@o2y0n7h=%%^8ri@E1hu zK}s)uA~{c=WZBnTSgB=mBoq z9_AoFvg3Xi@25dCR?)A<=~90weKNVyROnX}v7A1IFYfW$c%;O^9-jRcJhA`~EPLnu zRjc`LxhEt)F!xRV0)A|sth@91cmEXs#*xx^a68=M(oV zk6VPcQ)ltb1ySS%ZgnajC8N?<|ManZaG8mZ$ANNKMKN<5>z@(JW*VyL6w-h&S&uHI zXBeh^KUZd+2Ig}5GyrRPKV5IOY}{8_nApa=`8E?1STCe9|D^xKG+ zrFfIHGU=IMvw1vvGox-ckJtXoXMp=0j}s-o23-;7v_?2>=s**Hi#IHn{D znFAl9A%y*c#yUbdmMNS6BpiF2R5?*4*~u3a&dY)4dfISlOMH5 z$0=k-e}VO!P29$Y!v$E#i~>UAQ0FL#$dGrrRp2{HF;#$Zw=wX3b_cpfwHh}GC?>Jo z*4$%j?q=9Y7&U#A{U*mB6NjB&>MdjaHV7RZ`%q`SinF#A^2FGbInk{6FFUHCgdxzJ zNn@M-e8ln~kr69B7p!rb@*Dcm85r3a3-9`8-3*@S>xIvxT|`NRT++YQqNVx%4Jk&+ z@A)+~an|-m*DWc$mLM&~G0tyo-{hnrWGV4~gLG9YwTXucXIG&jW^27|f8gcxJaRi} zva9v1K01urG8$$(W}ZXN=@@8t?p7lVs`Pi-N>fn4=tKDD$5wr-mIK{U>_5QL&W@VXifU2Zaj#3ND?Qm9GCn zmLk!5*u&ut50k`~soO@vPdyS_swF6ZYyXE1Yz; z*BNre6*MWW`@c+0OFA&M#q3-poG|PGN^2@eS5WNJ1xoE`KwJ86JsQpGDXkkwBC#vERk^+u%1@#*f!2^YVt<3_FnTVvk8y{>@pc4dhpg zpgyd@QGamvy@aortmf6jLPfH-Fh7OXkoCC{!=pUqZ5>_?IWk)ZBaPWQ2pY}mH`qEj zzyjO`?Sid?pjKAs`x3daZFni~VA~*2raO>3c??nK6u^Uxb53kC8MV@TT^vVQ&R6?O zmIL*;=CpOF_#iDSxlIBq?O}tQ*(4xB)O=%HsTl`z2eVLcC00fQjoGgO#|5Mj7iT1R z>>;V?Zc-EfS4mM7Dv_hLY!^4EC3&`|z~xI{46R6M5;7*wdHShbQ*l-9{l?QTh$41N}1$O8;{fFZAwWQ=fZ zbR(S49qw1y>tQAq(Z@Y6TmGN(qAu|NmY1!eVQTW}&W^2uwZ}p3Es_#-R&`t}9odUp z61d)y#+y9qH=>8+TMZu%=9%V^;5Km>Ki*ebZ>6J;w?1XR-?ZP~+HdnQf*)ePC)sam zzn38%jko6H4!zCC_)FuKyxhRwEMFa9oP)`t^P(QxOG4`52o9U!I-a<752pb7kYVxd zJI>;_ZbX$k54!-FueYac@7q~hU!nF=BNDLrYyb52xQvmA$V}9%5hHTj6*A&1geALB!7x|4)#kaJYzQ5`Q7U=q`rX0?; zVh;9{d@D;&&4t- zzP6HU&VvB57Xd<#}oXyh5E-!fkDAi`xGCm|^LLVnan@?vl zXQEexo}>Lh5&-@-rXY`JfQpm-RVZK8ox4h$p=fF~oBPjQ31IvxaBEBPy@xV8MIq?u z#LkFj6~80D>BA=bq>rD%c64C+Fje24{A}Ua@?A_e(UjuW=b(qDkZv}>_Y7c|1Yk`w z`3cQo9G$>*xwQN%N)Dz-ro1~k_)Ci!B?lRSM5Ch_oMor9X_YkJLNSiCKVCT3!<#zY zo!DgCdfL!9ByJ8RhZ+vKi@}}kBO(cOCC>uu+?znyQH9*7kDm4^M4Wqr+-+rj?k1d> z)r;J5dOlI@s)A_N0T%#>k|T&1B@eZ9v$^0Sl^B1!rdP}*WUOS)((k63A%6ur=XuDz z&CT9IUTEvJ!qJ|DrawZ_9#pR1h%1`4^3BSfY9Nl>d7-i!{8Z53XHNM+cct;Zkm)xQ zB;Nc`HDR0m%nGnW-?qTS)hZt6hRA#-rMq%xH&D7oX%5XPD(K;1qlMQkf}N|6Hs(|o zFK_Gjv>;p043?;xvWCfpmadqL9||g4&>BgfOrd;nplLWv(--Ctcjb&!nX9X1g%#Y$ zXg9ex>9=P=W{Z&h)z;$2vb*qlvSO>4AwNxkRcl(}j=qT8Gw~s?F(3IB>6?M9IGw2y z?L>^%;XA~_aXFO~x@NFCsqw5{ZQT!KzJhML-60m9A4Pi^tVH!n@)%qb67-{4RRw-0 zbU7(IeH!4C5PJjHW5{&tZVixZ?Ws5gI1RXx94l<>MKA=tX2X{}04&_+D<-q$Zt7K8 z`wp2ukjzg#M0{A8srR^DpN?}gvAxe(GGi1Hm)5&yPR-Ps-z+@k;6?kR-N#n(n}t_B zQ>{f|-d*_e^L*`l%G(#6(i;c5dbP#a+5rtfcf8y}oQqZevp3^4b*)fX#vAFWKvbc-)q4Qu0W`hca#@ z^ft=qMt0q~S8d{OeDag#vNazXs=5b-ek_HqSnFWPH91b1U4oC<)l`#5>zhwds2cZu z@4Zc!!RR)b2N(JtURdJ!t`{DAhR?w^#1Pg<-F_$8*S-NYpV(RtaW}9TsAw(AXf}Qz zwJPJN%s^pu-C*HHvT}*ai7Ds%@MFzxJD@*C6y>SL3A*>^hEWZxJwtSW{+C2nAqZlig8+;URZu% zMvK!6`(5s`#%a;48k#9_+?h_1#Q1LD(}It#8!lW6AGwsW`&EXyVuoFVAFyH>s}Kh> zHX?f(Qz%TGi!Xdd9ed4S&m;l_U9t7uS;%CydeIF+eY@h+!Qv8<&%=&I9XV-CB9q%D zmCeeedZ44<7xZqEYOSHETY;q2)(Hkgi7qAN!6m z#8rRvxl^<7xgTZvqN2?)o^5p(1}|wu-N}9)5wqm`;R5?|kjw4TuU$-V{W*IJ%SYmL z=~g1cPJ9H`uopb#%sk}|4Nh92(BOVVc8Tc>PXdO?fnkqi=Q|C-1n~T59qL3HP$#y&Nh8~)0kC!GiMZ5Dpdy*owV}x?N(PyNy@B zw|Gm=}qw)*FN~vriBwwh7+x$?rztS3gI7x!40 zLC`Aa7*c*eM^3f-;7;6oQSIh8exNi{?N@9X+Fx~gsONZI)_3rkz6||Vo-0PxhM63g zI6tQnhH`ch9MDCe{bwL>_U0;a4^9Po{SBLa&P%QSE`pram$IH@fJ^c{=?Ey3?749m zweov~C{?JdS=H4b@~rHEuDF-CTmY8o;2P3n z`YgDs%w*0a^)Z5;q~G*Xe(b7`c~MM>B=I|acAi`h?NkNpkzso6yAyq4HFZHI`G&xl@6zDcRM^)@iNd${%D4t)964|L!ott&h5(~BH2Xd|Z8?F<7O<(ElOH0C;2uzU9$l9d*rZ%| z1$mZ@$YmhIw6Q!XbDeVfd_ECJRcYn)*?iEwI}NRWLTZP3XS(E?O_&sQo7$jene}3+ zlDrB;Oq_a50|~6;?N0e2R;RT|9TfcXc*)4_TcLIvG&*xJ-=!GlU?*iQG0eeqN1V09 za4=M^h3&B=N{f^W7g}QN-dm!#!v_}L9p+72w|-dlBH6d~8mhJZJj$|7F!LDSy7eO+ z{|}y&`3q(q_MLM_UAU6^)WU|1#OnBQw<3DWQ&J3K{qP~;*~mAV z9D@0qPm@g0Fjd36IH3`UO$6Qj4X)XZTZePbY-`=g=pMId%{Vrig#!+Oh6DSaW|?3uB>0VBXTE$c;qD(N4vDz2n2#@#s_i&g(+ z>u!xq7htEb_j6nh0U8^=Ld=JEQ*r0-GLxI|(?LZi;^su4jS}Y~)MhMCKG$@Z{$3<3&tE~zhL_!YC zbFZBs+^61?yp-gpHmhk01!svi<~sXs$duVjIErdogPqJfpX}1YmCZ$pr}dJd?A{skBuLl~t}$x;d&{;!>6a(l>ZI8s^p;!4&_;ZBw6Eydc;J2ip@r*yn(bGu z*|{dKqHf%TDRyJQ>WnOlFcESq6RV`K(3V3Q=0k@SUdPaKH8@xiR|gJ?D^zq>s&Y%o zOL?^(Lyn@IrB~x_zm}GoyaHFPXYwgT9w<(p%B#`mr>1zJ)@KTwdOugCDNhI4q_N(Y57dOz)xi(Nu-)?YWo zMR6f#?^iySq_>cI(6MQFPoFD9+$QH;Q=@-ALVbzjbsXuxQJd;cIg?AcEHZ#!PB!aH z8|f=V!ok4_4JY-b^+CTFawyB?kR5WTOXHF&NVRn-ROLi9jcoPaouwNfxivhUvu2Ht zi{nB8hw2T_$RGveKFNB0{k8dghJu;as7j`v4;xyW1-M-$Z(7Oipo4nT3wwYPZkjdD z;4pV^3>!-vTwY(kD=|I@j{0)T!$4Nq>6I$CH#T0zs{3G6Cvy&3*;(~d|CO=o@;p{e zzd*GVxV^J#hRDv{bzdcCH`5ZgsO#a@A9LE*OCHtwfHBmjH3G)(MIC#I)(ar%Hq~_N z6>_QVwca9^+GXo5xgv zuOey5quKW>!}noS*PDpJn48?hTVY1moly8Wb^99e^>is0DsUL+#v`SbzJk&9eLOw5 zZ{oR*W^e^Tf6V(Qz;*S4zNSu|TODmeXYr=|uAk=|Dg_V3BTyqb^Es%q6-QdM;s%5X#LMsV=8OrJ z_2ed^57tevai8HCspOZ|lbg+_UT-9Sd9cO~yKpAM^#|cvx^!vsdP4Df1Fz&y7B1v* zNk)!2l@wm?1-%40c5oGo@q0%aTtYvtQ-p+(1N>)CE zL2We$^leeU*IH(8j}yDd5mU1LqxbQ&ef9CZA0apfJOU0ct5dNT1Ov1 z#q=$rvWHG#SUT8M87nzyO_#MaZl0{NX+Mn^*lWp4aZ2j+rrpKDaUZb)NZ&BJ?g7{s z6$;nx%J=?Fghk|6d~Y+)>9{f1D(IGLT@8O)_`aO?=NCNxAiQAz;yrOEj==Xu`kc}A zPheBQghY&vL#`x^GAl98W~}+-3?k;2LAd<)p%rqOssL&3Lk(EZc zH~cJ=3MJ=U)d{9Uk}ZvM)#_zL1Lh~PJ`s;f-avf@NG&8=W)=a5su0OI)E&;D=Ib5; zBC#>0PjX@m<0Ip%_!n<77SbEoka6unB-VPLRZ7E5sjNy7FyE@?wN^NKIh@wnOmBKW z0LdH4oTKk`^xAVF^ww_?GIL#Spx!@PAGrL?lRbhns`0TtLR;rs+>nSF!6eiJLs0`n zy{ZFQjO=DbTI^~5S3Qe{WBuyv!cp(a`qhsL4|{<3tMyz9NGZ3e$*Y|*wtr4ejqTq^WcbYCY22N` z%;B&d8O$6G`)UR=hr_;+!OY>XZ)PxaIP6;)%p4B;nqXQh*NVdH)X!=h?)r8p&^TDD zXMBjuSl4XWGDPc*3kx`BNC@n@>ewjEpr{|Mzi0R z&pSx07NsA7WXX^Can^Lvm+_l@Q7z!X($<)W(o^2If#Z7N$b}O}aU)y-2$U-{N|oW7Hyvp}t62>7iaKQ`vnY@(6&yYQY< z$Y}YTDj!X&>YHVERWWMXcc_^`k3KBD3WXa)kK}v6@>H?(;`S`LowI~IGoEVtZjwNw z-0_VrQqB4>^CZzFy#svgg^6b6(OcqpAvKi^)>0PbTZ$%2(d^d=<;Q_H=j4uB-^fNi zN3mVwqK$gVo5>TSp4VyJ_KV&)zg;vo9A;RRaqSi}VswegmN=2n%C$Ss_uy$qXL@OC zPM4j_tafuH74!F!BB80AedVPb;6!Zi5mCOJ((zISD%{e7wNUC#WmumhyXt+U{a!F^ zp?;c$&5SuWscb9ez9g!oUs6lACfP{7ja&DbUKJHaS%9#v&|4ne@0;bZB{PRu-abkY zm&;5OKei-F1v1I3{XUY}F1f0a+zl{z3DDlg+VyyOtaqjcnx&DaQ2|n&d4C77jR4%I zz^uIHCmW9SdZrNIl_~ajRfjnxNyul#N}}X{aHDSgJA#{88P$7kR)T}2XlzNnl*>)M zjpZ#^2$*Mpgocs-yoGy2y`qx;3Rj-E$WVv_*RXx9S4KA;$=tATD$k)j68P(tv4QEmaM*nlh$x25m|b!k zSkl}134ZAZg|@2XLut6dI%@qctDw@t3JTrfLe#HO>xjou?Zz5PR5P-mw3w|I3EG0F zyF~8rj|Wq?uUFlUQOz75CgnmKG+V;~PZB=DpBST>L-Nk*PhwppDGYsqh=f#}g-)U#dcj!p})%&}yn0nZ1op5$Zdm-iE%9#7{#M2}k6 zWJKMifrSEw0gcY8a*JJe2Q&||ODoIT*t^Jx{t!xBwosdF&b(G2mouzQop?@j7M8m-J7M=@IDv#_UC^9vj7LN6Sv*g^muG+cCU_3bg&C)_n*`rXK25g9 z=_B?z96raY{=Gc=?oYmN;l>6s$Kv1^_K-HoDH=bR+s>3|JnBilt0+dlH%G}`eE6=D zRTd*0-2DT_^8fD1lOtP0e9j~__*xh3S1AcmE{&ugmojT$DGO{-GcE?BSl0cP()q7$1VnMy_ z9fYSfj`epVC=s=CtJCKA@c43i)k#m7NBx{^?0t&;;^|LCY$7rrS9w=Xiw%V4kp9d) zPl;9<4WNnjhau|^cBaoSiDUCva}bsJ{Vy_@IUM$@3}y~s^tr}x@_S3b-G4CmcR6Mg zN8I|vN7yPM9SSqgJ7A@AKLkb8{e4NQ3X4OqYV zBE`J0Bn6-OuITu_jlipHse$O<%c2vnX=S9@3eWQPjjRdFx_c2g%8qpIHrCmdf(VN- z;*j#-Vnn|WEUPSXWjq?|cWjN2Zu>eZ;tB74xW7NHtaz}~&^-W*Mi6sK10AH$RTJ|RNpimHKI`8 z94#2ls*fizK#}+7d}!@A?5M66XRT#yMC>ch-Y%Pro`W7pzWBP8uMwwb@<$R{y8zcn zWMFHhP0qUs(PvH~dXz*Y=)-U8RMmyeUO5~Ku;;=L7YZ3j76T7yF1N|&*no`&WBtt8 zS)No$)d1em!R74|fywKj)>+SwW{qLmZ~6&3DJro~@^ZLA{8*%+IZ;C-+BL$b#CXly z@E`AC;`Gx(6bB#aIh&UCXx3Q5o%o_hzJK8fhGIM4Asn|Q9``83ZL zd49qZQ}5XR7S83-ZoRkiDEtR`OGER$@J##~N0jtJFB*lEp3NCC(P&k9J2Q|)3ufh3 zJL4TsaTL0Ep21}7!}*4eK2keEy6?23@o3oSKeES`HXfn5DH2W1XvDf0^YOc&#&+pn ztS0L{LHiQ2MAufOk{j>ioNuwhg2H+JlYS+I8B+2$O;Ku` zUIg#$z2QpI`MfT?sjQ0s?9 z>^}cZ!;gJ=RP4u>M?>59bA8`${6`3Doav_icYOTNVP~bY5?JguFHcgZwTZE2W4`vw z-H(R#0mD(lXNWs?8hw?1zn6RV$HcF$X`b9)FJ4o%Ip0AV#&hj{&0w*y?rYTwtfb5; zU~dRDMW~Wp>0pP=Muw@uBysj9plqa{Q%!LCVDseAkqnH6^z(R(N7d%Wq(XKE%k!cW zd>(>IX-dNB>W-NuJ9#_-Y#zP3kGZKa(7sw&3(8x&w1=`{W)ah;q>O`J+Tjgr%Mjf8)c~v5 zg~Dy(5w=JYR%wzh?c?%BBXnis!J0AfX=>2`!}dgIJ?9)ywnKCjV;3D-4|yUs&0hqx zrCcwb+*>bJFooq-qM3d0okvM9-UwlD-Mydfqw+QVf^mN`{^V2EywQ%c|UywzY*4h!R2kB=p0^c$4U__5VjG(Ef7>R zr>vcdWkk37PrpRn(upslwinH*0(~4jCR&vrkG@Q(@nhIKVJ*_z;a40sFWgrhHg7EZ znqZ838U)wa*dCueCka9MKc1Oy7bj=4Dll-_Gn~cyLzHRQ%77YS?BZ)m+eBA~u$H*` z4#HehZm#~Gy|;hB9!Y1#qS*HpHNvhK(vq;~$z1H$ z`qCP;IS2vlHyO+v2D5`@8KikN;A-|a6#ONAfvCK-y2A04&71$a&YqNHgNq37@TjMH!96L-)R zY9oeAe(86F>#`0mnR5x(-NK~+87^$=gp|_$UeMy)A9z{%vjS-C*&w|CsBh8598Q-% zWiWF9!{%-{*;^QkNn*J*`u#ZzXATd?vHc!ypKiFnWZ}%=Y5X;VnFHAKvOGJ9ll=@$ z_`uFZv>h1hRo?%W#WjcH``-*^4ug4JjSvXH#;W?|uD=kSo;Q4LrOBhn6-BO$ z@HNV_f@dX!w|>Su+1R_aG6xX4{N*s4$($&gSfjpnrs?(*mvmUFp&RPcI_N?z|# z(WyK8H9S3zr{{*!Xog2-j>Ibs5A(BpIX@JlUK$R_e!MvnC-_T$H#Xi;abn zVwV-Wtk`A6E-Q9fvCE2Wgs(g0>yUnB7F&BHh+~wm8|mwn5u#QUzoPgR#W(u1>S(D` z1KX^nb6`ek+hSKz20l2dFZFkG(2mq@Bnf}acwHUuU}KV;Ky15OTNVvDdChcTe=0?Ux$5$|Uy8@{sniaO~YOpqs9!h?~ ze(_Ad@S^CVrFgrMOWt@zS$6Xh%Hn5Qd|Y|kLvW=rGHvrBOK(LmbrGB!Om{VP5&ngy zF3QQSrY;JZnYv`-&JZx8w>cmK{A*bTGl#<(8O$6GYYH|+UC9xp4>KmHiU7xO7Tz2l zet8Bn2QX}HMu6>NYa^g|$cKXsO)#EO{?XWp61`IphzaE*U#(!@ zC5H~&%x=9!zEd)%WiuX3%aiG!vgkiMGPlyHL;JJqQWu7J2=J z!bfQ;=P%89o}Aw|=SgyY)tnpUyvv-Alk+1u19|>{tl@g@Kpp|oOBL#BMR2I6`vawW ziM+OUz4lNIEd`TCFr*`O(7bd6NT01x59}f{i=6Z-LDeu@x6@+0@!P^$>kE7*Uqy1; z!nD%cedrrcA&zCG;fm9Zrl#mIy?tzpr&E9Xr(I_d=3sr+)IVi?Lu;$P&8zhWr^Q3( zuZeZUO}d6%*_4GJ>>t}XJPbv@f=?O_0WBub}1LI?h zN#iqnOhY!Ghto$s3$6xsjUA@%Cx$m`VVkN_AKu7y;S&j{%ax6&QZ(FD&2Z9&iFih- zR)*OEt$c772h#EWU&$KBzsW-=9J`$-?j#7j{&?^vPv=K_b2Pj*?ZPAPm(i?7+NSM@ zb>Cq-W!>E)(~@MKl`?o@jyrSTRuIk*halkTbp(F${ER)@n|5^ z*&s8K&)gw7^=>%fjv*t<0Rr9RH1bRW5wj4bEETu_rwL zUApsdF3E5bH}CG`KacZyi`~}Q)yg*dj7Pw1_su3NI%jSzN`A<2u`tY!G=yyKhWYVs z!u&*GGyp?y;rZ!q!u(8O&hLi#`EJ7eLSZ!820XvqO_*OPjK9`I`+l~JfJ>6KAjc|sf$pWonPHg$d2Piq&!LcG6K+OwXv^K3sa_X`>B z-|Z3i@Bb6-KM40lyW-xF;r`=E~0{}b-N3HR1rabvc} zxCB-IcaOOL{-1FFL%1*Q;#S-Gr_gEc>fGAe@xK&K(p_j1J9iW2-wG4PXW_Y=11J{a zc_ZuRCP@W6uMECOayPzV$4CQPg_&++`663}(c*}Tvn5#P%hF{(h0o86 z7rRufA&xoBwP0YQj%`axzJT-+C$AM!_}lCC);#BCOGW4LG?QzBoB5|0>8ik-A1mC) z!1H#Vukrklr-rE0v`VI^DUmA@(duvjPe}D^Jt!D@w|ZNJv<-d z`8?0Jc_!}WCo0~I+_A`8cI5X;JE&cx2237NCw~>nHx4>cX^EoMNoNk7C<3*g0Mqa& zY&3YwBJ6h47l$YpOY*gL*oh)gyQh;1wwtdem1_FZ5M`U97^~<+5vW~Klp2)N_TsCE zqH`cZoJ$nPSU@L^K<#oTPS4I|uT-3#^s*2~_Q0vJ@J^hLC9`b^?>6Fu#ggBQfjtv8yI0Ch+oj8@9%dSwIO8UGIN8+^)3!OLuwQHR? z>|%bI;&4<D#&NO2z3*UliiJK(sa%(n&|4_D5kYPV4@iZUEb#zAVJ) zOwPLL2xPlTJkCJa1u~GnJjCftR=aUJR{9=i@lLmjUz}bM;&diw-8cfZ2Rh|hvUAyM zRGua2D?*$TRUTtgo$?6OUfhXO-?{7>#i^%PhB))*;@!jqZ!hUYT)K1FYZYO~v>t32Tgh zR@Az)BOyD-m2svE!;AqsKk^HN{fhI?V2LaKDH)^5vzq5&JdfsqzPo*7U~~qLikpR* zcqSjZj?Oe+TJi~wpxY{LR)K6Kvh|#&&fmo8=C-cv3WGwBeHj{T0Ag4$br}{T{tjxg z)^9-7-j~(&EmnSwC1&w}fRH7=8>V;8B5$#L$<*_Ao?cwuX7 z8>ixAZ>Sii@P8-CFuP#v8tvfatcewjSLwB~J|P{>64!T}zRm%cN6Di}Wxh@3QYy54 z9RcPPmb)TCnB&i2o)hdgyWTp_!qT`tr156T>yx_of!b%lzSYgbMYAiFqZ=*sfl=#p zu!gKFf34Rq`2N$qeIFeq(!WLRz4%Su%g;Fb$CDEcwxSEuJ{;Lr)&s zacz|fQLham( z?%@L2q%*dxLI9CpZNcU5s@>`HRrNiWkoHzSeYO_Gra6=hI!K#nv>(tZAvAfFG8FI} z7A4|2(GXL$_XqffC^^qyD;%UdQ^c&|shX1L1f_%88gw9C;S|DYJdXT+Dkf)+@wRw1 zbM=c4*Yr4Qy`S=Sik4_xCAW>!eSHI*W~2ETc5X)A$CG+LE~SDqx(0GBW`FRzkYfJw!hNu(lBJ$Kzohl80Ks|=oRIB;m-Qi5v!`~e33kzBKS9)226 z@!Q$3(UrDR%a>5+gvZG%4Xo?Tz zY)oujsI(7(rBB{R4LrrI46FF+IQn>gdm&!xKT%=7qWIn_^>(I&=Q zw+ffqNWfx;jJ!?TtwHVm-tW%-rrMREpE|@+jhmM->Y~$a?2tf_zzu3Q2~tWwhp|A@ z4)$X8-7;f`jFyv&$kLp$nAxY+3q#CUz9m{DKgH9O)J0Q^786X{e4NEBy;5y8I=jcgZg%`7rJbL{>0?H|VyVt*dBVfJ%QujV}={>;skS~_wz zaGU1kw@ZRXIAlFZyKhPRm}hj_fJnEn#ICL1_p;dcg&7sHwh7Pq>p?A5c?(qJ(zPpMflM_xgI38QoPNS}KE)Rt6KiR;`@@FiTqPUnO9%SA9c@q=x9 z{D|c^J&BO?btZ~YVV}Y=7iRZ&EG@j6w7#!A?@*q*q%|44n6U6z+a#X}iTCZ5qMen6 z>z|WfgLUF~;9jCoYm(5@RRrv-_$_Mv<#>n6X2>f8#q`U>+ayR|)ynG8E9n@K0$T4^ zBm3Pf2JH0joY`rfKyMQyR=ALv7pis^J(XHm5IE$G68^k1bAc^h!BEN5{hzv!ltigC~hihWJ zw*9=esRIz2@^{LzSmS}iy)&^dl7VN1+Qu=3ZJ)Pm#c{7GeEpwUJLxaHg;M+g8un~9 z8kV@!hjE}=uf|34jYh$|(X6F_Vf+}G(U=jKq0ffzhi{zxky`LNAD-TeAaUz6s!ksf zcgqbeiqS1DCBIkn9Fnnt1Ad;_&)%=_66*hlB}U-Is6^w-L&*r~C0ec}3^DJIp7Kqcu#Pzx&koS86?Wm8eX5(W~>(dI{;Xy}r(RO%N zHeP7|>M5kGzj%iP^c?T?5nB7oyFk1BQlq&<_AWS#<~sDH3k+dp%q`y8O>=qSYozyM z_2cf~RP)20dXrZnH4QC?mBE=Sjp7ZJX8DFnip@x^Ke-OSYKm5XCY;>R{pd-q<%3ph zUbL0X?D8KSEIZeXOEz_EHO?)bXGSn3b9OmgT=zpLO(_O%dJx&GmoGoFu|Z5ci@v%W zUCwUwo|uA&HD*Jcm3MUANa2KtolDl|#XUMFvxF_bU&0w@<4Dxafn{PRww zZ{dHcFKWw+8`%LVsqWEd5><=+2m5oZqZpyxezhdQe zB|L$Rz2D{RJ=~Xo^`&#{aQ9-#ESa+Z59p zX`GzDj-mK-2vvO(>TGfAjtp%zhc=I8Wcp5ZXXA`||Cop-nf@ zoV6|L@-wZ4aU?L##)iE}*7>%`=u;=o(7FU-+WO) z_5EkUa#CKk-g{$BRn=dw>DW9@x+B?Ix(V+a>b;!d$L=i0y#CY4HL7m!27?3jfd)Ya znssiC9I#5yR|6Vobm z_0_U5wz;H?x9vKX){D=h;C8x$>{;qP$wQc6Ca)(;&0bUKR@vrMtz3TQ`j3>uHp%3w zT>C^CXvCbVZdtX3ALq04`P9diN{3H%`NLRYj6U%*%HjD+7VXQW>p51j^#RNpi>>N2 zvx%*wz1{$2O5xL822PE8LpFh|SP6p|mGx*L2n@k+btK!kY^)#)SMP?Cv)l9I>W~e8 zxrD0eV^yi9u?l=gISR>G<~qrQ*mfpJrON)mA3cb9yo7BeYeQk1@#2cx->EdNAIKPu z&u=P)8GQ7|=4FlNHtM^S6UJQHT`l$=In^LwYm{=hU}Fv3XC5}cIW3GO8j)Hj5iIx( zu4~vT#r88pYE(hF%XaZB{fh0O)vZh#js z!|97#B3dp?z$YkErAqoYIIm-~oj59=rSXx-ZB#B{x<1>QXis08&kQZ76K_piuX zTQXT~;sJ(5!xDM}Gxm|HK>I;Mnflm|fn{LL)_0Txnd$BO*|^m$O2FM)m?PS+h5KN` ztwj~jac`Mz{wkeH_E4VkSpW3FyeFpk$<;Ojt(gHXq*lmGe~JBj`*AVI{M@{HUT(as z%+C?EbHWLglb<7FGrpf{m%5uX2N_{~et%$@1bHO$P3}*PllxHTbMgTPVc@V?7`q?B za0ux2Un|@LuHQh1q93~V7(V^TAk4Ux*4UCKj4hd#P#L~wo-j5uqv01FoK8kY7dI~} zt#hc~C|N=qNH##*-ia;3xmn`Zq@$OUeVYFPeUuzRbnI*Ph+NdD<~6@nnN4TMMVn$%d9585oET2uFOW4SCDM4y zF)|oG^KUzyse7&=ZC2{8?#r@K4O6=_+V|RX@@+F58l`$F*-$z(zDur-!qaK%hy1VN zn={4Lc)b3+ijqSi^LEwQIQz#{uK|8o2maq+Ib5M7uP?xIL$X!>dT6Ji9m0J7%<^sDgzQj4bKBcODeL`9V{1-a9mC<#G}{o^hKz4O z*PuW%Gj_94hfP0A1A?2uhPJb;FwHps`%c^0rRCHXw4DD|-@AN9CCb%c&Ys?Gt&Lkt zHtkyb9>EVI3anZ@X|3mCWoS27?rdJ_)N1iHMt`|d?aEI{D_;)`RB{~ zKk1N5<3}d%pEk6!Gz`_+52MkvAI{G-q+&@-Kj|O!!Sxvx6^`%m4>RD7DQw@}H?mL|K-LTM? zmCsz{!#duj)=?dIKs1sMx%oZ1;#c%Yc95nV&$ zubQNSSae?lw$1{#H-Fi@f0Q!(uiB3dx~5*h*nR)>RxPKMnq_vWB^17|#90w`NliZ+ z1FC~PT)8x{iMV$A-mQd?Ex(SF9Xsb>NeMX4oL=LObEefICbZ@VxIHa_0>=do20cxs zc{)8prvL1hm6M*1b8Ly+>L_fT#p&1Sm|77XOKtrn74AxZjgCFe_`@Fw`*&+QGG%-t zdV`720diXORdRCe`v6yvYgLOAZ?Z6wJFKpmapvUO_jD*$ZK)bV|7Q9cMk^=V#8UuN zTdKPdLeuc2i?H+fK6|#4M^c3oGZsmm-fjcPc+%fHNtDVqK0k`UHnKKs3mhZ%F+jYm zA#(|QB5rjvXKevFTAi+|&!f|3eHIz|A?l-&q0K>FfT0?2m^px9gQPV)OrG|!{yDgA zsmaJ(3Os+kySQmY9h}R;&ZoUTnhdg7oT@b>$149)R|mk@zSazB$*)o`+Ik>~mTY#P z9!Jo=a??(HV0;^Uz-z1NbJU`W4V2K20*9^$v)iLmEZfkJaizl2a(X=RIQ?YJ6pQkO zwc1S*C5iZi_zdUmByc-gC2{LznG9fBXHw{*z9K6U#S88z5v-K>lg~*W(%5h#ykt-+mhf+=zdbT=my#!TuI8{nc zm8xltIAg^^4_3?dYBMq8-6?+wqJ+HZwqr z>MbYVLd@#F`;lO}do4eMC?T#{5cAte5k-^jxCHE7jGJ4q`RImG`U}^(tK)~V9;H9c zomW78z;-!W3F=|DnHKq?+%g!+Ri}RA$&UD;KxIK@p6Ev}G zEuyb*2YCNYc)JYFZ-jd+*g3uQL|z;^WIGPal^cIc8eDCByfyOb4z{0qhi#@OsPEhZ zx7a#K2QfoB2HN$IwtW&fwh3xp$q&R*I6!HiHD)lsHlXW4jlPt7&HLh=48U!HGAmJ4>=8{lF@+Uus7m2uCe}s%EBppwI9dNHg(_eJLVa` z6gQtrv0M-4Bc^w#)-~k7rxws>6j^tcH+yrlb^UC8y)#}Nh<9#0YX80r5lg*y9|;`A z(l@dac^H$vD_P@Mabc(Fbs9$qXUCOVE99^uKNoRDVfaCXRcaUTO=W+#d=q{Mi(z?r z4nY{L0X)+j*h1=UcQDdyWE*MUE!kx7{r6~g8h@+~k$ZyQL7I2{h-!nT4;4)x4>^+` zt1^GW&zvH7G|l;ncFZ1mWnSrt`;-@P4c%(M3LI1TpAiLB_e^1-5Ko;C6Z`|?W$-Q+s(d~Ua_F5 zY^-*(=}Os?c!-kc`02!3iz%h(7l-m?I3E;n%C=L*ry>s`7`C0WdUI)}+O-p=1AD@5 zV5jc}b}q;l#(iQp-0>j|OfH@zsMQGNII#mCN}ntbs~*!=S)OQB9VDGRJyjs9U+J|% zxHCFH@itQmSeC?M`dqQBflgmA=^h~@v?L_De z;u*@(_F&OgdC`oil&>%Ol+we=g*S$?K)BZVC-p7gIDG~%>W{k9cY5Zob+D+mTIl!lP`cdR;;g_A^NV{#Z&E`;chXy+u{pl9`{4E&#=TIS&9A^&V zZ-|DH=UUrNuHZF3Fjj{~$xCskh^LlD_KhKY=ws#|r_XXg=70V|{|g)-8hILXhbeu^ zpm%y<2%mj#S@1o(;QONRozaMNpQkqQJlK+GA^p74ksBU$IBA&vhpou3Q+c@2r3U-F z5qEnIT*=Qf#x$p}9)rl(yIc4NGJa(3whKuVpLV*a@Db9{U$pr=a$wWUXp@}n*DFZ0 z8IdXj%h~>%gO%S9TF&-$4!#;b7r=71Kjz@ibVJM8e!qhc=!TZF{Xqx6p&MGx_9q?8 zi47TUIonqoxb4(ZUp>pq9H)okll~n_!4yRmm|{j}6)mH)<(aZe2X#2_viL!AJ(02Y zxLG*1Lg7gTM<;bL?v&MOjXRpZ)Hz+=|O?MwIyxzn0VJEAe?zc2j{ z{`105#l@cXZ*)eaQW`HD#`i$6{cPbdLXe{aG0lID07i9e@8V=cF>Z$vUT-RER9H^f zig;72V?XarhL^iCV>Ks-mX z`@L^8~nEm|MSRIz_0H(eZB+0Z~pV}cOdietC#Es|3`)Y z1pz;KvF{gl)6;jHzQ_StUe#H4gX;Ar2@x z53ct$LbkV)@oj>dSMm$-zh7odP<&rl(-pKi;iK;L9jABp8Gy2x{~hzo+l7Vl9v$K( zEWXy#%Z*qW?w2^}7>m49FeW{c{MeXe4$=kos0?NfhaHo_%mHk0-C{dRx(~WwLjPUz zT5HcruA1SeH!78r?*WUFZ}V$P5!bSzLS)J>Aje)MKUx^X3|B?VzsH+D2vv*L1*T|rIS(dU}a3C!zY;X4chf`}PaZQr-q5%Kk+ zn*?84TCmb6rQ*jTIh%E~QQy?N<|5XVuOS8Vf$ql}$Y0 zob8_E9zOd^*v6!=~jbsaqd$bL0g{HuT^s& zhx4!&$f3bJPi4ZKJ)4NCN8gX+QCq)}a_gPJ<(Gx~2kwcK2vO|lMT;LouJOpfjdqhF zOh{g}>6=ZiS&0o_(CfCjnXtmbZpgQg(&~W@c#@YhX4u9*PIEAoP=WeoM zTfp58!WZa#?uIfTT=;4F@Zb+~ELuw)EWsvO8xy|^+ZwLj_4rY$TkJXx<@R=JH6I|x zgp=P>{Ny(jbxJHFM-wY*b4HdhIcQESUOuyz@bBtr%vk#6iTBNqY$&J1?{j2Iek(dZ zr~};eDr5y~`OhG0;m9xTIGcF7k~7t@8=jr4Z(D+D&>57OtWKNq_R?4(XN*2Jm6VSozh4I9|g^^Q&>r1UZgIk z%|)_yFbntdvCksyxgzJ~$`tyZ_NG^hgw@?ty^{+LaGt8&Mj!S5xb=L}bhZ#Yjl{U0 zxgg-x`GE4w0=5?fd}}_SJS|`_3k>B)11&4Pem z%mw(G#slW9Ci^Kj=y(toDSEK@x@U326_lfl8>Xf zU@O~!TNN8~Tj$Od&nxDJ?XYM&ZOCrJ(=!w$U+)lEf)ia4lOw@O$xr!ZYk|7BnYiFr zswBS!nlI*kAi(4bLY31~@G?!nCQ-pe$xkCH)_caw2F}(lRut|-zZ!z>1I0D9$+r@@ z)ROdJeQxT(_AQ~tzYno*$tC_R_El<0X7O*aO=C?1J&1UnRn_#-%FZGDz(nTz9J@!K z|VqgI8)HJ}0SSA>RjwGQ3dS)LW;%{%$EJiS7OXEa6& zOuU}t=kf_SdaMGRW~1x&FMJW2Ei;-~>c*E_CxAcHWIWK5{F3-JlK%!;hTehV*i5pI zj4)V!A)`%OQO8Q9L!$nQg;Zm5oGL;QE6S6>V^v?Q3~11MBMq&ZZUoBKF&iHc`Omb> z4it-JQvQwn7#0J?OX+c1J1yHP_0n>}S^>+RODoA^aCoA+cSQVeQp%BH@Zv?EsCfpo zK%aS#jjClM3t^ejo}Zd!gfuu~wYKleeOgi8*`RxdX+^fwGrb;!{;_gea)rBBO-sEJ z0@bEPgYdCrM$%BdR76GiGYXh*QXxq1j13XttAAQU$$(2DR*&4dqaFjuhO>bl8$S7b z6C_RF%#Ws5&YRv^IRCybvkk6WUN{28jV^Dh&PYq*|)4PYy+cF1b-wr(0@wOz7tkFxRh zT#zL*M|RMV_`Bs07s1rtdn=*ll+Di+~i$3jGeW-)=%gM_hRDgbCxBh zdu>8fxr>j=VckRbeS3X358dptM| zv)NY`FGh_Zk*0Nhfz1u-9@a79&2M0gpWH{G%s)K~FW(eXY&~7E zG}U*nPAnRw(`*eHEfj{KS^N1Mz-G7EgvMT-{wYl~>j%@{>VDLwKiBzKIsLJYd)4%N zJ8o>8-`M$BK79@D3C^tu`1-3O))A|i%sfn9N1IoNb9GqOl!lUeV8R-5w99ntzSEDO zyf|iN{wYV`eHh$|`Q ztEJXfDhXz($-XC~{1)p~|4<%Fd`Nu(AD8MP6v@stWi!tG$qp|h3U2Q6lYqB_(reBQ z8oKlQvdIq>+i)ICf6ml4s-OoMwG-u*+c?yc_Q1yA$-BYrJJu#{#+jqen*PZ-AXO7^ zeZZzo@hv&lzxTCoiL3rC0bt@`{Dj)dVXI9XwOhDvq}nxn--I}L>ozN{TF*R@NMg-o zj^Fps9L}V=SSnZ26KDv7MU8zfK`=o3_?gR0`d9_(k;=>ig+4P}=%-PR7@v{+IMhG! zCChcE`EtqAA9(RA(okDiLof{S ze8Id>=HM2GO2Kn%}Zpj7((aA($w z%CicCK&D|r`{6wJ{6XSt)#l8d#0vw$hjEgXT}OmBEgTVw@GKt@CSIuc3lp4Z1I=X^ zC6_3zaCHf(%2deE!!4vuf)*d}UE6qrVCQjJ(8ZME7y^4UpOD-;-g?I+dtxC@`H|@s ze8cfiJq>4POzAB=5)Ar_O`#m_eLhft^qugp(U~glqKQh!v6FbzMeHe4e;4Bw9%_Xf zixQwXbex|Da&5fz*qqw&&*a(Fj)Iz3@(0G!@jJRxy4>c+=6H8PHV-UQW!4w`tdScc zR~B`Z1QKH+*DG~&3a-aIDi4<097L>BoJVeK?ZO;}d-j22h%T;gC^6Vi7g%XXmTnspk}Ao?Ue zoO!{Gy3oh;xl0P;Qw8;2>=hcxaLAX^JXA2!3~6Cc?P*bxkXFoWumiQUdM&MzDGb74 z9Ac#*tx92hy{C0_WP1Ir=d09PpJiodP40Gzk{l57us&*Cd3Z3$6^^OJg^=zCt%kba zA6oGJ;RW9xS@4ZgloryB|Ir2hAG7Z>qO%tlS_79dCK_e$0GcG8xyz%o_v8x`Ox7rr z&d$&HQL#BK-XA3&2g#H%%jAFLRIiE0i^Il&&FeITQu^1*NU>}(+U!CibOt0j`mGklKC?x3C5fnO(V^^c)TZQHeDs{DVhaSnvCXx2jLy>a}`5 zD!ey__fy0Bnc+Pb-Y*RAE5rNx@cu}6zcsu+6W%`zZ;XE}ov-um32yXN1;6XWhIa4C zksa5ZjEFFiZO2cRyZd6PBlmH)P8Lj7x?86SCac_yq_HSj;clG_n2ftyrzR$2?$&m< zWVO3>0%EeayQOhR?&I!Rx!3+5+TH{{uBv<=zqxmEXG@w+CY?!>wv(1Fw*xJuY?Gu* z3KV3kf?HEIK|v|Vg_#z$X-bhr)Ph1;MXCq|MFjx?5f@w#6@;=1NI~2HaY5V{%Kv%Z z_uQF#XOcAf`~KU{rl* ziRNwSasq^uSzH2}LtNgg0KypOdP@mS*rMHmC1OoXx@orX0Nbpv*qr$!K&wfFzHZzb zNI5tca6LTurZ1H0O>mVTp~I%*m31guOCsh!f#m)&EW^YSxK5A>a*(%Kfq6H_(6QU9vt|0 zcer1qHar!lDf~ZEqeD%L+(6wO7U1r1YHrk{37-ME@fS_PvH!1h&cJ{jgdJ;dyC18m zVt{wNLxF57{Y8ZTuog~aTj`g*r)(FyvM$C`uc%f-is5@)q`+=SZ_7pyxhB$7tLwjl zoMh8IPG|lWZo6_3x3w)rO{87SM|i$(Y~5jjHDO7hJ9Kz|Gi4{gX%(7Be*c8>82o++ zU-0{3d;&&qgS+ww{`h~FlvO^z1sQ|yLA}i*54XSJV{fajEj5tEmcEA3p>iD+&g1AH52YFV-2ZEuj}7BHF2JWW z?_I-JNAu|v<1;Xxk4!V84b9wNdl1Uce_{vSNS(EeLG$#D)M3k0&xxJBk;8U*4qYFj ztDmlQbRACD5M9U9wH_|DwPMb;fgXI%;+OLWaUh?|b&i1sEK6a~1FiDONM6BEP6c9E zQgY9<YhFZ-&s4siy z97J<&`8bMFo7+91-9zLX=XOuRKTJ@et!}>Mt(8o}<^LGi_A!8iWy6RZzL4%o!yo6T zLoPU{J~lz_GTK+@AawPiEeu{3*F5;cBFK4QRBj1P3e=Xb!k97J9@>Ni>G+0^;^R+; zK%Hcc+@FW4^FM+VvvH4we#;-Ph82UrqEk3ZQ91Sy>GH26UZ-%3hHAU%vpf5#b=i|~ z*f?Lr-oB*RzF-v2RL(&rIIZbP#Cd%01L>9J9^`H8>{ zQ3k!H6$rqS7HcaV_=hVokwKS_c|od=s|+zY&xlr1nD6a|S*gr#V&&(X%$xu*W$0x( zL7?Yi6kF7FNADcq#9^Xs_tH>l`+tKx>E*x|E8iFZ+Wy}Wx{2DL?f)Zi>TL;{I+`Eb zHRai{Q{+76tZfgrg6;!Q9UECO>~B}`%l;+~z$5HaL6|rY7PLt`Fo8CC5u({9p9VK; zZSooTg8bMfe+K_BK@k|F$KEld|Aa~ZY$W~my7bR6JwZe1F^53WB>iP3{WxR_L6IJ9;%d6sPQ(#v6UzkW6$a-x>V%*n zny|hCo?L0tkAtTK4W-{-(qC@UkAtTKl`_@aur3!liL!p05G<=WP*#Lp6NHIF!?pxr z;*c=!WFn!gHA97tE2ju*b)Twk>JmLj!+#uN2x4RJAwMu4e^$QD-scF-K8!J`!}}tA ze2Zf3SD@?I{`X)NN7^rGF#1`-S`2&#kSEn)%kHJlWF$&foD?IFjT9m25|CRttUShW z^+&w&1%r!uV(c7ud4xV5>K%c;+YQb`YDD4i$1M`dxfW;dxaSk?;2U5mr}>Vz8571e zPh$qqVy|atBJTYY8ZEYD@A*8kkaixVJ+Lkyy2u`92_eH|7-G~D;BJ48^JKxDIjl=JBEfM|Y)oGS_W(2?j zA+Vo~z~)DQ6$pX7HUc|&1XzI(*v~~^J4b*O2!XvW0y`270wJ(lcM2;I0((OQb|iWQ zLSV0tz>Y+(KnU!O5!jLF6$pX-d<1qRyaK^@Z-%}ASXrdCD<`3y4%4rpB0Gj|BCaEC zCwR~LZMczpSOT@)zsz{H1#uuO7y}QIwt5SqIfnisG6wy!ZVdVr#~^|t&mjGqB>h)R z`d>%V|E4bei%d_@Q2K)<{jDbbOF{a{T(fw&F8yzro}i)hhe-O{O!`-X^m(TLU0wR$ zGd)2==?|6kUp49f5Tute?2mQnUuAlNhSDD<>2Ejb{}f68T3z}-Gd)2==?|CmcbN2l ziKPE)UHZQ~m#J^L6t0Ll$1nr!{O~=50?eH?m<^9IjBS8{KtXwM7oD7! z4#2+xw8%Sw9K3UjTMz^;a$J`K6ghd&tNi&v*i1!a7@O%Zks!~n5f|lj&^F#IWxE@} zY+K_P3keFs@b)-el7e&+AB_F-&m4Kp4O2$og;sWde75R`ofba!M|>!9@L`X`hk^|s z_9=VABls(Q!QOCq3!D_1ws1(eV|(Ea#4>eNerLu9+nNMQ-h#4uzeiBYmNPFnLG&m1 zINX@ApjpP#BM6rzTySWDCPdf&JL(d*f&GCyH{kDFgfdnMEO|AK$vlg|2=QErb~jvgv?{48U? ziS*9;-!kssp}0wmdsyOr&ba@C;_{69w#5B{aj%EsGK~9<#QlbG)XIYVni=;!iTgF< zc7)>MjJr?be#JOy$U(X!;~tQ>Uowu`e-M{u-2D>w0^_LJ2XU>8`;o-G#JD#?ag!PM z6N!6~acKS3bh8-uxWxU8acs>7=MV#i*(d~bgN&N0mFx~#65>8H-nb_RE%@q?OY87#s`!&M?_f9%5?kVe#)M{{CP zbYK53;)Hz3S~mj4+t{bdR~?6WFdrw2mA`Nc?&;EZ%Gz<+QoG&mw8wBF=U+%?`(MZ3 zUfm5qr+*#B+^$8sLcqUHnZB!hGSoPk z#$#XY(cJyW6|xThdf?@8!~~8v!KVLjz^c7LbX*#QA#`fx(|}`bXWK6V1GdMot@L8O z4%a08Q`4~AHz5DFN6XEtYyNKwYx^%FNB>5$0k;JGkA==8P)?PVdq5|GJqvW}5Z6nK zhdLeq`U|H ze-|KdQ7eO66SzT>3XA6E2v{vQE;8b3KuJ-d9&`2+nw_AuncdfzT|(e?Ok%9Pp1O+m zwWB1zy8)7g-pFtsZ$eY1j-y#(11#KiS)znYRH5o~_D?lS!HPDL^1oiq5=CUJJwzp- z7e-8!?wiaFmzlChX5%;)N3{YwxA~DrmJmec0zv%jXsYGS8R7)UO`x;-yjN3GAG14j&Rm~A2U}TRFVp{ zMUj@Lak#ZpPIO^wXwrWd`ry!^)D&WA(NVM=wuwy=_kx&{ujpHBUv1bx4uxn|II!ggM!e2zNm4{9@q4WjO#FQ*#)btOQC116xnbwB@+cxXjp&H+&zHTsT|M0qh9L zWk1BS1vA{VV9qjv7R;fpE+fbBnaJbh0~razW@fZMGeRrUu2~ZVnh_tW!=-N`3D7*^ z*e%TIh-Q?ilLc(9?P#v@x*df9wOQa9M6&N4n4<}HTOY|o4sT|W(<^(w$2h@ z=kgy1a=FktUX=NQty6{V9ROFE7n6;(t7Pm|`K z>3B)csUOpi!^Ta}Q2G-jJ*S6E&lzGZ|JJ(vCoq44hSI-V(sK&Q^qfW3(zn&6pUCtC z4W-9zb*K|g-BnIgBxor8YDv#&EAty zFVm01E=W+MN891-IC!_BYV%_tqN_3lR|}$kXt^N%aoFYv3IwapVhi3eX%2=1SuNfu zS@5lFXp1SkG6@aY>?A3R75O0hh41V4H2Igo1)J({$z_m^s|z1{&%uM7Fe1@E~Fx!o~ULg|CJPST)Y zlWR_<@N!^9$}ZrBb#FTm7Zvm5ftl6RJ96*DE1Z4`oJ-qM$;pPm!R`R+)Ngg4RUR_Bd0;W^Vb*DKf5o{ugu}wW$;);#8fX zvXD$f>0td}t*moZthsa5gjnY)FE7%I`=8E6_NPl*V%=SIGPacog9lG_Pu=BHSMlH7 zOIPi8j8ObKS+3F8A+?0lb9;#CG*I2SxVJxRW7ZJs&wxu^!g?!}79Unbnv(9^HEi3Y z6ZVaqcc3&s)Vph8v#523(AR{T6wM}wieRGHO3m=1lkDgeVV zzI$KgLC&J27n%wn#W?@giJHaX(^=pEBRa_~o9O7lFGXbUp&iDR(&)bZ+c9&wMF^_+wZQ&Xw%2pUQ7(BmUUl zQRIQ`y;DE$z-PDX^F=$C^A3Vrdvne^7Vg>hP^6jG`o`wM?gO0h+ujL)L+bJaoV;LJ z1arp_n4C<|4LmntPQMO~y}a_g0Mfe|W!%)002;YBTR@CnKgoI!5`2x6n^gk5{Ghq> zgJX@Fk2?!hw3#Pz3$2TJ3IT$ne-HWM;^4ocdKlBc4US!Z0_TkW|7h5p{y(eZXnF2w z*RNuAl`oC^M`fr7!bSs1i;&<=APJ@r`zmUN^gNWdhf@CN3@1yZ2 z^}m(z>ooqfer}-xV0mykdWuEgI~j#9EoCKKmw+l=nVN=cbv|g^g(N(u1RmU`An(Ew zs?Y)t?pu%~g;scYcYwqk4bQ&tpkN6Gl!_)M;EnfIaG2IEuZRIkM1RlgZ$K+Zl)eK> z5I&dTcfg&?ChbmTZ|@cGM_O6o=z(+U!tyIO7uF8EU$DTQp~GxvFw92s?VBM`niq|$ zN<%82P0FBUyh#;0-T-KBwUe1t0@m*%;V~^T1Pc>g-=R2)sxhe&g)A8ml)LJ8NSt?cDC&od(gv3w-0Tc| z4SqKEcw#^%-WrF~FoTtDaDJHThQ7TWF1(wNE3lFZop2L_eg@Ds-jBy8m-JiksUZlJ zTx9e4IBmOxtqt}RiVBb#vc?gEul-uK= zCwr5r>2>i>H~!#C8dK?ATIs5(m1lzAp2!)R?~SZ!wvI>3JTok7NSM1BXXg%FOfehJ z^?#M0!mfkMDP?HDevkRqyXhb6$8@9pMoU*>&x{vV_EQav7mgoX&Ly3Bqx|A{aAX$Z zrC}|z=qct`g`O%EXS4-g=6H{ zQlc=opJPD+V*=QS^B?7N$z=`(iF#3qc#hAPsGh9ao~YMGeHPVq$0X{ZtRIelmjdYr zq;5h33%5ZP<}N-EFnF z2L4ApyD#QSdK{(vlKT5U%}9kjreAAdxPK`Fe~dpmU}#g6Q`^{!&mp7ltz>4QWthV? z2E2%hU)qO}ks!O!DjEVt(Yo*nqlC8w;lbz|P3OIUVYMOSZ{id*D5Rt)-AcDehSCji z!W@lC)_Zs(s7e7B(I*p*J4c4qnzUxX3esIJ(s@4tp7B85(xd5JF{H`{?Gw>~4 zjz6rMA^Gm!|2Fv!%R}&`55W`RIQNPfj?cTGp|lmL17&QKtzdJ&Hp7jB2&>#!)KEL6 zxd3J%mZbX{Lvx&lLUl;>;l)r)8&Vob<_iMUBCz z3ZpWHdTF7rUrF6QK2jr%&+bZi&!Q#UahZSG-rG@hDA8r~m;i`C?*19VszDGuM+xS7`$^ley_3xMWc}uiYH=*lgsKzjV@m=G zqzD=By#SUjnJAoSf{tU*UQAU!|i4rosk&wc{CePK(lP%r$ z-eppo*_Zb|^+)?pJ{TsV!JQ)q7pkL8p=A_^>bPSB=Z9af3eFGE8Of*g9t4dpI1iNA zx6oS79^)3~8SyyZOe{?iYwT?pe2`3JK{Q`i_?D>0MH;ef zJvRyjwZMF;#PKgmbZHrb4EOh@TZb)nvjj#?HdmE3z0_s$>AK|Tl|bzFz5`>LW7gHG zwhNwVV*eVZOex>XR{b9Eu=kVfb5-e1-bUy6>3H7&@J33*+=ChPqjvd+L?&9dR!*Rs z8@s1m+Y}dxE}J@|RPTB*B$?cO5G2<5PRU0manx43Z`+U+UEM*_)Ua+Ut1f_Qa>rOR=aFebYPrSFGMgz;TW{+J3WLBYx{9>F#XWRmLHgo zmYI+i1BwRap~;%@Jsqr)q+x(0S2hlCt86@4ny7V+}I+82v(qJ8Z*_KR;H=~Ai`+DHRR*&+hg3@Ku z%D>hy|3Zbuevk=0e?%(Lf!f==Z)2X{OQD=;3rJOlRZ%w38)DcraNW)l@TxHdRLRw3dQwMAs zN7Krf%X5y0lu+hu88L%N_R!PP18I`UObXRiE>u^!psv`+!__}2R5?ifBBHgX^WH9K zH(JyAO}vi-jj~fx*BBa3jjGjofsL!`gC!%tH*wlwO>HW@y=lrUc&Y6!zRWi6!=1g( zcEpW+8s1DcRo>8nQIu~3?Tb!x7UgJE0O!>{E(>pV`BJjejA&sQUzFu8Y-HJ=REK3S ztRr!RVO-ZK(a)9L1RaW`Z?8(Cnd1h z|2}+6GbMRw{=?aM)hvWaU0{rqbJXDi_d5Q9$s_zKJ=_rF_T9rUVd1~1OgqBaZT3zCXdh)uBpBQ7WUWeVJFay< z06q-dcrg?fw}tTGnnE?PeF7f-E;c{9UFe}7k?-98cjGIMjpLnVv97tWu5l>}{{B28 zX;pJ!NKD9gc;Lbo%L;FsHS?T^AzNw5oPnIJ(6TT_MNT?`vO z#EFL}%?hUzDZqU`1c$soP=zyj=SIn!>y!s0Oa8Mr3{{iS@*ButD*ff(AcM*cqK!=3 zh0vDu>Kh_Kg96RJC@2u(v~I(=*Nu*QJyO==J}ZLzyJO>CKRWJ-pJ>4Sk0{-T0YW9M zq5EI9_Y%!Q-YxhmZ@lZ$v0Rs_PCo{P!I+q33NI#Rzg-p=Qkd~<&{kq@Sv#HmAZTh9 zx^}Tom10{K{RfMD7t%$zb{2c68Scsz7@mh2s&U){m0;S{PHvIZ$p)59u6Du}3W?(W zt|Vb@;N4%G^6~C30e&ic7i3{fLYg?!oQCxhI{HO0Im2}0LW)+#0Vc&S_mYVN zsJVv1QHcL+@6FgrX|}$c@k!7HbzRQ!vM9K^Y*@0)OJcjwqsTjj>VOco8N7SQ1pX|H znVfWf4x=v++a6wi4eEjbrY;0_wt-z`!`gBkp#?`_NNy!8TC42N&T#lqCY&;q(uV)+ z$&*7M<&U5Q{^wBwMdgIt1Iqz}t);xlajPVmS;+!}mg@}U$$ths*4r+gP@>WS z3=t%Hsz;cn%|{SLi_Xl(f-3~ME1lSXAg${JJT%Eo)r!}<3x?m}G*FQzJTK1$)N?tm zXtm!&mV1jN0UPwHl$%>}m=MZl*teKYZKZ`&1y84>yf<+2McQbo2a$Nq*Sif!u#7Ja zZ-~iqaeofl2v!||Zo#w6n{5q!kT7@y{Ohn1@qJPC_ZUC+6Ej{bABo7rB)tpR$50Db0t7gi?<&f7Ng{F|9sy!_iwUQkheyL# z*xu)aBOz)o$Mz|Kb;LxiBS?S=w<}4z5Sr80ZlIa}Z109@V?py_hlFThZJ0V*-vYOH zH!lPvo%`8A$yR$evKYWo3p=eEwxkNDK_UO=nT%^}GlT-rFwHQ__PD9v_SOI*=gq{x zGR+j%^s9*$l_~yf!?`4gTU{ac`BqOcK!d2?QWA%dxCls7PxjhIS1DY4~T>7>P=L2O6KOexjMjyb54CK(Gtd;B9PT~zuLQZa`2DNstcMNq$Xh=J{*Q$C7v|Uo#O;)0 z${<;%2Fq?hW0HLyaLPaD{z z0q)rKl$L#R9}VGdYcf`XA~;}1;7|qc1gpwe%IdkGng4Ke3oK44IV@%y`BCjra+PXT zTpHPvwD#1btUok2&9Z#==vqPf+d-VR4ctxPZLOxP4k6Y_+EG+5EbJniB8S=hMON#( zgC7GgoZRZA-K4#cT)kMvZXKHztaesDqT>@mWLdIA&C)qBg@8peK~d0o+Iw72gfKu< z7AC9{;Ql!C0Pg)p#;wiP@qU1@fEyIGzsK_{XQc;W-Es=4)yJ-U} zed)_O;F|F+xF=>4>v(833LCm(21MDoV}_x)W9HwZ-7#}vU0S(gW+!Q(OHQW{xfg0Y z$F9Kt-8w(7@d?M@Zu|@k(tNuP<~zoJq&+kPc{u*AXsghTXTd{U+_SJZz84AI1o3y1 z)~xXUJb2`UL`R9*xe1+*P(dN|u)dH#QTpG&<&4DJy?D8TKX9%S z+KoLl6JgiW=T>$HI>^&10$H;O`TYd}6&vOtRRH=eq)l2B^)7M<}I4RJa0%`GVLb(Iu9y7}@W0>^mPSeefmM|VcrcWjIO~uNW+-aAT z+hUUjSy8x=#q(oTc3}74Lqup8g10dJHel}Cmw_q2nYnzq<`!~tORi=}!o=r%yzZ)H zDSfyG+RK$d17ebi9aWJ^h~d#!!Rq|rlAbWqNK`EY;LDOEu6M!RN;fBpLJWP%Qp1MX zWCLvvI8{umBuXh<#i4d>Yvp^6$Gs}MT#UIl)n$_@o8G1u(RjsxTj}9lP-1I^rr)&u z%}vCJI{|OCe!r!OH30W_ntrv_mhdbtI;FYilk6KQSMKnWKIW8mMX*yI406MLB*FE4 zI0_gzYd86&?RbY?@1>9mRC#hCG>^Ne(i&N+cST+tl1;)A%+4wYlOrqer|4knCh(V- z^C7h>7a%Ywq3lXOs&SZ7f_)rw?Oo`++?K0fWvW~LIB2iD6P)7RSd7NZoLwCW08cE? zvy-CpTmpI=_E_wc^S%jkIVV|!9OQ08$Da(UDi~B4yaXTbw@^2vr551pO(8lQZC2<=g0q-feJ&z%VEf<|tS=SkL?6 zcNTu1!SC$|dj;Ru@ZNIeiq7E_cXW?8qlkyl_IE9hDQuzg4k8WaU09O4-&B%rGB%0HW5ch zDZ_zLFeVgZLNO+7ytDNXF(v|1A4e78E(np(36;=eV@xT=lwwTVSZRHL7*hd8+=-9j zK{2MrgRw<1wkXC{JJag@m>63EjJWmK%CsoPmhoVmpcp48#x^_C=KY8mCj=OuWBpA~ zj1vsTQ7U_);+m+qGB%c3?6=%ER%-Wf( z_e0`rkKk-qob6-btmeZmt6ie5dt14|Zn0KX6~;%>0hJyBExp{(ZH`8_{vGRVIbidbCrFEz96Z z$9<0JodeXJ;{Kg*%Mcm&se0sg*m~6(HiOC#y}_f@VmIj6;XaK*i7eR2P>J$(Kp^yf z0WBi#e;o+=dH@=dP~Lke$Ue&W%2JGK{yhLvP=(6*?*fE|__Qty&FB<65ZP|jXr6d5g8UN?)#@QEu+kYvN$P|2RDmW-hi z`0?S!VI9yes#l(uHm-r*+6cWKNGN|{K+2c^tk^fB=fGtMcEOpDVTRpww^_*YZ~Zf zKS()#6DlZ;TbFn>Q16>bJgy^Qpxl(iJA{^y54bgn5axoyIYNiC*|a^~P^8K9@x^Ia zkW%%{@!vpW&c<*IRDvIQCa(ymLSf7j7jd52iY7)w) zgIAlL07C<>_YHW8)|u7#X(L5LkC|m12Mk+6yn;o$0h8&q_dlk36!qo9!)c9Nlq|?fi5ruZn#&%S1{J1h8gp^jU5^Dxj!!2pdf~*j zv^zrZ{3T|HI3b5&T;{cM?U!BNTt$lTTD=2Y)RG@+-;8VDG*56rf5zTe+_B!YpP5@_ z7tFOd$Nx;2_g!Q19&G=oVLQ#_y&FK}6xD28HT9Qi}zNL zu9x$NMkI2Q&MqH(S&e_ST*5g14ji~@-ir{#zz{);l%S_V$Z8N_Wd9BmR0CnD3_<%` zUL&Xm5XSLW;AlnX6@p$w;apunx`0kuIO6lIgvvJKnldgb7%whu60dhK#LJ*}2>#-B zvG^`XDF3`e5rQoha;X<;6RKx!wRaf7k|hd~On{irv=VXUa7215n5+s&iKdU?$P3G- zn#|LRt9~pY(&FT7{bTbPJ*~K<4vg^&Lvs3ps;{cmdL_&WfD2gkOOpV#UxHf{(Kw-?y zVuD?EE29NAU~joHXyapIXY%_Qr?NAF{2OtgvJBX^&WcRUM0n zr?E${KkQ@M&Qac5P@m2!Z2#bWBJA0wSN~rqgSz4duyVVAenXy!eJ9l80}-rkPH7g{vS~{Vot&% zvvBHRwDLKhGF7Mmn_h=4GA4gRW2#=YU~GVn#dVtNMXu2}BX0u)R}+d2GT0Nwbr8aC zt%o(n9kn$EHZ6t4f*|B&2yYdZW=n;|dw^8$J7fnt+R`-Jp9DYO352xh{s-zalb>bA1}c$k16~d?Th&PY<~%6T8Ma2 zLRNHOaqKJ%8CW@j?eo_Rya=ZauXD`pvzYtEpmSH=2?D)lYTthw3C1PNU=-%LFrE$b zLz?}+fTFSr&>I;lQC^(56ZivOIbO1wlfFUqicm|p4skAVs+5pRy)G*S?9gZ)#3j-F+!U z@!m@p9+=o9a4kK(Z$ivAy5zm8ZT|!cad}6fBlnU$p;&0};aJLh#kG|f0=(P7BFLcK z5L?b%ZTcSH#3U&`)-h7s=+bPcR#e^x^4G=v-$DCQs)$+rin&Gu50_&BQ%u_mp@qYB zo1`IGOnA`0QY{*nP>K3cgeW5N2X#D=y!@0c9j~KkuZ<(AXwmi>I*WGYWRSEeNjKjV z-H}Vd=}*A4+4$4+e_H(LoAW? zpY%&{0El}xd+_}t>(1MO){1SpvM;pg`s$U>ygz9h+F(2S0IXPG99dh#-eH@BQKX^o z?-Ar74&X)@UQX0}#Uc6TQRrA%m-j?%WSleU4y$l;`JN}?GizTD78cgEG^6vwK z3tJ<+tsU7|BEQo0PlX4s12FpQ6$L`VMe*$-CJmgzJaBYXOmzIG(%d)U9_5 z5Xc`b)Fo;N$u-ZQk!4*d&3SJKVy8V08^+bB1$k==6QuVeL)kQ+T=N&qS76RKjU*)E z?a59}k<29IeJ(6x5g1gqB$Vu>3$W4^_cj18JAi334jK{ULfnFB!}>D$G{jm{QLqf{ z+$`ltsO^6S#lt905L{;AF{=p{z z1DYv^C@a3AFfSRH*GGc6RbgH=F!qcPp3};H(2H%4-B;9TE$wOL+eeM#*jPaRx3Qei zQ^*i=y|0&L2jrSh8~Te`^BFsz(P`+~;G_PyC$!e_ybfegIbFiX!h6ZsmH0W(Je&L+ z8_w}>VC4d?54+IC#O6(vkZ$aUT!ir3!2^*+VvkFyF^-p&F2g8l$75oVQJ7hWAmX6|o8a-p8Wv``Z#^|GM2xlz+ za3aLB+zvll66uPvd@J@CmhlTcK@y(H)LAV{`8l>by~R0RZTgOgp+u8tD2Q!~f3;+NUBcLu84E3?iu zRE7Twm{Xa4mykmTcQ)p~xGw)aK5d3A+Z#E5tcf+r1}~F8{U+D7C{mMbG1s^?^eZWq zdfI-$sXOQqoh^_JTzk7q>NN!yhi#m&<*+S0!yK7Biwn>4Q~n{sFiG`pT;L{;H%tA62hE<^1*DA5l%_n3Mlxa z^d_x);r@Dr-plQA&^vm243mKhBetNz)>a#-0&QiaAyFG?tufR!(#l4dyc*8xhlLbnf8vQ7X!nB@AT3fLTGty8%EAx!fdM#-c&?v1a17v$31Fjs2 zR-74$@O9{aqV)r$H8ujR%ri>s2dkg~t=j*=>Ux=8-~aCzl{S@=%E$WtPnjMO=UZ6+ z5!v(Yo#*|h|0(Ye)#tsA0g=4Xzjs#dd0R$nKVy}fbrLD}P($9|Y0R7LAv}(b-X8v| zyjknfa(}lm@A~>a<$o&o`ucK1TGr+Ly`AU1^?%BHxIXU

    - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "Whitespace", - Justification = "System.Xml also uses 'Whitespace'")] + //[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "Whitespace", + // Justification = "System.Xml also uses 'Whitespace'")] public bool ContainsOnlyWhitespace { get { return ((InternalText)internalObject).ContainsOnlyWhitespace; } } diff --git a/RefactoringEssentials/Xml/Log.cs b/RefactoringEssentials/Xml/Log.cs index dd272330..5f930282 100644 --- a/RefactoringEssentials/Xml/Log.cs +++ b/RefactoringEssentials/Xml/Log.cs @@ -53,7 +53,7 @@ internal static void WriteLine(string text, params object[] pars) /// Exception used for internal errors in XML parser. /// This exception indicates a bug in NRefactory. /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1064:ExceptionsShouldBePublic", Justification = "This exception is not public because it is not supposed to be caught by user code - it indicates a bug in AvalonEdit.")] + //[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1064:ExceptionsShouldBePublic", Justification = "This exception is not public because it is not supposed to be caught by user code - it indicates a bug in AvalonEdit.")] class InternalException : Exception { /// diff --git a/Tests.2017/Tests.csproj b/Tests.2017/Tests.csproj index 95959719..8d6188bc 100644 --- a/Tests.2017/Tests.csproj +++ b/Tests.2017/Tests.csproj @@ -7,7 +7,7 @@ {21DBA1CE-AF55-4159-B04B-B8C621BE8921} Library RefactoringEssentials.Tests - v4.5.2 + v4.6.1 ..\ true @@ -54,43 +54,96 @@ - - ..\packages\Microsoft.CodeAnalysis.Common.1.2.1\lib\net45\Microsoft.CodeAnalysis.dll + + ..\packages\Microsoft.CodeAnalysis.Common.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.1\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.1\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.VisualBasic.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.2.0.0-rc\lib\net46\Microsoft.CodeAnalysis.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.2.0.0-rc\lib\net46\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True - - ..\packages\System.Collections.Immutable.1.1.37\lib\dotnet\System.Collections.Immutable.dll + + ..\packages\System.AppContext.4.1.0\lib\net46\System.AppContext.dll + True + + + ..\packages\System.Collections.Immutable.1.2.0\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + True + + + ..\packages\System.Console.4.0.0\lib\net46\System.Console.dll True - - ..\packages\System.Reflection.Metadata.1.2.0\lib\portable-net45+win8\System.Reflection.Metadata.dll + + ..\packages\System.Diagnostics.FileVersionInfo.4.0.0\lib\net46\System.Diagnostics.FileVersionInfo.dll + True + + + ..\packages\System.Diagnostics.StackTrace.4.0.1\lib\net46\System.Diagnostics.StackTrace.dll + True + + + ..\packages\System.IO.Compression.4.1.0\lib\net46\System.IO.Compression.dll + True + + + ..\packages\System.IO.FileSystem.4.0.1\lib\net46\System.IO.FileSystem.dll + True + + + ..\packages\System.IO.FileSystem.Primitives.4.0.1\lib\net46\System.IO.FileSystem.Primitives.dll + True + + + + ..\packages\System.Reflection.Metadata.1.4.1-beta-24430-01\lib\portable-net45+win8\System.Reflection.Metadata.dll + True + + + ..\packages\System.Security.Cryptography.Algorithms.4.2.0\lib\net461\System.Security.Cryptography.Algorithms.dll + True + + + ..\packages\System.Security.Cryptography.Encoding.4.0.0\lib\net46\System.Security.Cryptography.Encoding.dll + True + + + ..\packages\System.Security.Cryptography.Primitives.4.0.0\lib\net46\System.Security.Cryptography.Primitives.dll + True + + + ..\packages\System.Security.Cryptography.X509Certificates.4.1.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + True + + + ..\packages\System.Text.Encoding.CodePages.4.0.1\lib\net46\System.Text.Encoding.CodePages.dll + True + + + ..\packages\System.Threading.Thread.4.0.0\lib\net46\System.Threading.Thread.dll True @@ -114,6 +167,18 @@ ..\packages\NUnit.3.0.1\lib\net45\nunit.framework.dll + + ..\packages\System.Xml.XmlDocument.4.0.1\lib\net46\System.Xml.XmlDocument.dll + True + + + ..\packages\System.Xml.XPath.4.0.1\lib\net46\System.Xml.XPath.dll + True + + + ..\packages\System.Xml.XPath.XDocument.4.0.1\lib\net46\System.Xml.XPath.XDocument.dll + True + @@ -1077,20 +1142,10 @@ - - - {C465A5DC-AD28-49A2-89C0-F81838814A7E} - RefactoringEssentials - - - - - - Properties\AssemblyInfoBase.tt @@ -1098,6 +1153,16 @@ AssemblyInfoBase.cs + + + + + + + {18236d33-b3e1-45dc-99e7-230633a228b6} + RefactoringEssentials + + diff --git a/Tests.2017/app.config b/Tests.2017/app.config index 5e1c3598..3389d7b9 100644 --- a/Tests.2017/app.config +++ b/Tests.2017/app.config @@ -1,35 +1,43 @@ - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + - + diff --git a/Tests.2017/packages.config b/Tests.2017/packages.config index 95e2118e..f03b6a17 100644 --- a/Tests.2017/packages.config +++ b/Tests.2017/packages.config @@ -1,30 +1,60 @@  - - - - - - - + + + + + + + - - - - + + + + + + + + + + + + - - + + + + + + + + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Vsix.2017/Vsix.csproj b/Vsix.2017/Vsix.csproj index 0527d0dc..2cecd740 100644 --- a/Vsix.2017/Vsix.csproj +++ b/Vsix.2017/Vsix.csproj @@ -35,6 +35,7 @@ false false true + false @@ -54,7 +55,7 @@ Properties RefactoringEssentials.VsExtension RefactoringEssentials.VsExtension.2017 - v4.5 + v4.6.1 true true true @@ -117,14 +118,6 @@ source.extension.tt - - - {c465a5dc-ad28-49a2-89c0-f81838814a7e} - RefactoringEssentials - DebugSymbolsProjectOutputGroup - DebugSymbolsProjectOutputGroup - - @@ -305,6 +298,14 @@ Designer + + + {18236d33-b3e1-45dc-99e7-230633a228b6} + RefactoringEssentials + DebugSymbolsProjectOutputGroup + DebugSymbolsProjectOutputGroup + + diff --git a/Vsix.2017/app.config b/Vsix.2017/app.config index 63bf6b7b..808ac6e0 100644 --- a/Vsix.2017/app.config +++ b/Vsix.2017/app.config @@ -1,19 +1,19 @@ - + - - + + - - + + - - + + - \ No newline at end of file + From ebed7336d8a093cd1e29a63f4477d31af1208197 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sun, 27 Nov 2016 00:17:31 +0100 Subject: [PATCH 040/236] Explicitly set verbosity for VS 2017 build. --- BuildTools/appveyor.2017.tt | 2 ++ BuildTools/appveyor.2017.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/BuildTools/appveyor.2017.tt b/BuildTools/appveyor.2017.tt index 3dbf93d7..f9aa5790 100644 --- a/BuildTools/appveyor.2017.tt +++ b/BuildTools/appveyor.2017.tt @@ -20,6 +20,7 @@ build: project: RefactoringEssentials.2017.sln + verbosity: normal after_test: - cmd: nuget pack bin\Release\RefactoringEssentials.nuspec -NoPackageAnalysis -BasePath bin\Release -OutputDirectory bin\Release @@ -51,6 +52,7 @@ build: project: RefactoringEssentials.2017.sln + verbosity: normal after_test: - ps: Vsix-PushArtifacts | Vsix-PublishToGallery diff --git a/BuildTools/appveyor.2017.yml b/BuildTools/appveyor.2017.yml index 24e4e896..ee4afee1 100644 --- a/BuildTools/appveyor.2017.yml +++ b/BuildTools/appveyor.2017.yml @@ -17,6 +17,7 @@ build: project: RefactoringEssentials.2017.sln + verbosity: normal after_test: - cmd: nuget pack bin\Release\RefactoringEssentials.nuspec -NoPackageAnalysis -BasePath bin\Release -OutputDirectory bin\Release @@ -48,6 +49,7 @@ build: project: RefactoringEssentials.2017.sln + verbosity: normal after_test: - ps: Vsix-PushArtifacts | Vsix-PublishToGallery From 8719c1f543f34e93157467400a2856bb78cf77a7 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sun, 27 Nov 2016 00:18:31 +0100 Subject: [PATCH 041/236] Fixed indentation in .yml --- BuildTools/appveyor.2017.tt | 2 +- BuildTools/appveyor.2017.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BuildTools/appveyor.2017.tt b/BuildTools/appveyor.2017.tt index f9aa5790..0c59d04e 100644 --- a/BuildTools/appveyor.2017.tt +++ b/BuildTools/appveyor.2017.tt @@ -20,7 +20,7 @@ build: project: RefactoringEssentials.2017.sln - verbosity: normal + verbosity: normal after_test: - cmd: nuget pack bin\Release\RefactoringEssentials.nuspec -NoPackageAnalysis -BasePath bin\Release -OutputDirectory bin\Release diff --git a/BuildTools/appveyor.2017.yml b/BuildTools/appveyor.2017.yml index ee4afee1..032235e3 100644 --- a/BuildTools/appveyor.2017.yml +++ b/BuildTools/appveyor.2017.yml @@ -17,7 +17,7 @@ build: project: RefactoringEssentials.2017.sln - verbosity: normal + verbosity: normal after_test: - cmd: nuget pack bin\Release\RefactoringEssentials.nuspec -NoPackageAnalysis -BasePath bin\Release -OutputDirectory bin\Release From 544afaefc2389d6943098f1e8ca7ef9da2b40e55 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sun, 27 Nov 2016 00:19:52 +0100 Subject: [PATCH 042/236] Another tab that made his way into .yml file. --- BuildTools/appveyor.2017.tt | 2 +- BuildTools/appveyor.2017.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BuildTools/appveyor.2017.tt b/BuildTools/appveyor.2017.tt index 0c59d04e..49f13418 100644 --- a/BuildTools/appveyor.2017.tt +++ b/BuildTools/appveyor.2017.tt @@ -52,7 +52,7 @@ build: project: RefactoringEssentials.2017.sln - verbosity: normal + verbosity: normal after_test: - ps: Vsix-PushArtifacts | Vsix-PublishToGallery diff --git a/BuildTools/appveyor.2017.yml b/BuildTools/appveyor.2017.yml index 032235e3..dc85bf55 100644 --- a/BuildTools/appveyor.2017.yml +++ b/BuildTools/appveyor.2017.yml @@ -49,7 +49,7 @@ build: project: RefactoringEssentials.2017.sln - verbosity: normal + verbosity: normal after_test: - ps: Vsix-PushArtifacts | Vsix-PublishToGallery From 3eabf52796c572b85368fdb13ef140d8236067bc Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sun, 27 Nov 2016 09:27:13 +0100 Subject: [PATCH 043/236] Detailed msbuild output for VS 2017 build job --- BuildTools/appveyor.2017.tt | 2 +- BuildTools/appveyor.2017.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BuildTools/appveyor.2017.tt b/BuildTools/appveyor.2017.tt index 49f13418..acd8d005 100644 --- a/BuildTools/appveyor.2017.tt +++ b/BuildTools/appveyor.2017.tt @@ -52,7 +52,7 @@ build: project: RefactoringEssentials.2017.sln - verbosity: normal + verbosity: detailed after_test: - ps: Vsix-PushArtifacts | Vsix-PublishToGallery diff --git a/BuildTools/appveyor.2017.yml b/BuildTools/appveyor.2017.yml index dc85bf55..3fd12dac 100644 --- a/BuildTools/appveyor.2017.yml +++ b/BuildTools/appveyor.2017.yml @@ -49,7 +49,7 @@ build: project: RefactoringEssentials.2017.sln - verbosity: normal + verbosity: detailed after_test: - ps: Vsix-PushArtifacts | Vsix-PublishToGallery From cd1deadc171f6517cd5287db4eeb1da55bbb4d3d Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sun, 27 Nov 2016 09:44:19 +0100 Subject: [PATCH 044/236] Trying to set path to msbuild 15 manually to get build working. --- BuildTools/appveyor.2017.tt | 1 + BuildTools/appveyor.2017.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/BuildTools/appveyor.2017.tt b/BuildTools/appveyor.2017.tt index acd8d005..8511a076 100644 --- a/BuildTools/appveyor.2017.tt +++ b/BuildTools/appveyor.2017.tt @@ -44,6 +44,7 @@ image: Visual Studio 2017 RC install: + - cmd: set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin;%PATH% - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex before_build: diff --git a/BuildTools/appveyor.2017.yml b/BuildTools/appveyor.2017.yml index 3fd12dac..b48f859a 100644 --- a/BuildTools/appveyor.2017.yml +++ b/BuildTools/appveyor.2017.yml @@ -41,6 +41,7 @@ image: Visual Studio 2017 RC install: + - cmd: set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin;%PATH% - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex before_build: From 1a65aa7a2bf8fe6b2b5cee961d008b60a89d4db4 Mon Sep 17 00:00:00 2001 From: Christoph Wille Date: Sun, 27 Nov 2016 10:47:43 +0100 Subject: [PATCH 045/236] Update README.md --- README.md | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d4e49adb..ec359044 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,24 @@ [@vsrefactoring](https://twitter.com/vsrefactoring) | [vsrefactoringessentials.com](http://vsrefactoringessentials.com/) -Refactoring Essentials started out as NR6Pack, and was part of the NRefactory 6 repository. In the course of +Refactorings Essentials sports the following features: + +* Refactorings for C# and Visual Basic +* Analyzers and code fixes for C# and Visual Basic +* Code Converters to convert C# to Visual Basic and vice versa (VB to C#) + +Refactoring Essentials comes in the following flavors: + +* VSIX: built for Visual Studio - supports analyzers, refactorings and code converters (in VS 2015 and 2017) +* Nuget: packaged for build servers / IDEs that support analyzers via Nuget packages +* RefactoringEssentials assembly: usable in any IDE (-like environment), base assembly with all features + +The latter means it is x-platform and not tied to Windows / Visual Studio. + +History: Refactoring Essentials started out as NR6Pack, and was part of the NRefactory 6 repository. In the course of joint development, we made architectural tweaks that resulted in the two projects now being separate - which makes them easier to maintain and contribute to. -Please note that Refactoring Essentials is at its heart a PCL (portable class library), which means it is x-platform and -not tied to Windows / Visual Studio. - # Project Build Status Branch | Status 4.* (VS 2015) | Status 5.* (VS 2017) From f68db74b22f24bee04e4a6064b5d7411082cd660 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sun, 27 Nov 2016 11:07:24 +0100 Subject: [PATCH 046/236] - Introduced conditional compiler flag "RE2017" to be able to have VS2015/2017-specific code needed to react to Roslyn incompatibilities. - Removed SuggestUseVarKeywordEvidentAnalyzer + CodeFix, ReplaceVarWithExplicitTypeCodeRefactoringProvider, ReplaceExplicitTypeWithVarCodeRefactoringProvider from VS 2017 variant. Same functionality is already built-in in VS 2017. --- .../RefactoringEssentials.csproj | 15 +++------------ RefactoringEssentials/CodeAnalyzers.CSharp.html | 3 +-- .../CodeRefactorings.CSharp.html | 4 +--- Tests.2017/Tests.csproj | 14 ++++---------- 4 files changed, 9 insertions(+), 27 deletions(-) diff --git a/RefactoringEssentials.2017/RefactoringEssentials.csproj b/RefactoringEssentials.2017/RefactoringEssentials.csproj index 26e98eb5..d3d01cc9 100644 --- a/RefactoringEssentials.2017/RefactoringEssentials.csproj +++ b/RefactoringEssentials.2017/RefactoringEssentials.csproj @@ -302,18 +302,12 @@ CSharp\CodeRefactorings\Synced\ReplaceDirectCastWithSafeCastCodeRefactoringProvider.cs - - CSharp\CodeRefactorings\Synced\ReplaceExplicitTypeWithVarCodeRefactoringProvider.cs - CSharp\CodeRefactorings\Synced\ReplacePropertyWithBackingFieldWithAutoPropertyCodeRefactoringProvider.cs CSharp\CodeRefactorings\Synced\ReplaceSafeCastWithDirectCastCodeRefactoringProvider.cs - - CSharp\CodeRefactorings\Synced\ReplaceVarWithExplicitTypeCodeRefactoringProvider.cs - CSharp\CodeRefactorings\Synced\SplitDeclarationListCodeRefactoringProvider.cs @@ -746,12 +740,6 @@ CSharp\Diagnostics\Synced\Opportunities\InvokeAsExtensionMethodCodeFixProvider.cs - - CSharp\Diagnostics\Synced\Opportunities\SuggestUseVarKeywordEvidentAnalyzer.cs - - - CSharp\Diagnostics\Synced\Opportunities\SuggestUseVarKeywordEvidentCodeFixProvider.cs - CSharp\Diagnostics\Synced\PracticesAndImprovements\AccessToStaticMemberViaDerivedTypeAnalyzer.cs @@ -1772,6 +1760,9 @@ + + TRACE;DEBUG;RE2017 + false diff --git a/RefactoringEssentials/CodeAnalyzers.CSharp.html b/RefactoringEssentials/CodeAnalyzers.CSharp.html index 1fdf8bef..2cba20b8 100644 --- a/RefactoringEssentials/CodeAnalyzers.CSharp.html +++ b/RefactoringEssentials/CodeAnalyzers.CSharp.html @@ -15,7 +15,7 @@ -->

    Supported Code Analyzers

    -

    120 code analyzers for C#

    +

    119 code analyzers for C#

    • Suggests using the class declaring a static function when calling it (AccessToStaticMemberViaDerivedTypeAnalyzer)
    • When initializing explicitly typed local variable or array type, array creation expression can be replaced with array initializer. (ArrayCreationCanBeReplacedWithArrayInitializerAnalyzer)
    • @@ -131,7 +131,6 @@

      Supported Code Analyzers

    • Warns when a culture-aware 'IndexOf' call is used by default. (StringIndexOfIsCultureSpecificAnalyzer)
    • Warns when a culture-aware 'LastIndexOf' call is used by default. (StringLastIndexOfIsCultureSpecificAnalyzer)
    • Warns when a culture-aware 'StartsWith' call is used by default. (StringStartsWithIsCultureSpecificAnalyzer)
    • -
    • Use 'var' keyword when possible (SuggestUseVarKeywordEvidentAnalyzer)
    • [ThreadStatic] doesn't work with instance fields (ThreadStaticAtInstanceFieldAnalyzer)
    • Parameter is never used (UnusedParameterAnalyzer)
    • Type parameter is never used (UnusedTypeParameterAnalyzer)
    • diff --git a/RefactoringEssentials/CodeRefactorings.CSharp.html b/RefactoringEssentials/CodeRefactorings.CSharp.html index 666d590a..7480f7ee 100644 --- a/RefactoringEssentials/CodeRefactorings.CSharp.html +++ b/RefactoringEssentials/CodeRefactorings.CSharp.html @@ -15,7 +15,7 @@ -->

      Supported Refactorings

      -

      103 code refactorings for C#

      +

      101 code refactorings for C#

      • Adds another accessor (AddAnotherAccessorCodeRefactoringProvider)
      • Add braces (AddBracesCodeRefactoringProvider)
      • @@ -102,12 +102,10 @@

        Supported Refactorings

      • Replace assignment with postfix expression (ReplaceAssignmentWithPostfixExpressionCodeRefactoringProvider)
      • Replace auto-property with property that uses a backing field (ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider)
      • Convert cast to 'as'. (ReplaceDirectCastWithSafeCastCodeRefactoringProvider)
      • -
      • Replace type with 'var' (ReplaceExplicitTypeWithVarCodeRefactoringProvider)
      • Replace operator assignment with assignment (ReplaceOperatorAssignmentWithAssignmentCodeRefactoringProvider)
      • Replace postfix expression with assignment (ReplacePostfixExpressionWithAssignmentCodeRefactoringProvider)
      • Replace property that uses a backing field with auto-property (ReplacePropertyWithBackingFieldWithAutoPropertyCodeRefactoringProvider)
      • Convert 'as' to cast. (ReplaceSafeCastWithDirectCastCodeRefactoringProvider)
      • -
      • Replaces 'var' with explicit type specification (ReplaceVarWithExplicitTypeCodeRefactoringProvider)
      • Replace assignment with operator assignment (ReplaceWithOperatorAssignmentCodeRefactoringProvider)
      • Reverse the direction of a for (ReverseDirectionForForLoopCodeRefactoringProvider)
      • Split declaration list (SplitDeclarationListCodeRefactoringProvider)
      • diff --git a/Tests.2017/Tests.csproj b/Tests.2017/Tests.csproj index 8d6188bc..67ea6501 100644 --- a/Tests.2017/Tests.csproj +++ b/Tests.2017/Tests.csproj @@ -19,7 +19,7 @@ full false ..\bin\Debug\ - DEBUG;UNIMPLEMENTED_CONVERTER_FEATURE_TESTS + DEBUG;RE2017;UNIMPLEMENTED_CONVERTER_FEATURE_TESTS prompt 4 false @@ -33,18 +33,21 @@ 4 false RefactoringEssentials.Tests + RE2017 false bin\Debug_Mono 4 Tests + RE2017 false bin\Mono_Release 4 Tests + RE2017 false @@ -514,9 +517,6 @@ CSharp\CodeRefactorings\ReplaceDirectCastWithSafeCastTest.cs - - CSharp\CodeRefactorings\ReplaceExplicitTypeWithVarTests.cs - CSharp\CodeRefactorings\ReplaceOperatorAssignmentWithAssignmentTests.cs @@ -529,9 +529,6 @@ CSharp\CodeRefactorings\ReplaceSafeCastWithDirectCastTests.cs - - CSharp\CodeRefactorings\ReplaceVarWithExplicitTypeTests.cs - CSharp\CodeRefactorings\ReplaceWithOperatorAssignmentTests.cs @@ -1009,9 +1006,6 @@ CSharp\Diagnostics\StringStartsWithIsCultureSpecificTests.cs - - CSharp\Diagnostics\SuggestUseVarKeywordEvidentTests.cs - CSharp\Diagnostics\ThreadStaticAtInstanceFieldTests.cs From 89358253c9c3f05b5e3655c41a8ea047b50148ee Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sun, 27 Nov 2016 11:39:52 +0100 Subject: [PATCH 047/236] Some tweaks for conditional compile flag definitions in VS 2017 project. --- RefactoringEssentials.2017/RefactoringEssentials.csproj | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/RefactoringEssentials.2017/RefactoringEssentials.csproj b/RefactoringEssentials.2017/RefactoringEssentials.csproj index d3d01cc9..97761ad5 100644 --- a/RefactoringEssentials.2017/RefactoringEssentials.csproj +++ b/RefactoringEssentials.2017/RefactoringEssentials.csproj @@ -1,10 +1,12 @@  - + ..\bin\Debug + TRACE;DEBUG;RE2017 - + ..\bin\Release + RE2017 netstandard1.3 @@ -1760,9 +1762,6 @@ - - TRACE;DEBUG;RE2017 - false From 9a0df7fa44473c732efef2bdf4ea8fc16876a288 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sun, 27 Nov 2016 11:40:07 +0100 Subject: [PATCH 048/236] Fixed #265: CreateEventInvocatorCodeRefactoringProvider crashes (VS2017). --- RefactoringEssentials/Util/RoslynReflection.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/RefactoringEssentials/Util/RoslynReflection.cs b/RefactoringEssentials/Util/RoslynReflection.cs index 1c032526..ac97731f 100644 --- a/RefactoringEssentials/Util/RoslynReflection.cs +++ b/RefactoringEssentials/Util/RoslynReflection.cs @@ -175,7 +175,13 @@ public CSharpITypeSymbolExtensionsWrapper() { var typeInfo = Type.GetType("Microsoft.CodeAnalysis.CSharp.Extensions.ITypeSymbolExtensions" + ReflectionNamespaces.CSWorkspacesAsmName, true); +#if RE2017 + // Since Roslyn 2.0 the parameter has the new type INamespaceOrTypeSymbol, + // which has become a parent type of ITypeSymbol. + GenerateTypeSyntaxMethod = typeInfo.GetMethod("GenerateTypeSyntax", new[] { typeof(INamespaceOrTypeSymbol) }); +#else GenerateTypeSyntaxMethod = typeInfo.GetMethod("GenerateTypeSyntax", new[] { typeof(ITypeSymbol) }); +#endif ContainingTypesOrSelfHasUnsafeKeywordMethod = typeInfo.GetMethod("ContainingTypesOrSelfHasUnsafeKeyword", BindingFlags.Public | BindingFlags.Static); } From 4cb6ece7ba5cc9a7cb2e95c66e7cb11b79ad4b4f Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Tue, 29 Nov 2016 01:29:40 +0100 Subject: [PATCH 049/236] Corrected some references, trying to use NuGet 4.0 RC command line tool to compile VS 2017 project. --- .nuget/packages.config | 2 +- BuildTools/appveyor.2017.tt | 2 ++ BuildTools/appveyor.2017.yml | 2 ++ DocGenerator.2017/DocGenerator.csproj | 16 ++++++++-------- .../RefactoringEssentials.csproj | 12 ++++++++++++ Vsix.2017/Vsix.csproj | 12 +++++++++++- Vsix.2017/packages.config | 2 +- Vsix/Vsix.csproj | 3 ++- Vsix/app.config | 16 ++++++++-------- 9 files changed, 47 insertions(+), 20 deletions(-) diff --git a/.nuget/packages.config b/.nuget/packages.config index 0901fded..0fa4618d 100644 --- a/.nuget/packages.config +++ b/.nuget/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/BuildTools/appveyor.2017.tt b/BuildTools/appveyor.2017.tt index 8511a076..7cf4d420 100644 --- a/BuildTools/appveyor.2017.tt +++ b/BuildTools/appveyor.2017.tt @@ -49,6 +49,8 @@ before_build: - ps: Vsix-IncrementVsixVersion ".\Vsix.2017\source.extension.vsixmanifest" | Vsix-UpdateBuildVersion + - cmd: nuget install nuget.commandline -source https://dotnet.myget.org/F/nuget-build -prerelease -excludeversion -outputdirectory .nuget + - cmd: set PATH=.nuget\tools;%PATH% - cmd: nuget restore RefactoringEssentials.2017.sln build: diff --git a/BuildTools/appveyor.2017.yml b/BuildTools/appveyor.2017.yml index b48f859a..d075e8fb 100644 --- a/BuildTools/appveyor.2017.yml +++ b/BuildTools/appveyor.2017.yml @@ -46,6 +46,8 @@ before_build: - ps: Vsix-IncrementVsixVersion ".\Vsix.2017\source.extension.vsixmanifest" | Vsix-UpdateBuildVersion + - cmd: nuget install nuget.commandline -source https://dotnet.myget.org/F/nuget-build -prerelease -excludeversion -outputdirectory .nuget + - cmd: set PATH=.nuget\tools;%PATH% - cmd: nuget restore RefactoringEssentials.2017.sln build: diff --git a/DocGenerator.2017/DocGenerator.csproj b/DocGenerator.2017/DocGenerator.csproj index d29afccf..df75c1ca 100644 --- a/DocGenerator.2017/DocGenerator.csproj +++ b/DocGenerator.2017/DocGenerator.csproj @@ -172,7 +172,7 @@ Program.cs - + Properties\AssemblyInfoBase.cs AssemblyInfoBase.tt True @@ -184,13 +184,6 @@ - - - Properties\AssemblyInfoBase.tt - TextTemplatingFileGenerator - AssemblyInfoBase.cs - - @@ -204,6 +197,13 @@ RefactoringEssentials + + + Properties\AssemblyInfoBase.tt + TextTemplatingFileGenerator + AssemblyInfoBase.cs + + diff --git a/RefactoringEssentials.2017/RefactoringEssentials.csproj b/RefactoringEssentials.2017/RefactoringEssentials.csproj index 97761ad5..21defee6 100644 --- a/RefactoringEssentials.2017/RefactoringEssentials.csproj +++ b/RefactoringEssentials.2017/RefactoringEssentials.csproj @@ -1689,9 +1689,18 @@ + + 2.0.0-rc + + + 2.0.0-rc + 2.0.0-rc + + 2.0.0-rc + 2.0.0-rc @@ -1702,6 +1711,9 @@ 1.0.0-alpha-20161104-2 All + + 1.3.0 + 4.1.1 diff --git a/Vsix.2017/Vsix.csproj b/Vsix.2017/Vsix.csproj index 2cecd740..744276dc 100644 --- a/Vsix.2017/Vsix.csproj +++ b/Vsix.2017/Vsix.csproj @@ -1,6 +1,7 @@  + 15.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) @@ -311,7 +312,8 @@ - RefactoringEssentials.DocGenerator.exe + +

        Supported Refactorings

        -

        103 code refactorings for C#

        +

        104 code refactorings for C#

        • Adds another accessor (AddAnotherAccessorCodeRefactoringProvider)
        • Add braces (AddBracesCodeRefactoringProvider)
        • @@ -84,6 +84,7 @@

          Supported Refactorings

        • Import static class with using directive in file (ImportStaticClassWithUsingCodeRefactoringProvider)
        • Initialize auto property from constructor parameter (InitializeAutoPropertyFromConstructorParameterCodeRefactoringProvider)
        • Initialize field from constructor parameter (InitializeFieldFromConstructorParameterCodeRefactoringProvider)
        • +
        • Initialize readonly auto property from constructor parameter (InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider)
        • Insert anonymous method signature (InsertAnonymousMethodSignatureCodeRefactoringProvider)
        • Invert conditional operator (InvertConditionalOperatorCodeRefactoringProvider)
        • Invert if (InvertIfCodeRefactoringProvider)
        • diff --git a/RefactoringEssentials/RefactoringEssentials.csproj b/RefactoringEssentials/RefactoringEssentials.csproj index 54ff0fff..5b9d576c 100644 --- a/RefactoringEssentials/RefactoringEssentials.csproj +++ b/RefactoringEssentials/RefactoringEssentials.csproj @@ -58,6 +58,7 @@ + diff --git a/Tests/CSharp/CodeRefactorings/InitializeReadOnlyAutoPropertyFromConstructorParameterTests.cs b/Tests/CSharp/CodeRefactorings/InitializeReadOnlyAutoPropertyFromConstructorParameterTests.cs new file mode 100644 index 00000000..64a92ebd --- /dev/null +++ b/Tests/CSharp/CodeRefactorings/InitializeReadOnlyAutoPropertyFromConstructorParameterTests.cs @@ -0,0 +1,55 @@ +using NUnit.Framework; +using RefactoringEssentials.CSharp.CodeRefactorings; + +namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings +{ + [TestFixture] + public class InitializeReadOnlyAutoPropertyFromConstructorParameterTests : CSharpCodeRefactoringTestBase + { + [Test] + public void AddInteger() + { + Test(@" +class Foo +{ + public Foo(int $x, int y) + { + } +}", @" +class Foo +{ + public int X { get; } + + public Foo(int x, int y) + { + X = x; + } +}"); + } + + [Test] + public void NotInParameterList() + { + TestWrongContext(@" +class Foo +{ + public $Foo(int x, int y) + { + } +}"); + } + + [Test] + public void NotInConstructor() + { + TestWrongContext(@" +class Foo +{ + public void Foo(int $x, int y) + { + } +}"); + } + } +} + diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index bb3765d9..81143bbc 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -139,6 +139,7 @@ + From 8c524ae7c5060ccada426c4e5acf3fb6d8bc16b4 Mon Sep 17 00:00:00 2001 From: CeddlyBurge Date: Thu, 8 Dec 2016 18:29:31 +0000 Subject: [PATCH 056/236] Refactoring: move code in to methods and classes in to files --- ...tructorParameterCodeRefactoringProvider.cs | 145 +++++++----------- .../CSharp/ConstructorParameterContext.cs | 41 +++++ .../ConstructorParameterContextFinder.cs | 47 ++++++ .../RefactoringEssentials.csproj | 2 + 4 files changed, 148 insertions(+), 87 deletions(-) create mode 100644 RefactoringEssentials/CSharp/ConstructorParameterContext.cs create mode 100644 RefactoringEssentials/CSharp/ConstructorParameterContextFinder.cs diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Custom/InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Custom/InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs index 89c9199c..b4a392e4 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Custom/InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Custom/InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs @@ -6,76 +6,9 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CodeRefactorings; using Microsoft.CodeAnalysis.Formatting; -using System.Diagnostics.Contracts; -using Microsoft.CodeAnalysis.Text; namespace RefactoringEssentials.CSharp.CodeRefactorings { - public class ConstructorParameterContext - { - public string ParameterName { get; } - public string PropertyName { get; } - public TypeSyntax Type { get; } - public ConstructorDeclarationSyntax Constructor { get; } - public TextSpan TextSpan { get; } - public SyntaxNode Root { get; } - public Document Document { get; } - - public ConstructorParameterContext(Document document, string parameterName, string propertyName, TypeSyntax type, ConstructorDeclarationSyntax constructor, TextSpan textSpan, SyntaxNode root) - { - Contract.Requires(document != null); - Contract.Requires(parameterName != null); - Contract.Requires(propertyName != null); - Contract.Requires(type != null); - Contract.Requires(constructor != null); - Contract.Requires(root != null); - - Document = document; - Constructor = constructor; - Type = type; - ParameterName = parameterName; - PropertyName = propertyName; - TextSpan = textSpan; - Root = root; - } - } - - public class ConstructorParameterContextFinder - { - public async Task Find(CodeRefactoringContext context) - { - var document = context.Document; - if (document.Project.Solution.Workspace.Kind == WorkspaceKind.MiscellaneousFiles) - return null; - var span = context.Span; - if (!span.IsEmpty) - return null; - var cancellationToken = context.CancellationToken; - if (cancellationToken.IsCancellationRequested) - return null; - var model = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); - if (model.IsFromGeneratedCode(cancellationToken)) - return null; - var root = await model.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); - var token = root.FindToken(span.Start); - var parameter = token.Parent as ParameterSyntax; - - if (parameter == null) - return null; - - var ctor = parameter.Parent.Parent as ConstructorDeclarationSyntax; - if (ctor == null) - return null; - - return new ConstructorParameterContext(document, parameter.Identifier.ToString(), GetPropertyName(parameter.Identifier.ToString()), parameter.Type, ctor, span, root); - } - - static string GetPropertyName(string v) - { - return char.ToUpper(v[0]) + v.Substring(1); - } - } - [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Initialize readonly auto property from constructor parameter")] public class InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider : CodeRefactoringProvider { @@ -95,7 +28,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte context.RegisterRefactoring( CodeActionFactory.Create( - constructorParameterContext.TextSpan,// parameter.Span, + constructorParameterContext.TextSpan, DiagnosticSeverity.Info, GettextCatalog.GetString("Initialize readonly auto-property from parameter"), t2 => CreateAndInitialiseReadOnlyPropertyFromConstructorParameter(constructorParameterContext) @@ -105,31 +38,69 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte static Task CreateAndInitialiseReadOnlyPropertyFromConstructorParameter(ConstructorParameterContext context) { - var accessorDeclList = new SyntaxList() - .Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))); - var newProperty = SyntaxFactory.PropertyDeclaration(context.Type, context.PropertyName) - .WithAccessorList(SyntaxFactory.AccessorList(accessorDeclList)) - .WithModifiers(SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PublicKeyword))) - .WithAdditionalAnnotations(Formatter.Annotation); + var trackedRoot = context.Root.TrackNodes(context.Constructor); + + var rootWithNewProperty = AddBefore( + root: trackedRoot, + loationToAddBefore: context.Constructor, + nodeToAdd: CreateAutoProperty( + type: context.Type, + identifier: context.PropertyName, + getOnly: true, + accessibility: SyntaxKind.PublicKeyword)); + + var rootWithAssignmentAndProperty = AddStatementToConstructorBody( + root: rootWithNewProperty, + constructor: context.Constructor, + statement: CreateAssignmentStatement( + leftHandSidePropertyName: context.PropertyName, + rightHandSidePropertyName: context.ParameterName)); + + return Task.FromResult(context.Document.WithSyntaxRoot(rootWithAssignmentAndProperty)); + } - var assignmentStatement = SyntaxFactory.ExpressionStatement( + static SyntaxNode AddBefore(SyntaxNode root, SyntaxNode loationToAddBefore, SyntaxNode nodeToAdd) + { + return root.InsertNodesBefore( + root.GetCurrentNode(loationToAddBefore) + , new List { nodeToAdd }); + } + + static SyntaxNode AddStatementToConstructorBody(SyntaxNode root, ConstructorDeclarationSyntax constructor, StatementSyntax statement) + { + var body = constructor.Body ?? SyntaxFactory.Block(); + + return root.ReplaceNode(root.GetCurrentNode(constructor), constructor.WithBody( + body.WithStatements(SyntaxFactory.List(new[] { statement }.Concat(body.Statements))) + )); + } + + static ExpressionStatementSyntax CreateAssignmentStatement(string leftHandSidePropertyName, string rightHandSidePropertyName) + { + return SyntaxFactory.ExpressionStatement( SyntaxFactory.AssignmentExpression( SyntaxKind.SimpleAssignmentExpression, - context.PropertyName != context.ParameterName ? (ExpressionSyntax)SyntaxFactory.IdentifierName(context.PropertyName) : SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, SyntaxFactory.ThisExpression(), SyntaxFactory.IdentifierName(context.ParameterName)), - SyntaxFactory.IdentifierName(context.ParameterName) + leftHandSidePropertyName != rightHandSidePropertyName ? (ExpressionSyntax)SyntaxFactory.IdentifierName(leftHandSidePropertyName) : SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, SyntaxFactory.ThisExpression(), SyntaxFactory.IdentifierName(rightHandSidePropertyName)), + SyntaxFactory.IdentifierName(rightHandSidePropertyName) ) ).WithAdditionalAnnotations(Formatter.Annotation); + } - var trackedRoot = context.Root.TrackNodes(context.Constructor); - var newRoot = trackedRoot.InsertNodesBefore(trackedRoot.GetCurrentNode(context.Constructor), new List() { - newProperty - }); - var ctorBody = context.Constructor.Body ?? SyntaxFactory.Block(); - newRoot = newRoot.ReplaceNode(newRoot.GetCurrentNode(context.Constructor), context.Constructor.WithBody( - ctorBody.WithStatements(SyntaxFactory.List(new[] { assignmentStatement }.Concat(ctorBody.Statements))) - )); - - return Task.FromResult(context.Document.WithSyntaxRoot(newRoot)); + static PropertyDeclarationSyntax CreateAutoProperty(TypeSyntax type, string identifier, bool getOnly, SyntaxKind? accessibility) + { + var accessorDeclList = new SyntaxList() + .Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))); + + if (getOnly == false) + accessorDeclList.Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))); + + var newProperty = SyntaxFactory.PropertyDeclaration(type, identifier) + .WithAccessorList(SyntaxFactory.AccessorList(accessorDeclList)); + + if (accessibility.HasValue) + newProperty = newProperty.WithModifiers(SyntaxFactory.TokenList(SyntaxFactory.Token(accessibility.Value))); + + return newProperty.WithAdditionalAnnotations(Formatter.Annotation); } } } diff --git a/RefactoringEssentials/CSharp/ConstructorParameterContext.cs b/RefactoringEssentials/CSharp/ConstructorParameterContext.cs new file mode 100644 index 00000000..988769a3 --- /dev/null +++ b/RefactoringEssentials/CSharp/ConstructorParameterContext.cs @@ -0,0 +1,41 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Text; +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RefactoringEssentials.CSharp +{ + public class ConstructorParameterContext + { + public string ParameterName { get; } + public string PropertyName { get; } + public TypeSyntax Type { get; } + public ConstructorDeclarationSyntax Constructor { get; } + public TextSpan TextSpan { get; } + public SyntaxNode Root { get; } + public Document Document { get; } + + public ConstructorParameterContext(Document document, string parameterName, string propertyName, TypeSyntax type, ConstructorDeclarationSyntax constructor, TextSpan textSpan, SyntaxNode root) + { + Contract.Requires(document != null); + Contract.Requires(parameterName != null); + Contract.Requires(propertyName != null); + Contract.Requires(type != null); + Contract.Requires(constructor != null); + Contract.Requires(root != null); + + Document = document; + Constructor = constructor; + Type = type; + ParameterName = parameterName; + PropertyName = propertyName; + TextSpan = textSpan; + Root = root; + } + } +} diff --git a/RefactoringEssentials/CSharp/ConstructorParameterContextFinder.cs b/RefactoringEssentials/CSharp/ConstructorParameterContextFinder.cs new file mode 100644 index 00000000..044ccebf --- /dev/null +++ b/RefactoringEssentials/CSharp/ConstructorParameterContextFinder.cs @@ -0,0 +1,47 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CodeRefactorings; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RefactoringEssentials.CSharp +{ + public class ConstructorParameterContextFinder + { + public async Task Find(CodeRefactoringContext context) + { + var document = context.Document; + if (document.Project.Solution.Workspace.Kind == WorkspaceKind.MiscellaneousFiles) + return null; + var span = context.Span; + if (!span.IsEmpty) + return null; + var cancellationToken = context.CancellationToken; + if (cancellationToken.IsCancellationRequested) + return null; + var model = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); + if (model.IsFromGeneratedCode(cancellationToken)) + return null; + var root = await model.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); + var token = root.FindToken(span.Start); + var parameter = token.Parent as ParameterSyntax; + + if (parameter == null) + return null; + + var ctor = parameter.Parent.Parent as ConstructorDeclarationSyntax; + if (ctor == null) + return null; + + return new ConstructorParameterContext(document, parameter.Identifier.ToString(), GetPropertyName(parameter.Identifier.ToString()), parameter.Type, ctor, span, root); + } + + static string GetPropertyName(string v) + { + return char.ToUpper(v[0]) + v.Substring(1); + } + } +} diff --git a/RefactoringEssentials/RefactoringEssentials.csproj b/RefactoringEssentials/RefactoringEssentials.csproj index 5b9d576c..73be3fb2 100644 --- a/RefactoringEssentials/RefactoringEssentials.csproj +++ b/RefactoringEssentials/RefactoringEssentials.csproj @@ -63,6 +63,8 @@ + + From 8b7cbbf150972b985297c94451cf544b623b2838 Mon Sep 17 00:00:00 2001 From: CeddlyBurge Date: Thu, 8 Dec 2016 18:37:18 +0000 Subject: [PATCH 057/236] refactoring: move static methods to chared class --- ...tructorParameterCodeRefactoringProvider.cs | 48 +--------------- RefactoringEssentials/CSharp/Manipulations.cs | 56 +++++++++++++++++++ .../RefactoringEssentials.csproj | 1 + 3 files changed, 58 insertions(+), 47 deletions(-) create mode 100644 RefactoringEssentials/CSharp/Manipulations.cs diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Custom/InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Custom/InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs index b4a392e4..42a9176a 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Custom/InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Custom/InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs @@ -1,11 +1,8 @@ -using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CodeRefactorings; -using Microsoft.CodeAnalysis.Formatting; +using static RefactoringEssentials.CSharp.Manipulations; namespace RefactoringEssentials.CSharp.CodeRefactorings { @@ -59,48 +56,5 @@ static Task CreateAndInitialiseReadOnlyPropertyFromConstructorParamete return Task.FromResult(context.Document.WithSyntaxRoot(rootWithAssignmentAndProperty)); } - static SyntaxNode AddBefore(SyntaxNode root, SyntaxNode loationToAddBefore, SyntaxNode nodeToAdd) - { - return root.InsertNodesBefore( - root.GetCurrentNode(loationToAddBefore) - , new List { nodeToAdd }); - } - - static SyntaxNode AddStatementToConstructorBody(SyntaxNode root, ConstructorDeclarationSyntax constructor, StatementSyntax statement) - { - var body = constructor.Body ?? SyntaxFactory.Block(); - - return root.ReplaceNode(root.GetCurrentNode(constructor), constructor.WithBody( - body.WithStatements(SyntaxFactory.List(new[] { statement }.Concat(body.Statements))) - )); - } - - static ExpressionStatementSyntax CreateAssignmentStatement(string leftHandSidePropertyName, string rightHandSidePropertyName) - { - return SyntaxFactory.ExpressionStatement( - SyntaxFactory.AssignmentExpression( - SyntaxKind.SimpleAssignmentExpression, - leftHandSidePropertyName != rightHandSidePropertyName ? (ExpressionSyntax)SyntaxFactory.IdentifierName(leftHandSidePropertyName) : SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, SyntaxFactory.ThisExpression(), SyntaxFactory.IdentifierName(rightHandSidePropertyName)), - SyntaxFactory.IdentifierName(rightHandSidePropertyName) - ) - ).WithAdditionalAnnotations(Formatter.Annotation); - } - - static PropertyDeclarationSyntax CreateAutoProperty(TypeSyntax type, string identifier, bool getOnly, SyntaxKind? accessibility) - { - var accessorDeclList = new SyntaxList() - .Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))); - - if (getOnly == false) - accessorDeclList.Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))); - - var newProperty = SyntaxFactory.PropertyDeclaration(type, identifier) - .WithAccessorList(SyntaxFactory.AccessorList(accessorDeclList)); - - if (accessibility.HasValue) - newProperty = newProperty.WithModifiers(SyntaxFactory.TokenList(SyntaxFactory.Token(accessibility.Value))); - - return newProperty.WithAdditionalAnnotations(Formatter.Annotation); - } } } diff --git a/RefactoringEssentials/CSharp/Manipulations.cs b/RefactoringEssentials/CSharp/Manipulations.cs new file mode 100644 index 00000000..f424eca2 --- /dev/null +++ b/RefactoringEssentials/CSharp/Manipulations.cs @@ -0,0 +1,56 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Formatting; +using System.Collections.Generic; +using System.Linq; + +namespace RefactoringEssentials.CSharp +{ + static class Manipulations + { + internal static SyntaxNode AddBefore(SyntaxNode root, SyntaxNode loationToAddBefore, SyntaxNode nodeToAdd) + { + return root.InsertNodesBefore( + root.GetCurrentNode(loationToAddBefore) + , new List { nodeToAdd }); + } + + internal static SyntaxNode AddStatementToConstructorBody(SyntaxNode root, ConstructorDeclarationSyntax constructor, StatementSyntax statement) + { + var body = constructor.Body ?? SyntaxFactory.Block(); + + return root.ReplaceNode(root.GetCurrentNode(constructor), constructor.WithBody( + body.WithStatements(SyntaxFactory.List(new[] { statement }.Concat(body.Statements))) + )); + } + + internal static ExpressionStatementSyntax CreateAssignmentStatement(string leftHandSidePropertyName, string rightHandSidePropertyName) + { + return SyntaxFactory.ExpressionStatement( + SyntaxFactory.AssignmentExpression( + SyntaxKind.SimpleAssignmentExpression, + leftHandSidePropertyName != rightHandSidePropertyName ? (ExpressionSyntax)SyntaxFactory.IdentifierName(leftHandSidePropertyName) : SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, SyntaxFactory.ThisExpression(), SyntaxFactory.IdentifierName(rightHandSidePropertyName)), + SyntaxFactory.IdentifierName(rightHandSidePropertyName) + ) + ).WithAdditionalAnnotations(Formatter.Annotation); + } + + internal static PropertyDeclarationSyntax CreateAutoProperty(TypeSyntax type, string identifier, bool getOnly, SyntaxKind? accessibility) + { + var accessorDeclList = new SyntaxList() + .Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))); + + if (getOnly == false) + accessorDeclList.Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))); + + var newProperty = SyntaxFactory.PropertyDeclaration(type, identifier) + .WithAccessorList(SyntaxFactory.AccessorList(accessorDeclList)); + + if (accessibility.HasValue) + newProperty = newProperty.WithModifiers(SyntaxFactory.TokenList(SyntaxFactory.Token(accessibility.Value))); + + return newProperty.WithAdditionalAnnotations(Formatter.Annotation); + } + } +} diff --git a/RefactoringEssentials/RefactoringEssentials.csproj b/RefactoringEssentials/RefactoringEssentials.csproj index 73be3fb2..557002fa 100644 --- a/RefactoringEssentials/RefactoringEssentials.csproj +++ b/RefactoringEssentials/RefactoringEssentials.csproj @@ -71,6 +71,7 @@ + From 5bb37596125111d37287de511926747133a65b13 Mon Sep 17 00:00:00 2001 From: CeddlyBurge Date: Fri, 9 Dec 2016 08:12:43 +0000 Subject: [PATCH 058/236] Refactoring: change bool to accesor list and update initialiseautoproperty --- ...tructorParameterCodeRefactoringProvider.cs | 2 +- ...tructorParameterCodeRefactoringProvider.cs | 88 ++++++++----------- RefactoringEssentials/CSharp/Manipulations.cs | 20 +++-- 3 files changed, 48 insertions(+), 62 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Custom/InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Custom/InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs index 42a9176a..71d38e9a 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Custom/InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Custom/InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs @@ -43,7 +43,7 @@ static Task CreateAndInitialiseReadOnlyPropertyFromConstructorParamete nodeToAdd: CreateAutoProperty( type: context.Type, identifier: context.PropertyName, - getOnly: true, + accessors: GetAccessor(), accessibility: SyntaxKind.PublicKeyword)); var rootWithAssignmentAndProperty = AddStatementToConstructorBody( diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/InitializeAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/InitializeAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs index 2cc1f3ba..b27b03a6 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/InitializeAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/InitializeAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs @@ -6,76 +6,58 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CodeRefactorings; using Microsoft.CodeAnalysis.Formatting; +using static RefactoringEssentials.CSharp.Manipulations; namespace RefactoringEssentials.CSharp.CodeRefactorings { [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Initialize auto property from constructor parameter")] public class InitializeAutoPropertyFromConstructorParameterCodeRefactoringProvider : CodeRefactoringProvider { + ConstructorParameterContextFinder ConstructorParameterContextFinder { get; } + + public InitializeAutoPropertyFromConstructorParameterCodeRefactoringProvider() + { + ConstructorParameterContextFinder = new ConstructorParameterContextFinder(); + } + public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) { - var document = context.Document; - if (document.Project.Solution.Workspace.Kind == WorkspaceKind.MiscellaneousFiles) - return; - var span = context.Span; - if (!span.IsEmpty) - return; - var cancellationToken = context.CancellationToken; - if (cancellationToken.IsCancellationRequested) - return; - var model = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); - if (model.IsFromGeneratedCode(cancellationToken)) - return; - var root = await model.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); - var token = root.FindToken(span.Start); - var parameter = token.Parent as ParameterSyntax; + var constructorParameterContext = await ConstructorParameterContextFinder.Find(context); - if (parameter != null) - { - var ctor = parameter.Parent.Parent as ConstructorDeclarationSyntax; - if (ctor == null) - return; + if (constructorParameterContext == null) + return; - context.RegisterRefactoring( + context.RegisterRefactoring( CodeActionFactory.Create( - parameter.Span, + constructorParameterContext.TextSpan, DiagnosticSeverity.Info, GettextCatalog.GetString("Initialize auto-property from parameter"), - t2 => - { - var propertyName = GetPropertyName(parameter.Identifier.ToString()); - var accessorDeclList = new SyntaxList().Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))).Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))); - var newProperty = SyntaxFactory.PropertyDeclaration(parameter.Type, propertyName) - .WithAccessorList(SyntaxFactory.AccessorList(accessorDeclList)) - .WithModifiers(SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PublicKeyword))) - .WithAdditionalAnnotations(Formatter.Annotation); - - var assignmentStatement = SyntaxFactory.ExpressionStatement( - SyntaxFactory.AssignmentExpression( - SyntaxKind.SimpleAssignmentExpression, - propertyName != parameter.Identifier.ToString() ? (ExpressionSyntax)SyntaxFactory.IdentifierName(propertyName) : SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, SyntaxFactory.ThisExpression(), SyntaxFactory.IdentifierName(parameter.Identifier)), - SyntaxFactory.IdentifierName(parameter.Identifier) - ) - ).WithAdditionalAnnotations(Formatter.Annotation); - - var trackedRoot = root.TrackNodes(ctor); - var newRoot = trackedRoot.InsertNodesBefore(trackedRoot.GetCurrentNode(ctor), new List() { - newProperty - }); - var ctorBody = ctor.Body ?? SyntaxFactory.Block (); - newRoot = newRoot.ReplaceNode (newRoot.GetCurrentNode(ctor), ctor.WithBody( - ctorBody.WithStatements (SyntaxFactory.List(new[] { assignmentStatement }.Concat(ctorBody.Statements))) - )); - - return Task.FromResult(document.WithSyntaxRoot(newRoot)); - }) + t2 => CreateAndInitialiseReadOnlyPropertyFromConstructorParameter(constructorParameterContext) + ) ); - } } - static string GetPropertyName(string v) + static Task CreateAndInitialiseReadOnlyPropertyFromConstructorParameter(ConstructorParameterContext context) { - return char.ToUpper(v[0]) + v.Substring(1); + var trackedRoot = context.Root.TrackNodes(context.Constructor); + + var rootWithNewProperty = AddBefore( + root: trackedRoot, + loationToAddBefore: context.Constructor, + nodeToAdd: CreateAutoProperty( + type: context.Type, + identifier: context.PropertyName, + accessors: GetAndSetAccessors(), + accessibility: SyntaxKind.PublicKeyword)); + + var rootWithAssignmentAndProperty = AddStatementToConstructorBody( + root: rootWithNewProperty, + constructor: context.Constructor, + statement: CreateAssignmentStatement( + leftHandSidePropertyName: context.PropertyName, + rightHandSidePropertyName: context.ParameterName)); + + return Task.FromResult(context.Document.WithSyntaxRoot(rootWithAssignmentAndProperty)); } } } \ No newline at end of file diff --git a/RefactoringEssentials/CSharp/Manipulations.cs b/RefactoringEssentials/CSharp/Manipulations.cs index f424eca2..29570d9d 100644 --- a/RefactoringEssentials/CSharp/Manipulations.cs +++ b/RefactoringEssentials/CSharp/Manipulations.cs @@ -36,21 +36,25 @@ internal static ExpressionStatementSyntax CreateAssignmentStatement(string leftH ).WithAdditionalAnnotations(Formatter.Annotation); } - internal static PropertyDeclarationSyntax CreateAutoProperty(TypeSyntax type, string identifier, bool getOnly, SyntaxKind? accessibility) + internal static PropertyDeclarationSyntax CreateAutoProperty(TypeSyntax type, string identifier, SyntaxList accessors, SyntaxKind? accessibility) { - var accessorDeclList = new SyntaxList() - .Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))); - - if (getOnly == false) - accessorDeclList.Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))); - var newProperty = SyntaxFactory.PropertyDeclaration(type, identifier) - .WithAccessorList(SyntaxFactory.AccessorList(accessorDeclList)); + .WithAccessorList(SyntaxFactory.AccessorList(accessors)); if (accessibility.HasValue) newProperty = newProperty.WithModifiers(SyntaxFactory.TokenList(SyntaxFactory.Token(accessibility.Value))); return newProperty.WithAdditionalAnnotations(Formatter.Annotation); } + + internal static SyntaxList GetAccessor() + { + return new SyntaxList().Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))); + } + + internal static SyntaxList GetAndSetAccessors() + { + return new SyntaxList().Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))).Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))); + } } } From 2238a1abebdbc14ebafaa611aee0917bfdf59248 Mon Sep 17 00:00:00 2001 From: CeddlyBurge Date: Fri, 9 Dec 2016 08:30:06 +0000 Subject: [PATCH 059/236] Add initialise interface test and wrong context for type test --- ...tructorParameterCodeRefactoringProvider.cs | 4 +-- ...tructorParameterCodeRefactoringProvider.cs | 4 +-- ...toPropertyFromConstructorParameterTests.cs | 35 ++++++++++++++++++- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Custom/InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Custom/InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs index 71d38e9a..cfa907b5 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Custom/InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Custom/InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs @@ -28,12 +28,12 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte constructorParameterContext.TextSpan, DiagnosticSeverity.Info, GettextCatalog.GetString("Initialize readonly auto-property from parameter"), - t2 => CreateAndInitialiseReadOnlyPropertyFromConstructorParameter(constructorParameterContext) + t => CreateAndInitialiseReadOnlyAutoPropertyFromConstructorParameter(constructorParameterContext) ) ); } - static Task CreateAndInitialiseReadOnlyPropertyFromConstructorParameter(ConstructorParameterContext context) + static Task CreateAndInitialiseReadOnlyAutoPropertyFromConstructorParameter(ConstructorParameterContext context) { var trackedRoot = context.Root.TrackNodes(context.Constructor); diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/InitializeAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/InitializeAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs index b27b03a6..c7c57438 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/InitializeAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/InitializeAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs @@ -32,12 +32,12 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte constructorParameterContext.TextSpan, DiagnosticSeverity.Info, GettextCatalog.GetString("Initialize auto-property from parameter"), - t2 => CreateAndInitialiseReadOnlyPropertyFromConstructorParameter(constructorParameterContext) + t => CreateAndInitialiseAutoPropertyFromConstructorParameter(constructorParameterContext) ) ); } - static Task CreateAndInitialiseReadOnlyPropertyFromConstructorParameter(ConstructorParameterContext context) + static Task CreateAndInitialiseAutoPropertyFromConstructorParameter(ConstructorParameterContext context) { var trackedRoot = context.Root.TrackNodes(context.Constructor); diff --git a/Tests/CSharp/CodeRefactorings/InitializeReadOnlyAutoPropertyFromConstructorParameterTests.cs b/Tests/CSharp/CodeRefactorings/InitializeReadOnlyAutoPropertyFromConstructorParameterTests.cs index 64a92ebd..b24b49dc 100644 --- a/Tests/CSharp/CodeRefactorings/InitializeReadOnlyAutoPropertyFromConstructorParameterTests.cs +++ b/Tests/CSharp/CodeRefactorings/InitializeReadOnlyAutoPropertyFromConstructorParameterTests.cs @@ -7,7 +7,7 @@ namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings public class InitializeReadOnlyAutoPropertyFromConstructorParameterTests : CSharpCodeRefactoringTestBase { [Test] - public void AddInteger() + public void InitialiseInteger() { Test(@" class Foo @@ -27,6 +27,27 @@ public Foo(int x, int y) }"); } + [Test] + public void InitialiseInterface() + { + Test(@" +class Foo +{ + public Foo(int x, ICedd $cedd) + { + } +}", @" +class Foo +{ + public ICedd Cedd { get; } + + public Foo(int x, ICedd cedd) + { + Cedd = cedd; + } +}"); + } + [Test] public void NotInParameterList() { @@ -39,6 +60,18 @@ class Foo }"); } + [Test] + public void NotInParameterValue() + { + TestWrongContext(@" +class Foo +{ + public Foo($int x, int y) + { + } +}"); + } + [Test] public void NotInConstructor() { From 4acd500a580b5c2569bcf3f0e41ca6404038212b Mon Sep 17 00:00:00 2001 From: CeddlyBurge Date: Fri, 9 Dec 2016 19:52:21 +0000 Subject: [PATCH 060/236] rebuild to update html files --- RefactoringEssentials/CodeAnalyzers.CSharp.html | 3 ++- RefactoringEssentials/CodeRefactorings.CSharp.html | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/RefactoringEssentials/CodeAnalyzers.CSharp.html b/RefactoringEssentials/CodeAnalyzers.CSharp.html index 2cba20b8..1fdf8bef 100644 --- a/RefactoringEssentials/CodeAnalyzers.CSharp.html +++ b/RefactoringEssentials/CodeAnalyzers.CSharp.html @@ -15,7 +15,7 @@ -->

          Supported Code Analyzers

          -

          119 code analyzers for C#

          +

          120 code analyzers for C#

          • Suggests using the class declaring a static function when calling it (AccessToStaticMemberViaDerivedTypeAnalyzer)
          • When initializing explicitly typed local variable or array type, array creation expression can be replaced with array initializer. (ArrayCreationCanBeReplacedWithArrayInitializerAnalyzer)
          • @@ -131,6 +131,7 @@

            Supported Code Analyzers

          • Warns when a culture-aware 'IndexOf' call is used by default. (StringIndexOfIsCultureSpecificAnalyzer)
          • Warns when a culture-aware 'LastIndexOf' call is used by default. (StringLastIndexOfIsCultureSpecificAnalyzer)
          • Warns when a culture-aware 'StartsWith' call is used by default. (StringStartsWithIsCultureSpecificAnalyzer)
          • +
          • Use 'var' keyword when possible (SuggestUseVarKeywordEvidentAnalyzer)
          • [ThreadStatic] doesn't work with instance fields (ThreadStaticAtInstanceFieldAnalyzer)
          • Parameter is never used (UnusedParameterAnalyzer)
          • Type parameter is never used (UnusedTypeParameterAnalyzer)
          • diff --git a/RefactoringEssentials/CodeRefactorings.CSharp.html b/RefactoringEssentials/CodeRefactorings.CSharp.html index 7480f7ee..2312c67a 100644 --- a/RefactoringEssentials/CodeRefactorings.CSharp.html +++ b/RefactoringEssentials/CodeRefactorings.CSharp.html @@ -15,7 +15,7 @@ -->

            Supported Refactorings

            -

            101 code refactorings for C#

            +

            104 code refactorings for C#

            • Adds another accessor (AddAnotherAccessorCodeRefactoringProvider)
            • Add braces (AddBracesCodeRefactoringProvider)
            • @@ -84,6 +84,7 @@

              Supported Refactorings

            • Import static class with using directive in file (ImportStaticClassWithUsingCodeRefactoringProvider)
            • Initialize auto property from constructor parameter (InitializeAutoPropertyFromConstructorParameterCodeRefactoringProvider)
            • Initialize field from constructor parameter (InitializeFieldFromConstructorParameterCodeRefactoringProvider)
            • +
            • Initialize readonly auto property from constructor parameter (InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider)
            • Insert anonymous method signature (InsertAnonymousMethodSignatureCodeRefactoringProvider)
            • Invert conditional operator (InvertConditionalOperatorCodeRefactoringProvider)
            • Invert if (InvertIfCodeRefactoringProvider)
            • @@ -102,10 +103,12 @@

              Supported Refactorings

            • Replace assignment with postfix expression (ReplaceAssignmentWithPostfixExpressionCodeRefactoringProvider)
            • Replace auto-property with property that uses a backing field (ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider)
            • Convert cast to 'as'. (ReplaceDirectCastWithSafeCastCodeRefactoringProvider)
            • +
            • Replace type with 'var' (ReplaceExplicitTypeWithVarCodeRefactoringProvider)
            • Replace operator assignment with assignment (ReplaceOperatorAssignmentWithAssignmentCodeRefactoringProvider)
            • Replace postfix expression with assignment (ReplacePostfixExpressionWithAssignmentCodeRefactoringProvider)
            • Replace property that uses a backing field with auto-property (ReplacePropertyWithBackingFieldWithAutoPropertyCodeRefactoringProvider)
            • Convert 'as' to cast. (ReplaceSafeCastWithDirectCastCodeRefactoringProvider)
            • +
            • Replaces 'var' with explicit type specification (ReplaceVarWithExplicitTypeCodeRefactoringProvider)
            • Replace assignment with operator assignment (ReplaceWithOperatorAssignmentCodeRefactoringProvider)
            • Reverse the direction of a for (ReverseDirectionForForLoopCodeRefactoringProvider)
            • Split declaration list (SplitDeclarationListCodeRefactoringProvider)
            • From fdd70e8485462d5a83637816c50146879f7d434d Mon Sep 17 00:00:00 2001 From: CeddlyBurge Date: Sat, 10 Dec 2016 10:47:47 +0000 Subject: [PATCH 061/236] Attempt to fix up the 2017 csproj --- .../RefactoringEssentials.csproj | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/RefactoringEssentials.2017/RefactoringEssentials.csproj b/RefactoringEssentials.2017/RefactoringEssentials.csproj index a56c0ba2..4cd81461 100644 --- a/RefactoringEssentials.2017/RefactoringEssentials.csproj +++ b/RefactoringEssentials.2017/RefactoringEssentials.csproj @@ -13,6 +13,15 @@ $(PackageTargetFallback);portable-net45+win8+wp8+wpa81 + + CSharp\ConstructorParameterContext.cs + + + CSharp\ConstructorParameterContextFinder.cs + + + CSharp\CodeRefactorings\Custom\InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs + Common\CodeContractsCodeRefactoringProvider.cs @@ -1312,6 +1321,9 @@ CSharp\Diagnostics\Synced\RedundanciesInDeclaration\UnusedTypeParameterAnalyzer.cs + + CSharp\Manipulations.cs + CSharp\SyntaxExtensions.cs From 8cbffb15e2a7be7e065957f4560ff50f28a452c5 Mon Sep 17 00:00:00 2001 From: CeddlyBurge Date: Sat, 10 Dec 2016 11:47:08 +0000 Subject: [PATCH 062/236] Another attempt to fix up the 2017 csproj --- RefactoringEssentials.2017/RefactoringEssentials.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/RefactoringEssentials.2017/RefactoringEssentials.csproj b/RefactoringEssentials.2017/RefactoringEssentials.csproj index 4cd81461..90ba5432 100644 --- a/RefactoringEssentials.2017/RefactoringEssentials.csproj +++ b/RefactoringEssentials.2017/RefactoringEssentials.csproj @@ -13,13 +13,13 @@ $(PackageTargetFallback);portable-net45+win8+wp8+wpa81 - + CSharp\ConstructorParameterContext.cs - + CSharp\ConstructorParameterContextFinder.cs - + CSharp\CodeRefactorings\Custom\InitializeReadOnlyAutoPropertyFromConstructorParameterCodeRefactoringProvider.cs From f34212ec1c5b0ce4773905dc1ce575c291c900e1 Mon Sep 17 00:00:00 2001 From: Christoph Wille Date: Sun, 11 Dec 2016 18:27:19 +0100 Subject: [PATCH 063/236] Update packages per https://blogs.msdn.microsoft.com/visualstudio/2016/11/18/live-unit-testing-visual-studio-2017-rc/ --- Tests.2017/Tests.csproj | 7 ++++--- Tests.2017/packages.config | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Tests.2017/Tests.csproj b/Tests.2017/Tests.csproj index 67ea6501..3f660a39 100644 --- a/Tests.2017/Tests.csproj +++ b/Tests.2017/Tests.csproj @@ -86,6 +86,10 @@ True + + ..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll + True + ..\packages\System.AppContext.4.1.0\lib\net46\System.AppContext.dll @@ -167,9 +171,6 @@ ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.TypedParts.dll - - ..\packages\NUnit.3.0.1\lib\net45\nunit.framework.dll - ..\packages\System.Xml.XmlDocument.4.0.1\lib\net46\System.Xml.XmlDocument.dll True diff --git a/Tests.2017/packages.config b/Tests.2017/packages.config index f03b6a17..128a8d20 100644 --- a/Tests.2017/packages.config +++ b/Tests.2017/packages.config @@ -9,7 +9,8 @@ - + + From 1d43b8a5d812bd38ca980b3570cb75b7b628fb20 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sun, 11 Dec 2016 22:11:58 +0100 Subject: [PATCH 064/236] Updated some NuGet packages of Tests project, trying to solve FileLoadExceptions with VS 2017 variant. --- DocGenerator.2017/DocGenerator.csproj | 10 +++++----- DocGenerator.2017/app.config | 8 ++++++++ DocGenerator.2017/packages.config | 6 +++--- Tests.2017/Tests.csproj | 10 +++++----- Tests.2017/app.config | 6 +++++- Tests.2017/packages.config | 6 +++--- 6 files changed, 29 insertions(+), 17 deletions(-) diff --git a/DocGenerator.2017/DocGenerator.csproj b/DocGenerator.2017/DocGenerator.csproj index df75c1ca..e828a07b 100644 --- a/DocGenerator.2017/DocGenerator.csproj +++ b/DocGenerator.2017/DocGenerator.csproj @@ -87,8 +87,8 @@ ..\packages\System.AppContext.4.1.0\lib\net46\System.AppContext.dll True - - ..\packages\System.Collections.Immutable.1.2.0\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + + ..\packages\System.Collections.Immutable.1.3.0\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll True @@ -126,15 +126,15 @@ True - ..\packages\System.Security.Cryptography.Algorithms.4.2.0\lib\net461\System.Security.Cryptography.Algorithms.dll + ..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll True ..\packages\System.Security.Cryptography.Encoding.4.0.0\lib\net46\System.Security.Cryptography.Encoding.dll True - - ..\packages\System.Security.Cryptography.Primitives.4.0.0\lib\net46\System.Security.Cryptography.Primitives.dll + + ..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll True diff --git a/DocGenerator.2017/app.config b/DocGenerator.2017/app.config index 760f1b28..9ff67e97 100644 --- a/DocGenerator.2017/app.config +++ b/DocGenerator.2017/app.config @@ -11,6 +11,14 @@ + + + + + + + + diff --git a/DocGenerator.2017/packages.config b/DocGenerator.2017/packages.config index cc922ddb..4cdabe9e 100644 --- a/DocGenerator.2017/packages.config +++ b/DocGenerator.2017/packages.config @@ -12,7 +12,7 @@ - + @@ -39,9 +39,9 @@ - + - + diff --git a/Tests.2017/Tests.csproj b/Tests.2017/Tests.csproj index 3f660a39..4d3368af 100644 --- a/Tests.2017/Tests.csproj +++ b/Tests.2017/Tests.csproj @@ -95,8 +95,8 @@ ..\packages\System.AppContext.4.1.0\lib\net46\System.AppContext.dll True - - ..\packages\System.Collections.Immutable.1.2.0\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + + ..\packages\System.Collections.Immutable.1.3.0\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll True @@ -130,15 +130,15 @@ True - ..\packages\System.Security.Cryptography.Algorithms.4.2.0\lib\net461\System.Security.Cryptography.Algorithms.dll + ..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll True ..\packages\System.Security.Cryptography.Encoding.4.0.0\lib\net46\System.Security.Cryptography.Encoding.dll True - - ..\packages\System.Security.Cryptography.Primitives.4.0.0\lib\net46\System.Security.Cryptography.Primitives.dll + + ..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll True diff --git a/Tests.2017/app.config b/Tests.2017/app.config index 3389d7b9..7f87c86f 100644 --- a/Tests.2017/app.config +++ b/Tests.2017/app.config @@ -12,7 +12,7 @@ - + @@ -38,6 +38,10 @@ + + + + diff --git a/Tests.2017/packages.config b/Tests.2017/packages.config index 128a8d20..494b427e 100644 --- a/Tests.2017/packages.config +++ b/Tests.2017/packages.config @@ -14,7 +14,7 @@ - + @@ -41,9 +41,9 @@ - + - + From 219b884280245f21d0ab22e0abfa815f4eb926c3 Mon Sep 17 00:00:00 2001 From: CeddlyBurge Date: Thu, 29 Dec 2016 08:27:21 +0000 Subject: [PATCH 065/236] Add tests for ContractRequiresStringNotNullOrEmpty --- ...ntractRequiresStringNotNullOrEmptyTests.cs | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 Tests/CSharp/CodeRefactorings/ContractRequiresStringNotNullOrEmptyTests.cs diff --git a/Tests/CSharp/CodeRefactorings/ContractRequiresStringNotNullOrEmptyTests.cs b/Tests/CSharp/CodeRefactorings/ContractRequiresStringNotNullOrEmptyTests.cs new file mode 100644 index 00000000..a5c80d3b --- /dev/null +++ b/Tests/CSharp/CodeRefactorings/ContractRequiresStringNotNullOrEmptyTests.cs @@ -0,0 +1,158 @@ +using System; +using NUnit.Framework; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis; +using System.Collections.Immutable; +using RefactoringEssentials.CSharp.CodeRefactorings; + +namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings +{ + [TestFixture] + public class ContractRequiresStringNotNullOrEmptyTests : CSharpCodeRefactoringTestBase + { + [Test] + public void TestLambda() + { + Test(@"class Foo +{ + void Test () + { + var lambda = (string $s, int e) => { + }; + } +}", @"using System.Diagnostics.Contracts; + +class Foo +{ + void Test () + { + var lambda = (string s, int e) => { + Contract.Requires(string.IsNullOrEmpty(s) == false); + }; + } +}"); + } + + [Test] + public void TestAnonymousMethod() + { + Test(@"class Foo +{ + void Test () + { + var lambda = delegate(string $-[s]-, object e) { + }; + } +}", @"using System.Diagnostics.Contracts; + +class Foo +{ + void Test () + { + var lambda = delegate(string s, object e) { + Contract.Requires(string.IsNullOrEmpty(s) == false); + }; + } +}"); + } + + [Test] + public void TestContractAlreadyPresent() + { + TestWrongContext(@"class Foo +{ + void Test () + { + var lambda = (string $s, int e) => { + Contract.Requires(string.IsNullOrEmpty(s) == false); + }; + } +}"); + } + + [Test] + public void TestDifferentContractAlreadyPresent() + { + Test(@"class Foo +{ + void Test () + { + var lambda = (string $s, int e) => { + Contract.Requires(string.IsNullOrEmpty(notS) == false); + }; + } +}", @"using System.Diagnostics.Contracts; + +class Foo +{ + void Test () + { + var lambda = (string s, int e) => { + Contract.Requires(string.IsNullOrEmpty(s) == false); + Contract.Requires(string.IsNullOrEmpty(notS) == false); + }; + } +}"); + } + + [Test] + public void TestUsingStatementAlreadyPresent() + { + Test(@"using System.Diagnostics.Contracts; +class Foo +{ + void Test () + { + var lambda = (string $s, int e) => { + }; + } +}", @"using System.Diagnostics.Contracts; +class Foo +{ + void Test () + { + var lambda = (string s, int e) => { + Contract.Requires(string.IsNullOrEmpty(s) == false); + }; + } +}"); + } + + [Test] + public void TestPopupOnlyOnName() + { + TestWrongContext(@"class Foo +{ + void Test ($string param) + { + } +}"); + } + + [Test] + public void Test_OldCSharp() + { + var parseOptions = new CSharpParseOptions( + LanguageVersion.CSharp5, + DocumentationMode.Diagnose | DocumentationMode.Parse, + SourceCodeKind.Regular, + ImmutableArray.Create("DEBUG", "TEST") + ); + + Test(@"class Foo +{ + void Test (string $test) + { + } +}", @"using System.Diagnostics.Contracts; + +class Foo +{ + void Test (string test) + { + Contract.Requires(string.IsNullOrEmpty(test) == false); + } +}", parseOptions: parseOptions); + } + } +} From 29bb3d79415f356c8f2e4031d6f42845a2e5a0ff Mon Sep 17 00:00:00 2001 From: CeddlyBurge Date: Fri, 30 Dec 2016 18:42:20 +0000 Subject: [PATCH 066/236] Add implementation for ContractRequiresStringNotNullOrEmpty, fixes #209 --- .../RefactoringEssentials.csproj | 3 + ...EnsuresNotNullReturnRefactoringProvider.cs | 2 +- ...ngNotNullOrEmptyCodeRefactoringProvider.cs | 93 +++++++++++++++++++ .../CodeAnalyzers.CSharp.html | 3 +- .../CodeRefactorings.CSharp.html | 5 +- .../RefactoringEssentials.csproj | 1 + Tests.2017/Tests.csproj | 5 +- ...ntractRequiresStringNotNullOrEmptyTests.cs | 30 +++++- Tests/Tests.csproj | 1 + 9 files changed, 138 insertions(+), 5 deletions(-) create mode 100644 RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractRequiresStringNotNullOrEmptyCodeRefactoringProvider.cs diff --git a/RefactoringEssentials.2017/RefactoringEssentials.csproj b/RefactoringEssentials.2017/RefactoringEssentials.csproj index a56c0ba2..020c1fbb 100644 --- a/RefactoringEssentials.2017/RefactoringEssentials.csproj +++ b/RefactoringEssentials.2017/RefactoringEssentials.csproj @@ -169,6 +169,9 @@ CSharp\CodeRefactorings\Synced\ContractEnsuresNotNullReturnRefactoringProvider.cs + + CSharp\CodeRefactorings\Synced\ContractRequiresStringNotNullOrEmptyCodeRefactoringProvider.cs + CSharp\CodeRefactorings\Synced\ContractRequiresNotNullCodeRefactoringProvider.cs diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractEnsuresNotNullReturnRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractEnsuresNotNullReturnRefactoringProvider.cs index e5e251c5..58318ae7 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractEnsuresNotNullReturnRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractEnsuresNotNullReturnRefactoringProvider.cs @@ -51,7 +51,7 @@ protected IEnumerable GetActions(Document document, SyntaxNode root, protected IEnumerable GetActions(Document document, SyntaxNode root, AccessorDeclarationSyntax node) { - var propertyOrIndexerDeclaration = node.Ancestors().Where(n => n.GetType().Equals(typeof(PropertyDeclarationSyntax)) || n.GetType().Equals(typeof(IndexerDeclarationSyntax))).FirstOrDefault(); + var propertyOrIndexerDeclaration = node.Ancestors().FirstOrDefault(n => n.GetType().Equals(typeof(PropertyDeclarationSyntax)) || n.GetType().Equals(typeof(IndexerDeclarationSyntax))); var nullableType = propertyOrIndexerDeclaration.ChildNodes().OfType().FirstOrDefault(); diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractRequiresStringNotNullOrEmptyCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractRequiresStringNotNullOrEmptyCodeRefactoringProvider.cs new file mode 100644 index 00000000..68209283 --- /dev/null +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractRequiresStringNotNullOrEmptyCodeRefactoringProvider.cs @@ -0,0 +1,93 @@ +using System.Linq; +using System.Threading; +using System.Collections.Generic; +using Microsoft.CodeAnalysis.CodeRefactorings; +using Microsoft.CodeAnalysis; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis.CodeActions; +using Microsoft.CodeAnalysis.Text; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Simplification; +using Microsoft.CodeAnalysis.Formatting; + +namespace RefactoringEssentials.CSharp.CodeRefactorings +{ + [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Add a Contract to specify the string parameter must not be null or empty")] + /// + /// Creates a 'Contract.Requires(param != null);' contract for a parameter. + /// + public class ContractRequiresStringNotNullOrEmptyCodeRefactoringProvider : CodeContractsCodeRefactoringProvider + { + #region ICodeActionProvider implementation + public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) + { + var codeContractsContext = await CodeContractsContext(context); + if (codeContractsContext == null) + return; + + var foundNode = (ParameterSyntax)codeContractsContext.Node.AncestorsAndSelf().FirstOrDefault(n => n is ParameterSyntax); + if (foundNode == null) + return; + + foreach (var action in GetActions(codeContractsContext.Document, codeContractsContext.SemanticModel, codeContractsContext.Root, codeContractsContext.TextSpan, foundNode)) + context.RegisterRefactoring(action); + } + #endregion + + protected IEnumerable GetActions(Document document, SemanticModel semanticModel, SyntaxNode root, TextSpan span, ParameterSyntax node) + { + if (!node.Identifier.Span.Contains(span)) + yield break; + + var parameter = node; + var bodyStatement = parameter.Parent.Parent.ChildNodes().OfType().FirstOrDefault(); + if (bodyStatement == null) + yield break; + + var parameterSymbol = semanticModel.GetDeclaredSymbol(node); + var type = parameterSymbol.Type; + if (type.SpecialType != SpecialType.System_String || HasReturnContract(bodyStatement, parameterSymbol.Name)) + yield break; + + yield return CreateAction( + node.Identifier.Span + , t2 => { + var newBody = bodyStatement.WithStatements(SyntaxFactory.List(new[] { CreateContractRequiresCall(node.Identifier.ToString()) }.Concat(bodyStatement.Statements))); + + var newRoot = (CompilationUnitSyntax)root.ReplaceNode((SyntaxNode)bodyStatement, newBody); + + if (UsingStatementNotPresent(newRoot)) newRoot = AddUsingStatement(node, newRoot); + + return Task.FromResult(document.WithSyntaxRoot(newRoot)); + } + , "Add contract requiring parameter must not be null or empty" + ); + } + + static StatementSyntax CreateContractRequiresCall(string parameterName) + { + return SyntaxFactory.ParseStatement($"Contract.Requires(string.IsNullOrEmpty({parameterName}) == false);\r\n").WithAdditionalAnnotations(Formatter.Annotation, Simplifier.Annotation); + } + + static bool HasReturnContract(BlockSyntax bodyStatement, string parameterName) + { + var workspace = new AdhocWorkspace(); + + foreach (var expression in bodyStatement.DescendantNodes().OfType()) + { + var formatted = Formatter.Format(expression, workspace).ToString(); + + if (formatted == $"Contract.Requires(string.IsNullOrEmpty({parameterName}) == false);") + return true; + + if (formatted == $"Contract.Requires(false == string.IsNullOrEmpty({parameterName}));") + return true; + + if (formatted == $"Contract.Requires(!string.IsNullOrEmpty({parameterName}));") + return true; + } + return false; + } + } +} diff --git a/RefactoringEssentials/CodeAnalyzers.CSharp.html b/RefactoringEssentials/CodeAnalyzers.CSharp.html index 2cba20b8..1fdf8bef 100644 --- a/RefactoringEssentials/CodeAnalyzers.CSharp.html +++ b/RefactoringEssentials/CodeAnalyzers.CSharp.html @@ -15,7 +15,7 @@ -->

              Supported Code Analyzers

              -

              119 code analyzers for C#

              +

              120 code analyzers for C#

              • Suggests using the class declaring a static function when calling it (AccessToStaticMemberViaDerivedTypeAnalyzer)
              • When initializing explicitly typed local variable or array type, array creation expression can be replaced with array initializer. (ArrayCreationCanBeReplacedWithArrayInitializerAnalyzer)
              • @@ -131,6 +131,7 @@

                Supported Code Analyzers

              • Warns when a culture-aware 'IndexOf' call is used by default. (StringIndexOfIsCultureSpecificAnalyzer)
              • Warns when a culture-aware 'LastIndexOf' call is used by default. (StringLastIndexOfIsCultureSpecificAnalyzer)
              • Warns when a culture-aware 'StartsWith' call is used by default. (StringStartsWithIsCultureSpecificAnalyzer)
              • +
              • Use 'var' keyword when possible (SuggestUseVarKeywordEvidentAnalyzer)
              • [ThreadStatic] doesn't work with instance fields (ThreadStaticAtInstanceFieldAnalyzer)
              • Parameter is never used (UnusedParameterAnalyzer)
              • Type parameter is never used (UnusedTypeParameterAnalyzer)
              • diff --git a/RefactoringEssentials/CodeRefactorings.CSharp.html b/RefactoringEssentials/CodeRefactorings.CSharp.html index 7480f7ee..085072c3 100644 --- a/RefactoringEssentials/CodeRefactorings.CSharp.html +++ b/RefactoringEssentials/CodeRefactorings.CSharp.html @@ -15,7 +15,7 @@ -->

                Supported Refactorings

                -

                101 code refactorings for C#

                +

                104 code refactorings for C#

                • Adds another accessor (AddAnotherAccessorCodeRefactoringProvider)
                • Add braces (AddBracesCodeRefactoringProvider)
                • @@ -34,6 +34,7 @@

                  Supported Refactorings

                • Compute constant value (ComputeConstantValueCodeRefactoringProvider)
                • Add a Contract to specify the return value must not be null (ContractEnsuresNotNullReturnCodeRefactoringProvider)
                • Add a Contract to specify the parameter must not be null (ContractRequiresNotNullCodeRefactoringProvider)
                • +
                • Add a Contract to specify the string parameter must not be null or empty (ContractRequiresStringNotNullOrEmptyCodeRefactoringProvider)
                • Convert anonymous method to lambda expression (ConvertAnonymousMethodToLambdaCodeRefactoringProvider)
                • Convert auto-property to computed propertyy (ConvertAutoPropertyToPropertyCodeRefactoringProvider)
                • Replace bitwise flag comparison with call to 'Enum.HasFlag' (ConvertBitwiseFlagComparisonToHasFlagsCodeRefactoringProvider)
                • @@ -102,10 +103,12 @@

                  Supported Refactorings

                • Replace assignment with postfix expression (ReplaceAssignmentWithPostfixExpressionCodeRefactoringProvider)
                • Replace auto-property with property that uses a backing field (ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider)
                • Convert cast to 'as'. (ReplaceDirectCastWithSafeCastCodeRefactoringProvider)
                • +
                • Replace type with 'var' (ReplaceExplicitTypeWithVarCodeRefactoringProvider)
                • Replace operator assignment with assignment (ReplaceOperatorAssignmentWithAssignmentCodeRefactoringProvider)
                • Replace postfix expression with assignment (ReplacePostfixExpressionWithAssignmentCodeRefactoringProvider)
                • Replace property that uses a backing field with auto-property (ReplacePropertyWithBackingFieldWithAutoPropertyCodeRefactoringProvider)
                • Convert 'as' to cast. (ReplaceSafeCastWithDirectCastCodeRefactoringProvider)
                • +
                • Replaces 'var' with explicit type specification (ReplaceVarWithExplicitTypeCodeRefactoringProvider)
                • Replace assignment with operator assignment (ReplaceWithOperatorAssignmentCodeRefactoringProvider)
                • Reverse the direction of a for (ReverseDirectionForForLoopCodeRefactoringProvider)
                • Split declaration list (SplitDeclarationListCodeRefactoringProvider)
                • diff --git a/RefactoringEssentials/RefactoringEssentials.csproj b/RefactoringEssentials/RefactoringEssentials.csproj index 2203b1c4..919a3118 100644 --- a/RefactoringEssentials/RefactoringEssentials.csproj +++ b/RefactoringEssentials/RefactoringEssentials.csproj @@ -58,6 +58,7 @@ + diff --git a/Tests.2017/Tests.csproj b/Tests.2017/Tests.csproj index 4d3368af..7209b6c2 100644 --- a/Tests.2017/Tests.csproj +++ b/Tests.2017/Tests.csproj @@ -287,7 +287,10 @@ CSharp\CodeRefactorings\ContractEnsuresNotNullReturnTests.cs - + + CSharp\CodeRefactorings\ContractRequiresNotNullTests.cs + + CSharp\CodeRefactorings\ContractRequiresNotNullTests.cs diff --git a/Tests/CSharp/CodeRefactorings/ContractRequiresStringNotNullOrEmptyTests.cs b/Tests/CSharp/CodeRefactorings/ContractRequiresStringNotNullOrEmptyTests.cs index a5c80d3b..79657762 100644 --- a/Tests/CSharp/CodeRefactorings/ContractRequiresStringNotNullOrEmptyTests.cs +++ b/Tests/CSharp/CodeRefactorings/ContractRequiresStringNotNullOrEmptyTests.cs @@ -57,7 +57,7 @@ void Test () } [Test] - public void TestContractAlreadyPresent() + public void TestContractAlreadyPresentEqualsFalseFormat() { TestWrongContext(@"class Foo { @@ -70,6 +70,34 @@ void Test () }"); } + [Test] + public void TestContractAlreadyPresentFalseEqualsFormat() + { + TestWrongContext(@"class Foo +{ + void Test () + { + var lambda = (string $s, int e) => { + Contract.Requires(false==string.IsNullOrEmpty(s)); + }; + } +}"); + } + + [Test] + public void TestContractAlreadyPresentNegateFormat() + { + TestWrongContext(@"class Foo +{ + void Test () + { + var lambda = (string $s, int e) => { + Contract.Requires(!string.IsNullOrEmpty(s)); + }; + } +}"); + } + [Test] public void TestDifferentContractAlreadyPresent() { diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index 64c27dcb..56bb8497 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -135,6 +135,7 @@ + From f1b429faaf97f3bcf62f78f0ca179467f2ac0acc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Mon, 16 Jan 2017 08:59:42 +0100 Subject: [PATCH 067/236] Fixed 'Bug 51543 - Editor wrongly suggests a fix for extern static functions in DllImport' --- ...irtualConversionCodeRefactoringProvider.cs | 3 ++- .../FieldCanBeMadeReadOnlyTests.cs | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs index d4f56165..d28bd791 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs @@ -42,7 +42,8 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte if (declaration == null || declaration is BaseTypeDeclarationSyntax || declaration is ConstructorDeclarationSyntax - || declaration is DestructorDeclarationSyntax) + || declaration is DestructorDeclarationSyntax + || declaration.GetBodies().IsEmpty()) return; var modifiers = declaration.GetModifiers(); if (modifiers.Any(m => m.IsKind(SyntaxKind.OverrideKeyword))) diff --git a/Tests/CSharp/Diagnostics/FieldCanBeMadeReadOnlyTests.cs b/Tests/CSharp/Diagnostics/FieldCanBeMadeReadOnlyTests.cs index 4961f2fb..e9346140 100644 --- a/Tests/CSharp/Diagnostics/FieldCanBeMadeReadOnlyTests.cs +++ b/Tests/CSharp/Diagnostics/FieldCanBeMadeReadOnlyTests.cs @@ -338,6 +338,29 @@ public static void Main(string[] args) } "); } + + [Test] + public void TestComments() + { + Analyze(@"class Test +{ + /// test + object $fooBar$ = new object(); + public static void Main(string[] args) + { + Console.WriteLine(fooBar); + } +}", @"class Test +{ + /// test + readonly object fooBar = new object(); + public static void Main(string[] args) + { + Console.WriteLine(fooBar); + } +}"); + } + } } From b80fa98dffe1485d8ecf91afac256dc61a371bcb Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Mon, 30 Jan 2017 17:09:59 +0100 Subject: [PATCH 068/236] Move to xUnit test framework --- BuildTools/Program.cs | 4 - BuildTools/Properties/AssemblyInfo.cs | 1 - Demonstration/CommandLineSwitchParser.cs | 8 +- Demonstration/Program.cs | 4 - Demonstration/Properties/AssemblyInfo.cs | 1 - DocGenerator/Program.cs | 4 +- DocGenerator/Properties/AssemblyInfo.cs | 2 - .../AddNullCheckCodeRefactoringProvider.cs | 9 +- ...EnsuresNotNullReturnRefactoringProvider.cs | 5 +- ...tRequiresNotNullCodeRefactoringProvider.cs | 3 +- ...oSwitchStatementCodeRefactoringProvider.cs | 4 +- ...ceToStaticMethodCodeRefactoringProvider.cs | 9 +- .../Synced/InvertIfCodeRefactoringProvider.cs | 3 +- .../Synced/MergeNestedIfAction.cs | 3 +- ...nvertIfStatementToReturnStatementAction.cs | 3 +- .../Uncategorized/CreateDelegateAction.cs | 18 +- ...tAnonymousMethodCodeRefactoringProvider.cs | 3 +- .../Uncategorized/PutInsideUsingAction.cs | 3 +- .../CSharp/Converter/MethodBodyVisitor.cs | 2 - .../CSharp/Converter/NodesVisitor.cs | 2 - .../CSharp/Converter/VisualBasicConverter.cs | 2 - .../ParameterOnlyAssignedCodeFixProvider.cs | 4 +- ...rControlVariableIsNeverModifiedAnalyzer.cs | 3 +- .../FunctionNeverReturnsAnalyzer.cs | 4 +- ...odOverloadWithOptionalParameterAnalyzer.cs | 3 +- ...tialMethodParameterNameMismatchAnalyzer.cs | 3 +- ...lTernaryToNullCoalescingCodeFixProvider.cs | 4 +- ...ertIfStatementToSwitchStatementAnalyzer.cs | 3 +- ...atementToSwitchStatementCodeFixProvider.cs | 3 +- ...tNullCoalescingConditionCodeFixProvider.cs | 3 +- .../RedundantCheckBeforeAssignmentAnalyzer.cs | 29 ++-- ...antCheckBeforeAssignmentCodeFixProvider.cs | 2 - ...tCommaInArrayInitializerCodeFixProvider.cs | 3 +- ...edundantDelegateCreationCodeFixProvider.cs | 4 +- ...dundantExplicitArraySizeCodeFixProvider.cs | 4 +- ...ExplicitNullableCreationCodeFixProvider.cs | 3 +- .../RedundantIfElseBlockCodeFixProvider.cs | 3 +- ...ndantObjectCreationArgumentListAnalyzer.cs | 3 +- ...jectCreationArgumentListCodeFixProvider.cs | 5 +- .../RedundantStringToCharArrayCallAnalyzer.cs | 3 +- ...antStringToCharArrayCallCodeFixProvider.cs | 4 +- .../RedundantToStringCallAnalyzer.cs | 3 +- .../RedundantToStringCallCodeFixProvider.cs | 3 +- ...tDefaultFieldInitializerCodeFixProvider.cs | 3 +- .../UnusedParameterAnalyzer.cs | 3 +- .../UnusedTypeParameterAnalyzer.cs | 4 +- .../CSharp/SyntaxExtensions.cs | 9 +- .../CodeAnalyzers.CSharp.html | 3 +- .../CodeRefactorings.CSharp.html | 4 +- .../Common/RoslynReflectionUsageAttribute.cs | 12 +- .../Converter/CodeWithOptions.cs | 4 +- .../Converter/ConversionResult.cs | 4 +- .../Properties/AssemblyInfo.cs | 1 - .../Properties/AssemblyInfoBase.cs | 1 - .../Samples/CSharp/SampleCodeFixProvider.cs | 7 +- .../CSharp/SampleCodeRefactoringProvider.cs | 13 +- .../Util/Analysis/ControlFlow.cs | 9 +- RefactoringEssentials/Util/CaseCorrector.cs | 3 +- .../Util/ExpressionSyntaxExtensions.cs | 3 +- .../Util/Flow/FlowAnalysis.cs | 3 +- .../Util/Flow/FlowAnalyzer.cs | 12 +- .../Util/Flow/FlowLocation.cs | 6 +- RefactoringEssentials/Util/Flow/FlowState.cs | 10 +- .../Util/Flow/NullFlowState.cs | 6 +- RefactoringEssentials/Util/NameGenerator.cs | 3 +- .../Util/NameProposalService.cs | 5 +- .../Util/ReflectionNamespaces.cs | 8 +- .../Util/RoslynReflection.cs | 10 +- .../Util/SyntaxNodeExtensions.cs | 3 +- RefactoringEssentials/Util/TypeExtensions.cs | 3 +- ...dCheckForNothingCodeRefactoringProvider.cs | 9 +- ...ectCaseStatementCodeRefactoringProvider.cs | 3 +- .../VB/Converter/CSharpConverter.cs | 3 +- .../VB/Converter/ConversionExtensions.cs | 4 +- .../VB/Converter/MethodBodyVisitor.cs | 4 +- .../VB/Converter/NodesVisitor.cs | 5 +- RefactoringEssentials/Xml/AXmlAttribute.cs | 1 - RefactoringEssentials/Xml/AXmlDocument.cs | 2 - RefactoringEssentials/Xml/AXmlObject.cs | 1 - RefactoringEssentials/Xml/AXmlParser.cs | 3 - RefactoringEssentials/Xml/AXmlTag.cs | 1 - RefactoringEssentials/Xml/AXmlText.cs | 1 - RefactoringEssentials/Xml/AXmlVisitor.cs | 2 - .../Xml/IncrementalParserState.cs | 1 - RefactoringEssentials/Xml/InternalDocument.cs | 1 - RefactoringEssentials/Xml/LazyInit.cs | 7 +- RefactoringEssentials/Xml/Log.cs | 1 - RefactoringEssentials/Xml/ObjectIterator.cs | 1 - .../Xml/ReuseEqualityComparer.cs | 1 - .../Xml/TagMatchingHeuristics.cs | 2 - RefactoringEssentials/Xml/TagReader.cs | 1 - RefactoringEssentials/Xml/TextType.cs | 1 - RefactoringEssentials/Xml/TreeTraversal.cs | 12 +- ...S0108UseNewKeywordIfHidingIntendedTests.cs | 27 ++- .../CS0152DuplicateCaseLabelValueTests.cs | 9 +- .../CS0164LabelHasNotBeenReferencedTests.cs | 5 +- .../CS0759RedundantPartialMethodTests.cs | 5 +- ...xtensionMethodMustBeDeclaredStaticTests.cs | 5 +- .../CS1520MethodMustHaveAReturnTypeTests.cs | 9 +- .../CSharp/CodeFixes/CSharpCodeFixTestBase.cs | 10 +- .../CodeFixes/InvalidConversionTests.cs | 31 ++-- ...owedByAnyExpressionCodeFixProviderTests.cs | 9 +- .../CSharp/CodeFixes/UnreachableCodeTests.cs | 45 ++--- .../AddAnotherAccessorTests.cs | 15 +- .../CodeRefactorings/AddArgumentNameTests.cs | 25 ++- .../CSharp/CodeRefactorings/AddBracesTests.cs | 28 ++- .../AddCatchExceptionTests.cs | 14 +- .../AddExceptionDescriptionTests.cs | 13 +- .../CodeRefactorings/AddNullCheckTests.cs | 65 ++++--- .../AddOptionalParameterToInvocationTests.cs | 19 +- .../CodeRefactorings/AutoLinqSumTests.cs | 97 ++++++----- .../CSharpCodeRefactoringTestBase.cs | 12 +- .../ChangeAccessModifierTests.cs | 31 ++-- .../CheckArrayIndexValueTests.cs | 7 +- .../CheckCollectionIndexValueTests.cs | 7 +- .../CheckDictionaryKeyValueTests.cs | 10 +- .../CheckIfParameterIsNullTests.cs | 24 ++- .../CheckStringBuilderIndexValueTests.cs | 7 +- .../CheckStringIndexValueTests.cs | 7 +- .../ComputeConstantValueTests.cs | 31 ++-- .../ContractEnsuresNotNullReturnTests.cs | 39 ++--- .../ContractRequiresNotNullTests.cs | 21 ++- .../ConvertAnonymousMethodToLambdaTests.cs | 9 +- .../ConvertAutoPropertyToPropertyTests.cs | 8 +- ...ertBitwiseFlagComparisonToHasFlagsTests.cs | 17 +- ...tCoalescingToConditionalExpressionTests.cs | 9 +- .../CodeRefactorings/ConvertDecToHexTests.cs | 7 +- .../ConvertDoWhileToWhileLoopTests.cs | 11 +- .../ConvertEqualityOperatorToEqualsTests.cs | 9 +- ...tEqualityOperatorToReferenceEqualsTests.cs | 11 +- .../ConvertEqualsToEqualityOperatorTests.cs | 13 +- ...rtExplicitToImplicitImplementationTests.cs | 25 ++- ...nvertExpressionBodyToStatementBodyTests.cs | 7 +- .../ConvertForToWhileTests.cs | 18 +- .../ConvertForeachToForTests.cs | 23 ++- ...ertHasFlagsToBitwiseFlagComparisonTests.cs | 9 +- .../CodeRefactorings/ConvertHexToDecTests.cs | 7 +- ...mentToConditionalTernaryExpressionTests.cs | 24 ++- ...ntToNullCoalescingExpressionActionTests.cs | 23 ++- ...IfStatementToReturnStatementActionTests.cs | 19 +- ...onvertIfStatementToSwitchStatementTests.cs | 31 ++-- ...tImplicitToExplicittImplementationTests.cs | 21 ++- ...tanceToStaticMethodCodeRefactoringTests.cs | 29 ++-- ...rtInterpolatedStringToStringFormatTests.cs | 11 +- ...ertLambdaBodyExpressionToStatementTests.cs | 17 +- ...ConvertLambdaStatementToExpressionTests.cs | 11 +- .../ConvertLamdaToAnonymousMethodTests.cs | 15 +- ...onvertMethodGroupToAnonymousMethodTests.cs | 13 +- .../ConvertMethodGroupToLambdaTests.cs | 15 +- .../ConvertMultiplyToShiftTests.cs | 9 +- ...tReferenceEqualsToEqualityOperatorTests.cs | 13 +- .../ConvertShiftToMultiplyTests.cs | 7 +- ...nvertStatementBodyToExpressionBodyTests.cs | 29 ++-- ...rtStringFormatToInterpolatedStringTests.cs | 12 +- .../ConvertSwitchToIfTests.cs | 17 +- ...IfStatementCodeRefactoringProviderTests.cs | 17 +- .../ConvertWhileToDoWhileLoopTests.cs | 13 +- .../CopyCommentsFromBaseTests.cs | 23 ++- .../CreateChangedEventTests.cs | 13 +- .../CreateCustomEventImplementationTests.cs | 9 +- .../CodeRefactorings/CreateDelegateTests.cs | 69 ++++---- .../CreateEventInvocatorTests.cs | 17 +- .../CodeRefactorings/CreateIndexerTests.cs | 16 +- .../CreateOverloadWithoutParameterTests.cs | 25 ++- .../ExtractAnonymousMethodTests.cs | 15 +- ...hileConditionToInternalIfStatementTests.cs | 11 +- .../FlipEqualsTargetAndArgumentTests.cs | 19 +- .../CodeRefactorings/FlipOperatorArguments.cs | 7 +- .../FlipRelationalOperatorArgumentsTests.cs | 11 +- .../CodeRefactorings/GenerateGetterTests.cs | 10 +- .../GenerateSwitchLabelsTests.cs | 7 +- .../ImportStaticClassWithUsingTests.cs | 15 +- ...toPropertyFromConstructorParameterTests.cs | 5 +- ...alizeFieldFromConstructorParameterTests.cs | 5 +- .../InsertAnonymousMethodSignatureTests.cs | 7 +- .../IntroduceConstantTests.cs | 17 +- .../IntroduceFormatItemTests.cs | 11 +- .../InvertConditionalOperatorTests.cs | 13 +- .../CSharp/CodeRefactorings/InvertIfTests.cs | 20 +-- .../InvertLogicalExpressionTests.cs | 23 ++- .../InvokeAsStaticMethodTests.cs | 13 +- .../IterateViaForeachTests.cs | 33 ++-- ...alVariableDeclarationAndAssignmentTests.cs | 9 +- .../CodeRefactorings/JoinStringTests.cs | 19 +- .../LinqFluentToQueryTests.cs | 47 +++-- .../LinqQueryToFluentTests.cs | 83 +++++---- .../CodeRefactorings/MergeNestedIfTests.cs | 21 ++- .../CodeRefactorings/MoveToOuterScopeTests.cs | 17 +- .../NegateIsExpressionTests.cs | 7 +- .../NegateLogicalExpressionTests.cs | 17 +- .../CodeRefactorings/PutInsideUsingTests.cs | 31 ++-- .../CodeRefactorings/RemoveBracesTests.cs | 43 +++-- .../RemoveCatchExceptionTests.cs | 15 +- .../RemoveRegionEndRegionDirectivesTests.cs | 9 +- ...aceAssignmentWithPostfixExpressionTests.cs | 12 +- ...ropertyWithPropertyAndBackingFieldTests.cs | 19 +- .../ReplaceDirectCastWithSafeCastTest.cs | 13 +- .../ReplaceExplicitTypeWithVarTests.cs | 19 +- ...ceOperatorAssignmentWithAssignmentTests.cs | 7 +- ...acePostfixExpressionWithAssignmentTests.cs | 10 +- ...tyWithBackingFieldWithAutoPropertyTests.cs | 23 ++- .../ReplaceSafeCastWithDirectCastTests.cs | 13 +- .../ReplaceVarWithExplicitTypeTests.cs | 19 +- .../ReplaceWithOperatorAssignmentTests.cs | 5 +- .../ReverseDirectionForForLoopTests.cs | 36 ++-- .../SplitIfWithAndConditionInTwoTests.cs | 11 +- .../SplitIfWithOrConditionInTwoTests.cs | 9 +- ...alVariableDeclarationAndAssignmentTests.cs | 33 ++-- .../CodeRefactorings/SplitStringTests.cs | 11 +- .../SplitVariableIntoSeveralOnesTests.cs | 15 +- ...bstractVirtualNonVirtualConversionTests.cs | 49 +++--- .../UseAsAndNullCheckTests.cs | 31 ++-- .../CodeRefactorings/UseStringFormatTests.cs | 163 +++++++++--------- .../UseSystemEnvironmentNewLineTests.cs | 9 +- .../UseSystemStringEmptyTests.cs | 7 +- ...AccessToStaticMemberViaDerivedTypeTests.cs | 25 ++- .../Diagnostics/AdditionalOfTypeTests.cs | 10 +- ...nCanBeReplacedWithArrayInitializerTests.cs | 17 +- .../CSharp/Diagnostics/AvoidAsyncVoidTests.cs | 11 +- .../Diagnostics/BaseMemberHasParamsTests.cs | 9 +- ...BaseMethodCallWithDefaultParameterTests.cs | 13 +- .../BaseMethodParameterNameMismatchTests.cs | 9 +- .../BitwiseOperatorOnEnumWithoutFlagsTests.cs | 38 ++-- ...1573ParameterHasNoMatchingParamTagTests.cs | 12 +- .../Diagnostics/CSharpDiagnosticTestBase.cs | 2 +- .../CallToObjectEqualsViaBaseTests.cs | 9 +- .../CSharp/Diagnostics/CheckNamespaceTests.cs | 14 +- ...mpareNonConstrainedGenericWithNullTests.cs | 11 +- .../CompareOfFloatsByEqualityOperatorTests.cs | 17 +- .../ConditionIsAlwaysTrueOrFalseTests.cs | 25 ++- .../ConditionalTernaryEqualBranchTests.cs | 18 +- .../Diagnostics/ConstantConditionTests.cs | 15 +- .../ConstantNullCoalescingConditionTests.cs | 19 +- .../ConvertClosureToMethodGroupTests.cs | 45 +++-- ...ConditionalTernaryToNullCoalescingTests.cs | 27 ++- .../Diagnostics/ConvertIfDoToWhileTests.cs | 11 +- ...onvertIfStatementToSwitchStatementTests.cs | 29 ++-- .../ConvertIfToAndExpressionTests.cs | 27 ++- .../ConvertIfToOrExpressionTests.cs | 31 ++-- .../ConvertNullableToShortFormTests.cs | 17 +- .../Diagnostics/ConvertToAutoPropertyTests.cs | 20 +-- .../Diagnostics/ConvertToConstantTests.cs | 50 +++--- .../ConvertToLambdaExpressionTests.cs | 20 +-- .../Diagnostics/ConvertToStaticTypeTests.cs | 25 ++- .../Diagnostics/DelegateSubtractionTests.cs | 13 +- ...allOverridableMethodsInConstructorTests.cs | 41 +++-- .../DoubleNegationOperatorTests.cs | 9 +- .../Diagnostics/EmptyConstructorTests.cs | 15 +- .../Diagnostics/EmptyDestructorTests.cs | 12 +- .../EmptyEmbeddedStatementTests.cs | 9 +- .../EmptyGeneralCatchClauseTests.cs | 15 +- .../CSharp/Diagnostics/EmptyNamespaceTests.cs | 18 +- .../Diagnostics/EmptyStatementIssueTests.cs | 11 +- .../EnumUnderlyingTypeIsIntTests.cs | 13 +- .../EqualExpressionComparisonTests.cs | 17 +- ...UnsubscriptionViaAnonymousDelegateTests.cs | 9 +- .../FieldCanBeMadeReadOnlyTests.cs | 42 +++-- .../ForCanBeConvertedToForeachTests.cs | 20 +-- .../ForControlVariableIsNeverModifiedTests.cs | 15 +- .../ForStatementConditionIsTrueTests.cs | 9 +- .../Diagnostics/FormatStringProblemTests.cs | 35 ++-- .../Diagnostics/FunctionNeverReturnsTests.cs | 79 +++++---- .../LocalVariableHidesMemberTests.cs | 27 ++- .../LocalVariableNotUsedIssueTests.cs | 14 +- Tests/CSharp/Diagnostics/LockThisTests.cs | 50 +++--- .../LongLiteralEndingLowerLTests.cs | 15 +- .../Diagnostics/MemberCanBeMadeStaticTests.cs | 38 ++-- .../MemberHidesStaticFromOuterClassTests.cs | 7 +- ...ethodOverloadWithOptionalParameterTests.cs | 19 +- .../Diagnostics/NameOfSuggestionTests.cs | 9 +- .../NegativeRelationalExpressionTests.cs | 24 ++- .../NonPublicMethodWithTestAttributeTests.cs | 14 +- ...NonReadonlyReferencedInGetHashCodeTests.cs | 17 +- .../NotImplementedExceptionInspectorTests.cs | 5 +- .../Diagnostics/NotResolvedInTextTests.cs | 45 +++-- .../ObjectCreationAsStatementTests.cs | 9 +- .../Diagnostics/OperatorIsCanBeUsedTests.cs | 15 +- ...OptionalParameterHierarchyMismatchTests.cs | 28 ++- .../OptionalParameterRefOutTests.cs | 9 +- ...eterCanBeDeclaredWithBaseTypeIssueTests.cs | 76 ++++---- .../Diagnostics/ParameterHidesMemberTests.cs | 31 ++-- .../Diagnostics/ParameterOnlyAssignedTests.cs | 13 +- ...PartialMethodParameterNameMismatchTests.cs | 9 +- .../PartialTypeWithSinglePartTests.cs | 17 +- ...olymorphicFieldLikeEventInvocationTests.cs | 10 +- .../PossibleAssignmentToReadonlyFieldTests.cs | 18 +- .../PossibleMistakenCallToGetTypeTests.cs | 9 +- .../PossibleMultipleEnumerationTests.cs | 70 ++++---- .../PublicConstructorInAbstractClassTests.cs | 11 +- ...RedundantAnonymousTypePropertyNameTests.cs | 9 +- .../RedundantArgumentDefaultValueTests.cs | 41 ++--- .../Diagnostics/RedundantArgumentNameTests.cs | 19 +- .../RedundantAssignmentIssueTests.cs | 50 +++--- .../RedundantAttributeParenthesesTests.cs | 11 +- .../RedundantBaseConstructorTests.cs | 7 +- .../RedundantBaseQualifierTests.cs | 11 +- .../Diagnostics/RedundantBoolCompareTests.cs | 12 +- .../Diagnostics/RedundantCaseLabelTests.cs | 9 +- .../Diagnostics/RedundantCatchClauseTests.cs | 28 ++- .../RedundantCheckBeforeAssignmentTests.cs | 47 +++-- .../RedundantCommaInArrayInitializerTests.cs | 17 +- .../RedundantComparisonWithNullTests.cs | 17 +- .../RedundantDefaultFieldInitializerTests.cs | 25 ++- .../RedundantDelegateCreationTests.cs | 13 +- .../RedundantEmptyDefaultSwitchBranchTests.cs | 17 +- .../RedundantEmptyFinallyBlockTests.cs | 11 +- .../RedundantEnumerableCastCallTests.cs | 16 +- .../RedundantExplicitArrayCreationTests.cs | 12 +- .../RedundantExplicitArraySizeTests.cs | 13 +- .../RedundantExplicitNullableCreationTests.cs | 16 +- .../RedundantExtendsListEntryTests.cs | 12 +- .../Diagnostics/RedundantIfElseBlockTests.cs | 25 ++- .../RedundantInternalInspectorTests.cs | 11 +- .../RedundantLambdaParameterTypeTests.cs | 16 +- ...edundantLambdaSignatureParenthesesTests.cs | 14 +- ...ogicalConditionalExpressionOperandTests.cs | 16 +- ...edundantObjectCreationArgumentListTests.cs | 9 +- ...ndantObjectOrCollectionInitializerTests.cs | 12 +- .../RedundantOverriddenMemberTests.cs | 30 ++-- .../RedundantPrivateInspectorTests.cs | 9 +- .../RedundantStringToCharArrayCallTests.cs | 13 +- .../RedundantTernaryExpressionTests.cs | 9 +- .../Diagnostics/RedundantToStringCallTests.cs | 53 +++--- .../RedundantUnsafeContextTests.cs | 19 +- .../ReferenceEqualsWithValueTypeTests.cs | 12 +- .../RemoveRedundantOrStatementTests.cs | 9 +- .../ReplaceWithFirstOrDefaultTests.cs | 11 +- .../ReplaceWithLastOrDefaultTests.cs | 11 +- .../Diagnostics/ReplaceWithOfTypeAnyTests.cs | 11 +- .../ReplaceWithOfTypeCountTests.cs | 11 +- .../ReplaceWithOfTypeFirstOrDefaultTests.cs | 11 +- .../ReplaceWithOfTypeFirstTests.cs | 11 +- .../ReplaceWithOfTypeLastOrDefaultTests.cs | 11 +- .../Diagnostics/ReplaceWithOfTypeLastTests.cs | 11 +- .../ReplaceWithOfTypeLongCountTests.cs | 11 +- .../ReplaceWithOfTypeSingleOrDefaultTests.cs | 11 +- .../ReplaceWithOfTypeSingleTests.cs | 11 +- .../Diagnostics/ReplaceWithOfTypeTests.cs | 17 +- .../ReplaceWithOfTypeWhereTests.cs | 9 +- .../ReplaceWithSimpleAssignmentTests.cs | 9 +- .../ReplaceWithSingleCallToCountTests.cs | 7 +- ...laceWithSingleCallToFirstOrDefaultTests.cs | 7 +- .../ReplaceWithSingleCallToFirstTests.cs | 7 +- ...placeWithSingleCallToLastOrDefaultTests.cs | 7 +- .../ReplaceWithSingleCallToLastTests.cs | 7 +- .../ReplaceWithSingleCallToLongCountTests.cs | 7 +- ...aceWithSingleCallToSingleOrDefaultTests.cs | 7 +- .../ReplaceWithSingleCallToSingleTests.cs | 7 +- .../ReplaceWithStringIsNullOrEmptyTests.cs | 71 ++++---- Tests/CSharp/Diagnostics/RoslynUsageTests.cs | 23 ++- .../SealedMemberInSealedClassTests.cs | 11 +- ...mplifyConditionalTernaryExpressionTests.cs | 23 ++- .../StaticConstructorParameterTests.cs | 70 ++++---- .../StaticEventSubscriptionTests.cs | 16 +- ...icFieldOrAutoPropertyInGenericTypeTests.cs | 25 ++- ...ocationToExtensionMethodInvocationTests.cs | 31 ++-- .../StringCompareIsCultureSpecificTests.cs | 27 ++- .../StringCompareToIsCultureSpecificTests.cs | 9 +- .../StringEndsWithIsCultureSpecificTests.cs | 11 +- .../StringIndexOfIsCultureSpecificTests.cs | 13 +- ...StringLastIndexOfIsCultureSpecificTests.cs | 9 +- .../StringStartsWithIsCultureSpecificTests.cs | 7 +- .../SuggestUseVarKeywordEvidentTests.cs | 33 ++-- .../ThreadStaticAtInstanceFieldTests.cs | 17 +- .../UnusedAnonymousMethodSignatureTests.cs | 14 +- .../Diagnostics/UnusedParameterTests.cs | 45 +++-- .../Diagnostics/UnusedTypeParameterTests.cs | 15 +- .../UseArrayCreationExpressionTests.cs | 10 +- .../CSharp/Diagnostics/UseIsOperatorTests.cs | 10 +- Tests/CSharp/Diagnostics/UseMethodAnyTests.cs | 28 ++- .../UseMethodIsInstanceOfTypeTests.cs | 8 +- .../Diagnostics/ValueParameterNotUsedTests.cs | 25 ++- Tests/CSharp/Diagnostics/XmlDocTests.cs | 29 ++-- Tests/Common/CodeFixTestBase.cs | 10 +- Tests/Common/CodeRefactoringTestBase.cs | 8 +- Tests/Common/ConverterTestBase.cs | 7 +- Tests/Common/DiagnosticTestBase.cs | 49 +++--- Tests/Common/Utils.cs | 8 +- Tests/Properties/AssemblyInfo.cs | 2 - .../CSharp/SampleCodeRefactoringTests.cs | 16 +- Tests/SymbolChecksTest.cs | 78 ++++----- Tests/Tests.csproj | 19 +- .../AddAnotherAccessorTests.cs | 11 +- .../AddCheckForNothingTests.cs | 71 ++++---- .../CheckDictionaryKeyValueTests.cs | 11 +- .../CheckIfParameterIsNothingTests.cs | 21 +-- .../ComputeConstantValueTests.cs | 31 ++-- .../CodeRefactorings/ConvertDecToHexTests.cs | 6 +- .../ConvertDoLoopWhileToDoWhileLoopTests.cs | 15 +- .../ConvertDoWhileLoopToDoLoopWhileTests.cs | 15 +- .../CodeRefactorings/ConvertHexToDecTests.cs | 6 +- ...rtIfStatementToSelectCaseStatementTests.cs | 31 ++-- .../ConvertSelectCaseToIfTests.cs | 17 +- .../ConvertToCustomEventTests.cs | 11 +- .../CopyCommentsFromBaseTests.cs | 24 ++- .../CreateChangedEventTests.cs | 17 +- .../CreateOverloadWithoutParameterTests.cs | 23 ++- Tests/VB/CodeRefactorings/InvertIfTests.cs | 19 +- .../InvertLogicalExpressionTests.cs | 31 ++-- .../ReplaceDirectCastWithSafeCastTests.cs | 11 +- .../ReplaceSafeCastWithDirectCastTests.cs | 9 +- .../VBCodeRefactoringTestBase.cs | 13 +- Tests/VB/Converter/ExpressionTests.cs | 40 ++--- Tests/VB/Converter/MemberTests.cs | 36 ++-- Tests/VB/Converter/NamespaceLevelTests.cs | 38 ++-- Tests/VB/Converter/SpecialConversionTests.cs | 16 +- Tests/VB/Converter/StatementTests.cs | 82 ++++----- Tests/VB/Converter/TypeCastTests.cs | 24 +-- Tests/VB/Diagnostics/NameOfSuggestionTests.cs | 21 ++- .../NonPublicMethodWithTestAttributeTests.cs | 15 +- Tests/VB/Diagnostics/VBDiagnosticTestBase.cs | 2 +- Tests/packages.config | 8 +- Vsix/CodeConversion.cs | 6 +- Vsix/ConvertCSToVBCommand.cs | 18 +- Vsix/ConvertVBToCSCommand.cs | 18 +- Vsix/GeneralOptionsDialogPageControl.cs | 9 +- Vsix/REConverterPackage.cs | 42 ++--- Vsix/VisualStudioInteraction.cs | 6 +- 418 files changed, 3094 insertions(+), 3719 deletions(-) diff --git a/BuildTools/Program.cs b/BuildTools/Program.cs index 50289712..f63ec15e 100644 --- a/BuildTools/Program.cs +++ b/BuildTools/Program.cs @@ -1,9 +1,5 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace RefactoringEssentials.BuildTools { diff --git a/BuildTools/Properties/AssemblyInfo.cs b/BuildTools/Properties/AssemblyInfo.cs index d583882b..a23de0c8 100644 --- a/BuildTools/Properties/AssemblyInfo.cs +++ b/BuildTools/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following diff --git a/Demonstration/CommandLineSwitchParser.cs b/Demonstration/CommandLineSwitchParser.cs index ce416e6f..1a432b3b 100644 --- a/Demonstration/CommandLineSwitchParser.cs +++ b/Demonstration/CommandLineSwitchParser.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace RefactoringEssentials.Demonstration +namespace RefactoringEssentials.Demonstration { public enum CommandLineSwitches { diff --git a/Demonstration/Program.cs b/Demonstration/Program.cs index 1b486ccc..4b948690 100644 --- a/Demonstration/Program.cs +++ b/Demonstration/Program.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace RefactoringEssentials.Demonstration { diff --git a/Demonstration/Properties/AssemblyInfo.cs b/Demonstration/Properties/AssemblyInfo.cs index 604b8ca6..eea2901a 100644 --- a/Demonstration/Properties/AssemblyInfo.cs +++ b/Demonstration/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following diff --git a/DocGenerator/Program.cs b/DocGenerator/Program.cs index 290469e5..8721bea1 100644 --- a/DocGenerator/Program.cs +++ b/DocGenerator/Program.cs @@ -3,8 +3,6 @@ using System.IO; using System.Linq; using System.Text; -using System.Threading.Tasks; -using System.Web; using System.Xml.Linq; using Microsoft.CodeAnalysis.CodeRefactorings; using Microsoft.CodeAnalysis.Diagnostics; @@ -13,7 +11,7 @@ namespace RefactoringEssentials.DocGenerator { - class Program + class Program { static void Main(string[] args) { diff --git a/DocGenerator/Properties/AssemblyInfo.cs b/DocGenerator/Properties/AssemblyInfo.cs index c8bd4539..56851910 100644 --- a/DocGenerator/Properties/AssemblyInfo.cs +++ b/DocGenerator/Properties/AssemblyInfo.cs @@ -1,5 +1,3 @@ using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; [assembly: AssemblyTitle("Refactoring Essentials Documentation Generator")] \ No newline at end of file diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Custom/AddNullCheckCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Custom/AddNullCheckCodeRefactoringProvider.cs index 7f2d702c..a5be5e00 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Custom/AddNullCheckCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Custom/AddNullCheckCodeRefactoringProvider.cs @@ -5,14 +5,13 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Formatting; -using System.Collections.Generic; namespace RefactoringEssentials.CSharp { - /// - /// Surround usage of a variable with a null check or add a null check to surrounding if block. - /// - [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Add null check")] + /// + /// Surround usage of a variable with a null check or add a null check to surrounding if block. + /// + [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Add null check")] public class AddNullCheckCodeRefactoringProvider : CodeRefactoringProvider { public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractEnsuresNotNullReturnRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractEnsuresNotNullReturnRefactoringProvider.cs index e5e251c5..8b461988 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractEnsuresNotNullReturnRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractEnsuresNotNullReturnRefactoringProvider.cs @@ -1,20 +1,17 @@ using System.Linq; -using System.Threading; using System.Collections.Generic; using Microsoft.CodeAnalysis.CodeRefactorings; using Microsoft.CodeAnalysis; using System.Threading.Tasks; using Microsoft.CodeAnalysis.CodeActions; -using Microsoft.CodeAnalysis.Text; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Simplification; using Microsoft.CodeAnalysis.Formatting; -using System.Diagnostics.Contracts; namespace RefactoringEssentials.CSharp.CodeRefactorings { - [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Add a Contract to specify the return value must not be null")] + [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Add a Contract to specify the return value must not be null")] /// /// Creates a 'Contract.Ensures(return != null);' contract for a method return value. /// diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractRequiresNotNullCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractRequiresNotNullCodeRefactoringProvider.cs index 618a20f5..f8b23545 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractRequiresNotNullCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractRequiresNotNullCodeRefactoringProvider.cs @@ -1,5 +1,4 @@ using System.Linq; -using System.Threading; using System.Collections.Generic; using Microsoft.CodeAnalysis.CodeRefactorings; using Microsoft.CodeAnalysis; @@ -13,7 +12,7 @@ namespace RefactoringEssentials.CSharp.CodeRefactorings { - [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Add a Contract to specify the parameter must not be null")] + [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Add a Contract to specify the parameter must not be null")] /// /// Creates a 'Contract.Requires(param != null);' contract for a parameter. /// diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertIfStatementToSwitchStatementCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertIfStatementToSwitchStatementCodeRefactoringProvider.cs index f2e88291..861d800f 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertIfStatementToSwitchStatementCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertIfStatementToSwitchStatementCodeRefactoringProvider.cs @@ -1,5 +1,3 @@ -using System; -using System.Linq; using System.Collections.Generic; using Microsoft.CodeAnalysis.CodeRefactorings; using Microsoft.CodeAnalysis; @@ -11,7 +9,7 @@ namespace RefactoringEssentials.CSharp.CodeRefactorings { - [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Convert 'if' to 'switch'")] + [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Convert 'if' to 'switch'")] public class ConvertIfStatementToSwitchStatementCodeRefactoringProvider : CodeRefactoringProvider { public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertInstanceToStaticMethodCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertInstanceToStaticMethodCodeRefactoringProvider.cs index d1debb90..75b382d0 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertInstanceToStaticMethodCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertInstanceToStaticMethodCodeRefactoringProvider.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -14,10 +13,10 @@ namespace RefactoringEssentials.CSharp { - /// - /// Converts an instance method to a static method adding an additional parameter as "this" replacement. - /// - [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Convert instance to static method")] + /// + /// Converts an instance method to a static method adding an additional parameter as "this" replacement. + /// + [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Convert instance to static method")] public class ConvertInstanceToStaticMethodCodeRefactoringProvider : SpecializedCodeRefactoringProvider { protected override IEnumerable GetActions(Document document, SemanticModel semanticModel, SyntaxNode root, TextSpan span, SyntaxNode node, CancellationToken cancellationToken) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/InvertIfCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/InvertIfCodeRefactoringProvider.cs index 708bbf71..4bccbc86 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/InvertIfCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/InvertIfCodeRefactoringProvider.cs @@ -7,11 +7,10 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Formatting; using Microsoft.CodeAnalysis.CSharp; -using System; namespace RefactoringEssentials.CSharp.CodeRefactorings { - [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Invert if")] + [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Invert if")] public class InvertIfCodeRefactoringProvider : CodeRefactoringProvider { static readonly string invertIfFixMessage = GettextCatalog.GetString("Invert 'if'"); diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/MergeNestedIfAction.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/MergeNestedIfAction.cs index 292d411d..a6ddc4a0 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/MergeNestedIfAction.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/MergeNestedIfAction.cs @@ -8,12 +8,11 @@ using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Formatting; -using Microsoft.CodeAnalysis.Simplification; using Microsoft.CodeAnalysis.Text; namespace RefactoringEssentials.CSharp.CodeRefactorings { - [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Merge nested 'if'")] + [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Merge nested 'if'")] public class MergeNestedIfAction : SpecializedCodeRefactoringProvider { protected override IEnumerable GetActions(Document document, SemanticModel semanticModel, SyntaxNode root, TextSpan span, IfStatementSyntax node, CancellationToken cancellationToken) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/ConvertIfStatementToReturnStatementAction.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/ConvertIfStatementToReturnStatementAction.cs index e4137186..83370fbd 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/ConvertIfStatementToReturnStatementAction.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/ConvertIfStatementToReturnStatementAction.cs @@ -5,11 +5,10 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Formatting; -using System; namespace RefactoringEssentials.CSharp.CodeRefactorings { - [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Convert 'if' to 'return'")] + [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Convert 'if' to 'return'")] public class ConvertIfStatementToReturnStatementAction : CodeRefactoringProvider { public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/CreateDelegateAction.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/CreateDelegateAction.cs index 6c448b46..9fe215e1 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/CreateDelegateAction.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/CreateDelegateAction.cs @@ -3,21 +3,19 @@ using System.Threading.Tasks; using Microsoft.CodeAnalysis.CSharp; using System.Linq; -using System.Diagnostics; using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.CodeActions; using Microsoft.CodeAnalysis.Formatting; namespace RefactoringEssentials.CSharp.CodeRefactorings { - /// - /// Create a delegate from an anonymous event declaration. - /// - /// - /// Language assumptions based on the C# 5.0 Language Specification. - /// https://msdn.microsoft.com/en-us/library/ms228593.aspx - /// - [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Create delegate")] + /// + /// Create a delegate from an anonymous event declaration. + /// + /// + /// Language assumptions based on the C# 5.0 Language Specification. + /// https://msdn.microsoft.com/en-us/library/ms228593.aspx + /// + [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Create delegate")] public class CreateDelegateAction : CodeRefactoringProvider { public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/ExtractAnonymousMethodCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/ExtractAnonymousMethodCodeRefactoringProvider.cs index d8299e0d..3d53fab1 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/ExtractAnonymousMethodCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/ExtractAnonymousMethodCodeRefactoringProvider.cs @@ -6,14 +6,13 @@ using Microsoft.CodeAnalysis.CodeActions; using Microsoft.CodeAnalysis.Formatting; using System.Linq; -using Microsoft.CodeAnalysis.FindSymbols; using System.Collections.Generic; using Microsoft.CodeAnalysis.Text; using Microsoft.CodeAnalysis.Simplification; namespace RefactoringEssentials.CSharp.CodeRefactorings { - [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Extract anonymous method")] + [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Extract anonymous method")] public class ExtractAnonymousMethodCodeRefactoringProvider : CodeRefactoringProvider { public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs index bea575b0..3432da15 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs @@ -8,12 +8,11 @@ using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Text; using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.FindSymbols; using Microsoft.CodeAnalysis.Formatting; namespace RefactoringEssentials.CSharp.CodeRefactorings { - [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "put inside 'using'")] + [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "put inside 'using'")] public class PutInsideUsingAction : SpecializedCodeRefactoringProvider { protected override IEnumerable GetActions(Document document, SemanticModel semanticModel, SyntaxNode root, TextSpan span, VariableDeclaratorSyntax node, CancellationToken cancellationToken) diff --git a/RefactoringEssentials/CSharp/Converter/MethodBodyVisitor.cs b/RefactoringEssentials/CSharp/Converter/MethodBodyVisitor.cs index 53a26565..5602845b 100644 --- a/RefactoringEssentials/CSharp/Converter/MethodBodyVisitor.cs +++ b/RefactoringEssentials/CSharp/Converter/MethodBodyVisitor.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; diff --git a/RefactoringEssentials/CSharp/Converter/NodesVisitor.cs b/RefactoringEssentials/CSharp/Converter/NodesVisitor.cs index cd15749a..30fda183 100644 --- a/RefactoringEssentials/CSharp/Converter/NodesVisitor.cs +++ b/RefactoringEssentials/CSharp/Converter/NodesVisitor.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; diff --git a/RefactoringEssentials/CSharp/Converter/VisualBasicConverter.cs b/RefactoringEssentials/CSharp/Converter/VisualBasicConverter.cs index 087af0cc..17a7705b 100644 --- a/RefactoringEssentials/CSharp/Converter/VisualBasicConverter.cs +++ b/RefactoringEssentials/CSharp/Converter/VisualBasicConverter.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; diff --git a/RefactoringEssentials/CSharp/Diagnostics/Custom/ParameterOnlyAssignedCodeFixProvider.cs b/RefactoringEssentials/CSharp/Diagnostics/Custom/ParameterOnlyAssignedCodeFixProvider.cs index 6afc9ca6..8ee423eb 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Custom/ParameterOnlyAssignedCodeFixProvider.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Custom/ParameterOnlyAssignedCodeFixProvider.cs @@ -1,15 +1,13 @@ using Microsoft.CodeAnalysis; using System.Collections.Immutable; -using System.Diagnostics; using Microsoft.CodeAnalysis.CodeFixes; using System.Threading.Tasks; using System.Linq; -using Microsoft.CodeAnalysis.CSharp; namespace RefactoringEssentials.CSharp.Diagnostics { - [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] + [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] public class ParameterOnlyAssignedCodeFixProvider : CodeFixProvider { public override ImmutableArray FixableDiagnosticIds diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/ForControlVariableIsNeverModifiedAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/ForControlVariableIsNeverModifiedAnalyzer.cs index c6e5aa70..f6dc49d9 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/ForControlVariableIsNeverModifiedAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/ForControlVariableIsNeverModifiedAnalyzer.cs @@ -2,13 +2,12 @@ using Microsoft.CodeAnalysis.Diagnostics; using System.Collections.Immutable; using Microsoft.CodeAnalysis.CSharp; -using System; using Microsoft.CodeAnalysis.CSharp.Syntax; using System.Linq; namespace RefactoringEssentials.CSharp.Diagnostics { - [DiagnosticAnalyzer(LanguageNames.CSharp)] + [DiagnosticAnalyzer(LanguageNames.CSharp)] public class ForControlVariableIsNeverModifiedAnalyzer : DiagnosticAnalyzer { static readonly DiagnosticDescriptor descriptor = new DiagnosticDescriptor( diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/FunctionNeverReturnsAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/FunctionNeverReturnsAnalyzer.cs index 0be090fe..7e0f05c0 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/FunctionNeverReturnsAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/FunctionNeverReturnsAnalyzer.cs @@ -4,14 +4,12 @@ using System; using System.Linq; using Microsoft.CodeAnalysis.CSharp; -using System.Threading; using Microsoft.CodeAnalysis.CSharp.Syntax; -using Nullaby; using RefactoringEssentials.Util.Analysis; namespace RefactoringEssentials.CSharp.Diagnostics { - [DiagnosticAnalyzer(LanguageNames.CSharp)] + [DiagnosticAnalyzer(LanguageNames.CSharp)] public class FunctionNeverReturnsAnalyzer : DiagnosticAnalyzer { static readonly DiagnosticDescriptor descriptor = new DiagnosticDescriptor( diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/MethodOverloadWithOptionalParameterAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/MethodOverloadWithOptionalParameterAnalyzer.cs index 4488f579..9c63bd02 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/MethodOverloadWithOptionalParameterAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/MethodOverloadWithOptionalParameterAnalyzer.cs @@ -2,13 +2,12 @@ using Microsoft.CodeAnalysis.Diagnostics; using System.Collections.Immutable; using Microsoft.CodeAnalysis.CSharp; -using System; using System.Collections.Generic; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace RefactoringEssentials.CSharp.Diagnostics { - [DiagnosticAnalyzer(LanguageNames.CSharp)] + [DiagnosticAnalyzer(LanguageNames.CSharp)] public class MethodOverloadWithOptionalParameterAnalyzer : DiagnosticAnalyzer { static readonly DiagnosticDescriptor descriptor = new DiagnosticDescriptor( diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/PartialMethodParameterNameMismatchAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/PartialMethodParameterNameMismatchAnalyzer.cs index b1bbc631..639be36f 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/PartialMethodParameterNameMismatchAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/CodeQuality/PartialMethodParameterNameMismatchAnalyzer.cs @@ -4,11 +4,10 @@ using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using System.Linq; -using System; namespace RefactoringEssentials.CSharp.Diagnostics { - [DiagnosticAnalyzer(LanguageNames.CSharp)] + [DiagnosticAnalyzer(LanguageNames.CSharp)] public class PartialMethodParameterNameMismatchAnalyzer : DiagnosticAnalyzer { static readonly DiagnosticDescriptor descriptor = new DiagnosticDescriptor( diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/Opportunities/ConvertConditionalTernaryToNullCoalescingCodeFixProvider.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/Opportunities/ConvertConditionalTernaryToNullCoalescingCodeFixProvider.cs index 1111bf47..85d01637 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/Opportunities/ConvertConditionalTernaryToNullCoalescingCodeFixProvider.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/Opportunities/ConvertConditionalTernaryToNullCoalescingCodeFixProvider.cs @@ -1,17 +1,15 @@ using System.Collections.Immutable; using System.Linq; -using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CodeFixes; using Microsoft.CodeAnalysis.Formatting; -using System; namespace RefactoringEssentials.CSharp.Diagnostics { - [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] + [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] public class ConvertConditionalTernaryToNullCoalescingCodeFixProvider : CodeFixProvider { public override ImmutableArray FixableDiagnosticIds diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/Opportunities/ConvertIfStatementToSwitchStatementAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/Opportunities/ConvertIfStatementToSwitchStatementAnalyzer.cs index 2183db87..cd3226d2 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/Opportunities/ConvertIfStatementToSwitchStatementAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/Opportunities/ConvertIfStatementToSwitchStatementAnalyzer.cs @@ -5,11 +5,10 @@ using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; -using RefactoringEssentials.CSharp.CodeRefactorings; namespace RefactoringEssentials.CSharp.Diagnostics { - [DiagnosticAnalyzer(LanguageNames.CSharp)] + [DiagnosticAnalyzer(LanguageNames.CSharp)] public class ConvertIfStatementToSwitchStatementAnalyzer : DiagnosticAnalyzer { static readonly DiagnosticDescriptor descriptor = new DiagnosticDescriptor( diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/Opportunities/ConvertIfStatementToSwitchStatementCodeFixProvider.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/Opportunities/ConvertIfStatementToSwitchStatementCodeFixProvider.cs index 82df2c35..9378e9d6 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/Opportunities/ConvertIfStatementToSwitchStatementCodeFixProvider.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/Opportunities/ConvertIfStatementToSwitchStatementCodeFixProvider.cs @@ -7,11 +7,10 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CodeFixes; using Microsoft.CodeAnalysis.Formatting; -using RefactoringEssentials.CSharp.CodeRefactorings; namespace RefactoringEssentials.CSharp.Diagnostics { - [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] + [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] public class ConvertIfStatementToSwitchStatementCodeFixProvider : CodeFixProvider { public override ImmutableArray FixableDiagnosticIds diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/ConstantNullCoalescingConditionCodeFixProvider.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/ConstantNullCoalescingConditionCodeFixProvider.cs index f073f0d1..93212cd4 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/ConstantNullCoalescingConditionCodeFixProvider.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/ConstantNullCoalescingConditionCodeFixProvider.cs @@ -4,14 +4,13 @@ using System.Threading.Tasks; using System.Linq; using Microsoft.CodeAnalysis.CSharp; -using System.Linq.Expressions; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Formatting; namespace RefactoringEssentials.CSharp.Diagnostics { - [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] + [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] public class ConstantNullCoalescingConditionCodeFixProvider : CodeFixProvider { public override ImmutableArray FixableDiagnosticIds diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantCheckBeforeAssignmentAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantCheckBeforeAssignmentAnalyzer.cs index 8178e2af..04a7881e 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantCheckBeforeAssignmentAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantCheckBeforeAssignmentAnalyzer.cs @@ -3,24 +3,23 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; using System.Collections.Immutable; -using System.Linq; namespace RefactoringEssentials.CSharp.Diagnostics { - /// - /// The analyzer checks patterns like the following: - /// - /// if (var != value) - /// var = value; - /// - /// In addition to that, it works with if-statements using block-syntax (containing a single statement), - /// and empty else-blocks or empty-statement else-blocks. - /// - /// The Fix removes the redundant check. This works on locals, parameters, fields and properties. - /// If a property setter does something expensive, it is recommended to do such a check *inside* - /// the property setter, *not* in the calling code. Hence, the check is redundant anyway. - /// - [DiagnosticAnalyzer(LanguageNames.CSharp)] + /// + /// The analyzer checks patterns like the following: + /// + /// if (var != value) + /// var = value; + /// + /// In addition to that, it works with if-statements using block-syntax (containing a single statement), + /// and empty else-blocks or empty-statement else-blocks. + /// + /// The Fix removes the redundant check. This works on locals, parameters, fields and properties. + /// If a property setter does something expensive, it is recommended to do such a check *inside* + /// the property setter, *not* in the calling code. Hence, the check is redundant anyway. + /// + [DiagnosticAnalyzer(LanguageNames.CSharp)] public class RedundantCheckBeforeAssignmentAnalyzer : DiagnosticAnalyzer { private static readonly DiagnosticDescriptor descriptor = new DiagnosticDescriptor( diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantCheckBeforeAssignmentCodeFixProvider.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantCheckBeforeAssignmentCodeFixProvider.cs index e24c70be..3d9c3c69 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantCheckBeforeAssignmentCodeFixProvider.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantCheckBeforeAssignmentCodeFixProvider.cs @@ -3,9 +3,7 @@ using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.CodeActions; using Microsoft.CodeAnalysis.CodeFixes; -using Microsoft.CodeAnalysis.Editing; using Microsoft.CodeAnalysis.Formatting; namespace RefactoringEssentials.CSharp.Diagnostics diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantCommaInArrayInitializerCodeFixProvider.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantCommaInArrayInitializerCodeFixProvider.cs index aa05f32b..f9ce8c50 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantCommaInArrayInitializerCodeFixProvider.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantCommaInArrayInitializerCodeFixProvider.cs @@ -6,12 +6,11 @@ using System.Linq; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.Formatting; namespace RefactoringEssentials.CSharp.Diagnostics { - [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] + [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] public class RedundantCommaInArrayInitializerCodeFixProvider : CodeFixProvider { public override ImmutableArray FixableDiagnosticIds diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantDelegateCreationCodeFixProvider.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantDelegateCreationCodeFixProvider.cs index 75430437..4e9a553c 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantDelegateCreationCodeFixProvider.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantDelegateCreationCodeFixProvider.cs @@ -1,17 +1,15 @@ using Microsoft.CodeAnalysis; using System.Collections.Immutable; -using System.Diagnostics; using Microsoft.CodeAnalysis.CodeFixes; using System.Threading.Tasks; using System.Linq; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Formatting; namespace RefactoringEssentials.CSharp.Diagnostics { - [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] + [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] public class RedundantDelegateCreationCodeFixProvider : CodeFixProvider { public override ImmutableArray FixableDiagnosticIds diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantExplicitArraySizeCodeFixProvider.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantExplicitArraySizeCodeFixProvider.cs index 5eece478..b4f82d69 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantExplicitArraySizeCodeFixProvider.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantExplicitArraySizeCodeFixProvider.cs @@ -1,14 +1,12 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CodeFixes; -using Microsoft.CodeAnalysis.CSharp.Syntax; using System.Collections.Immutable; -using System.Diagnostics; using System.Linq; using System.Threading.Tasks; namespace RefactoringEssentials.CSharp.Diagnostics { - [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] + [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] public class RedundantExplicitArraySizeCodeFixProvider : CodeFixProvider { public override ImmutableArray FixableDiagnosticIds diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantExplicitNullableCreationCodeFixProvider.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantExplicitNullableCreationCodeFixProvider.cs index f0eb1c99..726051c0 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantExplicitNullableCreationCodeFixProvider.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantExplicitNullableCreationCodeFixProvider.cs @@ -1,6 +1,5 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CodeFixes; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Formatting; using System.Collections.Immutable; @@ -9,7 +8,7 @@ namespace RefactoringEssentials.CSharp.Diagnostics { - [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] + [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] public class RedundantExplicitNullableCreationCodeFixProvider : CodeFixProvider { public override ImmutableArray FixableDiagnosticIds diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantIfElseBlockCodeFixProvider.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantIfElseBlockCodeFixProvider.cs index cbcbb2ae..7dd76356 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantIfElseBlockCodeFixProvider.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantIfElseBlockCodeFixProvider.cs @@ -3,7 +3,6 @@ using Microsoft.CodeAnalysis.CodeActions; using Microsoft.CodeAnalysis.CodeFixes; using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.Editing; using Microsoft.CodeAnalysis.Formatting; using System.Collections.Immutable; using System.Linq; @@ -11,7 +10,7 @@ namespace RefactoringEssentials.CSharp.Diagnostics { - [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] + [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] public class RedundantIfElseBlockCodeFixProvider : CodeFixProvider { public override ImmutableArray FixableDiagnosticIds diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantObjectCreationArgumentListAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantObjectCreationArgumentListAnalyzer.cs index decdb8d7..e0fae6e1 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantObjectCreationArgumentListAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantObjectCreationArgumentListAnalyzer.cs @@ -3,11 +3,10 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; using System.Collections.Immutable; -using System.Linq; namespace RefactoringEssentials.CSharp.Diagnostics { - [DiagnosticAnalyzer(LanguageNames.CSharp)] + [DiagnosticAnalyzer(LanguageNames.CSharp)] public class RedundantObjectCreationArgumentListAnalyzer : DiagnosticAnalyzer { private static readonly DiagnosticDescriptor descriptor = new DiagnosticDescriptor( diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantObjectCreationArgumentListCodeFixProvider.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantObjectCreationArgumentListCodeFixProvider.cs index 1368a130..507ec927 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantObjectCreationArgumentListCodeFixProvider.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantObjectCreationArgumentListCodeFixProvider.cs @@ -3,15 +3,12 @@ using Microsoft.CodeAnalysis.CodeFixes; using System.Threading.Tasks; using System.Linq; -using Microsoft.CodeAnalysis.CodeActions; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.Formatting; namespace RefactoringEssentials.CSharp.Diagnostics { - [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] + [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] public class RedundantObjectCreationArgumentListCodeFixProvider : CodeFixProvider { public override ImmutableArray FixableDiagnosticIds diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantStringToCharArrayCallAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantStringToCharArrayCallAnalyzer.cs index 7346dc18..92021866 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantStringToCharArrayCallAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantStringToCharArrayCallAnalyzer.cs @@ -4,12 +4,11 @@ using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.CodeAnalysis.CSharp.Syntax; using System.Collections.Immutable; -using System.Linq.Expressions; using System.Collections.Generic; namespace RefactoringEssentials.CSharp.Diagnostics { - [DiagnosticAnalyzer(LanguageNames.CSharp)] + [DiagnosticAnalyzer(LanguageNames.CSharp)] public class RedundantStringToCharArrayCallAnalyzer : DiagnosticAnalyzer { static readonly DiagnosticDescriptor descriptor = new DiagnosticDescriptor( diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantStringToCharArrayCallCodeFixProvider.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantStringToCharArrayCallCodeFixProvider.cs index ff3fcacc..9748dbd8 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantStringToCharArrayCallCodeFixProvider.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantStringToCharArrayCallCodeFixProvider.cs @@ -4,13 +4,11 @@ using System.Collections.Immutable; using System.Linq; using System.Threading.Tasks; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.Editing; using Microsoft.CodeAnalysis.Formatting; namespace RefactoringEssentials.CSharp.Diagnostics { - [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] + [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] public class RedundantStringToCharArrayCallCodeFixProvider : CodeFixProvider { public override ImmutableArray FixableDiagnosticIds diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantToStringCallAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantToStringCallAnalyzer.cs index 8a2c9be0..4efc3c2d 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantToStringCallAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantToStringCallAnalyzer.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; -using System.Linq.Expressions; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; @@ -11,7 +10,7 @@ namespace RefactoringEssentials.CSharp.Diagnostics { - [DiagnosticAnalyzer(LanguageNames.CSharp)] + [DiagnosticAnalyzer(LanguageNames.CSharp)] public class RedundantToStringCallAnalyzer : DiagnosticAnalyzer { static readonly DiagnosticDescriptor descriptor1 = new DiagnosticDescriptor( diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantToStringCallCodeFixProvider.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantToStringCallCodeFixProvider.cs index 1b40dd25..c2bb9816 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantToStringCallCodeFixProvider.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInCode/RedundantToStringCallCodeFixProvider.cs @@ -3,13 +3,12 @@ using Microsoft.CodeAnalysis.CodeFixes; using System.Threading.Tasks; using System.Linq; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace RefactoringEssentials.CSharp.Diagnostics { - [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] + [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] public class RedundantToStringCallCodeFixProvider : CodeFixProvider { public override ImmutableArray FixableDiagnosticIds diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/RedundantDefaultFieldInitializerCodeFixProvider.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/RedundantDefaultFieldInitializerCodeFixProvider.cs index cf8b9586..0d002b6f 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/RedundantDefaultFieldInitializerCodeFixProvider.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/RedundantDefaultFieldInitializerCodeFixProvider.cs @@ -4,13 +4,12 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CodeFixes; using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Formatting; namespace RefactoringEssentials.CSharp.Diagnostics { - [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] + [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] public class RedundantDefaultFieldInitializerCodeFixProvider : CodeFixProvider { public override ImmutableArray FixableDiagnosticIds diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedParameterAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedParameterAnalyzer.cs index ac421c3f..fd0a4931 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedParameterAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedParameterAnalyzer.cs @@ -6,12 +6,11 @@ using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.CodeAnalysis.CSharp.Syntax; using System.Collections.Generic; -using Microsoft.CodeAnalysis.FindSymbols; using System.Threading; namespace RefactoringEssentials.CSharp.Diagnostics { - [DiagnosticAnalyzer(LanguageNames.CSharp)] + [DiagnosticAnalyzer(LanguageNames.CSharp)] public class UnusedParameterAnalyzer : DiagnosticAnalyzer { static readonly DiagnosticDescriptor descriptor = new DiagnosticDescriptor( diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedTypeParameterAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedTypeParameterAnalyzer.cs index 8a597f2d..af74bf4a 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedTypeParameterAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedTypeParameterAnalyzer.cs @@ -3,13 +3,11 @@ using System.Collections.Immutable; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; -using System.Linq; -using Microsoft.CodeAnalysis.FindSymbols; using System.Collections.Generic; namespace RefactoringEssentials.CSharp.Diagnostics { - [DiagnosticAnalyzer(LanguageNames.CSharp)] + [DiagnosticAnalyzer(LanguageNames.CSharp)] public class UnusedTypeParameterAnalyzer : DiagnosticAnalyzer { static readonly DiagnosticDescriptor descriptor = new DiagnosticDescriptor( diff --git a/RefactoringEssentials/CSharp/SyntaxExtensions.cs b/RefactoringEssentials/CSharp/SyntaxExtensions.cs index 3be5a605..31bcf910 100644 --- a/RefactoringEssentials/CSharp/SyntaxExtensions.cs +++ b/RefactoringEssentials/CSharp/SyntaxExtensions.cs @@ -1,14 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace RefactoringEssentials.CSharp { - public static class SyntaxExtensions + public static class SyntaxExtensions { public static ExpressionStatementSyntax InitializerAsAssignment(this VariableDeclaratorSyntax variableDeclarator) { diff --git a/RefactoringEssentials/CodeAnalyzers.CSharp.html b/RefactoringEssentials/CodeAnalyzers.CSharp.html index 2cba20b8..1fdf8bef 100644 --- a/RefactoringEssentials/CodeAnalyzers.CSharp.html +++ b/RefactoringEssentials/CodeAnalyzers.CSharp.html @@ -15,7 +15,7 @@ -->

                  Supported Code Analyzers

                  -

                  119 code analyzers for C#

                  +

                  120 code analyzers for C#

                  • Suggests using the class declaring a static function when calling it (AccessToStaticMemberViaDerivedTypeAnalyzer)
                  • When initializing explicitly typed local variable or array type, array creation expression can be replaced with array initializer. (ArrayCreationCanBeReplacedWithArrayInitializerAnalyzer)
                  • @@ -131,6 +131,7 @@

                    Supported Code Analyzers

                  • Warns when a culture-aware 'IndexOf' call is used by default. (StringIndexOfIsCultureSpecificAnalyzer)
                  • Warns when a culture-aware 'LastIndexOf' call is used by default. (StringLastIndexOfIsCultureSpecificAnalyzer)
                  • Warns when a culture-aware 'StartsWith' call is used by default. (StringStartsWithIsCultureSpecificAnalyzer)
                  • +
                  • Use 'var' keyword when possible (SuggestUseVarKeywordEvidentAnalyzer)
                  • [ThreadStatic] doesn't work with instance fields (ThreadStaticAtInstanceFieldAnalyzer)
                  • Parameter is never used (UnusedParameterAnalyzer)
                  • Type parameter is never used (UnusedTypeParameterAnalyzer)
                  • diff --git a/RefactoringEssentials/CodeRefactorings.CSharp.html b/RefactoringEssentials/CodeRefactorings.CSharp.html index 7480f7ee..666d590a 100644 --- a/RefactoringEssentials/CodeRefactorings.CSharp.html +++ b/RefactoringEssentials/CodeRefactorings.CSharp.html @@ -15,7 +15,7 @@ -->

                    Supported Refactorings

                    -

                    101 code refactorings for C#

                    +

                    103 code refactorings for C#

                    • Adds another accessor (AddAnotherAccessorCodeRefactoringProvider)
                    • Add braces (AddBracesCodeRefactoringProvider)
                    • @@ -102,10 +102,12 @@

                      Supported Refactorings

                    • Replace assignment with postfix expression (ReplaceAssignmentWithPostfixExpressionCodeRefactoringProvider)
                    • Replace auto-property with property that uses a backing field (ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider)
                    • Convert cast to 'as'. (ReplaceDirectCastWithSafeCastCodeRefactoringProvider)
                    • +
                    • Replace type with 'var' (ReplaceExplicitTypeWithVarCodeRefactoringProvider)
                    • Replace operator assignment with assignment (ReplaceOperatorAssignmentWithAssignmentCodeRefactoringProvider)
                    • Replace postfix expression with assignment (ReplacePostfixExpressionWithAssignmentCodeRefactoringProvider)
                    • Replace property that uses a backing field with auto-property (ReplacePropertyWithBackingFieldWithAutoPropertyCodeRefactoringProvider)
                    • Convert 'as' to cast. (ReplaceSafeCastWithDirectCastCodeRefactoringProvider)
                    • +
                    • Replaces 'var' with explicit type specification (ReplaceVarWithExplicitTypeCodeRefactoringProvider)
                    • Replace assignment with operator assignment (ReplaceWithOperatorAssignmentCodeRefactoringProvider)
                    • Reverse the direction of a for (ReverseDirectionForForLoopCodeRefactoringProvider)
                    • Split declaration list (SplitDeclarationListCodeRefactoringProvider)
                    • diff --git a/RefactoringEssentials/Common/RoslynReflectionUsageAttribute.cs b/RefactoringEssentials/Common/RoslynReflectionUsageAttribute.cs index 39b5fbc2..b33ffbc1 100644 --- a/RefactoringEssentials/Common/RoslynReflectionUsageAttribute.cs +++ b/RefactoringEssentials/Common/RoslynReflectionUsageAttribute.cs @@ -1,15 +1,11 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace RefactoringEssentials { - /// - /// Defines contexts where usage of reflection is allowed. - /// - [Flags] + /// + /// Defines contexts where usage of reflection is allowed. + /// + [Flags] enum RoslynReflectionAllowedContext { None = 0, diff --git a/RefactoringEssentials/Converter/CodeWithOptions.cs b/RefactoringEssentials/Converter/CodeWithOptions.cs index 350708dc..bba9a5d6 100644 --- a/RefactoringEssentials/Converter/CodeWithOptions.cs +++ b/RefactoringEssentials/Converter/CodeWithOptions.cs @@ -2,12 +2,10 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace RefactoringEssentials.Converter { - public class CodeWithOptions + public class CodeWithOptions { public string Text { get; private set; } public string FromLanguage { get; private set; } diff --git a/RefactoringEssentials/Converter/ConversionResult.cs b/RefactoringEssentials/Converter/ConversionResult.cs index 0b9f166b..13383acf 100644 --- a/RefactoringEssentials/Converter/ConversionResult.cs +++ b/RefactoringEssentials/Converter/ConversionResult.cs @@ -1,12 +1,10 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace RefactoringEssentials.Converter { - public class ConversionResult + public class ConversionResult { public bool Success { get; private set; } public string ConvertedCode { get; private set; } diff --git a/RefactoringEssentials/Properties/AssemblyInfo.cs b/RefactoringEssentials/Properties/AssemblyInfo.cs index 33a54778..925d9c60 100644 --- a/RefactoringEssentials/Properties/AssemblyInfo.cs +++ b/RefactoringEssentials/Properties/AssemblyInfo.cs @@ -1,6 +1,5 @@ using System.Reflection; using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; [assembly: AssemblyTitle("Refactoring Essentials")] [assembly: InternalsVisibleTo("RefactoringEssentials.Tests")] diff --git a/RefactoringEssentials/Properties/AssemblyInfoBase.cs b/RefactoringEssentials/Properties/AssemblyInfoBase.cs index 4d15cd5c..314c3262 100644 --- a/RefactoringEssentials/Properties/AssemblyInfoBase.cs +++ b/RefactoringEssentials/Properties/AssemblyInfoBase.cs @@ -1,6 +1,5 @@  using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following diff --git a/RefactoringEssentials/Samples/CSharp/SampleCodeFixProvider.cs b/RefactoringEssentials/Samples/CSharp/SampleCodeFixProvider.cs index be7da6a9..8f54fb61 100644 --- a/RefactoringEssentials/Samples/CSharp/SampleCodeFixProvider.cs +++ b/RefactoringEssentials/Samples/CSharp/SampleCodeFixProvider.cs @@ -4,15 +4,14 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CodeFixes; -using Microsoft.CodeAnalysis.Formatting; using Microsoft.CodeAnalysis.CSharp; using RefactoringEssentials.CSharp.Diagnostics; namespace RefactoringEssentials.Samples.CSharp { - // PLEASE UNCOMMENT THIS LINE TO REGISTER CODE FIX IN IDE. - //[ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] - public class SampleCodeFixProvider : CodeFixProvider + // PLEASE UNCOMMENT THIS LINE TO REGISTER CODE FIX IN IDE. + //[ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] + public class SampleCodeFixProvider : CodeFixProvider { // A CodeFixProvider is a complement of an analyzer providing a fix for the // potential code issue. To link to the correct analyzer its diagnostic ID must diff --git a/RefactoringEssentials/Samples/CSharp/SampleCodeRefactoringProvider.cs b/RefactoringEssentials/Samples/CSharp/SampleCodeRefactoringProvider.cs index aecbdd98..6e1e7faa 100644 --- a/RefactoringEssentials/Samples/CSharp/SampleCodeRefactoringProvider.cs +++ b/RefactoringEssentials/Samples/CSharp/SampleCodeRefactoringProvider.cs @@ -1,4 +1,3 @@ -using System.Linq; using Microsoft.CodeAnalysis.CodeRefactorings; using Microsoft.CodeAnalysis; using System.Threading.Tasks; @@ -8,12 +7,12 @@ namespace RefactoringEssentials.Samples.CSharp { - /// - /// Sample CodeRefactoringProvider for C#. - /// - // PLEASE UNCOMMENT THIS LINE TO REGISTER REFACTORING IN IDE. - //[ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Sample code refactoring")] - public class SampleCodeRefactoringProvider : CodeRefactoringProvider + /// + /// Sample CodeRefactoringProvider for C#. + /// + // PLEASE UNCOMMENT THIS LINE TO REGISTER REFACTORING IN IDE. + //[ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Sample code refactoring")] + public class SampleCodeRefactoringProvider : CodeRefactoringProvider { /* This sample code refactoring shows some basics of refactoring implementations diff --git a/RefactoringEssentials/Util/Analysis/ControlFlow.cs b/RefactoringEssentials/Util/Analysis/ControlFlow.cs index bb081922..a86ce3bd 100644 --- a/RefactoringEssentials/Util/Analysis/ControlFlow.cs +++ b/RefactoringEssentials/Util/Analysis/ControlFlow.cs @@ -18,7 +18,6 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using System.Threading; using Microsoft.CodeAnalysis; @@ -27,10 +26,10 @@ namespace RefactoringEssentials.Util.Analysis { - /// - /// Represents a node in the control flow graph of a C# method. - /// - public class ControlFlowNode + /// + /// Represents a node in the control flow graph of a C# method. + /// + public class ControlFlowNode { public readonly StatementSyntax PreviousStatement; public readonly StatementSyntax NextStatement; diff --git a/RefactoringEssentials/Util/CaseCorrector.cs b/RefactoringEssentials/Util/CaseCorrector.cs index d1c49b68..f5540a70 100644 --- a/RefactoringEssentials/Util/CaseCorrector.cs +++ b/RefactoringEssentials/Util/CaseCorrector.cs @@ -1,4 +1,3 @@ -using System; using System.Reflection; using System.Runtime.ExceptionServices; using System.Threading; @@ -7,7 +6,7 @@ namespace RefactoringEssentials { - [RoslynReflectionUsage(RoslynReflectionAllowedContext.CodeFixes)] + [RoslynReflectionUsage(RoslynReflectionAllowedContext.CodeFixes)] class CaseCorrector { public static SyntaxAnnotation Annotation => (SyntaxAnnotation)RoslynReflection.CaseCorrector.AnnotationField.GetValue(null); diff --git a/RefactoringEssentials/Util/ExpressionSyntaxExtensions.cs b/RefactoringEssentials/Util/ExpressionSyntaxExtensions.cs index fbde8483..fab5d79d 100644 --- a/RefactoringEssentials/Util/ExpressionSyntaxExtensions.cs +++ b/RefactoringEssentials/Util/ExpressionSyntaxExtensions.cs @@ -9,7 +9,6 @@ using Microsoft.CodeAnalysis.Text; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis; -using System; using System.Reflection; using System.Runtime.ExceptionServices; @@ -18,7 +17,7 @@ namespace RefactoringEssentials #if NR6 public #endif - static class ExpressionSyntaxExtensions + static class ExpressionSyntaxExtensions { /// /// Adds to if it does not contain an anonymous diff --git a/RefactoringEssentials/Util/Flow/FlowAnalysis.cs b/RefactoringEssentials/Util/Flow/FlowAnalysis.cs index 821941aa..fa517503 100644 --- a/RefactoringEssentials/Util/Flow/FlowAnalysis.cs +++ b/RefactoringEssentials/Util/Flow/FlowAnalysis.cs @@ -1,14 +1,13 @@ // (c) by Matt Warren. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // From https://github.com/mattwar/nullaby -using System; using System.Collections.Immutable; using System.Linq; using Microsoft.CodeAnalysis; namespace Nullaby { - public class FlowAnalysis + public class FlowAnalysis where TState : FlowState { private readonly ImmutableDictionary states; diff --git a/RefactoringEssentials/Util/Flow/FlowAnalyzer.cs b/RefactoringEssentials/Util/Flow/FlowAnalyzer.cs index f2107261..92018dfd 100644 --- a/RefactoringEssentials/Util/Flow/FlowAnalyzer.cs +++ b/RefactoringEssentials/Util/Flow/FlowAnalyzer.cs @@ -1,23 +1,19 @@ // (c) by Matt Warren. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // From https://github.com/mattwar/nullaby -using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Runtime.CompilerServices; -using System.Threading; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.Diagnostics; namespace Nullaby { - /// - /// Analyzises a block of code for state transitions across code flow - /// - public class FlowAnalyzer : CSharpSyntaxWalker + /// + /// Analyzises a block of code for state transitions across code flow + /// + public class FlowAnalyzer : CSharpSyntaxWalker where TState : FlowState { protected readonly SemanticModel Model; diff --git a/RefactoringEssentials/Util/Flow/FlowLocation.cs b/RefactoringEssentials/Util/Flow/FlowLocation.cs index 44b3cdcd..b0c12dce 100644 --- a/RefactoringEssentials/Util/Flow/FlowLocation.cs +++ b/RefactoringEssentials/Util/Flow/FlowLocation.cs @@ -2,15 +2,11 @@ // From https://github.com/mattwar/nullaby using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Microsoft.CodeAnalysis; namespace Nullaby { - public struct FlowLocation : IEquatable, IComparable + public struct FlowLocation : IEquatable, IComparable { private SyntaxNode node; private bool isStart; diff --git a/RefactoringEssentials/Util/Flow/FlowState.cs b/RefactoringEssentials/Util/Flow/FlowState.cs index 3af071e1..2fce17d9 100644 --- a/RefactoringEssentials/Util/Flow/FlowState.cs +++ b/RefactoringEssentials/Util/Flow/FlowState.cs @@ -2,19 +2,11 @@ // From https://github.com/mattwar/nullaby using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Threading; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.Diagnostics; namespace Nullaby { - public abstract class FlowState : IEquatable + public abstract class FlowState : IEquatable { /// /// Returns true if the two states are the same. diff --git a/RefactoringEssentials/Util/Flow/NullFlowState.cs b/RefactoringEssentials/Util/Flow/NullFlowState.cs index e1ecf2e9..667905e3 100644 --- a/RefactoringEssentials/Util/Flow/NullFlowState.cs +++ b/RefactoringEssentials/Util/Flow/NullFlowState.cs @@ -1,20 +1,16 @@ // (c) by Matt Warren. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // From https://github.com/mattwar/nullaby -using System; using System.Collections.Generic; using System.Collections.Immutable; -using System.Linq; using System.Runtime.CompilerServices; -using System.Threading; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.Diagnostics; using RefactoringEssentials; namespace Nullaby { - internal enum NullState + internal enum NullState { Unknown, Null, diff --git a/RefactoringEssentials/Util/NameGenerator.cs b/RefactoringEssentials/Util/NameGenerator.cs index 425bfd69..3c01f263 100644 --- a/RefactoringEssentials/Util/NameGenerator.cs +++ b/RefactoringEssentials/Util/NameGenerator.cs @@ -3,11 +3,10 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.CodeAnalysis.Text; namespace RefactoringEssentials { - static class NameGenerator + static class NameGenerator { public static IList EnsureUniqueness( IList names, diff --git a/RefactoringEssentials/Util/NameProposalService.cs b/RefactoringEssentials/Util/NameProposalService.cs index cd4a3ac1..25c82822 100644 --- a/RefactoringEssentials/Util/NameProposalService.cs +++ b/RefactoringEssentials/Util/NameProposalService.cs @@ -1,11 +1,10 @@ -using System; -using System.Globalization; +using System.Globalization; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; namespace RefactoringEssentials { - public interface INameProposalStrategy + public interface INameProposalStrategy { string GetNameProposal(string baseName, SyntaxKind syntaxKindHint, Accessibility accessibility, bool isStatic, Document document, int position); } diff --git a/RefactoringEssentials/Util/ReflectionNamespaces.cs b/RefactoringEssentials/Util/ReflectionNamespaces.cs index f9f8c2a8..c0a11a15 100644 --- a/RefactoringEssentials/Util/ReflectionNamespaces.cs +++ b/RefactoringEssentials/Util/ReflectionNamespaces.cs @@ -1,10 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace RefactoringEssentials +namespace RefactoringEssentials { - class ReflectionNamespaces + class ReflectionNamespaces { public const string WorkspacesAsmName = ", Microsoft.CodeAnalysis.Workspaces, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string CSWorkspacesAsmName = ", Microsoft.CodeAnalysis.CSharp.Workspaces, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; diff --git a/RefactoringEssentials/Util/RoslynReflection.cs b/RefactoringEssentials/Util/RoslynReflection.cs index ac97731f..882a3578 100644 --- a/RefactoringEssentials/Util/RoslynReflection.cs +++ b/RefactoringEssentials/Util/RoslynReflection.cs @@ -3,18 +3,16 @@ using System.Collections.Immutable; using System.Linq; using System.Reflection; -using System.Text; using System.Threading; -using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace RefactoringEssentials { - /// - /// Builds a lazy-loaded cache of Roslyn's internal types and members used through reflection. - /// - static class RoslynReflection + /// + /// Builds a lazy-loaded cache of Roslyn's internal types and members used through reflection. + /// + static class RoslynReflection { // CaseCorrector public static CaseCorrectorWrapper CaseCorrector => caseCorrectorWrapper.Value; diff --git a/RefactoringEssentials/Util/SyntaxNodeExtensions.cs b/RefactoringEssentials/Util/SyntaxNodeExtensions.cs index 418466ef..d25d70df 100644 --- a/RefactoringEssentials/Util/SyntaxNodeExtensions.cs +++ b/RefactoringEssentials/Util/SyntaxNodeExtensions.cs @@ -10,14 +10,13 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using System.Threading.Tasks; -using System.Reflection; namespace RefactoringEssentials { #if NR6 public #endif - static partial class SyntaxNodeExtensions + static partial class SyntaxNodeExtensions { //public static IEnumerable DepthFirstTraversal(this SyntaxNode node) //{ diff --git a/RefactoringEssentials/Util/TypeExtensions.cs b/RefactoringEssentials/Util/TypeExtensions.cs index f121d011..926a4817 100644 --- a/RefactoringEssentials/Util/TypeExtensions.cs +++ b/RefactoringEssentials/Util/TypeExtensions.cs @@ -7,14 +7,13 @@ using System.Collections.Immutable; using System.Threading; using System.Text; -using System.Reflection; namespace RefactoringEssentials { #if NR6 public #endif - static class TypeExtensions + static class TypeExtensions { [RoslynReflectionUsage(RoslynReflectionAllowedContext.CodeFixes)] public static TypeSyntax GenerateTypeSyntax(this ITypeSymbol typeSymbol, SyntaxAnnotation simplifierAnnotation = null) diff --git a/RefactoringEssentials/VB/CodeRefactorings/AddCheckForNothingCodeRefactoringProvider.cs b/RefactoringEssentials/VB/CodeRefactorings/AddCheckForNothingCodeRefactoringProvider.cs index 9089e1bc..61366764 100644 --- a/RefactoringEssentials/VB/CodeRefactorings/AddCheckForNothingCodeRefactoringProvider.cs +++ b/RefactoringEssentials/VB/CodeRefactorings/AddCheckForNothingCodeRefactoringProvider.cs @@ -5,15 +5,14 @@ using Microsoft.CodeAnalysis.VisualBasic.Syntax; using Microsoft.CodeAnalysis.VisualBasic; using Microsoft.CodeAnalysis.Formatting; -using System.Collections.Generic; using RefactoringEssentials.Util; namespace RefactoringEssentials.VB { - /// - /// Surround usage of a variable with an "IsNot Nothing" check or adds it to surrounding If block. - /// - [ExportCodeRefactoringProvider(LanguageNames.VisualBasic, Name = "Add check for Nothing")] + /// + /// Surround usage of a variable with an "IsNot Nothing" check or adds it to surrounding If block. + /// + [ExportCodeRefactoringProvider(LanguageNames.VisualBasic, Name = "Add check for Nothing")] public class AddCheckForNothingCodeRefactoringProvider : CodeRefactoringProvider { public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) diff --git a/RefactoringEssentials/VB/CodeRefactorings/ConvertIfStatementToSelectCaseStatementCodeRefactoringProvider.cs b/RefactoringEssentials/VB/CodeRefactorings/ConvertIfStatementToSelectCaseStatementCodeRefactoringProvider.cs index 073a25c6..f92d3353 100644 --- a/RefactoringEssentials/VB/CodeRefactorings/ConvertIfStatementToSelectCaseStatementCodeRefactoringProvider.cs +++ b/RefactoringEssentials/VB/CodeRefactorings/ConvertIfStatementToSelectCaseStatementCodeRefactoringProvider.cs @@ -1,5 +1,4 @@ using System; -using System.Linq; using System.Collections.Generic; using Microsoft.CodeAnalysis.CodeRefactorings; using Microsoft.CodeAnalysis; @@ -11,7 +10,7 @@ namespace RefactoringEssentials.VB.CodeRefactorings { - [ExportCodeRefactoringProvider(LanguageNames.VisualBasic, Name = "Convert 'If' to 'Select Case'")] + [ExportCodeRefactoringProvider(LanguageNames.VisualBasic, Name = "Convert 'If' to 'Select Case'")] public class ConvertIfStatementToSelectCaseStatementCodeRefactoringProvider : CodeRefactoringProvider { public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) diff --git a/RefactoringEssentials/VB/Converter/CSharpConverter.cs b/RefactoringEssentials/VB/Converter/CSharpConverter.cs index 926a5367..8267e0b4 100644 --- a/RefactoringEssentials/VB/Converter/CSharpConverter.cs +++ b/RefactoringEssentials/VB/Converter/CSharpConverter.cs @@ -10,11 +10,10 @@ using RefactoringEssentials.VB.CodeRefactorings; using RefactoringEssentials.Converter; using Microsoft.CodeAnalysis.Text; -using System.Diagnostics.Contracts; namespace RefactoringEssentials.VB.Converter { - public partial class CSharpConverter + public partial class CSharpConverter { enum TokenContext { diff --git a/RefactoringEssentials/VB/Converter/ConversionExtensions.cs b/RefactoringEssentials/VB/Converter/ConversionExtensions.cs index 21ac3db4..bc742021 100644 --- a/RefactoringEssentials/VB/Converter/ConversionExtensions.cs +++ b/RefactoringEssentials/VB/Converter/ConversionExtensions.cs @@ -1,14 +1,12 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Microsoft.CodeAnalysis; using CS = Microsoft.CodeAnalysis.CSharp; namespace RefactoringEssentials.VB.Converter { - static class ConversionExtensions + static class ConversionExtensions { public static bool HasUsingDirective(this CS.CSharpSyntaxTree tree, string fullName) { diff --git a/RefactoringEssentials/VB/Converter/MethodBodyVisitor.cs b/RefactoringEssentials/VB/Converter/MethodBodyVisitor.cs index cd7c0683..2333cc27 100644 --- a/RefactoringEssentials/VB/Converter/MethodBodyVisitor.cs +++ b/RefactoringEssentials/VB/Converter/MethodBodyVisitor.cs @@ -4,14 +4,12 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; using CS = Microsoft.CodeAnalysis.CSharp; using CSS = Microsoft.CodeAnalysis.CSharp.Syntax; namespace RefactoringEssentials.VB.Converter { - public partial class CSharpConverter + public partial class CSharpConverter { class MethodBodyVisitor : CS.CSharpSyntaxVisitor> { diff --git a/RefactoringEssentials/VB/Converter/NodesVisitor.cs b/RefactoringEssentials/VB/Converter/NodesVisitor.cs index 77cdeac2..904dba45 100644 --- a/RefactoringEssentials/VB/Converter/NodesVisitor.cs +++ b/RefactoringEssentials/VB/Converter/NodesVisitor.cs @@ -1,18 +1,15 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.VisualBasic; using Microsoft.CodeAnalysis.VisualBasic.Syntax; -using RefactoringEssentials.VB.CodeRefactorings; using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; using CS = Microsoft.CodeAnalysis.CSharp; using CSS = Microsoft.CodeAnalysis.CSharp.Syntax; namespace RefactoringEssentials.VB.Converter { - public partial class CSharpConverter + public partial class CSharpConverter { class NodesVisitor : CS.CSharpSyntaxVisitor { diff --git a/RefactoringEssentials/Xml/AXmlAttribute.cs b/RefactoringEssentials/Xml/AXmlAttribute.cs index 28677ce1..71c05978 100644 --- a/RefactoringEssentials/Xml/AXmlAttribute.cs +++ b/RefactoringEssentials/Xml/AXmlAttribute.cs @@ -16,7 +16,6 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -using System; using System.Globalization; using Microsoft.CodeAnalysis.Text; diff --git a/RefactoringEssentials/Xml/AXmlDocument.cs b/RefactoringEssentials/Xml/AXmlDocument.cs index 7113f41a..04f93330 100644 --- a/RefactoringEssentials/Xml/AXmlDocument.cs +++ b/RefactoringEssentials/Xml/AXmlDocument.cs @@ -16,9 +16,7 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -using System; using System.Globalization; -using System.Xml; namespace RefactoringEssentials.Xml diff --git a/RefactoringEssentials/Xml/AXmlObject.cs b/RefactoringEssentials/Xml/AXmlObject.cs index 0de8ba46..f3759a79 100644 --- a/RefactoringEssentials/Xml/AXmlObject.cs +++ b/RefactoringEssentials/Xml/AXmlObject.cs @@ -19,7 +19,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Threading; using System.Xml; using Microsoft.CodeAnalysis.Text; diff --git a/RefactoringEssentials/Xml/AXmlParser.cs b/RefactoringEssentials/Xml/AXmlParser.cs index 8d909348..cc86b376 100644 --- a/RefactoringEssentials/Xml/AXmlParser.cs +++ b/RefactoringEssentials/Xml/AXmlParser.cs @@ -18,10 +18,7 @@ using System; using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; using System.Threading; -using System.Xml.Linq; using Microsoft.CodeAnalysis.Text; namespace RefactoringEssentials.Xml diff --git a/RefactoringEssentials/Xml/AXmlTag.cs b/RefactoringEssentials/Xml/AXmlTag.cs index 770a8800..c8be9519 100644 --- a/RefactoringEssentials/Xml/AXmlTag.cs +++ b/RefactoringEssentials/Xml/AXmlTag.cs @@ -16,7 +16,6 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -using System; using System.Collections.ObjectModel; using System.Globalization; using Microsoft.CodeAnalysis.Text; diff --git a/RefactoringEssentials/Xml/AXmlText.cs b/RefactoringEssentials/Xml/AXmlText.cs index 4514950f..eff6c5cc 100644 --- a/RefactoringEssentials/Xml/AXmlText.cs +++ b/RefactoringEssentials/Xml/AXmlText.cs @@ -16,7 +16,6 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -using System; using System.Globalization; namespace RefactoringEssentials.Xml diff --git a/RefactoringEssentials/Xml/AXmlVisitor.cs b/RefactoringEssentials/Xml/AXmlVisitor.cs index 14c903e3..ebaf9be2 100644 --- a/RefactoringEssentials/Xml/AXmlVisitor.cs +++ b/RefactoringEssentials/Xml/AXmlVisitor.cs @@ -16,8 +16,6 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -using System; -using System.Text; namespace RefactoringEssentials.Xml { diff --git a/RefactoringEssentials/Xml/IncrementalParserState.cs b/RefactoringEssentials/Xml/IncrementalParserState.cs index d9c4d3d3..2be7d7f7 100644 --- a/RefactoringEssentials/Xml/IncrementalParserState.cs +++ b/RefactoringEssentials/Xml/IncrementalParserState.cs @@ -16,7 +16,6 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -using System; using System.Collections.Generic; using System.Diagnostics; using Microsoft.CodeAnalysis.Text; diff --git a/RefactoringEssentials/Xml/InternalDocument.cs b/RefactoringEssentials/Xml/InternalDocument.cs index 160ebbe5..6b1d7579 100644 --- a/RefactoringEssentials/Xml/InternalDocument.cs +++ b/RefactoringEssentials/Xml/InternalDocument.cs @@ -16,7 +16,6 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -using System; namespace RefactoringEssentials.Xml { diff --git a/RefactoringEssentials/Xml/LazyInit.cs b/RefactoringEssentials/Xml/LazyInit.cs index 4bc4dbb8..10a8fb2d 100644 --- a/RefactoringEssentials/Xml/LazyInit.cs +++ b/RefactoringEssentials/Xml/LazyInit.cs @@ -16,16 +16,11 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -using System; -using System.Collections.Generic; -using System.Linq; using System.Threading; -using System.Xml; -using Microsoft.CodeAnalysis.Text; namespace RefactoringEssentials.Xml { - public static class LazyInit + public static class LazyInit { public static object Thread { get; private set; } diff --git a/RefactoringEssentials/Xml/Log.cs b/RefactoringEssentials/Xml/Log.cs index 5f930282..d1874b7e 100644 --- a/RefactoringEssentials/Xml/Log.cs +++ b/RefactoringEssentials/Xml/Log.cs @@ -18,7 +18,6 @@ using System; using System.Diagnostics; -using System.Runtime.Serialization; namespace RefactoringEssentials.Xml { diff --git a/RefactoringEssentials/Xml/ObjectIterator.cs b/RefactoringEssentials/Xml/ObjectIterator.cs index cb3c7370..a85a6965 100644 --- a/RefactoringEssentials/Xml/ObjectIterator.cs +++ b/RefactoringEssentials/Xml/ObjectIterator.cs @@ -16,7 +16,6 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -using System; using System.Collections.Generic; namespace RefactoringEssentials.Xml diff --git a/RefactoringEssentials/Xml/ReuseEqualityComparer.cs b/RefactoringEssentials/Xml/ReuseEqualityComparer.cs index 2cf8a41a..0c513313 100644 --- a/RefactoringEssentials/Xml/ReuseEqualityComparer.cs +++ b/RefactoringEssentials/Xml/ReuseEqualityComparer.cs @@ -16,7 +16,6 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -using System; using System.Collections.Generic; namespace RefactoringEssentials.Xml diff --git a/RefactoringEssentials/Xml/TagMatchingHeuristics.cs b/RefactoringEssentials/Xml/TagMatchingHeuristics.cs index d0fb710e..728ea988 100644 --- a/RefactoringEssentials/Xml/TagMatchingHeuristics.cs +++ b/RefactoringEssentials/Xml/TagMatchingHeuristics.cs @@ -17,9 +17,7 @@ // DEALINGS IN THE SOFTWARE. using System; -using System.Linq; using System.Collections.Generic; -using System.Diagnostics; using System.Threading; using Microsoft.CodeAnalysis.Text; using System.Collections.Immutable; diff --git a/RefactoringEssentials/Xml/TagReader.cs b/RefactoringEssentials/Xml/TagReader.cs index d9d0be3e..5b4f067d 100644 --- a/RefactoringEssentials/Xml/TagReader.cs +++ b/RefactoringEssentials/Xml/TagReader.cs @@ -20,7 +20,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.Globalization; -using System.Linq; using System.Text; using System.Threading; using Microsoft.CodeAnalysis.Text; diff --git a/RefactoringEssentials/Xml/TextType.cs b/RefactoringEssentials/Xml/TextType.cs index a33fb62b..b22cef88 100644 --- a/RefactoringEssentials/Xml/TextType.cs +++ b/RefactoringEssentials/Xml/TextType.cs @@ -16,7 +16,6 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -using System; namespace RefactoringEssentials.Xml { diff --git a/RefactoringEssentials/Xml/TreeTraversal.cs b/RefactoringEssentials/Xml/TreeTraversal.cs index 9b108189..4c2792dc 100644 --- a/RefactoringEssentials/Xml/TreeTraversal.cs +++ b/RefactoringEssentials/Xml/TreeTraversal.cs @@ -18,17 +18,13 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Xml; -using Microsoft.CodeAnalysis.Text; namespace RefactoringEssentials.Xml { - /// - /// Static helper methods for traversing trees. - /// - public static class TreeTraversal + /// + /// Static helper methods for traversing trees. + /// + public static class TreeTraversal { /// /// Converts a tree data structure into a flat list by traversing it in pre-order. diff --git a/Tests/CSharp/CodeFixes/CS0108UseNewKeywordIfHidingIntendedTests.cs b/Tests/CSharp/CodeFixes/CS0108UseNewKeywordIfHidingIntendedTests.cs index cd9304f2..e34f5dc6 100644 --- a/Tests/CSharp/CodeFixes/CS0108UseNewKeywordIfHidingIntendedTests.cs +++ b/Tests/CSharp/CodeFixes/CS0108UseNewKeywordIfHidingIntendedTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeFixes; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeFixes { - [TestFixture] public class CS0108UseNewKeywordIfHidingIntendedTests : CSharpCodeFixTestBase { - [Test] + [Fact] public void TestMethod() { Test(@" @@ -38,7 +37,7 @@ class Baz : Foo }"); } - [Test] + [Fact] public void TestMethodWithComment() { Test(@" @@ -76,7 +75,7 @@ class Baz : Foo }"); } - [Test] + [Fact] public void TestField() { Test(@" @@ -100,7 +99,7 @@ class Baz : Foo }"); } - [Test] + [Fact] public void TestProperty() { Test(@" @@ -124,7 +123,7 @@ class Baz : Foo }"); } - [Test] + [Fact] public void TestType() { Test(@" @@ -156,7 +155,7 @@ class Baz : Foo }"); } - [Test] + [Fact] public void TestIndexer() { Test(@" @@ -224,7 +223,7 @@ class Baz : Foo }"); } - [Test] + [Fact] public void TestStruct() { Test(@" @@ -256,7 +255,7 @@ class Baz : Foo }"); } - [Test] + [Fact] public void TestEnum() { Test(@" @@ -290,7 +289,7 @@ class Baz : Foo }"); } - [Test] + [Fact] public void TestInterface() { Test(@" @@ -322,7 +321,7 @@ class Baz : Foo }"); } - [Test] + [Fact] public void TestDelegate() { Test(@" @@ -346,7 +345,7 @@ class Baz : Foo }"); } - [Test] + [Fact] public void TestEvent() { Test(@" @@ -373,7 +372,7 @@ class Baz : Foo public new event Test Bar; }"); } - [Test] + [Fact] public void FurtherUpInheritanceTree() { Test(@" diff --git a/Tests/CSharp/CodeFixes/CS0152DuplicateCaseLabelValueTests.cs b/Tests/CSharp/CodeFixes/CS0152DuplicateCaseLabelValueTests.cs index db0ed938..4c3f5d4c 100644 --- a/Tests/CSharp/CodeFixes/CS0152DuplicateCaseLabelValueTests.cs +++ b/Tests/CSharp/CodeFixes/CS0152DuplicateCaseLabelValueTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeFixes; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeFixes { - [TestFixture] public class CS0152DuplicateCaseLabelValueTests : CSharpCodeFixTestBase { - [Test] + [Fact] public void TestDuplicateSections() { Test(@" @@ -43,7 +42,7 @@ void TestMethod (int i = 0) }"); } - [Test] + [Fact] public void TestNoDuplicate() { TestWrongContext(@" @@ -67,7 +66,7 @@ void TestMethod (int i = 0) } - [Test] + [Fact] public void TestDuplicateLabels() { Test(@" diff --git a/Tests/CSharp/CodeFixes/CS0164LabelHasNotBeenReferencedTests.cs b/Tests/CSharp/CodeFixes/CS0164LabelHasNotBeenReferencedTests.cs index 3d1cccb6..7fedc468 100644 --- a/Tests/CSharp/CodeFixes/CS0164LabelHasNotBeenReferencedTests.cs +++ b/Tests/CSharp/CodeFixes/CS0164LabelHasNotBeenReferencedTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeFixes; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeFixes { - [TestFixture] public class CS0164LabelHasNotBeenReferencedTests : CSharpCodeFixTestBase { - [Test] + [Fact] public void TestUnusedLabelInMethod() { Test(@" diff --git a/Tests/CSharp/CodeFixes/CS0759RedundantPartialMethodTests.cs b/Tests/CSharp/CodeFixes/CS0759RedundantPartialMethodTests.cs index 3d983df6..f2992ac3 100644 --- a/Tests/CSharp/CodeFixes/CS0759RedundantPartialMethodTests.cs +++ b/Tests/CSharp/CodeFixes/CS0759RedundantPartialMethodTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeFixes; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeFixes { - [TestFixture] public class CS0759RedundantPartialMethodTests : CSharpCodeFixTestBase { - [Test] + [Fact] public void TestRedundantModifier() { var input = @" diff --git a/Tests/CSharp/CodeFixes/CS1105ExtensionMethodMustBeDeclaredStaticTests.cs b/Tests/CSharp/CodeFixes/CS1105ExtensionMethodMustBeDeclaredStaticTests.cs index a7b7ea8b..4dfb91f6 100644 --- a/Tests/CSharp/CodeFixes/CS1105ExtensionMethodMustBeDeclaredStaticTests.cs +++ b/Tests/CSharp/CodeFixes/CS1105ExtensionMethodMustBeDeclaredStaticTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeFixes; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeFixes { - [TestFixture] public class CS1105ExtensionMethodMustBeDeclaredStaticTests : CSharpCodeFixTestBase { - [Test] + [Fact] public void TestMethod() { Test(@" diff --git a/Tests/CSharp/CodeFixes/CS1520MethodMustHaveAReturnTypeTests.cs b/Tests/CSharp/CodeFixes/CS1520MethodMustHaveAReturnTypeTests.cs index 7bb038e6..f9d10234 100644 --- a/Tests/CSharp/CodeFixes/CS1520MethodMustHaveAReturnTypeTests.cs +++ b/Tests/CSharp/CodeFixes/CS1520MethodMustHaveAReturnTypeTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeFixes; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeFixes { - [TestFixture] public class CS1520MethodMustHaveAReturnTypeTests : CSharpCodeFixTestBase { - [Test] + [Fact] public void TestMethod() { Test( @@ -24,7 +23,7 @@ static void Fa(string str) }", 1, true); } - [Test] + [Fact] public void TestConstructor() { Test( @@ -42,7 +41,7 @@ static Foo(string str) }", 0, true); } - [Test] + [Fact] public void TestConstructorWithBase() { Test( diff --git a/Tests/CSharp/CodeFixes/CSharpCodeFixTestBase.cs b/Tests/CSharp/CodeFixes/CSharpCodeFixTestBase.cs index 00efd4aa..a54d9b15 100644 --- a/Tests/CSharp/CodeFixes/CSharpCodeFixTestBase.cs +++ b/Tests/CSharp/CodeFixes/CSharpCodeFixTestBase.cs @@ -1,5 +1,4 @@ using System; -using NUnit.Framework; using System.Threading; using System.Linq; using System.Collections.Generic; @@ -11,10 +10,11 @@ using Microsoft.CodeAnalysis.CSharp.Formatting; using Microsoft.CodeAnalysis.CodeActions; using Microsoft.CodeAnalysis.CodeFixes; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeFixes { - public abstract class CSharpCodeFixTestBase : CodeFixTestBase + public abstract class CSharpCodeFixTestBase : CodeFixTestBase { public void Test(string input, string output, int action = 0, bool expectErrors = false, CSharpParseOptions parseOptions = null) where T : CodeFixProvider, new() @@ -34,7 +34,7 @@ public void Test(CodeFixProvider provider, string input, string output, int acti Console.WriteLine("-----------Got:"); Console.WriteLine(result); } - Assert.AreEqual(output, result); + Assert.Equal(output, result); } internal static List GetActions(string input) where T : CodeFixProvider, new() @@ -107,7 +107,7 @@ static List GetActions(CodeFixProvider action, string input, out Dia { if (selectedSpan.Start > 0) - Assert.AreEqual(selectedSpan, d.Location.SourceSpan, "Activation span does not match."); + Assert.True(selectedSpan == d.Location.SourceSpan, "Activation span does not match."); var context = new CodeFixContext(doc, d.Location.SourceSpan, diagnostics.Where(d2 => d2.Location.SourceSpan == d.Location.SourceSpan).ToImmutableArray(), (arg1, arg2) => actions.Add(Tuple.Create(arg1, arg2)), default(CancellationToken)); action.RegisterCodeFixesAsync(context); @@ -143,7 +143,7 @@ protected void TestWrongContext(CodeFixProvider action, string input) Document doc; DiagnosticTestBase.TestWorkspace workspace; var actions = GetActions(action, input, out workspace, out doc); - Assert.IsTrue(actions == null || actions.Count == 0, action.GetType() + " shouldn't be valid there."); + Assert.True(actions == null || actions.Count == 0, action.GetType() + " shouldn't be valid there."); } } } diff --git a/Tests/CSharp/CodeFixes/InvalidConversionTests.cs b/Tests/CSharp/CodeFixes/InvalidConversionTests.cs index dd51d2bf..73c1f5a7 100644 --- a/Tests/CSharp/CodeFixes/InvalidConversionTests.cs +++ b/Tests/CSharp/CodeFixes/InvalidConversionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeFixes; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeFixes { - [TestFixture] public class InvalidConversionTests : CSharpCodeFixTestBase { - [Test] + [Fact] public void TestConversion() { var input = @" @@ -32,7 +31,7 @@ void TestMethod (Enum i) Test(input, output); } - [Test] + [Fact] public void TestConversionInInitializer() { var input = @" @@ -56,7 +55,7 @@ void TestMethod (Enum i) Test(input, output); } - [Test] + [Fact] public void TestConversionDoubleFloat() { var input = @" @@ -81,7 +80,7 @@ void Bar () { Test(input, output); } - [Test] + [Fact] public void TestConversionEnumToInt() { var input = @" @@ -108,7 +107,7 @@ void Bar () { } - [Test] + [Fact] public void AssignCustomClassToString() { Test(@" @@ -128,7 +127,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestReturnInMethod() { var input = @" @@ -152,7 +151,7 @@ int TestMethod (Enum i) Test(input, output); } - [Test] + [Fact] public void TestReturnInMethodChangeReturnType() { var input = @" @@ -175,7 +174,7 @@ string TestMethod () } - [Test] + [Fact] public void TestReturnInAnonymousMethod() { var input = @"using System; @@ -206,7 +205,7 @@ void TestMethod (Enum i) } - [Test] + [Fact] public void TestReturnInProperty() { var input = @" @@ -232,7 +231,7 @@ int Test { Test(input, output); } - [Test] + [Fact] public void TestCall() { var input = @" @@ -260,7 +259,7 @@ void TestMethod (Enum i) - [Test] + [Fact] public void TestArrayInitializer() { var input = @" @@ -286,7 +285,7 @@ public static void Main (string[] args) - [Test] + [Fact] public void TestBinaryOperator() { var input = @" @@ -312,7 +311,7 @@ void TestMethod (ulong i) Test(input, output); } - [Test] + [Fact] public void TestDeclarationFix() { Test(@" @@ -328,7 +327,7 @@ class TestClass }"); } - [Test] + [Fact] public void TestLocalDeclarationFix() { Test(@" diff --git a/Tests/CSharp/CodeFixes/ReturnMustNotBeFollowedByAnyExpressionCodeFixProviderTests.cs b/Tests/CSharp/CodeFixes/ReturnMustNotBeFollowedByAnyExpressionCodeFixProviderTests.cs index 45b8a705..4af5fd4a 100644 --- a/Tests/CSharp/CodeFixes/ReturnMustNotBeFollowedByAnyExpressionCodeFixProviderTests.cs +++ b/Tests/CSharp/CodeFixes/ReturnMustNotBeFollowedByAnyExpressionCodeFixProviderTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeFixes; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeFixes { - [TestFixture] public class ReturnMustNotBeFollowedByAnyExpressionCodeFixProviderTests : CSharpCodeFixTestBase { - [Test] + [Fact] public void TestSimpleCase() { Test(@"class Foo @@ -25,7 +24,7 @@ void Bar (string str) } - [Test] + [Fact] public void TestReturnTypeFix() { Test(@"class Foo @@ -43,7 +42,7 @@ string Bar (string str) }", 1); } - [Test] + [Fact] public void TestAnonymousMethod() { Test(@"class Foo diff --git a/Tests/CSharp/CodeFixes/UnreachableCodeTests.cs b/Tests/CSharp/CodeFixes/UnreachableCodeTests.cs index d16ede74..7ea08753 100644 --- a/Tests/CSharp/CodeFixes/UnreachableCodeTests.cs +++ b/Tests/CSharp/CodeFixes/UnreachableCodeTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeFixes; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeFixes { - [TestFixture] public class CS0162UnreachableCodeDetectedTests : CSharpCodeFixTestBase { - [Test] + [Fact] public void TestReturn() { Test(@" @@ -27,7 +26,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestBreak() { Test(@" @@ -52,8 +51,7 @@ void TestMethod () }"); } - [Ignore("Not supported")] - [Test] + [Fact(Skip="Not supported")] public void TestRedundantGoto() { Test(@" @@ -74,8 +72,7 @@ void TestMethod () }"); } - [Ignore("Not supported")] - [Test] + [Fact(Skip="Not supported")] public void TestGotoUnreachableBlock() { Test(@" @@ -106,7 +103,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestContinue() { Test(@" @@ -132,7 +129,7 @@ void TestMethod () } - [Test] + [Fact] public void TestFor() { Test(@" @@ -156,7 +153,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestConstantCondition() { Test(@" @@ -181,9 +178,8 @@ void TestMethod () }"); } - [Ignore("Not supported.")] - [Test] - public void TestConditionalExpression() + [Fact(Skip = "Not supported")] + public void TestConditionalExpression() { var output = @" class TestClass @@ -203,7 +199,7 @@ void TestMethod () }", output); } - [Test] + [Fact] public void TestInsideLambda() { Test(@" @@ -228,7 +224,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestInsideAnonymousMethod() { Test(@" @@ -253,7 +249,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestIgnoreLambdaBody() { Test(@" @@ -280,7 +276,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestIgnoreAnonymousMethodBody() { Test(@" @@ -307,7 +303,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestGroupMultipleStatements() { Test(@" @@ -330,7 +326,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestRemoveCode() { Test(@" @@ -351,8 +347,7 @@ void TestMethod () }", 0); } - [Ignore("Got broken due ast new line nodes")] - [Test] + [Fact(Skip="Got broken due ast new line nodes")] public void TestCommentCode() { var input = @" @@ -380,8 +375,7 @@ void TestMethod () Test(input, output, 1); } - [Ignore("Broken.")] - [Test] + [Fact(Skip="Broken.")] public void TestIfTrueBranch() { Test(@" @@ -407,8 +401,7 @@ void TestMethod () }"); } - [Ignore("Broken.")] - [Test] + [Fact(Skip="Broken.")] public void TestIfFalseBranch() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/AddAnotherAccessorTests.cs b/Tests/CSharp/CodeRefactorings/AddAnotherAccessorTests.cs index d586f672..86f5b916 100644 --- a/Tests/CSharp/CodeRefactorings/AddAnotherAccessorTests.cs +++ b/Tests/CSharp/CodeRefactorings/AddAnotherAccessorTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class AddAnotherAccessorTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestAddSet() { Test(@" @@ -39,7 +38,7 @@ public int Field }"); } - [Test] + [Fact] public void TestAddSet_ReadOnlyField() { Test(@" @@ -72,7 +71,7 @@ public int Field }"); } - [Test] + [Fact] public void TestAddGet() { Test(@" @@ -104,7 +103,7 @@ public int Field }"); } - [Test] + [Fact] public void TestAddGetWithComment() { Test(@" @@ -137,7 +136,7 @@ public int Field }"); } - [Test] + [Fact] public void TestAutoProperty() { Test(@" @@ -157,7 +156,7 @@ string Test }"); } - [Test] + [Fact] public void TestAutoPropertyWithComment() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/AddArgumentNameTests.cs b/Tests/CSharp/CodeRefactorings/AddArgumentNameTests.cs index dd017d5f..7c7c00df 100644 --- a/Tests/CSharp/CodeRefactorings/AddArgumentNameTests.cs +++ b/Tests/CSharp/CodeRefactorings/AddArgumentNameTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class AddArgumentNameTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void MethodInvocation1() { Test(@" @@ -28,7 +27,7 @@ public void F() }"); } - [Test] + [Fact] public void MethodInvocation1WithComment() { Test(@" @@ -52,7 +51,7 @@ public void F() }"); } - [Test] + [Fact] public void MethodInvocation2() { Test(@" @@ -74,7 +73,7 @@ public void F() }"); } - [Test] + [Fact] public void AttributeUsage() { Test(@" @@ -92,7 +91,7 @@ static void Old() { } }"); } - [Test] + [Fact] public void AttributeUsageWithComment() { Test(@" @@ -112,7 +111,7 @@ static void Old() { } }"); } - [Test] + [Fact] public void AttributeNamedArgument() { Test(@" @@ -156,7 +155,7 @@ public class Test "); } - [Test] + [Fact] public void AttributeWithParams() { TestWrongContext(@"using System; @@ -178,7 +177,7 @@ public class TestClass "); } - [Test] + [Fact] public void AttributeNamedArgumentInvalidCase() { TestWrongContext(@" @@ -203,7 +202,7 @@ public class Test "); } - [Test] + [Fact] public void IndexerInvocation() { Test(@" @@ -241,7 +240,7 @@ private void Foo() }"); } - [Test] + [Fact] public void TestParamsInvalidContext() { @@ -256,7 +255,7 @@ public void F() } - [Test] + [Fact] public void Expression() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/AddBracesTests.cs b/Tests/CSharp/CodeRefactorings/AddBracesTests.cs index 7e25294f..c53a88fb 100644 --- a/Tests/CSharp/CodeRefactorings/AddBracesTests.cs +++ b/Tests/CSharp/CodeRefactorings/AddBracesTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class AddBracesTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestAddBracesToIf() { Test(@"class TestClass @@ -28,7 +27,7 @@ void Test() }"); } - [Test] + [Fact] public void TestAddBracesToIfWithComment() { Test(@"class TestClass @@ -52,8 +51,7 @@ void Test() }"); } - [Ignore("broken")] - [Test] + [Fact(Skip="Broken.")] public void TestAddBracesToIfWithCommentInBlock() { Test(@"class TestClass @@ -77,7 +75,7 @@ void Test() }"); } - [Test] + [Fact] public void TestAddBracesToElse() { Test(@"class TestClass @@ -105,7 +103,7 @@ void Test() }"); } - [Test] + [Fact] public void TestAddBracesToDoWhile() { Test(@"class TestClass @@ -129,7 +127,7 @@ void Test() }"); } - [Test] + [Fact] public void TestAddBracesToForeach() { Test(@"class TestClass @@ -151,7 +149,7 @@ void Test() }"); } - [Test] + [Fact] public void TestAddBracesToFor() { Test(@"class TestClass @@ -173,7 +171,7 @@ void Test() }"); } - [Test] + [Fact] public void TestAddBracesToLock() { Test(@"class TestClass @@ -195,7 +193,7 @@ void Test() }"); } - [Test] + [Fact] public void TestAddBracesToUsing() { Test(@"class TestClass @@ -217,7 +215,7 @@ void Test() }"); } - [Test] + [Fact] public void TestAddBracesToWhile() { Test(@"class TestClass @@ -239,7 +237,7 @@ void Test() }"); } - [Test] + [Fact] public void TestBlockAlreadyInserted() { TestWrongContext(@"class TestClass @@ -254,7 +252,7 @@ void Test() }"); } - [Test] + [Fact] public void TestNullNode() { TestWrongContext(@"class TestClass diff --git a/Tests/CSharp/CodeRefactorings/AddCatchExceptionTests.cs b/Tests/CSharp/CodeRefactorings/AddCatchExceptionTests.cs index 08116677..441fbb43 100644 --- a/Tests/CSharp/CodeRefactorings/AddCatchExceptionTests.cs +++ b/Tests/CSharp/CodeRefactorings/AddCatchExceptionTests.cs @@ -1,12 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - public class AddCatchExceptionTests : CSharpCodeRefactoringTestBase + public class AddCatchExceptionTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void HandlesBasicCase() { Test(@" @@ -33,7 +33,7 @@ public void F() }"); } - [Test] + [Fact] public void HandlesBasicCaseWithBraceOnOwnLine() { Test(@" @@ -63,7 +63,7 @@ public void F() }"); } - [Test] + [Fact] public void PreservesWhitespaceInBody() { Test(@" @@ -92,7 +92,7 @@ public void F() }"); } - [Test] + [Fact] public void DoesNotUseRedundantNamespace() { Test(@" @@ -121,7 +121,7 @@ public void F() }"); } - [Test] + [Fact] public void DoesNotMatchCatchesWithType() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/AddExceptionDescriptionTests.cs b/Tests/CSharp/CodeRefactorings/AddExceptionDescriptionTests.cs index a930b94d..00946c90 100644 --- a/Tests/CSharp/CodeRefactorings/AddExceptionDescriptionTests.cs +++ b/Tests/CSharp/CodeRefactorings/AddExceptionDescriptionTests.cs @@ -1,13 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class AddExceptionDescriptionTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestPlainEntity() { TestWrongContext(@"using System; @@ -22,7 +21,7 @@ public void Bar(Test test) "); } - [Test] + [Fact] public void TestAddToExistingDocumentation() { Test(@"using System; @@ -55,7 +54,7 @@ public void Bar(Test test) "); } - [Test] + [Fact] public void TestAddRethrowToExistingDocumentation1() { Test(@"using System; @@ -100,7 +99,7 @@ public void Bar(Test test) "); } - [Test] + [Fact] public void TestAddRethrowToExistingDocumentation2() { Test(@"using System; @@ -145,7 +144,7 @@ public void Bar(Test test) "); } - [Test] + [Fact] public void TestAlreadyAdded() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/AddNullCheckTests.cs b/Tests/CSharp/CodeRefactorings/AddNullCheckTests.cs index e11a4376..f28115c9 100644 --- a/Tests/CSharp/CodeRefactorings/AddNullCheckTests.cs +++ b/Tests/CSharp/CodeRefactorings/AddNullCheckTests.cs @@ -1,16 +1,15 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp; using RefactoringEssentials.Tests.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp { - /// - /// Tests for AddNullCheckCodeRefactoringProvider. - /// - [TestFixture] + /// + /// Tests for AddNullCheckCodeRefactoringProvider. + /// public class AddNullCheckTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSingleExpression() { Test(@" @@ -37,7 +36,7 @@ public void TestMethod(string str) }"); } - [Test] + [Fact] public void TestValueType() { TestWrongContext(@" @@ -52,7 +51,7 @@ public void TestMethod(DateTime dateTime) }"); } - [Test] + [Fact] public void TestNullableType() { Test(@" @@ -79,7 +78,7 @@ public void TestMethod(DateTime? dateTime) }"); } - [Test] + [Fact] public void TestMemberAccessExpression1() { Test(@" @@ -118,7 +117,7 @@ public void TestMethod() }"); } - [Test] + [Fact] public void TestMemberAccessExpression2() { Test(@" @@ -157,7 +156,7 @@ public void TestMethod() }"); } - [Test] + [Fact] public void TestMemberAccessExpression3() { Test(@" @@ -206,7 +205,7 @@ public void TestMethod() }"); } - [Test] + [Fact] public void TestStaticMemberAccessExpression() { TestWrongContext(@" @@ -226,7 +225,7 @@ public void TestMethod() }"); } - [Test] + [Fact] public void TestMethodInvocation() { Test(@" @@ -269,7 +268,7 @@ public void TestMethod() }"); } - [Test] + [Fact] public void TestStaticMethodInvocation() { TestWrongContext(@" @@ -291,7 +290,7 @@ public void TestMethod() }"); } - [Test] + [Fact] public void TestIndexerAccess() { Test(@" @@ -318,7 +317,7 @@ public void TestMethod(string str) }"); } - [Test] + [Fact] public void TestMultipleUsage() { Test(@" @@ -347,7 +346,7 @@ public void TestMethod(string str) }"); } - [Test] + [Fact] public void TestLocalVariable() { Test(@" @@ -378,7 +377,7 @@ public void TestMethod(string str) }"); } - [Test] + [Fact] public void TestLocalVariableDeclaration() { TestWrongContext(@" @@ -395,7 +394,7 @@ public void TestMethod(string str) }"); } - [Test] + [Fact] public void TestUsageInLocalVariableDeclaration() { TestWrongContext(@" @@ -412,7 +411,7 @@ public void TestMethod(string str) }"); } - [Test] + [Fact] public void TestUsageInReturnStatement() { TestWrongContext(@" @@ -427,7 +426,7 @@ public string TestMethod(string str) }"); } - [Test] + [Fact] public void TestUsageInIfCondition() { Test(@" @@ -459,7 +458,7 @@ public void TestMethod(IEnumerable list) }"); } - [Test] + [Fact] public void TestUsageInIfBlock() { Test(@" @@ -491,7 +490,7 @@ public void TestMethod(int i, string str) }"); } - [Test] + [Fact] public void TestUsageInForLoop() { Test(@" @@ -526,7 +525,7 @@ public void TestMethod(IEnumerable list) }"); } - [Test] + [Fact] public void TestUsageInWhileLoop() { Test(@" @@ -563,7 +562,7 @@ public void TestMethod(IList list) }"); } - [Test] + [Fact] public void TestUsageInLambda() { TestWrongContext(@" @@ -580,7 +579,7 @@ public void TestMethod(IList list) }"); } - [Test] + [Fact] public void TestAlreadyPresentIfNotNullCheck1() { TestWrongContext(@" @@ -598,7 +597,7 @@ public void TestMethod(string str) }"); } - [Test] + [Fact] public void TestAlreadyPresentIfNotNullCheck2() { TestWrongContext(@" @@ -617,7 +616,7 @@ public void TestMethod(IEnumerable list) }"); } - [Test] + [Fact] public void TestAlreadyPresentIfNotNullCheck3() { TestWrongContext(@" @@ -636,7 +635,7 @@ public void TestMethod(IEnumerable list) }"); } - [Test] + [Fact] public void TestAlreadyPresentIfNotNullCheck4() { TestWrongContext(@" @@ -655,7 +654,7 @@ public void TestMethod(IEnumerable list) }"); } - [Test] + [Fact] public void TestAlreadyPresentNotNullCheckInWhileLoop() { TestWrongContext(@" @@ -674,7 +673,7 @@ public void TestMethod(string str) }"); } - [Test] + [Fact] public void TestAlreadyPresentNullCheckInForLoop() { TestWrongContext(@" @@ -692,7 +691,7 @@ public void TestMethod(string str) }"); } - [Test] + [Fact] public void TestAlreadyPresentNullCheckInConditionalTernaryExpression1() { TestWrongContext(@" @@ -708,7 +707,7 @@ public void TestMethod(IEnumerable list) }"); } - [Test] + [Fact] public void TestAlreadyPresentNullCheckInConditionalTernaryExpression2() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/AddOptionalParameterToInvocationTests.cs b/Tests/CSharp/CodeRefactorings/AddOptionalParameterToInvocationTests.cs index 4206dcd0..1ce74ceb 100644 --- a/Tests/CSharp/CodeRefactorings/AddOptionalParameterToInvocationTests.cs +++ b/Tests/CSharp/CodeRefactorings/AddOptionalParameterToInvocationTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class AddOptionalParameterToInvocationTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimple() { Test(@" @@ -26,7 +25,7 @@ public void Bar() { }"); } - [Test] + [Fact] public void TestSimpleWithComment() { Test(@" @@ -48,7 +47,7 @@ public void Bar() { }"); } - [Test] + [Fact] public void TestMultiple1() { Test(@" @@ -68,7 +67,7 @@ public void Bar() { }"); } - [Test] + [Fact] public void TestExtensionMethod() { Test(@" @@ -94,7 +93,7 @@ public void Bar() { }"); } - [Test] + [Fact] public void TestMultiple2() { Test(@" @@ -114,7 +113,7 @@ public void Bar() { }", 1); } - [Test] + [Fact] public void TestMultiple3() { Test(@" @@ -136,7 +135,7 @@ public void Bar() }", 2); } - [Test] + [Fact] public void TestNoMoreParameters() { TestWrongContext(@" @@ -150,7 +149,7 @@ public void Bar() { "); } - [Test] + [Fact] public void TestParams() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/AutoLinqSumTests.cs b/Tests/CSharp/CodeRefactorings/AutoLinqSumTests.cs index 936f2823..adf3ee75 100644 --- a/Tests/CSharp/CodeRefactorings/AutoLinqSumTests.cs +++ b/Tests/CSharp/CodeRefactorings/AutoLinqSumTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class AutoLinqSumActionTests : CSharpCodeRefactoringTestBase { - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestSimpleIntegerLoop() { string source = @" @@ -34,10 +33,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestMergedIntegerLoop() { string source = @" @@ -64,10 +63,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestNonZeroMergedIntegerLoop() { string source = @" @@ -94,10 +93,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestMergedAssignmentIntegerLoop() { string source = @" @@ -126,10 +125,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestMergedDecimal() { string source = @" @@ -156,10 +155,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestIntegerLoopInBlock() { string source = @" @@ -188,10 +187,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestExpression() { string source = @" @@ -220,10 +219,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test] + [Fact] public void TestDisabledForStrings() { string source = @" @@ -242,7 +241,7 @@ void TestMethod() { TestWrongContext(source); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestShort() { string source = @" @@ -270,10 +269,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestLong() { string source = @" @@ -301,10 +300,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestUnsignedLong() { string source = @" @@ -332,10 +331,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestFloat() { string source = @" @@ -363,10 +362,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestDouble() { string source = @" @@ -394,10 +393,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestDecimal() { string source = @" @@ -425,10 +424,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestMinus() { string source = @" @@ -457,10 +456,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestCombined() { string source = @" @@ -490,10 +489,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestCombinedPrecedence() { string source = @" @@ -523,10 +522,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestEmptyStatements() { string source = @" @@ -556,10 +555,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestSimpleConditional() { string source = @" @@ -589,10 +588,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestInvertedConditional() { string source = @" @@ -624,10 +623,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestIncrement() { string source = @" @@ -656,10 +655,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestCompleteConditional() { string source = @" @@ -691,10 +690,10 @@ void TestMethod() { } }"; - Assert.AreEqual(result, RunContextAction(new AutoLinqSumAction(), source)); + Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); } - [Test] + [Fact] public void TestDisabledForSideEffects() { string source = @" @@ -714,7 +713,7 @@ void TestMethod() { TestWrongContext(source); } - [Test] + [Fact] public void TestDisabledForInnerAssignments() { string source = @" @@ -734,7 +733,7 @@ void TestMethod() { TestWrongContext(source); } - [Test] + [Fact] public void TestDisabledForInnerIncrements() { string source = @" @@ -754,7 +753,7 @@ void TestMethod() { TestWrongContext(source); } - [Test] + [Fact] public void TestDisabledForNoLinq() { string source = @" diff --git a/Tests/CSharp/CodeRefactorings/CSharpCodeRefactoringTestBase.cs b/Tests/CSharp/CodeRefactorings/CSharpCodeRefactoringTestBase.cs index 2e2fb3a1..4111bbdf 100644 --- a/Tests/CSharp/CodeRefactorings/CSharpCodeRefactoringTestBase.cs +++ b/Tests/CSharp/CodeRefactorings/CSharpCodeRefactoringTestBase.cs @@ -1,5 +1,4 @@ using System; -using NUnit.Framework; using System.Threading; using System.Linq; using System.Collections.Generic; @@ -12,10 +11,11 @@ using Microsoft.CodeAnalysis.CSharp.Formatting; using Microsoft.CodeAnalysis.CodeActions; using Microsoft.CodeAnalysis.Simplification; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - public abstract class CSharpCodeRefactoringTestBase : CodeRefactoringTestBase + public abstract class CSharpCodeRefactoringTestBase : CodeRefactoringTestBase { public void Test(string input, string output, int action = 0, bool expectErrors = false, CSharpParseOptions parseOptions = null) where T : CodeRefactoringProvider, new() @@ -35,7 +35,7 @@ public void Test(CodeRefactoringProvider provider, string input, string output, Console.WriteLine("-----------Got:"); Console.WriteLine(result); } - Assert.AreEqual(output, result); + Assert.Equal(output, result); } internal static List GetActions(string input) where T : CodeRefactoringProvider, new() @@ -107,7 +107,7 @@ static List GetActions(CodeRefactoringProvider action, string input, { foreach (var nra in actions.OfType()) { - Assert.AreEqual(markedSpan, nra.TextSpan, "Activation span does not match."); + Assert.True(markedSpan == nra.TextSpan, "Activation span does not match."); } } return actions; @@ -137,7 +137,7 @@ protected void TestWrongContext(CodeRefactoringProvider action, string input) Document doc; RefactoringEssentials.Tests.CSharp.Diagnostics.CSharpDiagnosticTestBase.TestWorkspace workspace; var actions = GetActions(action, input, out workspace, out doc); - Assert.IsTrue(actions == null || actions.Count == 0, action.GetType() + " shouldn't be valid there."); + Assert.True(actions == null || actions.Count == 0, action.GetType() + " shouldn't be valid there."); } @@ -158,7 +158,7 @@ protected void TestWrongContext(CodeRefactoringProvider action, string input) // var ctx = TestRefactoringContext.Create(input); // ctx.FormattingOptions = formattingOptions; // var actions = provider.GetActions(ctx).ToList(); - // Assert.AreEqual( + // Assert.Equal( // expected, // actions.Select(a => a.Description).ToArray()); // } diff --git a/Tests/CSharp/CodeRefactorings/ChangeAccessModifierTests.cs b/Tests/CSharp/CodeRefactorings/ChangeAccessModifierTests.cs index 2bc7ec9e..5e8c4dd2 100644 --- a/Tests/CSharp/CodeRefactorings/ChangeAccessModifierTests.cs +++ b/Tests/CSharp/CodeRefactorings/ChangeAccessModifierTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ChangeAccessModifierTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestNoEnumMember() { TestWrongContext(@" @@ -16,7 +15,7 @@ enum Test }"); } - [Test] + [Fact] public void TestNoInterfaceMember() { TestWrongContext(@" @@ -26,7 +25,7 @@ interface Test }"); } - [Test] + [Fact] public void TestNoExplicitInterfaceImplementationMember() { TestWrongContext(@" @@ -40,7 +39,7 @@ class TestClass : Test }"); } - [Test] + [Fact] public void TestNoOverrideMember() { TestWrongContext(@" @@ -54,7 +53,7 @@ class TestClass : Test }"); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestType() { Test(@" @@ -66,7 +65,7 @@ public class Foo }"); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestMethodToProtected() { Test(@" @@ -84,7 +83,7 @@ protected void Bar () }"); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestPrivateMethodToProtected() { Test(@" @@ -102,7 +101,7 @@ protected void Bar () }"); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestMethodToProtectedInternal() { Test(@" @@ -120,7 +119,7 @@ protected internal void Bar () }", 1); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestAccessor() { Test(@" @@ -140,7 +139,7 @@ public int Bar }"); } - [Test] + [Fact] public void TestStrictAccessor() { TestWrongContext(@" @@ -153,7 +152,7 @@ private int Bar }"); } - [Test, Ignore("Not implemented!")] + [Fact(Skip="Not implemented!")] public void TestChangeAccessor() { Test(@" @@ -173,7 +172,7 @@ public int Bar }"); } - [Test] + [Fact] public void TestReturnTypeWrongContext() { TestWrongContext(@" @@ -183,7 +182,7 @@ class Test }"); } - [Test] + [Fact] public void TestWrongModiferContext() { TestWrongContext(@" @@ -193,7 +192,7 @@ class Test }"); } - [Test] + [Fact] public void TestMethodImplementingInterface() { TestWrongContext(@"using System; diff --git a/Tests/CSharp/CodeRefactorings/CheckArrayIndexValueTests.cs b/Tests/CSharp/CodeRefactorings/CheckArrayIndexValueTests.cs index b26017b3..c06f054c 100644 --- a/Tests/CSharp/CodeRefactorings/CheckArrayIndexValueTests.cs +++ b/Tests/CSharp/CodeRefactorings/CheckArrayIndexValueTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class CheckArrayIndexValueTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleCase() { Test(@" @@ -27,7 +26,7 @@ public static void Main (string[] args) }"); } - [Test] + [Fact] public void TestNestedCase() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/CheckCollectionIndexValueTests.cs b/Tests/CSharp/CodeRefactorings/CheckCollectionIndexValueTests.cs index 957d6b4a..1714824d 100644 --- a/Tests/CSharp/CodeRefactorings/CheckCollectionIndexValueTests.cs +++ b/Tests/CSharp/CodeRefactorings/CheckCollectionIndexValueTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class CheckCollectionIndexValueTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleCase() { @@ -30,7 +29,7 @@ public static void Main (List args) }"); } - [Test] + [Fact] public void TestNestedCase() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/CheckDictionaryKeyValueTests.cs b/Tests/CSharp/CodeRefactorings/CheckDictionaryKeyValueTests.cs index fd455a9a..a371fcc6 100644 --- a/Tests/CSharp/CodeRefactorings/CheckDictionaryKeyValueTests.cs +++ b/Tests/CSharp/CodeRefactorings/CheckDictionaryKeyValueTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; -using System.Collections.Generic; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class CheckDictionaryKeyValueTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleCase() { Test(@" @@ -29,7 +27,7 @@ public static void Main (System.Collections.Generic.IDictionary args) }"); } - [Test] + [Fact] public void TestNestedCase() { Test(@" @@ -57,7 +55,7 @@ public static void Main (System.Collections.Generic.IDictionary args) }"); } - [Test] + [Fact] public void TestNameClash() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/CheckIfParameterIsNullTests.cs b/Tests/CSharp/CodeRefactorings/CheckIfParameterIsNullTests.cs index 489766c0..40877e74 100644 --- a/Tests/CSharp/CodeRefactorings/CheckIfParameterIsNullTests.cs +++ b/Tests/CSharp/CodeRefactorings/CheckIfParameterIsNullTests.cs @@ -1,16 +1,15 @@ using System; -using NUnit.Framework; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis; using System.Collections.Immutable; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class CheckIfParameterIsNullTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void Test() { string result = RunContextAction( @@ -25,7 +24,7 @@ public void Test() "}" ); - Assert.AreEqual( + Assert.Equal( "using System;" + Environment.NewLine + "class TestClass" + Environment.NewLine + "{" + Environment.NewLine + @@ -38,8 +37,7 @@ public void Test() "}", result); } - [Ignore("broken")] - [Test] + [Fact(Skip="Broken.")] public void TestWithComment() { string result = RunContextAction( @@ -55,7 +53,7 @@ public void TestWithComment() "}" ); - Assert.AreEqual( + Assert.Equal( "using System;" + Environment.NewLine + "class TestClass" + Environment.NewLine + "{" + Environment.NewLine + @@ -69,7 +67,7 @@ public void TestWithComment() "}", result); } - [Test] + [Fact] public void TestLambda() { Test(@"class Foo @@ -91,7 +89,7 @@ void Test () }"); } - [Test] + [Fact] public void TestAnonymousMethod() { Test(@"class Foo @@ -113,7 +111,7 @@ void Test () }"); } - [Test] + [Fact] public void TestNullCheckAlreadyThere_StringName() { TestWrongContext(@"class Foo @@ -128,7 +126,7 @@ void Test () }"); } - [Test] + [Fact] public void TestNullCheckAlreadyThere_NameOf() { TestWrongContext(@"class Foo @@ -143,7 +141,7 @@ void Test () }"); } - [Test] + [Fact] public void TestPopupOnlyOnName() { TestWrongContext(@"class Foo @@ -155,7 +153,7 @@ void Test ($string param) } - [Test] + [Fact] public void Test_OldCSharp() { var parseOptions = new CSharpParseOptions( diff --git a/Tests/CSharp/CodeRefactorings/CheckStringBuilderIndexValueTests.cs b/Tests/CSharp/CodeRefactorings/CheckStringBuilderIndexValueTests.cs index 0121195e..0093fe91 100644 --- a/Tests/CSharp/CodeRefactorings/CheckStringBuilderIndexValueTests.cs +++ b/Tests/CSharp/CodeRefactorings/CheckStringBuilderIndexValueTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class CheckStringBuilderIndexValueTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleCase() { Test(@" @@ -27,7 +26,7 @@ public static void Main (System.Text.StringBuilder args) }"); } - [Test] + [Fact] public void TestNestedCase() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/CheckStringIndexValueTests.cs b/Tests/CSharp/CodeRefactorings/CheckStringIndexValueTests.cs index 3933ecfa..2d344489 100644 --- a/Tests/CSharp/CodeRefactorings/CheckStringIndexValueTests.cs +++ b/Tests/CSharp/CodeRefactorings/CheckStringIndexValueTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class CheckStringIndexValueTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleCase() { Test(@" @@ -27,7 +26,7 @@ public static void Main (string args) }"); } - [Test] + [Fact] public void TestNestedCase() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ComputeConstantValueTests.cs b/Tests/CSharp/CodeRefactorings/ComputeConstantValueTests.cs index d0d91efb..ddcbe0f4 100644 --- a/Tests/CSharp/CodeRefactorings/ComputeConstantValueTests.cs +++ b/Tests/CSharp/CodeRefactorings/ComputeConstantValueTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ComputeConstantValueTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void Rational1() { Test(@" @@ -26,7 +25,7 @@ public void F() }"); } - [Test] + [Fact] public void Rational1WithComment() { Test(@" @@ -48,7 +47,7 @@ public void F() }"); } - [Test] + [Fact] public void Rational2() { Test(@" @@ -67,7 +66,7 @@ public void F() } }"); } - [Test] + [Fact] public void Rational3() { Test(@" @@ -86,7 +85,7 @@ public void F() } }"); } - [Test] + [Fact] public void Rational4() { Test(@" @@ -105,7 +104,7 @@ public void F() } }"); } - [Test] + [Fact] public void Rational5() { Test(@" @@ -124,7 +123,7 @@ public void F() } }"); } - [Test] + [Fact] public void Rational6() { Test(@" @@ -144,7 +143,7 @@ public void F() }"); } - [Test] + [Fact] public void Bool1() { Test(@" @@ -164,7 +163,7 @@ public void F() }"); } - [Test] + [Fact] public void Bool2() { Test(@" @@ -184,7 +183,7 @@ public void F() }"); } - [Test] + [Fact] public void Bool3() { Test(@" @@ -204,7 +203,7 @@ public void F() }"); } - [Test] + [Fact] public void String1() { Test(@" @@ -224,7 +223,7 @@ public void F() }"); } - [Test] + [Fact] public void UseConstant() { Test(@" @@ -247,7 +246,7 @@ public void F() } - [Test] + [Fact] public void Invalid() { TestWrongContext(@" @@ -262,7 +261,7 @@ public void F() } - [Test] + [Fact] public void TestWrongHotSpot() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/ContractEnsuresNotNullReturnTests.cs b/Tests/CSharp/CodeRefactorings/ContractEnsuresNotNullReturnTests.cs index 86b72cc7..db34f07b 100644 --- a/Tests/CSharp/CodeRefactorings/ContractEnsuresNotNullReturnTests.cs +++ b/Tests/CSharp/CodeRefactorings/ContractEnsuresNotNullReturnTests.cs @@ -1,17 +1,14 @@ -using System; -using NUnit.Framework; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis; using System.Collections.Immutable; using RefactoringEssentials.CSharp.CodeRefactorings; -using System.Diagnostics.Contracts; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ContractEnsuresNotNullReturnTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void ValueTypeReturnType() { TestWrongContext( @@ -23,7 +20,7 @@ public void ValueTypeReturnType() }"); } - [Test] + [Fact] public void NullableValueTypeLocalVariable() { TestWrongContext( @@ -36,7 +33,7 @@ public void Foo() }"); } - [Test] + [Fact] public void VoidReturnType() { TestWrongContext( @@ -48,7 +45,7 @@ public void VoidReturnType() }"); } - [Test] + [Fact] // Not sure why anyone would want this when can just change the return type to be non nullable. Maybe you have to implement an interface you don't control or something strange like that. public void NullableValueTypeReturnType() { @@ -69,7 +66,7 @@ class Test }"); } - [Test] + [Fact] public void ObjectReturnType() { Test( @@ -89,7 +86,7 @@ public Cedd Foo() }"); } - [Test] + [Fact] public void UsingStatementAlreadyThere() { Test( @@ -111,7 +108,7 @@ public Cedd Foo() }"); } - [Test] + [Fact] public void TestContractEnsuresReturnAlreadyThere() { TestWrongContext(@"class Test @@ -123,7 +120,7 @@ public void TestContractEnsuresReturnAlreadyThere() }"); } - [Test] + [Fact] public void TestContractEnsuresReturnAlreadyThereWithWhitespace() { TestWrongContext(@"class Test @@ -135,7 +132,7 @@ public void TestContractEnsuresReturnAlreadyThereWithWhitespace() }"); } - [Test] + [Fact] public void TestContractEnsuresReturnAlreadyThereReversedParameters() { TestWrongContext(@"class Test @@ -147,7 +144,7 @@ public void TestContractEnsuresReturnAlreadyThereReversedParameters() }"); } - [Test] + [Fact] public void ObjectPropertyGetter() { Test( @@ -175,7 +172,7 @@ public Cedd Foo }"); } - [Test] + [Fact] public void ContractEnsuresReturnAlreadyThereForPropertyGetter() { TestWrongContext( @@ -192,7 +189,7 @@ public Cedd Foo }"); } - [Test] + [Fact] public void UsingStatementAlreadyThereForPropertyGetter() { Test( @@ -220,7 +217,7 @@ public Cedd Foo }"); } - [Test] + [Fact] public void ObjectPropertyIndexer() { Test( @@ -248,7 +245,7 @@ public Cedd this[int index] }"); } - [Test] + [Fact] public void NullablePropertyIndexer() { Test( @@ -276,7 +273,7 @@ public double? this[int index] }"); } - [Test] + [Fact] public void ContractEnsuresReturnAlreadyThereForPropertyIndexer() { TestWrongContext( @@ -293,7 +290,7 @@ public Cedd this[int index] }"); } - [Test] + [Fact] public void UsingStatementAlreadyThereForPropertyIndexer() { Test( @@ -321,7 +318,7 @@ public Cedd this[int index] }"); } - [Test] + [Fact] public void Test_OldCSharp() { var parseOptions = new CSharpParseOptions( diff --git a/Tests/CSharp/CodeRefactorings/ContractRequiresNotNullTests.cs b/Tests/CSharp/CodeRefactorings/ContractRequiresNotNullTests.cs index f43708da..9d67e9aa 100644 --- a/Tests/CSharp/CodeRefactorings/ContractRequiresNotNullTests.cs +++ b/Tests/CSharp/CodeRefactorings/ContractRequiresNotNullTests.cs @@ -1,16 +1,15 @@ using System; -using NUnit.Framework; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis; using System.Collections.Immutable; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ContractRequiresNotNullTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void Test() { string result = RunContextAction( @@ -25,7 +24,7 @@ public void Test() "}" ); - Assert.AreEqual( + Assert.Equal( "using System;" + Environment.NewLine + "using System.Diagnostics.Contracts;" + Environment.NewLine + Environment.NewLine + "class TestClass" + Environment.NewLine + @@ -38,7 +37,7 @@ public void Test() "}", result); } - [Test] + [Fact] public void TestLambda() { Test(@"class Foo @@ -61,7 +60,7 @@ void Test () }"); } - [Test] + [Fact] public void TestAnonymousMethod() { Test(@"class Foo @@ -84,7 +83,7 @@ void Test () }"); } - [Test] + [Fact] public void TestContractRequiresNotNullCheckAlreadyThere() { TestWrongContext(@"class Foo @@ -98,7 +97,7 @@ void Test () }"); } - [Test] + [Fact] public void TestContractRequiresNotNullCheckNotAlreadyThere() { Test(@"class Foo @@ -123,7 +122,7 @@ void Test () }"); } - [Test] + [Fact] public void TestUsingStatementAlreadyThere() { Test(@"using System.Diagnostics.Contracts; @@ -146,7 +145,7 @@ void Test () }"); } - [Test] + [Fact] public void TestPopupOnlyOnName() { TestWrongContext(@"class Foo @@ -157,7 +156,7 @@ void Test ($string param) }"); } - [Test] + [Fact] public void Test_OldCSharp() { var parseOptions = new CSharpParseOptions( diff --git a/Tests/CSharp/CodeRefactorings/ConvertAnonymousMethodToLambdaTests.cs b/Tests/CSharp/CodeRefactorings/ConvertAnonymousMethodToLambdaTests.cs index e90da396..4f1bba55 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertAnonymousMethodToLambdaTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertAnonymousMethodToLambdaTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertAnonymousMethodToLambdaTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void BasicTest() { Test(@" @@ -26,7 +25,7 @@ void F () }"); } - [Test] + [Fact] public void VarDeclaration() { Test(@" @@ -46,7 +45,7 @@ void F () }"); } - [Test] + [Fact] public void ParameterLessDelegate() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertAutoPropertyToPropertyTests.cs b/Tests/CSharp/CodeRefactorings/ConvertAutoPropertyToPropertyTests.cs index aeaedc5f..dc78e041 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertAutoPropertyToPropertyTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertAutoPropertyToPropertyTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertAutoPropertyToPropertyTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleProperty() { Test(@"class TestClass @@ -29,8 +28,7 @@ string Test }"); } - [Ignore("TODO")] - [Test] + [Fact(Skip="TODO")] public void TestSimplify() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertBitwiseFlagComparisonToHasFlagsTests.cs b/Tests/CSharp/CodeRefactorings/ConvertBitwiseFlagComparisonToHasFlagsTests.cs index 9bfbc7cf..50ded5c5 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertBitwiseFlagComparisonToHasFlagsTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertBitwiseFlagComparisonToHasFlagsTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertBitwiseFlagComparisonToHasFlagsTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestComparisonWithNullInEqual() { Test(@" @@ -40,7 +39,7 @@ public void Bar (Foo f) "); } - [Test] + [Fact] public void TestComparisonWithNullEqual() { Test(@" @@ -74,7 +73,7 @@ public void Bar (Foo f) "); } - [Test] + [Fact] public void TestComparisonWithFlagInEqual() { Test(@" @@ -108,7 +107,7 @@ public void Bar (Foo f) "); } - [Test] + [Fact] public void TestComparisonWithFlagEqual() { Test(@" @@ -142,7 +141,7 @@ public void Bar (Foo f) "); } - [Test] + [Fact] public void TestMultipleFlags() { Test(@" @@ -176,7 +175,7 @@ public void Bar (Foo f) "); } - [Test] + [Fact] public void TestMultipleFlagsCase2() { TestWrongContext(@" @@ -196,7 +195,7 @@ public void Bar (Foo f) "); } - [Test] + [Fact] public void TestInvalid() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertCoalescingToConditionalExpressionTests.cs b/Tests/CSharp/CodeRefactorings/ConvertCoalescingToConditionalExpressionTests.cs index da7b3f0e..57e9c8e9 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertCoalescingToConditionalExpressionTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertCoalescingToConditionalExpressionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertCoalescingToConditionalExpressionTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleCase() { Test(@" @@ -28,7 +27,7 @@ object Foo(object o, object p) "); } - [Test] + [Fact] public void TestSimpleCaseWithComment() { Test(@" @@ -52,7 +51,7 @@ object Foo(object o, object p) "); } - [Test] + [Fact] public void TestNullable() { Test(@"class Test diff --git a/Tests/CSharp/CodeRefactorings/ConvertDecToHexTests.cs b/Tests/CSharp/CodeRefactorings/ConvertDecToHexTests.cs index b571f9d3..5bf9d899 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertDecToHexTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertDecToHexTests.cs @@ -1,13 +1,12 @@ using System; -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertDecToHexTests : CSharpCodeRefactoringTestBase { - [Test()] + [Fact] public void Test() { string result = RunContextAction( @@ -22,7 +21,7 @@ public void Test() "}" ); - Assert.AreEqual( + Assert.Equal( "using System;" + Environment.NewLine + "class TestClass" + Environment.NewLine + "{" + Environment.NewLine + diff --git a/Tests/CSharp/CodeRefactorings/ConvertDoWhileToWhileLoopTests.cs b/Tests/CSharp/CodeRefactorings/ConvertDoWhileToWhileLoopTests.cs index a1846333..f8c4fab8 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertDoWhileToWhileLoopTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertDoWhileToWhileLoopTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertDoWhileToWhileLoopTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimple() { Test(@" @@ -27,7 +26,7 @@ void TestMethod() { }"); } - [Test] + [Fact] public void TestSimpleWithComment1() { Test(@" @@ -50,7 +49,7 @@ void TestMethod() { }"); } - [Test] + [Fact] public void TestSimpleWithComment2() { Test(@" @@ -71,7 +70,7 @@ void TestMethod() { }"); } - [Test] + [Fact] public void TestDisabledInContent() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertEqualityOperatorToEqualsTests.cs b/Tests/CSharp/CodeRefactorings/ConvertEqualityOperatorToEqualsTests.cs index de679a66..d4f8f8ef 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertEqualityOperatorToEqualsTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertEqualityOperatorToEqualsTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertEqualityOperatorToEqualsTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestEquality() { Test(@"class FooBar @@ -26,7 +25,7 @@ public void Foo(object x, object y) }"); } - [Test] + [Fact] public void TestInequality() { Test(@"class FooBar @@ -46,7 +45,7 @@ public void Foo(object x, object y) }"); } - [Test] + [Fact] public void TestEqualsFallback() { Test(@"class FooBar diff --git a/Tests/CSharp/CodeRefactorings/ConvertEqualityOperatorToReferenceEqualsTests.cs b/Tests/CSharp/CodeRefactorings/ConvertEqualityOperatorToReferenceEqualsTests.cs index 0588b415..2ec02b99 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertEqualityOperatorToReferenceEqualsTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertEqualityOperatorToReferenceEqualsTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertEqualityOperatorToReferenceEqualsTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestEquality() { Test(@"class FooBar @@ -26,7 +25,7 @@ public void Foo(object x, object y) }"); } - [Test] + [Fact] public void TestInequality() { Test(@"class FooBar @@ -46,7 +45,7 @@ public void Foo(object x, object y) }"); } - [Test] + [Fact] public void TestStruct() { TestWrongContext(@" @@ -61,7 +60,7 @@ public void Foo(MyStruct x, MyStruct y) }"); } - [Test] + [Fact] public void TestEqualsFallback() { Test(@"class FooBar diff --git a/Tests/CSharp/CodeRefactorings/ConvertEqualsToEqualityOperatorTests.cs b/Tests/CSharp/CodeRefactorings/ConvertEqualsToEqualityOperatorTests.cs index d38656e7..afe98fc4 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertEqualsToEqualityOperatorTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertEqualsToEqualityOperatorTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertEqualsToEqualityOperatorTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestEquality() { Test(@"class FooBar @@ -26,7 +25,7 @@ public void Foo(object x, object y) }"); } - [Test] + [Fact] public void TestInequality() { Test(@"class FooBar @@ -46,7 +45,7 @@ public void Foo(object x, object y) }"); } - [Test] + [Fact] public void TestEqualsFallback() { Test(@"class FooBar @@ -74,7 +73,7 @@ public void Foo(object x, object y) }"); } - [Test] + [Fact] public void TestMemberReferencEquals() { Test(@"class FooBar @@ -94,7 +93,7 @@ public void Foo (object x , object y) }"); } - [Test] + [Fact] public void TestNegatedMemberReferenceEquals() { Test(@"class FooBar diff --git a/Tests/CSharp/CodeRefactorings/ConvertExplicitToImplicitImplementationTests.cs b/Tests/CSharp/CodeRefactorings/ConvertExplicitToImplicitImplementationTests.cs index 4cae3011..cf1f17ec 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertExplicitToImplicitImplementationTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertExplicitToImplicitImplementationTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertExplicitToImplicitImplementationTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestMethod() { Test(@" @@ -32,7 +31,7 @@ public void Method() }"); } - [Test] + [Fact] public void TestMethodWithXmlDoc() { Test(@" @@ -64,7 +63,7 @@ public void Method() }"); } - [Test] + [Fact] public void TestMethodWithInlineComment() { Test(@" @@ -90,7 +89,7 @@ public void Method() // Some comment }"); } - [Test] + [Fact] public void TestExistingMethod() { TestWrongContext(@" @@ -109,7 +108,7 @@ void Method () }"); } - [Test] + [Fact] public void TestProperty() { Test(@" @@ -139,7 +138,7 @@ public int Prop }"); } - [Test] + [Fact] public void TestExistingProperty() { TestWrongContext(@" @@ -162,7 +161,7 @@ public int Prop }"); } - [Test] + [Fact] public void TestEvent() { Test(@" @@ -196,7 +195,7 @@ public event EventHandler Evt }"); } - [Test] + [Fact] public void TestExistingEvent() { TestWrongContext(@" @@ -217,7 +216,7 @@ event EventHandler $ITest.Evt }"); } - [Test] + [Fact] public void TestIndexer() { Test(@" @@ -245,7 +244,7 @@ public int this[int i] }"); } - [Test] + [Fact] public void TestExistingIndexer() { TestWrongContext(@" @@ -267,7 +266,7 @@ public int this[int i] } - [Test] + [Fact] public void TestNonExplitiImplementation() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertExpressionBodyToStatementBodyTests.cs b/Tests/CSharp/CodeRefactorings/ConvertExpressionBodyToStatementBodyTests.cs index 9f09478a..54cd639e 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertExpressionBodyToStatementBodyTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertExpressionBodyToStatementBodyTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertExpressionBodyToStatementBodyTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestMethodName() { Test(@" @@ -24,7 +23,7 @@ int TestMethod(int i) } - [Test] + [Fact] public void TestPropertyName() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertForToWhileTests.cs b/Tests/CSharp/CodeRefactorings/ConvertForToWhileTests.cs index 4e33f579..9139f117 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertForToWhileTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertForToWhileTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertForToWhileTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleFor() { Test(@" @@ -36,7 +35,7 @@ void Foo (object[] o) }"); } - [Test] + [Fact] public void TestSimpleForWithComment1() { Test(@" @@ -68,8 +67,7 @@ void Foo (object[] o) }"); } - [Ignore("broken")] - [Test] + [Fact(Skip="Broken.")] public void TestSimpleForWithComment2() { Test(@" @@ -101,7 +99,7 @@ void Foo (object[] o) }"); } - [Test] + [Fact] public void TestMissingInitializer() { Test(@" @@ -130,7 +128,7 @@ void Foo () }"); } - [Test] + [Fact] public void TestMissingCondition() { Test(@" @@ -160,7 +158,7 @@ void Foo (object[] o) }"); } - [Test] + [Fact] public void TestInfiniteLoop() { Test(@" @@ -188,7 +186,7 @@ void Foo (object[] o) }"); } - [Test] + [Fact] public void TestMultipleInitializersAndIterators() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertForeachToForTests.cs b/Tests/CSharp/CodeRefactorings/ConvertForeachToForTests.cs index 5be0f69e..5348ff92 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertForeachToForTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertForeachToForTests.cs @@ -1,13 +1,12 @@ using System; -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertForeachToForTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestArray() { string result = RunContextAction( @@ -24,7 +23,7 @@ public void TestArray() "}" ); - Assert.AreEqual( + Assert.Equal( "using System;" + Environment.NewLine + "class TestClass" + Environment.NewLine + "{" + Environment.NewLine + @@ -39,7 +38,7 @@ public void TestArray() "}", result); } - [Test] + [Fact] public void TestListOfT() { string result = RunContextAction( @@ -57,7 +56,7 @@ public void TestListOfT() "}" ); - Assert.AreEqual( + Assert.Equal( "using System;" + Environment.NewLine + "using System.Collections.Generic;" + Environment.NewLine + "class TestClass" + Environment.NewLine + @@ -76,7 +75,7 @@ public void TestListOfT() /// /// Bug 9876 - Convert to for loop created invalid code if iteration variable is called i /// - [Test] + [Fact] public void TestBug9876() { Test(@"class TestClass @@ -101,7 +100,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestOptimizedForLoop() { Test(@" @@ -127,7 +126,7 @@ void Foo (object[] o) }", 1); } - [Test] + [Fact] public void TestOptimizedForLoopWithComment() { Test(@" @@ -155,7 +154,7 @@ void Foo (object[] o) }", 1); } - [Test] + [Fact] public void TestEnumerableConversion() { Test(@" @@ -187,7 +186,7 @@ public void Foo (IEnumerable bar) }"); } - [Test] + [Fact] public void TestEnumerableConversionWithComment() { Test(@" @@ -224,7 +223,7 @@ public void Foo (IEnumerable bar) /// /// Bug 30238 - [Roslyn Migration] Smart tag follows cursor while typing comment /// - [Test] + [Fact] public void TestBug30238() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertHasFlagsToBitwiseFlagComparisonTests.cs b/Tests/CSharp/CodeRefactorings/ConvertHasFlagsToBitwiseFlagComparisonTests.cs index 3b5d5fa6..10298f39 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertHasFlagsToBitwiseFlagComparisonTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertHasFlagsToBitwiseFlagComparisonTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertHasFlagsToBitwiseFlagComparisonTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleHasFlag() { Test(@" @@ -40,7 +39,7 @@ public void Bar (Foo f) "); } - [Test] + [Fact] public void TestNegatedSimpleHasFlag() { Test(@" @@ -75,7 +74,7 @@ public void Bar (Foo f) } - [Test] + [Fact] public void TestMultipleFlagsCase2() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertHexToDecTests.cs b/Tests/CSharp/CodeRefactorings/ConvertHexToDecTests.cs index 5872aca6..82875e5b 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertHexToDecTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertHexToDecTests.cs @@ -1,13 +1,12 @@ using System; -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertHexToDecTests : CSharpCodeRefactoringTestBase { - [Test()] + [Fact] public void Test() { string result = RunContextAction( @@ -22,7 +21,7 @@ public void Test() "}" ); - Assert.AreEqual( + Assert.Equal( "using System;" + Environment.NewLine + "class TestClass" + Environment.NewLine + "{" + Environment.NewLine + diff --git a/Tests/CSharp/CodeRefactorings/ConvertIfStatementToConditionalTernaryExpressionTests.cs b/Tests/CSharp/CodeRefactorings/ConvertIfStatementToConditionalTernaryExpressionTests.cs index a6bd79be..0fd42870 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertIfStatementToConditionalTernaryExpressionTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertIfStatementToConditionalTernaryExpressionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertIfStatementToConditionalTernaryExpressionTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestAssignment() { Test(@" @@ -32,7 +31,7 @@ void TestMethod(int i) }"); } - [Test] + [Fact] public void TestAssignmentWithComment() { Test(@" @@ -60,7 +59,7 @@ void TestMethod(int i) }"); } - [Test] + [Fact] public void TestAssignmentWithDifferingTypes1() { Test(@" @@ -86,7 +85,7 @@ void TestMethod(int i) }"); } - [Test] + [Fact] public void TestAssignmentWithDifferingTypes2() { Test(@" @@ -112,7 +111,7 @@ void TestMethod(int i) }"); } - [Test] + [Fact] public void TestAddAssignment() { Test(@" @@ -138,7 +137,7 @@ void TestMethod(int i) }"); } - [Test] + [Fact] public void TestIfElse() { TestWrongContext(@" @@ -158,7 +157,7 @@ void TestMethod(int i) }"); } - [Test] + [Fact] public void MultipleStatementsInIf() { TestWrongContext(@" @@ -177,7 +176,7 @@ void TestMethod(int i) }"); } - [Test] + [Fact] public void TestDifferentAssignmentOperator() { @@ -196,8 +195,7 @@ void TestMethod(int i) }"); } - [Ignore("Are there any cases where this is needed ?")] - [Test] + [Fact(Skip="Are there any cases where this is needed ?")] public void TestInsertNecessaryParentheses() { Test(@" @@ -225,7 +223,7 @@ void TestMethod (int i) }"); } - [Test] + [Fact] public void TestInvalidImplicitElse() { diff --git a/Tests/CSharp/CodeRefactorings/ConvertIfStatementToNullCoalescingExpressionActionTests.cs b/Tests/CSharp/CodeRefactorings/ConvertIfStatementToNullCoalescingExpressionActionTests.cs index 8f102e64..a3f8d7bb 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertIfStatementToNullCoalescingExpressionActionTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertIfStatementToNullCoalescingExpressionActionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertIfStatementToNullCoalescingExpressionActionTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestDeclaration() { Test(@" @@ -38,7 +37,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestDeclarationWithComment1() { Test(@" @@ -72,7 +71,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestDeclarationWithComment2() { Test(@" @@ -105,7 +104,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestDeclarationWithComment3() { Test(@" @@ -137,7 +136,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestYodaConditionals() { Test(@" @@ -167,7 +166,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestAssignment() { Test(@" @@ -199,7 +198,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestIsolated() { Test(@" @@ -222,7 +221,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestBlock() { Test(@" @@ -254,7 +253,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestInvertedCondition() { Test(@" @@ -287,7 +286,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestDisabledForImproperCondition() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertIfStatementToReturnStatementActionTests.cs b/Tests/CSharp/CodeRefactorings/ConvertIfStatementToReturnStatementActionTests.cs index 5b5c0c5f..057d54a5 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertIfStatementToReturnStatementActionTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertIfStatementToReturnStatementActionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertIfStatementToReturnStatementActionTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestReturn() { Test(@" @@ -30,7 +29,7 @@ int TestMethod(int i) } - [Test] + [Fact] public void TestReturnWithComment1() { Test(@" @@ -56,7 +55,7 @@ int TestMethod(int i) } - [Test] + [Fact] public void TestReturnWithComment2() { Test(@" @@ -80,7 +79,7 @@ int TestMethod(int i) } - [Test] + [Fact] public void TestReturnWithComment3() { Test(@" @@ -104,7 +103,7 @@ int TestMethod(int i) }"); } - [Test] + [Fact] public void TestIfElseWithBlocks() { Test(@"class Foo @@ -126,7 +125,7 @@ bool Bar(string str) }"); } - [Test] + [Fact] public void TestImplicitElse() { @@ -152,7 +151,7 @@ int TestMethod(int i) /// /// Bug 'ConvertIfStatementToReturnStatementAction crashes on "if" without "else" #63' /// - [Test] + [Fact] public void TestIssue63() { var actions = GetActions(@" @@ -169,7 +168,7 @@ int TestMethod(int a) return 0; } }"); - Assert.AreEqual(0, actions.Count); + Assert.Equal(0, actions.Count); } } } diff --git a/Tests/CSharp/CodeRefactorings/ConvertIfStatementToSwitchStatementTests.cs b/Tests/CSharp/CodeRefactorings/ConvertIfStatementToSwitchStatementTests.cs index b65c745b..43416e84 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertIfStatementToSwitchStatementTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertIfStatementToSwitchStatementTests.cs @@ -1,13 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertIfStatementToSwitchStatementTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestBreak() { Test(@" @@ -52,7 +51,7 @@ void TestMethod (int a) }"); } - [Test] + [Fact] public void TestBreakWithComment() { Test(@" @@ -99,7 +98,7 @@ void TestMethod (int a) }"); } - [Test] + [Fact] public void TestReturn() { Test(@" @@ -136,7 +135,7 @@ int TestMethod (int a) }"); } - [Test] + [Fact] public void TestConstantExpression() { Test(@" @@ -213,7 +212,7 @@ int TestMethod (int a) }"); } - [Test] + [Fact] public void TestNestedOr() { Test(@" @@ -250,7 +249,7 @@ int TestMethod (int a) }"); } - [Test] + [Fact] public void TestComplexSwitchExpression() { Test(@" @@ -284,7 +283,7 @@ int TestMethod (int a, int b) }"); } - [Test] + [Fact] public void TestNonConstantExpression() { TestWrongContext(@" @@ -340,7 +339,7 @@ void TestMethod (int a, int c) }"); } - [Test] + [Fact] public void TestNonEqualityComparison() { TestWrongContext(@" @@ -362,7 +361,7 @@ void TestMethod (int a) }"); } - [Test] + [Fact] public void TestValidType() { // enum @@ -445,7 +444,7 @@ int TestMethod (" + type + @" a) }"); } - [Test] + [Fact] public void TestInvalidType() { TestWrongContext(@" @@ -463,7 +462,7 @@ void TestMethod (double a) }"); } - [Test] + [Fact] public void TestNoElse() { Test(@" @@ -497,7 +496,7 @@ void TestMethod (int a) }"); } - [Test] + [Fact] public void TestNestedIf() { Test(@" @@ -534,7 +533,7 @@ void TestMethod (int a) }"); } - [Test] + [Fact] public void TestInvalid() { TestWrongContext(@" @@ -557,7 +556,7 @@ void TestMethod (int a) } }"); } - [Test] + [Fact] public void TestInvalidCase2() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertImplicitToExplicittImplementationTests.cs b/Tests/CSharp/CodeRefactorings/ConvertImplicitToExplicittImplementationTests.cs index f8ddca7a..d2b03f83 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertImplicitToExplicittImplementationTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertImplicitToExplicittImplementationTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertImplicitToExplicittImplementationTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void Test() { Test(@" @@ -32,7 +31,7 @@ void ITest.Method() }"); } - [Test] + [Fact] public void TestWithXmlDoc() { Test(@" @@ -64,7 +63,7 @@ void ITest.Method() }"); } - [Test] + [Fact] public void TestWithInlineComment() { Test(@" @@ -90,7 +89,7 @@ void ITest.Method() // Some comment }"); } - [Test] + [Fact] public void TestProperty() { Test(@" @@ -120,7 +119,7 @@ int ITest.Prop }"); } - [Test] + [Fact] public void TestEvent() { Test(@" @@ -154,7 +153,7 @@ event EventHandler ITest.Evt }"); } - [Test] + [Fact] public void TestIndexer() { Test(@" @@ -182,7 +181,7 @@ int ITest.this[int i] }"); } - [Test] + [Fact] public void TestMultipleInterfaces() { TestWrongContext(@" @@ -202,7 +201,7 @@ class TestClass : ITest, ITest2 }"); } - [Test] + [Fact] public void TestNonImplicitImplementation() { TestWrongContext(@" @@ -214,7 +213,7 @@ class TestClass }"); } - [Test] + [Fact] public void TestInterfaceMethod() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertInstanceToStaticMethodCodeRefactoringTests.cs b/Tests/CSharp/CodeRefactorings/ConvertInstanceToStaticMethodCodeRefactoringTests.cs index 552774ac..fc778d52 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertInstanceToStaticMethodCodeRefactoringTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertInstanceToStaticMethodCodeRefactoringTests.cs @@ -1,16 +1,15 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp; using RefactoringEssentials.Tests.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp { - /// - /// Tests for ConvertInstanceToStaticMethodCodeRefactoringProvider. - /// - [TestFixture] + /// + /// Tests for ConvertInstanceToStaticMethodCodeRefactoringProvider. + /// public class ConvertInstanceToStaticMethodCodeRefactoringTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void MethodWithoutParameters1() { Test(@" @@ -30,7 +29,7 @@ static void Test(Foo instance) }"); } - [Test] + [Fact] public void MethodWithoutParameters2() { Test(@" @@ -50,7 +49,7 @@ public static void Test(Foo instance) }"); } - [Test] + [Fact] public void MethodWithParameters() { Test(@" @@ -70,7 +69,7 @@ public static void Test(Foo instance, int b) }"); } - [Test] + [Fact] public void AlreadyStaticMethod() { TestWrongContext(@" @@ -83,7 +82,7 @@ class Foo }"); } - [Test] + [Fact] public void MethodUsingInstanceMember() { Test(@" @@ -119,7 +118,7 @@ static void Test(Foo instance) }"); } - [Test] + [Fact] public void MethodUsingInstanceMemberWithThis() { Test(@" @@ -155,7 +154,7 @@ static void Test(Foo instance) }"); } - [Test] + [Fact] public void RecursiveMethodCall() { Test(@" @@ -181,7 +180,7 @@ static void Test(Foo instance) }"); } - [Test] + [Fact] public void RecursiveMethodCallWithThis() { Test(@" @@ -207,7 +206,7 @@ static void Test(Foo instance) }"); } - [Test] + [Fact] public void MethodWithInternalReference() { Test(@" @@ -239,7 +238,7 @@ static void Test(Foo instance) }"); } - [Test] + [Fact] public void MethodWithExternalReference() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertInterpolatedStringToStringFormatTests.cs b/Tests/CSharp/CodeRefactorings/ConvertInterpolatedStringToStringFormatTests.cs index 5a628ee8..dce83e9c 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertInterpolatedStringToStringFormatTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertInterpolatedStringToStringFormatTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertInterpolatedStringToStringFormatTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleStringFormat() { Test(@" @@ -28,7 +27,7 @@ void Foo () }"); } - [Test] + [Fact] public void TestComplexStringFormat() { Test(@" @@ -49,7 +48,7 @@ void Foo () } - [Test] + [Fact] public void TestRepeats() { Test(@" @@ -71,7 +70,7 @@ void Foo () }"); } - [Test] + [Fact] public void TestEscapes() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertLambdaBodyExpressionToStatementTests.cs b/Tests/CSharp/CodeRefactorings/ConvertLambdaBodyExpressionToStatementTests.cs index 82974d26..56cc6ddf 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertLambdaBodyExpressionToStatementTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertLambdaBodyExpressionToStatementTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertLambdaBodyExpressionToStatementTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestReturn() { Test(@" @@ -29,7 +28,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestExprStatement() { Test(@" @@ -52,7 +51,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestExprStatementWithComment() { Test(@" @@ -77,7 +76,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestParenthesizedLambdaExprStatement() { Test(@" @@ -100,7 +99,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestWrongContext() { TestWrongContext(@" @@ -116,7 +115,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestParenthesis() { Test(@" @@ -138,7 +137,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestInvocation() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertLambdaStatementToExpressionTests.cs b/Tests/CSharp/CodeRefactorings/ConvertLambdaStatementToExpressionTests.cs index 1e1837d0..84035046 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertLambdaStatementToExpressionTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertLambdaStatementToExpressionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertLambdaStatementToExpressionTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestReturn() { Test(@" @@ -28,7 +27,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestParenthesizedLambdaReturn() { Test(@" @@ -50,7 +49,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestExpressionStatement() { Test(@" @@ -72,7 +71,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestExpressionStatementWithComment() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertLamdaToAnonymousMethodTests.cs b/Tests/CSharp/CodeRefactorings/ConvertLamdaToAnonymousMethodTests.cs index 238fc55f..664813b6 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertLamdaToAnonymousMethodTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertLamdaToAnonymousMethodTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertLamdaToAnonymousMethodTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void LambdaBlock() { Test(@" @@ -26,7 +25,7 @@ void F () }"); } - [Test] + [Fact] public void LambdaBlockWithComment() { Test(@" @@ -48,7 +47,7 @@ void F () }"); } - [Test] + [Fact] public void LambdaExpression() { Test(@" @@ -71,7 +70,7 @@ void F () }"); } - [Test] + [Fact] public void LambdaExpressionWithComment() { Test(@" @@ -96,7 +95,7 @@ void F () }"); } - [Test] + [Fact] public void NonVoidExpressionTest() { Test(@" @@ -119,7 +118,7 @@ void F () }"); } - [Test] + [Fact] public void ParameterLessLambdaTest() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertMethodGroupToAnonymousMethodTests.cs b/Tests/CSharp/CodeRefactorings/ConvertMethodGroupToAnonymousMethodTests.cs index 1b66e066..b7efc28e 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertMethodGroupToAnonymousMethodTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertMethodGroupToAnonymousMethodTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertMethodGroupToAnonymousMethodTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestVoidMethod() { Test(@" @@ -33,7 +32,7 @@ void Foo () "); } - [Test] + [Fact] public void TestVoidMethodWithComment() { Test(@" @@ -62,7 +61,7 @@ void Foo () "); } - [Test] + [Fact] public void TestParameter() { Test(@" @@ -89,7 +88,7 @@ void Foo (int x, int y) "); } - [Test] + [Fact] public void TestFunction() { Test(@" @@ -116,7 +115,7 @@ bool Foo (int x, int y) "); } - [Test] + [Fact] public void TestOverloads() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertMethodGroupToLambdaTests.cs b/Tests/CSharp/CodeRefactorings/ConvertMethodGroupToLambdaTests.cs index 57d662ed..45c56cbb 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertMethodGroupToLambdaTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertMethodGroupToLambdaTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertMethodGroupToLambdaTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestVoidMethod() { Test(@" @@ -30,7 +29,7 @@ void Foo () "); } - [Test] + [Fact] public void TestVoidMethodWithComment1() { Test(@" @@ -56,7 +55,7 @@ void Foo () "); } - [Test] + [Fact] public void TestVoidMethodWithComment2() { Test(@" @@ -80,7 +79,7 @@ void Foo () "); } - [Test] + [Fact] public void TestParameter() { Test(@" @@ -104,7 +103,7 @@ void Foo (int x, int y) "); } - [Test] + [Fact] public void TestFunction() { Test(@" @@ -128,7 +127,7 @@ bool Foo (int x, int y) "); } - [Test] + [Fact] public void TestOverloads() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertMultiplyToShiftTests.cs b/Tests/CSharp/CodeRefactorings/ConvertMultiplyToShiftTests.cs index e0208f62..f2ed96e9 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertMultiplyToShiftTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertMultiplyToShiftTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertMultiplyToShiftTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestMultiply() { Test(@" @@ -26,7 +25,7 @@ int TestMethod (int i) }"); } - [Test] + [Fact] public void TestDivide() { Test(@" @@ -46,7 +45,7 @@ int TestMethod (int i) }"); } - [Test] + [Fact] public void TestInvaid() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertReferenceEqualsToEqualityOperatorTests.cs b/Tests/CSharp/CodeRefactorings/ConvertReferenceEqualsToEqualityOperatorTests.cs index eb2161af..a5209db1 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertReferenceEqualsToEqualityOperatorTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertReferenceEqualsToEqualityOperatorTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertReferenceEqualsToEqualityOperatorTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestEquality() { Test(@"class FooBar @@ -26,7 +25,7 @@ public void Foo(object x, object y) }"); } - [Test] + [Fact] public void TestInequality() { Test(@"class FooBar @@ -46,7 +45,7 @@ public void Foo(object x, object y) }"); } - [Test] + [Fact] public void TestEqualsFallback() { Test(@"class FooBar @@ -74,7 +73,7 @@ public void Foo(object x, object y) }"); } - [Test] + [Fact] public void TestMemberReferencEquals() { Test(@"class FooBar @@ -94,7 +93,7 @@ public void Foo (object x , object y) }"); } - [Test] + [Fact] public void TestNegatedMemberReferenceEquals() { Test(@"class FooBar diff --git a/Tests/CSharp/CodeRefactorings/ConvertShiftToMultiplyTests.cs b/Tests/CSharp/CodeRefactorings/ConvertShiftToMultiplyTests.cs index 7c22aabd..a7f8903f 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertShiftToMultiplyTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertShiftToMultiplyTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertShiftToMultiplyTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestShiftLeft() { Test(@" @@ -26,7 +25,7 @@ int TestMethod (int i) }"); } - [Test] + [Fact] public void TestShiftRight() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertStatementBodyToExpressionBodyTests.cs b/Tests/CSharp/CodeRefactorings/ConvertStatementBodyToExpressionBodyTests.cs index 7d5d0292..6b5d5d55 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertStatementBodyToExpressionBodyTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertStatementBodyToExpressionBodyTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertStatementBodyToExpressionBodyTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestMethodName() { Test(@" @@ -23,7 +22,7 @@ class TestClass }"); } - [Test] + [Fact] public void TestMethodReturn() { Test(@" @@ -40,7 +39,7 @@ class TestClass }"); } - [Test] + [Fact] public void TestVoidMethodNameWithExpression() { Test(@" @@ -61,7 +60,7 @@ void DoSomething() { } }"); } - [Test] + [Fact] public void TestMethodNameWithCommentInBody() { Test(@" @@ -78,7 +77,7 @@ class TestClass }"); } - [Test] + [Fact] public void TestInvalidMethod() { TestWrongContext(@" @@ -93,7 +92,7 @@ int TestMethod(int i) } - [Test] + [Fact] public void TestPropertyName() { Test(@" @@ -111,7 +110,7 @@ class TestClass }"); } - [Test] + [Fact] public void TestPropertyReturn() { Test(@" @@ -129,7 +128,7 @@ class TestClass }"); } - [Test] + [Fact] public void TestPropertyNameWithCommentInBody() { Test(@" @@ -147,7 +146,7 @@ class TestClass }"); } - [Test] + [Fact] public void TestInvalidProperty() { TestWrongContext(@" @@ -162,7 +161,7 @@ class TestClass }"); } - [Test] + [Fact] public void TestIndexerName() { Test(@" @@ -180,7 +179,7 @@ class TestClass }"); } - [Test] + [Fact] public void TestIndexerReturn() { Test(@" @@ -198,7 +197,7 @@ class TestClass }"); } - [Test] + [Fact] public void TestIndexerNameWithCommentInBody() { Test(@" @@ -216,7 +215,7 @@ class TestClass }"); } - [Test] + [Fact] public void TestInvalidIndexer() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertStringFormatToInterpolatedStringTests.cs b/Tests/CSharp/CodeRefactorings/ConvertStringFormatToInterpolatedStringTests.cs index 82a757ca..6bd73845 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertStringFormatToInterpolatedStringTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertStringFormatToInterpolatedStringTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertStringFormatToInterpolatedStringTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleStringFormat() { Test(@" @@ -28,7 +27,7 @@ void Foo () }"); } - [Test] + [Fact] public void TestComplexStringFormat() { Test(@" @@ -51,7 +50,7 @@ void Foo () /// /// Newline character handling for "To interpolated string" #182 /// - [Test] + [Fact] public void TestIssue182() { Test(@" @@ -73,8 +72,7 @@ void Foo () }"); } - [Ignore("Broken on windows")] - [Test] + [Fact(Skip="Broken on windows")] public void TestVerbatimStringFormat() { Test( diff --git a/Tests/CSharp/CodeRefactorings/ConvertSwitchToIfTests.cs b/Tests/CSharp/CodeRefactorings/ConvertSwitchToIfTests.cs index 69d4b6e2..a8db7026 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertSwitchToIfTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertSwitchToIfTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertSwitchToIfTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestReturn() { Test(@" @@ -53,7 +52,7 @@ int TestMethod (int a) }"); } - [Test] + [Fact] public void TestWithoutDefault() { Test(@" @@ -94,7 +93,7 @@ int TestMethod(int a) }"); } - [Test] + [Fact] public void TestBreak() { Test(@" @@ -139,7 +138,7 @@ void TestMethod(int a) }"); } - [Test] + [Fact] public void TestOperatorPriority() { Test(@" @@ -177,7 +176,7 @@ int TestMethod(int a) }"); } - [Test] + [Fact] public void TestEmptySwitch() { TestWrongContext(@" @@ -192,7 +191,7 @@ void TestMethod (int a) }"); } - [Test] + [Fact] public void TestSwitchWithDefaultOnly() { TestWrongContext(@" @@ -210,7 +209,7 @@ void TestMethod (int a) }"); } - [Test] + [Fact] public void TestNonTrailingBreak() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertTernaryExpressionToIfStatementCodeRefactoringProviderTests.cs b/Tests/CSharp/CodeRefactorings/ConvertTernaryExpressionToIfStatementCodeRefactoringProviderTests.cs index 15345b56..7ed80099 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertTernaryExpressionToIfStatementCodeRefactoringProviderTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertTernaryExpressionToIfStatementCodeRefactoringProviderTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertTernaryExpressionToIfStatementCodeRefactoringProviderTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestConditionalOperator() { Test(@" @@ -33,7 +32,7 @@ int TestMethod (int o, int p) }"); } - [Test] + [Fact] public void TestNullCoalescingOperator() { Test(@" @@ -60,7 +59,7 @@ object TestMethod(object o, object p) }"); } - [Test] + [Fact] public void TestEmbeddedStatement() { Test(@" @@ -88,7 +87,7 @@ void TestMethod(int i) } - [Test] + [Fact] public void TestAssignment() { Test(@" @@ -133,7 +132,7 @@ void TestMethod (int i) }"); } - [Test] + [Fact] public void TestReturnConditionalOperator() { Test(@" @@ -155,7 +154,7 @@ int TestMethod(int i) }"); } - [Test] + [Fact] public void TestReturnConditionalOperatorWithComment() { Test(@" @@ -179,7 +178,7 @@ int TestMethod(int i) }"); } - [Test] + [Fact] public void TestReturnNullCoalescingOperator() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertWhileToDoWhileLoopTests.cs b/Tests/CSharp/CodeRefactorings/ConvertWhileToDoWhileLoopTests.cs index ba91d47e..b23b0256 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertWhileToDoWhileLoopTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertWhileToDoWhileLoopTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ConvertWhileToDoWhileLoopTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimple() { Test(@" @@ -24,7 +23,7 @@ void Bar(int x) { }"); } - [Test] + [Fact] public void TestSimpleWithComment() { Test(@" @@ -44,7 +43,7 @@ void Bar(int x) { }"); } - [Test] + [Fact] public void TestBlock() { Test(@" @@ -62,7 +61,7 @@ void Bar(int x) { }"); } - [Test] + [Fact] public void TestBlockWithComment() { Test(@" @@ -82,7 +81,7 @@ void Bar(int x) { }"); } - [Test] + [Fact] public void TestDisabledOutOfToken() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/CopyCommentsFromBaseTests.cs b/Tests/CSharp/CodeRefactorings/CopyCommentsFromBaseTests.cs index 563f41cc..cdf2c595 100644 --- a/Tests/CSharp/CodeRefactorings/CopyCommentsFromBaseTests.cs +++ b/Tests/CSharp/CodeRefactorings/CopyCommentsFromBaseTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class CopyCommentsFromBaseTest : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestCopyMethodMultiString() { @@ -53,7 +52,7 @@ public override void Test() }"); } - [Test] + [Fact] public void TestCopyMethodSingleString() { @@ -97,7 +96,7 @@ public override void Test() }"); } - [Test] + [Fact] public void TestCopyMethodAbstractClassString() { @@ -139,7 +138,7 @@ public override void Test() } - [Test] + [Fact] public void TestCopyProperty() { @@ -177,7 +176,7 @@ class DerivdedClass : TestClass }"); } - [Test] + [Fact] public void TestCopyType() { @@ -210,7 +209,7 @@ class TestClass : Base } - [Test] + [Fact] public void TestSkipExisting() { TestWrongContext(@" @@ -230,7 +229,7 @@ class $TestClass : Base "); } - [Test] + [Fact] public void TestSkipEmpty() { TestWrongContext(@" @@ -246,7 +245,7 @@ class $TestClass : Base - [Test] + [Fact] public void TestInterfaceSimpleCase() { Test(@" @@ -275,7 +274,7 @@ public void Method () }"); } - [Test] + [Fact] public void TestInterfaceMultiCase() { Test(@" @@ -307,7 +306,7 @@ public void Method () }"); } - [Ignore("TODO")] + [Fact(Skip="TODO")] public void TestInterfaceNoProblem() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/CreateChangedEventTests.cs b/Tests/CSharp/CodeRefactorings/CreateChangedEventTests.cs index 237c40ed..f2d595cd 100644 --- a/Tests/CSharp/CodeRefactorings/CreateChangedEventTests.cs +++ b/Tests/CSharp/CodeRefactorings/CreateChangedEventTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class CreateChangedEventTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleCase() { Test(@"class TestClass @@ -42,7 +41,7 @@ protected virtual void OnTestChanged(System.EventArgs e) }"); } - [Test] + [Fact] public void TestSimplify() { Test(@"using System; @@ -80,7 +79,7 @@ protected virtual void OnTestChanged(EventArgs e) }"); } - [Test] + [Fact] public void TestStaticClassCase() { Test(@"static class TestClass @@ -116,7 +115,7 @@ static void OnTestChanged(System.EventArgs e) }"); } - [Test] + [Fact] public void TestSealedCase() { Test(@"sealed class TestClass @@ -152,7 +151,7 @@ void OnTestChanged(System.EventArgs e) }"); } - [Test] + [Fact] public void TestWrongLocation() { TestWrongContext(@"class TestClass diff --git a/Tests/CSharp/CodeRefactorings/CreateCustomEventImplementationTests.cs b/Tests/CSharp/CodeRefactorings/CreateCustomEventImplementationTests.cs index 56f479f3..52717ba2 100644 --- a/Tests/CSharp/CodeRefactorings/CreateCustomEventImplementationTests.cs +++ b/Tests/CSharp/CodeRefactorings/CreateCustomEventImplementationTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class CreateCustomEventImplementationTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void Test() { Test(@" @@ -31,7 +30,7 @@ public event System.EventHandler TestEvent }"); } - [Test] + [Fact] public void TestSimplification() { Test(@" @@ -58,7 +57,7 @@ public event EventHandler TestEvent }"); } - [Test] + [Fact] public void TestMultipleEventDeclaration() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/CreateDelegateTests.cs b/Tests/CSharp/CodeRefactorings/CreateDelegateTests.cs index 916027f6..2e8d2b86 100644 --- a/Tests/CSharp/CodeRefactorings/CreateDelegateTests.cs +++ b/Tests/CSharp/CodeRefactorings/CreateDelegateTests.cs @@ -1,14 +1,13 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class CreateDelegateTests : CSharpCodeRefactoringTestBase { - [Test] - [Description("Test that only event field declarations are refactored.")] + [Fact] + // Test that only event field declarations are refactored. public void TestEventDeclarationsAreNotRefactored() { TestWrongContext( @@ -23,8 +22,8 @@ public event $EventHandler MouseUp "); } - [Test] - [Description("Test that only event field declarations are refactored.")] + [Fact] + // Test that only event field declarations are refactored. public void TestDelegateNotCreatedIfAlreadyExists() { TestWrongContext( @@ -37,10 +36,10 @@ interface TestClass "); } - [TestCase(@"$event MyEventHandler evt;")] - [TestCase(@"event $MyEventHandler evt;")] - [TestCase(@"event MyEventHandler $evt;")] - [Description("Test that an undefined delegate gets created.")] + [InlineData(@"$event MyEventHandler evt;")] + [InlineData(@"event $MyEventHandler evt;")] + [InlineData(@"event MyEventHandler $evt;")] + // Test that an undefined delegate gets created. public void TestCreateDelegate(string given) { Test( @@ -58,8 +57,8 @@ class TestClass "); } - [Test] - [Description("Test that an undefined delegate gets created for interface type.")] + [Fact] + // Test that an undefined delegate gets created for interface type. public void TestCreateDelegateForInterface() { Test( @@ -77,8 +76,8 @@ interface TestClass "); } - [Test] - [Description("Test that an undefined delegate gets created for struct type.")] + [Fact] + // Test that an undefined delegate gets created for struct type. public void TestCreateDelegateForStruct() { Test( @@ -96,8 +95,8 @@ struct TestClass "); } - [Test] - [Description("Test that an undefined delegate gets created as external public.")] + [Fact] + // Test that an undefined delegate gets created as external public. public void TestCreateDelegateExternalPublic() { Test( @@ -113,8 +112,8 @@ public class TestClass }"); } - [Test] - [Description("Test that an undefined delegate gets created as external public.")] + [Fact] + // Test that an undefined delegate gets created as external public. public void TestCreateDelegateExternalProtected() { Test( @@ -130,8 +129,8 @@ public class TestClass }"); } - [Test] - [Description("Test that an undefined delegate gets created as internal private.")] + [Fact] + // Test that an undefined delegate gets created as internal private. public void TestCreateDelegatePrivate() { Test( @@ -147,8 +146,8 @@ public class TestClass }"); } - [Test] - [Description("Test that an undefined delegate gets created as internal private.")] + [Fact] + // Test that an undefined delegate gets created as internal private. public void TestCreateDelegateInteral() { Test( @@ -164,8 +163,8 @@ public class TestClass }"); } - [Test] - [Description("Test that an undefined delegate gets created and properly uses the static modifier.")] + [Fact] + // Test that an undefined delegate gets created and properly uses the static modifier. public void TestCreatePublicStaticDelegate() { Test( @@ -182,10 +181,10 @@ public class TestClass } - [TestCase(@"$event MyEventHandler evt;")] - [TestCase(@"event $MyEventHandler evt;")] - [TestCase(@"event MyEventHandler $evt;")] - [Description("Test that an undefined delegate gets created within namespace.")] + [InlineData(@"$event MyEventHandler evt;")] + [InlineData(@"event $MyEventHandler evt;")] + [InlineData(@"event MyEventHandler $evt;")] + // Test that an undefined delegate gets created within namespace. public void TestCreateDelegateWithNamespace(string given) { Test( @@ -207,13 +206,13 @@ class TestClass }"); } - [TestCase(@"$event EventHandler evt;")] - [TestCase(@"event $EventHandler evt;")] - [TestCase(@"event EventHandler $evt;")] - [TestCase(@"$event EventHandler evt;")] - [TestCase(@"event $EventHandler evt;")] - [TestCase(@"event EventHandler $evt;")] - [Description("Test that a delegate does not get created for standard EventHandler and EventHandler<> types.")] + [InlineData(@"$event EventHandler evt;")] + [InlineData(@"event $EventHandler evt;")] + [InlineData(@"event EventHandler $evt;")] + [InlineData(@"$event EventHandler evt;")] + [InlineData(@"event $EventHandler evt;")] + [InlineData(@"event EventHandler $evt;")] + // Test that a delegate does not get created for standard EventHandler and EventHandler<> types. public void TestDoesNotCreateDelegate(string given) { TestWrongContext( diff --git a/Tests/CSharp/CodeRefactorings/CreateEventInvocatorTests.cs b/Tests/CSharp/CodeRefactorings/CreateEventInvocatorTests.cs index be003124..9635325a 100644 --- a/Tests/CSharp/CodeRefactorings/CreateEventInvocatorTests.cs +++ b/Tests/CSharp/CodeRefactorings/CreateEventInvocatorTests.cs @@ -1,15 +1,14 @@ -using NUnit.Framework; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis; using System.Collections.Immutable; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class CreateEventInvocatorTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleCase() { Test(@"using System; @@ -28,7 +27,7 @@ protected virtual void OnTested(EventArgs e) }"); } - [Test] + [Fact] public void Test_CSharp5_SimpleCase() { var parseOptions = new CSharpParseOptions( @@ -55,7 +54,7 @@ protected virtual void OnTested(EventArgs e) }", parseOptions: parseOptions); } - [Test] + [Fact] public void Test_CSharp5_NameClash() { var parseOptions = new CSharpParseOptions( @@ -82,7 +81,7 @@ protected virtual void OnE(EventArgs e) }", parseOptions: parseOptions); } - [Test] + [Fact] public void TestNameClash() { Test(@"using System; @@ -101,7 +100,7 @@ protected virtual void OnE(EventArgs e) }"); } - [Test] + [Fact] public void TestStaticEvent() { Test(@"using System; @@ -121,7 +120,7 @@ static void OnTested(EventArgs e) } - [Test] + [Fact] public void TestStaticNameClash() { Test(@"using System; @@ -140,7 +139,7 @@ static void OnE(EventArgs e) }"); } - [Test] + [Fact] public void TestUnusualEventHandler() { Test(@"using System; diff --git a/Tests/CSharp/CodeRefactorings/CreateIndexerTests.cs b/Tests/CSharp/CodeRefactorings/CreateIndexerTests.cs index 8a9504b2..bd7f02e3 100644 --- a/Tests/CSharp/CodeRefactorings/CreateIndexerTests.cs +++ b/Tests/CSharp/CodeRefactorings/CreateIndexerTests.cs @@ -1,11 +1,9 @@ using System; -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [Ignore("Needs insertion cursor mode.")] - [TestFixture] public class CreateIndexerTests : CSharpCodeRefactoringTestBase { public void TestCreateIndexer(string input, string output) @@ -20,11 +18,11 @@ public void TestCreateIndexer(string input, string output) Console.WriteLine("-----------Got:"); Console.WriteLine(result); } - Assert.AreEqual(output, result); + Assert.Equal(output, result); } - [Test()] + [Fact(Skip="Needs insertion cursor mode.")] public void TestIndexer() { TestCreateIndexer( @@ -54,7 +52,7 @@ void TestMethod () } "); } - [Test()] + [Fact(Skip="Needs insertion cursor mode.")] public void TestInterfaceIndexer() { TestCreateIndexer( @@ -91,7 +89,7 @@ void TestMethod () "); } - [Test()] + [Fact(Skip="Needs insertion cursor mode.")] public void TestExternIndexer() { TestCreateIndexer( @@ -132,7 +130,7 @@ void TestMethod () "); } - [Test()] + [Fact(Skip="Needs insertion cursor mode.")] public void TestindexerInFrameworkClass() { TestWrongContext( @@ -146,7 +144,7 @@ void TestMethod () "); } - [Test] + [Fact(Skip="Needs insertion cursor mode.")] public void TestEnumCase() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/CreateOverloadWithoutParameterTests.cs b/Tests/CSharp/CodeRefactorings/CreateOverloadWithoutParameterTests.cs index c8753458..24851249 100644 --- a/Tests/CSharp/CodeRefactorings/CreateOverloadWithoutParameterTests.cs +++ b/Tests/CSharp/CodeRefactorings/CreateOverloadWithoutParameterTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class CreateOverloadWithoutParameterTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void Test() { Test(@" @@ -28,7 +27,7 @@ void TestMethod (int i) }"); } - [Test] + [Fact] public void TestWithReturnValue() { Test(@" @@ -52,7 +51,7 @@ int TestMethod (int i) }"); } - [Test] + [Fact] public void TestWithXmlDoc() { Test(@" @@ -80,7 +79,7 @@ void TestMethod (int i) }"); } - [Test] + [Fact] public void TestByRefParameter() { Test( @@ -103,7 +102,7 @@ void TestMethod (ref int i) }"); } - [Test] + [Fact] public void TestOutParameter() { Test( @@ -126,7 +125,7 @@ void TestMethod (out int i) }"); } - [Test] + [Fact] public void TestDefaultValue() { TestDefaultValue("object", null, "null"); @@ -182,7 +181,7 @@ class Test }"); } - [Test] + [Fact] public void TestOptionalParameter() { TestWrongContext( @@ -194,7 +193,7 @@ void TestMethod (int $i = 0) }"); } - [Test] + [Fact] public void TestExistingMethod() { TestWrongContext( @@ -219,7 +218,7 @@ void TestMethod (int a, int $b) }"); } - [Test] + [Fact] public void TestInterface() { Test(@" @@ -234,7 +233,7 @@ interface ITest }"); } - [Test] + [Fact] public void TestExplicitImpl() { TestWrongContext( @@ -251,7 +250,7 @@ void ITest.Test (int a, int $b) }"); } - [Test] + [Fact] public void TestGenereatedCall() { Test( diff --git a/Tests/CSharp/CodeRefactorings/ExtractAnonymousMethodTests.cs b/Tests/CSharp/CodeRefactorings/ExtractAnonymousMethodTests.cs index 0a1b2a6c..5969608a 100644 --- a/Tests/CSharp/CodeRefactorings/ExtractAnonymousMethodTests.cs +++ b/Tests/CSharp/CodeRefactorings/ExtractAnonymousMethodTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ExtractAnonymousMethodTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestLambdaWithBodyStatement() { Test(@" @@ -30,7 +29,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestLambdaWithBodyExpression() { Test(@" @@ -74,7 +73,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestAnonymousMethod() { Test(@" @@ -98,7 +97,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestContainLocalReference() { TestWrongContext(@" @@ -112,7 +111,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestLambdaInField() { Test(@" @@ -130,7 +129,7 @@ void Method(Int32 i) }"); } - [Test] + [Fact] public void TestNameClash() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ExtractWhileConditionToInternalIfStatementTests.cs b/Tests/CSharp/CodeRefactorings/ExtractWhileConditionToInternalIfStatementTests.cs index 10394657..bdf8f509 100644 --- a/Tests/CSharp/CodeRefactorings/ExtractWhileConditionToInternalIfStatementTests.cs +++ b/Tests/CSharp/CodeRefactorings/ExtractWhileConditionToInternalIfStatementTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ExtractWhileConditionToInternalIfStatementTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestBasicCase() { Test(@" @@ -42,7 +41,7 @@ public int Foo (int i) "); } - [Test] + [Fact] public void TestBasicCaseWithComment() { Test(@" @@ -80,7 +79,7 @@ public int Foo (int i) "); } - [Test] + [Fact] public void TestAddBlock() { Test(@" @@ -112,7 +111,7 @@ public int Foo (int i) "); } - [Test] + [Fact] public void TestRemoveEmptyStatement() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/FlipEqualsTargetAndArgumentTests.cs b/Tests/CSharp/CodeRefactorings/FlipEqualsTargetAndArgumentTests.cs index 244f2f7b..055accec 100644 --- a/Tests/CSharp/CodeRefactorings/FlipEqualsTargetAndArgumentTests.cs +++ b/Tests/CSharp/CodeRefactorings/FlipEqualsTargetAndArgumentTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class FlipEqualsTargetAndArgumentTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleCase() { Test(@" @@ -28,7 +27,7 @@ public void FooFoo (object x, object y) }"); } - [Test] + [Fact] public void TestSimpleCaseWithComment() { Test(@" @@ -52,7 +51,7 @@ public void FooFoo (object x, object y) }"); } - [Test] + [Fact] public void TestComplexCase() { Test(@" @@ -74,7 +73,7 @@ public void FooFoo (object x, object y) }"); } - [Test] + [Fact] public void TestRemoveParens() { Test(@" @@ -96,7 +95,7 @@ public void FooFoo (object x, object y) }"); } - [Test] + [Fact] public void TestUnaryOperatorCase() { Test(@" @@ -118,7 +117,7 @@ public void FooFoo (object x, bool y) }"); } - [Test] + [Fact] public void TestNullCase() { TestWrongContext(@" @@ -132,7 +131,7 @@ public void FooFoo (object x, object y) }"); } - [Test] + [Fact] public void TestStaticCase() { TestWrongContext(@" @@ -148,7 +147,7 @@ public void FooFoo (object x, object y) }"); } - [Test] + [Fact] public void TestCaretLocation() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/FlipOperatorArguments.cs b/Tests/CSharp/CodeRefactorings/FlipOperatorArguments.cs index f3c26517..f9c6ed80 100644 --- a/Tests/CSharp/CodeRefactorings/FlipOperatorArguments.cs +++ b/Tests/CSharp/CodeRefactorings/FlipOperatorArguments.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class FlipOperatorArguments : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestEquals() { Test(@" @@ -29,7 +28,7 @@ public void FooFoo (int x, int y) } - [Test] + [Fact] public void TestNotEquals() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/FlipRelationalOperatorArgumentsTests.cs b/Tests/CSharp/CodeRefactorings/FlipRelationalOperatorArgumentsTests.cs index 94b4c96b..393a465f 100644 --- a/Tests/CSharp/CodeRefactorings/FlipRelationalOperatorArgumentsTests.cs +++ b/Tests/CSharp/CodeRefactorings/FlipRelationalOperatorArgumentsTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class FlipRelationalOperatorArgumentsTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestLessThan() { Test(@" @@ -28,7 +27,7 @@ public void FooFoo (int x, int y) }"); } - [Test] + [Fact] public void TestLessThanOrEquals() { Test(@" @@ -50,7 +49,7 @@ public void FooFoo (int x, int y) }"); } - [Test] + [Fact] public void TestGreaterThan() { Test(@" @@ -72,7 +71,7 @@ public void FooFoo (int x, int y) }"); } - [Test] + [Fact] public void TestGreaterThanOrEquals() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/GenerateGetterTests.cs b/Tests/CSharp/CodeRefactorings/GenerateGetterTests.cs index 3e1e3ca8..f4e52db8 100644 --- a/Tests/CSharp/CodeRefactorings/GenerateGetterTests.cs +++ b/Tests/CSharp/CodeRefactorings/GenerateGetterTests.cs @@ -1,14 +1,12 @@ using System; -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [Ignore("Needs insertion cursor mode.")] - [TestFixture] - public class GenerateGetterTests : CSharpCodeRefactoringTestBase + public class GenerateGetterTests : CSharpCodeRefactoringTestBase { - [Test()] + [Fact(Skip="Needs insertion cursor mode.")] public void Test() { string result = RunContextAction( @@ -19,7 +17,7 @@ public void Test() " int $myField;" + Environment.NewLine + "}" ); - Assert.AreEqual( + Assert.Equal( "using System;" + Environment.NewLine + "class TestClass" + Environment.NewLine + "{" + Environment.NewLine + diff --git a/Tests/CSharp/CodeRefactorings/GenerateSwitchLabelsTests.cs b/Tests/CSharp/CodeRefactorings/GenerateSwitchLabelsTests.cs index 4193e632..d0afc310 100644 --- a/Tests/CSharp/CodeRefactorings/GenerateSwitchLabelsTests.cs +++ b/Tests/CSharp/CodeRefactorings/GenerateSwitchLabelsTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class GenerateSwitchLabelsTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void Test() { Test(@" @@ -42,7 +41,7 @@ void Test (ConsoleModifiers mods) }"); } - [Test] + [Fact] public void TestAddMissing() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ImportStaticClassWithUsingTests.cs b/Tests/CSharp/CodeRefactorings/ImportStaticClassWithUsingTests.cs index 095d1972..eb991387 100644 --- a/Tests/CSharp/CodeRefactorings/ImportStaticClassWithUsingTests.cs +++ b/Tests/CSharp/CodeRefactorings/ImportStaticClassWithUsingTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ImportStaticClassWithUsingTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimple() { Test(@" @@ -31,7 +30,7 @@ public void Test() }"); } - [Test] + [Fact] public void TestStaticClassInSameCompilationUnit1() { Test(@" @@ -80,7 +79,7 @@ public void Test() }"); } - [Test] + [Fact] public void TestStaticClassInSameCompilationUnit2() { Test(@" @@ -121,7 +120,7 @@ public void Test() }"); } - [Test] + [Fact] public void TestExtensionMethod() { TestWrongContext(@" @@ -137,7 +136,7 @@ public void Test() }"); } - [Test] + [Fact] public void TestMemberConflict() { Test(@" @@ -170,7 +169,7 @@ public void Tan(int i) }"); } - [Test] + [Fact] public void TestLocalConflict() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/InitializeAutoPropertyFromConstructorParameterTests.cs b/Tests/CSharp/CodeRefactorings/InitializeAutoPropertyFromConstructorParameterTests.cs index b2dea752..c39b3260 100644 --- a/Tests/CSharp/CodeRefactorings/InitializeAutoPropertyFromConstructorParameterTests.cs +++ b/Tests/CSharp/CodeRefactorings/InitializeAutoPropertyFromConstructorParameterTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class InitializeAutoPropertyFromConstructorParameterTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimple() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/InitializeFieldFromConstructorParameterTests.cs b/Tests/CSharp/CodeRefactorings/InitializeFieldFromConstructorParameterTests.cs index 7229a02b..8fedf022 100644 --- a/Tests/CSharp/CodeRefactorings/InitializeFieldFromConstructorParameterTests.cs +++ b/Tests/CSharp/CodeRefactorings/InitializeFieldFromConstructorParameterTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class InitializeFieldFromConstructorParameterTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimple() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/InsertAnonymousMethodSignatureTests.cs b/Tests/CSharp/CodeRefactorings/InsertAnonymousMethodSignatureTests.cs index 9952919c..c0a20c78 100644 --- a/Tests/CSharp/CodeRefactorings/InsertAnonymousMethodSignatureTests.cs +++ b/Tests/CSharp/CodeRefactorings/InsertAnonymousMethodSignatureTests.cs @@ -1,13 +1,12 @@ using System; -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class InsertAnonymousMethodSignatureTests : CSharpCodeRefactoringTestBase { - [Test()] + [Fact] public void Test() { string result = RunContextAction( @@ -23,7 +22,7 @@ public void Test() "}" ); - Assert.AreEqual( + Assert.Equal( "using System;" + Environment.NewLine + "class TestClass" + Environment.NewLine + "{" + Environment.NewLine + diff --git a/Tests/CSharp/CodeRefactorings/IntroduceConstantTests.cs b/Tests/CSharp/CodeRefactorings/IntroduceConstantTests.cs index ad86a614..dee720e7 100644 --- a/Tests/CSharp/CodeRefactorings/IntroduceConstantTests.cs +++ b/Tests/CSharp/CodeRefactorings/IntroduceConstantTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture, Ignore("Not implemented!")] public class IntroduceConstantTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact(Skip="Not implemented!")] public void TestLocalConstant() { Test(@"class TestClass @@ -25,7 +24,7 @@ public void Hello () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestLocalConstantHexNumber() { Test(@"class TestClass @@ -44,7 +43,7 @@ public void Hello () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestFieldConstant() { Test(@"class TestClass @@ -63,7 +62,7 @@ public void Hello () }", 1); } - [Test] + [Fact(Skip="Not implemented!")] public void TestLocalConstantReplaceAll() { Test(@"class TestClass @@ -86,7 +85,7 @@ public void Hello () }", 2); } - [Test] + [Fact(Skip="Not implemented!")] public void TestAlreadyConstant() { TestWrongContext(@"class TestClass @@ -98,7 +97,7 @@ public void Hello () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestAlreadyConstantCase2() { TestWrongContext(@"class TestClass @@ -107,7 +106,7 @@ public void TestAlreadyConstantCase2() }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestIntroduceConstantInInitializer() { Test(@"class TestClass diff --git a/Tests/CSharp/CodeRefactorings/IntroduceFormatItemTests.cs b/Tests/CSharp/CodeRefactorings/IntroduceFormatItemTests.cs index 2ae2ad71..cc910141 100644 --- a/Tests/CSharp/CodeRefactorings/IntroduceFormatItemTests.cs +++ b/Tests/CSharp/CodeRefactorings/IntroduceFormatItemTests.cs @@ -1,13 +1,12 @@ using System; -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class IntroduceFormatItemTests : CSharpCodeRefactoringTestBase { - [Test()] + [Fact] public void TestFirst() { string result = RunContextAction( @@ -21,7 +20,7 @@ public void TestFirst() "}" ); - Assert.AreEqual( + Assert.Equal( "class TestClass" + Environment.NewLine + "{" + Environment.NewLine + " void Test ()" + Environment.NewLine + @@ -31,7 +30,7 @@ public void TestFirst() "}", result); } - [Test()] + [Fact] public void TestSecond() { string result = RunContextAction( @@ -45,7 +44,7 @@ public void TestSecond() "}" ); - Assert.AreEqual( + Assert.Equal( "class TestClass" + Environment.NewLine + "{" + Environment.NewLine + " void Test ()" + Environment.NewLine + diff --git a/Tests/CSharp/CodeRefactorings/InvertConditionalOperatorTests.cs b/Tests/CSharp/CodeRefactorings/InvertConditionalOperatorTests.cs index 84aed309..c2dde87d 100644 --- a/Tests/CSharp/CodeRefactorings/InvertConditionalOperatorTests.cs +++ b/Tests/CSharp/CodeRefactorings/InvertConditionalOperatorTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class InvertConditionalOperatorTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestCase1() { Test(@" @@ -28,7 +27,7 @@ void Bar (int i, int j) "); } - [Test] + [Fact] public void TestConditionStart() { Test(@" @@ -50,7 +49,7 @@ void Bar (int i, int j) "); } - [Test] + [Fact] public void TestTrueStart() { Test(@" @@ -72,7 +71,7 @@ void Bar (int i, int j) "); } - [Test] + [Fact] public void TestFalseStart() { Test(@" @@ -94,7 +93,7 @@ void Bar (int i, int j) "); } - [Test] + [Fact] public void TestPopupLocations() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/InvertIfTests.cs b/Tests/CSharp/CodeRefactorings/InvertIfTests.cs index 77788eba..f2f50446 100644 --- a/Tests/CSharp/CodeRefactorings/InvertIfTests.cs +++ b/Tests/CSharp/CodeRefactorings/InvertIfTests.cs @@ -1,13 +1,11 @@ -using System; -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class InvertIfTestsTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimple() { Test(@" @@ -41,7 +39,7 @@ void Test () }"); } - [Test] + [Fact] public void TestReturn() { Test( @@ -66,7 +64,7 @@ void Test () ); } - [Test] + [Fact] public void TestInLoop() { Test( @@ -97,7 +95,7 @@ void Test () } - [Test] + [Fact] public void Test2() { Test( @@ -128,7 +126,7 @@ void Test () ); } - [Test] + [Fact] public void TestNonVoidMoreComplexMethod() { Test( @@ -162,7 +160,7 @@ int Test () } - [Test] + [Fact] public void TestComplexMethod() { Test( @@ -191,7 +189,7 @@ int Test () ); } - [Test] + [Fact] public void TestComment() { Test( @@ -227,7 +225,7 @@ int Test () /// /// InvertIfCodeRefactoringProvider: InvalidOperationException on nested "if ... if ... else" #62 /// - [Test] + [Fact] public void TestIssue62() { Test( diff --git a/Tests/CSharp/CodeRefactorings/InvertLogicalExpressionTests.cs b/Tests/CSharp/CodeRefactorings/InvertLogicalExpressionTests.cs index 17eec68d..1185b8bc 100644 --- a/Tests/CSharp/CodeRefactorings/InvertLogicalExpressionTests.cs +++ b/Tests/CSharp/CodeRefactorings/InvertLogicalExpressionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class InvertLogicalExpressionTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void ConditionlAnd() { Test(@" @@ -34,7 +33,7 @@ public void F() }"); } - [Test] + [Fact] public void ConditionlAndReverse() { Test(@" @@ -62,7 +61,7 @@ public void F() }"); } - [Test] + [Fact] public void ConditionlOr() { Test(@" @@ -90,7 +89,7 @@ public void F() }"); } - [Test] + [Fact] public void ConditionlOrReverse() { Test(@" @@ -119,7 +118,7 @@ public void F() } - [Test] + [Fact] public void ConditionlAnd2() { Test(@" @@ -147,7 +146,7 @@ public void F() }"); } - [Test] + [Fact] public void ConditionlOr2() { Test(@" @@ -175,7 +174,7 @@ public void F() }"); } - [Test] + [Fact] public void Equals() { Test(@" @@ -203,7 +202,7 @@ public void F() }"); } - [Test] + [Fact] public void EqualsReverse() { Test(@" @@ -232,7 +231,7 @@ public void F() } - [Test] + [Fact] public void TestNullCoalescing() { TestWrongContext(@" @@ -247,7 +246,7 @@ void Bar (object i, object j) } - [Test] + [Fact] public void TestUnaryExpression() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/InvokeAsStaticMethodTests.cs b/Tests/CSharp/CodeRefactorings/InvokeAsStaticMethodTests.cs index d1795905..a397d314 100644 --- a/Tests/CSharp/CodeRefactorings/InvokeAsStaticMethodTests.cs +++ b/Tests/CSharp/CodeRefactorings/InvokeAsStaticMethodTests.cs @@ -1,13 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class InvokeAsStaticMethodTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void HandlesBasicCase() { Test(@" @@ -39,7 +38,7 @@ void F() }"); } - [Test] + [Fact] public void HandlesBasicCaseWithComment() { Test(@" @@ -73,7 +72,7 @@ void F() }"); } - [Test] + [Fact] public void HandlesReturnValueUsage() { Test(@" @@ -113,7 +112,7 @@ void F() }"); } - [Test] + [Fact] public void IgnoresStaticMethodCalls() { TestWrongContext(@" @@ -132,7 +131,7 @@ void F() }"); } - [Test] + [Fact] public void IgnoresRegularMemberMethodCalls() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/IterateViaForeachTests.cs b/Tests/CSharp/CodeRefactorings/IterateViaForeachTests.cs index 759d4bc8..ed33e4f7 100644 --- a/Tests/CSharp/CodeRefactorings/IterateViaForeachTests.cs +++ b/Tests/CSharp/CodeRefactorings/IterateViaForeachTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class IterateViaForeachTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void HandlesNonGenericCase() { Test(@" @@ -31,7 +30,7 @@ public void F() }"); } - [Test] + [Fact] public void HandlesExpressionStatement() { Test(@" @@ -65,7 +64,7 @@ public void F() }"); } - [Test] + [Fact] public void HandlesAssignmentExpressionStatement() { Test(@" @@ -102,7 +101,7 @@ public void F() }"); } - [Test] + [Fact] public void HandlesStringPropertyAssignmentExpressionStatement() { Test(@" @@ -139,7 +138,7 @@ public void F() }"); } - [Test] + [Fact] public void HandlesAsExpressionStatement() { Test(@" @@ -165,7 +164,7 @@ public void F() }", 0, false); } - [Test] + [Fact] public void NonKnownTypeNamingTest() { Test(@" @@ -190,7 +189,7 @@ public void F() }"); } - [Test] + [Fact] public void HandlesAsExpression() { Test(@" @@ -216,7 +215,7 @@ public void F() }", 0, true); } - [Test] + [Fact] public void HandlesLinqExpressionAssignment() { Test(@" @@ -257,7 +256,7 @@ where item > 0 }"); } - [Test] + [Fact] public void IgnoresExpressionsInForeachStatement() { TestWrongContext(@" @@ -277,7 +276,7 @@ public void F() }"); } - [Test] + [Fact] public void IgnoresInitializersInForStatement() { TestWrongContext(@" @@ -291,7 +290,7 @@ public void F() }"); } - [Test] + [Fact] public void AddsForToBodyOfUsingStatement() { Test(@" @@ -321,7 +320,7 @@ public void F() }"); } - [Test] + [Fact] public void AddsBlockStatementToUsingStatement() { Test(@" @@ -346,7 +345,7 @@ public void F() }"); } - [Test] + [Fact] public void ConvertsSingleStatementInUsingToBlock() { Test(@" @@ -374,7 +373,7 @@ public void F() }"); } - [Test] + [Fact] public void IgnoresFieldDeclarations() { TestWrongContext(@" @@ -385,7 +384,7 @@ class TestClass }"); } - [Test] + [Fact] public void HandlesLocalDeclarationWithObjectCreation() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/JoinLocalVariableDeclarationAndAssignmentTests.cs b/Tests/CSharp/CodeRefactorings/JoinLocalVariableDeclarationAndAssignmentTests.cs index 0f01690f..fbe56375 100644 --- a/Tests/CSharp/CodeRefactorings/JoinLocalVariableDeclarationAndAssignmentTests.cs +++ b/Tests/CSharp/CodeRefactorings/JoinLocalVariableDeclarationAndAssignmentTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class JoinLocalVariableDeclarationAndAssignmentTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void Test() { Test(@" @@ -27,7 +26,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestWithComment() { Test(@" @@ -50,7 +49,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestDeclarationList() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/JoinStringTests.cs b/Tests/CSharp/CodeRefactorings/JoinStringTests.cs index a4aad94e..8e38bdcf 100644 --- a/Tests/CSharp/CodeRefactorings/JoinStringTests.cs +++ b/Tests/CSharp/CodeRefactorings/JoinStringTests.cs @@ -1,9 +1,8 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class JoinStringTests : CSharpCodeRefactoringTestBase { public void Test(string input, string output) @@ -25,20 +24,23 @@ string TestMethod (string arg) }"); } - [Test] + [Fact] public void TestRegularString() { Test("\"a\" $+ \"a\"", "\"aa\""); Test("arg + \"a\" $+ \"a\"", "arg + \"aa\""); } - [Test] + [Fact] public void TestVerbatimString() { Test("@\"a\" $+ @\"a\"", "@\"aa\""); } - public void TestWrongContext(string input) + [Theory] + [InlineData("@\"a\" $+ \"a\"")] + [InlineData("\"a\" $+ @\"a\"")] + public void TestWrongContext(string input) { TestWrongContext(@" class TestClass @@ -49,12 +51,5 @@ string TestMethod () } }"); } - - [Test] - public void TestWrongContext() - { - TestWrongContext("@\"a\" $+ \"a\""); - TestWrongContext("\"a\" $+ @\"a\""); - } } } diff --git a/Tests/CSharp/CodeRefactorings/LinqFluentToQueryTests.cs b/Tests/CSharp/CodeRefactorings/LinqFluentToQueryTests.cs index 6835670e..a846303b 100644 --- a/Tests/CSharp/CodeRefactorings/LinqFluentToQueryTests.cs +++ b/Tests/CSharp/CodeRefactorings/LinqFluentToQueryTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture, Ignore("Not implemented!")] public class LinqFluentToQueryTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact(Skip="Not implemented!")] public void TestBasicCase() { Test(@" @@ -31,7 +30,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestAddedParenthesis() { Test(@" @@ -56,7 +55,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestCast() { Test(@" @@ -81,7 +80,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestLet() { Test(@" @@ -107,7 +106,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestLet2() { Test(@" @@ -133,7 +132,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestLongLetChain() { Test(@" @@ -166,7 +165,7 @@ select w + two + three + four into sum }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestLongLetChain2() { Test(@" @@ -199,7 +198,7 @@ select w + two + three + four into sum }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestSelectMany() { Test(@" @@ -225,7 +224,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestSelectManyLet() { Test(@" @@ -253,7 +252,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestSelectManyLet2() { Test(@" @@ -285,7 +284,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestCastSelect() { Test(@" @@ -310,7 +309,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestSelectWhere() { Test(@" @@ -336,7 +335,7 @@ where t > 0 }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestSorting() { Test(@" @@ -362,7 +361,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestDegenerateWhere() { Test(@" @@ -388,7 +387,7 @@ where t > 0 }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestChain() { Test(@" @@ -416,7 +415,7 @@ where u > 0 }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestJoin() { Test(@" @@ -442,7 +441,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestGroupJoin() { Test(@" @@ -468,7 +467,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestNonRecursive() { Test(@" @@ -493,7 +492,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestNonRecursiveCombineQueries() { Test(@" @@ -519,7 +518,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestGroupBy() { Test(@" @@ -544,7 +543,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void Test_1AlreadyUsed() { Test(@" @@ -571,7 +570,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="Not implemented!")] public void TestDoubleCasts() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/LinqQueryToFluentTests.cs b/Tests/CSharp/CodeRefactorings/LinqQueryToFluentTests.cs index 6cde3368..82b56243 100644 --- a/Tests/CSharp/CodeRefactorings/LinqQueryToFluentTests.cs +++ b/Tests/CSharp/CodeRefactorings/LinqQueryToFluentTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture, Ignore("Not implemented!")] public class LinqQueryToFluentTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact(Skip="Not implemented!")] public void TestSimpleQuery() { string input = @" @@ -32,10 +31,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestName() { string input = @" @@ -67,10 +66,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestPrecedence() { string input = @" @@ -96,10 +95,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestWhereQuery() { string input = @" @@ -126,10 +125,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestOrderByQuery() { string input = @" @@ -156,10 +155,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestDoubleFromWithSelectQuery() { string input = @" @@ -188,10 +187,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestDoubleFromWithCastQuery() { string input = @" @@ -220,10 +219,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestDoubleFromWithIntermediateQuery() { string input = @" @@ -256,10 +255,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestLetQuery() { string input = @" @@ -289,10 +288,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestLongChainQuery() { string input = @" @@ -326,10 +325,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestCastQuery() { string input = @" @@ -355,10 +354,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestJoinQuery() { string input = @" @@ -387,10 +386,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestJoinWithIntermediateQuery() { string input = @" @@ -423,10 +422,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestJoinWithIntoSelectQuery() { string input = @" @@ -456,10 +455,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestJoinWithIntoIntermediateQuery() { string input = @" @@ -493,10 +492,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestSimpleGroup() { string input = @" @@ -522,10 +521,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestDifferentGroup() { string input = @" @@ -551,10 +550,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestInto() { string input = @" @@ -581,10 +580,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestDoubleFromWithLet() { string input = @" @@ -620,10 +619,10 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } - [Test] + [Fact(Skip="Not implemented!")] public void TestDoubleFromWithMidLet() { string input = @" @@ -656,7 +655,7 @@ public void TestMethod() } "; - Assert.AreEqual(output, RunContextAction(new LinqQueryToFluentAction(), input)); + Assert.Equal(output, RunContextAction(new LinqQueryToFluentAction(), input)); } } } diff --git a/Tests/CSharp/CodeRefactorings/MergeNestedIfTests.cs b/Tests/CSharp/CodeRefactorings/MergeNestedIfTests.cs index 36eb905b..f0ed7ec4 100644 --- a/Tests/CSharp/CodeRefactorings/MergeNestedIfTests.cs +++ b/Tests/CSharp/CodeRefactorings/MergeNestedIfTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class MergeNestedIfTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestOuterIf() { Test(@" @@ -29,7 +28,7 @@ int TestMethod (int a) }"); } - [Test] + [Fact] public void TestOuterIfWithBlock() { Test(@" @@ -57,7 +56,7 @@ int TestMethod (int a) }"); } - [Test] + [Fact] public void TestInnerIf() { Test(@" @@ -80,7 +79,7 @@ int TestMethod (int a) }"); } - [Test] + [Fact] public void TestInnerIfWithBlock() { Test(@" @@ -108,7 +107,7 @@ int TestMethod (int a) }"); } - [Test] + [Fact] public void TestOuterIfElse() { TestWrongContext(@" @@ -137,7 +136,7 @@ int TestMethod (int a) }"); } - [Test] + [Fact] public void TestInnerIfElse() { TestWrongContext(@" @@ -167,7 +166,7 @@ int TestMethod (int a) }"); } - [Test] + [Fact] public void TestMultipleTrueStatements() { TestWrongContext(@" @@ -196,7 +195,7 @@ int TestMethod (int a) }"); } - [Test] + [Fact] public void TestInnerIfWithComplexCondition() { Test(@" @@ -224,7 +223,7 @@ int TestMethod (int a) }"); } - [Test] + [Fact] public void TestOuterIfWithComplexCondition() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/MoveToOuterScopeTests.cs b/Tests/CSharp/CodeRefactorings/MoveToOuterScopeTests.cs index ff58fcf0..0b88d2ae 100644 --- a/Tests/CSharp/CodeRefactorings/MoveToOuterScopeTests.cs +++ b/Tests/CSharp/CodeRefactorings/MoveToOuterScopeTests.cs @@ -1,9 +1,8 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture, Ignore("Not implemented!")] public class MoveToOuterScopeTests : CSharpCodeRefactoringTestBase { void TestStatements(string input, string output) @@ -25,7 +24,7 @@ void F() }"); } - [Test] + [Fact(Skip="Not implemented!")] public void SimpleCase() { TestStatements(@" @@ -39,7 +38,7 @@ public void SimpleCase() "); } - [Test] + [Fact(Skip="Not implemented!")] public void IgnoresDeclarationsDirectlyInABody() { TestWrongContext(@" @@ -52,7 +51,7 @@ void F() }"); } - [Test] + [Fact(Skip="Not implemented!")] public void MovesOnlyTheCurrentVariableInitialization() { TestStatements(@" @@ -67,7 +66,7 @@ public void MovesOnlyTheCurrentVariableInitialization() "); } - [Test] + [Fact(Skip="Not implemented!")] public void MovesAllInitializersWhenOnType() { TestStatements(@" @@ -81,7 +80,7 @@ public void MovesAllInitializersWhenOnType() "); } - [Test] + [Fact(Skip="Not implemented!")] public void OnlyMovesDeclarationWhenInitializerDependsOnOtherStatements() { TestStatements(@" @@ -98,7 +97,7 @@ public void OnlyMovesDeclarationWhenInitializerDependsOnOtherStatements() "); } - [Test] + [Fact(Skip="Not implemented!")] public void HandlesLambdaDelegate() { TestStatements(@" @@ -112,7 +111,7 @@ public void HandlesLambdaDelegate() "); } - [Test] + [Fact(Skip="Not implemented!")] public void IgnoresDeclarationDirectlyInConstructorBody() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/NegateIsExpressionTests.cs b/Tests/CSharp/CodeRefactorings/NegateIsExpressionTests.cs index 928261fa..1736f0c0 100644 --- a/Tests/CSharp/CodeRefactorings/NegateIsExpressionTests.cs +++ b/Tests/CSharp/CodeRefactorings/NegateIsExpressionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class NegateIsExpressionTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleCase() { Test(@" @@ -26,7 +25,7 @@ void Test (object x) }"); } - [Test] + [Fact] public void TestReverse() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/NegateLogicalExpressionTests.cs b/Tests/CSharp/CodeRefactorings/NegateLogicalExpressionTests.cs index dd222b05..d2652759 100644 --- a/Tests/CSharp/CodeRefactorings/NegateLogicalExpressionTests.cs +++ b/Tests/CSharp/CodeRefactorings/NegateLogicalExpressionTests.cs @@ -1,9 +1,8 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class NegateLogicalExpressionTests : CSharpCodeRefactoringTestBase { public void Test(string op, string negatedOp) @@ -25,43 +24,43 @@ void Test () }"); } - [Test] + [Fact] public void TestEquality() { Test("==", "!="); } - [Test] + [Fact] public void TestInEquality() { Test("!=", "=="); } - [Test] + [Fact] public void TestGreaterThan() { Test(">", "<="); } - [Test] + [Fact] public void TestGreaterThanOrEqual() { Test(">=", "<"); } - [Test] + [Fact] public void TestLessThan() { Test("<", ">="); } - [Test] + [Fact] public void TestLessThanOrEqual() { Test("<=", ">"); } - [Test] + [Fact] public void TestUnaryOperator() { Test( diff --git a/Tests/CSharp/CodeRefactorings/PutInsideUsingTests.cs b/Tests/CSharp/CodeRefactorings/PutInsideUsingTests.cs index 523e2df8..5bc6c00b 100644 --- a/Tests/CSharp/CodeRefactorings/PutInsideUsingTests.cs +++ b/Tests/CSharp/CodeRefactorings/PutInsideUsingTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class PutInsideUsingTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void Test() { Test(@" @@ -47,7 +46,7 @@ void TestMethod (int i) }"); } - [Test] + [Fact] public void TestIDisposable() { Test(@" @@ -71,7 +70,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestTypeParameter() { @@ -98,7 +97,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestMultipleVariablesDeclaration() { Test(@" @@ -123,7 +122,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestNullInitializer() { TestWrongContext(@" @@ -137,7 +136,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestMoveVariableDeclaration() { Test(@" @@ -169,7 +168,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestMoveVariableDeclarationAndConvertInitializationToAssignment() { Test(@" @@ -200,7 +199,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestRemoveDisposeInvocation() { Test(@" @@ -225,7 +224,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestNotAvailableOnNonDisposableVariable() { TestWrongContext(@" @@ -240,7 +239,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestAllDeclaredVariablesAreUsedInsideUsingBlock() { Test(@" @@ -270,7 +269,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestEmptyUsingBlock() { Test(@" @@ -302,7 +301,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestVariableWithComment() { Test(@" @@ -336,7 +335,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestLastCallInBlockIsStatic() { Test(@" @@ -369,7 +368,7 @@ void TestMethod() /// /// Bug 39041 - NOP refactoring option for using /// - [Test] + [Fact] public void TestBug39041() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/RemoveBracesTests.cs b/Tests/CSharp/CodeRefactorings/RemoveBracesTests.cs index c1e41b99..ae935f53 100644 --- a/Tests/CSharp/CodeRefactorings/RemoveBracesTests.cs +++ b/Tests/CSharp/CodeRefactorings/RemoveBracesTests.cs @@ -1,13 +1,12 @@ using System; -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class RemoveBracesTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleBraces() { string result = RunContextAction( @@ -23,7 +22,7 @@ public void TestSimpleBraces() "}" ); - Assert.AreEqual( + Assert.Equal( "class TestClass" + Environment.NewLine + "{" + Environment.NewLine + " void Test()" + Environment.NewLine + @@ -33,7 +32,7 @@ public void TestSimpleBraces() "}", result); } - [Test] + [Fact] public void TestSimpleBracesWithComment() { string result = RunContextAction( @@ -50,7 +49,7 @@ public void TestSimpleBracesWithComment() "}" ); - Assert.AreEqual( + Assert.Equal( "class TestClass" + Environment.NewLine + "{" + Environment.NewLine + " void Test()" + Environment.NewLine + @@ -61,7 +60,7 @@ public void TestSimpleBracesWithComment() "}", result); } - [Test] + [Fact] public void TestTryCatch() { TestWrongContext(@"class TestClass @@ -73,7 +72,7 @@ void Test() }"); } - [Test] + [Fact] public void TestTryCatchCatch() { TestWrongContext(@"class TestClass @@ -85,7 +84,7 @@ void Test() }"); } - [Test] + [Fact] public void TestTryCatchFinally() { TestWrongContext(@"class TestClass @@ -98,7 +97,7 @@ void Test() } - [Test] + [Fact] public void TestSwitchCatch() { TestWrongContext(@"class TestClass @@ -110,7 +109,7 @@ void Test() }"); } - [Test] + [Fact] public void TestMethodDeclaration() { TestWrongContext(@"class TestClass @@ -122,7 +121,7 @@ void Test() }"); } - [Test] + [Fact] public void TestRemoveBracesFromIf() { Test(@"class TestClass @@ -142,7 +141,7 @@ void Test() }"); } - [Test] + [Fact] public void TestRemoveBracesFromElse() { Test(@"class TestClass @@ -167,7 +166,7 @@ void Test() }"); } - [Test] + [Fact] public void TestRemoveBracesFromDoWhile() { Test(@"class TestClass @@ -188,7 +187,7 @@ void Test() }"); } - [Test] + [Fact] public void TestRemoveBracesFromForeach() { Test(@"class TestClass @@ -208,7 +207,7 @@ void Test() }"); } - [Test] + [Fact] public void TestRemoveBracesFromFor() { Test(@"class TestClass @@ -228,7 +227,7 @@ void Test() }"); } - [Test] + [Fact] public void TestRemoveBracesFromLock() { Test(@"class TestClass @@ -248,7 +247,7 @@ void Test() }"); } - [Test] + [Fact] public void TestRemoveBracesFromUsing() { Test(@"class TestClass @@ -268,7 +267,7 @@ void Test() }"); } - [Test] + [Fact] public void TestRemoveBracesFromWhile() { Test(@"class TestClass @@ -288,7 +287,7 @@ void Test() }"); } - [Test] + [Fact] public void TestDoNotRemoveBracesFromBlockWithVariable() { TestWrongContext(@"class TestClass @@ -302,7 +301,7 @@ void Test() }"); } - [Test] + [Fact] public void TestDoNotRemoveBracesFromBlockWithLabel() { TestWrongContext(@"class TestClass @@ -316,7 +315,7 @@ void Test() }"); } - [Test] + [Fact] public void TestNullNode() { TestWrongContext(@"class TestClass diff --git a/Tests/CSharp/CodeRefactorings/RemoveCatchExceptionTests.cs b/Tests/CSharp/CodeRefactorings/RemoveCatchExceptionTests.cs index f9bae04d..19792675 100644 --- a/Tests/CSharp/CodeRefactorings/RemoveCatchExceptionTests.cs +++ b/Tests/CSharp/CodeRefactorings/RemoveCatchExceptionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class RemoveCatchExceptionTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void RemovesSimpleExceptionMatch() { Test(@" @@ -30,7 +29,7 @@ public void F() }"); } - [Test] + [Fact] public void PreservesBody() { Test(@" @@ -56,7 +55,7 @@ public void F() }"); } - [Test] + [Fact] public void PreservesWhitespaceInBody1() { Test(@" @@ -84,7 +83,7 @@ public void F() }"); } - [Test] + [Fact] public void PreservesWhitespaceInBody2() { Test(@" @@ -114,7 +113,7 @@ public void F() }"); } - [Test] + [Fact] public void IgnoresReferencedExceptionMatch() { TestWrongContext(@" @@ -130,7 +129,7 @@ public void F() }"); } - [Test] + [Fact] public void TestNullReferenceExceptionBig() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/RemoveRegionEndRegionDirectivesTests.cs b/Tests/CSharp/CodeRefactorings/RemoveRegionEndRegionDirectivesTests.cs index 08768c35..64e94ec1 100644 --- a/Tests/CSharp/CodeRefactorings/RemoveRegionEndRegionDirectivesTests.cs +++ b/Tests/CSharp/CodeRefactorings/RemoveRegionEndRegionDirectivesTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class RemoveRegionEndRegionDirectivesTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleRegion() { Test(@"class TestClass{ @@ -22,7 +21,7 @@ void Test () }"); } - [Test] + [Fact] public void TestNestedRegion() { Test(@"class TestClass @@ -47,7 +46,7 @@ void Test () } - [Test] + [Fact] public void TestEndRegion() { Test(@"class TestClass{ diff --git a/Tests/CSharp/CodeRefactorings/ReplaceAssignmentWithPostfixExpressionTests.cs b/Tests/CSharp/CodeRefactorings/ReplaceAssignmentWithPostfixExpressionTests.cs index a26e9ee7..6a63c717 100644 --- a/Tests/CSharp/CodeRefactorings/ReplaceAssignmentWithPostfixExpressionTests.cs +++ b/Tests/CSharp/CodeRefactorings/ReplaceAssignmentWithPostfixExpressionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ReplaceAssignmentWithPostfixExpressionTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestAdd() { Test(@" @@ -26,8 +25,7 @@ void Foo (int i) }"); } - [Ignore("broken")] - [Test] + [Fact(Skip="broken")] public void TestAddWithComment() { Test(@" @@ -49,7 +47,7 @@ void Foo (int i) }"); } - [Test] + [Fact] public void TestSub() { Test(@" @@ -70,7 +68,7 @@ void Foo (int i) } - [Test] + [Fact] public void TestAddCase2() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ReplaceAutoPropertyWithPropertyAndBackingFieldTests.cs b/Tests/CSharp/CodeRefactorings/ReplaceAutoPropertyWithPropertyAndBackingFieldTests.cs index 4c304883..fe9a301f 100644 --- a/Tests/CSharp/CodeRefactorings/ReplaceAutoPropertyWithPropertyAndBackingFieldTests.cs +++ b/Tests/CSharp/CodeRefactorings/ReplaceAutoPropertyWithPropertyAndBackingFieldTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ReplaceAutoPropertyWithPropertyAndBackingFieldTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleStore() { Test(@"class TestClass @@ -31,7 +30,7 @@ string Test }"); } - [Test] + [Fact] public void TestStaticStore() { Test(@"class TestClass @@ -56,7 +55,7 @@ public static string Test }"); } - [Test] + [Fact] public void TestWrongLocation() { TestWrongContext(@"class TestClass @@ -85,7 +84,7 @@ public string Test ${ } - [Test] + [Fact] public void TestUnimplementedComputedProperty() { Test(@"class TestClass @@ -121,7 +120,7 @@ string Test }"); } - [Test] + [Fact] public void TestGetter() { Test(@"class TestClass @@ -141,7 +140,7 @@ string Test }"); } - [Test] + [Fact] public void TestGetterAndSetter() { Test(@"class TestClass @@ -174,7 +173,7 @@ string Test } - [Test] + [Fact] public void TestWrongLocation2() { TestWrongContext(@"class TestClass @@ -214,7 +213,7 @@ public string Test ${ }"); } - [Test] + [Fact] public void TestPreserveVisibility() { Test(@"class TestClass diff --git a/Tests/CSharp/CodeRefactorings/ReplaceDirectCastWithSafeCastTest.cs b/Tests/CSharp/CodeRefactorings/ReplaceDirectCastWithSafeCastTest.cs index 64d80628..1d870747 100644 --- a/Tests/CSharp/CodeRefactorings/ReplaceDirectCastWithSafeCastTest.cs +++ b/Tests/CSharp/CodeRefactorings/ReplaceDirectCastWithSafeCastTest.cs @@ -1,9 +1,8 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ReplaceDirectCastWithSafeCastTest : CSharpCodeRefactoringTestBase { void TestType(string type) @@ -29,19 +28,19 @@ void Test (object a) Test(input, output); } - [Test] + [Fact] public void Test() { TestType("Exception"); } - [Test] + [Fact] public void TestNullable() { TestType("int?"); } - [Test] + [Fact] public void TestWithComment() { string input = @" @@ -68,7 +67,7 @@ void Test (object a) Test(input, output); } - [Test] + [Fact] public void TestNonReferenceType() { TestWrongContext(@" @@ -82,7 +81,7 @@ void Test (object a) }"); } - [Test] + [Fact] public void TestInsertParentheses() { string input = @" diff --git a/Tests/CSharp/CodeRefactorings/ReplaceExplicitTypeWithVarTests.cs b/Tests/CSharp/CodeRefactorings/ReplaceExplicitTypeWithVarTests.cs index ecd192a0..50fb8bc7 100644 --- a/Tests/CSharp/CodeRefactorings/ReplaceExplicitTypeWithVarTests.cs +++ b/Tests/CSharp/CodeRefactorings/ReplaceExplicitTypeWithVarTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ReplaceExplicitTypeWithVarTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void SimpleVarDeclaration() { string result = RunContextAction(new ReplaceExplicitTypeWithVarCodeRefactoringProvider(), @@ -17,7 +16,7 @@ void Test () $TestClass aVar = this; } }"); - Assert.AreEqual(@"class TestClass + Assert.Equal(@"class TestClass { void Test () { @@ -26,7 +25,7 @@ void Test () }", result); } - [Test] + [Fact] public void AlreadyAVar() { TestWrongContext(new ReplaceExplicitTypeWithVarCodeRefactoringProvider(), @@ -39,7 +38,7 @@ void Test () }"); } - [Test] + [Fact] public void AlreadyAVarInForeach() { TestWrongContext(new ReplaceExplicitTypeWithVarCodeRefactoringProvider(), @@ -53,7 +52,7 @@ void Test () }"); } - [Test] + [Fact] public void ForeachDeclaration() { string result = RunContextAction(new ReplaceExplicitTypeWithVarCodeRefactoringProvider(), @@ -65,7 +64,7 @@ void Test () } } }"); - Assert.AreEqual(@"class TestClass + Assert.Equal(@"class TestClass { void Test () { @@ -75,7 +74,7 @@ void Test () }", result); } - [Test] + [Fact] public void TestInvalidLocationBug() { TestWrongContext(new ReplaceExplicitTypeWithVarCodeRefactoringProvider(), @@ -88,7 +87,7 @@ public void TestInvalidLocationBug() }"); } - [Test] + [Fact] public void TestMultipleInitializers() { TestWrongContext(new ReplaceExplicitTypeWithVarCodeRefactoringProvider(), diff --git a/Tests/CSharp/CodeRefactorings/ReplaceOperatorAssignmentWithAssignmentTests.cs b/Tests/CSharp/CodeRefactorings/ReplaceOperatorAssignmentWithAssignmentTests.cs index 6ce5cd05..c08ac192 100644 --- a/Tests/CSharp/CodeRefactorings/ReplaceOperatorAssignmentWithAssignmentTests.cs +++ b/Tests/CSharp/CodeRefactorings/ReplaceOperatorAssignmentWithAssignmentTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ReplaceOperatorAssignmentWithAssignmentTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestAdd() { Test(@" @@ -26,7 +25,7 @@ void Foo (int i) }"); } - [Test] + [Fact] public void TestAddWithComment() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ReplacePostfixExpressionWithAssignmentTests.cs b/Tests/CSharp/CodeRefactorings/ReplacePostfixExpressionWithAssignmentTests.cs index b30f139d..075fa800 100644 --- a/Tests/CSharp/CodeRefactorings/ReplacePostfixExpressionWithAssignmentTests.cs +++ b/Tests/CSharp/CodeRefactorings/ReplacePostfixExpressionWithAssignmentTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ReplacePostfixExpressionWithAssignmentTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestAdd() { Test(@" @@ -26,8 +25,7 @@ void Foo (int i) }"); } - [Ignore("broken")] - [Test] + [Fact(Skip="broken")] public void TestAddWithComment() { Test(@" @@ -49,7 +47,7 @@ void Foo (int i) }"); } - [Test] + [Fact] public void TestSub() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ReplacePropertyWithBackingFieldWithAutoPropertyTests.cs b/Tests/CSharp/CodeRefactorings/ReplacePropertyWithBackingFieldWithAutoPropertyTests.cs index a86b9bfd..ef9ca07a 100644 --- a/Tests/CSharp/CodeRefactorings/ReplacePropertyWithBackingFieldWithAutoPropertyTests.cs +++ b/Tests/CSharp/CodeRefactorings/ReplacePropertyWithBackingFieldWithAutoPropertyTests.cs @@ -1,13 +1,12 @@ using System; -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ReplacePropertyWithBackingFieldWithAutoPropertyTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleStore() { Test(@" @@ -28,7 +27,7 @@ class TestClass "); } - [Test] + [Fact] public void TestSimpleStoreWithXmlDoc() { Test(@" @@ -60,7 +59,7 @@ class TestClass /// /// Bug 3292 -Error in analysis service /// - [Test] + [Fact] public void TestBug3292() { TestWrongContext( @@ -77,7 +76,7 @@ public void TestBug3292() ); } - [Test()] + [Fact] public void TestBug3292Case2() { TestWrongContext( @@ -95,7 +94,7 @@ public void TestBug3292Case2() } - [Test] + [Fact] public void TestWrongLocation() { TestWrongContext(@"class TestClass @@ -141,7 +140,7 @@ public string Test ${ /// /// Bug 16108 - Convert to autoproperty issues /// - [Test] + [Fact] public void TestBug16108Case1() { TestWrongContext(@" @@ -160,7 +159,7 @@ class MyClass /// /// Bug 16108 - Convert to autoproperty issues /// - [Test] + [Fact] public void TestBug16108Case2() { TestWrongContext(@" @@ -179,7 +178,7 @@ class MyClass /// /// Bug 16447 - Convert to Auto Property removes multiple variable if declared inline /// - [Test] + [Fact] public void TestBug16447() { Test(@" @@ -201,7 +200,7 @@ public class Foo } - [Test] + [Fact] public void TestUnimplementedComputedProperty() { Test(@" @@ -228,7 +227,7 @@ class TestClass "); } - [Test] + [Fact] public void TestPreserveVisibility() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ReplaceSafeCastWithDirectCastTests.cs b/Tests/CSharp/CodeRefactorings/ReplaceSafeCastWithDirectCastTests.cs index a5595d01..3c788809 100644 --- a/Tests/CSharp/CodeRefactorings/ReplaceSafeCastWithDirectCastTests.cs +++ b/Tests/CSharp/CodeRefactorings/ReplaceSafeCastWithDirectCastTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ReplaceSafeCastWithDirectCastTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void Test() { Test(@" @@ -28,7 +27,7 @@ void Test (object a) }"); } - [Test] + [Fact] public void TestWithComment1() { Test(@" @@ -52,7 +51,7 @@ void Test (object a) }"); } - [Test] + [Fact] public void TestWithComment2() { Test(@" @@ -74,7 +73,7 @@ void Test (object a) }"); } - [Test] + [Fact] public void TestRemoveParentheses() { string input = @" @@ -94,7 +93,7 @@ void TestMethod (object o) Test(input, output); } - [Test] + [Fact] public void TestInsertParentheses() { string input = @" diff --git a/Tests/CSharp/CodeRefactorings/ReplaceVarWithExplicitTypeTests.cs b/Tests/CSharp/CodeRefactorings/ReplaceVarWithExplicitTypeTests.cs index deb8b631..cdeac0a5 100644 --- a/Tests/CSharp/CodeRefactorings/ReplaceVarWithExplicitTypeTests.cs +++ b/Tests/CSharp/CodeRefactorings/ReplaceVarWithExplicitTypeTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ReplaceVarWithExplicitTypeTests : CSharpCodeRefactoringTestBase { - [Test()] + [Fact] public void SimpleVarDeclaration() { string result = RunContextAction(new ReplaceVarWithExplicitTypeCodeRefactoringProvider(), @@ -17,7 +16,7 @@ void Test () $var aVar = this; } }"); - Assert.AreEqual(@"class TestClass + Assert.Equal(@"class TestClass { void Test () { @@ -26,7 +25,7 @@ void Test () }", result); } - [Test()] + [Fact] public void ForeachDeclaration() { string result = RunContextAction(new ReplaceVarWithExplicitTypeCodeRefactoringProvider(), @@ -38,7 +37,7 @@ void Test () } } }"); - Assert.AreEqual(@"class TestClass + Assert.Equal(@"class TestClass { void Test () { @@ -48,7 +47,7 @@ void Test () }", result); } - [Test()] + [Fact] public void SimpleAnonymousTypeDeclaration() { TestWrongContext(new ReplaceVarWithExplicitTypeCodeRefactoringProvider(), @"class TestClass @@ -60,7 +59,7 @@ void Test() }"); } - [Test()] + [Fact] public void ForeachAnonymousTypeDeclaration() { TestWrongContext(new ReplaceVarWithExplicitTypeCodeRefactoringProvider(), @"class TestClass @@ -74,7 +73,7 @@ void Test() }"); } - [Test()] + [Fact] public void TestAnonymousArrayType() { TestWrongContext(new ReplaceVarWithExplicitTypeCodeRefactoringProvider(), @"class TestClass @@ -88,7 +87,7 @@ void Test() }"); } - [Test()] + [Fact] public void TestAnonymousGenericType() { TestWrongContext(new ReplaceVarWithExplicitTypeCodeRefactoringProvider(), @"class TestClass diff --git a/Tests/CSharp/CodeRefactorings/ReplaceWithOperatorAssignmentTests.cs b/Tests/CSharp/CodeRefactorings/ReplaceWithOperatorAssignmentTests.cs index f57538ca..2a539cce 100644 --- a/Tests/CSharp/CodeRefactorings/ReplaceWithOperatorAssignmentTests.cs +++ b/Tests/CSharp/CodeRefactorings/ReplaceWithOperatorAssignmentTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ReplaceWithOperatorAssignmentTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestAdd() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ReverseDirectionForForLoopTests.cs b/Tests/CSharp/CodeRefactorings/ReverseDirectionForForLoopTests.cs index 0b54608b..b9567f4a 100644 --- a/Tests/CSharp/CodeRefactorings/ReverseDirectionForForLoopTests.cs +++ b/Tests/CSharp/CodeRefactorings/ReverseDirectionForForLoopTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ReverseDirectionForForLoopTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestPrimitveExpression() { Test(@" @@ -30,7 +29,7 @@ public void Bar () "); } - [Test] + [Fact] public void TestPrimitveExpressionCase2() { Test(@" @@ -54,7 +53,7 @@ public void Bar () "); } - [Test] + [Fact] public void TestPrimitveExpressionReverse() { Test(@" @@ -78,7 +77,7 @@ public void Bar () "); } - [Test] + [Fact] public void TestLowerEqualPrimitveExpression() { Test(@" @@ -102,7 +101,7 @@ public void Bar () "); } - [Test] + [Fact] public void TestLowerEqualPrimitveExpressionCase2() { Test(@" @@ -126,7 +125,7 @@ public void Bar () "); } - [Test] + [Fact] public void TestArbitraryBounds() { Test(@" @@ -150,7 +149,7 @@ public void Bar (int from, int to) "); } - [Test] + [Fact] public void TestArbitraryBoundsCase2() { Test(@" @@ -175,7 +174,7 @@ public void Bar () } - [Test] + [Fact] public void TestComplex() { Test(@" @@ -199,7 +198,7 @@ public void Bar () "); } - [Test] + [Fact] public void TestComplexReverse() { Test(@" @@ -223,7 +222,7 @@ public void Bar () "); } - [Test] + [Fact] public void TestArbitraryBoundsReverse() { Test(@" @@ -247,7 +246,7 @@ public void Bar (int from, int to) "); } - [Test] + [Fact] public void TestPrimitiveExpressionArbitrarySteps() { Test(@" @@ -271,7 +270,7 @@ public void Bar () "); } - [Test] + [Fact] public void TestPrimitiveExpressionArbitraryStepsCase2() { Test(@" @@ -295,7 +294,7 @@ public void Bar () "); } - [Test] + [Fact] public void TestPrimitiveExpressionArbitraryStepsReverse() { Test(@" @@ -319,7 +318,7 @@ public void Bar () "); } - [Test] + [Fact] public void TestArbitrarySteps() { Test(@" @@ -343,7 +342,7 @@ public void Bar (int from, int to, int step) "); } - [Test] + [Fact] public void TestArbitraryStepsReverse() { Test(@" @@ -367,8 +366,7 @@ public void Bar (int from, int to, int step) "); } - [Ignore("Implement me")] - [Test] + [Fact(Skip="Implement me")] public void TestOptimizedFor() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/SplitIfWithAndConditionInTwoTests.cs b/Tests/CSharp/CodeRefactorings/SplitIfWithAndConditionInTwoTests.cs index c78d600a..349c996d 100644 --- a/Tests/CSharp/CodeRefactorings/SplitIfWithAndConditionInTwoTests.cs +++ b/Tests/CSharp/CodeRefactorings/SplitIfWithAndConditionInTwoTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class SplitIfWithAndConditionInTwoTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestAndSimple() { Test(@" @@ -36,7 +35,7 @@ void Foo (bool a, bool b) "); } - [Test] + [Fact] public void TestAndIfElse() { Test(@" @@ -79,7 +78,7 @@ void Foo (bool a, bool b) "); } - [Test] + [Fact] public void TestComplexAnd() { Test(@" @@ -111,7 +110,7 @@ void Foo (bool a, bool b) } - [Test] + [Fact] public void TestInvalid() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/SplitIfWithOrConditionInTwoTests.cs b/Tests/CSharp/CodeRefactorings/SplitIfWithOrConditionInTwoTests.cs index d507b40f..c6504ee4 100644 --- a/Tests/CSharp/CodeRefactorings/SplitIfWithOrConditionInTwoTests.cs +++ b/Tests/CSharp/CodeRefactorings/SplitIfWithOrConditionInTwoTests.cs @@ -1,13 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class SplitIfWithOrConditionInTwoTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestOrSimple() { Test(@" @@ -38,7 +37,7 @@ void Foo (bool a, bool b) "); } - [Test] + [Fact] public void TestOrIfElse() { Test(@" @@ -79,7 +78,7 @@ void Foo (bool a, bool b) } - [Test] + [Fact] public void TestAndOr() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/SplitLocalVariableDeclarationAndAssignmentTests.cs b/Tests/CSharp/CodeRefactorings/SplitLocalVariableDeclarationAndAssignmentTests.cs index 8956d7e2..80478cdc 100644 --- a/Tests/CSharp/CodeRefactorings/SplitLocalVariableDeclarationAndAssignmentTests.cs +++ b/Tests/CSharp/CodeRefactorings/SplitLocalVariableDeclarationAndAssignmentTests.cs @@ -1,13 +1,12 @@ using System; -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class SplitLocalVariableDeclarationAndAssignmentTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleExpression() { string result = RunContextAction( @@ -21,7 +20,7 @@ public void TestSimpleExpression() "}" ); - Assert.AreEqual( + Assert.Equal( "class TestClass" + Environment.NewLine + "{" + Environment.NewLine + " void Test ()" + Environment.NewLine + @@ -32,7 +31,7 @@ public void TestSimpleExpression() "}", result); } - [Test] + [Fact] public void TestSimpleExpressionWithComment() { string result = RunContextAction( @@ -47,7 +46,7 @@ public void TestSimpleExpressionWithComment() "}" ); - Assert.AreEqual( + Assert.Equal( "class TestClass" + Environment.NewLine + "{" + Environment.NewLine + " void Test ()" + Environment.NewLine + @@ -59,7 +58,7 @@ public void TestSimpleExpressionWithComment() "}", result); } - [Test] + [Fact] public void TestVarType() { string result = RunContextAction( @@ -72,7 +71,7 @@ public void TestVarType() " }" + Environment.NewLine + "}" ); - Assert.AreEqual( + Assert.Equal( "class TestClass" + Environment.NewLine + "{" + Environment.NewLine + " void Test ()" + Environment.NewLine + @@ -83,7 +82,7 @@ public void TestVarType() "}", result); } - [Test] + [Fact] public void TestForStatement() { string result = RunContextAction( @@ -104,10 +103,10 @@ void Test () for (i = 1; i < 10; i++) {} } }"; - Assert.AreEqual(HomogenizeEol(expected), HomogenizeEol(result)); + Assert.Equal(HomogenizeEol(expected), HomogenizeEol(result)); } - [Test] + [Fact] public void TestPopupAtAssign() { Test(@"class Test @@ -126,7 +125,7 @@ public static void Main (string[] args) }"); } - [Test] + [Fact] public void TestPopupAtBeginningOfExpression() { Test(@"class Test @@ -145,7 +144,7 @@ public static void Main (string[] args) }"); } - [Test] + [Fact] public void TestMultipleInitializers() { Test(@"class Test @@ -166,7 +165,7 @@ public static void Main (string[] args) }"); } - [Test] + [Fact] public void TestVarDeclarationWithComment() { Test(@"class Test @@ -187,7 +186,7 @@ public void T() }"); } - [Test] + [Fact] public void TestForStatementWithComment() { Test(@"class Test @@ -208,7 +207,7 @@ public void T() }"); } - [Test] + [Fact] public void TestHideInExpression() { TestWrongContext(@"class Test @@ -220,7 +219,7 @@ public static void Main (string[] args) }"); } - [Test] + [Fact] public void TestLocalConstants() { TestWrongContext(@"class Test diff --git a/Tests/CSharp/CodeRefactorings/SplitStringTests.cs b/Tests/CSharp/CodeRefactorings/SplitStringTests.cs index 2de7392f..f49c7472 100644 --- a/Tests/CSharp/CodeRefactorings/SplitStringTests.cs +++ b/Tests/CSharp/CodeRefactorings/SplitStringTests.cs @@ -1,13 +1,12 @@ using System; -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class SplitStringTests : CSharpCodeRefactoringTestBase { - [Test()] + [Fact] public void TestSimpleString() { string result = RunContextAction( @@ -21,7 +20,7 @@ public void TestSimpleString() "}" ); - Assert.AreEqual( + Assert.Equal( "class TestClass" + Environment.NewLine + "{" + Environment.NewLine + " void Test ()" + Environment.NewLine + @@ -31,7 +30,7 @@ public void TestSimpleString() "}", result); } - [Test()] + [Fact] public void TestVerbatimString() { string result = RunContextAction( @@ -45,7 +44,7 @@ public void TestVerbatimString() "}" ); - Assert.AreEqual( + Assert.Equal( "class TestClass" + Environment.NewLine + "{" + Environment.NewLine + " void Test ()" + Environment.NewLine + diff --git a/Tests/CSharp/CodeRefactorings/SplitVariableIntoSeveralOnesTests.cs b/Tests/CSharp/CodeRefactorings/SplitVariableIntoSeveralOnesTests.cs index eddc7195..a37f63ab 100644 --- a/Tests/CSharp/CodeRefactorings/SplitVariableIntoSeveralOnesTests.cs +++ b/Tests/CSharp/CodeRefactorings/SplitVariableIntoSeveralOnesTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class SplitDeclarationListTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestLocalVariable() { Test(@" @@ -28,7 +27,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestField() { Test(@" @@ -44,7 +43,7 @@ class TestClass }"); } - [Test] + [Fact] public void TestEvent() { Test(@" @@ -60,7 +59,7 @@ class TestClass }"); } - [Test] + [Fact] public void TestFixedField() { Test(@" @@ -76,7 +75,7 @@ struct TestStruct }"); } - [Test] + [Fact] public void TestVariableInFor() { TestWrongContext(@" @@ -90,7 +89,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestSingleVariable() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/ToAbstractVirtualNonVirtualConversionTests.cs b/Tests/CSharp/CodeRefactorings/ToAbstractVirtualNonVirtualConversionTests.cs index 8ad8260b..5360a730 100644 --- a/Tests/CSharp/CodeRefactorings/ToAbstractVirtualNonVirtualConversionTests.cs +++ b/Tests/CSharp/CodeRefactorings/ToAbstractVirtualNonVirtualConversionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class ToAbstractVirtualNonVirtualConversionTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void VirtualToNonVirtualTest() { Test( @@ -23,7 +22,7 @@ public void Foo() }"); } - [Test] + [Fact] public void VirtualToAbstractTest() { Test( @@ -38,7 +37,7 @@ public void VirtualToAbstractTest() }"); } - [Test] + [Fact] public void VirtualIndexerToAbstractTest() { Test( @@ -55,7 +54,7 @@ public virtual int $this[int i] { }"); } - [Test] + [Fact] public void NonVirtualStaticToVirtualTest() { Test( @@ -72,7 +71,7 @@ public virtual void Foo() }"); } - [Test] + [Fact] public void NonVirtualToVirtualTest() { Test( @@ -89,7 +88,7 @@ public virtual void Foo() }"); } - [Test] + [Fact] public void InvalidPrivateImplementationTypeTest() { TestWrongContext( @@ -102,8 +101,8 @@ class Test : IDisposable }"); } - [Test] - public void AbstractToNonAbstractTest() + [Fact(Skip = "broken")] + public void AbstractToNonAbstractTest() { Test( @"abstract class Test @@ -118,8 +117,8 @@ public void Foo() }"); } - [Test] - public void AbstractToVirtualTest() + [Fact(Skip = "broken")] + public void AbstractToVirtualTest() { Test( @"abstract class Test @@ -134,8 +133,8 @@ public virtual void Foo() }", 1); } - [Test] - public void AbstractPropertyToNonAbstractTest() + [Fact(Skip = "broken")] + public void AbstractPropertyToNonAbstractTest() { Test( @"abstract class Test @@ -162,7 +161,7 @@ public int Foo }"); } - [Test] + [Fact(Skip="broken")] public void AbstractEventToNonAbstractTest() { Test( @@ -177,8 +176,8 @@ abstract class Test }"); } - [Test] - public void NonAbstractToAbstractTest() + [Fact(Skip = "broken")] + public void NonAbstractToAbstractTest() { Test( @"abstract class Test @@ -193,8 +192,8 @@ public void NonAbstractToAbstractTest() }"); } - [Test] - public void NonAbstractEventToAbstractTest() + [Fact(Skip = "broken")] + public void NonAbstractEventToAbstractTest() { Test( @"abstract class Test @@ -213,7 +212,7 @@ public event EventHandler $Foo { }"); } - [Test] + [Fact] public void StaticMethodInStaticClassTest() { TestWrongContext( @@ -226,7 +225,7 @@ public void StaticMethodInStaticClassTest() }"); } - [Test] + [Fact] public void InvalidLocalContext() { TestWrongContext( @@ -241,7 +240,7 @@ public static void Main(string[] args) } - [Test] + [Fact] public void InvalidOverrideTest() { TestWrongContext( @@ -254,7 +253,7 @@ class Test }"); } - [Test] + [Fact] public void InvalidMethodTest() { var actions = GetActions( @@ -267,11 +266,11 @@ abstract class Test } }"); // only virtual -> non virtual should be provided - no abstract conversion - Assert.AreEqual(1, actions.Count); + Assert.Equal(1, actions.Count); } - [Test] + [Fact] public void TestNullReferenceException() { TestWrongContext( diff --git a/Tests/CSharp/CodeRefactorings/UseAsAndNullCheckTests.cs b/Tests/CSharp/CodeRefactorings/UseAsAndNullCheckTests.cs index eebddfaf..e45b75a2 100644 --- a/Tests/CSharp/CodeRefactorings/UseAsAndNullCheckTests.cs +++ b/Tests/CSharp/CodeRefactorings/UseAsAndNullCheckTests.cs @@ -1,13 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class UseAsAndNullCheckTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void EmptyCase() { Test(@" @@ -35,7 +34,7 @@ public Bar Baz (object foo) } - [Test] + [Fact] public void SimpleCase() { Test(@" @@ -66,7 +65,7 @@ public Bar Baz (object foo) "); } - [Test] + [Fact] public void SimpleCaseWithKeywordVarNames() { Test(@" @@ -97,7 +96,7 @@ public Int Baz (object foo) "); } - [Test] + [Fact] public void NegatedCase() { Test(@" @@ -127,7 +126,7 @@ public Bar Baz (object foo) } - [Test] + [Fact] public void NegatedEmbeddedCase() { Test(@" @@ -163,7 +162,7 @@ public Bar Baz (object foo) "); } - [Test] + [Fact] public void ComplexCase() { Test(@" @@ -200,7 +199,7 @@ public IDisposable Baz (object foo) "); } - [Test] + [Fact] public void IfElseCase() { Test(@" @@ -235,7 +234,7 @@ public Bar Baz (object foo) "); } - [Test] + [Fact] public void NestedIf() { Test(@" @@ -274,7 +273,7 @@ public Bar Baz (object foo) "); } - [Test] + [Fact] public void TestNegatedCaseWithReturn() { Test(@" @@ -303,7 +302,7 @@ public Bar Baz (object foo) "); } - [Test] + [Fact] public void TestNegatedCaseWithBreak() { Test(@" @@ -336,7 +335,7 @@ public Bar Baz (object foo) "); } - [Test] + [Fact] public void TestCaseWithContinue() { Test(@" @@ -376,7 +375,7 @@ public Bar Baz (object foo) } - [Test] + [Fact] public void ConditionalCase() { Test(@" @@ -405,7 +404,7 @@ public Bar Baz (object foo) "); } - [Test] + [Fact] public void InvalidCase() { TestWrongContext(@" @@ -423,7 +422,7 @@ public int Baz (object foo) "); } - [Test] + [Fact] public void InvalidCase2() { TestWrongContext(@" diff --git a/Tests/CSharp/CodeRefactorings/UseStringFormatTests.cs b/Tests/CSharp/CodeRefactorings/UseStringFormatTests.cs index bbe63ed3..6aa1c874 100644 --- a/Tests/CSharp/CodeRefactorings/UseStringFormatTests.cs +++ b/Tests/CSharp/CodeRefactorings/UseStringFormatTests.cs @@ -1,19 +1,19 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class UseStringFormatTests : CSharpCodeRefactoringTestBase { - [TestCase(@"if (str != null && str != """") {}")] - [TestCase(@"if (str != null && str != """") {}")] - [TestCase(@"if (str != null && str != """") {}")] - [TestCase(@"if (str != null && str != """") {}")] - [TestCase(@"if (str != null && str != """") {}")] - [TestCase(@"if (str != null && str != """") {}")] - [TestCase(@"if (str != null && str != """") {}")] - [Description(@"Do not suggest action for binary expressions with assignment operators. https://github.com/icsharpcode/RefactoringEssentials/issues/137")] + [Theory] + [InlineData(@"if (str != null && str != """") {}")] + [InlineData(@"if (str != null && str != """") {}")] + [InlineData(@"if (str != null && str != """") {}")] + [InlineData(@"if (str != null && str != """") {}")] + [InlineData(@"if (str != null && str != """") {}")] + [InlineData(@"if (str != null && str != """") {}")] + [InlineData(@"if (str != null && str != """") {}")] + // Do not suggest action for binary expressions with assignment operators. https://github.com/icsharpcode/RefactoringEssentials/issues/137" public void Issue137_Case1(string expression) { TestWrongContext( @@ -28,8 +28,8 @@ void TestMethod(string str) "); } - [Test] - [Description(@"Do not suggest action for binary expressions with assignment operators. https://github.com/icsharpcode/RefactoringEssentials/issues/137")] + [Fact] + // Do not suggest action for binary expressions with assignment operators. https://github.com/icsharpcode/RefactoringEssentials/issues/137 public void Issue137_Case2() { TestWrongContext( @@ -50,10 +50,11 @@ void TestMethod(string str) } - [TestCase(@"Assert.IsTrue(actions == null || actions.Count == 0, action.GetType() + "" shouldn't be valid there."");")] - [TestCase(@"Assert.IsTrue(actions == null || actions.Count == 0, action.GetType() + "" shouldn't be valid there."");")] - [TestCase(@"Assert.IsTrue(actions == null || actions.Count == 0, action.GetType() + "" shouldn't be valid there."");")] - [Description(@"Ensure proper handling across complication cases. https://github.com/icsharpcode/RefactoringEssentials/issues/137")] + [Theory] + [InlineData(@"Assert.IsTrue(actions == null || actions.Count == 0, action.GetType() + "" shouldn't be valid there."");")] + [InlineData(@"Assert.IsTrue(actions == null || actions.Count == 0, action.GetType() + "" shouldn't be valid there."");")] + [InlineData(@"Assert.IsTrue(actions == null || actions.Count == 0, action.GetType() + "" shouldn't be valid there."");")] + // Ensure proper handling across complication cases. https://github.com/icsharpcode/RefactoringEssentials/issues/137 public void Issue137_Case3(string expression) { Test( @@ -74,18 +75,19 @@ void TestMethod(string str, bool option1, bool option2) }"); } - [TestCase(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] - [TestCase(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] - [TestCase(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] - [TestCase(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] - [TestCase(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] - [TestCase(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] - [TestCase(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] - [TestCase(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] - [TestCase(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] - [TestCase(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] - [TestCase(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] - [Description(@"Ensure proper handling across complication cases. https://github.com/icsharpcode/RefactoringEssentials/issues/137")] + [Theory] + [InlineData(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] + [InlineData(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] + [InlineData(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] + [InlineData(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] + [InlineData(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] + [InlineData(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] + [InlineData(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] + [InlineData(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] + [InlineData(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] + [InlineData(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] + [InlineData(@"var x = (option1 && option2 ? ""Hello "" : string.Empty) + ""World"";")] + // Ensure proper handling across complication cases. https://github.com/icsharpcode/RefactoringEssentials/issues/137 public void Issue137_Case4(string expression) { Test( @@ -106,10 +108,11 @@ void TestMethod(string str, bool option1, bool option2) }"); } - [TestCase(@"var s = ""Hello"" + ""World!"";", @"var s = ""HelloWorld!"";")] - [TestCase(@"var s = ""Hello"" + ""World!"";", @"var s = ""HelloWorld!"";")] - [TestCase(@"var s = ""Hello"" + ""World!"";", @"var s = ""HelloWorld!"";")] - [Description("String concatenation alone should not be replaced by concatenated string.")] + [Theory] + [InlineData(@"var s = ""Hello"" + ""World!"";", @"var s = ""HelloWorld!"";")] + [InlineData(@"var s = ""Hello"" + ""World!"";", @"var s = ""HelloWorld!"";")] + [InlineData(@"var s = ""Hello"" + ""World!"";", @"var s = ""HelloWorld!"";")] + // String concatenation alone should not be replaced by concatenated string. public void TestSimpleStringConcatenation(string expression, string expectation) { Test( @@ -117,10 +120,10 @@ public void TestSimpleStringConcatenation(string expression, string expectation) expectation); } - [TestCase(@"var s = @""Hello"" + @""World!"";", @"var s = @""HelloWorld!"";")] - [TestCase(@"var s = @""Hello"" + @""World!"";", @"var s = @""HelloWorld!"";")] - [TestCase(@"var s = @""Hello"" + @""World!"";", @"var s = @""HelloWorld!"";")] - [Description("String concatenation alone should not be replaced by concatenated string.")] + [InlineData(@"var s = @""Hello"" + @""World!"";", @"var s = @""HelloWorld!"";")] + [InlineData(@"var s = @""Hello"" + @""World!"";", @"var s = @""HelloWorld!"";")] + [InlineData(@"var s = @""Hello"" + @""World!"";", @"var s = @""HelloWorld!"";")] + // String concatenation alone should not be replaced by concatenated string. public void TestSimpleVerbatimStringConcatenation(string expression, string expectation) { Test( @@ -128,36 +131,37 @@ public void TestSimpleVerbatimStringConcatenation(string expression, string expe expectation); } - [Test] - [Description("Concatenation between verbatim and non-verbatim strings is messy, so leave it alone.")] + [Fact] + // Concatenation between verbatim and non-verbatim strings is messy, so leave it alone. public void TestWrongContextForVerbatimAndNonVerbatimStrings() { TestWrongContext(@"var s = @""Hello"" + ""World!"";"); } - [Test] - [Description("Ensure action is not applied to addition syntax without string literals.")] + [Fact] + // Ensure action is not applied to addition syntax without string literals. public void TestWrongContextForAddition() { TestWrongContext(@"var s = 1 + 2;"); } - [TestCase(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] - [TestCase(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] - [TestCase(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] - [TestCase(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] - [TestCase(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] - [TestCase(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] - [TestCase(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] - [TestCase(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] - [TestCase(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] - [TestCase(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] - [TestCase(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] - [TestCase(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] - [TestCase(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] - [TestCase(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] - [TestCase(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] - [Description("Concatenation with member access to identifiers should be modified to use string.Format()")] + [Theory] + [InlineData(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] + [InlineData(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] + [InlineData(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] + [InlineData(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] + [InlineData(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] + [InlineData(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] + [InlineData(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] + [InlineData(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] + [InlineData(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] + [InlineData(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] + [InlineData(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] + [InlineData(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] + [InlineData(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] + [InlineData(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] + [InlineData(@"string str = ""Hello \x143 "" + a.Foo(""asdf"") + "" world! "" + a.Bar(""jkl;"");")] + // Concatenation with member access to identifiers should be modified to use string.Format() public void TestIdentifiersWithMemberAccess(string expression) { Test( @@ -178,8 +182,8 @@ void TestMethod() } - [Test] - [Description("Concatenation between verbatim strings and expressions is replaced with string.Format()")] + [Fact] + // Concatenation between verbatim strings and expressions is replaced with string.Format() public void TestVerbatimStringConcatenation() { Test( @@ -203,17 +207,18 @@ void TestMethod() }"); } - [TestCase(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] - [TestCase(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] - [TestCase(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] - [TestCase(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] - [TestCase(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] - [TestCase(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] - [TestCase(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] - [TestCase(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] - [TestCase(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] - [TestCase(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] - [TestCase(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] + [Theory] + [InlineData(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] + [InlineData(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] + [InlineData(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] + [InlineData(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] + [InlineData(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] + [InlineData(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] + [InlineData(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] + [InlineData(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] + [InlineData(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] + [InlineData(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] + [InlineData(@"string str = 1 + 2 + ""test"" + 1 + ""test"" + 1.1;")] public void Test(string expression) { Test(@" @@ -233,7 +238,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestVerbatim() { Test(@" @@ -255,7 +260,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestRepeatedObject() { Test(@" @@ -277,7 +282,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestFormatString() { Test(@" @@ -299,7 +304,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestComplexFormatString() { Test(@" @@ -321,7 +326,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestFormatBracesRegular() { Test(@" @@ -344,7 +349,7 @@ void TestMethod () } /* - [Test] + [Fact] public void TestFormatBracesWithFormat() { Test(@" @@ -367,7 +372,7 @@ void TestMethod () } */ - [Test] + [Fact] public void TestUnnecessaryStringFormat() { Test(@" @@ -387,7 +392,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestUnnecessaryToString() { Test(@" @@ -409,7 +414,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void EscapeBraces() { Test(@" @@ -438,7 +443,7 @@ This is far too complicated and likely to cause trouble. Looking at the original UseStringFormatAction, this complication does not seem to be accounted for and would have resulted in escaped sequences being rendered. - [Test] + [Fact] public void QuotesMixedVerbatim() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/UseSystemEnvironmentNewLineTests.cs b/Tests/CSharp/CodeRefactorings/UseSystemEnvironmentNewLineTests.cs index 61b9bc2a..32da5124 100644 --- a/Tests/CSharp/CodeRefactorings/UseSystemEnvironmentNewLineTests.cs +++ b/Tests/CSharp/CodeRefactorings/UseSystemEnvironmentNewLineTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class UseSystemEnvironmentNewLineTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void TestLFString() { Test(@" @@ -26,7 +25,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestCRString() { Test(@" @@ -47,7 +46,7 @@ void TestMethod() } - [Test] + [Fact] public void TestCRLFString() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/UseSystemStringEmptyTests.cs b/Tests/CSharp/CodeRefactorings/UseSystemStringEmptyTests.cs index 83c6bd8d..0405dc81 100644 --- a/Tests/CSharp/CodeRefactorings/UseSystemStringEmptyTests.cs +++ b/Tests/CSharp/CodeRefactorings/UseSystemStringEmptyTests.cs @@ -1,13 +1,12 @@ using System; -using NUnit.Framework; using RefactoringEssentials.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class UseSystemStringEmptyTests : CSharpCodeRefactoringTestBase { - [Test()] + [Fact] public void TestSimpleString() { string result = RunContextAction( @@ -21,7 +20,7 @@ public void TestSimpleString() "}" ); - Assert.AreEqual( + Assert.Equal( "class TestClass" + Environment.NewLine + "{" + Environment.NewLine + " void Test ()" + Environment.NewLine + diff --git a/Tests/CSharp/Diagnostics/AccessToStaticMemberViaDerivedTypeTests.cs b/Tests/CSharp/Diagnostics/AccessToStaticMemberViaDerivedTypeTests.cs index 08a37fde..16ce152a 100644 --- a/Tests/CSharp/Diagnostics/AccessToStaticMemberViaDerivedTypeTests.cs +++ b/Tests/CSharp/Diagnostics/AccessToStaticMemberViaDerivedTypeTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class AccessToStaticMemberViaDerivedTypeTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void MemberInvocation() { Analyze(@" @@ -37,7 +36,7 @@ void Main() ); } - [Test] + [Fact] public void MemberInvocationWithComment() { Analyze(@" @@ -70,7 +69,7 @@ void Main() ); } - [Test] + [Fact] public void TestDisable() { Analyze(@" @@ -89,7 +88,7 @@ void Main() }"); } - [Test] + [Fact] public void PropertyAccess() { Analyze(@" @@ -120,7 +119,7 @@ void Main() ); } - [Test] + [Fact] public void FieldAccess() { Analyze(@"class A @@ -149,7 +148,7 @@ void Main() ); } - [Test] + [Fact] public void NestedClass() { Analyze(@" @@ -186,7 +185,7 @@ void Main() ); } - [Test] + [Fact] public void ExpandsTypeWithNamespaceIfNeccessary() { Analyze(@"namespace First @@ -227,7 +226,7 @@ void Main() ); } - [Test] + [Fact] public void IgnoresCorrectCalls() { Analyze(@" @@ -244,7 +243,7 @@ void Main() }"); } - [Test] + [Fact] public void IgnoresNonStaticCalls() { Analyze(@" @@ -263,7 +262,7 @@ void Main() }"); } - [Test] + [Fact] public void IgnoresOwnMemberFunctions() { Analyze(@" @@ -282,7 +281,7 @@ void Main() }"); } - [Test] + [Fact] public void IgnoresCuriouslyRecurringTemplatePattern() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/AdditionalOfTypeTests.cs b/Tests/CSharp/Diagnostics/AdditionalOfTypeTests.cs index 83b5ad0f..b443a8f7 100644 --- a/Tests/CSharp/Diagnostics/AdditionalOfTypeTests.cs +++ b/Tests/CSharp/Diagnostics/AdditionalOfTypeTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [Ignore("TODO - AST pattern machting!")] - [TestFixture] public class AdditionalOfTypeTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO - AST pattern machting!")] public void TestAdditionalCase() { Analyze(@"using System.Linq; @@ -27,8 +25,8 @@ public void Foo(object[] obj) }"); } - [Test] - public void TestInvalid() + [Fact(Skip = "TODO - AST pattern machting!")] + public void TestInvalid() { Analyze(@"using System.Linq; class Test diff --git a/Tests/CSharp/Diagnostics/ArrayCreationCanBeReplacedWithArrayInitializerTests.cs b/Tests/CSharp/Diagnostics/ArrayCreationCanBeReplacedWithArrayInitializerTests.cs index ff3c03c5..c4421ed8 100644 --- a/Tests/CSharp/Diagnostics/ArrayCreationCanBeReplacedWithArrayInitializerTests.cs +++ b/Tests/CSharp/Diagnostics/ArrayCreationCanBeReplacedWithArrayInitializerTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ArrayCreationCanBeReplacedWithArrayInitializerTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestVariableDeclarationCase1() { Analyze(@" @@ -26,7 +25,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestFieldCase1() { Analyze(@" @@ -41,7 +40,7 @@ class TestClass } - [Test] + [Fact] public void TestVariableDeclarationCase2() { Analyze(@" @@ -61,7 +60,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestFieldCase2() { Analyze(@" @@ -75,7 +74,7 @@ class TestClass }"); } - [Test] + [Fact] public void TestNoProblem1() { Analyze(@" @@ -88,7 +87,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestNoProblem2() { Analyze(@" @@ -101,7 +100,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestNoProblem3() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/AvoidAsyncVoidTests.cs b/Tests/CSharp/Diagnostics/AvoidAsyncVoidTests.cs index 783e9389..3a252454 100644 --- a/Tests/CSharp/Diagnostics/AvoidAsyncVoidTests.cs +++ b/Tests/CSharp/Diagnostics/AvoidAsyncVoidTests.cs @@ -1,13 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; using RefactoringEssentials.CSharp.Diagnostics.Custom; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class AvoidAsyncVoidTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestAsyncMethod() { var input = @" @@ -21,7 +20,7 @@ class TestClass Analyze(input ); } - [Test] + [Fact] public void TestAsyncEventHandlerMethod() { var input = @" @@ -35,7 +34,7 @@ async void TestMethodAsync(object sender, EventArgs e) Analyze(input); } - [Test] + [Fact] public void TestDisable() { var input = @" @@ -50,7 +49,7 @@ async void TestMethodAsync() Analyze(input); } - [Test] + [Fact] public void TestLambda() { var input = @" diff --git a/Tests/CSharp/Diagnostics/BaseMemberHasParamsTests.cs b/Tests/CSharp/Diagnostics/BaseMemberHasParamsTests.cs index 8f773073..b3e5ef1d 100644 --- a/Tests/CSharp/Diagnostics/BaseMemberHasParamsTests.cs +++ b/Tests/CSharp/Diagnostics/BaseMemberHasParamsTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class BaseMemberHasParamsTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestBasicCase() { Analyze(@"class FooBar @@ -38,7 +37,7 @@ public override void Foo(string fmt, params object[] args) }"); } - [Test] + [Fact] public void TestValidCase() { Analyze(@"class FooBar @@ -57,7 +56,7 @@ public override void Foo(string fmt, params object[] args) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"class FooBar diff --git a/Tests/CSharp/Diagnostics/BaseMethodCallWithDefaultParameterTests.cs b/Tests/CSharp/Diagnostics/BaseMethodCallWithDefaultParameterTests.cs index 4dcd6a14..994b66fd 100644 --- a/Tests/CSharp/Diagnostics/BaseMethodCallWithDefaultParameterTests.cs +++ b/Tests/CSharp/Diagnostics/BaseMethodCallWithDefaultParameterTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class BaseMethodCallWithDefaultParameterTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestBasicCase() { Analyze(@" @@ -28,7 +27,7 @@ public override void FooBar(int x = 12) "); } - [Test] + [Fact] public void TestInterfaceCase() { Analyze(@" @@ -53,7 +52,7 @@ public class MyClass : MyBase } - [Test] + [Fact] public void TestDoNotWarnCase() { Analyze(@" @@ -75,7 +74,7 @@ public override void FooBar(int x = 12) "); } - [Test] + [Fact] public void TestDoNotWarnInParamsCase() { Analyze(@" @@ -97,7 +96,7 @@ public override void FooBar(params int[] x) "); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/BaseMethodParameterNameMismatchTests.cs b/Tests/CSharp/Diagnostics/BaseMethodParameterNameMismatchTests.cs index 74f2cd40..e6dbfa06 100644 --- a/Tests/CSharp/Diagnostics/BaseMethodParameterNameMismatchTests.cs +++ b/Tests/CSharp/Diagnostics/BaseMethodParameterNameMismatchTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class BaseMethodParameterNameMismatchTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestMethod() { Analyze(@" @@ -38,7 +37,7 @@ public override void FooBar (int bar) "); } - [Test] + [Fact] public void TestMethodWithXmlDoc() { Analyze(@" @@ -74,7 +73,7 @@ public override void FooBar (int bar) "); } - [Test] + [Fact] public void TestIndexer() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/BitwiseOperatorOnEnumWithoutFlagsTests.cs b/Tests/CSharp/Diagnostics/BitwiseOperatorOnEnumWithoutFlagsTests.cs index 70ba725a..bfc51870 100644 --- a/Tests/CSharp/Diagnostics/BitwiseOperatorOnEnumWithoutFlagsTests.cs +++ b/Tests/CSharp/Diagnostics/BitwiseOperatorOnEnumWithoutFlagsTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class BitwiseOperatorOnEnumWithoutFlagsTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestUnary() { Analyze(@" @@ -23,7 +22,12 @@ void TestMethod () }"); } - public void TestAssignment(string op, bool bitwise = true) + [Theory] + [InlineData("|", true)] + [InlineData("&", true)] + [InlineData("^", true)] + [InlineData("+", false)] + public void TestAssignment(string op, bool bitwise) { if (bitwise) { @@ -58,16 +62,13 @@ void TestMethod () }"); } } - [Test] - public void TestAssignment() - { - TestAssignment("|"); - TestAssignment("&"); - TestAssignment("^"); - TestAssignment("+", false); - } - public void TestBinary(string op, bool bitwise = true) + [Theory] + [InlineData("|", true)] + [InlineData("&", true)] + [InlineData("^", true)] + [InlineData("+", false)] + public void TestBinary(string op, bool bitwise) { if (bitwise) { @@ -101,7 +102,7 @@ void TestMethod () } } - [Test] + [Fact] public void TestDisable() { Analyze(@" @@ -120,14 +121,5 @@ void TestMethod() } "); } - - [Test] - public void TestBinary() - { - TestBinary("&"); - TestBinary("|"); - TestBinary("^"); - TestBinary("+", false); - } } } diff --git a/Tests/CSharp/Diagnostics/CS1573ParameterHasNoMatchingParamTagTests.cs b/Tests/CSharp/Diagnostics/CS1573ParameterHasNoMatchingParamTagTests.cs index a728fa14..b5d1cd84 100644 --- a/Tests/CSharp/Diagnostics/CS1573ParameterHasNoMatchingParamTagTests.cs +++ b/Tests/CSharp/Diagnostics/CS1573ParameterHasNoMatchingParamTagTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class CS1573ParameterHasNoMatchingParamTagTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestMethodMissesParameter() { Test(@" @@ -32,7 +30,7 @@ public void FooBar(int x, int y, int z) "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNoParamDocs() { Analyze(@" @@ -45,7 +43,7 @@ public void FooBar(int x, int y, int z) "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@" @@ -61,7 +59,7 @@ public void FooBar(int x, int y, int z) "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestPragmaDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/CSharpDiagnosticTestBase.cs b/Tests/CSharp/Diagnostics/CSharpDiagnosticTestBase.cs index 43f8fc32..5aa4c3b3 100644 --- a/Tests/CSharp/Diagnostics/CSharpDiagnosticTestBase.cs +++ b/Tests/CSharp/Diagnostics/CSharpDiagnosticTestBase.cs @@ -6,7 +6,7 @@ namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - public class CSharpDiagnosticTestBase : DiagnosticTestBase + public class CSharpDiagnosticTestBase : DiagnosticTestBase { public static CSharpCompilation CreateCompilation( IEnumerable trees, diff --git a/Tests/CSharp/Diagnostics/CallToObjectEqualsViaBaseTests.cs b/Tests/CSharp/Diagnostics/CallToObjectEqualsViaBaseTests.cs index 73422e63..a5af9853 100644 --- a/Tests/CSharp/Diagnostics/CallToObjectEqualsViaBaseTests.cs +++ b/Tests/CSharp/Diagnostics/CallToObjectEqualsViaBaseTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class CallToObjectEqualsViaBaseTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void SimpleCase() { Analyze(@" @@ -26,7 +25,7 @@ class Foo }"); } - [Test] + [Fact] public void NonObjectBase() { Analyze(@" @@ -52,7 +51,7 @@ void Baz () }"); } - [Test] + [Fact] public void IgnoresCallsToOtherObjects() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/CheckNamespaceTests.cs b/Tests/CSharp/Diagnostics/CheckNamespaceTests.cs index 22785a98..3a5b5768 100644 --- a/Tests/CSharp/Diagnostics/CheckNamespaceTests.cs +++ b/Tests/CSharp/Diagnostics/CheckNamespaceTests.cs @@ -1,39 +1,37 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [Ignore("TODO")] - [TestFixture] public class CheckNamespaceTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO")] public void TestWrongNamespace() { TestIssue(@"namespace Foo {}"); } - [Test] + [Fact(Skip="TODO")] public void TestSubstring() { TestIssue(@"namespace TestFoo {}"); } - [Test] + [Fact(Skip="TODO")] public void TestGlobalClass() { TestIssue(@"class Foo {}"); } - [Test] + [Fact(Skip="TODO")] public void CheckValidNamespace() { Analyze(@"namespace Test {}"); } - [Test] + [Fact(Skip="TODO")] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/CompareNonConstrainedGenericWithNullTests.cs b/Tests/CSharp/Diagnostics/CompareNonConstrainedGenericWithNullTests.cs index b148120f..4d5e6fda 100644 --- a/Tests/CSharp/Diagnostics/CompareNonConstrainedGenericWithNullTests.cs +++ b/Tests/CSharp/Diagnostics/CompareNonConstrainedGenericWithNullTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class CompareNonConstrainedGenericWithNullTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestLocal() { Analyze(@"public class Bar @@ -27,7 +26,7 @@ public void Foo (T t) }"*/); } - [Test] + [Fact] public void TestField() { Analyze(@"public class Bar @@ -50,7 +49,7 @@ public void Foo () }"*/); } - [Test] + [Fact] public void TestInvalid() { Analyze(@"public class Bar @@ -63,7 +62,7 @@ public void Foo (T t) where T : class }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"public class Bar diff --git a/Tests/CSharp/Diagnostics/CompareOfFloatsByEqualityOperatorTests.cs b/Tests/CSharp/Diagnostics/CompareOfFloatsByEqualityOperatorTests.cs index 058c93a7..fb2b928c 100644 --- a/Tests/CSharp/Diagnostics/CompareOfFloatsByEqualityOperatorTests.cs +++ b/Tests/CSharp/Diagnostics/CompareOfFloatsByEqualityOperatorTests.cs @@ -1,9 +1,8 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class CompareOfFloatsByEqualityOperatorTests : CSharpDiagnosticTestBase { static void TestOperator(string inputOp, string outputOp) @@ -29,19 +28,19 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestEquality() { TestOperator("==", "<"); } - [Test] + [Fact] public void TestInequality() { TestOperator("!=", ">"); } - [Test] + [Fact] public void TestZero() { Analyze(@" @@ -67,7 +66,7 @@ void TestMethod (double x, float y) }"); } - [Test] + [Fact] public void TestNaN() { Analyze(@" @@ -94,7 +93,7 @@ void TestMethod (double x, float y) } - [Test] + [Fact] public void TestPositiveInfinity() { Analyze(@" @@ -120,7 +119,7 @@ void TestMethod (double x, float y) }"); } - [Test] + [Fact] public void TestNegativeInfinity() { Analyze(@" @@ -146,7 +145,7 @@ void TestMethod (double x, float y) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/ConditionIsAlwaysTrueOrFalseTests.cs b/Tests/CSharp/Diagnostics/ConditionIsAlwaysTrueOrFalseTests.cs index f15adf95..0d09d9a6 100644 --- a/Tests/CSharp/Diagnostics/ConditionIsAlwaysTrueOrFalseTests.cs +++ b/Tests/CSharp/Diagnostics/ConditionIsAlwaysTrueOrFalseTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ConditionIsAlwaysTrueOrFalseTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestComparsionWithNull() { Analyze(@" @@ -31,7 +30,7 @@ void Foo(int i) } - [Test] + [Fact] public void TestComparsionWithNullCase2() { Analyze(@" @@ -57,7 +56,7 @@ void Foo(Bar i) "); } - [Test] + [Fact] public void TestComparisonArgumentWithNull() { Analyze(@" @@ -87,7 +86,7 @@ void Foo(int i) "); } - [Test] + [Fact] public void TestComparison() { Analyze(@" @@ -111,7 +110,7 @@ void Foo(int i) "); } - [Test] + [Fact] public void TestUnary() { Analyze(@" @@ -136,7 +135,7 @@ void Foo(int i) } - [Test] + [Fact] public void TestDisable() { Analyze(@" @@ -153,7 +152,7 @@ void Foo(int i) } - [Test] + [Fact] public void CompareWithNullable() { Analyze(@" @@ -169,7 +168,7 @@ public void Test(int? a) "); } - [Test] + [Fact] public void UserDefinedOperatorsNoReferences() { Analyze(@" @@ -198,7 +197,7 @@ public void Test(Foo a) "); } - [Test] + [Fact] public void UserDefinedOperators() { Analyze(@" @@ -231,7 +230,7 @@ public void Test(Foo a) /// /// Bug 15099 - Wrong always true context /// - [Test] + [Fact] public void TestBug15099() { Analyze(@" @@ -274,7 +273,7 @@ public static void Main (string[] args) /// /// Bug 36336 - Invalid Source Analysis on Pointer types /// - [Test] + [Fact] public void TestBug36336() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/ConditionalTernaryEqualBranchTests.cs b/Tests/CSharp/Diagnostics/ConditionalTernaryEqualBranchTests.cs index a0728c44..413fbe51 100644 --- a/Tests/CSharp/Diagnostics/ConditionalTernaryEqualBranchTests.cs +++ b/Tests/CSharp/Diagnostics/ConditionalTernaryEqualBranchTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ConditionalTernaryEqualBranchTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestInspectorCase1() { Analyze(@"class Foo @@ -25,7 +24,7 @@ void Bar (string str) } - [Test] + [Fact] public void TestMoreComplexBranch() { Analyze(@"class Foo @@ -44,7 +43,7 @@ void Bar (string str) } - [Test] + [Fact] public void TestNotEqualBranches() { Analyze(@"class Foo @@ -57,7 +56,7 @@ void Bar (string str) } - [Test] + [Fact] public void TestNotEqualBranchesWithLambdas() { Analyze(@"class Foo @@ -71,8 +70,7 @@ void Bar (string str) } - [Test] - [Ignore("Won't work with Roslyn < 1.1 due to a bug with equivalence checking of interpolated strings. Activate with Roslyn 1.1.")] + [Fact(Skip="Won't work with Roslyn < 1.1 due to a bug with equivalence checking of interpolated strings. Activate with Roslyn 1.1.")] public void TestNotEqualBranchesWithInterpolatedStrings() { Analyze(@"class Foo @@ -85,7 +83,7 @@ void Bar (string str) } - [Test] + [Fact] public void TestDisable() { Analyze(@"class Foo @@ -99,7 +97,7 @@ void Bar (string str) } - [Test] + [Fact] public void Test() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/ConstantConditionTests.cs b/Tests/CSharp/Diagnostics/ConstantConditionTests.cs index 13ae171e..a684af6e 100644 --- a/Tests/CSharp/Diagnostics/ConstantConditionTests.cs +++ b/Tests/CSharp/Diagnostics/ConstantConditionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ConstantConditionTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestConditionalExpression() { Analyze(@" @@ -28,7 +27,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestIf() { Analyze(@" @@ -68,7 +67,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestFor() { Analyze(@" @@ -88,7 +87,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestWhile() { Analyze(@" @@ -110,7 +109,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestDoWhile() { Analyze(@" @@ -132,7 +131,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestNoIssue() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/ConstantNullCoalescingConditionTests.cs b/Tests/CSharp/Diagnostics/ConstantNullCoalescingConditionTests.cs index 30c1b6b3..6f520fb0 100644 --- a/Tests/CSharp/Diagnostics/ConstantNullCoalescingConditionTests.cs +++ b/Tests/CSharp/Diagnostics/ConstantNullCoalescingConditionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ConstantNullCoalescingConditionTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestNullRightSide() { Analyze(@" @@ -26,7 +25,7 @@ void Foo() }"); } - [Test] + [Fact] public void TestNullLeftSide() { Analyze(@" @@ -46,7 +45,7 @@ void Foo() }"); } - [Test] + [Fact] public void TestEqualExpressions() { Analyze(@" @@ -66,7 +65,7 @@ void Foo() }"); } - [Test] + [Fact] public void TestSmartUsage() { //Previously, this was a "TestWrongContext". @@ -89,7 +88,7 @@ void Foo() }"); } - [Test] + [Fact] public void TestSmartUsageInParam() { Analyze(@" @@ -102,7 +101,7 @@ void Foo(object o) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@" @@ -117,7 +116,7 @@ void Foo() } // "RECS0098: Remove redundant right side" reports incorrectly when left side is an equation - [Test] + [Fact] public void TestIssue172() { Analyze(@" @@ -132,7 +131,7 @@ void Foo() }"); } - [Test] + [Fact] public void TestNullableCreationOnLeftSide() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/ConvertClosureToMethodGroupTests.cs b/Tests/CSharp/Diagnostics/ConvertClosureToMethodGroupTests.cs index ced0c9d3..8551e576 100644 --- a/Tests/CSharp/Diagnostics/ConvertClosureToMethodGroupTests.cs +++ b/Tests/CSharp/Diagnostics/ConvertClosureToMethodGroupTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ConvertClosureToMethodGroupTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSimpleVoidLambda() { Analyze(@"using System; @@ -28,7 +27,7 @@ void MyMethod(int foo, int bar) {} }"); } - [Test] + [Fact] public void TestSimpleBoolLambda() { Analyze(@"using System; @@ -50,7 +49,7 @@ bool MyMethod(int foo, int bar) {} }"); } - [Test] + [Fact] public void TestLambdaWithBody() { Analyze(@"using System; @@ -72,7 +71,7 @@ void MyMethod(int foo, int bar) {} }"); } - [Test] + [Fact] public void Lambda_SwapParameterOrder() { Analyze(@"using System; @@ -86,7 +85,7 @@ void MyMethod(int foo, int bar) {} }"); } - [Test] + [Fact] public void TestSimpleAnonymousMethod() { Analyze(@"using System; @@ -110,7 +109,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestSkipComplexCase() { Analyze(@"using System; @@ -127,7 +126,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void CallInvolvesOptionalParameter() { Analyze(@"using System; @@ -142,7 +141,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void CallExpandsParams() { Analyze(@"using System; @@ -157,7 +156,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void CallAsUnambiguousMethodParameter1() { Analyze(@"using System; @@ -191,7 +190,7 @@ void SomeMethod(Func action) { } }"); } - [Test] + [Fact] public void CallAsAmbiguousMethodParameter() { Analyze(@"using System; @@ -212,7 +211,7 @@ void SomeMethod(Func action) { } }"); } - [Test] + [Fact] public void CallAsUnambiguousMethodParameter2() { Analyze(@"using System; @@ -249,7 +248,7 @@ void SomeMethod(Action action) { } /// /// Bug 12184 - Expression can be reduced to delegate fix can create ambiguity /// - [Test] + [Fact] public void TestBug12184() { Analyze(@"using System; @@ -279,7 +278,7 @@ public static void Foo () } - [Test] + [Fact] public void Return_ReferenceConversion() { Analyze(@"using System; @@ -293,7 +292,7 @@ string MyMethod(int foo) {} }"); } - [Test] + [Fact] public void Return_BoxingConversion() { Analyze(@"using System; @@ -307,7 +306,7 @@ bool MyMethod(int foo) {} }"); } - [Test] + [Fact] public void Parameter_ReferenceConversion() { Analyze(@"using System; @@ -321,7 +320,7 @@ void MyMethod(object foo) {} }"); } - [Test] + [Fact] public void Parameter_BoxingConversion() { Analyze(@"using System; @@ -338,7 +337,7 @@ void MyMethod(object foo) {} /// /// Bug 14759 - Lambda expression can be simplified to method group issue /// - [Test] + [Fact] public void TestBug14759() { Analyze(@"using System; @@ -361,7 +360,7 @@ public static void Main(string[] args) }"); } - [Test] + [Fact] public void TestTargetCollision() { Analyze(@" @@ -382,7 +381,7 @@ void Test () /// /// Bug 15868 - Wrong context for Anonymous method can be simplified to method group /// - [Test] + [Fact] public void TestBug15868() { Analyze(@" @@ -402,7 +401,7 @@ public static void Main () "); } - [Test] + [Fact] public void TestBug15868Case2() { Analyze(@" @@ -436,7 +435,7 @@ public static void Main () "); } - [Test] + [Fact] public void TestSimpleVoidLambdaConditional() { Analyze(@"using System; diff --git a/Tests/CSharp/Diagnostics/ConvertConditionalTernaryToNullCoalescingTests.cs b/Tests/CSharp/Diagnostics/ConvertConditionalTernaryToNullCoalescingTests.cs index 23e05739..69358def 100644 --- a/Tests/CSharp/Diagnostics/ConvertConditionalTernaryToNullCoalescingTests.cs +++ b/Tests/CSharp/Diagnostics/ConvertConditionalTernaryToNullCoalescingTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ConvertConditionalTernaryToNullCoalescingTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestInspectorCase1() { Analyze(@"class Foo @@ -25,7 +24,7 @@ void Bar (string str) } - [Test] + [Fact] public void TestInspectorCase2() { Analyze(@"class Foo @@ -43,7 +42,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorCase3() { Analyze(@"class Foo @@ -61,7 +60,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorCase4() { Analyze(@"class Foo @@ -79,7 +78,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"class Foo @@ -92,7 +91,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestCastCase() { Analyze(@"class Foo @@ -110,7 +109,7 @@ void Bar (Foo o, Bar b) }"); } - [Test] + [Fact] public void TestCastCase2() { Analyze(@"class Foo @@ -128,7 +127,7 @@ void Bar (Foo o, Bar b) }"); } - [Test] + [Fact] public void TestGenericCastCase() { Analyze(@"class Foo @@ -140,7 +139,7 @@ void Bar(object o, T b) }"); } - [Test] + [Fact] public void TestGenericCastCaseWithRefTypeConstraint() { Analyze(@"class Foo @@ -158,7 +157,7 @@ void Bar(object o, T b) where T : class }"); } - [Test] + [Fact] public void TestGenericCastCaseAsNullable() { Analyze(@"class Foo @@ -176,7 +175,7 @@ void Bar(object o, T b) }"); } - [Test] + [Fact] public void TestNullableValueCase() { Analyze(@"class Test @@ -196,7 +195,7 @@ void TestCase() }"); } - [Test] + [Fact] public void TestNestedExpressions() { Analyze(@"class Test diff --git a/Tests/CSharp/Diagnostics/ConvertIfDoToWhileTests.cs b/Tests/CSharp/Diagnostics/ConvertIfDoToWhileTests.cs index 6bdaa8bf..64792e73 100644 --- a/Tests/CSharp/Diagnostics/ConvertIfDoToWhileTests.cs +++ b/Tests/CSharp/Diagnostics/ConvertIfDoToWhileTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ConvertIfDoToWhileTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestBasicCase() { Analyze(@"class FooBar @@ -33,7 +32,7 @@ public void FooFoo(int x) }"); } - [Test] + [Fact] public void TestWithoutBlocks() { Analyze(@"class FooBar @@ -55,7 +54,7 @@ public void FooFoo(int x) }"); } - [Test] + [Fact] public void TestInvalidCase() { Analyze(@"class FooBar @@ -71,7 +70,7 @@ public void FooFoo (int x) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"class FooBar diff --git a/Tests/CSharp/Diagnostics/ConvertIfStatementToSwitchStatementTests.cs b/Tests/CSharp/Diagnostics/ConvertIfStatementToSwitchStatementTests.cs index 71c36128..35b226ce 100644 --- a/Tests/CSharp/Diagnostics/ConvertIfStatementToSwitchStatementTests.cs +++ b/Tests/CSharp/Diagnostics/ConvertIfStatementToSwitchStatementTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ConvertIfStatementToSwitchStatementTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestBreak() { Analyze(@" @@ -28,7 +27,7 @@ void TestMethod (int a) }"); } - [Test] + [Fact] public void TestReturn() { Analyze(@" @@ -50,7 +49,7 @@ int TestMethod (int a) }"); } - [Test] + [Fact] public void TestConstantExpression() { Analyze(@" @@ -91,7 +90,7 @@ int TestMethod (int a) }"); } - [Test] + [Fact] public void TestNestedOr() { Analyze(@" @@ -112,7 +111,7 @@ int TestMethod (int a) }"); } - [Test] + [Fact] public void TestComplexSwitchExpression() { Analyze(@" @@ -133,7 +132,7 @@ int TestMethod (int a, int b) }"); } - [Test] + [Fact] public void TestNonConstantExpression() { Analyze(@" @@ -189,7 +188,7 @@ void TestMethod (int a, int c) }"); } - [Test] + [Fact] public void TestNonEqualityComparison() { Analyze(@" @@ -211,7 +210,7 @@ void TestMethod (int a) }"); } - [Test] + [Fact] public void TestValidType() { // enum @@ -270,7 +269,7 @@ int TestMethod (" + type + @" a) }"); } - [Test] + [Fact] public void TestInvalidType() { Analyze(@" @@ -288,7 +287,7 @@ void TestMethod (double a) }"); } - [Test] + [Fact] public void TestNoElse() { Analyze(@" @@ -308,7 +307,7 @@ void TestMethod (int a) }"); } - [Test] + [Fact] public void TestNestedIf() { Analyze(@" @@ -330,7 +329,7 @@ void TestMethod (int a) } - [Test] + [Fact] public void TestτooSimpleCase1() { Analyze(@" @@ -347,7 +346,7 @@ void TestMethod (int a) } }"); } - [Test] + [Fact] public void TestτooSimpleCase2() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/ConvertIfToAndExpressionTests.cs b/Tests/CSharp/Diagnostics/ConvertIfToAndExpressionTests.cs index 2a6c350b..e9a1f3e2 100644 --- a/Tests/CSharp/Diagnostics/ConvertIfToAndExpressionTests.cs +++ b/Tests/CSharp/Diagnostics/ConvertIfToAndExpressionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ConvertIfToAndExpressionTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestVariableDeclarationCase() { Analyze(@"class Foo @@ -26,7 +25,7 @@ int Bar(int o) }"); } - [Test] + [Fact] public void TestVariableDeclarationCaseAndComment() { Analyze(@"class Foo @@ -48,7 +47,7 @@ int Bar(int o) }"); } - [Test] + [Fact] public void TestVariableDeclarationCaseWithBlock() { Analyze(@"class Foo @@ -70,7 +69,7 @@ int Bar(int o) }"); } - [Test] + [Fact] public void TestComplexVariableDeclarationCase() { Analyze(@"class Foo @@ -90,7 +89,7 @@ int Bar(int o) }"); } - [Test] + [Fact] public void TestConversionBug() { Analyze(@"class Foo @@ -109,7 +108,7 @@ public override void VisitComposedType (ComposedType composedType) }"); } - [Test] + [Fact] public void TestCommonCase() { Analyze(@"class Foo @@ -132,7 +131,7 @@ int Bar(int o) }"); } - [Test] + [Fact] public void TestCommonCaseWithComment() { Analyze(@"class Foo @@ -157,7 +156,7 @@ int Bar(int o) }"); } - [Test] + [Fact] public void TestCommonCaseWithBlock() { Analyze(@"class Foo @@ -182,7 +181,7 @@ int Bar(int o) }"); } - [Test] + [Fact] public void TestCommonCaseWithElse() { Analyze(@"class Foo @@ -203,7 +202,7 @@ int Bar(int o) }"); } - [Test] + [Fact] public void TestNullCheckBug() { Analyze(@"class Foo @@ -218,7 +217,7 @@ int Bar(Foo fileChangeWatcher) }"); } - [Test] + [Fact] public void TestComplexAssignmentCase() { Analyze(@"class Foo @@ -234,7 +233,7 @@ int Bar(bool foo) }"); } - [Test] + [Fact] public void TestComplexMemberAssignment() { Analyze(@"class Item diff --git a/Tests/CSharp/Diagnostics/ConvertIfToOrExpressionTests.cs b/Tests/CSharp/Diagnostics/ConvertIfToOrExpressionTests.cs index ee4b88ed..79ac192c 100644 --- a/Tests/CSharp/Diagnostics/ConvertIfToOrExpressionTests.cs +++ b/Tests/CSharp/Diagnostics/ConvertIfToOrExpressionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ConvertIfToOrExpressionTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestVariableDeclarationCase() { Analyze(@"class Foo @@ -26,7 +25,7 @@ int Bar(int o) }"); } - [Test] + [Fact] public void TestVariableDeclarationCaseWithComment() { Analyze(@"class Foo @@ -48,7 +47,7 @@ int Bar(int o) }"); } - [Test] + [Fact] public void TestVariableDeclarationCaseBlock() { Analyze(@"class Foo @@ -70,7 +69,7 @@ int Bar(int o) }"); } - [Test] + [Fact] public void TestCommonCase() { Analyze(@"class Foo @@ -93,7 +92,7 @@ int Bar(int o) }"); } - [Test] + [Fact] public void TestCommonCaseWithComment() { Analyze(@"class Foo @@ -118,7 +117,7 @@ int Bar(int o) }"); } - [Test] + [Fact] public void TestCommonCaseBlock() { Analyze(@"class Foo @@ -143,7 +142,7 @@ int Bar(int o) }"); } - [Test] + [Fact] public void TestCommonCaseWithElse() { Analyze(@"class Foo @@ -164,7 +163,7 @@ int Bar(int o) }"); } - [Test] + [Fact] public void TestCommonCaseWithMemberAssignment() { Analyze(@"class Foo @@ -189,7 +188,7 @@ int Bar(int o) }"); } - [Test] + [Fact] public void TestConversionBug() { Analyze(@"class Foo @@ -208,7 +207,7 @@ public override void VisitComposedType (ComposedType composedType) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"class Foo @@ -223,7 +222,7 @@ int Bar(int o) }"); } - [Test] + [Fact] public void TestNullCheckBug() { Analyze(@"class Foo @@ -238,7 +237,7 @@ int Bar(Foo fileChangeWatcher) }"); } - [Test] + [Fact] public void TestNullCheckBug2() { Analyze(@"class Foo @@ -258,7 +257,7 @@ int Bar(Foo fileChangeWatcher) }"); } - [Test] + [Fact] public void TestComplexAssignmentCase() { Analyze(@"class Foo @@ -274,7 +273,7 @@ int Bar(bool foo) }"); } - [Test] + [Fact] public void TestComplexMemberAssignment() { Analyze(@"class Item diff --git a/Tests/CSharp/Diagnostics/ConvertNullableToShortFormTests.cs b/Tests/CSharp/Diagnostics/ConvertNullableToShortFormTests.cs index 393c7cf7..c79f2a76 100644 --- a/Tests/CSharp/Diagnostics/ConvertNullableToShortFormTests.cs +++ b/Tests/CSharp/Diagnostics/ConvertNullableToShortFormTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ConvertNullableToShortFormTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSimpleCase() { Analyze(@"using System; @@ -28,7 +27,7 @@ class Foo }"); } - [Test] + [Fact] public void TestSimpleCaseWithXmlDoc() { Analyze(@"using System; @@ -56,7 +55,7 @@ class Foo }"); } - [Test] + [Fact] public void TestFullyQualifiedNameCase() { Analyze(@"class Foo @@ -75,7 +74,7 @@ void Bar() } - [Test] + [Fact] public void TestAlreadyShort() { Analyze(@"class Foo @@ -87,7 +86,7 @@ public void TestAlreadyShort() }"); } - [Test] + [Fact] public void TestInvalid() { Analyze(@"using System; @@ -103,7 +102,7 @@ void Bar() }"); } - [Test] + [Fact] public void TestInvalidTypeOf() { Analyze(@"using System; @@ -121,7 +120,7 @@ bool Bar2(object o) "); } - [Test] + [Fact] public void TestDisable() { Analyze(@"class Foo diff --git a/Tests/CSharp/Diagnostics/ConvertToAutoPropertyTests.cs b/Tests/CSharp/Diagnostics/ConvertToAutoPropertyTests.cs index 8b0b83b2..c06f7be4 100644 --- a/Tests/CSharp/Diagnostics/ConvertToAutoPropertyTests.cs +++ b/Tests/CSharp/Diagnostics/ConvertToAutoPropertyTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class ConvertToAutoPropertyTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBasicCase() { Analyze(@" @@ -22,7 +20,7 @@ public int $Foo$ { "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestThisSyntaxCase() { Analyze(@" @@ -37,7 +35,7 @@ public int $Foo$ { "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@" @@ -55,7 +53,7 @@ public int Foo { } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestArrayBug() { Analyze(@" @@ -77,7 +75,7 @@ public int Foo { /// /// Bug 16108 - Convert to autoproperty issues /// - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBug16108Case1() { Analyze(@" @@ -96,7 +94,7 @@ int A { /// /// Bug 16108 - Convert to autoproperty issues /// - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBug16108Case2() { Analyze(@" @@ -115,7 +113,7 @@ int A { /// /// Bug 16448 - Refactor incorrectly suggesting "Convert to Auto Property" on property containing custom logic /// - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBug16448() { Analyze(@" @@ -140,7 +138,7 @@ public int BPM /// /// Bug 17107 - Source Analysis ignores volatile keyword /// - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBug17107() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/ConvertToConstantTests.cs b/Tests/CSharp/Diagnostics/ConvertToConstantTests.cs index c30731f4..b618d52b 100644 --- a/Tests/CSharp/Diagnostics/ConvertToConstantTests.cs +++ b/Tests/CSharp/Diagnostics/ConvertToConstantTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class ConvertToConstantTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBasicCase() { Test(@"class Test @@ -28,7 +26,7 @@ public static void Main (string[] args) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestWrongLocalType() { Analyze(@"class Test @@ -40,7 +38,7 @@ public static void Main (string[] args) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestChangingVariableCase1() { Analyze(@"class Test @@ -53,7 +51,7 @@ public static void Main (string[] args) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestChangingVariableCase2() { Analyze(@"class Test @@ -66,7 +64,7 @@ public static void Main (string[] args) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestChangingVariableCase3() { Analyze(@"class Test @@ -81,7 +79,7 @@ public static void Main (string[] args) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestChangingVariableCase4() { Analyze(@"class Test @@ -100,7 +98,7 @@ public static void Main (string[] args) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestChangingVariableCase5() { Analyze(@"class Test @@ -115,7 +113,7 @@ public static void Main (string[] args) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestChangingVariableCase6() { Analyze(@"class Test @@ -129,7 +127,7 @@ public static void Main (string[] args) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@"class Test @@ -143,7 +141,7 @@ public static void Main (string[] args) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestField() { Test(@"class Test @@ -163,7 +161,7 @@ public static void Main (string[] args) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestReadonlyField() { Analyze(@"class Test @@ -177,7 +175,7 @@ public static void Main (string[] args) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestStaticField() { Test(@"class Test @@ -198,7 +196,7 @@ public static void Main (string[] args) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestChangingField() { Analyze(@"class Test @@ -216,7 +214,7 @@ public static void Main (string[] args) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestWrongFieldType() { Analyze(@"class Test @@ -229,7 +227,7 @@ public static void Main (string[] args) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestChangingFieldCase2() { Analyze(@"class Test @@ -242,7 +240,7 @@ public Test () }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestChangingFieldCase3() { Analyze(@"class Test @@ -255,7 +253,7 @@ public Test () }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestShadowedField() { Test(@"class Test @@ -287,7 +285,7 @@ public void Bar () }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestShadowedFieldCase2() { Test(@"class Test @@ -321,7 +319,7 @@ public void Bar () }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNeverSuggestForControlVariable() { Analyze(@"class Test @@ -336,7 +334,7 @@ public static void Main (string[] args) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestVarCase() { Test(@"class Test @@ -357,7 +355,7 @@ public static void Main (string[] args) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestArbitraryStructCase() { Analyze(@" @@ -375,7 +373,7 @@ public static void Main (string[] args) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestArbitraryStructCase2() { Analyze(@" @@ -394,7 +392,7 @@ public static void Main (string[] args) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestComplexCase() { Test(@" diff --git a/Tests/CSharp/Diagnostics/ConvertToLambdaExpressionTests.cs b/Tests/CSharp/Diagnostics/ConvertToLambdaExpressionTests.cs index d84ef332..02141ae3 100644 --- a/Tests/CSharp/Diagnostics/ConvertToLambdaExpressionTests.cs +++ b/Tests/CSharp/Diagnostics/ConvertToLambdaExpressionTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class ConvertToLambdaExpressionTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestReturn() { Test(@" @@ -29,7 +27,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestExpressionStatement() { Test(@" @@ -51,7 +49,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@" @@ -68,7 +66,7 @@ void TestMethod () } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAssignmentExpression() { Analyze(@" @@ -91,7 +89,7 @@ void Foo () /// /// Bug 14840 - Incorrect "can be converted to expression" suggestion /// - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBug14840() { Analyze(@"using System; @@ -110,7 +108,7 @@ void Test () }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAnonymousMethod() { Test(@" @@ -133,7 +131,7 @@ void TestMethod () } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAnonymousFunction() { Test(@" @@ -155,7 +153,7 @@ void TestMethod () }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAnonymousMethodWithoutParameterList() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/ConvertToStaticTypeTests.cs b/Tests/CSharp/Diagnostics/ConvertToStaticTypeTests.cs index fe6e8d33..bd300f6b 100644 --- a/Tests/CSharp/Diagnostics/ConvertToStaticTypeTests.cs +++ b/Tests/CSharp/Diagnostics/ConvertToStaticTypeTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ConvertToStaticTypeTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestInspectorCase1() { Analyze(@" @@ -38,7 +37,7 @@ static public int ReturnAPlusOne() }"); } - [Test] + [Fact] public void TestInspectorCase1WithXmlDoc() { Analyze(@" @@ -76,7 +75,7 @@ static public int ReturnAPlusOne() }"); } - [Test] + [Fact] public void TestInspectorCase2() { Analyze(@" @@ -96,7 +95,7 @@ static public int ReturnAPlusOne() }"); } - [Test] + [Fact] public void TestInspectorCase3() { Analyze(@" @@ -116,7 +115,7 @@ static public int ReturnAPlusOne() "); } - [Test] + [Fact] public void TestInspectorCase4() { Analyze(@" @@ -138,7 +137,7 @@ static public int ReturnAPlusOne() } - [Test] + [Fact] public void TestEntryPoint() { Analyze(@" @@ -158,7 +157,7 @@ public static int Main() "); } - [Test] + [Fact] public void TestAbstract() { Analyze(@" @@ -178,7 +177,7 @@ public static int Main() } - [Test] + [Fact] public void TestResharperDisable() { Analyze(@"using System; @@ -203,7 +202,7 @@ static public int ReturnAPlusOne() /// /// Bug 16844 - Convert class to static /// - [Test] + [Fact] public void TestBug16844() { Analyze(@" @@ -220,7 +219,7 @@ class OtherNotStatic "); } - [Test] + [Fact] public void TestEmptyPublicClass() { Analyze(@" @@ -230,7 +229,7 @@ public class ShouldNotBeStatic "); } - [Test] + [Fact] public void TestClassImplementingAnotherType() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/DelegateSubtractionTests.cs b/Tests/CSharp/Diagnostics/DelegateSubtractionTests.cs index d2b58997..33150894 100644 --- a/Tests/CSharp/Diagnostics/DelegateSubtractionTests.cs +++ b/Tests/CSharp/Diagnostics/DelegateSubtractionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class DelegateSubtractionTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSubtraction() { Analyze(@" @@ -21,7 +20,7 @@ void Bar (Action a, Action b) "); } - [Test] + [Fact] public void TestAssignmentSubtraction() { Analyze(@" @@ -36,7 +35,7 @@ void Bar (Action a, Action b) "); } - [Test] + [Fact] public void TestDisable() { Analyze(@" @@ -55,7 +54,7 @@ void Bar (Action a, Action b) /// /// Bug 18061 - Incorrect "delegate subtraction has unpredictable result" warning /// - [Test] + [Fact] public void TestBug18061() { Analyze(@" @@ -72,7 +71,7 @@ void Bar (EventHandler bar) "); } - [Test] + [Fact] public void TestDoNotShowOnResolveError() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/DoNotCallOverridableMethodsInConstructorTests.cs b/Tests/CSharp/Diagnostics/DoNotCallOverridableMethodsInConstructorTests.cs index c692e0ba..c65ebc1c 100644 --- a/Tests/CSharp/Diagnostics/DoNotCallOverridableMethodsInConstructorTests.cs +++ b/Tests/CSharp/Diagnostics/DoNotCallOverridableMethodsInConstructorTests.cs @@ -1,13 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class DoNotCallOverridableMethodsInConstructorTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void CatchesBadCase() { Analyze(@"class Foo @@ -24,7 +23,7 @@ virtual void Bar () }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"class Foo @@ -43,7 +42,7 @@ virtual void Bar () - [Test] + [Fact] public void IgnoresGoodCase() { Analyze(@"class Foo @@ -60,7 +59,7 @@ void Bar () }"); } - [Test] + [Fact] public void IgnoresSealedClasses() { Analyze(@"sealed class Foo @@ -77,7 +76,7 @@ virtual void Bar () }"); } - [Test] + [Fact] public void IgnoresOverriddenSealedMethods() { Analyze(@" @@ -102,7 +101,7 @@ protected override sealed void Bar () }"); } - [Test] + [Fact] public void IgnoresNonLocalCalls() { Analyze(@"class Foo @@ -119,7 +118,7 @@ virtual void Bar () }"); } - [Test] + [Fact] public void IgnoresEventHandlers() { Analyze(@"class Foo @@ -135,7 +134,7 @@ virtual void Bar () }"); } - [Test] + [Fact] public void IgnoresDelegates1() { Analyze(@" @@ -155,7 +154,7 @@ virtual void Bar() }"); } - [Test] + [Fact] public void IgnoresDelegates2() { Analyze(@" @@ -181,7 +180,7 @@ virtual void Bar() /// /// Bug 14450 - False positive of "Virtual member call in constructor" /// - [Test] + [Fact] public void TestBug14450() { Analyze(@" @@ -195,7 +194,7 @@ public Test(Action action) { "); } - [Test] + [Fact] public void SetVirtualPropertyThroughThis() { Analyze(@"class Foo @@ -209,7 +208,7 @@ public void SetVirtualPropertyThroughThis() }"); } - [Test] + [Fact] public void SetVirtualProperty() { Analyze(@"class Foo @@ -223,7 +222,7 @@ public void SetVirtualProperty() }"); } - [Test] + [Fact] public void GetVirtualPropertyThroughThis() { Analyze(@"class Foo @@ -237,7 +236,7 @@ public void GetVirtualPropertyThroughThis() }"); } - [Test] + [Fact] public void GetVirtualProperty() { Analyze(@"class Foo @@ -251,7 +250,7 @@ public void GetVirtualProperty() }"); } - [Test] + [Fact] public void GetVirtualPropertyWithPrivateSetter() { Analyze(@"class Foo @@ -265,7 +264,7 @@ public void GetVirtualPropertyWithPrivateSetter() }"); } - [Test] + [Fact] public void SetVirtualPropertyWithPrivateSetter() { Analyze(@"class Foo @@ -279,7 +278,7 @@ public void SetVirtualPropertyWithPrivateSetter() }"); } - [Test] + [Fact] public void SetVirtualPropertyWithPrivateSetterThroughThis() { Analyze(@"class Foo @@ -296,7 +295,7 @@ public void SetVirtualPropertyWithPrivateSetterThroughThis() /// /// Bug 39180 - "Virtual member call in constructor" when no call is made /// - [Test] + [Fact] public void TestBug39180() { Analyze(@" class Test { @@ -307,7 +306,7 @@ public Test (ITest test) { }"); } - [Test] + [Fact] public void TestBug39180_Case2() { Analyze(@" class Test { diff --git a/Tests/CSharp/Diagnostics/DoubleNegationOperatorTests.cs b/Tests/CSharp/Diagnostics/DoubleNegationOperatorTests.cs index 0c904fa3..6fd22854 100644 --- a/Tests/CSharp/Diagnostics/DoubleNegationOperatorTests.cs +++ b/Tests/CSharp/Diagnostics/DoubleNegationOperatorTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class DoubleNegationOperatorTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestLogicalNot() { Analyze(@" @@ -32,7 +31,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestBitwiseNot() { Analyze(@" @@ -52,7 +51,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/EmptyConstructorTests.cs b/Tests/CSharp/Diagnostics/EmptyConstructorTests.cs index a56fd7d0..6e585598 100644 --- a/Tests/CSharp/Diagnostics/EmptyConstructorTests.cs +++ b/Tests/CSharp/Diagnostics/EmptyConstructorTests.cs @@ -1,24 +1,23 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class EmptyConstructorTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestInspectorCase1() { Analyze(@"using System;class Test {private int member; $public Test(){}$}", @"using System;class Test {private int member; }"); } - [Test] + [Fact] public void TestInspectorCase2() { Analyze(@"using System;class Test {private int member;$public Test(){}$ static Test(){}}", @"using System;class Test {private int member;static Test(){}}"); } - [Test] + [Fact] public void TestResharperDisable() { Analyze(@"using System; @@ -29,19 +28,19 @@ public Test(){ }"); } - [Test] + [Fact] public void TestNegateCase1() { Analyze(@"using System;class Test {public Test(){Foo();}}"); } - [Test] + [Fact] public void TestNegateCase2() { Analyze(@"using System;class Test {public Test(){Bar();} private Test(){}}"); } - [Test] + [Fact] public void TestNegateCase3() { Analyze(@"using System;class Test {public Test() : base(4) {}}"); diff --git a/Tests/CSharp/Diagnostics/EmptyDestructorTests.cs b/Tests/CSharp/Diagnostics/EmptyDestructorTests.cs index 83f3559d..740254fe 100644 --- a/Tests/CSharp/Diagnostics/EmptyDestructorTests.cs +++ b/Tests/CSharp/Diagnostics/EmptyDestructorTests.cs @@ -1,11 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - public class EmptyDestructorTests : CSharpDiagnosticTestBase + public class EmptyDestructorTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestBasicCase() { Analyze(@" @@ -20,7 +20,7 @@ class Foo }"); } - [Test] + [Fact] public void TestCaseWithNesting() { Analyze(@" @@ -38,7 +38,7 @@ class Foo }"); } - [Test] + [Fact] public void TestDisabledForNonEmpty() { Analyze(@" @@ -51,7 +51,7 @@ class Foo }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/EmptyEmbeddedStatementTests.cs b/Tests/CSharp/Diagnostics/EmptyEmbeddedStatementTests.cs index a89aff48..e3cfc8d0 100644 --- a/Tests/CSharp/Diagnostics/EmptyEmbeddedStatementTests.cs +++ b/Tests/CSharp/Diagnostics/EmptyEmbeddedStatementTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class EmptyEmbeddedStatementTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSimple() { Analyze(@" @@ -28,7 +27,7 @@ void TestMethod (int i) }"); } - [Test] + [Fact] public void TestForeach() { Analyze(@" @@ -50,7 +49,7 @@ void TestMethod (int[] list) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/EmptyGeneralCatchClauseTests.cs b/Tests/CSharp/Diagnostics/EmptyGeneralCatchClauseTests.cs index e9849e5c..80a71231 100644 --- a/Tests/CSharp/Diagnostics/EmptyGeneralCatchClauseTests.cs +++ b/Tests/CSharp/Diagnostics/EmptyGeneralCatchClauseTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class EmptyGeneralCatchClauseTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestInspectorCase1() { Analyze(@"using System; @@ -30,7 +29,7 @@ public void method() "); } - [Test] + [Fact] public void TestInspectorCase2() { Analyze(@"using System; @@ -54,7 +53,7 @@ public void method() "); } - [Test] + [Fact] public void TestCatchWhen() { Analyze(@"using System; @@ -78,7 +77,7 @@ public void method() "); } - [Test] + [Fact] public void TestCatchWhenWithoutDeclaration() { Analyze(@"using System; @@ -102,7 +101,7 @@ public void method() "); } - [Test] + [Fact] public void TestCatchWithReturnStatement() { Analyze(@"using System; @@ -127,7 +126,7 @@ public bool Method() "); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System; diff --git a/Tests/CSharp/Diagnostics/EmptyNamespaceTests.cs b/Tests/CSharp/Diagnostics/EmptyNamespaceTests.cs index 89e242da..168e785d 100644 --- a/Tests/CSharp/Diagnostics/EmptyNamespaceTests.cs +++ b/Tests/CSharp/Diagnostics/EmptyNamespaceTests.cs @@ -1,11 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - public class EmptyNamespaceTests : CSharpDiagnosticTestBase + public class EmptyNamespaceTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestBasicCase() { Analyze(@" @@ -14,7 +14,7 @@ public void TestBasicCase() }$", @""); } - [Test] + [Fact] public void TestCaseWithRegions() { Analyze(@" @@ -25,7 +25,7 @@ public void TestCaseWithRegions() }$", @""); } - [Test] + [Fact] public void TestCaseWithUsing() { Analyze(@" @@ -35,7 +35,7 @@ public void TestCaseWithUsing() }$", @""); } - [Test] + [Fact] public void TestCaseWithNesting() { Analyze(@" @@ -50,7 +50,7 @@ namespace Foo }"); } - [Test] + [Fact] public void TestDisabledForNonEmpty() { Analyze(@" @@ -62,7 +62,7 @@ class Bar }"); } - [Test] + [Fact] public void TestDisabledForRegionsWithClasses() { Analyze(@" @@ -76,7 +76,7 @@ class Bar }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/EmptyStatementIssueTests.cs b/Tests/CSharp/Diagnostics/EmptyStatementIssueTests.cs index f06d7501..b30a9c18 100644 --- a/Tests/CSharp/Diagnostics/EmptyStatementIssueTests.cs +++ b/Tests/CSharp/Diagnostics/EmptyStatementIssueTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class EmptyStatementTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestBasicCase() { Analyze(@" @@ -27,7 +26,7 @@ public void Foo () "); } - [Test] + [Fact] public void TestDisable() { Analyze(@" @@ -42,7 +41,7 @@ public void Foo () "); } - [Test] + [Fact] public void TestEmbeddedStatements() { Analyze(@" @@ -59,7 +58,7 @@ public void Foo () "); } - [Test] + [Fact] public void TestInvalidCase() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/EnumUnderlyingTypeIsIntTests.cs b/Tests/CSharp/Diagnostics/EnumUnderlyingTypeIsIntTests.cs index bffe0f77..dac3f6f9 100644 --- a/Tests/CSharp/Diagnostics/EnumUnderlyingTypeIsIntTests.cs +++ b/Tests/CSharp/Diagnostics/EnumUnderlyingTypeIsIntTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class EnumUnderlyingTypeIsIntTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestCase() { Analyze(@" @@ -20,7 +19,7 @@ public enum Foo }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@" @@ -32,7 +31,7 @@ public enum Foo : int } - [Test] + [Fact] public void TestNestedCase() { Analyze(@" @@ -52,7 +51,7 @@ public enum Foo }"); } - [Test] + [Fact] public void TestDisabledForNoUnderlyingType() { Analyze(@" @@ -62,7 +61,7 @@ public enum Foo }"); } - [Test] + [Fact] public void TestDisabledForOtherTypes() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/EqualExpressionComparisonTests.cs b/Tests/CSharp/Diagnostics/EqualExpressionComparisonTests.cs index 9ad03d46..b940f6a9 100644 --- a/Tests/CSharp/Diagnostics/EqualExpressionComparisonTests.cs +++ b/Tests/CSharp/Diagnostics/EqualExpressionComparisonTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class EqualExpressionComparisonTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestEquality() { Analyze(@"class Foo @@ -29,7 +28,7 @@ static int Bar (object o) } - [Test] + [Fact] public void TestInequality() { Analyze(@"class Foo @@ -52,7 +51,7 @@ static int Bar (object o) } - [Test] + [Fact] public void TestEquals() { Analyze(@"class Foo @@ -74,7 +73,7 @@ static int Bar (object o) }"); } - [Test] + [Fact] public void TestNotEquals() { Analyze(@"class Foo @@ -96,7 +95,7 @@ static int Bar (object o) }"); } - [Test] + [Fact] public void TestStaticEquals() { Analyze(@"class Foo @@ -118,7 +117,7 @@ static int Bar (object o) }"); } - [Test] + [Fact] public void TestNotStaticEquals() { Analyze(@"class Foo @@ -140,7 +139,7 @@ static int Bar (object o) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"class Foo diff --git a/Tests/CSharp/Diagnostics/EventUnsubscriptionViaAnonymousDelegateTests.cs b/Tests/CSharp/Diagnostics/EventUnsubscriptionViaAnonymousDelegateTests.cs index 353ca576..f64d2b93 100644 --- a/Tests/CSharp/Diagnostics/EventUnsubscriptionViaAnonymousDelegateTests.cs +++ b/Tests/CSharp/Diagnostics/EventUnsubscriptionViaAnonymousDelegateTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class EventUnsubscriptionViaAnonymousDelegateTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestDelegateCase() { Analyze(@"using System; @@ -22,7 +21,7 @@ void Test () }"); } - [Test] + [Fact] public void TestLambdaCase() { Analyze(@"using System; @@ -38,7 +37,7 @@ void Test () }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System; diff --git a/Tests/CSharp/Diagnostics/FieldCanBeMadeReadOnlyTests.cs b/Tests/CSharp/Diagnostics/FieldCanBeMadeReadOnlyTests.cs index e9346140..80f61e0c 100644 --- a/Tests/CSharp/Diagnostics/FieldCanBeMadeReadOnlyTests.cs +++ b/Tests/CSharp/Diagnostics/FieldCanBeMadeReadOnlyTests.cs @@ -1,14 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; -using System; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class FieldCanBeMadeReadOnlyTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestInitializedField() { Analyze(@"class Test @@ -28,7 +26,7 @@ public static void Main(string[] args) }"); } - [Test] + [Fact] public void TestFieldAssignedInConstructor() { Analyze(@"class Test @@ -56,7 +54,7 @@ public static void Main(string[] args) }"); } - [Test] + [Fact] public void TestInitializedFieldAssignedInAnotherClassPart() { Analyze(@"partial class Test @@ -77,7 +75,7 @@ public void SomeMethod() "); } - [Test] + [Fact] public void TestInitializedStaticField() { Analyze(@"class Test @@ -97,7 +95,7 @@ public static void Main(string[] args) }"); } - [Test] + [Fact] public void TestInitializedStaticFieldUsedInInstanceMember() { Analyze(@"class Test @@ -117,7 +115,7 @@ public void TestMethod() }"); } - [Test] + [Fact] public void TestStaticFieldAssignedInStaticConstructor() { Analyze(@"class Test @@ -137,7 +135,7 @@ static Test() }"); } - [Test] + [Fact] public void TestStaticFieldAlsoAssignedInInstanceConstructor() { Analyze(@"class Test @@ -154,7 +152,7 @@ public Test() }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"class Test @@ -169,7 +167,7 @@ public static void Main(string[] args) } - [Test] + [Fact] public void TestFactoryMethod() { Analyze(@"class Test @@ -185,7 +183,7 @@ public static Test Create() }"); } - [Test] + [Fact] public void TestFactoryMethodCase2() { Analyze(@"class Test @@ -201,7 +199,7 @@ public static Test Create() } - [Test] + [Fact] public void TestUninitializedValueTypeField() { Analyze(@"class Test @@ -221,7 +219,7 @@ public Test() }"); } - [Test] + [Fact] public void TestInitalizedValueTypeField() { // Is handled by the 'to const' issue. @@ -236,7 +234,7 @@ public void FooBar() } - [Test] + [Fact] public void TestSpecializedFieldBug() { Analyze(@" @@ -252,7 +250,7 @@ public void Foo() } - [Test] + [Fact] public void TestFieldAssignedInConstructorLambda() { Analyze(@" @@ -269,7 +267,7 @@ public Test() }"); } - [Test] + [Fact] public void MutableStruct() { Analyze(@"class Test @@ -289,7 +287,7 @@ public void Increment() { "); } - [Test] + [Fact] public void TestUnassignedField() { Analyze(@"class Test @@ -298,7 +296,7 @@ public void TestUnassignedField() }"); } - [Test] + [Fact] public void TestMultiple() { Analyze(@"class Test @@ -322,7 +320,7 @@ public Test() /// /// Bug 19832 - Source Analysis should probably not suggest making a serialized field readonly /// - [Test] + [Fact] public void TestBug19832() { Analyze(@" @@ -339,7 +337,7 @@ public static void Main(string[] args) "); } - [Test] + [Fact(Skip="broken")] public void TestComments() { Analyze(@"class Test diff --git a/Tests/CSharp/Diagnostics/ForCanBeConvertedToForeachTests.cs b/Tests/CSharp/Diagnostics/ForCanBeConvertedToForeachTests.cs index 490bc07c..d0651929 100644 --- a/Tests/CSharp/Diagnostics/ForCanBeConvertedToForeachTests.cs +++ b/Tests/CSharp/Diagnostics/ForCanBeConvertedToForeachTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class ForCanBeConvertedToForeachTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestArrayCase() { Test(@" @@ -32,7 +30,7 @@ void Foo (object[] o) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestIListCase() { Test(@" @@ -61,7 +59,7 @@ void Foo(IList o) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInvalid() { Analyze(@" @@ -78,7 +76,7 @@ void Foo (object[] o) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInvalidCase2() { Analyze(@" @@ -95,7 +93,7 @@ void Foo (object[] o) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInvalidCase3() { Analyze(@" @@ -113,7 +111,7 @@ void Foo (object[] o) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestComplexExpression() { Test(@" @@ -147,7 +145,7 @@ void Foo(object o) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestOptimizedFor() { Test(@" @@ -182,7 +180,7 @@ void Foo(object o) - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/ForControlVariableIsNeverModifiedTests.cs b/Tests/CSharp/Diagnostics/ForControlVariableIsNeverModifiedTests.cs index 28ec26ef..b5becfeb 100644 --- a/Tests/CSharp/Diagnostics/ForControlVariableIsNeverModifiedTests.cs +++ b/Tests/CSharp/Diagnostics/ForControlVariableIsNeverModifiedTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ForControlVariableIsNeverModifiedTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestBinaryOpConditionNotModified() { var input = @" @@ -22,7 +21,7 @@ void TestMethod () Analyze(input); } - [Test] + [Fact] public void TestBinaryOpConditionModified() { var input = @" @@ -38,7 +37,7 @@ void TestMethod () Analyze(input); } - [Test] + [Fact] public void TestUnaryOpConditionNotModified() { var input = @" @@ -54,7 +53,7 @@ void TestMethod () Analyze(input); } - [Test] + [Fact] public void TestUnaryOpConditionModified() { var input = @" @@ -71,7 +70,7 @@ void TestMethod () Analyze(input); } - [Test] + [Fact] public void TestIdentifierConditionNotModified() { var input = @" @@ -87,7 +86,7 @@ void TestMethod () Analyze(input); } - [Test] + [Fact] public void TestIdentifierConditionModified() { var input = @" diff --git a/Tests/CSharp/Diagnostics/ForStatementConditionIsTrueTests.cs b/Tests/CSharp/Diagnostics/ForStatementConditionIsTrueTests.cs index c0b0396b..fc3f5cbf 100644 --- a/Tests/CSharp/Diagnostics/ForStatementConditionIsTrueTests.cs +++ b/Tests/CSharp/Diagnostics/ForStatementConditionIsTrueTests.cs @@ -1,13 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ForStatementConditionIsTrueTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestInspectorCase1() { Analyze(@"using System; @@ -37,7 +36,7 @@ public void method() "); } - [Test] + [Fact] public void TestInspectorCase2() { Analyze(@"using System; @@ -67,7 +66,7 @@ public void method() "); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System; diff --git a/Tests/CSharp/Diagnostics/FormatStringProblemTests.cs b/Tests/CSharp/Diagnostics/FormatStringProblemTests.cs index 055e838d..7c2bf075 100644 --- a/Tests/CSharp/Diagnostics/FormatStringProblemTests.cs +++ b/Tests/CSharp/Diagnostics/FormatStringProblemTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class FormatStringProblemTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TooFewArguments() { Analyze(@" @@ -20,7 +19,7 @@ void Foo() } - [Test] + [Fact] public void SupportsFixedArguments() { Analyze(@" @@ -37,7 +36,7 @@ void Bar(string format, string arg0) }"); } - [Test] + [Fact] public void IgnoresCallWithUnknownNumberOfArguments() { Analyze(@" @@ -50,7 +49,7 @@ string Bar(params object[] args) }"); } - [Test] + [Fact] public void FormatItemIndexOutOfRangeOfArguments() { Analyze(@" @@ -63,7 +62,7 @@ void Foo() }"); } - [Test] + [Fact] public void FormatItemIndexOutOfRangeOfArguments_ExplicitArrayCreation() { Analyze(@" @@ -76,7 +75,7 @@ void Foo() }"); } - [Test] + [Fact] public void FormatItemMissingEndBrace() { Analyze(@" @@ -89,7 +88,7 @@ void Foo() }"); } - [Test] + [Fact] public void UnescapedLeftBrace() { Analyze(@" @@ -102,7 +101,7 @@ void Foo() }"); } - [Test] + [Fact] public void IgnoresStringWithGoodArguments() { Analyze(@" @@ -115,7 +114,7 @@ void Foo() }"); } - [Test] + [Fact] public void IgnoresStringWithGoodArguments_ExplicitArrayCreation() { Analyze(@" @@ -128,7 +127,7 @@ void Foo() }"); } - [Test] + [Fact] public void IgnoresNonFormattingCall() { Analyze(@" @@ -141,7 +140,7 @@ void Foo() }"); } - [Test] + [Fact] public void HandlesCallsWithExtraArguments() { Analyze(@" @@ -155,7 +154,7 @@ void Foo() } - [Test] + [Fact] public void TooManyArguments() { Analyze(@" @@ -168,7 +167,7 @@ void Foo() }"); } - [Test] + [Fact] public void UnreferencedArgument() { Analyze(@" @@ -184,7 +183,7 @@ void Foo() /// /// Bug 14405 - Incorrect "argument not used in string format" warning /// - [Test] + [Fact] public void TestBug14405() { Analyze(@" @@ -197,7 +196,7 @@ void Foo() } }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@" @@ -214,7 +213,7 @@ void Foo() /// /// Bug 15867 - Wrong Context for string formatting /// - [Test] + [Fact] public void TestBug15867() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/FunctionNeverReturnsTests.cs b/Tests/CSharp/Diagnostics/FunctionNeverReturnsTests.cs index 4a4ae27e..39e04c34 100644 --- a/Tests/CSharp/Diagnostics/FunctionNeverReturnsTests.cs +++ b/Tests/CSharp/Diagnostics/FunctionNeverReturnsTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class FunctionNeverReturnsTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestEnd() { var input = @" @@ -20,7 +19,7 @@ void TestMethod () Analyze(input); } - [Test] + [Fact] public void TestReturn() { var input = @" @@ -34,7 +33,7 @@ void TestMethod () Analyze(input); } - [Test] + [Fact] public void TestThrow() { var input = @" @@ -48,7 +47,7 @@ void TestMethod () Analyze(input); } - [Test] + [Fact] public void TestNeverReturns() { var input = @" @@ -62,7 +61,7 @@ class TestClass Analyze(input); } - [Test] + [Fact] public void TestIfWithoutElse() { var input = @" @@ -77,7 +76,7 @@ string TestMethod (int x) Analyze(input); } - [Test] + [Fact] public void TestRecursive() { var input = @" @@ -91,7 +90,7 @@ class TestClass Analyze(input); } - [Test] + [Fact] public void TestRecursiveWithThis() { var input = @" @@ -105,7 +104,7 @@ class TestClass Analyze(input); } - [Test] + [Fact] public void TestNonRecursive() { var input = @" @@ -122,7 +121,7 @@ void TestMethod (int i) Analyze(input); } - [Test] + [Fact] public void TestVirtualNonRecursive() { var input = @" @@ -136,7 +135,7 @@ public virtual string Result { Analyze(input); } - [Test] + [Fact] public void TestOverrideNonRecursive() { var input = @" @@ -150,7 +149,7 @@ public override int GetHashCode() { Analyze(input); } - [Test] + [Fact] public void TestNonRecursiveProperty() { var input = @" @@ -170,7 +169,7 @@ int Foo Analyze(input); } - [Test] + [Fact] public void TestNonRecursivePropertyWithPassingPropertyName() { var input = @" @@ -196,7 +195,7 @@ int Foo Analyze(input); } - [Test] + [Fact] public void TestGetterNeverReturns() { var input = @" @@ -212,7 +211,7 @@ int TestProperty Analyze(input); } - [Test] + [Fact] public void TestRecursiveGetter() { var input = @" @@ -228,7 +227,7 @@ int TestProperty Analyze(input); } - [Test] + [Fact] public void TestRecursiveSetter() { var input = @" @@ -244,7 +243,7 @@ int TestProperty Analyze(input); } - [Test] + [Fact] public void TestAutoProperty() { var input = @" @@ -259,7 +258,7 @@ int TestProperty Analyze(input); } - [Test] + [Fact] public void TestMethodGroupNeverReturns() { var input = @" @@ -277,7 +276,7 @@ int TestMethod(object o) Analyze(input); } - [Test] + [Fact] public void TestIncrementProperty() { var input = @" @@ -292,7 +291,7 @@ int TestProperty Analyze(input); } - [Test] + [Fact] public void TestLambdaNeverReturns() { var input = @" @@ -306,7 +305,7 @@ void TestMethod() Analyze(input); } - [Test] + [Fact] public void TestDelegateNeverReturns() { var input = @" @@ -321,7 +320,7 @@ void TestMethod() Analyze(input); } - [Test] + [Fact] public void YieldBreak() { var input = @" @@ -335,7 +334,7 @@ System.Collections.Generic.IEnumerable TestMethod () Analyze(input); } - [Test] + [Fact] public void TestDisable() { var input = @" @@ -350,7 +349,7 @@ void TestMethod () Analyze(input); } - [Test] + [Fact] public void TestBug254() { //https://github.com/icsharpcode/NRefactory/issues/254 @@ -375,7 +374,7 @@ void TestMethod() Analyze(input); } - [Test] + [Fact] public void TestSwitch() { //https://github.com/icsharpcode/NRefactory/issues/254 @@ -393,7 +392,7 @@ void TestMethod() Analyze(input); } - [Test] + [Fact] public void TestSwitchWithDefault() { //https://github.com/icsharpcode/NRefactory/issues/254 @@ -412,7 +411,7 @@ class TestClass Analyze(input); } - [Test] + [Fact] public void TestSwitchValue() { //https://github.com/icsharpcode/NRefactory/issues/254 @@ -431,7 +430,7 @@ class TestClass Analyze(input); } - [Test] + [Fact] public void TestSwitchDefault_CaseReturns() { var input = @" @@ -451,7 +450,7 @@ void TestSwitch(int i) Analyze(input); } - [Test] + [Fact] public void TestLinqFrom() { //https://github.com/icsharpcode/NRefactory/issues/254 @@ -468,7 +467,7 @@ class TestClass Analyze(input); } - [Test] + [Fact] public void TestWrongLinqContexts() { //https://github.com/icsharpcode/NRefactory/issues/254 @@ -487,7 +486,7 @@ from z in TestMethod() Analyze(input); } - [Test] + [Fact] public void TestForeach() { //https://bugzilla.xamarin.com/show_bug.cgi?id=14732 @@ -504,7 +503,7 @@ void TestMethod() Analyze(input); } - [Test] + [Fact] public void TestNoExecutionFor() { var input = @" @@ -520,7 +519,7 @@ void TestMethod() Analyze(input); } - [Test] + [Fact] public void TestNullCoalescing() { //https://bugzilla.xamarin.com/show_bug.cgi?id=14732 @@ -538,7 +537,7 @@ int TestMethod() Analyze(input); } - [Test] + [Fact] public void TestPropertyGetterInSetter() { Analyze(@"using System; @@ -552,7 +551,7 @@ int Foo { }"); } - [Test] + [Fact] public void TestRecursiveFunctionBug() { Analyze(@"using System; @@ -568,7 +567,7 @@ bool Foo (int i) /// /// Bug 17769 - Incorrect "method never returns" warning /// - [Test] + [Fact] public void TestBug17769() { Analyze(@" @@ -585,7 +584,7 @@ public bool Test () "); } - [Test] + [Fact] public void TestSelfUnregisteringEvent() { var input = @" @@ -602,7 +601,7 @@ void OnSomeEvent(object o, EventArgs e) Analyze(input); } - [Test] + [Fact] public void TestConditionalExpression() { var input = @" @@ -619,7 +618,7 @@ int Test(bool recursive) Analyze(input); } - [Test] + [Fact] public void TestConditionalAccessExpression() { var input = @" diff --git a/Tests/CSharp/Diagnostics/LocalVariableHidesMemberTests.cs b/Tests/CSharp/Diagnostics/LocalVariableHidesMemberTests.cs index 8189ba8b..af2a7e2a 100644 --- a/Tests/CSharp/Diagnostics/LocalVariableHidesMemberTests.cs +++ b/Tests/CSharp/Diagnostics/LocalVariableHidesMemberTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class LocalVariableHidesMemberTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestField() { const string input = @" @@ -35,7 +34,7 @@ void TestMethod() Analyze(input); } - [Test] + [Fact] public void TestMethod() { var input = @" @@ -49,7 +48,7 @@ void TestMethod () Analyze(input); } - [Test] + [Fact] public void TestForeach() { var input = @" @@ -65,7 +64,7 @@ void TestMethod () Analyze(input); } - [Test] + [Fact] public void TestStatic() { var input = @" @@ -80,7 +79,7 @@ static void TestMethod2 () Analyze(input); } - [Test] + [Fact] public void TestStaticNoIssue() { var input = @" @@ -100,7 +99,7 @@ static void TestMethod2 () Analyze(input); } - [Test] + [Fact] public void TestAccessiblePrivate() { var input = @" @@ -116,7 +115,7 @@ void Method () Analyze(input); } - [Test] + [Fact] public void TestAccessiblePrivateDueToTypeNesting() { var input = @" @@ -145,7 +144,7 @@ void OtherMethod () Analyze(input); } - [Test] + [Fact] public void TestInternalAccessibility() { var input = @" @@ -163,7 +162,7 @@ void Method () Analyze(input); } - [Test] + [Fact] public void TestInaccessiblePrivate() { var input = @" @@ -181,7 +180,7 @@ void Method () Analyze(input); } - [Test] + [Fact] public void SuppressIssueIfVariableInitializedFromField() { var input = @" @@ -199,7 +198,7 @@ void Method () Analyze(input); } - [Test] + [Fact] public void TestClashWithTypeName1() { var input = @" @@ -216,7 +215,7 @@ void Method () Analyze(input); } - [Test] + [Fact] public void TestClashWithTypeName2() { var input = @" diff --git a/Tests/CSharp/Diagnostics/LocalVariableNotUsedIssueTests.cs b/Tests/CSharp/Diagnostics/LocalVariableNotUsedIssueTests.cs index 2fb23201..5e815b6b 100644 --- a/Tests/CSharp/Diagnostics/LocalVariableNotUsedIssueTests.cs +++ b/Tests/CSharp/Diagnostics/LocalVariableNotUsedIssueTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class LocalVariableNotUsedTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestUnusedVariable() { var input = @" @@ -25,8 +24,7 @@ void TestMethod () Analyze(input, output); } - [Test] - [Ignore("Support for multiple variables not implemented yet. Reactivate when finished.")] + [Fact(Skip="Support for multiple variables not implemented yet. Reactivate when finished.")] public void TestUnusedVariable2() { var input2 = @" @@ -48,7 +46,7 @@ void TestMethod () Analyze(input2, output2); } - [Test] + [Fact] public void TestUsedVariable() { var input1 = @" @@ -70,7 +68,7 @@ void TestMethod () Analyze(input2); } - [Test] + [Fact] public void TestUnusedForeachVariable() { var input = @" @@ -85,7 +83,7 @@ void TestMethod () Analyze(input); } - [Test] + [Fact] public void TestUsedForeachVariable() { var input = @" diff --git a/Tests/CSharp/Diagnostics/LockThisTests.cs b/Tests/CSharp/Diagnostics/LockThisTests.cs index e7d62eb2..d047b269 100644 --- a/Tests/CSharp/Diagnostics/LockThisTests.cs +++ b/Tests/CSharp/Diagnostics/LockThisTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class LockThisTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestLockThisInMethod() { var input = @" @@ -34,7 +32,7 @@ void TestMethod () Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestLockThisInGetter() { var input = @" @@ -65,7 +63,7 @@ int MyProperty { Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestLockThisInSetter() { var input = @" @@ -94,7 +92,7 @@ int MyProperty { Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestLockThisInConstructor() { var input = @" @@ -121,7 +119,7 @@ class TestClass Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestLockThisInDelegate() { var input = @" @@ -154,7 +152,7 @@ class TestClass Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestLockThisInLambda() { var input = @" @@ -187,7 +185,7 @@ class TestClass Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestLockParenthesizedThis() { var input = @" @@ -214,7 +212,7 @@ void TestMethod () Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestFixMultipleLockThis() { var input = @" @@ -252,7 +250,7 @@ void TestMethod2 () Test(input, 2, output, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestFixMixedLocks() { var input = @" @@ -293,7 +291,7 @@ void TestMethod2 () Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestLockNonThis() { var input = @" @@ -311,7 +309,7 @@ class TestClass Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNestedTypeLock() { var input = @" @@ -344,7 +342,7 @@ class Nested Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestMethodSynchronized() { var input = @" @@ -374,7 +372,7 @@ void TestMethod () Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestMethodWithSynchronizedValue() { var input = @" @@ -404,7 +402,7 @@ void TestMethod () Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestMethodHasSynchronized() { var input = @" @@ -435,7 +433,7 @@ void TestMethod () Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestMethodNotSynchronized() { var input = @" @@ -452,7 +450,7 @@ void TestMethod () Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAbstractSynchronized() { var input = @" @@ -473,7 +471,7 @@ abstract class TestClass Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDoubleLocking() { var input = @" @@ -505,7 +503,7 @@ public void TestMethod () Test(input, 2, output, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDelegateLocking() { var input = @" @@ -541,7 +539,7 @@ public void TestMethod () Test(input, 2, output, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestLambdaLocking() { var input = @" @@ -577,7 +575,7 @@ public void TestMethod () Test(input, 2, output, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestStaticMethod() { var input = @" @@ -607,7 +605,7 @@ public static void TestMethod () Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestStaticProperty() { var input = @" @@ -641,7 +639,7 @@ public static int TestProperty Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestMixedStaticMethod() { var input = @" @@ -683,7 +681,7 @@ public static void TestStaticMethod () Test(input, 2, output, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNewNameLock() { var input = @" diff --git a/Tests/CSharp/Diagnostics/LongLiteralEndingLowerLTests.cs b/Tests/CSharp/Diagnostics/LongLiteralEndingLowerLTests.cs index d9633229..bb1d59e0 100644 --- a/Tests/CSharp/Diagnostics/LongLiteralEndingLowerLTests.cs +++ b/Tests/CSharp/Diagnostics/LongLiteralEndingLowerLTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class LongLiteralEndingLowerLTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestNormal() { Analyze(@" @@ -20,7 +19,7 @@ class Test }"); } - [Test] + [Fact] public void TestDisabledForUnsignedFirst() { Analyze(@" @@ -30,7 +29,7 @@ class Test }"); } - [Test] + [Fact] public void TestUnsigned() { Analyze(@" @@ -44,7 +43,7 @@ class Test }"); } - [Test] + [Fact] public void TestDisabledForUppercase() { Analyze(@" @@ -54,7 +53,7 @@ class Test }"); } - [Test] + [Fact] public void TestDisabledForString() { Analyze(@" @@ -64,7 +63,7 @@ class Test }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/MemberCanBeMadeStaticTests.cs b/Tests/CSharp/Diagnostics/MemberCanBeMadeStaticTests.cs index f35e3e32..a53f3b87 100644 --- a/Tests/CSharp/Diagnostics/MemberCanBeMadeStaticTests.cs +++ b/Tests/CSharp/Diagnostics/MemberCanBeMadeStaticTests.cs @@ -1,13 +1,13 @@ /* using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class MemberCanBeMadeStaticTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestPrivateMethod() { Analyze( @@ -28,7 +28,7 @@ static void Test() ); } - [Test] + [Fact] public void TestPrivateMethodPublicSkip() { Analyze( @@ -42,7 +42,7 @@ public void TestPrivateMethodPublicSkip() ); } - [Test] + [Fact] public void TestPublicMethod() { Analyze( @@ -63,7 +63,7 @@ public static void Test() ); } - [Test] + [Fact] public void TestPublicMethodSkip() { Analyze( @@ -77,7 +77,7 @@ public void TestPublicMethodSkip() ); } - [Test] + [Fact] public void MethodThatCallsInstanceMethodOnParameter() { Analyze( @@ -98,7 +98,7 @@ static string Test(string txt) ); } - [Test] + [Fact] public void TestWithVirtualFunction() { @@ -112,7 +112,7 @@ public virtual void Test() Analyze(input); } - [Test] + [Fact] public void TestWithInterfaceImplementation() { var input = @"interface IBase { @@ -128,7 +128,7 @@ class TestClass : IBase Analyze(input); } - [Test] + [Fact] public void TestWithStaticFunction() { @@ -142,7 +142,7 @@ static void Test() Analyze(input); } - [Test] + [Fact] public void TestDoNotWarnOnAttributes() { @@ -158,7 +158,7 @@ public void Test() Analyze(input); } - [Test] + [Fact] public void TestDoNotWarnOnEmptyMethod() { @@ -172,7 +172,7 @@ public void Test() Analyze(input); } - [Test] + [Fact] public void TestDoNotWarnOnInterfaceMethod() { @@ -184,7 +184,7 @@ interface ITestInterface Analyze(input); } - [Test] + [Fact] public void TestDoNotWarnOnNotImplementedMethod() { var input = @"using System; @@ -198,7 +198,7 @@ public void Test () Analyze(input); } - [Test] + [Fact] public void TestPropertyAccess() { var input = @"using System; @@ -213,7 +213,7 @@ public void Test () Analyze(input); } - [Test] + [Fact] public void DoNotWarnOnMarshalByRefObject() { @@ -227,7 +227,7 @@ public void Test () Analyze(input); } - [Test] + [Fact] public void TestProperty() { Analyze( @@ -251,7 +251,7 @@ static int Test { } - [Test] + [Fact] public void TestCustomEvent() { Analyze( @@ -282,7 +282,7 @@ static event EventHandler Bar } - [Test] + [Fact] public void TestCustomEventOnNotImplemented() { Analyze( @@ -300,7 +300,7 @@ event EventHandler Bar { ); } - [Test] + [Fact] public void TestDisable() { Analyze( diff --git a/Tests/CSharp/Diagnostics/MemberHidesStaticFromOuterClassTests.cs b/Tests/CSharp/Diagnostics/MemberHidesStaticFromOuterClassTests.cs index 124869c3..473d2443 100644 --- a/Tests/CSharp/Diagnostics/MemberHidesStaticFromOuterClassTests.cs +++ b/Tests/CSharp/Diagnostics/MemberHidesStaticFromOuterClassTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class MemberHidesStaticFromOuterClassTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestProperty() { Analyze(@" @@ -23,7 +22,7 @@ public class Bar } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/MethodOverloadWithOptionalParameterTests.cs b/Tests/CSharp/Diagnostics/MethodOverloadWithOptionalParameterTests.cs index 3628cb7c..ea8b6b4c 100644 --- a/Tests/CSharp/Diagnostics/MethodOverloadWithOptionalParameterTests.cs +++ b/Tests/CSharp/Diagnostics/MethodOverloadWithOptionalParameterTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class MethodOverloadWithOptionalParameterTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSingleMethod() { Analyze(@" @@ -27,7 +26,7 @@ private void Print(string message, $string messageDelimiter = ""===""$) "); } - [Test] + [Fact] public void TestTwoParameters() { Analyze(@" @@ -52,7 +51,7 @@ private void Print(string message, $string messageDelimiter = ""===""$, $string }"); } - [Test] + [Fact] public void TestIndexer() { Analyze(@" @@ -74,7 +73,7 @@ public string this[string message] } - [Test] + [Fact] public void TestDisable() { Analyze(@" @@ -96,7 +95,7 @@ private void Print(string message, string messageDelimiter = ""==="") "); } - [Test] + [Fact] public void Test() { var input = @" @@ -110,7 +109,7 @@ void TestMethod (int a, $int b = 1$) Analyze(input); } - [Test] + [Fact] public void Test2() { var input = @" @@ -124,7 +123,7 @@ void TestMethod (int a, int b = 1, $int c = 1$) Analyze(input); } - [Test] + [Fact] public void TestNoIssue() { var input = @" @@ -136,7 +135,7 @@ void TestMethod (int a, int b = 1, int c = 1) Analyze(input); } - [Test] + [Fact] public void TestNoIssue_Generics() { var input = @" diff --git a/Tests/CSharp/Diagnostics/NameOfSuggestionTests.cs b/Tests/CSharp/Diagnostics/NameOfSuggestionTests.cs index 7771d0c9..1f456d67 100644 --- a/Tests/CSharp/Diagnostics/NameOfSuggestionTests.cs +++ b/Tests/CSharp/Diagnostics/NameOfSuggestionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class NameOfSuggestionTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestArgumentNullException() { Analyze(@" @@ -28,7 +27,7 @@ void F(int foo) }"); } - [Test] + [Fact] public void TestArgumentException() { Analyze(@" @@ -52,7 +51,7 @@ void F(object foo) }"); } - [Test] + [Fact] public void TestArgumentOutOfRangeExceptionSwap() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/NegativeRelationalExpressionTests.cs b/Tests/CSharp/Diagnostics/NegativeRelationalExpressionTests.cs index 825eabd0..f3c0921a 100644 --- a/Tests/CSharp/Diagnostics/NegativeRelationalExpressionTests.cs +++ b/Tests/CSharp/Diagnostics/NegativeRelationalExpressionTests.cs @@ -1,10 +1,8 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class NegativeRelationalExpressionTests : CSharpDiagnosticTestBase { @@ -29,43 +27,43 @@ void TestMethod () Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestEquality() { Test("==", "!="); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInEquality() { Test("!=", "=="); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestGreaterThan() { Test(">", "<="); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestGreaterThanOrEqual() { Test(">=", "<"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestLessThan() { Test("<", ">="); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestLessThanOrEqual() { Test("<=", ">"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestFloatingPoint() { var input = @" @@ -79,7 +77,7 @@ void TestMethod (double d) Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestFloatingPointEquality() { var input = @" @@ -93,7 +91,7 @@ void TestMethod (double d) Test(input, 1); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestUserDefinedOperator() { var input = @" @@ -112,7 +110,7 @@ struct LineChangeInfo Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBug() { var input = @" diff --git a/Tests/CSharp/Diagnostics/NonPublicMethodWithTestAttributeTests.cs b/Tests/CSharp/Diagnostics/NonPublicMethodWithTestAttributeTests.cs index 8225267b..25cc4b7d 100644 --- a/Tests/CSharp/Diagnostics/NonPublicMethodWithTestAttributeTests.cs +++ b/Tests/CSharp/Diagnostics/NonPublicMethodWithTestAttributeTests.cs @@ -1,9 +1,8 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class NonPublicMethodWithTestAttributeTests : CSharpDiagnosticTestBase { const string NUnitClasses = @"using System; @@ -14,7 +13,7 @@ public class TestFixtureAttribute : System.Attribute {} public class TestAttribute : System.Attribute {} }"; - [Test] + [Fact] public void TestImplicitPrivate() { Analyze(NUnitClasses + @@ -38,7 +37,7 @@ public void NonPublicMethod() }"); } - [Test] + [Fact] public void TestExplicitPrivate() { Analyze(NUnitClasses + @@ -62,7 +61,7 @@ public void NonPublicMethod() }"); } - [Test] + [Fact] public void TestExplicitProtected() { Analyze(NUnitClasses + @@ -86,7 +85,7 @@ public void NonPublicMethod() }"); } - [Test] + [Fact] public void TestExplicitInternal() { Analyze(NUnitClasses + @@ -110,11 +109,10 @@ public void NonPublicMethod() }"); } - [Test] + [Fact] public void TestDisable() { Analyze(NUnitClasses + @" -[TestFixture] class Tests { #pragma warning disable " + CSharpDiagnosticIDs.NonPublicMethodWithTestAttributeAnalyzerID + @" diff --git a/Tests/CSharp/Diagnostics/NonReadonlyReferencedInGetHashCodeTests.cs b/Tests/CSharp/Diagnostics/NonReadonlyReferencedInGetHashCodeTests.cs index 297b42fd..f6c45f65 100644 --- a/Tests/CSharp/Diagnostics/NonReadonlyReferencedInGetHashCodeTests.cs +++ b/Tests/CSharp/Diagnostics/NonReadonlyReferencedInGetHashCodeTests.cs @@ -1,13 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class NonReadonlyReferencedInGetHashCodeTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestInspectorCase1() { Analyze(@"using System; @@ -29,7 +28,7 @@ public override int GetHashCode() "); } - [Test] + [Fact] public void TestInspectorCase2() { Analyze(@"using System; @@ -50,7 +49,7 @@ public override int GetHashCode() }"); } - [Test] + [Fact] public void TestInspectorCase3() { Analyze(@"using System; @@ -71,7 +70,7 @@ public override int GetHashCode() }"); } - [Test] + [Fact] public void TestInspectorCase4() { Analyze(@" @@ -108,7 +107,7 @@ public override int GetHashCode() } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System; @@ -137,7 +136,7 @@ public override int GetHashCode() - [Test] + [Fact] public void TestConst() { Analyze(@"using System; @@ -153,7 +152,7 @@ public override int GetHashCode() "); } - [Test] + [Fact] public void TestReadOnly() { Analyze(@"using System; diff --git a/Tests/CSharp/Diagnostics/NotImplementedExceptionInspectorTests.cs b/Tests/CSharp/Diagnostics/NotImplementedExceptionInspectorTests.cs index bbcf9af3..0758cba2 100644 --- a/Tests/CSharp/Diagnostics/NotImplementedExceptionInspectorTests.cs +++ b/Tests/CSharp/Diagnostics/NotImplementedExceptionInspectorTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class NotImplementedExceptionInspectorTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestInspectorCase1() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/NotResolvedInTextTests.cs b/Tests/CSharp/Diagnostics/NotResolvedInTextTests.cs index ee0a418b..67b06aef 100644 --- a/Tests/CSharp/Diagnostics/NotResolvedInTextTests.cs +++ b/Tests/CSharp/Diagnostics/NotResolvedInTextTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class NotResolvedInTextTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestBadExamples() { Analyze(@" @@ -23,7 +22,7 @@ void F() }"); } - [Test] + [Fact] public void TestArgumentNullExceptionSwap() { Analyze(@" @@ -45,7 +44,7 @@ void F(int foo) }"); } - [Test] + [Fact] public void TestArgumentExceptionSwap() { Analyze(@" @@ -67,7 +66,7 @@ void F(int foo) }", 0, 0); } - [Test] + [Fact] public void TestArgumentOutOfRangeExceptionSwap() { Analyze(@" @@ -89,7 +88,7 @@ void F(int foo) }", 0); } - [Test] + [Fact] public void TestArgumentOutOfRangeExceptionSwapCase2() { Analyze(@" @@ -111,7 +110,7 @@ void F(int foo) }", 0, 0); } - [Test] + [Fact] public void TestDuplicateWaitObjectExceptionSwap() { Analyze(@" @@ -134,7 +133,7 @@ void F(int foo) } - [Test] + [Fact] public void TestInvalidArgumentException() { Analyze(@" @@ -149,7 +148,7 @@ void F(object foo) }"); } - [Test] + [Fact] public void TestArgumentExceptionGuessing() { Analyze(@" @@ -173,7 +172,7 @@ void F(object foo) }"); } - [Test] + [Fact] public void TestArgumentExceptionGuessingCase2() { Analyze(@" @@ -197,7 +196,7 @@ void F(object foo) }"); } - [Test] + [Fact] public void TestArgumentNullGuessing() { Analyze(@" @@ -221,7 +220,7 @@ void F(object foo) }", 0, 1); } - [Test] + [Fact] public void TestArgumentNullGuessingResolve2() { Analyze(@" @@ -246,7 +245,7 @@ void F(object foo) /// /// Source analysis can't resolve 'key' in indexer property setter /// - [Test] + [Fact] public void TestArgumentNullOnIndexerKey() { Analyze(@" @@ -263,7 +262,7 @@ public string this[string key] { }"); } - [Test] + [Fact] public void TestArgumentNullGuessingCase2() { Analyze(@" @@ -287,7 +286,7 @@ void F(object foo) }"); } - [Test] + [Fact] public void TestArgumentOutOfRangeExceptionGuessing() { Analyze(@" @@ -311,7 +310,7 @@ void F(int foo, int bar) }"); } - [Test] + [Fact] public void TestArgumentOutOfRangeExceptionGuessingCase2() { Analyze(@" @@ -335,7 +334,7 @@ void F(object foo) }"); } - [Test] + [Fact] public void TestConstructorValidCase() { Analyze(@" @@ -355,7 +354,7 @@ public A(BaseRefactoringContext context, Statement rootStatement, IEnumerable /// Bug 15039 - source analysis can't resolve 'value' in property setter /// - [Test] + [Fact] public void TestBug15039() { Analyze(@" @@ -372,7 +371,7 @@ public string Foo { }"); } - [Test] + [Fact] public void TestValue() { Analyze(@" @@ -400,7 +399,7 @@ public string Foo { }", 0, 1); } - [Test] + [Fact] public void TestIssue45() { Analyze(@" @@ -417,7 +416,7 @@ public string this[string key] }"); } - [Test] + [Fact] public void TestIssue120_ConversionOperator() { Analyze(@" @@ -434,7 +433,7 @@ public static implicit operator A(string key) }"); } - [Test] + [Fact] public void TestOperator() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/ObjectCreationAsStatementTests.cs b/Tests/CSharp/Diagnostics/ObjectCreationAsStatementTests.cs index c69d5673..8f7278b7 100644 --- a/Tests/CSharp/Diagnostics/ObjectCreationAsStatementTests.cs +++ b/Tests/CSharp/Diagnostics/ObjectCreationAsStatementTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ObjectCreationAsStatementTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSimpleCase() { Analyze(@" @@ -20,7 +19,7 @@ void Bar() "); } - [Test] + [Fact] public void TestNoIssue() { Analyze(@" @@ -34,7 +33,7 @@ void Bar() "); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/OperatorIsCanBeUsedTests.cs b/Tests/CSharp/Diagnostics/OperatorIsCanBeUsedTests.cs index d6108cd6..15857e98 100644 --- a/Tests/CSharp/Diagnostics/OperatorIsCanBeUsedTests.cs +++ b/Tests/CSharp/Diagnostics/OperatorIsCanBeUsedTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class OperatorIsCanBeUsedTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestInspectorCase1() { Analyze(@" @@ -44,7 +43,7 @@ public static void main(string[] args) }"); } - [Test] + [Fact] public void TestInspectorCase2() { Analyze(@" @@ -82,7 +81,7 @@ public static void main(string[] args) }"); } - [Test] + [Fact] public void TestInspectorCase3() { Analyze(@" @@ -120,7 +119,7 @@ public static void main(string[] args) }"); } - [Test] + [Fact] public void TestInspectorCase4() { Analyze(@" @@ -164,7 +163,7 @@ public static void main(string[] args) }"); } - [Test] + [Fact] public void TestInspectorCase5() { Analyze(@" @@ -190,7 +189,7 @@ public static void main(string[] args) }"); } - [Test] + [Fact] public void TestResharperDisable() { Analyze(@"using System; diff --git a/Tests/CSharp/Diagnostics/OptionalParameterHierarchyMismatchTests.cs b/Tests/CSharp/Diagnostics/OptionalParameterHierarchyMismatchTests.cs index ecc2aa71..8126a765 100644 --- a/Tests/CSharp/Diagnostics/OptionalParameterHierarchyMismatchTests.cs +++ b/Tests/CSharp/Diagnostics/OptionalParameterHierarchyMismatchTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class OptionalParameterHierarchyMismatchTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestSimpleCase() { Test(@" @@ -29,7 +27,7 @@ public override void TestMethod(int value = 1) {} }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNullCase() { Test(@" @@ -43,7 +41,7 @@ public override void TestMethod(object value = null) {} }", 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInterface() { Test(@" @@ -65,7 +63,7 @@ public void TestMethod(int value = 1) {} }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestIndexer() { Test(@" @@ -99,7 +97,7 @@ class Derived : IBase }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisabledForCorrect() { Test(@" @@ -113,7 +111,7 @@ public void TestMethod(int value = 1) {} }", 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAddOptional() { Test(@" @@ -135,7 +133,7 @@ public override void TestMethod(int value) {} }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestRemoveOptional() { Test(@" @@ -157,7 +155,7 @@ public override void TestMethod(int value = 1) {} }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestTakeDeclarationValue() { Test(@" @@ -210,7 +208,7 @@ public override void Foo(int a = 1) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisableForInterfaceMismatch() { Analyze(@"class A @@ -237,7 +235,7 @@ public override void Foo(int a = 1) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@" @@ -252,7 +250,7 @@ public override void TestMethod(int value = 2) {} }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestEnumValue() { Test(@" @@ -276,7 +274,7 @@ public override void TestMethod(FooBar value = FooBar.Foo) {} }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisableForExplicitInterfaceImplementation() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/OptionalParameterRefOutTests.cs b/Tests/CSharp/Diagnostics/OptionalParameterRefOutTests.cs index ae991da1..d76b8d5d 100644 --- a/Tests/CSharp/Diagnostics/OptionalParameterRefOutTests.cs +++ b/Tests/CSharp/Diagnostics/OptionalParameterRefOutTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class OptionalParameterRefOutTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestRef() { Analyze(@" @@ -19,7 +18,7 @@ public void Foo($[Optional] ref int test$) }"); } - [Test] + [Fact] public void TestOut() { Analyze(@" @@ -33,7 +32,7 @@ public void Foo($[Optional] out int test$) "); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/ParameterCanBeDemotedIssue/ParameterCanBeDeclaredWithBaseTypeIssueTests.cs b/Tests/CSharp/Diagnostics/ParameterCanBeDemotedIssue/ParameterCanBeDeclaredWithBaseTypeIssueTests.cs index 93b6d218..6fa9bae2 100644 --- a/Tests/CSharp/Diagnostics/ParameterCanBeDemotedIssue/ParameterCanBeDeclaredWithBaseTypeIssueTests.cs +++ b/Tests/CSharp/Diagnostics/ParameterCanBeDemotedIssue/ParameterCanBeDeclaredWithBaseTypeIssueTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class ParameterCanBeDeclaredWithBaseTypeTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void BasicTest() { Test(@" @@ -43,7 +41,7 @@ void F(A b) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void IgnoresUnusedParameters() { Analyze(@" @@ -55,7 +53,7 @@ void F(A a1) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void IgnoresDirectionalParameters() { Analyze(@" @@ -71,7 +69,7 @@ void F(out A a1) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void IgnoresOverrides() { Analyze(@" @@ -100,7 +98,7 @@ public override void F(B b) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void IgnoresOverridables() { Analyze(@" @@ -122,7 +120,7 @@ public virtual void F(B b) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void HandlesNeededProperties() { Analyze(@" @@ -144,7 +142,7 @@ public void F(B b) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void InterfaceTest() { Test(@" @@ -182,7 +180,7 @@ void F(IA b) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void RespectsExpectedTypeInIfStatement() { Analyze(@" @@ -196,7 +194,7 @@ void F (bool b, bool c) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void MultipleInterfaceTest() { Test(@" @@ -271,8 +269,7 @@ public void Baz() {} void IC.Foo() {} }"; - [Ignore("TODO")] - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void FindsTopInterface() { Test(baseInput + @" @@ -292,7 +289,7 @@ void F(IA e) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void DoesNotChangeOverload() { Analyze(baseInput + @" @@ -313,7 +310,7 @@ void Bar (IB b) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void AssignmentToExplicitlyTypedVariable() { Analyze(baseInput + @" @@ -328,7 +325,7 @@ void F(IB b) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void GenericMethod() { Analyze(baseInput + @" @@ -345,7 +342,7 @@ void Generic (T arg) where T : IA }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void VariableDeclarationWithTypeInference() { Analyze(baseInput + @" @@ -363,7 +360,7 @@ void Foo (IA a) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void RespectsOutgoingCallsTypeRestrictions() { Test(baseInput + @" @@ -393,7 +390,7 @@ void DemandType(D d) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void AccountsForNonInvocationMethodGroupUsageInMethodCall() { Analyze(@" @@ -420,7 +417,7 @@ void Baz (FooDelegate fd) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void AccountsForNonInvocationMethodGroupUsageInVariableDeclaration() { Analyze(@" @@ -443,7 +440,7 @@ public void Bar (IDerived derived) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void AccountsForNonInvocationMethodGroupUsageInAssignmentExpression() { Analyze(@" @@ -467,8 +464,7 @@ public void Bar (IDerived derived) }"); } - [Ignore("TODO")] - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void AccountsForIndexers() { Test(@" @@ -490,7 +486,7 @@ void Write(System.Collections.Generic.IList s) }", 1, 1); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void AccountsForArrays() { Analyze(@" @@ -508,7 +504,7 @@ void SetValue (out string s) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void LimitsParamsParametersToArrays() { Analyze(@" @@ -521,7 +517,7 @@ void Write(params string[] s) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void DoesNotSuggestProgramEntryPointChanges() { Analyze(@" @@ -535,7 +531,7 @@ public static void Main (string[] args) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void IgnoresImplicitInterfaceImplementations() { Analyze(@" @@ -552,7 +548,7 @@ public void Foo(string s) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void IgnoresEnumParameters() { Analyze(@" @@ -570,7 +566,7 @@ public void Foo(ApplicableValues av) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void CallToOverriddenMember() { Test(@" @@ -610,7 +606,7 @@ public override void Foo() }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void CallToShadowingMember() { Analyze(@" @@ -633,7 +629,7 @@ void F (Test t) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void CallToShadowingMember2() { Test(@" @@ -685,7 +681,7 @@ public override void Foo() }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void CallToShadowingMemberWithBaseInterface() { Test(@" @@ -748,7 +744,7 @@ protected override void Foo() /// /// Bug 9617 - Incorrect "parameter can be demoted to base class" warning for arrays /// - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBug9617() { Test(@"class Test @@ -766,7 +762,7 @@ object Foo (System.Collections.IList arr) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBug9617Case2() { Test(@"class Test @@ -784,7 +780,7 @@ int Foo (System.Collections.Generic.IList arr) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void DoNotDemoteStringComparisonToReferenceComparison_WithinLambda() { Test(@"using System; using System.Linq; using System.Collections.Generic; @@ -802,7 +798,7 @@ class User { ", 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestMicrosoftSuppressMessage() { Analyze(@" @@ -824,7 +820,7 @@ void F(B b) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisableAll() { Analyze(@"// ReSharper disable All @@ -850,7 +846,7 @@ void F(B b) /// /// Bug 14099 - Do not suggest demoting Exception to _Exception /// - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBug14099() { Analyze(@" @@ -867,7 +863,7 @@ public void Foo (Exception ex) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestPreferGenerics() { Analyze(@"using System.Collections.Generic; diff --git a/Tests/CSharp/Diagnostics/ParameterHidesMemberTests.cs b/Tests/CSharp/Diagnostics/ParameterHidesMemberTests.cs index 462973ad..dc7caf7c 100644 --- a/Tests/CSharp/Diagnostics/ParameterHidesMemberTests.cs +++ b/Tests/CSharp/Diagnostics/ParameterHidesMemberTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ParameterHidesMemberTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestField() { var input = @" @@ -20,7 +19,7 @@ void TestMethod (int $i$, int j) Analyze(input); } - [Test] + [Fact] public void TestDisable() { var input = @" @@ -35,7 +34,7 @@ void TestMethod (int i, int j) Analyze(input); } - [Test] + [Fact] public void TestMethod() { var input = @" @@ -50,7 +49,7 @@ void TestMethod (int $TestMethod2$) Analyze(input); } - [Test] + [Fact] public void TestConstructor() { var input = @" @@ -64,7 +63,7 @@ public TestClass(int i) Analyze(input); } - [Test] + [Fact] public void TestStatic() { var input = @" @@ -78,7 +77,7 @@ static void TestMethod2 (int $i$) Analyze(input); } - [Test] + [Fact] public void TestStaticNoIssue() { var input = @" @@ -96,7 +95,7 @@ static void TestMethod2 (int j) Analyze(input); } - [Test] + [Fact] public void TestAccessiblePrivate() { var input = @" @@ -111,7 +110,7 @@ void Method (int $i$) Analyze(input); } - [Test] + [Fact] public void TestAccessiblePrivateDueToTypeNesting() { var input = @" @@ -134,7 +133,7 @@ void OtherMethod (int $i$) {} Analyze(input); } - [Test] + [Fact] public void TestInternalAccessibility() { var input = @" @@ -151,7 +150,7 @@ void Method (int $i$) Analyze(input); } - [Test] + [Fact] public void TestInaccessiblePrivate() { var input = @" @@ -168,7 +167,7 @@ void Method (int i) Analyze(input); } - [Test] + [Fact] public void TestIgnorePublicMethods() { var input = @" @@ -182,7 +181,7 @@ class TestClass } - [Test] + [Fact] public void TestIgnoreAbstractMethods() { var input = @" @@ -195,7 +194,7 @@ abstract class TestClass Analyze(input); } - [Test] + [Fact] public void TestIgnoreOverriddenMethods() { var input = @" @@ -210,7 +209,7 @@ protected override void Method (int i) Analyze(input); } - [Test] + [Fact] public void TestIgnoreInterfaceImplementations() { var input = @" diff --git a/Tests/CSharp/Diagnostics/ParameterOnlyAssignedTests.cs b/Tests/CSharp/Diagnostics/ParameterOnlyAssignedTests.cs index 83db6924..7e8dc902 100644 --- a/Tests/CSharp/Diagnostics/ParameterOnlyAssignedTests.cs +++ b/Tests/CSharp/Diagnostics/ParameterOnlyAssignedTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ParameterOnlyAssignedTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestUnusedValue() { Analyze(@" @@ -25,7 +24,7 @@ void TestMethod(int i) }"); } - [Test] + [Fact] public void TestUsedValue() { Analyze(@" @@ -39,7 +38,7 @@ int TestMethod(int i) }"); } - [Test] + [Fact] public void TestOutParameter() { Analyze(@" @@ -52,7 +51,7 @@ void TestMethod(out int i) }"); } - [Test] + [Fact] public void TestRefParameter() { Analyze(@" @@ -65,7 +64,7 @@ void TestMethod(ref int i) }"); } - [Test] + [Fact] public void TestMultipleParameters() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/PartialMethodParameterNameMismatchTests.cs b/Tests/CSharp/Diagnostics/PartialMethodParameterNameMismatchTests.cs index e077546a..7955023b 100644 --- a/Tests/CSharp/Diagnostics/PartialMethodParameterNameMismatchTests.cs +++ b/Tests/CSharp/Diagnostics/PartialMethodParameterNameMismatchTests.cs @@ -1,13 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class PartialMethodParameterNameMismatchTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void SimpleCaseFix() { Analyze(@" @@ -38,7 +37,7 @@ partial void FooBar(int bar) } - [Test] + [Fact] public void NoMismatch() { Analyze(@" @@ -56,7 +55,7 @@ partial void FooBar(int bar, string baz, object foo) "); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/PartialTypeWithSinglePartTests.cs b/Tests/CSharp/Diagnostics/PartialTypeWithSinglePartTests.cs index ab379ec9..47812ad7 100644 --- a/Tests/CSharp/Diagnostics/PartialTypeWithSinglePartTests.cs +++ b/Tests/CSharp/Diagnostics/PartialTypeWithSinglePartTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class PartialTypeWithSinglePartTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestRedundantModifier() { Analyze( @@ -17,7 +16,7 @@ public void TestRedundantModifier() }"); } - [Test] + [Fact] public void TestNecessaryModifier() { Analyze((string)@" @@ -29,7 +28,7 @@ partial class TestClass }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@" @@ -39,7 +38,7 @@ partial class TestClass }"); } - [Test] + [Fact] public void TestRedundantNestedPartial() { Analyze(@" @@ -63,7 +62,7 @@ partial class TestClass }"); } - [Test] + [Fact] public void TestRedundantNestedPartialInNonPartialOuterClass() { Analyze(@" @@ -81,7 +80,7 @@ class Nested }"); } - [Test] + [Fact] public void TestRedundantNestedPartialDisable() { Analyze(@" @@ -106,7 +105,7 @@ class Nested } - [Test] + [Fact] public void TestNeededNestedPartial() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/PolymorphicFieldLikeEventInvocationTests.cs b/Tests/CSharp/Diagnostics/PolymorphicFieldLikeEventInvocationTests.cs index b33545fe..a8181634 100644 --- a/Tests/CSharp/Diagnostics/PolymorphicFieldLikeEventInvocationTests.cs +++ b/Tests/CSharp/Diagnostics/PolymorphicFieldLikeEventInvocationTests.cs @@ -1,14 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class PolymorphicFieldLikeEventInvocationTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestSimpleCase() { TestIssue(@" @@ -31,7 +29,7 @@ public void FooBar() "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestCustomEvent() { // Should be marked as error @@ -58,7 +56,7 @@ public void FooBar() "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/PossibleAssignmentToReadonlyFieldTests.cs b/Tests/CSharp/Diagnostics/PossibleAssignmentToReadonlyFieldTests.cs index 9f94a0e6..b6ea09a9 100644 --- a/Tests/CSharp/Diagnostics/PossibleAssignmentToReadonlyFieldTests.cs +++ b/Tests/CSharp/Diagnostics/PossibleAssignmentToReadonlyFieldTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class PossibleAssignmentToReadonlyFieldTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestTypeParameter() { TestIssue(@" @@ -28,7 +26,7 @@ void Test () "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestClassTypeParameter() { Analyze(@" @@ -49,7 +47,7 @@ void Test () "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestValueType() { TestIssue(@" @@ -71,7 +69,7 @@ public static void Foo() "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestConstructor() { Analyze(@" @@ -96,7 +94,7 @@ public FooBar (T t) /// /// Bug 15038 - readonly member property is incorrectly underlined in the .ctor when initialized /// - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBug15038() { Analyze(@" @@ -115,7 +113,7 @@ internal Multipart () "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@" @@ -146,7 +144,7 @@ public static void Foo() /// /// Bug 15109 - Incorrect "Readonly field cannot be used as assignment target" error /// - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBug15109() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/PossibleMistakenCallToGetTypeTests.cs b/Tests/CSharp/Diagnostics/PossibleMistakenCallToGetTypeTests.cs index 397e48e6..f8abd8aa 100644 --- a/Tests/CSharp/Diagnostics/PossibleMistakenCallToGetTypeTests.cs +++ b/Tests/CSharp/Diagnostics/PossibleMistakenCallToGetTypeTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class PossibleMistakenCallToGetTypeTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestGetTypeCase() { Analyze(@" @@ -32,7 +31,7 @@ public void FooBar(Type a) "); } - [Test] + [Fact] public void TestStaticCall() { Analyze(@" @@ -49,7 +48,7 @@ public void FooBar(Type a) "); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/PossibleMultipleEnumerationTests.cs b/Tests/CSharp/Diagnostics/PossibleMultipleEnumerationTests.cs index 52503f08..f93ede38 100644 --- a/Tests/CSharp/Diagnostics/PossibleMultipleEnumerationTests.cs +++ b/Tests/CSharp/Diagnostics/PossibleMultipleEnumerationTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class PossibleMultipleEnumerationTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestVariableInvocation() { var input = @" @@ -42,7 +40,7 @@ void TestMethod () }", 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestVariableForeach() { var input = @" @@ -75,7 +73,7 @@ void TestMethod () }", 1, 1); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestVariableMixed() { var input = @" @@ -93,7 +91,7 @@ void TestMethod () Test(input, 2); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestParameter() { var input = @" @@ -110,7 +108,7 @@ void TestMethod (IEnumerable e) Test(input, 2); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestObjectMethodInvocation() { var input = @" @@ -128,7 +126,7 @@ void TestMethod () Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestIf() { var input = @" @@ -150,7 +148,7 @@ void TestMethod (int i) Test(input, 2); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestIf2() { var input = @" @@ -172,7 +170,7 @@ void TestMethod (int i) Test(input, 3); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestIf3() { var input = @" @@ -193,7 +191,7 @@ void TestMethod (int i) Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestFor() { var input = @" @@ -212,7 +210,7 @@ void TestMethod () Test(input, 1); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestWhile() { var input = @" @@ -232,7 +230,7 @@ void TestMethod () Test(input, 1); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestWhile2() { var input = @" @@ -251,7 +249,7 @@ void TestMethod () Test(input, 1); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestWhile3() { var input = @" @@ -275,7 +273,7 @@ void TestMethod () Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestWhile4() { var input = @" @@ -297,7 +295,7 @@ void TestMethod (int i) Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDo() { var input = @" @@ -319,7 +317,7 @@ void TestMethod (int i) Test(input, 2); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDo2() { var input = @" @@ -340,7 +338,7 @@ void TestMethod (int i) Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestLambda() { var input = @" @@ -362,7 +360,7 @@ void TestMethod () Test(input, 2); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestLambda2() { var input = @" @@ -381,7 +379,7 @@ void TestMethod () Test(input, 2); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestLambda3() { var input = @" @@ -403,7 +401,7 @@ void TestMethod () Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestLambda4() { var input = @" @@ -422,7 +420,7 @@ void TestMethod () Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestConditionalExpression() { var input = @" @@ -440,7 +438,7 @@ void TestMethod (int i) }"; Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestConditionalExpression2() { var input = @" @@ -459,7 +457,7 @@ void TestMethod (int i) Test(input, 2); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestConstantConditionalExpression() { var input = @" @@ -478,7 +476,7 @@ void TestMethod (int i) Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAssignmentInConditionalExpression() { var input = @" @@ -499,7 +497,7 @@ void TestMethod (int i) Test(input, 2); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAssignmentInConditionalExpression2() { var input = @" @@ -520,7 +518,7 @@ void TestMethod (int i) Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAssignment() { var input = @" @@ -538,7 +536,7 @@ void TestMethod (IEnumerable e) Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAssignment2() { var input = @" @@ -559,7 +557,7 @@ void TestMethod (IEnumerable e) Test(input, 2); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNoIssue() { var input = @" @@ -576,7 +574,7 @@ void TestMethod (IEnumerable e) Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestExpression() { var input = @" @@ -595,7 +593,7 @@ void TestMethod () Test(input, 2); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestExpression2() { var input = @" @@ -614,7 +612,7 @@ void TestMethod () Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestOutArgument() { var input = @" @@ -637,7 +635,7 @@ void TestMethod (IEnumerable e) Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestOutArgument2() { var input = @" @@ -661,7 +659,7 @@ void TestMethod (IEnumerable e) Test(input, 2); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestOutArgument3() { var input = @" @@ -682,7 +680,7 @@ void TestMethod (IEnumerable e) Test(input, 2); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { var input = @" diff --git a/Tests/CSharp/Diagnostics/PublicConstructorInAbstractClassTests.cs b/Tests/CSharp/Diagnostics/PublicConstructorInAbstractClassTests.cs index 99df00d5..8a18b79e 100644 --- a/Tests/CSharp/Diagnostics/PublicConstructorInAbstractClassTests.cs +++ b/Tests/CSharp/Diagnostics/PublicConstructorInAbstractClassTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class PublicConstructorInAbstractClassTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestInspectorCase1() { Analyze(@" @@ -24,7 +23,7 @@ protected TestClass () }"); } - [Test] + [Fact] public void TestInspectorCase2() { Analyze(@" @@ -40,7 +39,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestInspectorCase3() { Analyze(@" @@ -76,7 +75,7 @@ protected TestClass (string str) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantAnonymousTypePropertyNameTests.cs b/Tests/CSharp/Diagnostics/RedundantAnonymousTypePropertyNameTests.cs index 336565bd..b72da8af 100644 --- a/Tests/CSharp/Diagnostics/RedundantAnonymousTypePropertyNameTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantAnonymousTypePropertyNameTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantAnonymousTypePropertyNameTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSimpleCase() { Analyze(@" @@ -36,7 +35,7 @@ public void Test(FooBar f) }"); } - [Test] + [Fact] public void TestIgnoredCase() { Analyze(@" @@ -55,7 +54,7 @@ public void Test(FooBar f) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantArgumentDefaultValueTests.cs b/Tests/CSharp/Diagnostics/RedundantArgumentDefaultValueTests.cs index b075bcff..8703ac27 100644 --- a/Tests/CSharp/Diagnostics/RedundantArgumentDefaultValueTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantArgumentDefaultValueTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class RedundantArgumentDefaultValueTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestSimpleCase() { Test(@" @@ -32,7 +30,7 @@ public void Bar (int foo = 22) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNamedArgument() { Test(@" @@ -54,7 +52,7 @@ public void Bar (int foo = 22) "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestMultipleRemoveFirst() { Test(@" @@ -78,7 +76,7 @@ public void Bar (int foo = 22, int test = 3) ", 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestMultipleRemoveSecond() { Test(@" @@ -102,7 +100,7 @@ public void Bar (int foo = 22, int test = 3) ", 1); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInvalid() { Analyze(@" @@ -115,7 +113,7 @@ public void Bar (int foo = 22) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInvalidCase2() { Analyze(@" @@ -128,7 +126,7 @@ public void Bar (int foo = 22, int bar = 3) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@" @@ -144,7 +142,7 @@ public void Bar (int foo = 22) "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestConstructor() { Test(@" @@ -166,7 +164,7 @@ public Test (int a, int b, int c = 4711) "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestIndexer() { Test(@" @@ -190,7 +188,7 @@ class Test "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void SimpleCase() { Test(@" @@ -218,7 +216,7 @@ void Bar() }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void ChecksConstructors() { Test(@" @@ -246,7 +244,7 @@ void Bar() }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void IgnoresAllParametersPreceedingANeededOne() { Test(@" @@ -274,7 +272,7 @@ void Bar() }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void ChecksParametersIfParamsAreUnused() { Test(@" @@ -302,7 +300,7 @@ void Bar() }", 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void IgnoresIfParamsAreUsed() { Analyze(@" @@ -319,8 +317,7 @@ void Bar() }"); } - [Ignore("Fixme")] - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void NamedArgument() { Test(@" @@ -348,8 +345,7 @@ void Bar() }"); } - [Ignore("Fixme")] - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void DoesNotStopAtDifferingNamedParameters() { Test(@" @@ -377,8 +373,7 @@ void Bar() }"); } - [Ignore("Fixme")] - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void DoesNotStopAtNamedParamsArray() { Test(@" diff --git a/Tests/CSharp/Diagnostics/RedundantArgumentNameTests.cs b/Tests/CSharp/Diagnostics/RedundantArgumentNameTests.cs index 2c2e9749..e709c2f9 100644 --- a/Tests/CSharp/Diagnostics/RedundantArgumentNameTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantArgumentNameTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantArgumentNameTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void MethodInvocation1() { Analyze(@" @@ -30,7 +29,7 @@ public void F() "); } - [Test] + [Fact] public void MethodInvocation2() { Analyze(@" @@ -54,7 +53,7 @@ public void F() ", 0); } - [Test] + [Fact] public void MethodInvocation3() { Analyze(@" @@ -79,7 +78,7 @@ public void F() } - [Test] + [Fact] public void MethodInvocation4() { Analyze(@" @@ -109,7 +108,7 @@ public void F () "); } - [Test] + [Fact] public void IndexerExpression() { Analyze(@" @@ -149,7 +148,7 @@ private void Foo() ", 0); } - [Test] + [Fact] public void TestAttributes() { Analyze(@"using System; @@ -177,7 +176,7 @@ class TestClass ", 1); } - [Test] + [Fact] public void TestObjectCreation() { Analyze(@" @@ -208,7 +207,7 @@ public void Foo () } - [Test] + [Fact] public void Invalid() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantAssignmentIssueTests.cs b/Tests/CSharp/Diagnostics/RedundantAssignmentIssueTests.cs index d163271f..7d09b9d5 100644 --- a/Tests/CSharp/Diagnostics/RedundantAssignmentIssueTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantAssignmentIssueTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class RedundantAssignmentTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestVariableInitializerNotUsed() { var input = @" @@ -28,7 +26,7 @@ void TestMethod () Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestVariableInitializerNotUsedVar() { var input = @" @@ -49,7 +47,7 @@ void TestMethod () Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestVariableAssignmentNotUsed() { var input = @" @@ -76,7 +74,7 @@ int TestMethod () Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestParameterAssignmentNotUsed() { var input = @" @@ -101,7 +99,7 @@ int TestMethod (int i) Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAssignmentInExpression() { var input = @" @@ -125,7 +123,7 @@ int TestMethod (int i) Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestOutArgument() { var input = @" @@ -159,7 +157,7 @@ int TestMethod () Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestOutArgument2() { var input = @" @@ -180,7 +178,7 @@ int TestMethod () Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestRefArgument() { var input = @" @@ -194,7 +192,7 @@ void Test (ref int i) Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAssignmentOperator() { var input = @" @@ -210,7 +208,7 @@ int TestMethod () Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestIf() { var input = @" @@ -229,7 +227,7 @@ int TestMethod (int j) Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestConditionalExpression() { var input = @" @@ -244,7 +242,7 @@ int TestMethod (int j) Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestLoop() { var input = @" @@ -266,7 +264,7 @@ void TestMethod () Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestForeach() { var input = @" @@ -286,7 +284,7 @@ void TestMethod (int[] array) Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAssignmentInTryCatch() { var input = @"using System; @@ -307,7 +305,7 @@ void TestMethod () Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAssignmentInTryCatchFinally() { var input = @" @@ -328,7 +326,7 @@ void TestMethod () Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAssignmentInCatch() { var input = @"using System; @@ -349,7 +347,7 @@ void TestMethod () Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAssignmentBeforeTry() { var input = @"using System; @@ -370,7 +368,7 @@ void TestMethod () Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAssignmentInUsing() { var input = @"using System; @@ -386,7 +384,7 @@ void TestMethod () Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAssignmentWithFunction() { var input = @"using System; @@ -410,7 +408,7 @@ void TestMethod () Test(input, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAssignmentWithFunctionUsedLater() { var input = @"using System; @@ -441,7 +439,7 @@ void TestMethod () /// /// Bug 11795 - Use of regex in linq statement not being recognized. /// - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBug11795() { Analyze(@" @@ -472,7 +470,7 @@ select file /// /// Bug 14929 - Assignment greyed out (meaning "redundant") when it should not be /// - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBug14929() { Analyze(@" @@ -497,7 +495,7 @@ public void Demo () } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestMultipleVariableInitializers() { Test(@"using System; diff --git a/Tests/CSharp/Diagnostics/RedundantAttributeParenthesesTests.cs b/Tests/CSharp/Diagnostics/RedundantAttributeParenthesesTests.cs index 7fd47a20..2ab78d46 100644 --- a/Tests/CSharp/Diagnostics/RedundantAttributeParenthesesTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantAttributeParenthesesTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantAttributeParenthesesTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void DefaultCase() { Analyze(@" @@ -16,7 +15,7 @@ class TestClass { }", @" class TestClass { }"); } - [Test] + [Fact] public void IgnoreNoParentheses() { Analyze(@" @@ -25,7 +24,7 @@ class TestClass { }"); } - [Test] + [Fact] public void IgnoreParameters() { Analyze(@" @@ -34,7 +33,7 @@ class TestClass { }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantBaseConstructorTests.cs b/Tests/CSharp/Diagnostics/RedundantBaseConstructorTests.cs index f11d99b7..e15a15de 100644 --- a/Tests/CSharp/Diagnostics/RedundantBaseConstructorTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantBaseConstructorTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantBaseConstructorTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void Test() { var input = @" @@ -36,7 +35,7 @@ public TestClass(int data) { } Analyze(input, output); } - [Test] + [Fact] public void TestDisable() { var input = @" diff --git a/Tests/CSharp/Diagnostics/RedundantBaseQualifierTests.cs b/Tests/CSharp/Diagnostics/RedundantBaseQualifierTests.cs index e837499a..a42e1821 100644 --- a/Tests/CSharp/Diagnostics/RedundantBaseQualifierTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantBaseQualifierTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantBaseQualifierTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestInspectorCase1() { Analyze(@"using System; @@ -68,7 +67,7 @@ public override void method() "); } - [Test] + [Fact] public void TestInspectorCase2() { Analyze(@"using System; @@ -136,7 +135,7 @@ public void method2() "); } - [Test] + [Fact] public void ComplexTests() { Analyze(@" @@ -163,7 +162,7 @@ void FooBar () }"); } - [Test] + [Fact] public void InvalidUseOfBaseInFieldInitializer() { var input = @"class Foo diff --git a/Tests/CSharp/Diagnostics/RedundantBoolCompareTests.cs b/Tests/CSharp/Diagnostics/RedundantBoolCompareTests.cs index 6e1e56e8..2e8cab2d 100644 --- a/Tests/CSharp/Diagnostics/RedundantBoolCompareTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantBoolCompareTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class RedundantBoolCompareTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void Test() { var input = @" @@ -37,7 +35,7 @@ void TestMethod (bool x) Test(input, 4, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInsertParentheses() { var input = @" @@ -59,7 +57,7 @@ void TestMethod () Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInvalid() { Analyze(@" @@ -76,7 +74,7 @@ void TestMethod (bool? x) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNullable() { var input = @" diff --git a/Tests/CSharp/Diagnostics/RedundantCaseLabelTests.cs b/Tests/CSharp/Diagnostics/RedundantCaseLabelTests.cs index 762f25cb..6e57f7df 100644 --- a/Tests/CSharp/Diagnostics/RedundantCaseLabelTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantCaseLabelTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantCaseLabelTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void Test() { var input = @" @@ -37,7 +36,7 @@ void TestMethod (int i) } - [Test] + [Fact] public void TestLabelAfterDefault() { var input = @" @@ -67,7 +66,7 @@ void TestMethod (int i) } - [Test] + [Fact] public void TestDisable() { var input = @" diff --git a/Tests/CSharp/Diagnostics/RedundantCatchClauseTests.cs b/Tests/CSharp/Diagnostics/RedundantCatchClauseTests.cs index 6ce4b6dc..0ba9b96d 100644 --- a/Tests/CSharp/Diagnostics/RedundantCatchClauseTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantCatchClauseTests.cs @@ -1,10 +1,8 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class RedundantCatchClauseTests : CSharpDiagnosticTestBase { const string BaseInput = @" @@ -15,7 +13,7 @@ void F() {"; - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { var input = BaseInput + @" @@ -32,7 +30,7 @@ public void TestDisable() Analyze(input); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestEmptyCatch() { Test(BaseInput + @" @@ -56,7 +54,7 @@ public void TestEmptyCatch() }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestOnlyRedundantCatches() { Test(BaseInput + @" @@ -74,7 +72,7 @@ public void TestOnlyRedundantCatches() }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void AddsBlockIfNeccessary() { Test(BaseInput + @" @@ -96,7 +94,7 @@ public void AddsBlockIfNeccessary() } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void AddsBlockIfNeccessaryOnEmptyTryBlock() { Test(BaseInput + @" @@ -113,7 +111,7 @@ public void AddsBlockIfNeccessaryOnEmptyTryBlock() }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void EmptyTryCatchSkeleton() { Test(BaseInput + @" @@ -124,7 +122,7 @@ public void EmptyTryCatchSkeleton() }", 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void DoesNotAddBlockIfUnneccessary() { Test(@" @@ -142,7 +140,7 @@ public void DoesNotAddBlockIfUnneccessary() }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void NoIssuesWhenMissingCatch() { Test(BaseInput + @" @@ -153,7 +151,7 @@ public void NoIssuesWhenMissingCatch() }", 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestEmptyCatchWithFinally() { Test(BaseInput + @" @@ -178,7 +176,7 @@ public void TestEmptyCatchWithFinally() /// /// Bug 12273 - Incorrect redundant catch warning /// - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBug12273() { Test(BaseInput + @" @@ -211,7 +209,7 @@ public void TestBug12273() /// /// Bug 12273 - Incorrect redundant catch warning /// - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBug12273Case2() { Test(BaseInput + @" @@ -240,7 +238,7 @@ public void TestBug12273Case2() /// /// Bug 14451 - False positive of "Redundant catch clause" /// - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBugBug14451() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantCheckBeforeAssignmentTests.cs b/Tests/CSharp/Diagnostics/RedundantCheckBeforeAssignmentTests.cs index ff5061cf..393a3890 100644 --- a/Tests/CSharp/Diagnostics/RedundantCheckBeforeAssignmentTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantCheckBeforeAssignmentTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantCheckBeforeAssignmentTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestResharperDisableRestore() { Analyze(@"using System; @@ -29,7 +28,7 @@ public void Method() "); } - [Test] + [Fact] public void TestFix() { Analyze(@"using System; @@ -70,7 +69,7 @@ public int TestProperty "); } - [Test] + [Fact] public void TestFixWithElse() { Analyze(@"using System; @@ -113,7 +112,7 @@ public int TestProperty "); } - [Test] + [Fact] public void TestQualifiedField() { Analyze(@"using System; @@ -136,7 +135,7 @@ public int TestProperty }"); } - [Test] + [Fact] public void TestFlippedOperands() { Analyze(@"using System; @@ -159,7 +158,7 @@ public int TestProperty }"); } - [Test] + [Fact] public void TestConstantExpr() { Analyze(@"using System; @@ -174,7 +173,7 @@ public void Test() }"); } - [Test] + [Fact] public void TestConstantExprFlipped() { Analyze(@"using System; @@ -189,7 +188,7 @@ public void Test() }"); } - [Test] + [Fact] public void TestBlock() { Analyze(@"using System; @@ -214,7 +213,7 @@ public int TestProperty }"); } - [Test] + [Fact] public void TestIgnoreMultipleStatementsBlock() { Analyze(@"using System; @@ -242,11 +241,11 @@ void RaiseOnPropertyChanged(string name) { /* stub */ } }"); } - [TestCase("==")] - [TestCase("<")] - [TestCase(">")] - [TestCase(">=")] - [TestCase("<=")] + [InlineData("==")] + [InlineData("<")] + [InlineData(">")] + [InlineData(">=")] + [InlineData("<=")] public void TestIgnoreOtherComparisonOperators(string op) { Analyze(@"using System; @@ -263,7 +262,7 @@ public void Method(int expiryYear) "); } - [Test] + [Fact] public void TestIgnoreComplexExpression() { Analyze(@"using System; @@ -284,7 +283,7 @@ public void Method() "); } - [Test] + [Fact] public void TestIgnoreREIssue_104() { Analyze(@"using System; @@ -301,7 +300,7 @@ public void Method(int expiryYear) "); } - [Test] + [Fact] public void TestIgnoreWithElseBlock() { Analyze(@"using System; @@ -331,7 +330,7 @@ public int TestProperty } - [Test] + [Fact] public void TestIgnoreWithElseIfBlock() { Analyze(@"using System; @@ -360,7 +359,7 @@ public int TestProperty }"); } - [Test] + [Fact] public void TestWithEmptyElseBlock() { Analyze(@"using System; @@ -386,7 +385,7 @@ public int TestProperty }"); } - [Test] + [Fact] public void TestIgnoreWithElseStmt() { Analyze(@"using System; @@ -411,7 +410,7 @@ public int TestProperty }"); } - [Test] + [Fact] public void TestWithEmptyStmt() { Analyze(@"using System; @@ -437,7 +436,7 @@ public int TestProperty }"); } - [Test] + [Fact] public void TestStringEmptyComparison() { Analyze(@"using System; diff --git a/Tests/CSharp/Diagnostics/RedundantCommaInArrayInitializerTests.cs b/Tests/CSharp/Diagnostics/RedundantCommaInArrayInitializerTests.cs index 76e4d417..72c3f2b6 100644 --- a/Tests/CSharp/Diagnostics/RedundantCommaInArrayInitializerTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantCommaInArrayInitializerTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantCommaInArrayInitializerTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void Test() { var input = @" @@ -28,7 +27,7 @@ void TestMethod() Analyze(input, output); } - [Test] + [Fact] public void TestArrayInitializerNoRedundance() { Analyze(@" @@ -41,7 +40,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestArrayInitializerDescription() { Analyze(@" @@ -54,7 +53,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestObjectInitializerDescription() { Analyze(@" @@ -68,7 +67,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestCollectionInitializerDescrition() { Analyze(@" @@ -81,7 +80,7 @@ void TestMethod () }"); } - [Test] + [Fact] public void TestDisable() { var input = @" @@ -96,7 +95,7 @@ void TestMethod () Analyze(input); } - [Test] + [Fact] public void TestPreserveTrivia() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantComparisonWithNullTests.cs b/Tests/CSharp/Diagnostics/RedundantComparisonWithNullTests.cs index 4133db0d..59ab63cc 100644 --- a/Tests/CSharp/Diagnostics/RedundantComparisonWithNullTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantComparisonWithNullTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class RedundantComparisonWithNullTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInspectorCase1() { Test(@"using System;class Test {public void test(){int a = 0;if(a is int && a != null){a = 1;}}}", @"using System;class Test {public void test(){int a = 0; @@ -16,7 +14,7 @@ public void TestInspectorCase1() }}}"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestResharperDisable() { Analyze(@"using System; @@ -31,7 +29,7 @@ public void test(){ }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInspectorCase2() { Test(@"using System;class Test {public void test(){int a = 0;while(a != null && a is int){a = 1;}}}", @"using System;class Test {public void test(){int a = 0; @@ -40,7 +38,7 @@ public void TestInspectorCase2() }}}"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestCaseWithFullParens() { Test(@"using System; @@ -62,7 +60,7 @@ public void Test(object o) }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze( @@ -79,8 +77,7 @@ public void Test(object o) } - [Ignore("Extended version")] - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNegatedCase() { Test(@"using System; diff --git a/Tests/CSharp/Diagnostics/RedundantDefaultFieldInitializerTests.cs b/Tests/CSharp/Diagnostics/RedundantDefaultFieldInitializerTests.cs index 53f7b8ec..dda8e7e7 100644 --- a/Tests/CSharp/Diagnostics/RedundantDefaultFieldInitializerTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantDefaultFieldInitializerTests.cs @@ -1,13 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantDefaultFieldInitializerTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestRedundantIntInitializer() { var input = @" @@ -25,7 +24,7 @@ class TestClass Analyze(input, output); } - [Test] + [Fact] public void TestRedundantFloatInitializer() { var input = @" @@ -43,7 +42,7 @@ class TestClass Analyze(input, output); } - [Test] + [Fact] public void TestRedundantBooleanInitializer() { var input = @" @@ -59,7 +58,7 @@ class TestClass Analyze(input, output); } - [Test] + [Fact] public void TestRedundantCharInitializer() { var input = @" @@ -75,7 +74,7 @@ class TestClass Analyze(input, output); } - [Test] + [Fact] public void TestRedundantReferenceTypeInitializer() { var input = @" @@ -91,7 +90,7 @@ class TestClass Analyze(input, output); } - [Test] + [Fact] public void TestRedundantDynamicInitializer() { var input = @" @@ -107,7 +106,7 @@ class TestClass Analyze(input, output); } - [Test] + [Fact] public void TestRedundantStructInitializer() { var input = @" @@ -129,7 +128,7 @@ class TestClass Analyze(input, output); } - [Test] + [Fact] public void TestRedundantNullableInitializer() { var input = @" @@ -146,19 +145,19 @@ class TestClass } - [Test] + [Fact] public void TestRedundantConstantBug() { Analyze(@"class Test { const int foo = 0; }"); } - [Test] + [Fact] public void TestRedundantReadOnlyBug() { Analyze(@"struct Test { static readonly Test foo = new Test (); }"); } - [Test] + [Fact] public void TestDisable() { var input = @" diff --git a/Tests/CSharp/Diagnostics/RedundantDelegateCreationTests.cs b/Tests/CSharp/Diagnostics/RedundantDelegateCreationTests.cs index 86a8c200..f5a667e5 100644 --- a/Tests/CSharp/Diagnostics/RedundantDelegateCreationTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantDelegateCreationTests.cs @@ -1,14 +1,13 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; using System; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - - [TestFixture] + public class RedundantDelegateCreationTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestAdd() { var input = @" @@ -52,7 +51,7 @@ void olcol(object sender, EventArgs e) throw new NotImplementedException(); } - [Test] + [Fact] public void TestRemove() { Analyze(@" @@ -88,7 +87,7 @@ void HandleChanged(object sender, EventArgs e) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@" @@ -110,7 +109,7 @@ void HandleChanged(object sender, EventArgs e) }"); } - [Test] + [Fact] public void TestBug33763() { var input = @" diff --git a/Tests/CSharp/Diagnostics/RedundantEmptyDefaultSwitchBranchTests.cs b/Tests/CSharp/Diagnostics/RedundantEmptyDefaultSwitchBranchTests.cs index 06337a98..58ac6c2e 100644 --- a/Tests/CSharp/Diagnostics/RedundantEmptyDefaultSwitchBranchTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantEmptyDefaultSwitchBranchTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantEmptyDefaultSwitchBranchTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestDefaultRedundantCase() { Analyze(@" @@ -36,7 +35,7 @@ void TestMethod (int i = 0) }"); } - [Test] + [Fact] public void TestMinimal() { Analyze(@" @@ -60,7 +59,7 @@ void TestMethod (int i = 0) }"); } - [Test] + [Fact] public void TestDefaultRedundantCaseInReverseOrder() { Analyze(@" @@ -90,7 +89,7 @@ void TestMethod (int i = 0) }"); } - [Test] + [Fact] public void TestDefaultRedundantCaseCombined() { Analyze(@" @@ -117,7 +116,7 @@ void TestMethod (int i = 0) }"); } - [Test] + [Fact] public void TestDefaultRedundantCaseCombinedReverseOrder() { Analyze(@" @@ -144,7 +143,7 @@ void TestMethod (int i = 0) }"); } - [Test] + [Fact] public void TestDefaultWithCode() { Analyze(@" @@ -164,7 +163,7 @@ void TestMethod (int i = 0) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantEmptyFinallyBlockTests.cs b/Tests/CSharp/Diagnostics/RedundantEmptyFinallyBlockTests.cs index 98ce146c..41b35178 100644 --- a/Tests/CSharp/Diagnostics/RedundantEmptyFinallyBlockTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantEmptyFinallyBlockTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantEmptyFinallyBlockTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestRedundantTry() { Analyze(@" @@ -37,7 +36,7 @@ static void Main (string[] args) "); } - [Test] + [Fact] public void TestSimpleCase() { Analyze(@" @@ -77,7 +76,7 @@ static void Main (string[] args) "); } - [Test] + [Fact] public void TestInvalid() { Analyze(@" @@ -96,7 +95,7 @@ static void Main(string[] args) "); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantEnumerableCastCallTests.cs b/Tests/CSharp/Diagnostics/RedundantEnumerableCastCallTests.cs index 1055d50d..3e5527cd 100644 --- a/Tests/CSharp/Diagnostics/RedundantEnumerableCastCallTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantEnumerableCastCallTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class RedundantEnumerableCastCallTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestRedundantCast() { Test(@" @@ -37,7 +35,7 @@ static void Main (IEnumerable args) "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestRedundantCastCase2() { Test(@" @@ -67,7 +65,7 @@ static void Main (string[] args) "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestRedundantOfType() { Test(@" @@ -97,7 +95,7 @@ static void Main (IEnumerable args) "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestRedundantOfTypeResolution2() { Test(@" @@ -128,7 +126,7 @@ static void Main (IEnumerable args) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInvalid() { Analyze(@" @@ -147,7 +145,7 @@ static void Main (IEnumerable args) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantExplicitArrayCreationTests.cs b/Tests/CSharp/Diagnostics/RedundantExplicitArrayCreationTests.cs index 658e9e7a..564fa683 100644 --- a/Tests/CSharp/Diagnostics/RedundantExplicitArrayCreationTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantExplicitArrayCreationTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class RedundantExplicitArrayCreationTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestSimpleCase() { Test(@" @@ -29,7 +27,7 @@ void Foo () "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInvalid() { Analyze(@" @@ -43,7 +41,7 @@ void Foo () "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInvalidCase2() { @@ -58,7 +56,7 @@ void Foo () "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantExplicitArraySizeTests.cs b/Tests/CSharp/Diagnostics/RedundantExplicitArraySizeTests.cs index e0e9272d..8e626585 100644 --- a/Tests/CSharp/Diagnostics/RedundantExplicitArraySizeTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantExplicitArraySizeTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantExplicitArraySizeTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSimpleCase() { Analyze(@" @@ -28,7 +27,7 @@ void Foo () "); } - [Test] + [Fact] public void TestInvalidCase1() { Analyze(@" @@ -42,7 +41,7 @@ void Foo (int i) "); } - [Test] + [Fact] public void TestInvalidCase2() { Analyze(@" @@ -56,7 +55,7 @@ void Foo () "); } - [Test] + [Fact] public void TestInvalidCase3() { Analyze(@" @@ -70,7 +69,7 @@ void Foo () "); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantExplicitNullableCreationTests.cs b/Tests/CSharp/Diagnostics/RedundantExplicitNullableCreationTests.cs index 01022265..5339ed50 100644 --- a/Tests/CSharp/Diagnostics/RedundantExplicitNullableCreationTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantExplicitNullableCreationTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; -using System; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantExplicitNullableCreationTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestVariableCreation() { Analyze(@" @@ -29,7 +27,7 @@ void Test() "); } - [Test] + [Fact] public void TestLongForm() { Analyze(@" @@ -51,7 +49,7 @@ void Test() "); } - [Test] + [Fact] public void TestCreationInArgument() { Analyze(@" @@ -81,7 +79,7 @@ void Test() "); } - [Test] + [Fact] public void TestInvalid() { Analyze(@" @@ -98,7 +96,7 @@ void Test() /// /// RECS0138 fix produces bad code when one of expressions is an explicit nullable type creation #185 /// - [Test] + [Fact] public void TestIssue185() { Analyze(@" @@ -116,7 +114,7 @@ class Test "); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantExtendsListEntryTests.cs b/Tests/CSharp/Diagnostics/RedundantExtendsListEntryTests.cs index c56a74a4..779122fe 100644 --- a/Tests/CSharp/Diagnostics/RedundantExtendsListEntryTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantExtendsListEntryTests.cs @@ -1,14 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class RedundantExtendsListEntryTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInspectorCase1() { Test(@"using System; @@ -62,7 +60,7 @@ public partial class Foo "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInspectorCase2() { Test(@"using System; @@ -116,7 +114,7 @@ public partial class Foo "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInspectorCase3() { Analyze(@"using System; @@ -147,7 +145,7 @@ public void method() "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestResharperDisableRestore() { Analyze(@"using System; diff --git a/Tests/CSharp/Diagnostics/RedundantIfElseBlockTests.cs b/Tests/CSharp/Diagnostics/RedundantIfElseBlockTests.cs index ed3862ad..ab7760b4 100644 --- a/Tests/CSharp/Diagnostics/RedundantIfElseBlockTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantIfElseBlockTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantIfElseBlockTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestReturn() { var input = @" @@ -33,7 +32,7 @@ int TestMethod (int i) Analyze(input, output); } - [Test] + [Fact] public void TestDisable() { var input = @" @@ -51,7 +50,7 @@ int TestMethod (int i) Analyze(input); } - [Test] + [Fact] public void TestBreakLoop() { var input = @" @@ -84,7 +83,7 @@ void TestMethod () Analyze(input, output); } - [Test] + [Fact] public void TestContinueLoop() { var input = @" @@ -117,7 +116,7 @@ void TestMethod () Analyze(input, output); } - [Test] + [Fact] public void TestBlockStatement() { var input = @" @@ -149,7 +148,7 @@ int TestMethod (int i) Analyze(input, output); } - [Test] + [Fact] public void TestEmptyFalseBlock() { var input = @" @@ -176,7 +175,7 @@ void TestMethod (int i) Analyze(input, output); } - [Test] + [Fact] public void TestNecessaryElse() { @@ -195,7 +194,7 @@ void TestMethod (int i) Analyze(input); } - [Test] + [Fact] public void TestNecessaryElseCase2() { @@ -220,7 +219,7 @@ void TestMethod (int i) Analyze(input); } - [Test] + [Fact] public void TestNecessaryElseBecauseOfVarDeclaration() { @@ -242,7 +241,7 @@ void TestMethod (int i) Analyze(input); } - [Test] + [Fact] public void TestNecessaryElseBecauseOfVarDeclarationInDifferentStatement() { var input = @" @@ -264,7 +263,7 @@ void TestMethod (int i) Analyze(input); } - [Test] + [Fact] public void TestReturn2() { var input = @" diff --git a/Tests/CSharp/Diagnostics/RedundantInternalInspectorTests.cs b/Tests/CSharp/Diagnostics/RedundantInternalInspectorTests.cs index 3703c1b4..275cba27 100644 --- a/Tests/CSharp/Diagnostics/RedundantInternalInspectorTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantInternalInspectorTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantInternalInspectorTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestInspectorCase1() { Analyze(@" @@ -30,7 +29,7 @@ internal void Bar(string str) }"); } - [Test] + [Fact] public void TestInspectorCase1WithComment() { Analyze(@" @@ -60,7 +59,7 @@ internal void Bar(string str) }"); } - [Test] + [Fact] public void TestNestedClass() { Analyze(@" @@ -75,7 +74,7 @@ internal class Nested }"); } - [Test] + [Fact] public void TestNestedInPublicClass() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantLambdaParameterTypeTests.cs b/Tests/CSharp/Diagnostics/RedundantLambdaParameterTypeTests.cs index 86e7f6c2..d1bd1d2f 100644 --- a/Tests/CSharp/Diagnostics/RedundantLambdaParameterTypeTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantLambdaParameterTypeTests.cs @@ -1,14 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class RedundantLambdaParameterTypeTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void SimpleCase() { Test(@" @@ -34,7 +32,7 @@ public static void ExecuteCSharp3_0() "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void MultipleCases() { Test(@" @@ -60,7 +58,7 @@ public static void ExecuteCSharp3_0() ", 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInspectorCase2() { Test(@" @@ -100,7 +98,7 @@ void Test () }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInspectorCase3() { Analyze(@"using System; @@ -123,7 +121,7 @@ void Test() } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInvalidContext() { Analyze(@"using System; @@ -145,7 +143,7 @@ void Test () }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestResharperDisableRestore() { Analyze(@"using System; diff --git a/Tests/CSharp/Diagnostics/RedundantLambdaSignatureParenthesesTests.cs b/Tests/CSharp/Diagnostics/RedundantLambdaSignatureParenthesesTests.cs index 9699fb03..24d2d886 100644 --- a/Tests/CSharp/Diagnostics/RedundantLambdaSignatureParenthesesTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantLambdaSignatureParenthesesTests.cs @@ -1,14 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class RedundantLambdaSignatureParenthesesTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void SimpleCase() { Test(@" @@ -34,7 +32,7 @@ public static void Foo() ", 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void InvalidCase1() { Analyze(@" @@ -50,7 +48,7 @@ public static void Foo() "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void InvalidCase2() { Analyze(@" @@ -67,7 +65,7 @@ public static void Foo() } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInvalid() { Analyze(@" @@ -84,7 +82,7 @@ public static void Foo() } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantLogicalConditionalExpressionOperandTests.cs b/Tests/CSharp/Diagnostics/RedundantLogicalConditionalExpressionOperandTests.cs index abd1395d..d2b5efdf 100644 --- a/Tests/CSharp/Diagnostics/RedundantLogicalConditionalExpressionOperandTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantLogicalConditionalExpressionOperandTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class RedundantLogicalConditionalExpressionOperandTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestTrue() { Test(@" @@ -31,7 +29,7 @@ void Foo () "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestTrueCase2() { Test(@" @@ -55,7 +53,7 @@ void Foo () "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestFalse() { Test(@" @@ -79,7 +77,7 @@ void Foo () "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestFalseCase2() { Test(@" @@ -104,7 +102,7 @@ void Foo () } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInvalid() { Analyze(@" @@ -122,7 +120,7 @@ void Foo () } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantObjectCreationArgumentListTests.cs b/Tests/CSharp/Diagnostics/RedundantObjectCreationArgumentListTests.cs index 9b5eddf2..14c44dec 100644 --- a/Tests/CSharp/Diagnostics/RedundantObjectCreationArgumentListTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantObjectCreationArgumentListTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantObjectCreationArgumentListTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void Test() { var input = @" @@ -34,7 +33,7 @@ void TestMethod () Analyze(input, output); } - [Test] + [Fact] public void TestNoIssue() { var input = @" @@ -52,7 +51,7 @@ void TestMethod () Analyze(input); } - [Test] + [Fact] public void TestDisable() { var input = @" diff --git a/Tests/CSharp/Diagnostics/RedundantObjectOrCollectionInitializerTests.cs b/Tests/CSharp/Diagnostics/RedundantObjectOrCollectionInitializerTests.cs index 91c10ad1..c94e3ec8 100644 --- a/Tests/CSharp/Diagnostics/RedundantObjectOrCollectionInitializerTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantObjectOrCollectionInitializerTests.cs @@ -1,14 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class RedundantObjectOrCollectionInitializerTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void Test() { var input = @" @@ -30,7 +28,7 @@ void TestMethod () Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@" class TestClass @@ -43,7 +41,7 @@ void TestMethod() }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNoArgumentList() { var input = @" @@ -65,7 +63,7 @@ void TestMethod () Test(input, 1, output); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNoIssue() { var input = @" diff --git a/Tests/CSharp/Diagnostics/RedundantOverriddenMemberTests.cs b/Tests/CSharp/Diagnostics/RedundantOverriddenMemberTests.cs index c9d7fa9e..29d5800e 100644 --- a/Tests/CSharp/Diagnostics/RedundantOverriddenMemberTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantOverriddenMemberTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class RedundantOverriddenMemberTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInspectorCase1() { Test(@"namespace Demo @@ -41,7 +39,7 @@ public class CSharpDemo:BaseClass }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestResharperDisable() { Analyze(@"namespace Demo @@ -65,7 +63,7 @@ override public void run() }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestInspectorCase2() { Analyze(@"namespace Demo @@ -88,7 +86,7 @@ override public void run() }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestTestInspectorCase3() { Analyze(@"namespace Demo @@ -110,7 +108,7 @@ public void run1() }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestTestInspectorCase4() { Test( @@ -150,7 +148,7 @@ public class CSharpDemo:BaseClass }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestTestInspectorCase5() { Test( @@ -192,7 +190,7 @@ class Class2 : SampleCollection }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestTestInspectorCase6() { Test( @@ -273,7 +271,7 @@ class C : A }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestRedundantEvent() { Test(@"namespace Demo @@ -299,7 +297,7 @@ public class CSharpDemo:BaseClass } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNonRedundantEvent() { var input = @"namespace Demo @@ -318,7 +316,7 @@ public class CSharpDemo:BaseClass } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestGetHashCode() { Analyze(@" @@ -337,7 +335,7 @@ public override int GetHashCode () } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestRedundantGetHashCode() { TestIssue(@" @@ -351,7 +349,7 @@ public override int GetHashCode () } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestPropertyBug() { Analyze(@" @@ -377,7 +375,7 @@ public override int Foo { /// /// Bug 21533 - Incorrect warning: "Redundant method override" /// - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBug21533() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantPrivateInspectorTests.cs b/Tests/CSharp/Diagnostics/RedundantPrivateInspectorTests.cs index 362709b2..53a8e5d7 100644 --- a/Tests/CSharp/Diagnostics/RedundantPrivateInspectorTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantPrivateInspectorTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantPrivateInspectorTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestInspectorCase1() { Analyze(@"class Foo @@ -25,7 +24,7 @@ void Bar(string str) } - [Test] + [Fact] public void TestNestedClass() { Analyze(@"class Foo @@ -41,7 +40,7 @@ class Nested }"); } - [Test] + [Fact] public void TestNoModifiers() { Analyze(@"class Foo diff --git a/Tests/CSharp/Diagnostics/RedundantStringToCharArrayCallTests.cs b/Tests/CSharp/Diagnostics/RedundantStringToCharArrayCallTests.cs index c0a320cc..21b945f9 100644 --- a/Tests/CSharp/Diagnostics/RedundantStringToCharArrayCallTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantStringToCharArrayCallTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantStringToCharArrayCallTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSimpleForeachCase() { Analyze(@" @@ -34,7 +33,7 @@ public void Test (string str) "); } - [Test] + [Fact] public void TestForeachEachWichParametrizedCharToArray() { Analyze(@" @@ -51,7 +50,7 @@ public void Test (string str) "); } - [Test] + [Fact] public void TestVarForeachCase() { Analyze(@" @@ -79,7 +78,7 @@ public void Test (string str) "); } - [Test] + [Fact] public void TestIndexerCase() { Analyze(@" @@ -104,7 +103,7 @@ public void Test (string str) } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantTernaryExpressionTests.cs b/Tests/CSharp/Diagnostics/RedundantTernaryExpressionTests.cs index 4f5d3612..ca35f337 100644 --- a/Tests/CSharp/Diagnostics/RedundantTernaryExpressionTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantTernaryExpressionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantTernaryExpressionTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestTrueFalseCase() { Analyze(@" @@ -28,7 +27,7 @@ void Bar () "); } - [Test] + [Fact] public void TestDisable() { Analyze(@" @@ -43,7 +42,7 @@ void Bar () "); } - [Test] + [Fact] public void TestExceptionCastNotValid() { Analyze(@"namespace Test diff --git a/Tests/CSharp/Diagnostics/RedundantToStringCallTests.cs b/Tests/CSharp/Diagnostics/RedundantToStringCallTests.cs index 469acd55..cf1ce343 100644 --- a/Tests/CSharp/Diagnostics/RedundantToStringCallTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantToStringCallTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantToStringCallTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void ConcatenationOperator() { Analyze(@" @@ -26,7 +25,7 @@ void Bar (object i) }", 0); } - [Test] + [Fact] public void TestValueTypes() { Analyze(@" @@ -40,7 +39,7 @@ void Bar (int i) } - [Test] + [Fact] public void ConcatenationOperatorWithToStringAsOnlyString() { Analyze(@" @@ -53,7 +52,7 @@ void Bar (int i) }"); } - [Test] + [Fact] public void IgnoresCallsToIFormattableToString() { Analyze(@" @@ -66,7 +65,7 @@ void Bar (System.DateTime dt) }"); } - [Test] + [Fact] public void StringTarget() { Analyze(@" @@ -88,7 +87,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void FormatStringTests() { Analyze(@" @@ -108,7 +107,7 @@ void Bar (object i) }"); } - [Test] + [Fact] public void HandlesNonLiteralFormatParameter() { Analyze(@" @@ -130,8 +129,7 @@ void Bar (object i) }"); } - [Ignore("Not supported")] - [Test] + [Fact(Skip="Not supported")] public void FormatStringWithNonObjectParameterTests() { Analyze(@" @@ -165,8 +163,7 @@ void FakeFormat(string format, params object[] arg1) }"); } - [Ignore("Not supported")] - [Test] + [Fact(Skip="Not supported")] public void FormatMethodWithObjectParamsArray() { Analyze(@" @@ -194,7 +191,7 @@ void FakeFormat(string format, params object[] args) }"); } - [Test] + [Fact] public void DetectsBlacklistedCalls() { Analyze(@" @@ -218,7 +215,7 @@ void Bar (object i) }"); } - [Test] + [Fact] public void ConcatenationOperator2() { Analyze(@" @@ -231,7 +228,7 @@ void Bar (int i) }"); } - [Test] + [Fact] public void TestReferenceTypes2() { Analyze(@" @@ -244,7 +241,7 @@ void Bar (object i) }"); } - [Test] + [Fact] public void ConcatenationOperatorWithToStringAsOnlyString2() { Analyze(@" @@ -257,7 +254,7 @@ void Bar (int i) }"); } - [Test] + [Fact] public void IgnoresCallsToIFormattableToString2() { Analyze(@" @@ -270,7 +267,7 @@ void Bar (System.DateTime dt) }"); } - [Test] + [Fact] public void FormatStringTests2() { Analyze(@" @@ -283,7 +280,7 @@ void Bar (int i) }"); } - [Test] + [Fact] public void HandlesNonLiteralFormatParameter2() { Analyze(@" @@ -297,8 +294,7 @@ void Bar (int i) }"); } - [Ignore("Not supported")] - [Test] + [Fact(Skip="Not supported")] public void FormatStringWithNonObjectParameterTests2() { Analyze(@" @@ -318,8 +314,7 @@ void FakeFormat(string format, params object[] args) }"); } - [Ignore("Not supported")] - [Test] + [Fact(Skip="Not supported")] public void FormatMethodWithObjectParamsArray2() { Analyze(@" @@ -336,7 +331,7 @@ void FakeFormat(string format, params object[] args) }"); } - [Test] + [Fact] public void DetectsBlacklistedCalls2() { Analyze(@" @@ -354,7 +349,7 @@ void Bar (int i) /// /// Bug 39162 - Incorrect "Redundant ToString() call" /// - [Test] + [Fact] public void TestBug39162() { Analyze(@" @@ -368,7 +363,7 @@ void Bar (object i) } - [Test] + [Fact] public void TestNoRedundantParameter() { Analyze(@" @@ -383,7 +378,7 @@ void Foo (string s) {} }"); } - [Test] + [Fact] public void TestIgnoresShadowedToStringInConcatenation() { Analyze(@" @@ -404,7 +399,7 @@ void Bar (ClassShadowingToString v) }"); } - [Test] + [Fact] public void TestIgnoresShadowedToStringInFormatParameter() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RedundantUnsafeContextTests.cs b/Tests/CSharp/Diagnostics/RedundantUnsafeContextTests.cs index 02401f93..beaef827 100644 --- a/Tests/CSharp/Diagnostics/RedundantUnsafeContextTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantUnsafeContextTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RedundantUnsafeContextTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestUnsafeClass() { Analyze(@"$unsafe$ class Foo @@ -26,7 +25,7 @@ public static void Main(string[] args) "); } - [Test] + [Fact] public void TestUnsafeStatement() { Analyze(@" @@ -52,7 +51,7 @@ public static void Main(string[] args) "); } - [Test] + [Fact] public void TestNestedUnsafeStatement() { Analyze(@" @@ -83,7 +82,7 @@ static void Main(string str) "); } - [Test] + [Fact] public void TestValidFixedPointer() { Analyze(@" @@ -94,7 +93,7 @@ unsafe struct Foo { } - [Test] + [Fact] public void TestDisable() { Analyze(@" @@ -109,7 +108,7 @@ public static void Main(string[] args) "); } - [Test] + [Fact] public void TestSizeOf() { Analyze(@" @@ -126,7 +125,7 @@ public static void Main(String[] args) }"); } - [Test] + [Fact] public void TestFixed() { Analyze(@" @@ -140,7 +139,7 @@ unsafe struct TestStruct "); } - [Test] + [Fact] public void TestUnsafeProperty() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/ReferenceEqualsWithValueTypeTests.cs b/Tests/CSharp/Diagnostics/ReferenceEqualsWithValueTypeTests.cs index 850c92cb..d66d8020 100644 --- a/Tests/CSharp/Diagnostics/ReferenceEqualsWithValueTypeTests.cs +++ b/Tests/CSharp/Diagnostics/ReferenceEqualsWithValueTypeTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class ReferenceEqualsWithValueTypeTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestValueTypeCase1() { Test(@" @@ -28,7 +26,7 @@ void TestMethod (int i, int j) } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestValueTypeCase2() { Test(@" @@ -48,7 +46,7 @@ void TestMethod (int i, int j) }", 1); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNoIssue() { var input = @" @@ -63,7 +61,7 @@ void TestMethod (object i, T j) Test(input, 0); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/RemoveRedundantOrStatementTests.cs b/Tests/CSharp/Diagnostics/RemoveRedundantOrStatementTests.cs index 39331bb1..55b32b97 100644 --- a/Tests/CSharp/Diagnostics/RemoveRedundantOrStatementTests.cs +++ b/Tests/CSharp/Diagnostics/RemoveRedundantOrStatementTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RemoveRedundantOrStatementTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestOrCase() { Analyze(@" @@ -29,7 +28,7 @@ public static void Main(string[] args) "); } - [Test] + [Fact] public void TestAndCase() { Analyze(@" @@ -53,7 +52,7 @@ public static void Main(string[] args) } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/ReplaceWithFirstOrDefaultTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithFirstOrDefaultTests.cs index 633a1713..095ab922 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithFirstOrDefaultTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithFirstOrDefaultTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithFirstOrDefaultTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestBasicCase() { Analyze(@"using System.Linq; @@ -26,7 +25,7 @@ public void FooBar(string[] args) }"); } - [Test] + [Fact] public void TestBasicCaseWithExpression() { Analyze(@"using System.Linq; @@ -46,7 +45,7 @@ public void FooBar(string[] args) }"); } - [Test] + [Fact] public void TestBasicCaseWithDefault() { Analyze(@"using System.Linq; @@ -66,7 +65,7 @@ public void FooBar(T[] args) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithLastOrDefaultTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithLastOrDefaultTests.cs index 79da927a..6d413578 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithLastOrDefaultTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithLastOrDefaultTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithLastOrDefaultTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestBasicCase() { Analyze(@"using System.Linq; @@ -26,7 +25,7 @@ public void FooBar(string[] args) }"); } - [Test] + [Fact] public void TestBasicCaseWithExpression() { Analyze(@"using System.Linq; @@ -46,7 +45,7 @@ public void FooBar(string[] args) }"); } - [Test] + [Fact] public void TestBasicCaseWithDefault() { Analyze(@"using System.Linq; @@ -66,7 +65,7 @@ public void FooBar(T[] args) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeAnyTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeAnyTests.cs index d68b5a37..ef20e0cb 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeAnyTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeAnyTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithOfTypeAnyTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestCaseBasic() { Analyze(@"using System.Linq; @@ -26,7 +25,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestCaseBasicWithFollowUpExpresison() { Analyze(@"using System.Linq; @@ -46,7 +45,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; @@ -60,7 +59,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestJunk() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeCountTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeCountTests.cs index ffa3fb5d..f78f97cf 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeCountTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeCountTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithOfTypeCountTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestCaseBasic() { Analyze(@"using System.Linq; @@ -26,7 +25,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestCaseBasicWithFollowUpExpresison() { Analyze(@"using System.Linq; @@ -46,7 +45,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; @@ -60,7 +59,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestJunk() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeFirstOrDefaultTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeFirstOrDefaultTests.cs index 7a90e698..f2e84201 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeFirstOrDefaultTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeFirstOrDefaultTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithOfTypeFirstOrDefaultTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestCaseBasic() { Analyze(@"using System.Linq; @@ -26,7 +25,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestCaseBasicWithFollowUpExpression() { Analyze(@"using System.Linq; @@ -46,7 +45,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; @@ -60,7 +59,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestJunk() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeFirstTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeFirstTests.cs index e837326b..7b37254b 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeFirstTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeFirstTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithOfTypeFirstTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestCaseBasic() { Analyze(@"using System.Linq; @@ -26,7 +25,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestCaseBasicWithFollowUpExpresison() { Analyze(@"using System.Linq; @@ -46,7 +45,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; @@ -60,7 +59,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestJunk() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeLastOrDefaultTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeLastOrDefaultTests.cs index 49892710..de00764b 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeLastOrDefaultTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeLastOrDefaultTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithOfTypeLastOrDefaultTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestCaseBasic() { Analyze(@"using System.Linq; @@ -26,7 +25,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestCaseBasicWithFollowUpExpresison() { Analyze(@"using System.Linq; @@ -46,7 +45,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; @@ -60,7 +59,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestJunk() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeLastTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeLastTests.cs index 85c9dfc1..495bd86e 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeLastTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeLastTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithOfTypeLastTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestCaseBasic() { Analyze(@"using System.Linq; @@ -26,7 +25,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestCaseBasicWithFollowUpExpresison() { Analyze(@"using System.Linq; @@ -46,7 +45,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; @@ -60,7 +59,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestJunk() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeLongCountTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeLongCountTests.cs index 79322c98..92c82b06 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeLongCountTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeLongCountTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithOfTypeLongCountTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestCaseBasic() { Analyze(@"using System.Linq; @@ -26,7 +25,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestCaseBasicWithFollowUpExpresison() { Analyze(@"using System.Linq; @@ -46,7 +45,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; @@ -60,7 +59,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestJunk() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeSingleOrDefaultTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeSingleOrDefaultTests.cs index 56b2085d..a06c1bcb 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeSingleOrDefaultTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeSingleOrDefaultTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithOfTypeSingleOrDefaultTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestCaseBasic() { Analyze(@"using System.Linq; @@ -26,7 +25,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestCaseBasicWithFollowUpExpresison() { Analyze(@"using System.Linq; @@ -46,7 +45,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; @@ -60,7 +59,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestJunk() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeSingleTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeSingleTests.cs index a8c09ecc..5d66cafc 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeSingleTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeSingleTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithOfTypeSingleTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestCaseBasic() { Analyze(@"using System.Linq; @@ -26,7 +25,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestCaseBasicWithFollowUpExpresison() { Analyze(@"using System.Linq; @@ -46,7 +45,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; @@ -60,7 +59,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestJunk() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeTests.cs index 32615179..701abb25 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithOfTypeTests : CSharpDiagnosticTestBase { - [Test] - [Ignore("Does this even make sense? There's no SelectNotNull method!")] + [Fact(Skip="Does this even make sense? There's no SelectNotNull method!")] public void TestCaseSelectNotNull() { Analyze(@"using System.Linq; @@ -42,8 +40,7 @@ public void Foo(object[] obj) }"); } - [Test] - [Ignore("Does this even make sense? There's no SelectNotNull method!")] + [Fact(Skip="Does this even make sense? There's no SelectNotNull method!")] public void TestCaseSelectNotNullWithParentheses() { Analyze(@"using System.Linq; @@ -79,7 +76,7 @@ public void Foo(object[] obj) } - [Test] + [Fact] public void TestCaseSelectWhereCase1() { Analyze(@"using System.Linq; @@ -115,7 +112,7 @@ public void Foo(object[] obj) //}"); } - [Test] + [Fact] public void TestCaseSelectWhereGarbage() { Analyze(@"using System.Linq; @@ -137,7 +134,7 @@ public void Foo(object[] obj) } - [Test] + [Fact] public void TestCaseSelectWhereCase2WithParens() { Analyze(@"using System.Linq; @@ -176,7 +173,7 @@ public void Foo(object[] obj) - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeWhereTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeWhereTests.cs index 659ec97d..697d879e 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeWhereTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeWhereTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithOfTypeWhereTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestCaseBasicWithFollowUpExpresison() { Analyze(@"using System.Linq; @@ -26,7 +25,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; @@ -40,7 +39,7 @@ public void Foo(object[] obj) }"); } - [Test] + [Fact] public void TestJunk() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithSimpleAssignmentTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithSimpleAssignmentTests.cs index 715e79f1..9c3cb266 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithSimpleAssignmentTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithSimpleAssignmentTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithSimpleAssignmentTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestOrCase() { Analyze(@" @@ -28,7 +27,7 @@ void Foo (bool b) "); } - [Test] + [Fact] public void TestAndCase() { Analyze(@" @@ -50,7 +49,7 @@ void Foo (bool b) "); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToCountTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToCountTests.cs index bd93d5c8..861ac757 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToCountTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToCountTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithSingleCallToCountTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSimpleCase() { Analyze(@"using System.Linq; @@ -24,7 +23,7 @@ public void Bla () { }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToFirstOrDefaultTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToFirstOrDefaultTests.cs index 6433908f..7dd5945d 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToFirstOrDefaultTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToFirstOrDefaultTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithSingleCallToFirstOrDefaultTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSimpleCase() { Analyze(@"using System.Linq; @@ -24,7 +23,7 @@ public void Bla () { }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToFirstTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToFirstTests.cs index 3f71a4aa..44dfc3aa 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToFirstTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToFirstTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithSingleCallToFirstTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSimpleCase() { Analyze(@"using System.Linq; @@ -24,7 +23,7 @@ public void Bla () { }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToLastOrDefaultTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToLastOrDefaultTests.cs index 3dcf6012..c2841aeb 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToLastOrDefaultTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToLastOrDefaultTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithSingleCallToLastOrDefaultTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSimpleCase() { Analyze(@"using System.Linq; @@ -24,7 +23,7 @@ public void Bla () { }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToLastTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToLastTests.cs index 764c4332..fd4dc040 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToLastTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToLastTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithSingleCallToLastTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSimpleCase() { Analyze(@"using System.Linq; @@ -24,7 +23,7 @@ public void Bla () { }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToLongCountTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToLongCountTests.cs index 15cc08e7..4f1e9291 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToLongCountTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToLongCountTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithSingleCallToLongCountTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSimpleCase() { Analyze(@"using System.Linq; @@ -24,7 +23,7 @@ public void Bla () { }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToSingleOrDefaultTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToSingleOrDefaultTests.cs index 84ad43dc..7da965f2 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToSingleOrDefaultTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToSingleOrDefaultTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithSingleCallToSingleOrDefaultTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSimpleCase() { Analyze(@"using System.Linq; @@ -24,7 +23,7 @@ public void Bla () { }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToSingleTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToSingleTests.cs index 33f4dd3a..7e058422 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToSingleTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithSingleCallToSingleTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithSingleCallToSingleTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSimpleCase() { Analyze(@"using System.Linq; @@ -24,7 +23,7 @@ public void Bla () { }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System.Linq; diff --git a/Tests/CSharp/Diagnostics/ReplaceWithStringIsNullOrEmptyTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithStringIsNullOrEmptyTests.cs index 8e1092d9..6ee9dde0 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithStringIsNullOrEmptyTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithStringIsNullOrEmptyTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ReplaceWithStringIsNullOrEmptyTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestMemberAccessCase() { Analyze( @@ -29,7 +28,7 @@ void Bar () }"); } - [Test] + [Fact] public void TestToStringCase() { Analyze( @@ -52,7 +51,7 @@ void Bar (StringBuilder str) }"); } - [Test] + [Fact] public void TestInspectorCaseNS1() { Analyze(@"class Foo @@ -70,7 +69,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorCaseNS2() { Analyze(@"class Foo @@ -88,7 +87,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorNegatedStringEmpty() { Analyze(@"class Foo @@ -106,7 +105,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorStringEmpty() { Analyze(@"class Foo @@ -124,7 +123,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorStringEmptyAlt() { Analyze(@"class Foo @@ -142,7 +141,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorCaseNS3() { Analyze(@"class Foo @@ -160,7 +159,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorCaseNS4() { Analyze(@"class Foo @@ -178,7 +177,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorCaseSN1() { Analyze(@"class Foo @@ -196,7 +195,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorCaseSN2() { Analyze(@"class Foo @@ -214,7 +213,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorCaseSN3() { Analyze(@"class Foo @@ -233,7 +232,7 @@ void Bar (string str) } - [Test] + [Fact] public void TestInspectorCaseSN4() { Analyze(@"class Foo @@ -251,7 +250,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorCaseNS5() { Analyze(@"class Foo @@ -269,7 +268,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorCaseNS6() { Analyze(@"class Foo @@ -287,7 +286,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorCaseNS7() { Analyze(@"class Foo @@ -305,7 +304,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorCaseNS8() { Analyze(@"class Foo @@ -323,7 +322,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorCaseSN5() { Analyze(@"class Foo @@ -341,7 +340,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorCaseSN6() { Analyze(@"class Foo @@ -359,7 +358,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorCaseSN7() { Analyze(@"class Foo @@ -377,7 +376,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestInspectorCaseSN8() { Analyze(@"class Foo @@ -395,10 +394,10 @@ void Bar (string str) }"); } - [TestCase("str == null || str.Length == 0")] - [TestCase("str == null || 0 == str.Length")] - [TestCase("null == str || str.Length == 0")] - [TestCase("null == str || 0 == str.Length")] + [InlineData("str == null || str.Length == 0")] + [InlineData("str == null || 0 == str.Length")] + [InlineData("null == str || str.Length == 0")] + [InlineData("null == str || 0 == str.Length")] public void TestInspectorCaseNL(string expression) { Analyze(@"class Foo @@ -416,12 +415,12 @@ void Bar (string str) }"); } - [TestCase("str != null && str.Length != 0")] - [TestCase("str != null && 0 != str.Length")] - [TestCase("str != null && str.Length > 0")] - [TestCase("null != str && str.Length != 0")] - [TestCase("null != str && 0 != str.Length")] - [TestCase("null != str && str.Length > 0")] + [InlineData("str != null && str.Length != 0")] + [InlineData("str != null && 0 != str.Length")] + [InlineData("str != null && str.Length > 0")] + [InlineData("null != str && str.Length != 0")] + [InlineData("null != str && 0 != str.Length")] + [InlineData("null != str && str.Length > 0")] public void TestInspectorCaseLN(string expression) { Analyze(@"class Foo @@ -439,7 +438,7 @@ void Bar (string str) }"); } - [Test] + [Fact] public void TestArrays() { Analyze(@"class Foo @@ -453,7 +452,7 @@ void Bar () }"); } - [Test] + [Fact] public void TestLists() { Analyze(@" @@ -470,7 +469,7 @@ void Bar () }"); } - [Test] + [Fact] public void TestInspectorCaseNS1WithParentheses() { Analyze(@"class Foo diff --git a/Tests/CSharp/Diagnostics/RoslynUsageTests.cs b/Tests/CSharp/Diagnostics/RoslynUsageTests.cs index 3eb67603..63f362aa 100644 --- a/Tests/CSharp/Diagnostics/RoslynUsageTests.cs +++ b/Tests/CSharp/Diagnostics/RoslynUsageTests.cs @@ -1,9 +1,8 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class RoslynUsageTests : CSharpDiagnosticTestBase { const string attributeFakes = @" @@ -56,7 +55,7 @@ class ExportCodeRefactoringProviderAttribute : Attribute } "; - [Test] + [Fact] public void ForbiddenMethodInAnalyzer() { Analyze(attributeFakes + @" @@ -79,7 +78,7 @@ public TestAnalyzer() }"); } - [Test] + [Fact] public void ForbiddenClassInAnalyzer() { Analyze(attributeFakes + @" @@ -102,7 +101,7 @@ public TestAnalyzer() }"); } - [Test] + [Fact] public void ForbiddenMethodInCodeFix() { Analyze(attributeFakes + @" @@ -125,7 +124,7 @@ public TestCodeFix() }"); } - [Test] + [Fact] public void ForbiddenMethodInRefactoring() { Analyze(attributeFakes + @" @@ -148,7 +147,7 @@ public TestRefactoring() }"); } - [Test] + [Fact] public void ForbiddenCallToCodeFixMethodInAnalyzer() { Analyze(attributeFakes + @" @@ -170,7 +169,7 @@ public TestAnalyzer() }"); } - [Test] + [Fact] public void AllowedCallToAnalyzerMethodInCodeFix() { Analyze(attributeFakes + @" @@ -192,7 +191,7 @@ public static void SomeUtilityMethod() }"); } - [Test] + [Fact] public void AllowedMethodInAnalyzer1() { Analyze(attributeFakes + @" @@ -215,7 +214,7 @@ public TestAnalyzer() }"); } - [Test] + [Fact] public void AllowedMethodInAnalyzer2() { Analyze(attributeFakes + @" @@ -238,7 +237,7 @@ public TestAnalyzer() }"); } - [Test] + [Fact] public void AllowedMethodInAnalyzer3() { Analyze(attributeFakes + @" @@ -260,7 +259,7 @@ public TestAnalyzer() }"); } - [Test] + [Fact] public void MethodNotInAnalyzer() { Analyze(attributeFakes + @" diff --git a/Tests/CSharp/Diagnostics/SealedMemberInSealedClassTests.cs b/Tests/CSharp/Diagnostics/SealedMemberInSealedClassTests.cs index a212a37a..4f4a7e46 100644 --- a/Tests/CSharp/Diagnostics/SealedMemberInSealedClassTests.cs +++ b/Tests/CSharp/Diagnostics/SealedMemberInSealedClassTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class SealedMemberInSealedClassTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestBasicCase() { Analyze(@" @@ -28,7 +27,7 @@ public override string ToString() "); } - [Test] + [Fact] public void TestFieldDeclaration() { Analyze(@" @@ -39,7 +38,7 @@ public sealed class Foo "); } - [Test] + [Fact] public void TestValid() { Analyze(@" @@ -54,7 +53,7 @@ public sealed override string ToString() } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/SimplifyConditionalTernaryExpressionTests.cs b/Tests/CSharp/Diagnostics/SimplifyConditionalTernaryExpressionTests.cs index d54d44fa..2fb52c41 100644 --- a/Tests/CSharp/Diagnostics/SimplifyConditionalTernaryExpressionTests.cs +++ b/Tests/CSharp/Diagnostics/SimplifyConditionalTernaryExpressionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class SimplifyConditionalTernaryExpressionTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestFalseTrueCase() { Analyze(@" @@ -28,7 +27,7 @@ void Bar () "); } - [Test] + [Fact] public void TestFalseTrueCase2() { Analyze(@" @@ -50,7 +49,7 @@ void Bar () "); } - [Test] + [Fact] public void TestFalseExprCase() { Analyze(@" @@ -72,7 +71,7 @@ void FooBar (int a, int b, bool c) "); } - [Test] + [Fact] public void TestTrueExprCase() { Analyze(@" @@ -94,7 +93,7 @@ void FooBar (int a, int b, bool c) "); } - [Test] + [Fact] public void TestExprFalseCase() { Analyze(@" @@ -116,7 +115,7 @@ void FooBar (int a, int b, bool c) "); } - [Test] + [Fact] public void TestExprTrueCase() { Analyze(@" @@ -138,7 +137,7 @@ void FooBar (int a, int b, bool c) "); } - [Test] + [Fact] public void TestInvalidCase() { Analyze(@" @@ -152,7 +151,7 @@ void FooBar (int a, int b, bool c, boold d) } - [Test] + [Fact] public void TestDisable() { Analyze(@" @@ -168,7 +167,7 @@ void Bar () } - [Test] + [Fact] public void TestSkipRedundantCase() { Analyze(@" @@ -185,7 +184,7 @@ void Bar () /// /// Bug 26669 - Source analysis "simplify conditional expression" generates invalid C# condition /// - [Test] + [Fact] public void TestBug26669() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/StaticConstructorParameterTests.cs b/Tests/CSharp/Diagnostics/StaticConstructorParameterTests.cs index d21f9db8..427cdb8e 100644 --- a/Tests/CSharp/Diagnostics/StaticConstructorParameterTests.cs +++ b/Tests/CSharp/Diagnostics/StaticConstructorParameterTests.cs @@ -1,44 +1,40 @@ -using NUnit.Framework; - namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [Ignore("Should be a code fix")] - [TestFixture] - public class StaticConstructorParameterTests : CSharpDiagnosticTestBase + public class StaticConstructorParameterTests : CSharpDiagnosticTestBase { - // [Test] - // public void TestSimpleCase() - // { - // Analyze(@" - //class Foo - //{ - // static $Foo$(int bar) - // { - // } - //} - //", @" - //class Foo - //{ - // static Foo() - // { - // } - //} - //"); - // } + // [Fact(Skip="Should be a code fix")] + // public void TestSimpleCase() + // { + // Analyze(@" + //class Foo + //{ + // static $Foo$(int bar) + // { + // } + //} + //", @" + //class Foo + //{ + // static Foo() + // { + // } + //} + //"); + // } - // [Test] - // public void TestNoIssue() - // { - // Analyze(@" - //class Foo - //{ - // static Foo () - // { - // } - //} - //"); - // } + // [Fact(Skip="Should be a code fix")] + // public void TestNoIssue() + // { + // Analyze(@" + //class Foo + //{ + // static Foo () + // { + // } + //} + //"); + // } - } + } } diff --git a/Tests/CSharp/Diagnostics/StaticEventSubscriptionTests.cs b/Tests/CSharp/Diagnostics/StaticEventSubscriptionTests.cs index 95b1b26b..69b5eb81 100644 --- a/Tests/CSharp/Diagnostics/StaticEventSubscriptionTests.cs +++ b/Tests/CSharp/Diagnostics/StaticEventSubscriptionTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class StaticEventSubscriptionTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAnonymousMethodSubscription() { @@ -28,7 +26,7 @@ public void Test () "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAnonymousMethodSubscription_ValidCase() { Analyze(@" @@ -49,7 +47,7 @@ public static void Test () } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestIssue() { TestIssue(@" @@ -70,7 +68,7 @@ void MyMethod (object sender, EventArgs args) "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNoIssue() { Analyze(@" @@ -96,7 +94,7 @@ void MyMethod (object sender, EventArgs args) "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNonStatic() { Analyze(@" @@ -118,7 +116,7 @@ void MyMethod (object sender, EventArgs args) "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNullAssignment() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/StaticFieldOrAutoPropertyInGenericTypeTests.cs b/Tests/CSharp/Diagnostics/StaticFieldOrAutoPropertyInGenericTypeTests.cs index 2ba152e6..0029cae0 100644 --- a/Tests/CSharp/Diagnostics/StaticFieldOrAutoPropertyInGenericTypeTests.cs +++ b/Tests/CSharp/Diagnostics/StaticFieldOrAutoPropertyInGenericTypeTests.cs @@ -1,13 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class StaticFieldOrAutoPropertyInGenericTypeTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void GenericClass() { Analyze(@" @@ -18,7 +17,7 @@ class Foo } - [Test] + [Fact] public void AutoProperty() { Analyze(@" @@ -28,7 +27,7 @@ class Foo }"); } - [Test] + [Fact] public void GenericClassWithGenericField() { Analyze(@" @@ -38,7 +37,7 @@ class Foo }"); } - [Test] + [Fact] public void GenericClassWithMultipleGenericFields() { Analyze(@" @@ -48,7 +47,7 @@ class Foo }"); } - [Test] + [Fact] public void NestedGenericClassWithGenericField() { Analyze(@" @@ -61,7 +60,7 @@ class Bar }"); } - [Test] + [Fact] public void NonGenericClass() { Analyze(@" @@ -71,7 +70,7 @@ class Foo }"); } - [Test] + [Fact] public void NonStaticField() { Analyze(@" @@ -81,8 +80,7 @@ class Foo }"); } - [Ignore("Not yet supported")] - [Test] + [Fact(Skip="Not yet supported")] public void TestMicrosoftSuppressMessage() { TestIssue(@"using System.Diagnostics.CodeAnalysis; @@ -96,8 +94,7 @@ class Foo }"); } - [Ignore("Not yet supported")] - [Test] + [Fact(Skip="Not yet supported")] public void TestAssemblyMicrosoftSuppressMessage() { Analyze(@"using System.Diagnostics.CodeAnalysis; @@ -112,7 +109,7 @@ class Foo }"); } - [Test] + [Fact] public void TestDisable() { var input = @"using System.Diagnostics.CodeAnalysis; diff --git a/Tests/CSharp/Diagnostics/StaticMethodInvocationToExtensionMethodInvocationTests.cs b/Tests/CSharp/Diagnostics/StaticMethodInvocationToExtensionMethodInvocationTests.cs index 664bbc6d..da955f65 100644 --- a/Tests/CSharp/Diagnostics/StaticMethodInvocationToExtensionMethodInvocationTests.cs +++ b/Tests/CSharp/Diagnostics/StaticMethodInvocationToExtensionMethodInvocationTests.cs @@ -1,13 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class StaticMethodInvocationToExtensionMethodInvocationTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void HandlesBasicCase() { Analyze(@" @@ -39,7 +38,7 @@ void F() }"); } - [Test] + [Fact] public void HandlesBasicCaseWithComment() { Analyze(@" @@ -73,7 +72,7 @@ void F() }"); } - [Test] + [Fact] public void HandlesBasicCaseWithFullNamespace() { Analyze(@" @@ -95,7 +94,7 @@ void F() }"); } - [Test] + [Fact] public void HandlesReturnValueUsage() { Analyze(@" @@ -129,7 +128,7 @@ void F() }"); } - [Test] + [Fact] public void IgnoresIfNullArgument() { Analyze(@" @@ -147,7 +146,7 @@ void F() }"); } - [Test] + [Fact] public void IgnoresIfNotExtensionMethod() { Analyze(@" @@ -165,7 +164,7 @@ void F() }"); } - [Test] + [Fact] public void IgnoresIfAlreadyExtensionMethodCallSyntax() { Analyze(@" @@ -184,7 +183,7 @@ void F() }"); } - [Test] + [Fact] public void IgnoresPropertyInvocation() { Analyze(@" @@ -201,7 +200,7 @@ void F() }"); } - [Test] + [Fact] public void IgnoresTypeMismatchImplicitConversion() { Analyze(@" @@ -246,7 +245,7 @@ static void Main() }"); } - [Test] + [Fact] public void HandlesDelegateExtensionMethodOnVariable() { Analyze(@" @@ -282,7 +281,7 @@ void F() }"); } - [Test] + [Fact] public void AddParenthesesIfNecessary() { Analyze(@"using System; @@ -314,7 +313,7 @@ static void Main() }"); } - [Test] + [Fact] public void IgnoresDelegateExtensionMethodOnMethod() { Analyze(@"using System; @@ -338,7 +337,7 @@ void PrintIntHandler(int i) }"); } - [Test] + [Fact] public void IgnoresLambdaAsExtensionMethodParameter() { Analyze(@"using System; @@ -357,7 +356,7 @@ void F() }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/StringCompareIsCultureSpecificTests.cs b/Tests/CSharp/Diagnostics/StringCompareIsCultureSpecificTests.cs index 8fd2fde0..eea5d0fb 100644 --- a/Tests/CSharp/Diagnostics/StringCompareIsCultureSpecificTests.cs +++ b/Tests/CSharp/Diagnostics/StringCompareIsCultureSpecificTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class StringCompareIsCultureSpecificTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestCase1() { Analyze(@" @@ -26,7 +25,7 @@ void Foo () }"); } - [Test] + [Fact] public void TestInvalidCase1() { Analyze(@" @@ -39,7 +38,7 @@ void Foo () }"); } - [Test] + [Fact] public void TestCase2() { Analyze(@" @@ -59,7 +58,7 @@ void Foo () }"); } - [Test] + [Fact] public void TestInvalidCase2() { Analyze(@" @@ -72,7 +71,7 @@ void Foo () }"); } - [Test] + [Fact] public void TestCase3() { Analyze(@" @@ -92,7 +91,7 @@ void Foo () }"); } - [Test] + [Fact] public void TestCase4() { Analyze(@" @@ -112,7 +111,7 @@ void Foo () }"); } - [Test] + [Fact] public void TestInvalidCase4() { Analyze(@" @@ -125,7 +124,7 @@ void Foo () }"); } - [Test] + [Fact] public void TestCase5() { Analyze(@" @@ -145,7 +144,7 @@ void Foo () }"); } - [Test] + [Fact] public void TestCase6() { Analyze(@" @@ -165,7 +164,7 @@ void Foo () }"); } - [Test] + [Fact] public void TestInvalid() { Analyze(@" @@ -178,7 +177,7 @@ void Foo () }"); } - [Test] + [Fact] public void TestComplex() { Analyze(@" @@ -198,7 +197,7 @@ void Foo (bool b) }"); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/StringCompareToIsCultureSpecificTests.cs b/Tests/CSharp/Diagnostics/StringCompareToIsCultureSpecificTests.cs index 73a3fde5..61e10082 100644 --- a/Tests/CSharp/Diagnostics/StringCompareToIsCultureSpecificTests.cs +++ b/Tests/CSharp/Diagnostics/StringCompareToIsCultureSpecificTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class StringCompareToIsCultureSpecificTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestSimpleCase() { Analyze(@" @@ -28,7 +27,7 @@ void Foo (string b) "); } - [Test] + [Fact] public void TestInvalidCase() { Analyze(@" @@ -43,7 +42,7 @@ void Foo (object b) } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/StringEndsWithIsCultureSpecificTests.cs b/Tests/CSharp/Diagnostics/StringEndsWithIsCultureSpecificTests.cs index 11331550..6aa6eea6 100644 --- a/Tests/CSharp/Diagnostics/StringEndsWithIsCultureSpecificTests.cs +++ b/Tests/CSharp/Diagnostics/StringEndsWithIsCultureSpecificTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class StringEndsWithIsCultureSpecificTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestEndsWith() { Analyze(@" @@ -28,7 +27,7 @@ public void Foo (string bar) "); } - [Test] + [Fact] public void TestEndsWithStringComparisonOverload() { Analyze(@" @@ -42,7 +41,7 @@ public void Foo (string bar) "); } - [Test] + [Fact] public void TestEndsWithCultureInfoOverload() { Analyze(@" @@ -56,7 +55,7 @@ public void Foo (string bar) "); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/StringIndexOfIsCultureSpecificTests.cs b/Tests/CSharp/Diagnostics/StringIndexOfIsCultureSpecificTests.cs index 6e6a5cf1..62cb10fc 100644 --- a/Tests/CSharp/Diagnostics/StringIndexOfIsCultureSpecificTests.cs +++ b/Tests/CSharp/Diagnostics/StringIndexOfIsCultureSpecificTests.cs @@ -1,9 +1,8 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class StringIndexOfIsCultureSpecificTests : CSharpDiagnosticTestBase { const string stringIndexOfStringCalls = @" @@ -29,19 +28,19 @@ public void StringIndexOfStringCalls(List list) } }"; - [Test] + [Fact] public void IndexOfStringCalls() { Analyze(stringIndexOfStringCalls, stringIndexOfStringCallsWithComparison); } - [Test] + [Fact] public void IndexOfStringCallsAlreadyWithComparison() { Analyze(stringIndexOfStringCallsWithComparison); } - [Test] + [Fact] public void StringIndexOfChar() { string program = @"using System; @@ -53,7 +52,7 @@ void M(string text) { Analyze(program); } - [Test] + [Fact] public void ListIndexOf() { string program = @"using System.Collections.Generic; @@ -66,7 +65,7 @@ void M(List list) { } - [Test] + [Fact] public void TestDisable() { Analyze(@"using System; diff --git a/Tests/CSharp/Diagnostics/StringLastIndexOfIsCultureSpecificTests.cs b/Tests/CSharp/Diagnostics/StringLastIndexOfIsCultureSpecificTests.cs index 0addf687..64b0b6fc 100644 --- a/Tests/CSharp/Diagnostics/StringLastIndexOfIsCultureSpecificTests.cs +++ b/Tests/CSharp/Diagnostics/StringLastIndexOfIsCultureSpecificTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class StringLastIndexOfIsCultureSpecificTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestLastIndexOf() { Analyze(@" @@ -28,7 +27,7 @@ public void Foo (string bar) "); } - [Test] + [Fact] public void TestBug() { Analyze(@" @@ -54,7 +53,7 @@ static void Main(string [] args, string fooBar) "); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/StringStartsWithIsCultureSpecificTests.cs b/Tests/CSharp/Diagnostics/StringStartsWithIsCultureSpecificTests.cs index 1253481b..35c6c653 100644 --- a/Tests/CSharp/Diagnostics/StringStartsWithIsCultureSpecificTests.cs +++ b/Tests/CSharp/Diagnostics/StringStartsWithIsCultureSpecificTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class StringStartsWithIsCultureSpecificTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestStartsWith() { Analyze(@" @@ -28,7 +27,7 @@ public void Foo (string bar) "); } - [Test] + [Fact] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/SuggestUseVarKeywordEvidentTests.cs b/Tests/CSharp/Diagnostics/SuggestUseVarKeywordEvidentTests.cs index 00acb58e..5444311b 100644 --- a/Tests/CSharp/Diagnostics/SuggestUseVarKeywordEvidentTests.cs +++ b/Tests/CSharp/Diagnostics/SuggestUseVarKeywordEvidentTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class SuggestUseVarKeywordEvidentTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestInspectorCase1() { Analyze(@"class Foo @@ -24,7 +23,7 @@ void Bar (object o) }"); } - [Test] + [Fact] public void TestV2() { Analyze(@"class Foo @@ -42,7 +41,7 @@ void Bar (object o) }"); } - [Test] + [Fact] public void When_Creating_An_Object() { Analyze(@"class Foo @@ -60,7 +59,7 @@ void Bar (object o) }"); } - [Test] + [Fact] public void When_Creating_An_Object_Of_SubType() { Analyze(@"interface IFoo @@ -77,7 +76,7 @@ void Bar (object o) }"); } - [Test] + [Fact] public void WithDynamic() { Analyze(@"class Foo @@ -89,7 +88,7 @@ void Bar (object o) }"); } - [Test] + [Fact] public void When_Explicitely_Initializing_An_Array() { Analyze(@"class Foo @@ -108,7 +107,7 @@ void Bar (object o) } - [Test] + [Fact] public void When_Implicitely_Initializing_An_Array() { Analyze(@"class Foo @@ -120,7 +119,7 @@ void Bar (object o) }"); } - [Test] + [Fact] public void When_Retrieving_Object_By_Property() { Analyze(@" @@ -156,7 +155,7 @@ public void SomeMethod(object o) "); } - [Test] + [Fact] public void When_Retrieving_Object_By_Property_Of_SubType() { Analyze(@" @@ -180,7 +179,7 @@ public void SomeMethod(object o) "); } - [Test] + [Fact] public void When_Casting_Objects() { Analyze(@" @@ -214,7 +213,7 @@ public void SomeMethod(object o) "); } - [Test] + [Fact] public void When_Casting_Objects_To_SubType() { Analyze(@" @@ -238,7 +237,7 @@ public void SomeMethod(object o) "); } - [Test] + [Fact] public void TestNoInitializer() { Analyze(@"class Foo @@ -250,7 +249,7 @@ void Bar (object o) }"); } - [Test] + [Fact] public void TestMultipleInitializers() { Analyze(@"class Foo @@ -262,7 +261,7 @@ void Bar (object o) }"); } - [Test] + [Fact] public void TestMethodReturn() { Analyze(@"class Foo @@ -290,7 +289,7 @@ void Bar () }"); } - [Test] + [Fact] public void TestMethodReturn_NotOfSameType() { Analyze(@"class Foo diff --git a/Tests/CSharp/Diagnostics/ThreadStaticAtInstanceFieldTests.cs b/Tests/CSharp/Diagnostics/ThreadStaticAtInstanceFieldTests.cs index 67aba11a..ac872836 100644 --- a/Tests/CSharp/Diagnostics/ThreadStaticAtInstanceFieldTests.cs +++ b/Tests/CSharp/Diagnostics/ThreadStaticAtInstanceFieldTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ThreadStaticAtInstanceFieldTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestInspectorCase1() { Analyze(@"using System; @@ -21,7 +20,7 @@ class Foo }"); } - [Test] + [Fact] public void TestInspectorCase2() { Analyze(@"using System; @@ -37,7 +36,7 @@ class Foo }"); } - [Test] + [Fact] public void TestInspectorCase3() { Analyze(@"class Foo @@ -53,7 +52,7 @@ public void TestInspectorCase3() - [Test] + [Fact] public void TestDisable() { Analyze(@"using System; @@ -68,7 +67,7 @@ class Foo } - [Test] + [Fact] public void InstanceField() { Analyze(@" @@ -85,7 +84,7 @@ class TestClass }"); } - [Test] + [Fact] public void InstanceFieldWithMultiAttributeSection() { Analyze(@" @@ -103,7 +102,7 @@ class TestClass }"); } - [Test] + [Fact] public void StaticField() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/UnusedAnonymousMethodSignatureTests.cs b/Tests/CSharp/Diagnostics/UnusedAnonymousMethodSignatureTests.cs index 33a2732b..0ea98361 100644 --- a/Tests/CSharp/Diagnostics/UnusedAnonymousMethodSignatureTests.cs +++ b/Tests/CSharp/Diagnostics/UnusedAnonymousMethodSignatureTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class UnusedAnonymousMethodSignatureTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestSimpleUsage() { Test(@" @@ -31,7 +29,7 @@ void TestMethod() }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNecessaryParameter() { Analyze(@" @@ -45,7 +43,7 @@ void TestMethod() }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestVisitChild() { Test(@" @@ -75,7 +73,7 @@ void TestMethod() }"); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAmbiguousCase() { Analyze(@" @@ -95,7 +93,7 @@ void TestMethod() /// /// Bug 15058 - Wrong context for unused parameter list /// - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBug15058() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/UnusedParameterTests.cs b/Tests/CSharp/Diagnostics/UnusedParameterTests.cs index e22f1d9e..984275ef 100644 --- a/Tests/CSharp/Diagnostics/UnusedParameterTests.cs +++ b/Tests/CSharp/Diagnostics/UnusedParameterTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class UnusedParameterTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestUnusedParameter() { var input = @" @@ -18,7 +17,7 @@ void TestMethod (int $i$) Analyze(input); } - [Test] + [Fact] public void TestUnusedParameterMethodGetsCalled() { var input = @" @@ -31,7 +30,7 @@ void TestMethod (int $i$) Analyze(input); } - [Test] + [Fact] public void TestInterfaceImplementation() { var input = @" @@ -46,7 +45,7 @@ public void TestMethod (int i) Analyze(input); } - [Test] + [Fact] public void TestAbstractMethodImplementation() { var input = @" @@ -61,7 +60,7 @@ public override void TestMethod (int i) Analyze(input); } - [Test] + [Fact] public void TestUsedParameter() { var input = @" @@ -74,7 +73,7 @@ void TestMethod (int i) Analyze(input); } - [Test] + [Fact] public void TestLambda() { var input = @" @@ -88,7 +87,7 @@ void TestMethod () Analyze(input); } - [Test] + [Fact] public void TestAnonymousMethod() { var input = @" @@ -103,7 +102,7 @@ void TestMethod () } - [Test] + [Fact] public void TestMethodUsedAsDelegateMethod() { var input = @"using System; @@ -118,7 +117,7 @@ void FooBar (object sender, EventArgs e) {} Analyze(input); } - [Test] + [Fact] public void TestMethodLooksLikeEventHandlerButNotUsedAsSuch() { var input = @"using System; @@ -128,7 +127,7 @@ void FooBar (object $sender$, EventArgs $e$) {} Analyze(input); } - [Test] + [Fact] public void TestMethodUsedAsDelegateInOtherPart() { // This test doesn't add the second part; @@ -141,7 +140,7 @@ void FooBar (object sender, EventArgs e) {} Analyze(input); } - [Test] + [Fact] public void UnusedParameterInConstructor() { var input = @" @@ -153,7 +152,7 @@ public TestClass(int $i$) Analyze(input); } - [Test] + [Fact] public void TestUnusedParameterInVirtualMethod() { var input = @" @@ -165,7 +164,7 @@ public virtual void TestMethod (int i) Analyze(input); } - [Test] + [Fact] public void TestUnusedParameterInShadowedMethod() { var input = @" @@ -177,7 +176,7 @@ class TestClass { Analyze(input); } - [Test] + [Fact] public void TestUnusedParameterInPartialMethod() { var input = @" @@ -189,7 +188,7 @@ partial void TestMethod (int i) Analyze(input); } - [Test] + [Fact] public void SerializationConstructor() { var input = @"using System; @@ -204,7 +203,7 @@ protected TestClass(SerializationInfo info, StreamingContext context) Analyze(input); } - [Test] + [Fact] public void TestBug_29572() { // https://bugzilla.xamarin.com/show_bug.cgi?id=29572 @@ -227,8 +226,7 @@ public void Run (NSObject dummy) Analyze(input); } - [Test] - [Ignore("Support for indexers disabled")] + [Fact(Skip="Support for indexers disabled")] public void TestUnusedParameterInExpressionBodiedIndexer() { var input = @" @@ -238,8 +236,7 @@ class TestClass { Analyze(input); } - [Test] - [Ignore("Support for indexers disabled")] + [Fact(Skip="Support for indexers disabled")] public void TestUsedParameterInExpressionBodiedIndexer() { var input = @" @@ -249,7 +246,7 @@ class TestClass { Analyze(input); } - [Test] + [Fact] public void TestUnusedParameterInExpressionBodiedMethod() { var input = @" @@ -259,7 +256,7 @@ class TestClass { Analyze(input); } - [Test] + [Fact] public void TestUsedParameterInExpressionBodiedMethod() { var input = @" diff --git a/Tests/CSharp/Diagnostics/UnusedTypeParameterTests.cs b/Tests/CSharp/Diagnostics/UnusedTypeParameterTests.cs index 4c2a4703..ae266fde 100644 --- a/Tests/CSharp/Diagnostics/UnusedTypeParameterTests.cs +++ b/Tests/CSharp/Diagnostics/UnusedTypeParameterTests.cs @@ -1,13 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class UnusedTypeParameterTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestUnusedTypeParameter() { var input = @" @@ -19,7 +18,7 @@ class TestClass { Analyze(input); } - [Test] + [Fact] public void TestUsedTypeParameter() { var input = @" @@ -39,7 +38,7 @@ T TestMethod () } - [Test] + [Fact] public void TestInterface() { var input = @" @@ -49,7 +48,7 @@ interface ITest { Analyze(input); } - [Test] + [Fact] public void TestInterfaceImplementation() { var input = @" @@ -66,7 +65,7 @@ class TestClass : ITest { } - [Test] + [Fact] public void TestAbstractClass() { var input = @" @@ -75,7 +74,7 @@ abstract class TestClass { Analyze(input); } - [Test] + [Fact] public void TestAbstractMethod() { var input = @" diff --git a/Tests/CSharp/Diagnostics/UseArrayCreationExpressionTests.cs b/Tests/CSharp/Diagnostics/UseArrayCreationExpressionTests.cs index f52c1e08..8335db1c 100644 --- a/Tests/CSharp/Diagnostics/UseArrayCreationExpressionTests.cs +++ b/Tests/CSharp/Diagnostics/UseArrayCreationExpressionTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class UseArrayCreationExpressionTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestTypeOfIsAssignableFrom() { Test(@" @@ -29,7 +27,7 @@ void Foo() "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void MultiDim() { Test(@" @@ -51,7 +49,7 @@ void Foo(int i) "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/UseIsOperatorTests.cs b/Tests/CSharp/Diagnostics/UseIsOperatorTests.cs index bf79863a..1f9058b3 100644 --- a/Tests/CSharp/Diagnostics/UseIsOperatorTests.cs +++ b/Tests/CSharp/Diagnostics/UseIsOperatorTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class UseIsOperatorTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestTypeOfIsAssignableFrom() { Test(@"using System; @@ -31,7 +29,7 @@ void Foo() "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestTypeOfIsInstanceOfType() { Test(@"using System; @@ -55,7 +53,7 @@ void Foo() "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@"using System; diff --git a/Tests/CSharp/Diagnostics/UseMethodAnyTests.cs b/Tests/CSharp/Diagnostics/UseMethodAnyTests.cs index a93afb5d..7149b7b1 100644 --- a/Tests/CSharp/Diagnostics/UseMethodAnyTests.cs +++ b/Tests/CSharp/Diagnostics/UseMethodAnyTests.cs @@ -1,10 +1,8 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class UseMethodAnyTests : CSharpDiagnosticTestBase { static string ConstructExpression(string expr) @@ -23,69 +21,69 @@ public void Foo (string[] args) "; } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAnyNotEqual() { Test(ConstructExpression("args.Count () != 0"), ConstructExpression("args.Any ()")); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAnyGreater() { Test(ConstructExpression("args.Count () > 0"), ConstructExpression("args.Any ()")); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAnyLower() { Test(ConstructExpression("0 < args.Count ()"), ConstructExpression("args.Any ()")); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAnyGreaterEqual() { Test(ConstructExpression("args.Count () >= 1"), ConstructExpression("args.Any ()")); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestAnyLessEqual() { Test(ConstructExpression("1 <= args.Count ()"), ConstructExpression("args.Any ()")); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNotAnyEqual() { Test(ConstructExpression("args.Count () == 0"), ConstructExpression("!args.Any ()")); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNotAnyLess() { Test(ConstructExpression("args.Count () < 1"), ConstructExpression("!args.Any ()")); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNotAnyGreater() { Test(ConstructExpression("1 > args.Count ()"), ConstructExpression("!args.Any ()")); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNotAnyLessEqual() { Test(ConstructExpression("args.Count () <= 0"), ConstructExpression("!args.Any ()")); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestNotAnyGreaterEqual() { Test(ConstructExpression("0 >= args.Count ()"), ConstructExpression("!args.Any ()")); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@" @@ -103,7 +101,7 @@ public void Foo (string[] args) "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestWrongMethod() { Analyze(@" diff --git a/Tests/CSharp/Diagnostics/UseMethodIsInstanceOfTypeTests.cs b/Tests/CSharp/Diagnostics/UseMethodIsInstanceOfTypeTests.cs index 7d762cc6..187fad2f 100644 --- a/Tests/CSharp/Diagnostics/UseMethodIsInstanceOfTypeTests.cs +++ b/Tests/CSharp/Diagnostics/UseMethodIsInstanceOfTypeTests.cs @@ -1,13 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] - [Ignore("TODO: Issue not ported yet")] public class UseMethodIsInstanceOfTypeTests : CSharpDiagnosticTestBase { - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestBasicUsage() { Test(@"using System; @@ -33,7 +31,7 @@ void Foo() "); } - [Test] + [Fact(Skip="TODO: Issue not ported yet")] public void TestDisable() { Analyze(@"using System; diff --git a/Tests/CSharp/Diagnostics/ValueParameterNotUsedTests.cs b/Tests/CSharp/Diagnostics/ValueParameterNotUsedTests.cs index c31082e1..7c1ea8df 100644 --- a/Tests/CSharp/Diagnostics/ValueParameterNotUsedTests.cs +++ b/Tests/CSharp/Diagnostics/ValueParameterNotUsedTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class ValueParameterNotUsedTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestPropertySetter() { Analyze(@"class A @@ -26,7 +25,7 @@ int Property2 } - [Test] + [Fact] public void TestDisable() { Analyze(@"class A @@ -48,7 +47,7 @@ int Property2 }"); } - [Test] + [Fact] public void TestMatchingIndexerSetter() { Analyze(@"class A @@ -61,7 +60,7 @@ A this[int index] }"); } - [Test] + [Fact] public void TestMatchingEventAdder() { Analyze(@"class A @@ -79,7 +78,7 @@ event TestEventHandler EventTested }"); } - [Test] + [Fact] public void TestNonMatchingIndexerSetter() { Analyze(@"class A @@ -93,7 +92,7 @@ A this[int index] }"); } - [Test] + [Fact] public void IgnoresAutoSetter() { Analyze(@"class A @@ -102,7 +101,7 @@ public void IgnoresAutoSetter() }"); } - [Test] + [Fact] public void IgnoreReadOnlyProperty() { Analyze(@"class A @@ -111,7 +110,7 @@ public void IgnoreReadOnlyProperty() }"); } - [Test] + [Fact] public void DoesNotCrashOnNullIndexerAccessorBody() { Analyze(@"abstract class A @@ -120,7 +119,7 @@ public void DoesNotCrashOnNullIndexerAccessorBody() }"); } - [Test] + [Fact] public void DoesNotWarnOnExceptionThrowingAccessor() { Analyze(@"abstract class A @@ -134,7 +133,7 @@ public string Property }"); } - [Test] + [Fact] public void DoesNotWarnOnEmptyCustomEvent() { // Empty custom events are often used when the event can never be raised @@ -150,7 +149,7 @@ event TestEventHandler EventTested }"); } - [Test] + [Fact] public void DoesNotWarnOnNotImplementedCustomEvent() { Analyze(@"class A diff --git a/Tests/CSharp/Diagnostics/XmlDocTests.cs b/Tests/CSharp/Diagnostics/XmlDocTests.cs index 169e48b4..472f406d 100644 --- a/Tests/CSharp/Diagnostics/XmlDocTests.cs +++ b/Tests/CSharp/Diagnostics/XmlDocTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.CSharp.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Diagnostics { - [TestFixture] public class XmlDocTests : CSharpDiagnosticTestBase { - [Test] + [Fact] public void TestBeforeNamespace() { Analyze(@" @@ -15,7 +14,7 @@ public void TestBeforeNamespace() "); } - [Test] + [Fact] public void TestBeforeUsing() { Analyze(@" @@ -24,7 +23,7 @@ public void TestBeforeUsing() "); } - [Test] + [Fact] public void TestBeforeUsingAlias() { Analyze(@" @@ -33,7 +32,7 @@ public void TestBeforeUsingAlias() "); } - [Test] + [Fact] public void TestBeforeExternAlias() { Analyze(@" @@ -42,7 +41,7 @@ public void TestBeforeExternAlias() "); } - [Test] + [Fact] public void TestTypeParameter() { Analyze(@" @@ -54,7 +53,7 @@ class Foo2 {} "); } - [Test] + [Fact] public void TestWrongMethodParameter() { Analyze(@" @@ -73,7 +72,7 @@ public void FooBar(int x, int y, int z) "); } - [Test] + [Fact] public void TestSeeCref() { Analyze(@" @@ -92,7 +91,7 @@ class Foo2 {} "); } - [Test] + [Fact] public void TestValidCref() { Analyze(@" @@ -111,7 +110,7 @@ public void Undefined () {} /// /// Bug 17729 - Incorrect XML-docs warning about 'value' paramref /// - [Test] + [Fact] public void TestBug17729() { Analyze(@" @@ -127,7 +126,7 @@ class Foo { } - [Test] + [Fact] public void TestSeeCRefMember() { Analyze(@" @@ -153,7 +152,7 @@ public interface IGroupingProvider "); } - [Test] + [Fact] public void TestEventComment() { Analyze(@" @@ -172,7 +171,7 @@ public interface IGroupingProvider /// /// XmlDocAnalyzer causes unexpected exception which crashes Visual Studio #180 /// - [Test] + [Fact] public void TestIssue180() { Analyze(@" @@ -185,7 +184,7 @@ public void FooBar(int x, int y, int z) "); } - [Test] + [Fact] public void TestDelegateDeclaration() { Analyze(@" diff --git a/Tests/Common/CodeFixTestBase.cs b/Tests/Common/CodeFixTestBase.cs index b3e321f6..9d3f2312 100644 --- a/Tests/Common/CodeFixTestBase.cs +++ b/Tests/Common/CodeFixTestBase.cs @@ -1,17 +1,11 @@ -using NUnit.Framework; using System.Text; using Microsoft.CodeAnalysis.Text; using RefactoringEssentials.Tests.Common; namespace RefactoringEssentials.Tests { - public abstract class CodeFixTestBase + public abstract class CodeFixTestBase { - [SetUp] - public virtual void SetUp() - { - } - internal static string HomogenizeEol(string str) { return Utils.HomogenizeEol(str); @@ -61,7 +55,7 @@ protected static string ParseText(string input, out TextSpan selectedSpan) // var ctx = TestRefactoringContext.Create(input); // ctx.FormattingOptions = formattingOptions; // var actions = provider.GetActions(ctx).ToList(); - // Assert.AreEqual( + // Assert.Equal( // expected, // actions.Select(a => a.Description).ToArray()); // } diff --git a/Tests/Common/CodeRefactoringTestBase.cs b/Tests/Common/CodeRefactoringTestBase.cs index 8089f9a9..64502a15 100644 --- a/Tests/Common/CodeRefactoringTestBase.cs +++ b/Tests/Common/CodeRefactoringTestBase.cs @@ -1,17 +1,11 @@ -using NUnit.Framework; using System.Text; using Microsoft.CodeAnalysis.Text; using RefactoringEssentials.Tests.Common; namespace RefactoringEssentials.Tests { - public abstract class CodeRefactoringTestBase + public abstract class CodeRefactoringTestBase { - [SetUp] - public virtual void SetUp() - { - } - internal static string HomogenizeEol(string str) { return Utils.HomogenizeEol(str); diff --git a/Tests/Common/ConverterTestBase.cs b/Tests/Common/ConverterTestBase.cs index 56f02a8c..3b3c143e 100644 --- a/Tests/Common/ConverterTestBase.cs +++ b/Tests/Common/ConverterTestBase.cs @@ -6,14 +6,11 @@ using RefactoringEssentials.Tests.CSharp.Diagnostics; using RefactoringEssentials.VB.Converter; using System; -using System.Collections.Generic; using System.Collections.Immutable; -using System.Linq; using System.Text; -using System.Threading.Tasks; -using NUnit.Framework; using RefactoringEssentials.Tests.Common; using Microsoft.CodeAnalysis.Formatting; +using Xunit; namespace RefactoringEssentials.Tests.VB.Converter { @@ -140,7 +137,7 @@ public void TestConversionCSharpToVisualBasic(string csharpCode, string expected diff.Append(expectedVisualBasicCode[i]); } Console.WriteLine(diff.ToString()); - Assert.Fail(); + Assert.True(false); } } diff --git a/Tests/Common/DiagnosticTestBase.cs b/Tests/Common/DiagnosticTestBase.cs index e3882361..7dda0de2 100644 --- a/Tests/Common/DiagnosticTestBase.cs +++ b/Tests/Common/DiagnosticTestBase.cs @@ -1,6 +1,5 @@ using System; using System.Linq; -using NUnit.Framework; using Microsoft.CodeAnalysis.Diagnostics; using System.Collections.Generic; using Microsoft.CodeAnalysis; @@ -11,10 +10,11 @@ using Microsoft.CodeAnalysis.Host; using Microsoft.CodeAnalysis.CodeActions; using RefactoringEssentials.Tests.Common; +using Xunit; namespace RefactoringEssentials.Tests { - public abstract class DiagnosticTestBase + public abstract class DiagnosticTestBase { static MetadataReference mscorlib; static MetadataReference systemAssembly; @@ -118,14 +118,14 @@ protected static void RunFix(Workspace workspace, ProjectId projectId, DocumentI CodeFixProvider provider; if (providers.TryGetValue(diagnostic.Id, out provider)) { - Assert.IsNotNull(provider, "null provider for : " + diagnostic.Id); + Assert.True(provider != null, "null provider for : " + diagnostic.Id); var document = workspace.CurrentSolution.GetProject(projectId).GetDocument(documentId); var actions = new List(); var context = new CodeFixContext(document, diagnostic, (fix, diags) => actions.Add(fix), default(CancellationToken)); provider.RegisterCodeFixesAsync(context).Wait(); if (!actions.Any()) { - Assert.Fail("Provider has no fix for " + diagnostic.Id + " at " + diagnostic.Location.SourceSpan); + Assert.True(false, "Provider has no fix for " + diagnostic.Id + " at " + diagnostic.Location.SourceSpan); return; } foreach (var op in actions[index].GetOperationsAsync(default(CancellationToken)).Result) @@ -135,35 +135,35 @@ protected static void RunFix(Workspace workspace, ProjectId projectId, DocumentI } else { - Assert.Fail("No code fix provider found for :" + diagnostic.Id); + Assert.True(false, "No code fix provider found for :" + diagnostic.Id); } } protected static void Test(string input, int expectedDiagnostics = 1, string output = null, int issueToFix = -1, int actionToRun = 0) where T : DiagnosticAnalyzer, new() { - Assert.Fail("Use Analyze"); + Assert.True(false, "Use Analyze"); } protected static void Test(string input, string output, int fixIndex = 0) where T : DiagnosticAnalyzer, new() { - Assert.Fail("Use Analyze"); + Assert.True(false, "Use Analyze"); } protected static void TestIssue(string input, int issueCount = 1) where T : DiagnosticAnalyzer, new() { - Assert.Fail("Use Analyze"); + Assert.True(false, "Use Analyze"); } protected static void TestWrongContextWithSubIssue(string input, string id) where T : DiagnosticAnalyzer, new() { - Assert.Fail("Use AnalyzeWithRule"); + Assert.True(false, "Use AnalyzeWithRule"); } protected static void TestWithSubIssue(string input, string output, string subIssue, int fixIndex = 0) where T : DiagnosticAnalyzer, new() { - Assert.Fail("Use AnalyzeWithRule"); + Assert.True(false, "Use AnalyzeWithRule"); } class TestDiagnosticAnalyzer : DiagnosticAnalyzer @@ -251,7 +251,7 @@ protected static TextSpan GetWholeSpan(Diagnostic d) { Console.WriteLine(diag.Id + "/" + diag.GetMessage() + "/" + diag.Location.SourceSpan); } - Assert.Fail("Diagnostic count mismatch expected: " + expectedDiagnosics.Count + " was " + diagnostics.Count); + Assert.True(false, "Diagnostic count mismatch expected: " + expectedDiagnosics.Count + " was " + diagnostics.Count); } for (int i = 0; i < expectedDiagnosics.Count; i++) @@ -260,7 +260,7 @@ protected static TextSpan GetWholeSpan(Diagnostic d) var wholeSpan = GetWholeSpan(d); if (wholeSpan != expectedDiagnosics[i]) { - Assert.Fail("Diagnostic " + i + " span mismatch expected: " + expectedDiagnosics[i] + " but was " + wholeSpan); + Assert.True(false, "Diagnostic " + i + " span mismatch expected: " + expectedDiagnosics[i] + " but was " + wholeSpan); } if (diagnosticCheck != null) diagnosticCheck(i, d); @@ -303,26 +303,27 @@ protected static TextSpan GetWholeSpan(Diagnostic d) txt = Utils.HomogenizeEol(txt); if (output != txt) { - Console.WriteLine("expected:"); - Console.WriteLine(output); - Console.WriteLine("got:"); - Console.WriteLine(txt); - Console.WriteLine("-----Mismatch:"); + StringBuilder sb = new StringBuilder(); + sb.AppendLine("expected:"); + sb.AppendLine(output); + sb.AppendLine("got:"); + sb.AppendLine(txt); + sb.AppendLine("-----Mismatch:"); for (int i = 0; i < txt.Length; i++) { if (i >= output.Length) { - Console.Write("#"); + sb.Append("#"); continue; } if (txt[i] != output[i]) { - Console.Write("#"); + sb.Append("#"); continue; } - Console.Write(txt[i]); + sb.Append(txt[i]); } - Assert.Fail(); + Assert.True(false, sb.ToString()); } } @@ -367,7 +368,7 @@ protected static TextSpan GetWholeSpan(Diagnostic d) { Console.WriteLine(diag.Id + "/" + diag.GetMessage()); } - Assert.Fail("Diagnostic count mismatch expected: " + expectedDiagnosics.Count + " but was:" + diagnostics.Count); + Assert.True(false, "Diagnostic count mismatch expected: " + expectedDiagnosics.Count + " but was:" + diagnostics.Count); } for (int i = 0; i < expectedDiagnosics.Count; i++) @@ -376,7 +377,7 @@ protected static TextSpan GetWholeSpan(Diagnostic d) var wholeSpan = GetWholeSpan(d); if (wholeSpan != expectedDiagnosics[i]) { - Assert.Fail("Diagnostic " + i + " span mismatch expected: " + expectedDiagnosics[i] + " but was " + wholeSpan); + Assert.True(false, "Diagnostic " + i + " span mismatch expected: " + expectedDiagnosics[i] + " but was " + wholeSpan); } if (diagnosticCheck != null) diagnosticCheck(i, d); @@ -423,7 +424,7 @@ protected static TextSpan GetWholeSpan(Diagnostic d) Console.WriteLine(output); Console.WriteLine("got:"); Console.WriteLine(txt); - Assert.Fail(); + Assert.True(false); } } } diff --git a/Tests/Common/Utils.cs b/Tests/Common/Utils.cs index 677c353d..b7c20c88 100644 --- a/Tests/Common/Utils.cs +++ b/Tests/Common/Utils.cs @@ -1,12 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Text; namespace RefactoringEssentials.Tests.Common { - static class Utils + static class Utils { internal static string HomogenizeEol(string str) { diff --git a/Tests/Properties/AssemblyInfo.cs b/Tests/Properties/AssemblyInfo.cs index ce28e079..8c5c367c 100644 --- a/Tests/Properties/AssemblyInfo.cs +++ b/Tests/Properties/AssemblyInfo.cs @@ -1,5 +1,3 @@ using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; [assembly: AssemblyTitle("Tests for Refactoring Essentials")] diff --git a/Tests/Samples/CSharp/SampleCodeRefactoringTests.cs b/Tests/Samples/CSharp/SampleCodeRefactoringTests.cs index e45c6953..bf981d81 100644 --- a/Tests/Samples/CSharp/SampleCodeRefactoringTests.cs +++ b/Tests/Samples/CSharp/SampleCodeRefactoringTests.cs @@ -1,14 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.Samples.CSharp; using RefactoringEssentials.Tests.CSharp.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.Samples.CSharp { - /// - /// Tests for SampleCodeRefactoringProvider. - /// - [TestFixture] - [Ignore("Sample refactoring tests: Remove this line to activate them.")] + /// + /// Tests for SampleCodeRefactoringProvider. + /// public class SampleCodeRefactoringTests : CSharpCodeRefactoringTestBase { /* @@ -20,7 +18,7 @@ Since SampleCodeRefactoringProvider suggests to add an "I" prefix to interface interface namings. */ - [Test] + [Fact(Skip="Sample refactoring tests: Remove this line to activate them.")] public void TestInterfaceWithoutIPrefix() { /* @@ -46,7 +44,7 @@ interface ITest }"); } - [Test] + [Fact(Skip="Sample refactoring tests: Remove this line to activate them.")] public void TestInterfaceWithIPrefix() { /* @@ -64,7 +62,7 @@ interface $ITest }"); } - [Test] + [Fact(Skip="Sample refactoring tests: Remove this line to activate them.")] public void TestInterfaceWithINonPrefix() { /* diff --git a/Tests/SymbolChecksTest.cs b/Tests/SymbolChecksTest.cs index 35912d26..d89d9e70 100644 --- a/Tests/SymbolChecksTest.cs +++ b/Tests/SymbolChecksTest.cs @@ -1,17 +1,13 @@ -using System; -using System.Linq; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.FindSymbols; using Microsoft.CodeAnalysis.Text; -using NUnit.Framework; +using Xunit; namespace RefactoringEssentials.Tests { - [TestFixture] public class SymbolChecksTest { - [Test] + [Fact] public void DirectSpecialType() { var symbol = FindSymbol(@" @@ -24,13 +20,13 @@ void Method(IDisposable a) } }"); - Assert.That( - symbol.GetSymbolType().ImplementsSpecialTypeInterface(SpecialType.System_IDisposable), Is.True, - message: "Symbol is implementing IDisposable" + Assert.True( + symbol.GetSymbolType().ImplementsSpecialTypeInterface(SpecialType.System_IDisposable), + userMessage: "Symbol is implementing IDisposable" ); } - [Test] + [Fact] public void SpecialTypeAsGenericConstraint() { var symbol = FindSymbol(@" @@ -44,13 +40,13 @@ void Method(T a) } }"); - Assert.That( - symbol.GetSymbolType().ImplementsSpecialTypeInterface(SpecialType.System_IDisposable), Is.True, - message: "Symbol is implementing IDisposable" + Assert.True( + symbol.GetSymbolType().ImplementsSpecialTypeInterface(SpecialType.System_IDisposable), + userMessage: "Symbol is implementing IDisposable" ); } - [Test] + [Fact] public void InterfaceInheritingSpecialTypeAsGenericConstraint() { var symbol = FindSymbol(@" @@ -68,13 +64,13 @@ void Method(T a) } }"); - Assert.That( - symbol.GetSymbolType().ImplementsSpecialTypeInterface(SpecialType.System_IDisposable), Is.True, - message: "Symbol is implementing IDisposable" + Assert.True( + symbol.GetSymbolType().ImplementsSpecialTypeInterface(SpecialType.System_IDisposable), + userMessage: "Symbol is implementing IDisposable" ); } - [Test] + [Fact] public void InterfaceInheritingSpecialTypeAsParameter() { var symbol = FindSymbol(@" @@ -90,13 +86,13 @@ void Method(IInheritDisposable a) var x = $a; } }"); - Assert.That( - symbol.GetSymbolType().ImplementsSpecialTypeInterface(SpecialType.System_IDisposable), Is.True, - message: "Symbol is implementing IDisposable" + Assert.True( + symbol.GetSymbolType().ImplementsSpecialTypeInterface(SpecialType.System_IDisposable), + userMessage: "Symbol is implementing IDisposable" ); } - [Test] + [Fact] public void ClassInheritingImplementionOfSpecialTypeAsGenericConstraint() { var symbol = FindSymbol(@" @@ -123,13 +119,13 @@ void Method(T a) } }"); - Assert.That( - symbol.GetSymbolType().ImplementsSpecialTypeInterface(SpecialType.System_IDisposable), Is.True, - message: "Symbol is implementing IDisposable" + Assert.True( + symbol.GetSymbolType().ImplementsSpecialTypeInterface(SpecialType.System_IDisposable), + userMessage: "Symbol is implementing IDisposable" ); } - [Test] + [Fact] public void ClassInheritingImplementionOfGenericSpecialTypeAsGenericConstraint() { var symbol = FindSymbol(@" @@ -164,13 +160,13 @@ void Method(T a) } }"); - Assert.That( - symbol.GetSymbolType().ImplementsSpecialTypeInterface(SpecialType.System_Collections_Generic_IEnumerable_T), Is.True, - message: "Symbol is implementing IDisposable" + Assert.True( + symbol.GetSymbolType().ImplementsSpecialTypeInterface(SpecialType.System_Collections_Generic_IEnumerable_T), + userMessage: "Symbol is implementing IDisposable" ); } - [Test] + [Fact] public void LocallyDefinedDisposableNotDetectedAsSpecialType() { var symbol = FindSymbol(@" @@ -184,13 +180,13 @@ void Method(IDisposable a) } }"); - Assert.That( - symbol.GetSymbolType().ImplementsSpecialTypeInterface(SpecialType.System_IDisposable), Is.False, - message: "Symbol is not implementing IDisposable" + Assert.False( + symbol.GetSymbolType().ImplementsSpecialTypeInterface(SpecialType.System_IDisposable), + userMessage: "Symbol is not implementing IDisposable" ); } - [Test] + [Fact] public void DoNotHangOnGenericTypes() { var symbol = FindSymbol(@" @@ -202,9 +198,9 @@ void Method(System.IComparable a) } }"); - Assert.That( - symbol.GetSymbolType().ImplementsSpecialTypeInterface(SpecialType.System_IDisposable), Is.False, - message: "Symbol is not implementing IDisposable" + Assert.False( + symbol.GetSymbolType().ImplementsSpecialTypeInterface(SpecialType.System_IDisposable), + userMessage: "Symbol is not implementing IDisposable" ); } @@ -242,12 +238,12 @@ static TSymbol FindSymbol(string code) var diag = semanticModel.GetDiagnostics(); - Assert.That(diag, Is.Empty, "No errors reported"); + Assert.True(diag.IsEmpty, "No errors reported"); var symbol = SymbolFinder.FindSymbolAtPosition(semanticModel, position, workspace); - Assert.That(symbol, Is.Not.Null, "Symbol should be found"); - Assert.That(symbol, Is.InstanceOf()); + Assert.True(symbol != null, "Symbol should be found"); + Assert.True(symbol is TSymbol); return (TSymbol)symbol; } diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index 64c27dcb..74ecb7a1 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -1,5 +1,6 @@  + Debug @@ -111,8 +112,21 @@ ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.TypedParts.dll - - ..\packages\NUnit.3.0.1\lib\net45\nunit.framework.dll + + ..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll + True + + + ..\packages\xunit.assert.2.1.0\lib\dotnet\xunit.assert.dll + True + + + ..\packages\xunit.extensibility.core.2.1.0\lib\dotnet\xunit.core.dll + True + + + ..\packages\xunit.extensibility.execution.2.1.0\lib\net45\xunit.execution.desktop.dll + True @@ -474,6 +488,7 @@ + diff --git a/Tests/VB/CodeRefactorings/AddAnotherAccessorTests.cs b/Tests/VB/CodeRefactorings/AddAnotherAccessorTests.cs index e321a109..496918e5 100644 --- a/Tests/VB/CodeRefactorings/AddAnotherAccessorTests.cs +++ b/Tests/VB/CodeRefactorings/AddAnotherAccessorTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class AddAnotherAccessorTests : VBCodeRefactoringTestBase { - [Test] + [Fact] public void TestAddSet() { Test(@" @@ -31,7 +30,7 @@ End Property End Class"); } - [Test] + [Fact] public void TestAddSet_ReadOnlyField() { Test(@" @@ -56,7 +55,7 @@ End Property End Class"); } - [Test] + [Fact] public void TestAddGet() { Test(@" @@ -81,7 +80,7 @@ End Property End Class"); } - [Test] + [Fact] public void TestAddGetWithComment() { Test(@" diff --git a/Tests/VB/CodeRefactorings/AddCheckForNothingTests.cs b/Tests/VB/CodeRefactorings/AddCheckForNothingTests.cs index 4fae4f6d..a7c41873 100644 --- a/Tests/VB/CodeRefactorings/AddCheckForNothingTests.cs +++ b/Tests/VB/CodeRefactorings/AddCheckForNothingTests.cs @@ -1,16 +1,15 @@ -using NUnit.Framework; using RefactoringEssentials.VB; using RefactoringEssentials.Tests.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB { - /// - /// Tests for AddCheckForNothingCodeRefactoringProvider. - /// - [TestFixture] + /// + /// Tests for AddCheckForNothingCodeRefactoringProvider. + /// public class AddCheckForNothingTests : VBCodeRefactoringTestBase { - [Test] + [Fact] public void TestSingleExpression() { Test(@" @@ -32,7 +31,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestValueType() { TestWrongContext(@" @@ -45,7 +44,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestNullableType() { Test(@" @@ -67,7 +66,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestMemberAccessExpression1() { Test(@" @@ -99,7 +98,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestMemberAccessExpression2() { Test(@" @@ -131,7 +130,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestMemberAccessExpression3() { Test(@" @@ -171,7 +170,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestStaticMemberAccessExpression() { TestWrongContext(@" @@ -188,7 +187,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestMethodInvocation() { Test(@" @@ -222,7 +221,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestStaticMethodInvocation() { TestWrongContext(@" @@ -240,7 +239,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestIndexerAccess() { Test(@" @@ -262,7 +261,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestMultipleUsage() { Test(@" @@ -286,7 +285,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestLocalVariable() { Test(@" @@ -312,7 +311,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestLocalVariableDeclaration() { TestWrongContext(@" @@ -327,7 +326,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestUsageInLocalVariableDeclaration() { TestWrongContext(@" @@ -342,7 +341,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestUsageInIfCondition() { Test(@" @@ -368,7 +367,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestUsageInIfBlock() { Test(@" @@ -392,7 +391,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestUsageInElseIfBlock() { Test(@" @@ -420,7 +419,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestUsageInForeachLoop() { Test(@" @@ -449,7 +448,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestUsageInWhileLoop() { Test(@" @@ -480,7 +479,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestUsageInLambda1() { Test(@" @@ -504,7 +503,7 @@ End Sub End Class"); } -[Test] +[Fact] public void TestUsageInLambda2() { Test(@" @@ -534,7 +533,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestUsageInReturnStatement() { TestWrongContext(@" @@ -549,7 +548,7 @@ End Function End Class"); } - [Test] + [Fact] public void TestAlreadyPresentIfNotNullCheck1() { TestWrongContext(@" @@ -564,7 +563,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestAlreadyPresentIfNotNullCheck2() { TestWrongContext(@" @@ -580,7 +579,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestAlreadyPresentIfNotNullCheck3() { TestWrongContext(@" @@ -596,7 +595,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestAlreadyPresentIfNotNullCheck4() { TestWrongContext(@" @@ -612,7 +611,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestAlreadyPresentIfNotNullCheck5() { TestWrongContext(@" @@ -625,7 +624,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestAlreadyPresentIfNotNullCheck6() { TestWrongContext(@" @@ -642,7 +641,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestAlreadyPresentNotNullCheckInWhileLoop() { TestWrongContext(@" @@ -658,7 +657,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestAlreadyPresentNullCheckInConditionalTernaryExpression1() { TestWrongContext(@" @@ -672,7 +671,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestAlreadyPresentNullCheckInConditionalTernaryExpression2() { TestWrongContext(@" diff --git a/Tests/VB/CodeRefactorings/CheckDictionaryKeyValueTests.cs b/Tests/VB/CodeRefactorings/CheckDictionaryKeyValueTests.cs index ccf42618..908a9447 100644 --- a/Tests/VB/CodeRefactorings/CheckDictionaryKeyValueTests.cs +++ b/Tests/VB/CodeRefactorings/CheckDictionaryKeyValueTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class CheckDictionaryKeyValueTests : VBCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleCase() { Test(@" @@ -25,7 +24,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestNestedCase1() { Test(@" @@ -52,7 +51,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestNestedCase2() { TestWrongContext(@" @@ -66,7 +65,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestNameClash() { Test(@" diff --git a/Tests/VB/CodeRefactorings/CheckIfParameterIsNothingTests.cs b/Tests/VB/CodeRefactorings/CheckIfParameterIsNothingTests.cs index 4c6f37cb..8860e2d7 100644 --- a/Tests/VB/CodeRefactorings/CheckIfParameterIsNothingTests.cs +++ b/Tests/VB/CodeRefactorings/CheckIfParameterIsNothingTests.cs @@ -1,18 +1,15 @@ -using System; -using NUnit.Framework; using Microsoft.CodeAnalysis.VisualBasic; using Microsoft.CodeAnalysis; -using System.Collections.Immutable; using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class CheckIfParameterIsNothingTests : VBCodeRefactoringTestBase { // always need to check for System.ArgumentNullException in the generated code, because the Simplifier is not working // see https://github.com/dotnet/roslyn/issues/473 - [Test] + [Fact] public void Test() { Test(@" @@ -34,7 +31,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestWithComment() { Test(@" @@ -57,7 +54,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestLambda() { Test(@" @@ -80,7 +77,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestNullCheckAlreadyThere_StringName() { TestWrongContext(@" @@ -95,7 +92,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestNullCheckAlreadyThere_NameOf() { TestWrongContext(@" @@ -110,7 +107,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestNullCheckAlreadyThere_SingleLineIf() { TestWrongContext(@" @@ -123,7 +120,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestPopupOnlyOnName() { TestWrongContext(@" @@ -134,7 +131,7 @@ End Sub } - [Test] + [Fact] public void Test_OldVB() { var parseOptions = new VisualBasicParseOptions( diff --git a/Tests/VB/CodeRefactorings/ComputeConstantValueTests.cs b/Tests/VB/CodeRefactorings/ComputeConstantValueTests.cs index a8977c69..16005d96 100644 --- a/Tests/VB/CodeRefactorings/ComputeConstantValueTests.cs +++ b/Tests/VB/CodeRefactorings/ComputeConstantValueTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class ComputeConstantValueTests : VBCodeRefactoringTestBase { - [Test] + [Fact] public void Rational1() { Test(@" @@ -22,7 +21,7 @@ End Sub End Class"); } - [Test] + [Fact] public void Rational1WithComment() { Test(@" @@ -40,7 +39,7 @@ End Sub End Class"); } - [Test] + [Fact] public void Rational2() { Test(@" @@ -55,7 +54,7 @@ Public Sub F() End Sub End Class"); } - [Test] + [Fact] public void Rational3() { Test(@" @@ -70,7 +69,7 @@ Public Sub F() End Sub End Class"); } - [Test] + [Fact] public void Rational4() { Test(@" @@ -85,7 +84,7 @@ Public Sub F() End Sub End Class"); } - [Test] + [Fact] public void Rational5() { Test(@" @@ -100,7 +99,7 @@ Public Sub F() End Sub End Class"); } - [Test] + [Fact] public void Rational6() { Test(@" @@ -116,7 +115,7 @@ End Sub End Class"); } - [Test] + [Fact] public void Bool1() { Test(@" @@ -132,7 +131,7 @@ End Sub End Class"); } - [Test] + [Fact] public void Bool2() { Test(@" @@ -148,7 +147,7 @@ End Sub End Class"); } - [Test] + [Fact] public void Bool3() { Test(@" @@ -164,7 +163,7 @@ End Sub End Class"); } - [Test] + [Fact] public void String1() { Test(@" @@ -180,7 +179,7 @@ End Sub End Class"); } - [Test] + [Fact] public void UseConstant() { Test(@" @@ -199,7 +198,7 @@ End Sub } - [Test] + [Fact] public void Invalid() { TestWrongContext(@" @@ -212,7 +211,7 @@ End Sub } - [Test] + [Fact] public void TestWrongHotSpot() { TestWrongContext(@" diff --git a/Tests/VB/CodeRefactorings/ConvertDecToHexTests.cs b/Tests/VB/CodeRefactorings/ConvertDecToHexTests.cs index b9c19eca..9df1c8ab 100644 --- a/Tests/VB/CodeRefactorings/ConvertDecToHexTests.cs +++ b/Tests/VB/CodeRefactorings/ConvertDecToHexTests.cs @@ -1,13 +1,11 @@ -using System; -using NUnit.Framework; using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class ConvertDecToHexTests : VBCodeRefactoringTestBase { - [Test()] + [Fact] public void Test() { Test(@" diff --git a/Tests/VB/CodeRefactorings/ConvertDoLoopWhileToDoWhileLoopTests.cs b/Tests/VB/CodeRefactorings/ConvertDoLoopWhileToDoWhileLoopTests.cs index 53ac4bc0..c6d37d9d 100644 --- a/Tests/VB/CodeRefactorings/ConvertDoLoopWhileToDoWhileLoopTests.cs +++ b/Tests/VB/CodeRefactorings/ConvertDoLoopWhileToDoWhileLoopTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class ConvertDoLoopWhileToDoWhileLoopTests : VBCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleWhile() { Test(@" @@ -28,7 +27,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestWhileFromSimpleDoStatement() { Test(@" @@ -50,7 +49,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestSimpleUntil() { Test(@" @@ -72,7 +71,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestSimpleWithComment1() { Test(@" @@ -96,7 +95,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestSimpleWithComment2() { Test(@" @@ -118,7 +117,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestDisabledInContent() { TestWrongContext(@" diff --git a/Tests/VB/CodeRefactorings/ConvertDoWhileLoopToDoLoopWhileTests.cs b/Tests/VB/CodeRefactorings/ConvertDoWhileLoopToDoLoopWhileTests.cs index 9735f3e1..fc26f20e 100644 --- a/Tests/VB/CodeRefactorings/ConvertDoWhileLoopToDoLoopWhileTests.cs +++ b/Tests/VB/CodeRefactorings/ConvertDoWhileLoopToDoLoopWhileTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class ConvertDoWhileLoopToDoLoopWhileTests : VBCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleWhile() { Test(@" @@ -28,7 +27,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestWhileFromSimpleLoopStatement() { Test(@" @@ -50,7 +49,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestSimpleUntil() { Test(@" @@ -72,7 +71,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestSimpleWithComment1() { Test(@" @@ -96,7 +95,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestSimpleWithComment2() { Test(@" @@ -118,7 +117,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestDisabledInContent() { TestWrongContext(@" diff --git a/Tests/VB/CodeRefactorings/ConvertHexToDecTests.cs b/Tests/VB/CodeRefactorings/ConvertHexToDecTests.cs index fc4cdca6..af1af67b 100644 --- a/Tests/VB/CodeRefactorings/ConvertHexToDecTests.cs +++ b/Tests/VB/CodeRefactorings/ConvertHexToDecTests.cs @@ -1,13 +1,11 @@ -using System; -using NUnit.Framework; using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class ConvertHexToDecTests : VBCodeRefactoringTestBase { - [Test()] + [Fact] public void Test() { Test(@" diff --git a/Tests/VB/CodeRefactorings/ConvertIfStatementToSelectCaseStatementTests.cs b/Tests/VB/CodeRefactorings/ConvertIfStatementToSelectCaseStatementTests.cs index 7aadcb65..9fbb885a 100644 --- a/Tests/VB/CodeRefactorings/ConvertIfStatementToSelectCaseStatementTests.cs +++ b/Tests/VB/CodeRefactorings/ConvertIfStatementToSelectCaseStatementTests.cs @@ -1,13 +1,12 @@ -using NUnit.Framework; using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class ConvertIfStatementToSelectCaseStatementTests : VBCodeRefactoringTestBase { - [Test] + [Fact] public void TestBreak() { Test(@" @@ -42,7 +41,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestBreakWithComment() { Test(@" @@ -79,7 +78,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestReturn() { Test(@" @@ -110,7 +109,7 @@ End Function End Class"); } - [Test] + [Fact] public void TestConstantExpression() { Test(@" @@ -173,7 +172,7 @@ End Function End Class"); } - [Test] + [Fact] public void TestNestedOr() { Test(@" @@ -202,7 +201,7 @@ End Function End Class"); } - [Test] + [Fact] public void TestComplexSwitchExpression() { Test(@" @@ -231,7 +230,7 @@ End Function End Class"); } - [Test] + [Fact] public void TestNonConstantExpression() { TestWrongContext(@" @@ -282,7 +281,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestNonEqualityComparison() { TestWrongContext(@" @@ -302,7 +301,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestValidType() { // enum @@ -372,7 +371,7 @@ End Function End Class"); } - [Test] + [Fact] public void TestInvalidType() { TestWrongContext(@" @@ -388,7 +387,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestNoElse() { Test(@" @@ -415,7 +414,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestNestedIf() { Test(@" @@ -447,7 +446,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestInLoop() { Test(@" @@ -485,7 +484,7 @@ End While End Sub End Class"); } - [Test] + [Fact] public void TestInLoop2() { Test(@" diff --git a/Tests/VB/CodeRefactorings/ConvertSelectCaseToIfTests.cs b/Tests/VB/CodeRefactorings/ConvertSelectCaseToIfTests.cs index 320377bf..99a6379e 100644 --- a/Tests/VB/CodeRefactorings/ConvertSelectCaseToIfTests.cs +++ b/Tests/VB/CodeRefactorings/ConvertSelectCaseToIfTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class ConvertSelectCaseToIfTests : VBCodeRefactoringTestBase { - [Test] + [Fact] public void TestReturn() { Test(@" @@ -39,7 +38,7 @@ End Function End Class"); } - [Test] + [Fact] public void TestWithoutDefault() { Test(@" @@ -68,7 +67,7 @@ End Function End Class"); } - [Test] + [Fact] public void TestBreak() { Test(@" @@ -99,7 +98,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestOperatorPriority() { Test(@" @@ -128,7 +127,7 @@ End Function End Class"); } - [Test] + [Fact] public void TestEmptySwitch() { TestWrongContext(@" @@ -140,7 +139,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestSwitchWithDefaultOnly() { TestWrongContext(@" @@ -153,7 +152,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestNonTrailingBreak() { TestWrongContext(@" diff --git a/Tests/VB/CodeRefactorings/ConvertToCustomEventTests.cs b/Tests/VB/CodeRefactorings/ConvertToCustomEventTests.cs index 971eb758..fd192cbc 100644 --- a/Tests/VB/CodeRefactorings/ConvertToCustomEventTests.cs +++ b/Tests/VB/CodeRefactorings/ConvertToCustomEventTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class ConvertToCustomEventTests : VBCodeRefactoringTestBase { - [Test] + [Fact] public void TestDelegateBasedEvent() { Test(@" @@ -32,7 +31,7 @@ End Event End Class"); } - [Test] + [Fact] public void TestGenericDelegateBasedEvent() { Test(@" @@ -58,7 +57,7 @@ End Event End Class"); } -[Test] +[Fact] public void TestEventBasedOnCustomDelegateWithGenericParam() { Test(@" @@ -88,7 +87,7 @@ End Event End Class"); } - [Test] + [Fact] public void TestNonDelegateBasedEvent() { TestWrongContext(@" diff --git a/Tests/VB/CodeRefactorings/CopyCommentsFromBaseTests.cs b/Tests/VB/CodeRefactorings/CopyCommentsFromBaseTests.cs index c9a5c21c..da336ac5 100644 --- a/Tests/VB/CodeRefactorings/CopyCommentsFromBaseTests.cs +++ b/Tests/VB/CodeRefactorings/CopyCommentsFromBaseTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class CopyCommentsFromBaseTest : VBCodeRefactoringTestBase { - [Test] + [Fact] public void TestCopyMethodMultiString() { @@ -45,7 +44,7 @@ End Class End Namespace"); } - [Test] + [Fact] public void TestCopyMethodSingleString() { @@ -81,7 +80,7 @@ End Class End Namespace"); } - [Test] + [Fact] public void TestCopyMethodAbstractClassString() { @@ -116,7 +115,7 @@ End Class End Namespace"); } - [Test] + [Fact] public void TestCopyProperty() { @@ -174,7 +173,7 @@ End Class End Namespace"); } - [Test] + [Fact] public void TestCopyType() { @@ -202,7 +201,7 @@ Inherits Base End Class"); } - [Test] + [Fact] public void TestSkipExisting() { TestWrongContext(@" @@ -221,7 +220,7 @@ End Class "); } - [Test] + [Fact] public void TestSkipEmpty() { TestWrongContext(@" @@ -234,7 +233,7 @@ End Class "); } - [Test] + [Fact] public void TestInterfaceSimpleCase() { Test(@" @@ -261,7 +260,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestInterfaceMultiCase() { Test(@" @@ -291,8 +290,7 @@ End Sub End Class"); } - //[Ignore] - [Test] + [Fact] public void TestInterfaceNoProblem() { TestWrongContext(@" diff --git a/Tests/VB/CodeRefactorings/CreateChangedEventTests.cs b/Tests/VB/CodeRefactorings/CreateChangedEventTests.cs index 72d82351..297b4327 100644 --- a/Tests/VB/CodeRefactorings/CreateChangedEventTests.cs +++ b/Tests/VB/CodeRefactorings/CreateChangedEventTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class CreateChangedEventTests : VBCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimpleCase() { Test(@" @@ -43,7 +42,7 @@ Public Event TestChanged As System.EventHandler End Class"); } - [Test] + [Fact] public void TestSimplify() { Test(@"Imports System @@ -80,7 +79,7 @@ Public Event TestChanged As EventHandler End Class"); } - [Test] + [Fact] public void TestSharedPropertyCase() { Test(@" @@ -117,7 +116,7 @@ Public Shared Event TestChanged As System.EventHandler End Class"); } - [Test] + [Fact] public void TestNonInheritableClassCase() { Test(@" @@ -154,7 +153,7 @@ Public Event TestChanged As System.EventHandler End Class"); } - [Test] + [Fact] public void TestReadOnlyProperty() { TestWrongContext(@" @@ -169,7 +168,7 @@ End Property End Class"); } - [Test] + [Fact] public void TestWriteOnlyProperty() { TestWrongContext(@" @@ -184,7 +183,7 @@ End Property End Class"); } - [Test] + [Fact] public void TestWrongLocation() { TestWrongContext(@" diff --git a/Tests/VB/CodeRefactorings/CreateOverloadWithoutParameterTests.cs b/Tests/VB/CodeRefactorings/CreateOverloadWithoutParameterTests.cs index 9f4a6ad7..e24eb6bf 100644 --- a/Tests/VB/CodeRefactorings/CreateOverloadWithoutParameterTests.cs +++ b/Tests/VB/CodeRefactorings/CreateOverloadWithoutParameterTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class CreateOverloadWithoutParameterTests : VBCodeRefactoringTestBase { - [Test] + [Fact] public void Test() { Test(@" @@ -23,7 +22,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestWithReturnValue() { Test(@" @@ -42,7 +41,7 @@ End Function End Class"); } - [Test] + [Fact] public void TestWithXmlDoc() { Test(@" @@ -65,7 +64,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestByRefParameter() { Test(@" @@ -83,7 +82,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestDefaultValue() { TestDefaultValue("Object", null, "Nothing"); @@ -128,7 +127,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestOptionalParameter() { TestWrongContext(@" @@ -138,7 +137,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestExistingMethod() { TestWrongContext(@" @@ -157,7 +156,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestInterface() { Test(@" @@ -170,7 +169,7 @@ Sub Test (a As Integer, b As Integer) End Interface"); } - [Test] + [Fact] public void TestExplicitImpl() { TestWrongContext(@" @@ -184,7 +183,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestGenereatedCall() { Test(@" diff --git a/Tests/VB/CodeRefactorings/InvertIfTests.cs b/Tests/VB/CodeRefactorings/InvertIfTests.cs index d3dea57a..cd995e2d 100644 --- a/Tests/VB/CodeRefactorings/InvertIfTests.cs +++ b/Tests/VB/CodeRefactorings/InvertIfTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; -using RefactoringEssentials.VB.CodeRefactorings; +using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class InvertIfTests : VBCodeRefactoringTestBase { - [Test] + [Fact] public void TestSimple() { Test(@" @@ -30,7 +29,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestConditions() { Test(@" @@ -54,7 +53,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestReturn() { Test(@" @@ -75,7 +74,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestInLoop() { Test(@" @@ -100,7 +99,7 @@ End Sub End Class"); } - [Test] + [Fact] public void Test2() { Test(@" @@ -125,7 +124,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestNonVoidMoreComplexMethod() { Test(@" @@ -150,7 +149,7 @@ End Function End Class"); } - [Test] + [Fact] public void TestComment() { Test(@" diff --git a/Tests/VB/CodeRefactorings/InvertLogicalExpressionTests.cs b/Tests/VB/CodeRefactorings/InvertLogicalExpressionTests.cs index df2e0847..d4dfae2e 100644 --- a/Tests/VB/CodeRefactorings/InvertLogicalExpressionTests.cs +++ b/Tests/VB/CodeRefactorings/InvertLogicalExpressionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class InvertLogicalExpressionTests : VBCodeRefactoringTestBase { - [Test] + [Fact] public void ConditionlAnd() { Test(@" @@ -28,7 +27,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ConditionlAndReverse() { Test(@" @@ -50,7 +49,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ConditionlAndAlso() { Test(@" @@ -72,7 +71,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ConditionlAndAlsoReverse() { Test(@" @@ -94,7 +93,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ConditionlOr() { Test(@" @@ -116,7 +115,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ConditionlOrReverse() { Test(@" @@ -138,7 +137,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ConditionlOrElse() { Test(@" @@ -160,7 +159,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ConditionlOrElseReverse() { Test(@" @@ -183,7 +182,7 @@ End Sub } - [Test] + [Fact] public void ConditionlAnd2() { Test(@" @@ -205,7 +204,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ConditionlOr2() { Test(@" @@ -227,7 +226,7 @@ End Sub End Class"); } - [Test] + [Fact] public void Equals() { Test(@" @@ -249,7 +248,7 @@ End Sub End Class"); } - [Test] + [Fact] public void EqualsReverse() { Test(@" @@ -272,7 +271,7 @@ End Sub } - [Test] + [Fact] public void TestNullCoalescing() { TestWrongContext(@" @@ -285,7 +284,7 @@ End Class } - [Test] + [Fact] public void TestUnaryExpression() { Test(@" diff --git a/Tests/VB/CodeRefactorings/ReplaceDirectCastWithSafeCastTests.cs b/Tests/VB/CodeRefactorings/ReplaceDirectCastWithSafeCastTests.cs index 2493cb16..73ec04aa 100644 --- a/Tests/VB/CodeRefactorings/ReplaceDirectCastWithSafeCastTests.cs +++ b/Tests/VB/CodeRefactorings/ReplaceDirectCastWithSafeCastTests.cs @@ -1,9 +1,8 @@ -using NUnit.Framework; using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class ReplaceDirectCastWithSafeCastTests : VBCodeRefactoringTestBase { void TestType(string type) @@ -25,19 +24,19 @@ End Sub Test(input, output); } - [Test] + [Fact] public void Test() { TestType("Exception"); } - [Test] + [Fact] public void TestNullable() { TestType("Integer?"); } - [Test] + [Fact] public void TestWithComment() { string input = @" @@ -60,7 +59,7 @@ End Sub Test(input, output); } - [Test] + [Fact] public void TestNonReferenceType() { TestWrongContext(@" diff --git a/Tests/VB/CodeRefactorings/ReplaceSafeCastWithDirectCastTests.cs b/Tests/VB/CodeRefactorings/ReplaceSafeCastWithDirectCastTests.cs index 47b346fe..da9d23c8 100644 --- a/Tests/VB/CodeRefactorings/ReplaceSafeCastWithDirectCastTests.cs +++ b/Tests/VB/CodeRefactorings/ReplaceSafeCastWithDirectCastTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.VB.CodeRefactorings; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - [TestFixture] public class ReplaceSafeCastWithDirectCastTests : VBCodeRefactoringTestBase { - [Test] + [Fact] public void Test() { Test(@" @@ -22,7 +21,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestWithComment1() { Test(@" @@ -40,7 +39,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestWithComment2() { Test(@" diff --git a/Tests/VB/CodeRefactorings/VBCodeRefactoringTestBase.cs b/Tests/VB/CodeRefactorings/VBCodeRefactoringTestBase.cs index c85943c4..01152d43 100644 --- a/Tests/VB/CodeRefactorings/VBCodeRefactoringTestBase.cs +++ b/Tests/VB/CodeRefactorings/VBCodeRefactoringTestBase.cs @@ -1,5 +1,4 @@ using System; -using NUnit.Framework; using System.Threading; using System.Linq; using System.Collections.Generic; @@ -9,11 +8,11 @@ using System.Collections.Immutable; using Microsoft.CodeAnalysis.CodeActions; using Microsoft.CodeAnalysis.VisualBasic; -using RefactoringEssentials.Tests.VB.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.VB.CodeRefactorings { - public abstract class VBCodeRefactoringTestBase : CodeRefactoringTestBase + public abstract class VBCodeRefactoringTestBase : CodeRefactoringTestBase { public void Test(string input, string output, int action = 0, bool expectErrors = false, VisualBasicParseOptions parseOptions = null) where T : CodeRefactoringProvider, new() @@ -33,7 +32,7 @@ public void Test(CodeRefactoringProvider provider, string input, string output, Console.WriteLine("-----------Got:"); Console.WriteLine(result); } - Assert.AreEqual(output, result); + Assert.Equal(output, result); } internal static List GetActions(string input) where T : CodeRefactoringProvider, new() @@ -106,7 +105,7 @@ static List GetActions(CodeRefactoringProvider action, string input, { foreach (var nra in actions.OfType()) { - Assert.AreEqual(markedSpan, nra.TextSpan, "Activation span does not match."); + Assert.True(markedSpan == nra.TextSpan, "Activation span does not match."); } } return actions; @@ -133,7 +132,7 @@ protected void TestWrongContext(CodeRefactoringProvider action, string input) Document doc; DiagnosticTestBase.TestWorkspace workspace; var actions = GetActions(action, input, out workspace, out doc); - Assert.IsTrue(actions == null || actions.Count == 0, action.GetType() + " shouldn't be valid there."); + Assert.True(actions == null || actions.Count == 0, action.GetType() + " shouldn't be valid there."); } @@ -154,7 +153,7 @@ protected void TestWrongContext(CodeRefactoringProvider action, string input) // var ctx = TestRefactoringContext.Create(input); // ctx.FormattingOptions = formattingOptions; // var actions = provider.GetActions(ctx).ToList(); - // Assert.AreEqual( + // Assert.Equal( // expected, // actions.Select(a => a.Description).ToArray()); // } diff --git a/Tests/VB/Converter/ExpressionTests.cs b/Tests/VB/Converter/ExpressionTests.cs index bae4040a..1a4f98ff 100644 --- a/Tests/VB/Converter/ExpressionTests.cs +++ b/Tests/VB/Converter/ExpressionTests.cs @@ -1,16 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using NUnit.Framework; +using Xunit; namespace RefactoringEssentials.Tests.VB.Converter { - [TestFixture] public class ExpressionTests : ConverterTestBase { - [Test] + [Fact] public void MultilineString() { TestConversionCSharpToVisualBasic(@" @@ -29,7 +23,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ConditionalExpression() { TestConversionCSharpToVisualBasic(@" @@ -46,7 +40,7 @@ End Sub End Class"); } - [Test] + [Fact] public void NullCoalescingExpression() { TestConversionCSharpToVisualBasic(@" @@ -63,7 +57,7 @@ End Sub End Class"); } - [Test] + [Fact] public void MemberAccessAndInvocationExpression() { TestConversionCSharpToVisualBasic(@" @@ -86,7 +80,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ElvisOperatorExpression() { TestConversionCSharpToVisualBasic(@" @@ -109,7 +103,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ObjectInitializerExpression() { TestConversionCSharpToVisualBasic(@" @@ -139,7 +133,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ObjectInitializerExpression2() { TestConversionCSharpToVisualBasic(@" @@ -159,7 +153,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ThisMemberAccessExpression() { TestConversionCSharpToVisualBasic(@" @@ -180,7 +174,7 @@ End Sub End Class"); } - [Test] + [Fact] public void BaseMemberAccessExpression() { TestConversionCSharpToVisualBasic(@" @@ -208,7 +202,7 @@ End Sub End Class"); } - [Test] + [Fact] public void DelegateExpression() { TestConversionCSharpToVisualBasic(@" @@ -228,7 +222,7 @@ End Sub End Class"); } - [Test] + [Fact] public void LambdaBodyExpression() { TestConversionCSharpToVisualBasic(@" @@ -256,7 +250,7 @@ End Sub End Class"); } - [Test] + [Fact] public void Await() { TestConversionCSharpToVisualBasic(@" @@ -284,7 +278,7 @@ End Sub End Class"); } - [Test] + [Fact] public void Linq1() { TestConversionCSharpToVisualBasic(@"static void SimpleQuery() @@ -308,7 +302,7 @@ For Each n In res End Sub"); } - [Test] + [Fact] public void Linq2() { TestConversionCSharpToVisualBasic(@"public static void Linq40() @@ -343,7 +337,7 @@ For Each n In g.Numbers End Sub"); } - [Test] + [Fact] public void Linq3() { TestConversionCSharpToVisualBasic(@"class Product { @@ -392,7 +386,7 @@ End Sub End Class"); } - [Test] + [Fact] public void Linq4() { TestConversionCSharpToVisualBasic(@"public void Linq103() diff --git a/Tests/VB/Converter/MemberTests.cs b/Tests/VB/Converter/MemberTests.cs index a8293f53..808cdd36 100644 --- a/Tests/VB/Converter/MemberTests.cs +++ b/Tests/VB/Converter/MemberTests.cs @@ -1,16 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using NUnit.Framework; +using Xunit; namespace RefactoringEssentials.Tests.VB.Converter { - [TestFixture] public class MemberTests : ConverterTestBase { - [Test] + [Fact] public void TestField() { TestConversionCSharpToVisualBasic( @@ -26,7 +20,7 @@ public void TestField() End Class"); } - [Test] + [Fact] public void TestMethod() { TestConversionCSharpToVisualBasic( @@ -47,7 +41,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestMethodWithReturnType() { TestConversionCSharpToVisualBasic( @@ -64,7 +58,7 @@ End Function End Class"); } - [Test] + [Fact] public void TestStaticMethod() { TestConversionCSharpToVisualBasic( @@ -85,7 +79,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestAbstractMethod() { TestConversionCSharpToVisualBasic( @@ -97,7 +91,7 @@ Public MustOverride Sub TestMethod() End Class"); } - [Test] + [Fact] public void TestSealedMethod() { TestConversionCSharpToVisualBasic( @@ -118,7 +112,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestExtensionMethod() { TestConversionCSharpToVisualBasic( @@ -136,7 +130,7 @@ End Sub End Module"); } - [Test] + [Fact] public void TestExtensionMethodWithExistingImport() { TestConversionCSharpToVisualBasic( @@ -156,7 +150,7 @@ End Sub End Module"); } - [Test] + [Fact] public void TestProperty() { TestConversionCSharpToVisualBasic( @@ -193,7 +187,7 @@ End Property End Class"); } - [Test] + [Fact] public void TestConstructor() { TestConversionCSharpToVisualBasic( @@ -208,7 +202,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestDestructor() { TestConversionCSharpToVisualBasic( @@ -223,7 +217,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestEvent() { TestConversionCSharpToVisualBasic( @@ -235,7 +229,7 @@ Public Event MyEvent As EventHandler End Class"); } - [Test] + [Fact] public void TestCustomEvent() { TestConversionCSharpToVisualBasic( @@ -267,7 +261,7 @@ End Event End Class"); } - [Test] + [Fact] public void TestIndexer() { TestConversionCSharpToVisualBasic( diff --git a/Tests/VB/Converter/NamespaceLevelTests.cs b/Tests/VB/Converter/NamespaceLevelTests.cs index 251bc39f..569e5e25 100644 --- a/Tests/VB/Converter/NamespaceLevelTests.cs +++ b/Tests/VB/Converter/NamespaceLevelTests.cs @@ -1,12 +1,10 @@ - -using NUnit.Framework; +using Xunit; namespace RefactoringEssentials.Tests.VB.Converter { - [TestFixture] public class NamespaceLevelTests : ConverterTestBase { - [Test] + [Fact] public void TestNamespace() { TestConversionCSharpToVisualBasic(@"namespace Test @@ -16,7 +14,7 @@ public void TestNamespace() End Namespace"); } - [Test] + [Fact] public void TestTopLevelAttribute() { TestConversionCSharpToVisualBasic( @@ -24,7 +22,7 @@ public void TestTopLevelAttribute() @""); } - [Test] + [Fact] public void TestImports() { TestConversionCSharpToVisualBasic( @@ -34,7 +32,7 @@ public void TestImports() Imports VB = Microsoft.VisualBasic"); } - [Test] + [Fact] public void TestClass() { TestConversionCSharpToVisualBasic(@"namespace Test.@class @@ -48,7 +46,7 @@ End Class End Namespace"); } - [Test] + [Fact] public void TestInternalStaticClass() { TestConversionCSharpToVisualBasic(@"namespace Test.@class @@ -69,7 +67,7 @@ End Module End Namespace"); } - [Test] + [Fact] public void TestAbstractClass() { TestConversionCSharpToVisualBasic(@"namespace Test.@class @@ -83,7 +81,7 @@ End Class End Namespace"); } - [Test] + [Fact] public void TestSealedClass() { TestConversionCSharpToVisualBasic(@"namespace Test.@class @@ -97,7 +95,7 @@ End Class End Namespace"); } - [Test] + [Fact] public void TestInterface() { TestConversionCSharpToVisualBasic( @@ -111,7 +109,7 @@ Sub Test() End Interface"); } - [Test] + [Fact] public void TestEnum() { TestConversionCSharpToVisualBasic( @@ -129,7 +127,7 @@ public void TestEnum() End Enum"); } - [Test] + [Fact] public void TestClassInheritanceList() { TestConversionCSharpToVisualBasic( @@ -154,7 +152,7 @@ Protected MustOverride Sub Test() End Class"); } - [Test] + [Fact] public void TestStruct() { TestConversionCSharpToVisualBasic( @@ -169,7 +167,7 @@ End Sub End Structure"); } - [Test] + [Fact] public void TestDelegate() { TestConversionCSharpToVisualBasic( @@ -186,7 +184,7 @@ public void TestDelegate() @"Public Delegate Sub Test(ByRef x As Integer)"); } - [Test] + [Fact] public void MoveImportsStatement() { TestConversionCSharpToVisualBasic("namespace test { using SomeNamespace; }", @@ -196,7 +194,7 @@ Namespace test End Namespace"); } - [Test] + [Fact] public void ClassImplementsInterface() { TestConversionCSharpToVisualBasic("using System; class test : IComparable { }", @@ -205,7 +203,7 @@ Implements IComparable End Class"); } - [Test] + [Fact] public void ClassImplementsInterface2() { TestConversionCSharpToVisualBasic("class test : System.IComparable { }", @@ -214,7 +212,7 @@ Implements System.IComparable End Class"); } - [Test] + [Fact] public void ClassInheritsClass() { TestConversionCSharpToVisualBasic("using System.IO; class test : InvalidDataException { }", @@ -225,7 +223,7 @@ Inherits InvalidDataException End Class"); } - [Test] + [Fact] public void ClassInheritsClass2() { TestConversionCSharpToVisualBasic("class test : System.IO.InvalidDataException { }", diff --git a/Tests/VB/Converter/SpecialConversionTests.cs b/Tests/VB/Converter/SpecialConversionTests.cs index ce0833cf..16a7529c 100644 --- a/Tests/VB/Converter/SpecialConversionTests.cs +++ b/Tests/VB/Converter/SpecialConversionTests.cs @@ -1,16 +1,10 @@ -using NUnit.Framework; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using Xunit; namespace RefactoringEssentials.Tests.VB.Converter { - [TestFixture] public class SpecialConversionTests : ConverterTestBase { - [Test] + [Fact] public void TestSimpleInlineAssign() { TestConversionCSharpToVisualBasic( @@ -35,7 +29,7 @@ End Function End Class"); } - [Test] + [Fact] public void TestSimplePostIncrementAssign() { TestConversionCSharpToVisualBasic( @@ -54,7 +48,7 @@ End Sub End Class"); } - [Test] + [Fact] public void RaiseEvent() { TestConversionCSharpToVisualBasic( @@ -135,7 +129,7 @@ End Sub End Class"); } - [Test] + [Fact] public void IfStatementSimilarToRaiseEvent() { TestConversionCSharpToVisualBasic( diff --git a/Tests/VB/Converter/StatementTests.cs b/Tests/VB/Converter/StatementTests.cs index 854fa804..d28cb48a 100644 --- a/Tests/VB/Converter/StatementTests.cs +++ b/Tests/VB/Converter/StatementTests.cs @@ -1,16 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using NUnit.Framework; +using Xunit; namespace RefactoringEssentials.Tests.VB.Converter { - [TestFixture] public class StatementTests : ConverterTestBase { - [Test] + [Fact] public void EmptyStatement() { TestConversionCSharpToVisualBasic(@" @@ -40,7 +34,7 @@ End Sub End Class"); } - [Test] + [Fact] public void AssignmentStatement() { TestConversionCSharpToVisualBasic(@" @@ -59,7 +53,7 @@ End Sub End Class"); } - [Test] + [Fact] public void AssignmentStatementInDeclaration() { TestConversionCSharpToVisualBasic(@" @@ -76,7 +70,7 @@ End Sub End Class"); } - [Test] + [Fact] public void AssignmentStatementInVarDeclaration() { TestConversionCSharpToVisualBasic(@" @@ -93,7 +87,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ObjectInitializationStatement() { TestConversionCSharpToVisualBasic(@" @@ -112,7 +106,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ObjectInitializationStatementInDeclaration() { TestConversionCSharpToVisualBasic(@" @@ -129,7 +123,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ObjectInitializationStatementInVarDeclaration() { TestConversionCSharpToVisualBasic(@" @@ -146,7 +140,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ArrayDeclarationStatement() { TestConversionCSharpToVisualBasic(@" @@ -163,7 +157,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ArrayInitializationStatement() { TestConversionCSharpToVisualBasic(@" @@ -180,7 +174,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ArrayInitializationStatementInVarDeclaration() { TestConversionCSharpToVisualBasic(@" @@ -197,7 +191,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ArrayInitializationStatementWithType() { TestConversionCSharpToVisualBasic(@" @@ -214,7 +208,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ArrayInitializationStatementWithLength() { TestConversionCSharpToVisualBasic(@" @@ -231,7 +225,7 @@ End Sub End Class"); } - [Test] + [Fact] public void MultidimensionalArrayDeclarationStatement() { TestConversionCSharpToVisualBasic(@" @@ -248,7 +242,7 @@ End Sub End Class"); } - [Test] + [Fact] public void MultidimensionalArrayInitializationStatement() { TestConversionCSharpToVisualBasic(@" @@ -265,7 +259,7 @@ End Sub End Class"); } - [Test] + [Fact] public void MultidimensionalArrayInitializationStatementWithType() { TestConversionCSharpToVisualBasic(@" @@ -282,7 +276,7 @@ End Sub End Class"); } - [Test] + [Fact] public void MultidimensionalArrayInitializationStatementWithLengths() { TestConversionCSharpToVisualBasic(@" @@ -299,7 +293,7 @@ End Sub End Class"); } - [Test] + [Fact] public void JaggedArrayDeclarationStatement() { TestConversionCSharpToVisualBasic(@" @@ -316,7 +310,7 @@ End Sub End Class"); } - [Test] + [Fact] public void JaggedArrayInitializationStatement() { TestConversionCSharpToVisualBasic(@" @@ -333,7 +327,7 @@ End Sub End Class"); } - [Test] + [Fact] public void JaggedArrayInitializationStatementWithType() { TestConversionCSharpToVisualBasic(@" @@ -350,7 +344,7 @@ End Sub End Class"); } - [Test] + [Fact] public void JaggedArrayInitializationStatementWithLength() { TestConversionCSharpToVisualBasic(@" @@ -367,7 +361,7 @@ End Sub End Class"); } - [Test] + [Fact] public void DeclarationStatements() { TestConversionCSharpToVisualBasic( @@ -391,7 +385,7 @@ End Sub End Class"); } - [Test] + [Fact] public void IfStatement() { TestConversionCSharpToVisualBasic(@" @@ -427,7 +421,7 @@ End Sub End Class"); } - [Test] + [Fact] public void WhileStatement() { TestConversionCSharpToVisualBasic(@" @@ -460,7 +454,7 @@ End Sub End Class"); } - [Test] + [Fact] public void DoWhileStatement() { TestConversionCSharpToVisualBasic(@" @@ -494,7 +488,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ForEachStatementWithExplicitType() { TestConversionCSharpToVisualBasic(@" @@ -520,7 +514,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ForEachStatementWithVar() { TestConversionCSharpToVisualBasic(@" @@ -546,7 +540,7 @@ End Sub End Class"); } - [Test] + [Fact] public void SyncLockStatement() { TestConversionCSharpToVisualBasic(@" @@ -571,7 +565,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ForWithUnknownConditionAndSingleStatement() { TestConversionCSharpToVisualBasic(@" @@ -594,7 +588,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ForWithUnknownConditionAndBlock() { TestConversionCSharpToVisualBasic(@" @@ -618,7 +612,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ForWithSingleStatement() { TestConversionCSharpToVisualBasic(@" @@ -637,7 +631,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ForWithBlock() { TestConversionCSharpToVisualBasic(@" @@ -658,7 +652,7 @@ End Sub End Class"); } - [Test] + [Fact] public void LabeledAndForStatement() { TestConversionCSharpToVisualBasic(@" @@ -741,7 +735,7 @@ End Sub End Class"); } - [Test] + [Fact] public void ThrowStatement() { TestConversionCSharpToVisualBasic(@" @@ -759,7 +753,7 @@ End Sub End Class"); } - [Test] + [Fact] public void AddRemoveHandler() { TestConversionCSharpToVisualBasic(@"using System; @@ -802,7 +796,7 @@ End Sub End Class"); } - [Test] + [Fact] public void SelectCase1() { TestConversionCSharpToVisualBasic(@" @@ -852,7 +846,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TryCatch() { TestConversionCSharpToVisualBasic(@" @@ -922,7 +916,7 @@ End Sub End Class"); } - [Test] + [Fact] public void Yield() { TestConversionCSharpToVisualBasic(@" diff --git a/Tests/VB/Converter/TypeCastTests.cs b/Tests/VB/Converter/TypeCastTests.cs index 8c8705e5..88ee37f9 100644 --- a/Tests/VB/Converter/TypeCastTests.cs +++ b/Tests/VB/Converter/TypeCastTests.cs @@ -1,16 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using NUnit.Framework; +using Xunit; namespace RefactoringEssentials.Tests.VB.Converter { - [TestFixture] public class TypeCastTests : ConverterTestBase { - [Test] + [Fact] public void CastObjectToInteger() { TestConversionCSharpToVisualBasic( @@ -26,7 +20,7 @@ End Sub "); } - [Test] + [Fact] public void CastObjectToString() { TestConversionCSharpToVisualBasic( @@ -42,7 +36,7 @@ End Sub "); } - [Test] + [Fact] public void CastObjectToGenericList() { TestConversionCSharpToVisualBasic( @@ -58,7 +52,7 @@ End Sub "); } - [Test] + [Fact] public void TryCastObjectToInteger() { TestConversionCSharpToVisualBasic( @@ -74,7 +68,7 @@ End Sub "); } - [Test] + [Fact] public void TryCastObjectToGenericList() { TestConversionCSharpToVisualBasic( @@ -90,7 +84,7 @@ End Sub "); } - [Test] + [Fact] public void CastConstantNumberToLong() { TestConversionCSharpToVisualBasic( @@ -104,7 +98,7 @@ End Sub "); } - [Test] + [Fact] public void CastConstantNumberToFloat() { TestConversionCSharpToVisualBasic( @@ -118,7 +112,7 @@ End Sub "); } - [Test] + [Fact] public void CastConstantNumberToDecimal() { TestConversionCSharpToVisualBasic( diff --git a/Tests/VB/Diagnostics/NameOfSuggestionTests.cs b/Tests/VB/Diagnostics/NameOfSuggestionTests.cs index 04f17d4b..85d7cf1f 100644 --- a/Tests/VB/Diagnostics/NameOfSuggestionTests.cs +++ b/Tests/VB/Diagnostics/NameOfSuggestionTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; using RefactoringEssentials.VB.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.VB.Diagnostics { - [TestFixture] - public class NameOfSuggestionTests : VBDiagnosticTestBase + public class NameOfSuggestionTests : VBDiagnosticTestBase { - [Test] + [Fact] public void TestArgumentNullExceptionInMethod() { Analyze(@" @@ -24,7 +23,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestArgumentException() { Analyze(@" @@ -46,7 +45,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestArgumentOutOfRangeExceptionSwap() { Analyze(@" @@ -64,7 +63,7 @@ End Sub End Class", 0); } - [Test] + [Fact] public void TestArgumentNullExceptionInConstructor() { Analyze(@" @@ -82,7 +81,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestArgumentNullExceptionInEventHandlerAccessor() { Analyze(@" @@ -110,7 +109,7 @@ End Event End Class"); } - [Test] + [Fact] public void TestArgumentNullExceptionInGetAccessor() { Analyze(@" @@ -136,7 +135,7 @@ End Property End Class"); } - [Test] + [Fact] public void TestArgumentNullExceptionInIndexer() { Analyze(@" @@ -162,7 +161,7 @@ End Property End Class"); } - [Test] + [Fact] public void TestArgumentNullExceptionInLambda() { Analyze(@" diff --git a/Tests/VB/Diagnostics/NonPublicMethodWithTestAttributeTests.cs b/Tests/VB/Diagnostics/NonPublicMethodWithTestAttributeTests.cs index 5541dd10..333c20ff 100644 --- a/Tests/VB/Diagnostics/NonPublicMethodWithTestAttributeTests.cs +++ b/Tests/VB/Diagnostics/NonPublicMethodWithTestAttributeTests.cs @@ -1,10 +1,9 @@ -using NUnit.Framework; using RefactoringEssentials.VB.Diagnostics; +using Xunit; namespace RefactoringEssentials.Tests.VB.Diagnostics { - [TestFixture] - public class NonPublicMethodWithTestAttributeTests : VBDiagnosticTestBase + public class NonPublicMethodWithTestAttributeTests : VBDiagnosticTestBase { const string NUnitClasses = @"Imports System Imports NUnit.Framework @@ -18,7 +17,7 @@ Inherits System.Attribute End Class End Namespace"; - [Test] + [Fact] public void TestImplicitPrivate() { Analyze(NUnitClasses + @@ -38,7 +37,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestExplicitPrivate() { Analyze(NUnitClasses + @@ -58,7 +57,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestExplicitProtected() { Analyze(NUnitClasses + @@ -78,7 +77,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestExplicitInternal() { Analyze(NUnitClasses + @@ -98,7 +97,7 @@ End Sub End Class"); } - [Test] + [Fact] public void TestDisable() { Analyze(NUnitClasses + @" diff --git a/Tests/VB/Diagnostics/VBDiagnosticTestBase.cs b/Tests/VB/Diagnostics/VBDiagnosticTestBase.cs index 171a6a82..175b58bd 100644 --- a/Tests/VB/Diagnostics/VBDiagnosticTestBase.cs +++ b/Tests/VB/Diagnostics/VBDiagnosticTestBase.cs @@ -6,7 +6,7 @@ namespace RefactoringEssentials.Tests.VB.Diagnostics { - public class VBDiagnosticTestBase : DiagnosticTestBase + public class VBDiagnosticTestBase : DiagnosticTestBase { public static VisualBasicCompilation CreateCompilation( IEnumerable trees, diff --git a/Tests/packages.config b/Tests/packages.config index 95e2118e..3e0561a7 100644 --- a/Tests/packages.config +++ b/Tests/packages.config @@ -9,7 +9,6 @@ - @@ -27,4 +26,11 @@ + + + + + + + \ No newline at end of file diff --git a/Vsix/CodeConversion.cs b/Vsix/CodeConversion.cs index d0a02c04..ae889201 100644 --- a/Vsix/CodeConversion.cs +++ b/Vsix/CodeConversion.cs @@ -4,15 +4,11 @@ using Microsoft.VisualStudio.Text.Editor; using RefactoringEssentials.Converter; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows; namespace RefactoringEssentials.VsExtension { - static class CodeConversion + static class CodeConversion { public static readonly string CSToVBConversionTitle = "Convert C# to VB:"; public static readonly string VBToCSConversionTitle = "Convert VB to C#:"; diff --git a/Vsix/ConvertCSToVBCommand.cs b/Vsix/ConvertCSToVBCommand.cs index 06b4474d..d36fe0f4 100644 --- a/Vsix/ConvertCSToVBCommand.cs +++ b/Vsix/ConvertCSToVBCommand.cs @@ -1,24 +1,14 @@ using System; using System.ComponentModel.Design; -using System.Globalization; using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using Microsoft.VisualStudio.TextManager.Interop; -using Microsoft.VisualStudio.Text.Editor; -using Microsoft.VisualStudio.Editor; -using System.Windows; -using Microsoft.VisualStudio.Text; -using RefactoringEssentials.Converter; -using Microsoft.VisualStudio; -using System.Runtime.InteropServices; using System.IO; namespace RefactoringEssentials.VsExtension { - /// - /// Command handler - /// - internal sealed class ConvertCSToVBCommand + /// + /// Command handler + /// + internal sealed class ConvertCSToVBCommand { public const int MainMenuCommandId = 0x0100; public const int CtxMenuCommandId = 0x0101; diff --git a/Vsix/ConvertVBToCSCommand.cs b/Vsix/ConvertVBToCSCommand.cs index 76f484e8..02f4327c 100644 --- a/Vsix/ConvertVBToCSCommand.cs +++ b/Vsix/ConvertVBToCSCommand.cs @@ -1,24 +1,14 @@ using System; using System.ComponentModel.Design; -using System.Globalization; using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using Microsoft.VisualStudio.TextManager.Interop; -using Microsoft.VisualStudio.Text.Editor; -using Microsoft.VisualStudio.Editor; -using System.Windows; -using Microsoft.VisualStudio.Text; -using RefactoringEssentials.Converter; -using Microsoft.VisualStudio; -using System.Runtime.InteropServices; using System.IO; namespace RefactoringEssentials.VsExtension { - /// - /// Command handler - /// - internal sealed class ConvertVBToCSCommand + /// + /// Command handler + /// + internal sealed class ConvertVBToCSCommand { public const int MainMenuCommandId = 0x0200; public const int CtxMenuCommandId = 0x0201; diff --git a/Vsix/GeneralOptionsDialogPageControl.cs b/Vsix/GeneralOptionsDialogPageControl.cs index a8c1095e..84e87e38 100644 --- a/Vsix/GeneralOptionsDialogPageControl.cs +++ b/Vsix/GeneralOptionsDialogPageControl.cs @@ -1,16 +1,9 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; namespace RefactoringEssentials.VsExtension { - public partial class GeneralOptionsDialogPageControl : UserControl + public partial class GeneralOptionsDialogPageControl : UserControl { public GeneralOptionsDialogPageControl() { diff --git a/Vsix/REConverterPackage.cs b/Vsix/REConverterPackage.cs index 229c839c..fedfd674 100644 --- a/Vsix/REConverterPackage.cs +++ b/Vsix/REConverterPackage.cs @@ -5,37 +5,31 @@ //------------------------------------------------------------------------------ using System; -using System.ComponentModel.Design; -using System.Diagnostics; using System.Diagnostics.CodeAnalysis; -using System.Globalization; using System.Runtime.InteropServices; using Microsoft.VisualStudio; -using Microsoft.VisualStudio.OLE.Interop; using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using Microsoft.Win32; namespace RefactoringEssentials.VsExtension { - /// - /// This is the class that implements the package exposed by this assembly. - /// - /// - /// - /// The minimum requirement for a class to be considered a valid package for Visual Studio - /// is to implement the IVsPackage interface and register itself with the shell. - /// This package uses the helper classes defined inside the Managed Package Framework (MPF) - /// to do it: it derives from the Package class that provides the implementation of the - /// IVsPackage interface and uses the registration attributes defined in the framework to - /// register itself and its components with the shell. These attributes tell the pkgdef creation - /// utility what data to put into .pkgdef file. - /// - /// - /// To get loaded into VS, the package must be referred by <Asset Type="Microsoft.VisualStudio.VsPackage" ...> in .vsixmanifest file. - /// - /// - [PackageRegistration(UseManagedResourcesOnly = true)] + /// + /// This is the class that implements the package exposed by this assembly. + /// + /// + /// + /// The minimum requirement for a class to be considered a valid package for Visual Studio + /// is to implement the IVsPackage interface and register itself with the shell. + /// This package uses the helper classes defined inside the Managed Package Framework (MPF) + /// to do it: it derives from the Package class that provides the implementation of the + /// IVsPackage interface and uses the registration attributes defined in the framework to + /// register itself and its components with the shell. These attributes tell the pkgdef creation + /// utility what data to put into .pkgdef file. + /// + /// + /// To get loaded into VS, the package must be referred by <Asset Type="Microsoft.VisualStudio.VsPackage" ...> in .vsixmanifest file. + /// + /// + [PackageRegistration(UseManagedResourcesOnly = true)] [InstalledProductRegistration("#110", "#112", "1.0")] // Info on this package for Help/About [ProvideMenuResource("Menus.ctmenu", 1)] [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExistsAndFullyLoaded_string)] diff --git a/Vsix/VisualStudioInteraction.cs b/Vsix/VisualStudioInteraction.cs index 9891d4b1..96b84f06 100644 --- a/Vsix/VisualStudioInteraction.cs +++ b/Vsix/VisualStudioInteraction.cs @@ -6,15 +6,11 @@ using Microsoft.VisualStudio.Text.Editor; using Microsoft.VisualStudio.TextManager.Interop; using System; -using System.Collections.Generic; -using System.Linq; using System.Runtime.InteropServices; -using System.Text; -using System.Threading.Tasks; namespace RefactoringEssentials.VsExtension { - static class VisualStudioInteraction + static class VisualStudioInteraction { public static bool GetSingleSelectedItem(out IVsHierarchy hierarchy, out uint itemID) { From f1a3552f3dc0fa53404bcd488ccc283151ce9083 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Tue, 31 Jan 2017 10:32:27 +0100 Subject: [PATCH 069/236] Replace .Result with .GetAwaiter().GetResult() --- ...ddCatchExceptionCodeRefactoringProvider.cs | 2 +- ...RegionDirectivesCodeRefactoringProvider.cs | 6 +++--- .../CSharp/Diagnostics/InsertionAction.cs | 6 +++--- .../CSharp/CodeFixes/CSharpCodeFixTestBase.cs | 6 +++--- .../CSharpCodeRefactoringTestBase.cs | 4 ++-- Tests/Common/ConverterTestBase.cs | 4 ++-- Tests/Common/DiagnosticTestBase.cs | 21 ++++++++++--------- Tests/SymbolChecksTest.cs | 4 ++-- .../VBCodeRefactoringTestBase.cs | 4 ++-- 9 files changed, 29 insertions(+), 28 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/AddCatchExceptionCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/AddCatchExceptionCodeRefactoringProvider.cs index 4b9642cf..f6359c40 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/AddCatchExceptionCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/AddCatchExceptionCodeRefactoringProvider.cs @@ -27,7 +27,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte return; var root = await model.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); - var exceptionType = document.Project.GetCompilationAsync().Result.GetTypeByMetadataName("System.Exception"); + var exceptionType = (await document.Project.GetCompilationAsync().ConfigureAwait(false)).GetTypeByMetadataName("System.Exception"); var catchClause = root.FindNode(span) as CatchClauseSyntax; if (catchClause == null || catchClause.Declaration != null) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/RemoveRegionEndRegionDirectivesCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/RemoveRegionEndRegionDirectivesCodeRefactoringProvider.cs index e0520993..32c1cece 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/RemoveRegionEndRegionDirectivesCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/RemoveRegionEndRegionDirectivesCodeRefactoringProvider.cs @@ -36,18 +36,18 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte directive.Span, DiagnosticSeverity.Info, GettextCatalog.GetString("Remove region/endregion directives"), - t2 => + async t2 => { var structure = directive.GetStructure(); // var prev = directive.GetPreviousTrivia (model.SyntaxTree, cancellationToken, true); var end = structure as DirectiveTriviaSyntax; - SourceText text = document.GetTextAsync(cancellationToken).Result; + SourceText text = await document.GetTextAsync(cancellationToken).ConfigureAwait(false); foreach (var e in end.GetRelatedDirectives().OrderByDescending(e => e.SpanStart)) { var line = text.Lines.GetLineFromPosition(e.FullSpan.Start); text = text.Replace(line.SpanIncludingLineBreak, ""); } - return Task.FromResult(document.WithText(text)); + return document.WithText(text); } ) ); diff --git a/RefactoringEssentials/CSharp/Diagnostics/InsertionAction.cs b/RefactoringEssentials/CSharp/Diagnostics/InsertionAction.cs index 56b44cb3..3ca79695 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/InsertionAction.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/InsertionAction.cs @@ -41,17 +41,17 @@ public InsertionAction(TextSpan textSpan, DiagnosticSeverity severity, string ti protected override Task GetChangedDocumentAsync(CancellationToken cancellationToken) { - return createInsertion.Invoke(cancellationToken).ContinueWith(t => CreateChangedDocument(t, cancellationToken).Result); + return createInsertion.Invoke(cancellationToken).ContinueWith(t => CreateChangedDocument(t, cancellationToken).GetAwaiter().GetResult()); } static async Task CreateChangedDocument(Task task, CancellationToken cancellationToken) { - var insertionResult = task.Result; + var insertionResult = task.GetAwaiter().GetResult(); var document = insertionResult.Context.Document; var model = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); var root = await model.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); - var targetType = root.FindNode(task.Result.Location.SourceSpan).AncestorsAndSelf().OfType().FirstOrDefault(); + var targetType = root.FindNode(insertionResult.Location.SourceSpan).AncestorsAndSelf().OfType().FirstOrDefault(); var childNodes = targetType.Members; var memberToInsert = (MemberDeclarationSyntax)insertionResult.Node.WithAdditionalAnnotations(Formatter.Annotation); diff --git a/Tests/CSharp/CodeFixes/CSharpCodeFixTestBase.cs b/Tests/CSharp/CodeFixes/CSharpCodeFixTestBase.cs index a54d9b15..eb8293ba 100644 --- a/Tests/CSharp/CodeFixes/CSharpCodeFixTestBase.cs +++ b/Tests/CSharp/CodeFixes/CSharpCodeFixTestBase.cs @@ -96,7 +96,7 @@ static List GetActions(CodeFixProvider action, string input, out Dia ); doc = workspace.CurrentSolution.GetProject(projectId).GetDocument(documentId); var actions = new List>>(); - var model = doc.GetSemanticModelAsync().Result; + var model = doc.GetSemanticModelAsync().GetAwaiter().GetResult(); var diagnostics = model.GetDiagnostics(); if (diagnostics.Length == 0) return new List(); @@ -126,11 +126,11 @@ protected string RunContextAction(CodeFixProvider action, string input, int acti if (actions.Count < actionIndex) Console.WriteLine("invalid input is:" + input); var a = actions[actionIndex]; - foreach (var op in a.GetOperationsAsync(default(CancellationToken)).Result) + foreach (var op in a.GetOperationsAsync(default(CancellationToken)).GetAwaiter().GetResult()) { op.Apply(workspace, default(CancellationToken)); } - return workspace.CurrentSolution.GetDocument(doc.Id).GetTextAsync().Result.ToString(); + return workspace.CurrentSolution.GetDocument(doc.Id).GetTextAsync().GetAwaiter().GetResult().ToString(); } protected void TestWrongContext(string input) where T : CodeFixProvider, new() diff --git a/Tests/CSharp/CodeRefactorings/CSharpCodeRefactoringTestBase.cs b/Tests/CSharp/CodeRefactorings/CSharpCodeRefactoringTestBase.cs index 4111bbdf..2e7de5b4 100644 --- a/Tests/CSharp/CodeRefactorings/CSharpCodeRefactoringTestBase.cs +++ b/Tests/CSharp/CodeRefactorings/CSharpCodeRefactoringTestBase.cs @@ -121,11 +121,11 @@ protected string RunContextAction(CodeRefactoringProvider action, string input, if (actions.Count < actionIndex) Console.WriteLine("invalid input is:" + input); var a = actions[actionIndex]; - foreach (var op in a.GetOperationsAsync(default(CancellationToken)).Result) + foreach (var op in a.GetOperationsAsync(default(CancellationToken)).GetAwaiter().GetResult()) { op.Apply(workspace, default(CancellationToken)); } - var result = workspace.CurrentSolution.GetDocument(doc.Id).GetTextAsync().Result.ToString(); + var result = workspace.CurrentSolution.GetDocument(doc.Id).GetTextAsync().GetAwaiter().GetResult().ToString(); if (Environment.NewLine != "\r\n") result = result.Replace("\r\n", Environment.NewLine); return result; diff --git a/Tests/Common/ConverterTestBase.cs b/Tests/Common/ConverterTestBase.cs index 3b3c143e..4a233e0c 100644 --- a/Tests/Common/ConverterTestBase.cs +++ b/Tests/Common/ConverterTestBase.cs @@ -115,9 +115,9 @@ public void TestConversionCSharpToVisualBasic(string csharpCode, string expected Document inputDocument, outputDocument; CSharpWorkspaceSetup(csharpCode, out csharpWorkspace, out inputDocument, csharpOptions); VBWorkspaceSetup(out vbWorkspace, out outputDocument, vbOptions); - var outputNode = Convert((CSharpSyntaxNode)inputDocument.GetSyntaxRootAsync().Result, inputDocument.GetSemanticModelAsync().Result, outputDocument); + var outputNode = Convert((CSharpSyntaxNode)inputDocument.GetSyntaxRootAsync().GetAwaiter().GetResult(), inputDocument.GetSemanticModelAsync().GetAwaiter().GetResult(), outputDocument); - var txt = outputDocument.WithSyntaxRoot(Formatter.Format(outputNode, vbWorkspace)).GetTextAsync().Result.ToString(); + var txt = outputDocument.WithSyntaxRoot(Formatter.Format(outputNode, vbWorkspace)).GetTextAsync().GetAwaiter().GetResult().ToString(); txt = Utils.HomogenizeEol(txt).TrimEnd(); expectedVisualBasicCode = Utils.HomogenizeEol(expectedVisualBasicCode).TrimEnd(); if (expectedVisualBasicCode != txt) diff --git a/Tests/Common/DiagnosticTestBase.cs b/Tests/Common/DiagnosticTestBase.cs index 7dda0de2..9e3ecbe6 100644 --- a/Tests/Common/DiagnosticTestBase.cs +++ b/Tests/Common/DiagnosticTestBase.cs @@ -128,7 +128,7 @@ protected static void RunFix(Workspace workspace, ProjectId projectId, DocumentI Assert.True(false, "Provider has no fix for " + diagnostic.Id + " at " + diagnostic.Location.SourceSpan); return; } - foreach (var op in actions[index].GetOperationsAsync(default(CancellationToken)).Result) + foreach (var op in actions[index].GetOperationsAsync(default(CancellationToken)).GetAwaiter().GetResult()) { op.Apply(workspace, default(CancellationToken)); } @@ -239,7 +239,7 @@ protected static TextSpan GetWholeSpan(Diagnostic d) var diagnostics = new List(); var compilationWithAnalyzers = compilation.WithAnalyzers(System.Collections.Immutable.ImmutableArray.Empty.Add(new T())); - var result = compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync().Result; + var result = compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync().GetAwaiter().GetResult(); diagnostics.AddRange(result); diagnostics.Sort((d1, d2) => d1.Location.SourceSpan.Start.CompareTo(d2.Location.SourceSpan.Start)); @@ -298,7 +298,7 @@ protected static TextSpan GetWholeSpan(Diagnostic d) RunFix(workspace, projectId, documentId, diagnostics.ElementAt(issueToFix), actionToRun); } - var txt = workspace.CurrentSolution.GetProject(projectId).GetDocument(documentId).GetTextAsync().Result.ToString(); + var txt = workspace.CurrentSolution.GetProject(projectId).GetDocument(documentId).GetTextAsync().GetAwaiter().GetResult().ToString(); output = Utils.HomogenizeEol(output); txt = Utils.HomogenizeEol(txt); if (output != txt) @@ -358,7 +358,7 @@ protected static TextSpan GetWholeSpan(Diagnostic d) var diagnostics = new List(); var compilationWithAnalyzers = compilation.WithAnalyzers(System.Collections.Immutable.ImmutableArray.Empty.Add(new T())); - diagnostics.AddRange(compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync().Result); + diagnostics.AddRange(compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync().GetAwaiter().GetResult()); if (expectedDiagnosics.Count != diagnostics.Count) @@ -415,16 +415,17 @@ protected static TextSpan GetWholeSpan(Diagnostic d) RunFix(workspace, projectId, documentId, diagnostics.ElementAt(issueToFix), actionToRun); } - var txt = workspace.CurrentSolution.GetProject(projectId).GetDocument(documentId).GetTextAsync().Result.ToString(); + var txt = workspace.CurrentSolution.GetProject(projectId).GetDocument(documentId).GetTextAsync().GetAwaiter().GetResult().ToString(); txt = Utils.HomogenizeEol(txt); output = Utils.HomogenizeEol(output); if (output != txt) { - Console.WriteLine("expected:"); - Console.WriteLine(output); - Console.WriteLine("got:"); - Console.WriteLine(txt); - Assert.True(false); + StringBuilder sb = new StringBuilder(); + sb.AppendLine("expected:"); + sb.AppendLine(output); + sb.AppendLine("got:"); + sb.AppendLine(txt); + Assert.True(false, sb.ToString()); } } } diff --git a/Tests/SymbolChecksTest.cs b/Tests/SymbolChecksTest.cs index d89d9e70..47f79506 100644 --- a/Tests/SymbolChecksTest.cs +++ b/Tests/SymbolChecksTest.cs @@ -234,13 +234,13 @@ static TSymbol FindSymbol(string code) var document = workspace.CurrentSolution.GetDocument(documentId); - var semanticModel = document.GetSemanticModelAsync().Result; + var semanticModel = document.GetSemanticModelAsync().GetAwaiter().GetResult(); var diag = semanticModel.GetDiagnostics(); Assert.True(diag.IsEmpty, "No errors reported"); - var symbol = SymbolFinder.FindSymbolAtPosition(semanticModel, position, workspace); + var symbol = SymbolFinder.FindSymbolAtPositionAsync(semanticModel, position, workspace).GetAwaiter().GetResult(); Assert.True(symbol != null, "Symbol should be found"); Assert.True(symbol is TSymbol); diff --git a/Tests/VB/CodeRefactorings/VBCodeRefactoringTestBase.cs b/Tests/VB/CodeRefactorings/VBCodeRefactoringTestBase.cs index 01152d43..abab24a0 100644 --- a/Tests/VB/CodeRefactorings/VBCodeRefactoringTestBase.cs +++ b/Tests/VB/CodeRefactorings/VBCodeRefactoringTestBase.cs @@ -119,11 +119,11 @@ protected string RunContextAction(CodeRefactoringProvider action, string input, if (actions.Count < actionIndex) Console.WriteLine("invalid input is:" + input); var a = actions[actionIndex]; - foreach (var op in a.GetOperationsAsync(default(CancellationToken)).Result) + foreach (var op in a.GetOperationsAsync(default(CancellationToken)).GetAwaiter().GetResult()) { op.Apply(workspace, default(CancellationToken)); } - return workspace.CurrentSolution.GetDocument(doc.Id).GetTextAsync().Result.ToString(); + return workspace.CurrentSolution.GetDocument(doc.Id).GetTextAsync().GetAwaiter().GetResult().ToString(); } From f080d6c5bd9a57ed6f3af34383510133b6dbdf08 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 2 Dec 2016 15:07:10 +0100 Subject: [PATCH 070/236] Fix typo --- ...ImplicitToExplicitImplementationCodeRefactoringProvider.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertImplicitToExplicitImplementationCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertImplicitToExplicitImplementationCodeRefactoringProvider.cs index 3eefb3a8..02f97266 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertImplicitToExplicitImplementationCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertImplicitToExplicitImplementationCodeRefactoringProvider.cs @@ -8,7 +8,7 @@ namespace RefactoringEssentials.CSharp.CodeRefactorings { - [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Convert implict to explicit implementation")] + [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Convert implicit to explicit implementation")] public class ConvertImplicitToExplicitImplementationCodeRefactoringProvider : CodeRefactoringProvider { public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) @@ -27,7 +27,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte return; var root = await model.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); var node = root.FindNode(span); - while (node != null && !(node is MemberDeclarationSyntax)) + while (node != null && !(node is MemberDeclarationSyntax)) node = node.Parent; if (node == null) return; From bc83b142c32c44f529298d0a3c52709e3e5d8544 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 2 Dec 2016 15:09:32 +0100 Subject: [PATCH 071/236] Add basic tests for VB to C# converter --- Tests/CSharp/Converter/ExpressionTests.cs | 437 ++++++++ Tests/CSharp/Converter/MemberTests.cs | 307 ++++++ Tests/CSharp/Converter/NamespaceLevelTests.cs | 237 +++++ .../Converter/SpecialConversionTests.cs | 215 ++++ Tests/CSharp/Converter/StatementTests.cs | 949 ++++++++++++++++++ Tests/CSharp/Converter/TypeCastTests.cs | 135 +++ Tests/Common/ConverterTestBase.cs | 135 ++- Tests/Tests.csproj | 6 + 8 files changed, 2419 insertions(+), 2 deletions(-) create mode 100644 Tests/CSharp/Converter/ExpressionTests.cs create mode 100644 Tests/CSharp/Converter/MemberTests.cs create mode 100644 Tests/CSharp/Converter/NamespaceLevelTests.cs create mode 100644 Tests/CSharp/Converter/SpecialConversionTests.cs create mode 100644 Tests/CSharp/Converter/StatementTests.cs create mode 100644 Tests/CSharp/Converter/TypeCastTests.cs diff --git a/Tests/CSharp/Converter/ExpressionTests.cs b/Tests/CSharp/Converter/ExpressionTests.cs new file mode 100644 index 00000000..ca88275f --- /dev/null +++ b/Tests/CSharp/Converter/ExpressionTests.cs @@ -0,0 +1,437 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NUnit.Framework; + +namespace RefactoringEssentials.Tests.CSharp.Converter +{ + [TestFixture] + public class ExpressionTests : ConverterTestBase + { + [Test] + public void MultilineString() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim x = ""Hello, +World!"" + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + var x = @""Hello, +World!""; + } +}"); + } + + [Test] + public void ConditionalExpression() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod(ByVal str As String) + Dim result As Boolean = If((str = """"), True, False) + End Sub +End Class", @" +class TestClass +{ + void TestMethod(string str) + { + bool result = (str == """") ? true : false; + } +}"); + } + + [Test] + public void NullCoalescingExpression() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod(ByVal str As String) + Console.WriteLine(If(str, """")) + End Sub +End Class", @" +class TestClass +{ + void TestMethod(string str) + { + Console.WriteLine(str ?? """"); + } +}"); + } + + [Test] + public void MemberAccessAndInvocationExpression() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod(ByVal str As String) + Dim length As Integer + length = str.Length + Console.WriteLine(""Test"" & length) + Console.ReadKey() + End Sub +End Class", @" +class TestClass +{ + void TestMethod(string str) + { + int length; + length = str.Length; + Console.WriteLine(""Test"" + length); + Console.ReadKey(); + } +}"); + } + + [Test] + public void ElvisOperatorExpression() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod(ByVal str As String) + Dim length As Integer = If(str?.Length, -1) + Console.WriteLine(length) + Console.ReadKey() + Dim redirectUri As String = context.OwinContext.Authentication?.AuthenticationResponseChallenge?.Properties?.RedirectUri + End Sub +End Class", @" +class TestClass +{ + void TestMethod(string str) + { + int length = str?.Length ?? -1; + Console.WriteLine(length); + Console.ReadKey(); + string redirectUri = context.OwinContext.Authentication?.AuthenticationResponseChallenge?.Properties?.RedirectUri; + } +}"); + } + + [Test] + public void ObjectInitializerExpression() + { + TestConversionVisualBasicToCSharp(@"Class StudentName + Public LastName, FirstName As String +End Class + +Class TestClass + Private Sub TestMethod(ByVal str As String) + Dim student2 As StudentName = New StudentName With {.FirstName = ""Craig"", .LastName = ""Playstead""} + End Sub +End Class", @" +class StudentName +{ + public string LastName, FirstName; +} + +class TestClass +{ + void TestMethod(string str) + { + StudentName student2 = new StudentName + { + FirstName = ""Craig"", + LastName = ""Playstead"", + }; + } +}"); + } + + [Test] + public void ObjectInitializerExpression2() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod(ByVal str As String) + Dim student2 = New With {Key .FirstName = ""Craig"", Key .LastName = ""Playstead""} + End Sub +End Class", @" +class TestClass +{ + void TestMethod(string str) + { + var student2 = new { + FirstName = ""Craig"", + LastName = ""Playstead"", + }; + } +}"); + } + + [Test] + public void ThisMemberAccessExpression() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private member As Integer + + Private Sub TestMethod() + Me.member = 0 + End Sub +End Class", @" +class TestClass +{ + private int member; + + void TestMethod() + { + this.member = 0; + } +}"); + } + + [Test] + public void BaseMemberAccessExpression() + { + TestConversionVisualBasicToCSharp(@"Class BaseTestClass + Public member As Integer +End Class + +Class TestClass + Inherits BaseTestClass + + Private Sub TestMethod() + MyBase.member = 0 + End Sub +End Class", @" +class BaseTestClass +{ + public int member; +} + +class TestClass : BaseTestClass +{ + void TestMethod() + { + base.member = 0; + } +}"); + } + + [Test] + public void DelegateExpression() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim test = Function(ByVal a As Integer) a * 2 + test(3) + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + var test = delegate(int a) { return a * 2 }; + + test(3); + } +}"); + } + + [Test] + public void LambdaBodyExpression() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim test = Function(a) a * 2 + Dim test2 = Function(a, b) + If b > 0 Then Return a / b + Return 0 + End Function + + Dim test3 = Function(a, b) a Mod b + test(3) + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + var test = a => { return a * 2 }; + var test2 = (a, b) => { if (b > 0) return a / b; return 0; } + var test3 = (a, b) => a % b; + + test(3); + } +}"); + } + + [Test] + public void Await() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Function SomeAsyncMethod() As Task(Of Integer) + Return Task.FromResult(0) + End Function + + Private Async Sub TestMethod() + Dim result As Integer = Await SomeAsyncMethod() + Console.WriteLine(result) + End Sub +End Class", @" +class TestClass +{ + Task SomeAsyncMethod() + { + return Task.FromResult(0); + } + + async void TestMethod() + { + int result = await SomeAsyncMethod(); + Console.WriteLine(result); + } +}"); + } + + [Test] + public void Linq1() + { + TestConversionVisualBasicToCSharp(@"Private Shared Sub SimpleQuery() + Dim numbers As Integer() = {7, 9, 5, 3, 6} + Dim res = From n In numbers Where n > 5 Select n + + For Each n In res + Console.WriteLine(n) + Next +End Sub", + @"static void SimpleQuery() +{ + int[] numbers = { 7, 9, 5, 3, 6 }; + + var res = from n in numbers + where n > 5 + select n; + + foreach (var n in res) + Console.WriteLine(n); +}"); + } + + [Test] + public void Linq2() + { + TestConversionVisualBasicToCSharp(@"Public Shared Sub Linq40() + Dim numbers As Integer() = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0} + Dim numberGroups = From n In numbers Group n By __groupByKey1__ = n Mod 5 Into g Select New With {Key .Remainder = g.Key, Key .Numbers = g} + + For Each g In numberGroups + Console.WriteLine($""Numbers with a remainder of {g.Remainder} when divided by 5:"") + + For Each n In g.Numbers + Console.WriteLine(n) + Next + Next +End Sub", + @"public static void Linq40() + { + int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; + + var numberGroups = + from n in numbers + group n by n % 5 into g + select new { Remainder = g.Key, Numbers = g }; + + foreach (var g in numberGroups) + { + Console.WriteLine($""Numbers with a remainder of {g.Remainder} when divided by 5:""); + foreach (var n in g.Numbers) + { + Console.WriteLine(n); + } + } + }"); + } + + [Test] + public void Linq3() + { + TestConversionVisualBasicToCSharp(@"Class Product + Public Category As String + Public ProductName As String +End Class + +Class Test + Public Sub Linq102() + Dim categories As String() = New String() {""Beverages"", ""Condiments"", ""Vegetables"", ""Dairy Products"", ""Seafood""} + Dim products As Product() = GetProductList() + Dim q = From c In categories Join p In products On c Equals p.Category Select New With {Key .Category = c, p.ProductName} + + For Each v In q + Console.WriteLine($""{v.ProductName}: {v.Category}"") + Next + End Sub +End Class", + @"class Product { + public string Category; + public string ProductName; +} + +class Test { + public void Linq102() + { + string[] categories = new string[]{ + ""Beverages"", + ""Condiments"", + ""Vegetables"", + ""Dairy Products"", + ""Seafood"" }; + + Product[] products = GetProductList(); + + var q = + from c in categories + join p in products on c equals p.Category + select new { Category = c, p.ProductName }; + + foreach (var v in q) + { + Console.WriteLine($""{v.ProductName}: {v.Category}""); + } + } +}"); + } + + [Test] + public void Linq4() + { + TestConversionVisualBasicToCSharp(@"Public Sub Linq103() + Dim categories As String() = New String() {""Beverages"", ""Condiments"", ""Vegetables"", ""Dairy Products"", ""Seafood""} + Dim products = GetProductList() + Dim q = From c In categories Group Join p In products On c Equals p.Category Into ps = Group Select New With {Key .Category = c, Key .Products = ps} + + For Each v In q + Console.WriteLine(v.Category & "":"") + + For Each p In v.Products + Console.WriteLine("" "" & p.ProductName) + Next + Next +End Sub", @"public void Linq103() +{ + string[] categories = new string[]{ + ""Beverages"", + ""Condiments"", + ""Vegetables"", + ""Dairy Products"", + ""Seafood"" }; + + var products = GetProductList(); + + var q = + from c in categories + join p in products on c equals p.Category into ps + select new { Category = c, Products = ps }; + + foreach (var v in q) + { + Console.WriteLine(v.Category + "":""); + foreach (var p in v.Products) + { + Console.WriteLine("" "" + p.ProductName); + } + } +}"); + } + } +} diff --git a/Tests/CSharp/Converter/MemberTests.cs b/Tests/CSharp/Converter/MemberTests.cs new file mode 100644 index 00000000..222d26bd --- /dev/null +++ b/Tests/CSharp/Converter/MemberTests.cs @@ -0,0 +1,307 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NUnit.Framework; + +namespace RefactoringEssentials.Tests.CSharp.Converter +{ + [TestFixture] + public class MemberTests : ConverterTestBase + { + [Test] + public void TestField() + { + TestConversionVisualBasicToCSharp( +@"Class TestClass + Const answer As Integer = 42 + Private value As Integer = 10 + ReadOnly v As Integer = 15 +End Class", @"class TestClass +{ + const int answer = 42; + int value = 10; + readonly int v = 15; +}"); + } + + [Test] + public void TestMethod() + { + TestConversionVisualBasicToCSharp( +@"Class TestClass + Public Sub TestMethod(Of T As {Class, New}, T2 As Structure, T3)( ByRef argument As T, ByRef argument2 As T2, ByVal argument3 As T3) + argument = Nothing + argument2 = Nothing + argument3 = Nothing + End Sub +End Class", @"class TestClass +{ + public void TestMethod(out T argument, ref T2 argument2, T3 argument3) where T : class, new where T2 : struct + { + argument = null; + argument2 = default(T2); + argument3 = default(T3); + } +}"); + } + + [Test] + public void TestMethodWithReturnType() + { + TestConversionVisualBasicToCSharp( +@"Class TestClass + Public Function TestMethod(Of T As {Class, New}, T2 As Structure, T3)( ByRef argument As T, ByRef argument2 As T2, ByVal argument3 As T3) As Integer + Return 0 + End Function +End Class", @"class TestClass +{ + public int TestMethod(out T argument, ref T2 argument2, T3 argument3) where T : class, new where T2 : struct + { + return 0; + } +}"); + } + + [Test] + public void TestStaticMethod() + { + TestConversionVisualBasicToCSharp( +@"Class TestClass + Public Shared Sub TestMethod(Of T As {Class, New}, T2 As Structure, T3)( ByRef argument As T, ByRef argument2 As T2, ByVal argument3 As T3) + argument = Nothing + argument2 = Nothing + argument3 = Nothing + End Sub +End Class", @"class TestClass +{ + public static void TestMethod(out T argument, ref T2 argument2, T3 argument3) where T : class, new where T2 : struct + { + argument = null; + argument2 = default(T2); + argument3 = default(T3); + } +}"); + } + + [Test] + public void TestAbstractMethod() + { + TestConversionVisualBasicToCSharp( +@"Class TestClass + Public MustOverride Sub TestMethod() +End Class", @"class TestClass +{ + public abstract void TestMethod(); +}"); + } + + [Test] + public void TestSealedMethod() + { + TestConversionVisualBasicToCSharp( +@"Class TestClass + Public NotOverridable Sub TestMethod(Of T As {Class, New}, T2 As Structure, T3)( ByRef argument As T, ByRef argument2 As T2, ByVal argument3 As T3) + argument = Nothing + argument2 = Nothing + argument3 = Nothing + End Sub +End Class", @"class TestClass +{ + public sealed void TestMethod(out T argument, ref T2 argument2, T3 argument3) where T : class, new where T2 : struct + { + argument = null; + argument2 = default(T2); + argument3 = default(T3); + } +}"); + } + + [Test] + public void TestExtensionMethod() + { + TestConversionVisualBasicToCSharp( +@"Imports System.Runtime.CompilerServices + +Module TestClass + + Sub TestMethod(ByVal str As String) + End Sub +End Module", @"static class TestClass +{ + public static void TestMethod(this String str) + { + } +}"); + } + + [Test] + public void TestExtensionMethodWithExistingImport() + { + TestConversionVisualBasicToCSharp( +@"Imports System.Runtime.CompilerServices + +Module TestClass + + Sub TestMethod(ByVal str As String) + End Sub +End Module", @"using System.Runtime.CompilerServices; + +static class TestClass +{ + public static void TestMethod(this String str) + { + } +}"); + } + + [Test] + public void TestProperty() + { + TestConversionVisualBasicToCSharp( +@"Class TestClass + Public Property Test As Integer + + Public Property Test2 As Integer + Get + Return 0 + End Get + End Property + + Private m_test3 As Integer + + Public Property Test3 As Integer + Get + Return Me.m_test3 + End Get + Set(ByVal value As Integer) + Me.m_test3 = value + End Set + End Property +End Class", @"class TestClass +{ + public int Test { get; set; } + public int Test2 { + get { return 0; } + } + int m_test3; + public int Test3 { + get { return this.m_test3; } + set { this.m_test3 = value; } + } +}"); + } + + [Test] + public void TestConstructor() + { + TestConversionVisualBasicToCSharp( +@"Class TestClass(Of T As {Class, New}, T2 As Structure, T3) + Public Sub New( ByRef argument As T, ByRef argument2 As T2, ByVal argument3 As T3) + End Sub +End Class", @"class TestClass where T : class, new where T2 : struct +{ + public TestClass(out T argument, ref T2 argument2, T3 argument3) + { + } +}"); + } + + [Test] + public void TestDestructor() + { + TestConversionVisualBasicToCSharp( +@"Class TestClass + Protected Overrides Sub Finalize() + End Sub +End Class", @"class TestClass +{ + ~TestClass() + { + } +}"); + } + + [Test] + public void TestEvent() + { + TestConversionVisualBasicToCSharp( +@"Class TestClass + Public Event MyEvent As EventHandler +End Class", @"class TestClass +{ + public event EventHandler MyEvent; +}"); + } + + [Test] + public void TestCustomEvent() + { + TestConversionVisualBasicToCSharp( +@"Class TestClass + Private backingField As EventHandler + + Public Event MyEvent As EventHandler + AddHandler(ByVal value As EventHandler) + AddHandler Me.backingField, value + End AddHandler + RemoveHandler(ByVal value As EventHandler) + RemoveHandler Me.backingField, value + End RemoveHandler + End Event +End Class", @"using System; + +class TestClass +{ + EventHandler backingField; + + public event EventHandler MyEvent { + add { + this.backingField += value; + } + remove { + this.backingField -= value; + } + } +}"); + } + + [Test] + public void TestIndexer() + { + TestConversionVisualBasicToCSharp( +@"Class TestClass + Default Public Property Item(ByVal index As Integer) As Integer + + Default Public Property Item(ByVal index As String) As Integer + Get + Return 0 + End Get + End Property + + Private m_test3 As Integer + + Default Public Property Item(ByVal index As Double) As Integer + Get + Return Me.m_test3 + End Get + Set(ByVal value As Integer) + Me.m_test3 = value + End Set + End Property +End Class", @"class TestClass +{ + public int this[int index] { get; set; } + public int this[string index] { + get { return 0; } + } + int m_test3; + public int this[double index] { + get { return this.m_test3; } + set { this.m_test3 = value; } + } +}"); + } + } +} \ No newline at end of file diff --git a/Tests/CSharp/Converter/NamespaceLevelTests.cs b/Tests/CSharp/Converter/NamespaceLevelTests.cs new file mode 100644 index 00000000..006431cc --- /dev/null +++ b/Tests/CSharp/Converter/NamespaceLevelTests.cs @@ -0,0 +1,237 @@ + +using NUnit.Framework; + +namespace RefactoringEssentials.Tests.CSharp.Converter +{ + [TestFixture] + public class NamespaceLevelTests : ConverterTestBase + { + [Test] + public void TestNamespace() + { + TestConversionVisualBasicToCSharp(@"Namespace Test +End Namespace", @"namespace Test +{ + +}"); + } + + [Test] + public void TestTopLevelAttribute() + { + TestConversionVisualBasicToCSharp( + @"", + @"[assembly: CLSCompliant(true)]"); + } + + [Test] + public void TestImports() + { + TestConversionVisualBasicToCSharp( + @"Imports SomeNamespace +Imports VB = Microsoft.VisualBasic", + @"using SomeNamespace; +using VB = Microsoft.VisualBasic;"); + } + + [Test] + public void TestClass() + { + TestConversionVisualBasicToCSharp(@"Namespace Test.[class] + Class TestClass(Of T) + End Class +End Namespace", @"namespace Test.@class +{ + class TestClass + { + } +}"); + } + + [Test] + public void TestInternalStaticClass() + { + TestConversionVisualBasicToCSharp(@"Namespace Test.[class] + Friend Module TestClass + Sub Test() + End Sub + + Private Sub Test2() + End Sub + End Module +End Namespace", @"namespace Test.@class +{ + internal static class TestClass + { + public static void Test() {} + static void Test2() {} + } +}"); + } + + [Test] + public void TestAbstractClass() + { + TestConversionVisualBasicToCSharp(@"Namespace Test.[class] + MustInherit Class TestClass + End Class +End Namespace", @"namespace Test.@class +{ + abstract class TestClass + { + } +}"); + } + + [Test] + public void TestSealedClass() + { + TestConversionVisualBasicToCSharp(@"Namespace Test.[class] + NotInheritable Class TestClass + End Class +End Namespace", @"namespace Test.@class +{ + sealed class TestClass + { + } +}"); + } + + [Test] + public void TestInterface() + { + TestConversionVisualBasicToCSharp( +@"Interface ITest + Inherits System.IDisposable + + Sub Test() +End Interface", @"interface ITest : System.IDisposable +{ + void Test (); +}"); + } + + [Test] + public void TestEnum() + { + TestConversionVisualBasicToCSharp( +@"Friend Enum ExceptionResource + Argument_ImplementIComparable + ArgumentOutOfRange_NeedNonNegNum + ArgumentOutOfRange_NeedNonNegNumRequired + Arg_ArrayPlusOffTooSmall +End Enum", @"internal enum ExceptionResource +{ + Argument_ImplementIComparable, + ArgumentOutOfRange_NeedNonNegNum, + ArgumentOutOfRange_NeedNonNegNumRequired, + Arg_ArrayPlusOffTooSmall +}"); + } + + [Test] + public void TestClassInheritanceList() + { + TestConversionVisualBasicToCSharp( +@"MustInherit Class ClassA + Implements System.IDisposable + + Protected MustOverride Sub Test() +End Class", @"abstract class ClassA : System.IDisposable +{ + protected abstract void Test(); +}"); + + TestConversionVisualBasicToCSharp( +@"MustInherit Class ClassA + Inherits System.EventArgs + Implements System.IDisposable + + Protected MustOverride Sub Test() +End Class", @"abstract class ClassA : System.EventArgs, System.IDisposable +{ + protected abstract void Test(); +}"); + } + + [Test] + public void TestStruct() + { + TestConversionVisualBasicToCSharp( +@"Structure MyType + Implements System.IComparable(Of MyType) + + Private Sub Test() + End Sub +End Structure", @"struct MyType : System.IComparable +{ + void Test() {} +}"); + } + + [Test] + public void TestDelegate() + { + TestConversionVisualBasicToCSharp( + @"Public Delegate Sub Test()", + @"public delegate void Test();"); + TestConversionVisualBasicToCSharp( + @"Public Delegate Function Test() As Integer", + @"public delegate int Test();"); + TestConversionVisualBasicToCSharp( + @"Public Delegate Sub Test(ByVal x As Integer)", + @"public delegate void Test(int x);"); + TestConversionVisualBasicToCSharp( + @"Public Delegate Sub Test(ByRef x As Integer)", + @"public delegate void Test(ref int x);"); + } + + [Test] + public void MoveImportsStatement() + { + TestConversionVisualBasicToCSharp(@"Imports SomeNamespace + +Namespace test +End Namespace", + "namespace test { using SomeNamespace; }"); + } + + [Test] + public void ClassImplementsInterface() + { + TestConversionVisualBasicToCSharp(@"Class test + Implements IComparable +End Class", + "using System; class test : IComparable { }"); + } + + [Test] + public void ClassImplementsInterface2() + { + TestConversionVisualBasicToCSharp(@"Class test + Implements System.IComparable +End Class", + "class test : System.IComparable { }"); + } + + [Test] + public void ClassInheritsClass() + { + TestConversionVisualBasicToCSharp(@"Imports System.IO + +Class test + Inherits InvalidDataException +End Class", + "using System.IO; class test : InvalidDataException { }"); + } + + [Test] + public void ClassInheritsClass2() + { + TestConversionVisualBasicToCSharp(@"Class test + Inherits System.IO.InvalidDataException +End Class", + "class test : System.IO.InvalidDataException { }"); + } + } +} diff --git a/Tests/CSharp/Converter/SpecialConversionTests.cs b/Tests/CSharp/Converter/SpecialConversionTests.cs new file mode 100644 index 00000000..33d611d0 --- /dev/null +++ b/Tests/CSharp/Converter/SpecialConversionTests.cs @@ -0,0 +1,215 @@ +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RefactoringEssentials.Tests.CSharp.Converter +{ + [TestFixture] + public class SpecialConversionTests : ConverterTestBase + { + [Test] + public void TestSimpleInlineAssign() + { + TestConversionVisualBasicToCSharp( +@"Class TestClass + Private Sub TestMethod() + Dim a, b As Integer + b = __InlineAssignHelper(a, 5) + End Sub + + + Private Shared Function __InlineAssignHelper(Of T)(ByRef target As T, value As T) As T + target = value + Return value + End Function +End Class", @"class TestClass +{ + void TestMethod() + { + int a, b; + b = a = 5; + } +}"); + } + + [Test] + public void TestSimplePostIncrementAssign() + { + TestConversionVisualBasicToCSharp( +@"Class TestClass + Private Sub TestMethod() + Dim b As Integer, a As Integer = 5 + b = Math.Min(System.Threading.Interlocked.Increment(a), a - 1) + End Sub +End Class", @"class TestClass +{ + void TestMethod() + { + int a = 5, b; + b = a++; + } +}"); + } + + [Test] + public void RaiseEvent() + { + TestConversionVisualBasicToCSharp( +@"Class TestClass + Private Event MyEvent As EventHandler + + Private Sub TestMethod() + RaiseEvent MyEvent(Me, EventArgs.Empty) + End Sub +End Class", @"class TestClass +{ + event EventHandler MyEvent; + + void TestMethod() + { + if (MyEvent != null) MyEvent(this, EventArgs.Empty); + } +}"); + TestConversionVisualBasicToCSharp( +@"Class TestClass + Private Sub TestMethod() + RaiseEvent MyEvent(Me, EventArgs.Empty) + End Sub +End Class", @"class TestClass +{ + void TestMethod() + { + if ((MyEvent != null)) MyEvent(this, EventArgs.Empty); + } +}"); + TestConversionVisualBasicToCSharp( +@"Class TestClass + Private Sub TestMethod() + RaiseEvent MyEvent(Me, EventArgs.Empty) + End Sub +End Class", @"class TestClass +{ + void TestMethod() + { + if (null != MyEvent) { MyEvent(this, EventArgs.Empty); } + } +}"); + TestConversionVisualBasicToCSharp( +@"Class TestClass + Private Sub TestMethod() + RaiseEvent MyEvent(Me, EventArgs.Empty) + End Sub +End Class", @"class TestClass +{ + void TestMethod() + { + if (this.MyEvent != null) MyEvent(this, EventArgs.Empty); + } +}"); + TestConversionVisualBasicToCSharp( +@"Class TestClass + Private Sub TestMethod() + RaiseEvent MyEvent(Me, EventArgs.Empty) + End Sub +End Class", @"class TestClass +{ + void TestMethod() + { + if (MyEvent != null) this.MyEvent(this, EventArgs.Empty); + } +}"); + TestConversionVisualBasicToCSharp( +@"Class TestClass + Private Sub TestMethod() + RaiseEvent MyEvent(Me, EventArgs.Empty) + End Sub +End Class", @"class TestClass +{ + void TestMethod() + { + if ((this.MyEvent != null)) { this.MyEvent(this, EventArgs.Empty); } + } +}"); + } + + [Test] + public void IfStatementSimilarToRaiseEvent() + { + TestConversionVisualBasicToCSharp( +@"Class TestClass + Private Sub TestMethod() + If FullImage IsNot Nothing Then DrawImage() + End Sub +End Class", @"class TestClass +{ + void TestMethod() + { + if (FullImage != null) DrawImage(); + } +}"); + // regression test: + TestConversionVisualBasicToCSharp( +@"Class TestClass + Private Sub TestMethod() + If FullImage IsNot Nothing Then e.DrawImage() + End Sub +End Class", @"class TestClass +{ + void TestMethod() + { + if (FullImage != null) e.DrawImage(); + } +}"); + // with braces: + TestConversionVisualBasicToCSharp( +@"Class TestClass + Private Sub TestMethod() + If FullImage IsNot Nothing Then + DrawImage() + End If + End Sub +End Class", @"class TestClass +{ + void TestMethod() + { + if (FullImage != null) { DrawImage(); } + } +}"); + TestConversionVisualBasicToCSharp( +@"Class TestClass + Private Sub TestMethod() + If FullImage IsNot Nothing Then + e.DrawImage() + End If + End Sub +End Class", @"class TestClass +{ + void TestMethod() + { + if (FullImage != null) { e.DrawImage(); } + } +}"); + // another bug related to the IfStatement code: + TestConversionVisualBasicToCSharp( +@"Class TestClass + Private Sub TestMethod() + If Tiles IsNot Nothing Then + + For Each t As Tile In Tiles + Me.TileTray.Controls.Remove(t) + Next + End If + End Sub +End Class", @"class TestClass +{ + void TestMethod() + { + if (Tiles != null) foreach (Tile t in Tiles) this.TileTray.Controls.Remove(t); + } +}"); + } + } +} diff --git a/Tests/CSharp/Converter/StatementTests.cs b/Tests/CSharp/Converter/StatementTests.cs new file mode 100644 index 00000000..5df8cbc4 --- /dev/null +++ b/Tests/CSharp/Converter/StatementTests.cs @@ -0,0 +1,949 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NUnit.Framework; + +namespace RefactoringEssentials.Tests.CSharp.Converter +{ + [TestFixture] + public class StatementTests : ConverterTestBase + { + [Test] + public void EmptyStatement() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + If True Then + End If + + While True + End While + + While True + End While + + Do + Loop While True + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + if (true) ; + while (true) ; + for (;;) ; + do ; while (true); + } +}"); + } + + [Test] + public void AssignmentStatement() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As Integer + b = 0 + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + int b; + b = 0; + } +}"); + } + + [Test] + public void AssignmentStatementInDeclaration() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As Integer = 0 + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + int b = 0; + } +}"); + } + + [Test] + public void AssignmentStatementInVarDeclaration() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b = 0 + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + var b = 0; + } +}"); + } + + [Test] + public void ObjectInitializationStatement() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As String + b = New String(""test"") + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + string b; + b = new string(""test""); + } +}"); + } + + [Test] + public void ObjectInitializationStatementInDeclaration() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As String = New String(""test"") + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + string b = new string(""test""); + } +}"); + } + + [Test] + public void ObjectInitializationStatementInVarDeclaration() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b = New String(""test"") + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + var b = new string(""test""); + } +}"); + } + + [Test] + public void ArrayDeclarationStatement() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As Integer() + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + int[] b; + } +}"); + } + + [Test] + public void ArrayInitializationStatement() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As Integer() = {1, 2, 3} + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + int[] b = { 1, 2, 3 }; + } +}"); + } + + [Test] + public void ArrayInitializationStatementInVarDeclaration() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b = {1, 2, 3} + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + var b = { 1, 2, 3 }; + } +}"); + } + + [Test] + public void ArrayInitializationStatementWithType() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As Integer() = New Integer() {1, 2, 3} + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + int[] b = new int[] { 1, 2, 3 }; + } +}"); + } + + [Test] + public void ArrayInitializationStatementWithLength() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As Integer() = New Integer(2) {1, 2, 3} + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + int[] b = new int[3] { 1, 2, 3 }; + } +}"); + } + + [Test] + public void MultidimensionalArrayDeclarationStatement() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As Integer(,) + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + int[,] b; + } +}"); + } + + [Test] + public void MultidimensionalArrayInitializationStatement() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As Integer(,) = {{1, 2}, {3, 4}} + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + int[,] b = { { 1, 2 }, { 3, 4 } }; + } +}"); + } + + [Test] + public void MultidimensionalArrayInitializationStatementWithType() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As Integer(,) = New Integer(,) {{1, 2}, {3, 4}} + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + int[,] b = new int[,] { { 1, 2 }, { 3, 4 } }; + } +}"); + } + + [Test] + public void MultidimensionalArrayInitializationStatementWithLengths() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As Integer(,) = New Integer(1, 1) {{1, 2}, {3, 4}} + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + int[,] b = new int[2, 2] { { 1, 2 }, { 3, 4 } }; + } +}"); + } + + [Test] + public void JaggedArrayDeclarationStatement() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As Integer()() + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + int[][] b; + } +}"); + } + + [Test] + public void JaggedArrayInitializationStatement() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As Integer()() = {New Integer() {1, 2}, New Integer() {3, 4}} + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + int[][] b = { new int[] { 1, 2 }, new int[] { 3, 4 } }; + } +}"); + } + + [Test] + public void JaggedArrayInitializationStatementWithType() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As Integer()() = New Integer()() {New Integer() {1, 2}, New Integer() {3, 4}} + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + int[][] b = new int[][] { new int[] { 1, 2 }, new int[] { 3, 4 } }; + } +}"); + } + + [Test] + public void JaggedArrayInitializationStatementWithLength() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As Integer()() = New Integer(1)() {New Integer() {1, 2}, New Integer() {3, 4}} + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + int[][] b = new int[2][] { new int[] { 1, 2 }, new int[] { 3, 4 } }; + } +}"); + } + + [Test] + public void DeclarationStatements() + { + TestConversionVisualBasicToCSharp( +@"Class Test + Private Sub TestMethod() +the_beginning: + Dim value As Integer = 1 + Const myPIe As Double = System.Math.PI + Dim text = ""This is my text!"" + GoTo the_beginning + End Sub +End Class", @"class Test { + void TestMethod() + { +the_beginning: + int value = 1; + const double myPIe = System.Math.PI; + var text = ""This is my text!""; + goto the_beginning; + } +}"); + } + + [Test] + public void IfStatement() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod(ByVal a As Integer) + Dim b As Integer + + If a = 0 Then + b = 0 + ElseIf a = 1 Then + b = 1 + ElseIf a = 2 OrElse a = 3 Then + b = 2 + Else + b = 3 + End If + End Sub +End Class", @" +class TestClass +{ + void TestMethod (int a) + { + int b; + if (a == 0) { + b = 0; + } else if (a == 1) { + b = 1; + } else if (a == 2 || a == 3) { + b = 2; + } else { + b = 3; + } + } +}"); + } + + [Test] + public void WhileStatement() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As Integer + b = 0 + + While b = 0 + If b = 2 Then Continue While + If b = 3 Then Exit While + b = 1 + End While + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + int b; + b = 0; + while (b == 0) + { + if (b == 2) + continue; + if (b == 3) + break; + b = 1; + } + } +}"); + } + + [Test] + public void DoWhileStatement() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + Dim b As Integer + b = 0 + + Do + If b = 2 Then Continue Do + If b = 3 Then Exit Do + b = 1 + Loop While b = 0 + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + int b; + b = 0; + do + { + if (b == 2) + continue; + if (b == 3) + break; + b = 1; + } + while (b == 0); + } +}"); + } + + [Test] + public void ForEachStatementWithExplicitType() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod(ByVal values As Integer()) + For Each val As Integer In values + If val = 2 Then Continue For + If val = 3 Then Exit For + Next + End Sub +End Class", @" +class TestClass +{ + void TestMethod(int[] values) + { + foreach (int val in values) + { + if (val == 2) + continue; + if (val == 3) + break; + } + } +}"); + } + + [Test] + public void ForEachStatementWithVar() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod(ByVal values As Integer()) + For Each val In values + If val = 2 Then Continue For + If val = 3 Then Exit For + Next + End Sub +End Class", @" +class TestClass +{ + void TestMethod(int[] values) + { + foreach (var val in values) + { + if (val == 2) + continue; + if (val == 3) + break; + } + } +}"); + } + + [Test] + public void SyncLockStatement() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod(ByVal nullObject As Object) + If nullObject Is Nothing Then Throw New ArgumentNullException(NameOf(nullObject)) + + SyncLock nullObject + Console.WriteLine(nullObject) + End SyncLock + End Sub +End Class", @" +class TestClass +{ + void TestMethod(object nullObject) + { + if (nullObject == null) + throw new ArgumentNullException(nameof(nullObject)); + lock (nullObject) { + Console.WriteLine(nullObject); + } + } +}"); + } + + [Test] + public void ForWithUnknownConditionAndSingleStatement() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + i = 0 + + While unknownCondition + b(i) = s(i) + i += 1 + End While + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + for (i = 0; unknownCondition; i++) + b[i] = s[i]; + } +}"); + } + + [Test] + public void ForWithUnknownConditionAndBlock() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + i = 0 + + While unknownCondition + b(i) = s(i) + i += 1 + End While + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + for (i = 0; unknownCondition; i++) { + b[i] = s[i]; + } + } +}"); + } + + [Test] + public void ForWithSingleStatement() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + For i = 0 To [end] - 1 + b(i) = s(i) + Next + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + for (i = 0; i < end; i++) b[i] = s[i]; + } +}"); + } + + [Test] + public void ForWithBlock() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod() + For i = 0 To [end] - 1 + b(i) = s(i) + Next + End Sub +End Class", @" +class TestClass +{ + void TestMethod() + { + for (i = 0; i < end; i++) { + b[i] = s[i]; + } + } +}"); + } + + [Test] + public void LabeledAndForStatement() + { + TestConversionVisualBasicToCSharp(@"Class GotoTest1 + Private Shared Sub Main() + Dim x As Integer = 200, y As Integer = 4 + Dim count As Integer = 0 + Dim array As String(,) = New String(x - 1, y - 1) {} + + For i As Integer = 0 To x - 1 + + For j As Integer = 0 To y - 1 + array(i, j) = (System.Threading.Interlocked.Increment(count)).ToString() + Next + Next + + Console.Write(""Enter the number to search for: "") + Dim myNumber As String = Console.ReadLine() + + For i As Integer = 0 To x - 1 + + For j As Integer = 0 To y - 1 + + If array(i, j).Equals(myNumber) Then + GoTo Found + End If + Next + Next + + Console.WriteLine(""The number {0} was not found."", myNumber) + GoTo Finish +Found: + Console.WriteLine(""The number {0} is found."", myNumber) +Finish: + Console.WriteLine(""End of search."") + Console.WriteLine(""Press any key to exit."") + Console.ReadKey() + End Sub +End Class", @" +class GotoTest1 +{ + static void Main() + { + int x = 200, y = 4; + int count = 0; + string[,] array = new string[x, y]; + + for (int i = 0; i < x; i++) + + for (int j = 0; j < y; j++) + array[i, j] = (++count).ToString(); + + Console.Write(""Enter the number to search for: ""); + + string myNumber = Console.ReadLine(); + + for (int i = 0; i < x; i++) + { + for (int j = 0; j < y; j++) + { + if (array[i, j].Equals(myNumber)) + { + goto Found; + } + } + } + + Console.WriteLine(""The number {0} was not found."", myNumber); + goto Finish; + + Found: + Console.WriteLine(""The number {0} is found."", myNumber); + + Finish: + Console.WriteLine(""End of search.""); + + + Console.WriteLine(""Press any key to exit.""); + Console.ReadKey(); + } + }"); + } + + [Test] + public void ThrowStatement() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod(ByVal nullObject As Object) + If nullObject Is Nothing Then Throw New ArgumentNullException(NameOf(nullObject)) + End Sub +End Class", @" +class TestClass +{ + void TestMethod(object nullObject) + { + if (nullObject == null) + throw new ArgumentNullException(nameof(nullObject)); + } +}"); + } + + [Test] + public void AddRemoveHandler() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Public Event MyEvent As EventHandler + + Private Sub TestMethod(ByVal e As EventHandler) + AddHandler Me.MyEvent, e + AddHandler Me.MyEvent, AddressOf MyHandler + End Sub + + Private Sub TestMethod2(ByVal e As EventHandler) + RemoveHandler Me.MyEvent, e + RemoveHandler Me.MyEvent, AddressOf MyHandler + End Sub + + Private Sub MyHandler(ByVal sender As Object, ByVal e As EventArgs) + End Sub +End Class", @"using System; + +class TestClass +{ + public event EventHandler MyEvent; + + void TestMethod(EventHandler e) + { + this.MyEvent += e; + this.MyEvent += MyHandler; + } + + void TestMethod2(EventHandler e) + { + this.MyEvent -= e; + this.MyEvent -= MyHandler; + } + + void MyHandler(object sender, EventArgs e) + { + + } +}"); + } + + [Test] + public void SelectCase1() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Sub TestMethod(ByVal number As Integer) + Select Case number + Case 0, 1, 2 + Console.Write(""number is 0, 1, 2"") + Case 3 + Console.Write(""section 3"") + GoTo _Select0_Case5 + Case 4 + Console.Write(""section 4"") + GoTo _Select0_CaseDefault + Case 5 +_Select0_Case5: + Console.Write(""section 5"") + Case Else +_Select0_CaseDefault: + Console.Write(""default section"") + End Select + End Sub +End Class", @" +class TestClass +{ + void TestMethod(int number) + { + switch (number) { + case 0: + case 1: + case 2: + Console.Write(""number is 0, 1, 2""); + break; + case 3: + Console.Write(""section 3""); + goto case 5; + case 4: + Console.Write(""section 4""); + goto default; + case 5: + Console.Write(""section 5""); + break; + default: + Console.Write(""default section""); + break; + } + } +}"); + } + + [Test] + public void TryCatch() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Shared Function Log(ByVal message As String) As Boolean + Console.WriteLine(message) + Return False + End Function + + Private Sub TestMethod(ByVal number As Integer) + Try + Console.WriteLine(""try"") + Catch e As Exception + Console.WriteLine(""catch1"") + Catch + Console.WriteLine(""catch all"") + Finally + Console.WriteLine(""finally"") + End Try + + Try + Console.WriteLine(""try"") + Catch __unusedIOException1__ As System.IO.IOException + Console.WriteLine(""catch1"") + Catch e As Exception When Log(e.Message) + Console.WriteLine(""catch2"") + End Try + + Try + Console.WriteLine(""try"") + Finally + Console.WriteLine(""finally"") + End Try + End Sub +End Class", @" +class TestClass +{ + static bool Log(string message) + { + Console.WriteLine(message); + return false; + } + + void TestMethod(int number) + { + try { + Console.WriteLine(""try""); + } catch (Exception e) { + Console.WriteLine(""catch1""); + } catch { + Console.WriteLine(""catch all""); + } finally { + Console.WriteLine(""finally""); + } + try { + Console.WriteLine(""try""); + } catch (System.IO.IOException) { + Console.WriteLine(""catch1""); + } catch (Exception e) when (Log(e.Message)) { + Console.WriteLine(""catch2""); + } + try { + Console.WriteLine(""try""); + } finally { + Console.WriteLine(""finally""); + } + } +}"); + } + + [Test] + public void Yield() + { + TestConversionVisualBasicToCSharp(@"Class TestClass + Private Iterator Function TestMethod(ByVal number As Integer) As IEnumerable(Of Integer) + If number < 0 Then Return + + For i As Integer = 0 To number - 1 + Yield i + Next + End Function +End Class", @" +class TestClass +{ + IEnumerable TestMethod(int number) + { + if (number < 0) + yield break; + for (int i = 0; i < number; i++) + yield return i; + } +}"); + } + } +} diff --git a/Tests/CSharp/Converter/TypeCastTests.cs b/Tests/CSharp/Converter/TypeCastTests.cs new file mode 100644 index 00000000..858bc032 --- /dev/null +++ b/Tests/CSharp/Converter/TypeCastTests.cs @@ -0,0 +1,135 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NUnit.Framework; + +namespace RefactoringEssentials.Tests.CSharp.Converter +{ + [TestFixture] + public class TypeCastTests : ConverterTestBase + { + [Test] + public void CastObjectToInteger() + { + TestConversionVisualBasicToCSharp( +@"Private Sub Test() + Dim o As Object = 5 + Dim i As Integer = CInt(o) +End Sub +", @"void Test() +{ + object o = 5; + int i = (int) o; +} +"); + } + + [Test] + public void CastObjectToString() + { + TestConversionVisualBasicToCSharp( +@"Private Sub Test() + Dim o As Object = ""Test"" + Dim s As String = CStr(o) +End Sub +", @"void Test() +{ + object o = ""Test""; + string s = (string) o; +} +"); + } + + [Test] + public void CastObjectToGenericList() + { + TestConversionVisualBasicToCSharp( +@"Private Sub Test() + Dim o As Object = New System.Collections.Generic.List(Of Integer)() + Dim l As System.Collections.Generic.List(Of Integer) = CType(o, System.Collections.Generic.List(Of Integer)) +End Sub +", @"void Test() +{ + object o = new System.Collections.Generic.List(); + System.Collections.Generic.List l = (System.Collections.Generic.List) o; +} +"); + } + + [Test] + public void TryCastObjectToInteger() + { + TestConversionVisualBasicToCSharp( +@"Private Sub Test() + Dim o As Object = 5 + Dim i As System.Nullable(Of Integer) = TryCast(o, Integer) +End Sub +", @"void Test() +{ + object o = 5; + System.Nullable i = o as int; +} +"); + } + + [Test] + public void TryCastObjectToGenericList() + { + TestConversionVisualBasicToCSharp( +@"Private Sub Test() + Dim o As Object = New System.Collections.Generic.List(Of Integer)() + Dim l As System.Collections.Generic.List(Of Integer) = TryCast(o, System.Collections.Generic.List(Of Integer)) +End Sub +", @"void Test() +{ + object o = new System.Collections.Generic.List(); + System.Collections.Generic.List l = o as System.Collections.Generic.List; +} +"); + } + + [Test] + public void CastConstantNumberToLong() + { + TestConversionVisualBasicToCSharp( +@"Private Sub Test() + Dim o As Object = 5L +End Sub +", @"void Test() +{ + object o = 5L; +} +"); + } + + [Test] + public void CastConstantNumberToFloat() + { + TestConversionVisualBasicToCSharp( +@"Private Sub Test() + Dim o As Object = 5F +End Sub +", @"void Test() +{ + object o = 5.0f; +} +"); + } + + [Test] + public void CastConstantNumberToDecimal() + { + TestConversionVisualBasicToCSharp( +@"Private Sub Test() + Dim o As Object = 5.0D +End Sub +", @"void Test() +{ + object o = 5.0m; +} +"); + } + } +} diff --git a/Tests/Common/ConverterTestBase.cs b/Tests/Common/ConverterTestBase.cs index 4a233e0c..4e1b446d 100644 --- a/Tests/Common/ConverterTestBase.cs +++ b/Tests/Common/ConverterTestBase.cs @@ -10,12 +10,63 @@ using System.Text; using RefactoringEssentials.Tests.Common; using Microsoft.CodeAnalysis.Formatting; +using RefactoringEssentials.CSharp.Converter; using Xunit; -namespace RefactoringEssentials.Tests.VB.Converter +namespace RefactoringEssentials.Tests { public class ConverterTestBase { + void CSharpWorkspaceSetup(out CSharpDiagnosticTestBase.TestWorkspace workspace, out Document doc, CSharpParseOptions parseOptions = null) + { + workspace = new CSharpDiagnosticTestBase.TestWorkspace(); + var projectId = ProjectId.CreateNewId(); + var documentId = DocumentId.CreateNewId(projectId); + if (parseOptions == null) + { + parseOptions = new CSharpParseOptions( + Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp6, + DocumentationMode.Diagnose | DocumentationMode.Parse, + SourceCodeKind.Regular, + ImmutableArray.Create("DEBUG", "TEST") + ); + } + workspace.Options.WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInControlBlocks, false); + workspace.Open(ProjectInfo.Create( + projectId, + VersionStamp.Create(), + "TestProject", + "TestProject", + LanguageNames.CSharp, + null, + null, + new CSharpCompilationOptions( + OutputKind.DynamicallyLinkedLibrary, + false, + "", + "", + "Script", + new[] { "System", "System.Collections.Generic", "System.Linq" }, + OptimizationLevel.Debug, + false, + true + ), + parseOptions, + new[] { + DocumentInfo.Create( + documentId, + "a.cs", + null, + SourceCodeKind.Regular + ) + }, + null, + DiagnosticTestBase.DefaultMetadataReferences + ) + ); + doc = workspace.CurrentSolution.GetProject(projectId).GetDocument(documentId); + } + void CSharpWorkspaceSetup(string text, out CSharpDiagnosticTestBase.TestWorkspace workspace, out Document doc, CSharpParseOptions parseOptions = null) { workspace = new CSharpDiagnosticTestBase.TestWorkspace(); @@ -109,6 +160,49 @@ void VBWorkspaceSetup(out CSharpDiagnosticTestBase.TestWorkspace workspace, out doc = workspace.CurrentSolution.GetProject(projectId).GetDocument(documentId); } + void VBWorkspaceSetup(string text, out CSharpDiagnosticTestBase.TestWorkspace workspace, out Document doc, VisualBasicParseOptions parseOptions = null) + { + workspace = new CSharpDiagnosticTestBase.TestWorkspace(); + var projectId = ProjectId.CreateNewId(); + var documentId = DocumentId.CreateNewId(projectId); + if (parseOptions == null) + { + parseOptions = new VisualBasicParseOptions( + Microsoft.CodeAnalysis.VisualBasic.LanguageVersion.VisualBasic14, + DocumentationMode.Diagnose | DocumentationMode.Parse, + SourceCodeKind.Regular + ); + } + workspace.Options.WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInControlBlocks, false); + var compilationOptions = new VisualBasicCompilationOptions(OutputKind.DynamicallyLinkedLibrary) + .WithRootNamespace("TestProject") + .WithGlobalImports(GlobalImport.Parse("System", "System.Collections.Generic", "System.Linq", "Microsoft.VisualBasic")); + workspace.Open(ProjectInfo.Create( + projectId, + VersionStamp.Create(), + "TestProject", + "TestProject", + LanguageNames.VisualBasic, + null, + null, + compilationOptions, + parseOptions, + new[] { + DocumentInfo.Create( + documentId, + "a.vb", + null, + SourceCodeKind.Regular, + TextLoader.From(TextAndVersion.Create(SourceText.From(text), VersionStamp.Create())) + ) + }, + null, + DiagnosticTestBase.DefaultMetadataReferences + ) + ); + doc = workspace.CurrentSolution.GetProject(projectId).GetDocument(documentId); + } + public void TestConversionCSharpToVisualBasic(string csharpCode, string expectedVisualBasicCode, CSharpParseOptions csharpOptions = null, VisualBasicParseOptions vbOptions = null) { DiagnosticTestBase.TestWorkspace csharpWorkspace, vbWorkspace; @@ -141,9 +235,46 @@ public void TestConversionCSharpToVisualBasic(string csharpCode, string expected } } - VisualBasicSyntaxNode Convert(CSharpSyntaxNode input, SemanticModel semanticModel, Document targetDocument) + public void TestConversionVisualBasicToCSharp(string visualBasicCode, string expectedCsharpCode, CSharpParseOptions csharpOptions = null, VisualBasicParseOptions vbOptions = null) + { + DiagnosticTestBase.TestWorkspace csharpWorkspace, vbWorkspace; + Document inputDocument, outputDocument; + VBWorkspaceSetup(visualBasicCode, out vbWorkspace, out inputDocument, vbOptions); + CSharpWorkspaceSetup(out csharpWorkspace, out outputDocument, csharpOptions); + var outputNode = Convert((VisualBasicSyntaxNode)inputDocument.GetSyntaxRootAsync().Result, inputDocument.GetSemanticModelAsync().Result, outputDocument); + + var txt = outputDocument.WithSyntaxRoot(Formatter.Format(outputNode, vbWorkspace)).GetTextAsync().Result.ToString(); + txt = Utils.HomogenizeEol(txt).TrimEnd(); + expectedCsharpCode = Utils.HomogenizeEol(expectedCsharpCode).TrimEnd(); + if (expectedCsharpCode != txt) + { + Console.WriteLine("expected:"); + Console.WriteLine(expectedCsharpCode); + Console.WriteLine("got:"); + Console.WriteLine(txt); + Console.WriteLine("diff:"); + int l = Math.Max(expectedCsharpCode.Length, txt.Length); + StringBuilder diff = new StringBuilder(l); + for (int i = 0; i < l; i++) + { + if (i >= expectedCsharpCode.Length || i >= txt.Length || expectedCsharpCode[i] != txt[i]) + diff.Append('x'); + else + diff.Append(expectedCsharpCode[i]); + } + Console.WriteLine(diff.ToString()); + Assert.Fail(); + } + } + + VisualBasicSyntaxNode Convert(CSharpSyntaxNode input, SemanticModel semanticModel, Document targetDocument) { return CSharpConverter.Convert(input, semanticModel, targetDocument); } + + CSharpSyntaxNode Convert(VisualBasicSyntaxNode input, SemanticModel semanticModel, Document targetDocument) + { + return VisualBasicConverter.Convert(input, semanticModel, targetDocument); + } } } diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index 74ecb7a1..85bad2c4 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -198,6 +198,12 @@ + + + + + + From 2d85026983438c2bc770d28d0203b251962c91f1 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Tue, 31 Jan 2017 12:06:28 +0100 Subject: [PATCH 072/236] Fix RE.2017 --- RefactoringEssentials.2017.sln | 92 +++++++++++++- .../Properties/AssemblyInfo.cs | 2 - .../Properties/AssemblyInfoBase.cs | 14 +-- .../RefactoringEssentials.csproj | 118 ++---------------- .../Util/CompilationUnitSyntaxExtensions.cs | 2 - 5 files changed, 105 insertions(+), 123 deletions(-) diff --git a/RefactoringEssentials.2017.sln b/RefactoringEssentials.2017.sln index 42ef3c04..ebc46b95 100644 --- a/RefactoringEssentials.2017.sln +++ b/RefactoringEssentials.2017.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.25920.0 +VisualStudioVersion = 15.0.26127.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{E7481F91-77A4-49F6-ACC7-B8145827C384}" ProjectSection(SolutionItems) = preProject @@ -29,173 +29,263 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Mono_Debug|Any CPU = Mono_Debug|Any CPU + Mono_Debug|x64 = Mono_Debug|x64 Mono_Debug|x86 = Mono_Debug|x86 Mono_Release|Any CPU = Mono_Release|Any CPU + Mono_Release|x64 = Mono_Release|x64 Mono_Release|x86 = Mono_Release|x86 net_4_5_Debug|Any CPU = net_4_5_Debug|Any CPU + net_4_5_Debug|x64 = net_4_5_Debug|x64 net_4_5_Debug|x86 = net_4_5_Debug|x86 net_4_5_Release|Any CPU = net_4_5_Release|Any CPU + net_4_5_Release|x64 = net_4_5_Release|x64 net_4_5_Release|x86 = net_4_5_Release|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Debug|x64.ActiveCfg = Debug|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Debug|x64.Build.0 = Debug|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Debug|x86.ActiveCfg = Debug|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Debug|x86.Build.0 = Debug|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Mono_Debug|Any CPU.ActiveCfg = Mono_Debug|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Mono_Debug|Any CPU.Build.0 = Mono_Debug|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Mono_Debug|x64.ActiveCfg = Mono_Debug|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Mono_Debug|x64.Build.0 = Mono_Debug|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Mono_Debug|x86.ActiveCfg = Mono_Debug|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Mono_Release|Any CPU.ActiveCfg = Mono_Release|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Mono_Release|Any CPU.Build.0 = Mono_Release|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Mono_Release|x64.ActiveCfg = Mono_Release|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Mono_Release|x64.Build.0 = Mono_Release|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Mono_Release|x86.ActiveCfg = Mono_Release|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Debug|Any CPU.Build.0 = Debug|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Debug|x64.ActiveCfg = Debug|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Debug|x64.Build.0 = Debug|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Debug|x86.ActiveCfg = Debug|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Debug|x86.Build.0 = Debug|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Release|Any CPU.ActiveCfg = Release|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Release|Any CPU.Build.0 = Release|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Release|x64.ActiveCfg = Release|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Release|x64.Build.0 = Release|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Release|x86.ActiveCfg = Release|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.net_4_5_Release|x86.Build.0 = Release|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Release|Any CPU.ActiveCfg = Release|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Release|Any CPU.Build.0 = Release|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Release|x64.ActiveCfg = Release|Any CPU + {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Release|x64.Build.0 = Release|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Release|x86.ActiveCfg = Release|Any CPU {99498EF8-C9E0-433B-8D7B-EA8E9E66F0C7}.Release|x86.Build.0 = Release|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Debug|x64.ActiveCfg = Debug|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Debug|x64.Build.0 = Debug|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Debug|x86.ActiveCfg = Debug|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Debug|x86.Build.0 = Debug|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Mono_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Mono_Debug|x64.ActiveCfg = Mono_Debug|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Mono_Debug|x64.Build.0 = Mono_Debug|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Mono_Debug|x86.ActiveCfg = Debug|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Mono_Release|Any CPU.ActiveCfg = Release|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Mono_Release|x64.ActiveCfg = Mono_Release|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Mono_Release|x64.Build.0 = Mono_Release|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Mono_Release|x86.ActiveCfg = Release|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Debug|Any CPU.Build.0 = Debug|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Debug|x64.ActiveCfg = Debug|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Debug|x64.Build.0 = Debug|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Debug|x86.ActiveCfg = Debug|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Debug|x86.Build.0 = Debug|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Release|Any CPU.ActiveCfg = Release|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Release|Any CPU.Build.0 = Release|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Release|x64.ActiveCfg = Release|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Release|x64.Build.0 = Release|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Release|x86.ActiveCfg = Release|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.net_4_5_Release|x86.Build.0 = Release|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Release|Any CPU.ActiveCfg = Release|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Release|Any CPU.Build.0 = Release|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Release|x64.ActiveCfg = Release|Any CPU + {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Release|x64.Build.0 = Release|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Release|x86.ActiveCfg = Release|Any CPU {203FF5F7-8F0A-43C5-8BB5-723C492A42DA}.Release|x86.Build.0 = Release|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Debug|x64.ActiveCfg = Debug|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Debug|x64.Build.0 = Debug|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Debug|x86.ActiveCfg = Debug|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Debug|x86.Build.0 = Debug|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Mono_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Mono_Debug|x64.ActiveCfg = Mono_Debug|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Mono_Debug|x64.Build.0 = Mono_Debug|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Mono_Debug|x86.ActiveCfg = Debug|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Mono_Release|Any CPU.ActiveCfg = Release|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Mono_Release|x64.ActiveCfg = Mono_Release|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Mono_Release|x64.Build.0 = Mono_Release|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Mono_Release|x86.ActiveCfg = Release|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Debug|Any CPU.Build.0 = Debug|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Debug|x64.ActiveCfg = Debug|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Debug|x64.Build.0 = Debug|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Debug|x86.ActiveCfg = Debug|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Debug|x86.Build.0 = Debug|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Release|Any CPU.ActiveCfg = Release|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Release|Any CPU.Build.0 = Release|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Release|x64.ActiveCfg = Release|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Release|x64.Build.0 = Release|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Release|x86.ActiveCfg = Release|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.net_4_5_Release|x86.Build.0 = Release|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Release|Any CPU.ActiveCfg = Release|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Release|Any CPU.Build.0 = Release|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Release|x64.ActiveCfg = Release|Any CPU + {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Release|x64.Build.0 = Release|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Release|x86.ActiveCfg = Release|Any CPU {31E950AF-20E9-43AB-8CB7-134598FB8A6D}.Release|x86.Build.0 = Release|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Debug|x64.ActiveCfg = Debug|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Debug|x64.Build.0 = Debug|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Debug|x86.ActiveCfg = Debug|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Debug|x86.Build.0 = Debug|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Mono_Debug|Any CPU.ActiveCfg = Debug|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Mono_Debug|Any CPU.Build.0 = Debug|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Mono_Debug|x64.ActiveCfg = Mono_Debug|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Mono_Debug|x64.Build.0 = Mono_Debug|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Mono_Debug|x86.ActiveCfg = Debug|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Mono_Release|Any CPU.ActiveCfg = Release|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Mono_Release|Any CPU.Build.0 = Release|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Mono_Release|x64.ActiveCfg = Mono_Release|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Mono_Release|x64.Build.0 = Mono_Release|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Mono_Release|x86.ActiveCfg = Release|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Debug|Any CPU.Build.0 = Debug|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Debug|x64.ActiveCfg = Debug|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Debug|x64.Build.0 = Debug|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Debug|x86.ActiveCfg = Debug|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Debug|x86.Build.0 = Debug|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Release|Any CPU.ActiveCfg = Release|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Release|Any CPU.Build.0 = Release|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Release|x64.ActiveCfg = Release|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Release|x64.Build.0 = Release|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Release|x86.ActiveCfg = Release|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.net_4_5_Release|x86.Build.0 = Release|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Release|Any CPU.ActiveCfg = Release|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Release|Any CPU.Build.0 = Release|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Release|x64.ActiveCfg = Release|Any CPU + {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Release|x64.Build.0 = Release|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Release|x86.ActiveCfg = Release|Any CPU {21DBA1CE-AF55-4159-B04B-B8C621BE8921}.Release|x86.Build.0 = Release|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Debug|x64.ActiveCfg = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Debug|x64.Build.0 = Debug|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Debug|x86.ActiveCfg = Debug|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Debug|x86.Build.0 = Debug|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Debug|Any CPU.ActiveCfg = Debug|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Debug|Any CPU.Build.0 = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Debug|x64.ActiveCfg = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Debug|x64.Build.0 = Debug|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Debug|x86.ActiveCfg = Debug|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Debug|x86.Build.0 = Debug|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Release|Any CPU.ActiveCfg = Release|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Release|Any CPU.Build.0 = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Release|x64.ActiveCfg = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Release|x64.Build.0 = Release|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Release|x86.ActiveCfg = Release|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Mono_Release|x86.Build.0 = Release|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Debug|Any CPU.Build.0 = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Debug|x64.ActiveCfg = Debug|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Debug|x64.Build.0 = Debug|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Debug|x86.ActiveCfg = Debug|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Debug|x86.Build.0 = Debug|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Release|Any CPU.ActiveCfg = Release|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Release|Any CPU.Build.0 = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Release|x64.ActiveCfg = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Release|x64.Build.0 = Release|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Release|x86.ActiveCfg = Release|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.net_4_5_Release|x86.Build.0 = Release|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Release|Any CPU.ActiveCfg = Release|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Release|Any CPU.Build.0 = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Release|x64.ActiveCfg = Release|Any CPU + {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Release|x64.Build.0 = Release|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Release|x86.ActiveCfg = Release|Any CPU {9FD0CFFC-CEDF-42DC-A344-B3E8F4EDF7C7}.Release|x86.Build.0 = Release|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Debug|x64.ActiveCfg = Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Debug|x64.Build.0 = Debug|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Debug|x86.ActiveCfg = Debug|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Debug|x86.Build.0 = Debug|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Debug|Any CPU.ActiveCfg = Mono_Debug|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Debug|Any CPU.Build.0 = Mono_Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Debug|x64.ActiveCfg = Mono_Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Debug|x64.Build.0 = Mono_Debug|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Debug|x86.ActiveCfg = Mono_Debug|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Debug|x86.Build.0 = Mono_Debug|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Release|Any CPU.ActiveCfg = Mono_Release|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Release|Any CPU.Build.0 = Mono_Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Release|x64.ActiveCfg = Mono_Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Release|x64.Build.0 = Mono_Release|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Release|x86.ActiveCfg = Mono_Release|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Mono_Release|x86.Build.0 = Mono_Release|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Debug|Any CPU.Build.0 = Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Debug|x64.ActiveCfg = Debug|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Debug|x64.Build.0 = Debug|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Debug|x86.ActiveCfg = Debug|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Debug|x86.Build.0 = Debug|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Release|Any CPU.ActiveCfg = Release|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Release|Any CPU.Build.0 = Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Release|x64.ActiveCfg = Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Release|x64.Build.0 = Release|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Release|x86.ActiveCfg = Release|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.net_4_5_Release|x86.Build.0 = Release|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Release|Any CPU.ActiveCfg = Release|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Release|Any CPU.Build.0 = Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Release|x64.ActiveCfg = Release|Any CPU + {7FB64621-DF93-48DE-995D-8CB0804F6003}.Release|x64.Build.0 = Release|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Release|x86.ActiveCfg = Release|Any CPU {7FB64621-DF93-48DE-995D-8CB0804F6003}.Release|x86.Build.0 = Release|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Debug|x64.ActiveCfg = Debug|x64 + {18236D33-B3E1-45DC-99E7-230633A228B6}.Debug|x64.Build.0 = Debug|x64 {18236D33-B3E1-45DC-99E7-230633A228B6}.Debug|x86.ActiveCfg = Debug|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.Debug|x86.Build.0 = Debug|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Debug|Any CPU.ActiveCfg = Debug|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Debug|Any CPU.Build.0 = Debug|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Debug|x64.ActiveCfg = Debug|x64 + {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Debug|x64.Build.0 = Debug|x64 {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Debug|x86.ActiveCfg = Debug|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Debug|x86.Build.0 = Debug|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Release|Any CPU.ActiveCfg = Release|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Release|Any CPU.Build.0 = Release|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Release|x64.ActiveCfg = Release|x64 + {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Release|x64.Build.0 = Release|x64 {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Release|x86.ActiveCfg = Release|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.Mono_Release|x86.Build.0 = Release|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Debug|Any CPU.Build.0 = Debug|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Debug|x64.ActiveCfg = Debug|x64 + {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Debug|x64.Build.0 = Debug|x64 {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Debug|x86.ActiveCfg = Debug|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Debug|x86.Build.0 = Debug|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Release|Any CPU.ActiveCfg = Release|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Release|Any CPU.Build.0 = Release|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Release|x64.ActiveCfg = Release|x64 + {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Release|x64.Build.0 = Release|x64 {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Release|x86.ActiveCfg = Release|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.net_4_5_Release|x86.Build.0 = Release|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.Release|Any CPU.ActiveCfg = Release|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.Release|Any CPU.Build.0 = Release|Any CPU + {18236D33-B3E1-45DC-99E7-230633A228B6}.Release|x64.ActiveCfg = Release|x64 + {18236D33-B3E1-45DC-99E7-230633A228B6}.Release|x64.Build.0 = Release|x64 {18236D33-B3E1-45DC-99E7-230633A228B6}.Release|x86.ActiveCfg = Release|Any CPU {18236D33-B3E1-45DC-99E7-230633A228B6}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection diff --git a/RefactoringEssentials.2017/Properties/AssemblyInfo.cs b/RefactoringEssentials.2017/Properties/AssemblyInfo.cs index 33a54778..5083ff59 100644 --- a/RefactoringEssentials.2017/Properties/AssemblyInfo.cs +++ b/RefactoringEssentials.2017/Properties/AssemblyInfo.cs @@ -1,6 +1,4 @@ using System.Reflection; using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -[assembly: AssemblyTitle("Refactoring Essentials")] [assembly: InternalsVisibleTo("RefactoringEssentials.Tests")] diff --git a/RefactoringEssentials.2017/Properties/AssemblyInfoBase.cs b/RefactoringEssentials.2017/Properties/AssemblyInfoBase.cs index 797ee376..e9eef854 100644 --- a/RefactoringEssentials.2017/Properties/AssemblyInfoBase.cs +++ b/RefactoringEssentials.2017/Properties/AssemblyInfoBase.cs @@ -1,16 +1,4 @@ - -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyCompany("ICSharpCode")] -[assembly: AssemblyProduct("Refactoring Essentials for Visual Studio 2017")] -[assembly: AssemblyCopyright("Copyright 2010-2016 AlphaSierraPapa and Xamarin Inc.")] -[assembly: AssemblyVersion("5.0.0.0")] -[assembly: AssemblyFileVersion("5.0.0")] +using System.Runtime.InteropServices; // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. diff --git a/RefactoringEssentials.2017/RefactoringEssentials.csproj b/RefactoringEssentials.2017/RefactoringEssentials.csproj index a56c0ba2..6a8eba0e 100644 --- a/RefactoringEssentials.2017/RefactoringEssentials.csproj +++ b/RefactoringEssentials.2017/RefactoringEssentials.csproj @@ -1,16 +1,14 @@ - - - - ..\bin\Debug - TRACE;DEBUG;RE2017 - - - ..\bin\Release - RE2017 - + netstandard1.3 - $(PackageTargetFallback);portable-net45+win8+wp8+wpa81 + Refactoring Essentials + RefactoringEssentials + portable-net45+win8 + ICSharpCode + Analyzers and Code Fixes for Visual Studio 2017 (Roslyn-based). + Refactoring Essentials for Visual Studio 2017 + Copyright 2010-2017 AlphaSierraPapa and Xamarin Inc. + 5.0.0.0 @@ -1675,13 +1673,6 @@ Xml\TreeTraversal.cs - - - AssemblyInfoBase.tt - True - True - - @@ -1690,92 +1681,9 @@ - - 2.0.0-rc - - - 2.0.0-rc - - - 2.0.0-rc - - - 2.0.0-rc - - - 2.0.0-rc - - - 1.6 - - - 1.0.0-alpha-20161104-2 - All - - - 1.3.0 - - - 4.1.1 - - - - - - - - PreserveNewest - buildlibrarypackage.cmd - - - PreserveNewest - buildpackage.cmd - - - PreserveNewest - buildpackages_appveyor.cmd - - - PreserveNewest - tools\install.ps1 - - - PreserveNewest - tools\uninstall.ps1 - - - Util\Reflection.md - - - Xml\ICSharpCode.NRefactory.Xml.csproj - - - - - - - True - True - RefactoringEssentials.Library.tt - - - TextTemplatingFileGenerator - RefactoringEssentials.Library.nuspec - - - True - True - RefactoringEssentials.tt - - - TextTemplatingFileGenerator - RefactoringEssentials.nuspec - - - + + + + - - - false - \ No newline at end of file diff --git a/RefactoringEssentials/Util/CompilationUnitSyntaxExtensions.cs b/RefactoringEssentials/Util/CompilationUnitSyntaxExtensions.cs index cda53e9e..5ab66095 100644 --- a/RefactoringEssentials/Util/CompilationUnitSyntaxExtensions.cs +++ b/RefactoringEssentials/Util/CompilationUnitSyntaxExtensions.cs @@ -3,10 +3,8 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Text; using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.CSharp.Extensions; namespace RefactoringEssentials { From 22a6073cae32466213212a85ae98ddb9258e0e8e Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Wed, 1 Feb 2017 13:15:42 +0100 Subject: [PATCH 073/236] Update Converter Tests to xunit --- .../CodeRefactorings.CSharp.html | 2 +- .../Properties/AssemblyInfoBase.cs | 1 + Tests/CSharp/Converter/ExpressionTests.cs | 42 ++++------ Tests/CSharp/Converter/MemberTests.cs | 36 ++++---- Tests/CSharp/Converter/NamespaceLevelTests.cs | 40 +++++---- .../Converter/SpecialConversionTests.cs | 18 ++-- Tests/CSharp/Converter/StatementTests.cs | 82 +++++++++---------- Tests/CSharp/Converter/TypeCastTests.cs | 24 ++---- .../NonPublicMethodWithTestAttributeTests.cs | 18 ++-- .../RedundantAttributeParenthesesTests.cs | 4 +- Tests/Common/ConverterTestBase.cs | 21 +++-- 11 files changed, 128 insertions(+), 160 deletions(-) diff --git a/RefactoringEssentials/CodeRefactorings.CSharp.html b/RefactoringEssentials/CodeRefactorings.CSharp.html index 666d590a..c44d2d40 100644 --- a/RefactoringEssentials/CodeRefactorings.CSharp.html +++ b/RefactoringEssentials/CodeRefactorings.CSharp.html @@ -53,7 +53,7 @@

                      Supported Refactorings

                    • Convert 'if' to '??' expression (ConvertIfStatementToNullCoalescingExpressionAction)
                    • Convert 'if' to 'return' (ConvertIfStatementToReturnStatementAction)
                    • Convert 'if' to 'switch' (ConvertIfStatementToSwitchStatementCodeRefactoringProvider)
                    • -
                    • Convert implict to explicit implementation (ConvertImplicitToExplicitImplementationCodeRefactoringProvider)
                    • +
                    • Convert implicit to explicit implementation (ConvertImplicitToExplicitImplementationCodeRefactoringProvider)
                    • Convert instance to static method (ConvertInstanceToStaticMethodCodeRefactoringProvider)
                    • Convert string interpolation to 'string.Format' (ConvertInterpolatedStringToStringFormatCodeRefactoringProvider)
                    • Converts expression of lambda body to statement (ConvertLambdaBodyExpressionToStatementCodeRefactoringProvider)
                    • diff --git a/RefactoringEssentials/Properties/AssemblyInfoBase.cs b/RefactoringEssentials/Properties/AssemblyInfoBase.cs index 314c3262..4d15cd5c 100644 --- a/RefactoringEssentials/Properties/AssemblyInfoBase.cs +++ b/RefactoringEssentials/Properties/AssemblyInfoBase.cs @@ -1,5 +1,6 @@  using System.Reflection; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following diff --git a/Tests/CSharp/Converter/ExpressionTests.cs b/Tests/CSharp/Converter/ExpressionTests.cs index ca88275f..028f5fa6 100644 --- a/Tests/CSharp/Converter/ExpressionTests.cs +++ b/Tests/CSharp/Converter/ExpressionTests.cs @@ -1,16 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using NUnit.Framework; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Converter { - [TestFixture] - public class ExpressionTests : ConverterTestBase + public class ExpressionTests : ConverterTestBase { - [Test] + [Fact] public void MultilineString() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -29,7 +23,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void ConditionalExpression() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -46,7 +40,7 @@ void TestMethod(string str) }"); } - [Test] + [Fact] public void NullCoalescingExpression() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -63,7 +57,7 @@ void TestMethod(string str) }"); } - [Test] + [Fact] public void MemberAccessAndInvocationExpression() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -86,7 +80,7 @@ void TestMethod(string str) }"); } - [Test] + [Fact] public void ElvisOperatorExpression() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -109,7 +103,7 @@ void TestMethod(string str) }"); } - [Test] + [Fact] public void ObjectInitializerExpression() { TestConversionVisualBasicToCSharp(@"Class StudentName @@ -139,7 +133,7 @@ void TestMethod(string str) }"); } - [Test] + [Fact] public void ObjectInitializerExpression2() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -159,7 +153,7 @@ void TestMethod(string str) }"); } - [Test] + [Fact] public void ThisMemberAccessExpression() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -180,7 +174,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void BaseMemberAccessExpression() { TestConversionVisualBasicToCSharp(@"Class BaseTestClass @@ -208,7 +202,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void DelegateExpression() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -228,7 +222,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void LambdaBodyExpression() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -256,7 +250,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void Await() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -284,7 +278,7 @@ async void TestMethod() }"); } - [Test] + [Fact] public void Linq1() { TestConversionVisualBasicToCSharp(@"Private Shared Sub SimpleQuery() @@ -308,7 +302,7 @@ where n > 5 }"); } - [Test] + [Fact] public void Linq2() { TestConversionVisualBasicToCSharp(@"Public Shared Sub Linq40() @@ -343,7 +337,7 @@ group n by n % 5 into g }"); } - [Test] + [Fact] public void Linq3() { TestConversionVisualBasicToCSharp(@"Class Product @@ -392,7 +386,7 @@ join p in products on c equals p.Category }"); } - [Test] + [Fact] public void Linq4() { TestConversionVisualBasicToCSharp(@"Public Sub Linq103() diff --git a/Tests/CSharp/Converter/MemberTests.cs b/Tests/CSharp/Converter/MemberTests.cs index 222d26bd..63d18f89 100644 --- a/Tests/CSharp/Converter/MemberTests.cs +++ b/Tests/CSharp/Converter/MemberTests.cs @@ -1,16 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using NUnit.Framework; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Converter { - [TestFixture] public class MemberTests : ConverterTestBase { - [Test] + [Fact] public void TestField() { TestConversionVisualBasicToCSharp( @@ -26,7 +20,7 @@ public void TestField() }"); } - [Test] + [Fact] public void TestMethod() { TestConversionVisualBasicToCSharp( @@ -47,7 +41,7 @@ End Sub }"); } - [Test] + [Fact] public void TestMethodWithReturnType() { TestConversionVisualBasicToCSharp( @@ -64,7 +58,7 @@ End Function }"); } - [Test] + [Fact] public void TestStaticMethod() { TestConversionVisualBasicToCSharp( @@ -85,7 +79,7 @@ End Sub }"); } - [Test] + [Fact] public void TestAbstractMethod() { TestConversionVisualBasicToCSharp( @@ -97,7 +91,7 @@ Public MustOverride Sub TestMethod() }"); } - [Test] + [Fact] public void TestSealedMethod() { TestConversionVisualBasicToCSharp( @@ -118,7 +112,7 @@ End Sub }"); } - [Test] + [Fact] public void TestExtensionMethod() { TestConversionVisualBasicToCSharp( @@ -136,7 +130,7 @@ public static void TestMethod(this String str) }"); } - [Test] + [Fact] public void TestExtensionMethodWithExistingImport() { TestConversionVisualBasicToCSharp( @@ -156,7 +150,7 @@ public static void TestMethod(this String str) }"); } - [Test] + [Fact] public void TestProperty() { TestConversionVisualBasicToCSharp( @@ -193,7 +187,7 @@ public int Test3 { }"); } - [Test] + [Fact] public void TestConstructor() { TestConversionVisualBasicToCSharp( @@ -208,7 +202,7 @@ public TestClass(out T argument, ref T2 argument2, T3 argument3) }"); } - [Test] + [Fact] public void TestDestructor() { TestConversionVisualBasicToCSharp( @@ -223,7 +217,7 @@ End Sub }"); } - [Test] + [Fact] public void TestEvent() { TestConversionVisualBasicToCSharp( @@ -235,7 +229,7 @@ Public Event MyEvent As EventHandler }"); } - [Test] + [Fact] public void TestCustomEvent() { TestConversionVisualBasicToCSharp( @@ -267,7 +261,7 @@ public event EventHandler MyEvent { }"); } - [Test] + [Fact] public void TestIndexer() { TestConversionVisualBasicToCSharp( diff --git a/Tests/CSharp/Converter/NamespaceLevelTests.cs b/Tests/CSharp/Converter/NamespaceLevelTests.cs index 006431cc..ccb43bed 100644 --- a/Tests/CSharp/Converter/NamespaceLevelTests.cs +++ b/Tests/CSharp/Converter/NamespaceLevelTests.cs @@ -1,12 +1,10 @@ - -using NUnit.Framework; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Converter { - [TestFixture] - public class NamespaceLevelTests : ConverterTestBase + public class NamespaceLevelTests : ConverterTestBase { - [Test] + [Fact] public void TestNamespace() { TestConversionVisualBasicToCSharp(@"Namespace Test @@ -16,7 +14,7 @@ public void TestNamespace() }"); } - [Test] + [Fact] public void TestTopLevelAttribute() { TestConversionVisualBasicToCSharp( @@ -24,7 +22,7 @@ public void TestTopLevelAttribute() @"[assembly: CLSCompliant(true)]"); } - [Test] + [Fact] public void TestImports() { TestConversionVisualBasicToCSharp( @@ -34,7 +32,7 @@ public void TestImports() using VB = Microsoft.VisualBasic;"); } - [Test] + [Fact] public void TestClass() { TestConversionVisualBasicToCSharp(@"Namespace Test.[class] @@ -48,7 +46,7 @@ class TestClass }"); } - [Test] + [Fact] public void TestInternalStaticClass() { TestConversionVisualBasicToCSharp(@"Namespace Test.[class] @@ -69,7 +67,7 @@ static void Test2() {} }"); } - [Test] + [Fact] public void TestAbstractClass() { TestConversionVisualBasicToCSharp(@"Namespace Test.[class] @@ -83,7 +81,7 @@ abstract class TestClass }"); } - [Test] + [Fact] public void TestSealedClass() { TestConversionVisualBasicToCSharp(@"Namespace Test.[class] @@ -97,7 +95,7 @@ sealed class TestClass }"); } - [Test] + [Fact] public void TestInterface() { TestConversionVisualBasicToCSharp( @@ -111,7 +109,7 @@ Sub Test() }"); } - [Test] + [Fact] public void TestEnum() { TestConversionVisualBasicToCSharp( @@ -129,7 +127,7 @@ public void TestEnum() }"); } - [Test] + [Fact] public void TestClassInheritanceList() { TestConversionVisualBasicToCSharp( @@ -154,7 +152,7 @@ Protected MustOverride Sub Test() }"); } - [Test] + [Fact] public void TestStruct() { TestConversionVisualBasicToCSharp( @@ -169,7 +167,7 @@ void Test() {} }"); } - [Test] + [Fact] public void TestDelegate() { TestConversionVisualBasicToCSharp( @@ -186,7 +184,7 @@ public void TestDelegate() @"public delegate void Test(ref int x);"); } - [Test] + [Fact] public void MoveImportsStatement() { TestConversionVisualBasicToCSharp(@"Imports SomeNamespace @@ -196,7 +194,7 @@ Namespace test "namespace test { using SomeNamespace; }"); } - [Test] + [Fact] public void ClassImplementsInterface() { TestConversionVisualBasicToCSharp(@"Class test @@ -205,7 +203,7 @@ Implements IComparable "using System; class test : IComparable { }"); } - [Test] + [Fact] public void ClassImplementsInterface2() { TestConversionVisualBasicToCSharp(@"Class test @@ -214,7 +212,7 @@ Implements System.IComparable "class test : System.IComparable { }"); } - [Test] + [Fact] public void ClassInheritsClass() { TestConversionVisualBasicToCSharp(@"Imports System.IO @@ -225,7 +223,7 @@ Inherits InvalidDataException "using System.IO; class test : InvalidDataException { }"); } - [Test] + [Fact] public void ClassInheritsClass2() { TestConversionVisualBasicToCSharp(@"Class test diff --git a/Tests/CSharp/Converter/SpecialConversionTests.cs b/Tests/CSharp/Converter/SpecialConversionTests.cs index 33d611d0..6d0d50c4 100644 --- a/Tests/CSharp/Converter/SpecialConversionTests.cs +++ b/Tests/CSharp/Converter/SpecialConversionTests.cs @@ -1,16 +1,10 @@ -using NUnit.Framework; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Converter { - [TestFixture] - public class SpecialConversionTests : ConverterTestBase + public class SpecialConversionTests : ConverterTestBase { - [Test] + [Fact] public void TestSimpleInlineAssign() { TestConversionVisualBasicToCSharp( @@ -35,7 +29,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void TestSimplePostIncrementAssign() { TestConversionVisualBasicToCSharp( @@ -54,7 +48,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void RaiseEvent() { TestConversionVisualBasicToCSharp( @@ -135,7 +129,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void IfStatementSimilarToRaiseEvent() { TestConversionVisualBasicToCSharp( diff --git a/Tests/CSharp/Converter/StatementTests.cs b/Tests/CSharp/Converter/StatementTests.cs index 5df8cbc4..141a02ab 100644 --- a/Tests/CSharp/Converter/StatementTests.cs +++ b/Tests/CSharp/Converter/StatementTests.cs @@ -1,16 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using NUnit.Framework; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Converter { - [TestFixture] public class StatementTests : ConverterTestBase { - [Test] + [Fact] public void EmptyStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -40,7 +34,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void AssignmentStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -59,7 +53,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void AssignmentStatementInDeclaration() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -76,7 +70,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void AssignmentStatementInVarDeclaration() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -93,7 +87,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void ObjectInitializationStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -112,7 +106,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void ObjectInitializationStatementInDeclaration() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -129,7 +123,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void ObjectInitializationStatementInVarDeclaration() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -146,7 +140,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void ArrayDeclarationStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -163,7 +157,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void ArrayInitializationStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -180,7 +174,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void ArrayInitializationStatementInVarDeclaration() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -197,7 +191,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void ArrayInitializationStatementWithType() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -214,7 +208,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void ArrayInitializationStatementWithLength() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -231,7 +225,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void MultidimensionalArrayDeclarationStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -248,7 +242,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void MultidimensionalArrayInitializationStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -265,7 +259,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void MultidimensionalArrayInitializationStatementWithType() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -282,7 +276,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void MultidimensionalArrayInitializationStatementWithLengths() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -299,7 +293,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void JaggedArrayDeclarationStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -316,7 +310,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void JaggedArrayInitializationStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -333,7 +327,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void JaggedArrayInitializationStatementWithType() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -350,7 +344,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void JaggedArrayInitializationStatementWithLength() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -367,7 +361,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void DeclarationStatements() { TestConversionVisualBasicToCSharp( @@ -391,7 +385,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void IfStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -427,7 +421,7 @@ void TestMethod (int a) }"); } - [Test] + [Fact] public void WhileStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -460,7 +454,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void DoWhileStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -494,7 +488,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void ForEachStatementWithExplicitType() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -520,7 +514,7 @@ void TestMethod(int[] values) }"); } - [Test] + [Fact] public void ForEachStatementWithVar() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -546,7 +540,7 @@ void TestMethod(int[] values) }"); } - [Test] + [Fact] public void SyncLockStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -571,7 +565,7 @@ void TestMethod(object nullObject) }"); } - [Test] + [Fact] public void ForWithUnknownConditionAndSingleStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -594,7 +588,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void ForWithUnknownConditionAndBlock() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -618,7 +612,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void ForWithSingleStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -637,7 +631,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void ForWithBlock() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -658,7 +652,7 @@ void TestMethod() }"); } - [Test] + [Fact] public void LabeledAndForStatement() { TestConversionVisualBasicToCSharp(@"Class GotoTest1 @@ -741,7 +735,7 @@ static void Main() }"); } - [Test] + [Fact] public void ThrowStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -759,7 +753,7 @@ void TestMethod(object nullObject) }"); } - [Test] + [Fact] public void AddRemoveHandler() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -802,7 +796,7 @@ void MyHandler(object sender, EventArgs e) }"); } - [Test] + [Fact] public void SelectCase1() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -852,7 +846,7 @@ void TestMethod(int number) }"); } - [Test] + [Fact] public void TryCatch() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -922,7 +916,7 @@ void TestMethod(int number) }"); } - [Test] + [Fact] public void Yield() { TestConversionVisualBasicToCSharp(@"Class TestClass diff --git a/Tests/CSharp/Converter/TypeCastTests.cs b/Tests/CSharp/Converter/TypeCastTests.cs index 858bc032..52e0acf5 100644 --- a/Tests/CSharp/Converter/TypeCastTests.cs +++ b/Tests/CSharp/Converter/TypeCastTests.cs @@ -1,16 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using NUnit.Framework; +using Xunit; namespace RefactoringEssentials.Tests.CSharp.Converter { - [TestFixture] public class TypeCastTests : ConverterTestBase { - [Test] + [Fact] public void CastObjectToInteger() { TestConversionVisualBasicToCSharp( @@ -26,7 +20,7 @@ End Sub "); } - [Test] + [Fact] public void CastObjectToString() { TestConversionVisualBasicToCSharp( @@ -42,7 +36,7 @@ End Sub "); } - [Test] + [Fact] public void CastObjectToGenericList() { TestConversionVisualBasicToCSharp( @@ -58,7 +52,7 @@ End Sub "); } - [Test] + [Fact] public void TryCastObjectToInteger() { TestConversionVisualBasicToCSharp( @@ -74,7 +68,7 @@ End Sub "); } - [Test] + [Fact] public void TryCastObjectToGenericList() { TestConversionVisualBasicToCSharp( @@ -90,7 +84,7 @@ End Sub "); } - [Test] + [Fact] public void CastConstantNumberToLong() { TestConversionVisualBasicToCSharp( @@ -104,7 +98,7 @@ End Sub "); } - [Test] + [Fact] public void CastConstantNumberToFloat() { TestConversionVisualBasicToCSharp( @@ -118,7 +112,7 @@ End Sub "); } - [Test] + [Fact] public void CastConstantNumberToDecimal() { TestConversionVisualBasicToCSharp( diff --git a/Tests/CSharp/Diagnostics/NonPublicMethodWithTestAttributeTests.cs b/Tests/CSharp/Diagnostics/NonPublicMethodWithTestAttributeTests.cs index 25cc4b7d..f74690c6 100644 --- a/Tests/CSharp/Diagnostics/NonPublicMethodWithTestAttributeTests.cs +++ b/Tests/CSharp/Diagnostics/NonPublicMethodWithTestAttributeTests.cs @@ -21,7 +21,7 @@ public void TestImplicitPrivate() [TestFixture] class Tests { - [Test] + [Fact] void $NonPublicMethod$() { } @@ -30,7 +30,7 @@ class Tests [TestFixture] class Tests { - [Test] + [Fact] public void NonPublicMethod() { } @@ -45,7 +45,7 @@ public void TestExplicitPrivate() [TestFixture] class Tests { - [Test] + [Fact] private void $NonPublicMethod$() { } @@ -54,7 +54,7 @@ class Tests [TestFixture] class Tests { - [Test] + [Fact] public void NonPublicMethod() { } @@ -69,7 +69,7 @@ public void TestExplicitProtected() [TestFixture] class Tests { - [Test] + [Fact] protected void $NonPublicMethod$() { } @@ -78,7 +78,7 @@ class Tests [TestFixture] class Tests { - [Test] + [Fact] public void NonPublicMethod() { } @@ -93,7 +93,7 @@ public void TestExplicitInternal() [TestFixture] class Tests { - [Test] + [Fact] internal void $NonPublicMethod$() { } @@ -102,7 +102,7 @@ class Tests [TestFixture] class Tests { - [Test] + [Fact] public void NonPublicMethod() { } @@ -116,7 +116,7 @@ public void TestDisable() class Tests { #pragma warning disable " + CSharpDiagnosticIDs.NonPublicMethodWithTestAttributeAnalyzerID + @" - [Test] + [Fact] void NonPublicMethod() { } diff --git a/Tests/CSharp/Diagnostics/RedundantAttributeParenthesesTests.cs b/Tests/CSharp/Diagnostics/RedundantAttributeParenthesesTests.cs index 2ab78d46..86ce03a7 100644 --- a/Tests/CSharp/Diagnostics/RedundantAttributeParenthesesTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantAttributeParenthesesTests.cs @@ -11,7 +11,7 @@ public void DefaultCase() Analyze(@" [Test$()$] class TestClass { }", @" -[Test] +[Fact] class TestClass { }"); } @@ -19,7 +19,7 @@ class TestClass { }"); public void IgnoreNoParentheses() { Analyze(@" -[Test] +[Fact] class TestClass { }"); } diff --git a/Tests/Common/ConverterTestBase.cs b/Tests/Common/ConverterTestBase.cs index 4e1b446d..a6658e58 100644 --- a/Tests/Common/ConverterTestBase.cs +++ b/Tests/Common/ConverterTestBase.cs @@ -248,22 +248,21 @@ public void TestConversionVisualBasicToCSharp(string visualBasicCode, string exp expectedCsharpCode = Utils.HomogenizeEol(expectedCsharpCode).TrimEnd(); if (expectedCsharpCode != txt) { - Console.WriteLine("expected:"); - Console.WriteLine(expectedCsharpCode); - Console.WriteLine("got:"); - Console.WriteLine(txt); - Console.WriteLine("diff:"); - int l = Math.Max(expectedCsharpCode.Length, txt.Length); - StringBuilder diff = new StringBuilder(l); + int l = Math.Max(expectedCsharpCode.Length, txt.Length) * 3; + StringBuilder sb = new StringBuilder(l); + sb.AppendLine("expected:"); + sb.AppendLine(expectedCsharpCode); + sb.AppendLine("got:"); + sb.AppendLine(txt); + sb.AppendLine("diff:"); for (int i = 0; i < l; i++) { if (i >= expectedCsharpCode.Length || i >= txt.Length || expectedCsharpCode[i] != txt[i]) - diff.Append('x'); + sb.Append('x'); else - diff.Append(expectedCsharpCode[i]); + sb.Append(expectedCsharpCode[i]); } - Console.WriteLine(diff.ToString()); - Assert.Fail(); + Assert.True(false, sb.ToString()); } } From 1b8906068213e1a3894f97e6a5c85233b27aa9de Mon Sep 17 00:00:00 2001 From: Andrew Boklashko Date: Mon, 6 Feb 2017 22:42:54 +0200 Subject: [PATCH 074/236] Fixed some refactoring providers that could cause convertinginterface members into non-abstract ones --- ...onvertAutoPropertyToPropertyCodeRefactoringProvider.cs | 4 ++++ ...onvertInstanceToStaticMethodCodeRefactoringProvider.cs | 2 +- ...yWithPropertyAndBackingFieldCodeRefactoringProvider.cs | 4 ++++ ...tVirtualNonVirtualConversionCodeRefactoringProvider.cs | 8 ++++---- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertAutoPropertyToPropertyCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertAutoPropertyToPropertyCodeRefactoringProvider.cs index b8598fd0..5bc22878 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertAutoPropertyToPropertyCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertAutoPropertyToPropertyCodeRefactoringProvider.cs @@ -35,6 +35,10 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte if (property.AccessorList.Accessors.Any(b => b.Body != null)) //ignore properties with >=1 accessor body return; + + TypeDeclarationSyntax enclosingTypeDeclaration = property.Ancestors().OfType().FirstOrDefault(); + if(enclosingTypeDeclaration == null || enclosingTypeDeclaration is InterfaceDeclarationSyntax) + return; context.RegisterRefactoring( CodeActionFactory.Create( property.Identifier.Span, diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertInstanceToStaticMethodCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertInstanceToStaticMethodCodeRefactoringProvider.cs index 75b382d0..4947e797 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertInstanceToStaticMethodCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertInstanceToStaticMethodCodeRefactoringProvider.cs @@ -26,7 +26,7 @@ protected override IEnumerable GetActions(Document document, Semanti yield break; TypeDeclarationSyntax enclosingTypeDeclaration = methodDeclaration.Ancestors().OfType().FirstOrDefault(); - if (enclosingTypeDeclaration == null) + if (enclosingTypeDeclaration == null || enclosingTypeDeclaration is InterfaceDeclarationSyntax) yield break; if (methodDeclaration.Modifiers.Any(SyntaxKind.StaticKeyword)) yield break; diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider.cs index 503965a1..d33bfe73 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider.cs @@ -34,6 +34,10 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte if (property.AccessorList.Accessors.Any(b => !IsEmptyOrNotImplemented(b.Body))) //ignore properties with >=1 accessor body return; + + TypeDeclarationSyntax enclosingTypeDeclaration = property.Ancestors().OfType().FirstOrDefault(); + if(enclosingTypeDeclaration == null || enclosingTypeDeclaration is InterfaceDeclarationSyntax) + return; context.RegisterRefactoring( CodeActionFactory.Create( property.Identifier.Span, diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs index d28bd791..71541cda 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs @@ -49,8 +49,8 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte if (modifiers.Any(m => m.IsKind(SyntaxKind.OverrideKeyword))) return; - var declarationParent = declaration.Parent as TypeDeclarationSyntax; - if (declarationParent == null) + TypeDeclarationSyntax enclosingTypeDeclaration = declaration.Ancestors().OfType().FirstOrDefault(); + if (enclosingTypeDeclaration == null || enclosingTypeDeclaration is InterfaceDeclarationSyntax) return; var explicitInterface = declaration.GetExplicitInterfaceSpecifierSyntax(); @@ -73,7 +73,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte // if (!node.GetChildByRole(EntityDeclaration.PrivateImplementationTypeRole).IsNull) // yield break; // - if (declarationParent.Modifiers.Any(m => m.IsKind(SyntaxKind.AbstractKeyword))) + if (enclosingTypeDeclaration.Modifiers.Any(m => m.IsKind(SyntaxKind.AbstractKeyword))) { if (modifiers.Any(m => m.IsKind(SyntaxKind.AbstractKeyword))) { @@ -138,7 +138,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte ) ); } - else if (!declarationParent.Modifiers.Any(m => m.IsKind(SyntaxKind.StaticKeyword))) + else if (!enclosingTypeDeclaration.Modifiers.Any(m => m.IsKind(SyntaxKind.StaticKeyword))) { context.RegisterRefactoring(CodeActionFactory.Create( token.Span, From 9d076f724000ac1de92182d3f47ad661a2e1b06d Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 10 Feb 2017 14:08:35 +0100 Subject: [PATCH 075/236] Remove useless OfType-conversion tests --- .../Diagnostics/ReplaceWithOfTypeTests.cs | 87 ------------------- 1 file changed, 87 deletions(-) diff --git a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeTests.cs b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeTests.cs index 701abb25..fcfedc5e 100644 --- a/Tests/CSharp/Diagnostics/ReplaceWithOfTypeTests.cs +++ b/Tests/CSharp/Diagnostics/ReplaceWithOfTypeTests.cs @@ -5,77 +5,6 @@ namespace RefactoringEssentials.Tests.CSharp.Diagnostics { public class ReplaceWithOfTypeTests : CSharpDiagnosticTestBase { - [Fact(Skip="Does this even make sense? There's no SelectNotNull method!")] - public void TestCaseSelectNotNull() - { - Analyze(@"using System.Linq; -class Test -{ - public void Foo(object[] obj) - { - obj.SelectNotNull((object o) => o as Test); - } -}", @"using System.Linq; -class Test -{ - public void Foo(object[] obj) - { - obj.OfType (); - } -}"); - Analyze(@"using System.Linq; -class Test -{ - public void Foo(object[] obj) - { - obj.SelectNotNull(o => o as Test); - } -}", @"using System.Linq; -class Test -{ - public void Foo(object[] obj) - { - obj.OfType (); - } -}"); - } - - [Fact(Skip="Does this even make sense? There's no SelectNotNull method!")] - public void TestCaseSelectNotNullWithParentheses() - { - Analyze(@"using System.Linq; -class Test -{ - public void Foo(object[] obj) - { - obj.SelectNotNull(o => ((o as Test))); - } -}", @"using System.Linq; -class Test -{ - public void Foo(object[] obj) - { - obj.OfType (); - } -}"); - Analyze(@"using System.Linq; -class Test -{ - public void Foo(object[] obj) - { - obj.SelectNotNull(o => o as Test); - } -}", @"using System.Linq; -class Test -{ - public void Foo(object[] obj) - { - obj.OfType (); - } -}"); - } - - [Fact] public void TestCaseSelectWhereCase1() { @@ -94,22 +23,6 @@ public void Foo(object[] obj) obj.OfType(); } }"); - //There's no SelectNotNull! - // Analyze(@"using System.Linq; - //class Test - //{ - // public void Foo(object[] obj) - // { - // obj.SelectNotNull(o => o as Test); - // } - //}", @"using System.Linq; - //class Test - //{ - // public void Foo(object[] obj) - // { - // obj.OfType (); - // } - //}"); } [Fact] From 97aa06b032d2dd52bbfff461997c584cc9c2020e Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 10 Feb 2017 14:09:19 +0100 Subject: [PATCH 076/236] fix tests for NUnit features --- .../NonPublicMethodWithTestAttributeTests.cs | 18 +++++++++--------- .../RedundantAttributeParenthesesTests.cs | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Tests/CSharp/Diagnostics/NonPublicMethodWithTestAttributeTests.cs b/Tests/CSharp/Diagnostics/NonPublicMethodWithTestAttributeTests.cs index f74690c6..25cc4b7d 100644 --- a/Tests/CSharp/Diagnostics/NonPublicMethodWithTestAttributeTests.cs +++ b/Tests/CSharp/Diagnostics/NonPublicMethodWithTestAttributeTests.cs @@ -21,7 +21,7 @@ public void TestImplicitPrivate() [TestFixture] class Tests { - [Fact] + [Test] void $NonPublicMethod$() { } @@ -30,7 +30,7 @@ class Tests [TestFixture] class Tests { - [Fact] + [Test] public void NonPublicMethod() { } @@ -45,7 +45,7 @@ public void TestExplicitPrivate() [TestFixture] class Tests { - [Fact] + [Test] private void $NonPublicMethod$() { } @@ -54,7 +54,7 @@ class Tests [TestFixture] class Tests { - [Fact] + [Test] public void NonPublicMethod() { } @@ -69,7 +69,7 @@ public void TestExplicitProtected() [TestFixture] class Tests { - [Fact] + [Test] protected void $NonPublicMethod$() { } @@ -78,7 +78,7 @@ class Tests [TestFixture] class Tests { - [Fact] + [Test] public void NonPublicMethod() { } @@ -93,7 +93,7 @@ public void TestExplicitInternal() [TestFixture] class Tests { - [Fact] + [Test] internal void $NonPublicMethod$() { } @@ -102,7 +102,7 @@ class Tests [TestFixture] class Tests { - [Fact] + [Test] public void NonPublicMethod() { } @@ -116,7 +116,7 @@ public void TestDisable() class Tests { #pragma warning disable " + CSharpDiagnosticIDs.NonPublicMethodWithTestAttributeAnalyzerID + @" - [Fact] + [Test] void NonPublicMethod() { } diff --git a/Tests/CSharp/Diagnostics/RedundantAttributeParenthesesTests.cs b/Tests/CSharp/Diagnostics/RedundantAttributeParenthesesTests.cs index 86ce03a7..2ab78d46 100644 --- a/Tests/CSharp/Diagnostics/RedundantAttributeParenthesesTests.cs +++ b/Tests/CSharp/Diagnostics/RedundantAttributeParenthesesTests.cs @@ -11,7 +11,7 @@ public void DefaultCase() Analyze(@" [Test$()$] class TestClass { }", @" -[Fact] +[Test] class TestClass { }"); } @@ -19,7 +19,7 @@ class TestClass { }"); public void IgnoreNoParentheses() { Analyze(@" -[Fact] +[Test] class TestClass { }"); } From 72bd927524940dbb5a783197dd56d60bb792e36c Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 10 Feb 2017 14:10:14 +0100 Subject: [PATCH 077/236] fix converter tests --- .../CSharp/Converter/MethodBodyVisitor.cs | 82 ++- .../CSharp/Converter/NodesVisitor.cs | 163 ++++-- .../CSharp/Converter/VisualBasicConverter.cs | 40 +- RefactoringEssentials/Util/CSharpUtil.cs | 13 + .../Util/SymbolExtensions.cs | 3 + Tests/CSharp/Converter/ExpressionTests.cs | 131 +++-- Tests/CSharp/Converter/MemberTests.cs | 158 ++++-- Tests/CSharp/Converter/NamespaceLevelTests.cs | 161 ++++-- .../Converter/SpecialConversionTests.cs | 194 +------ Tests/CSharp/Converter/StatementTests.cs | 483 +++++++++++------- Tests/CSharp/Converter/TypeCastTests.cs | 195 ++++--- Tests/Common/ConverterTestBase.cs | 4 +- 12 files changed, 1011 insertions(+), 616 deletions(-) diff --git a/RefactoringEssentials/CSharp/Converter/MethodBodyVisitor.cs b/RefactoringEssentials/CSharp/Converter/MethodBodyVisitor.cs index 5602845b..41842b76 100644 --- a/RefactoringEssentials/CSharp/Converter/MethodBodyVisitor.cs +++ b/RefactoringEssentials/CSharp/Converter/MethodBodyVisitor.cs @@ -17,6 +17,8 @@ class MethodBodyVisitor : VBasic.VisualBasicSyntaxVisitor VisitThrowStatement(VBSyntax.ThrowSt public override SyntaxList VisitReturnStatement(VBSyntax.ReturnStatementSyntax node) { - return SingleStatement(SyntaxFactory.ReturnStatement((ExpressionSyntax)node.Expression?.Accept(nodesVisitor))); - } + if (IsIterator) + return SingleStatement(SyntaxFactory.YieldStatement(SyntaxKind.YieldBreakStatement)); + return SingleStatement(SyntaxFactory.ReturnStatement((ExpressionSyntax)node.Expression?.Accept(nodesVisitor))); + } + + public override SyntaxList VisitContinueStatement(VBSyntax.ContinueStatementSyntax node) + { + return SingleStatement(SyntaxFactory.ContinueStatement()); + } - public override SyntaxList VisitYieldStatement(VBSyntax.YieldStatementSyntax node) + public override SyntaxList VisitYieldStatement(VBSyntax.YieldStatementSyntax node) { return SingleStatement(SyntaxFactory.YieldStatement(SyntaxKind.YieldReturnStatement, (ExpressionSyntax)node.Expression?.Accept(nodesVisitor))); } @@ -92,11 +101,24 @@ public override SyntaxList VisitExitStatement(VBSyntax.ExitStat throw new NotSupportedException(); return SingleStatement(SyntaxFactory.ReturnStatement(expr)); default: - throw new NotImplementedException(); + return SingleStatement(SyntaxFactory.BreakStatement()); } } - public override SyntaxList VisitSingleLineIfStatement(VBSyntax.SingleLineIfStatementSyntax node) + public override SyntaxList VisitRaiseEventStatement(VBSyntax.RaiseEventStatementSyntax node) + { + return SingleStatement( + SyntaxFactory.ConditionalAccessExpression( + (ExpressionSyntax)node.Name.Accept(nodesVisitor), + SyntaxFactory.InvocationExpression( + SyntaxFactory.MemberBindingExpression(SyntaxFactory.IdentifierName("Invoke")), + (ArgumentListSyntax)node.ArgumentList.Accept(nodesVisitor) + ) + ) + ); + } + + public override SyntaxList VisitSingleLineIfStatement(VBSyntax.SingleLineIfStatementSyntax node) { var condition = (ExpressionSyntax)node.Condition.Accept(nodesVisitor); var block = SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))); @@ -105,9 +127,9 @@ public override SyntaxList VisitSingleLineIfStatement(VBSyntax. if (node.ElseClause != null) { var elseBlock = SyntaxFactory.Block(node.ElseClause.Statements.SelectMany(s => s.Accept(this))); - elseClause = SyntaxFactory.ElseClause(elseBlock.Statements.Count == 1 ? elseBlock.Statements[0] : elseBlock); + elseClause = SyntaxFactory.ElseClause(elseBlock.UnpackBlock()); } - return SingleStatement(SyntaxFactory.IfStatement(condition, block.Statements.Count == 1 ? block.Statements[0] : block, elseClause)); + return SingleStatement(SyntaxFactory.IfStatement(condition, block.UnpackBlock(), elseClause)); } public override SyntaxList VisitMultiLineIfBlock(VBSyntax.MultiLineIfBlockSyntax node) @@ -119,17 +141,17 @@ public override SyntaxList VisitMultiLineIfBlock(VBSyntax.Multi if (node.ElseBlock != null) { var elseBlock = SyntaxFactory.Block(node.ElseBlock.Statements.SelectMany(s => s.Accept(this))); - elseClause = SyntaxFactory.ElseClause(elseBlock); + elseClause = SyntaxFactory.ElseClause(elseBlock.UnpackBlock()); } foreach (var elseIf in node.ElseIfBlocks.Reverse()) { var elseBlock = SyntaxFactory.Block(elseIf.Statements.SelectMany(s => s.Accept(this))); - var ifStmt = SyntaxFactory.IfStatement((ExpressionSyntax)elseIf.ElseIfStatement.Condition.Accept(nodesVisitor), elseBlock, elseClause); + var ifStmt = SyntaxFactory.IfStatement((ExpressionSyntax)elseIf.ElseIfStatement.Condition.Accept(nodesVisitor), elseBlock.UnpackBlock(), elseClause); elseClause = SyntaxFactory.ElseClause(ifStmt); } - return SingleStatement(SyntaxFactory.IfStatement(condition, block, elseClause)); + return SingleStatement(SyntaxFactory.IfStatement(condition, block.UnpackBlock(), elseClause)); } public override SyntaxList VisitForBlock(VBSyntax.ForBlockSyntax node) @@ -167,7 +189,7 @@ public override SyntaxList VisitForBlock(VBSyntax.ForBlockSynta declaration != null ? SyntaxFactory.SeparatedList() : SyntaxFactory.SingletonSeparatedList(startValue), condition, SyntaxFactory.SingletonSeparatedList(step), - block)); + block.UnpackBlock())); } public override SyntaxList VisitForEachBlock(VBSyntax.ForEachBlockSyntax node) @@ -195,7 +217,7 @@ public override SyntaxList VisitForEachBlock(VBSyntax.ForEachBl type, id, (ExpressionSyntax)stmt.Expression.Accept(nodesVisitor), - block + block.UnpackBlock() )); } @@ -215,7 +237,7 @@ private bool ConvertToSwitch(ExpressionSyntax expr, SyntaxList(); foreach (var block in caseBlocks) { - var labels = SyntaxFactory.List(); + var labels = new List(); foreach (var c in block.CaseStatement.Cases) { if (c is VBSyntax.SimpleCaseClauseSyntax) { @@ -225,8 +247,8 @@ private bool ConvertToSwitch(ExpressionSyntax expr, SyntaxList s.Accept(this))); - sections.Add(SyntaxFactory.SwitchSection(labels, list)); + var list = SyntaxFactory.List(block.Statements.SelectMany(s => s.Accept(this)).Concat(SyntaxFactory.BreakStatement())); + sections.Add(SyntaxFactory.SwitchSection(SyntaxFactory.List(labels), list)); } switchStatement = SyntaxFactory.SwitchStatement(expr, SyntaxFactory.List(sections)); return true; @@ -248,7 +270,7 @@ public override SyntaxList VisitSyncLockBlock(VBSyntax.SyncLock { return SingleStatement(SyntaxFactory.LockStatement( (ExpressionSyntax)node.SyncLockStatement.Expression.Accept(nodesVisitor), - SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))) + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))).UnpackBlock() )); } @@ -262,7 +284,7 @@ public override SyntaxList VisitUsingBlock(VBSyntax.UsingBlockS return SingleStatement(stmt); } else { var expr = (ExpressionSyntax)node.UsingStatement.Expression.Accept(nodesVisitor); - return SingleStatement(SyntaxFactory.UsingStatement(null, expr, SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))))); + return SingleStatement(SyntaxFactory.UsingStatement(null, expr, SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))).UnpackBlock())); } } @@ -270,8 +292,8 @@ public override SyntaxList VisitWhileBlock(VBSyntax.WhileBlockS { return SingleStatement(SyntaxFactory.WhileStatement( (ExpressionSyntax)node.WhileStatement.Condition.Accept(nodesVisitor), - SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))) - )); + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))).UnpackBlock() + )); } public override SyntaxList VisitDoLoopBlock(VBSyntax.DoLoopBlockSyntax node) @@ -282,25 +304,25 @@ public override SyntaxList VisitDoLoopBlock(VBSyntax.DoLoopBloc if (stmt.WhileOrUntilKeyword.IsKind(VBasic.SyntaxKind.WhileKeyword)) return SingleStatement(SyntaxFactory.WhileStatement( (ExpressionSyntax)stmt.Condition.Accept(nodesVisitor), - SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))) - )); + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))).UnpackBlock() + )); else return SingleStatement(SyntaxFactory.WhileStatement( SyntaxFactory.PrefixUnaryExpression(SyntaxKind.LogicalNotExpression, (ExpressionSyntax)stmt.Condition.Accept(nodesVisitor)), - SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))) - )); + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))).UnpackBlock() + )); } if (node.LoopStatement.WhileOrUntilClause != null) { var stmt = node.LoopStatement.WhileOrUntilClause; if (stmt.WhileOrUntilKeyword.IsKind(VBasic.SyntaxKind.WhileKeyword)) return SingleStatement(SyntaxFactory.DoStatement( - SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))), + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))).UnpackBlock(), (ExpressionSyntax)stmt.Condition.Accept(nodesVisitor) )); else return SingleStatement(SyntaxFactory.DoStatement( - SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))), + SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(this))).UnpackBlock(), SyntaxFactory.PrefixUnaryExpression(SyntaxKind.LogicalNotExpression, (ExpressionSyntax)stmt.Condition.Accept(nodesVisitor)) )); } @@ -317,5 +339,13 @@ SyntaxList SingleStatement(ExpressionSyntax expression) return SyntaxFactory.SingletonList(SyntaxFactory.ExpressionStatement(expression)); } } - } + } + + static class Extensions + { + public static StatementSyntax UnpackBlock(this BlockSyntax block) + { + return block.Statements.Count == 1 ? block.Statements[0] : block; + } + } } diff --git a/RefactoringEssentials/CSharp/Converter/NodesVisitor.cs b/RefactoringEssentials/CSharp/Converter/NodesVisitor.cs index 30fda183..399c66a3 100644 --- a/RefactoringEssentials/CSharp/Converter/NodesVisitor.cs +++ b/RefactoringEssentials/CSharp/Converter/NodesVisitor.cs @@ -201,7 +201,7 @@ public override CSharpSyntaxNode VisitInterfaceBlock(VBSyntax.InterfaceBlockSynt public override CSharpSyntaxNode VisitEnumBlock(VBSyntax.EnumBlockSyntax node) { var stmt = node.EnumStatement; - // we can cast to SimpleAsClause because other type make no sense as enum-type. + // we can cast to SimpleAsClause because other types make no sense as enum-type. var asClause = (VBSyntax.SimpleAsClauseSyntax)stmt.UnderlyingType; var attributes = stmt.AttributeLists.SelectMany(ConvertAttribute); BaseListSyntax baseList = null; @@ -304,28 +304,48 @@ public override CSharpSyntaxNode VisitFieldDeclaration(VBSyntax.FieldDeclaration return key; } - public override CSharpSyntaxNode VisitPropertyBlock(VBSyntax.PropertyBlockSyntax node) + public override CSharpSyntaxNode VisitPropertyStatement(VBSyntax.PropertyStatementSyntax node) { - var block = node.PropertyStatement; - var attributes = block.AttributeLists.SelectMany(ConvertAttribute); - var modifiers = ConvertModifiers(block.Modifiers, TokenContext.Member); + bool hasBody = node.Parent is VBSyntax.PropertyBlockSyntax; + var attributes = node.AttributeLists.SelectMany(ConvertAttribute); + var modifiers = ConvertModifiers(node.Modifiers, TokenContext.Member); - var isIndexer = block.Modifiers.Any(m => m.IsKind(VBasic.SyntaxKind.DefaultKeyword)) && block.Identifier.ValueText.Equals("Items", StringComparison.OrdinalIgnoreCase); + var isIndexer = node.Modifiers.Any(m => m.IsKind(VBasic.SyntaxKind.DefaultKeyword)) && node.Identifier.ValueText.Equals("Items", StringComparison.OrdinalIgnoreCase); - var rawType = (TypeSyntax)block.AsClause?.TypeSwitch( + var rawType = (TypeSyntax)node.AsClause?.TypeSwitch( (VBSyntax.SimpleAsClauseSyntax c) => c.Type, (VBSyntax.AsNewClauseSyntax c) => VBasic.SyntaxExtensions.Type(c.NewExpression), _ => { throw new NotImplementedException($"{_.GetType().FullName} not implemented!"); } )?.Accept(this) ?? SyntaxFactory.ParseTypeName("var"); + AccessorListSyntax accessors = null; + + if (!hasBody) + { + accessors = SyntaxFactory.AccessorList( + SyntaxFactory.List(new[] { + SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)), + SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)) + }) + ); + } + else + { + accessors = SyntaxFactory.AccessorList( + SyntaxFactory.List( + ((VBSyntax.PropertyBlockSyntax)node.Parent).Accessors.Select(a => (AccessorDeclarationSyntax)a.Accept(this)) + ) + ); + } + if (isIndexer) return SyntaxFactory.IndexerDeclaration( SyntaxFactory.List(attributes), modifiers, rawType, null, - SyntaxFactory.BracketedParameterList(SyntaxFactory.SeparatedList(block.ParameterList.Parameters.Select(p => (ParameterSyntax)p.Accept(this)))), - SyntaxFactory.AccessorList(SyntaxFactory.List(node.Accessors.Select(a => (AccessorDeclarationSyntax)a.Accept(this)))) + SyntaxFactory.BracketedParameterList(SyntaxFactory.SeparatedList(node.ParameterList.Parameters.Select(p => (ParameterSyntax)p.Accept(this)))), + accessors ); else return SyntaxFactory.PropertyDeclaration( @@ -333,18 +353,23 @@ public override CSharpSyntaxNode VisitPropertyBlock(VBSyntax.PropertyBlockSyntax modifiers, rawType, null, - ConvertIdentifier(block.Identifier, semanticModel), - SyntaxFactory.AccessorList(SyntaxFactory.List(node.Accessors.Select(a => (AccessorDeclarationSyntax)a.Accept(this)))), + ConvertIdentifier(node.Identifier, semanticModel), accessors, null, null); } + public override CSharpSyntaxNode VisitPropertyBlock(VBSyntax.PropertyBlockSyntax node) + { + return node.PropertyStatement.Accept(this); + } + public override CSharpSyntaxNode VisitAccessorBlock(VBSyntax.AccessorBlockSyntax node) { SyntaxKind blockKind; - var body = SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(new MethodBodyVisitor(semanticModel, this)))); + bool isIterator = node.GetModifiers().Any(m => m.IsKind(VBasic.SyntaxKind.IteratorKeyword)); + var body = SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(new MethodBodyVisitor(semanticModel, this) { IsIterator = isIterator }))); var attributes = SyntaxFactory.List(node.AccessorStatement.AttributeLists.Select(a => (AttributeListSyntax)a.Accept(this))); - var modifiers = ConvertModifiers(node.AccessorStatement.Modifiers, TokenContext.Member); + var modifiers = ConvertModifiers(node.AccessorStatement.Modifiers, TokenContext.Local); switch (node.Kind()) { @@ -368,33 +393,49 @@ public override CSharpSyntaxNode VisitAccessorBlock(VBSyntax.AccessorBlockSyntax public override CSharpSyntaxNode VisitMethodBlock(VBSyntax.MethodBlockSyntax node) { - var block = node.SubOrFunctionStatement; - var attributes = block.AttributeLists.SelectMany(ConvertAttribute); + BaseMethodDeclarationSyntax block = (BaseMethodDeclarationSyntax)node.SubOrFunctionStatement.Accept(this); + bool isIterator = node.SubOrFunctionStatement.Modifiers.Any(m => m.IsKind(VBasic.SyntaxKind.IteratorKeyword)); - if ("Finalize".Equals(block.Identifier.ValueText, StringComparison.OrdinalIgnoreCase) - && block.Modifiers.Any(m => VBasic.VisualBasicExtensions.Kind(m) == VBasic.SyntaxKind.OverridesKeyword)) { - return SyntaxFactory.DestructorDeclaration( - SyntaxFactory.List(attributes), - SyntaxFactory.TokenList(), - ConvertIdentifier(node.GetAncestor().BlockStatement.Identifier, semanticModel), - SyntaxFactory.ParameterList(), - SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(new MethodBodyVisitor(semanticModel, this)))) - ); - } else { - var modifiers = ConvertModifiers(block.Modifiers, TokenContext.Member); + return block.WithBody(SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(new MethodBodyVisitor(semanticModel, this) { IsIterator = isIterator })))); + } + + public override CSharpSyntaxNode VisitMethodStatement(VBSyntax.MethodStatementSyntax node) + { + var attributes = node.AttributeLists.SelectMany(ConvertAttribute); + bool hasBody = node.Parent is VBSyntax.MethodBlockBaseSyntax; - return SyntaxFactory.MethodDeclaration( + if ("Finalize".Equals(node.Identifier.ValueText, StringComparison.OrdinalIgnoreCase) + && node.Modifiers.Any(m => VBasic.VisualBasicExtensions.Kind(m) == VBasic.SyntaxKind.OverridesKeyword)) + { + var decl = SyntaxFactory.DestructorDeclaration( + ConvertIdentifier(node.GetAncestor().BlockStatement.Identifier, semanticModel) + ).WithAttributeLists(SyntaxFactory.List(attributes)); + if (hasBody) return decl; + return decl.WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)); + } + else + { + var parentType = semanticModel.GetDeclaredSymbol(node).ContainingType; + var modifiers = ConvertModifiers(node.Modifiers, parentType.TypeKind == TypeKind.Module ? TokenContext.MemberInModule : TokenContext.Member); + + TypeParameterListSyntax typeParameters; + SyntaxList constraints; + SplitTypeParameters(node.TypeParameterList, out typeParameters, out constraints); + + var decl = SyntaxFactory.MethodDeclaration( SyntaxFactory.List(attributes), modifiers, - (TypeSyntax)block.AsClause?.Type.Accept(this) ?? SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword)), + (TypeSyntax)node.AsClause?.Type.Accept(this) ?? SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword)), null, - ConvertIdentifier(block.Identifier, semanticModel), + ConvertIdentifier(node.Identifier, semanticModel), + typeParameters, + (ParameterListSyntax)node.ParameterList.Accept(this), + constraints, null, - (ParameterListSyntax)block.ParameterList.Accept(this), - SyntaxFactory.List(), - SyntaxFactory.Block(node.Statements.SelectMany(s => s.Accept(new MethodBodyVisitor(semanticModel, this)))), null ); + if (hasBody) return decl; + return decl.WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)); } } @@ -488,16 +529,23 @@ public override CSharpSyntaxNode VisitConstructorBlock(VBSyntax.ConstructorBlock IEnumerable statements; ConstructorInitializerSyntax ctorCall; - if (ctorExpression == null || !ctorExpression.Name.Identifier.IsKindOrHasMatchingText(VBasic.SyntaxKind.NewKeyword)) { + if (ctorExpression == null || !ctorExpression.Name.Identifier.IsKindOrHasMatchingText(VBasic.SyntaxKind.NewKeyword)) + { statements = node.Statements; ctorCall = null; - } else if (ctorExpression.Expression is VBSyntax.MyBaseExpressionSyntax) { + } + else if (ctorExpression.Expression is VBSyntax.MyBaseExpressionSyntax) + { statements = node.Statements.Skip(1); ctorCall = SyntaxFactory.ConstructorInitializer(SyntaxKind.BaseConstructorInitializer, ctorArgs ?? SyntaxFactory.ArgumentList()); - } else if (ctorExpression.Expression is VBSyntax.MeExpressionSyntax || ctorExpression.Expression is VBSyntax.MyClassExpressionSyntax) { + } + else if (ctorExpression.Expression is VBSyntax.MeExpressionSyntax || ctorExpression.Expression is VBSyntax.MyClassExpressionSyntax) + { statements = node.Statements.Skip(1); ctorCall = SyntaxFactory.ConstructorInitializer(SyntaxKind.ThisConstructorInitializer, ctorArgs ?? SyntaxFactory.ArgumentList()); - } else { + } + else + { statements = node.Statements; ctorCall = null; } @@ -512,6 +560,13 @@ public override CSharpSyntaxNode VisitConstructorBlock(VBSyntax.ConstructorBlock ); } + public override CSharpSyntaxNode VisitTypeParameterList(VBSyntax.TypeParameterListSyntax node) + { + return SyntaxFactory.TypeParameterList( + SyntaxFactory.SeparatedList(node.Parameters.Select(p => (TypeParameterSyntax)p.Accept(this))) + ); + } + public override CSharpSyntaxNode VisitParameterList(VBSyntax.ParameterListSyntax node) { if (node.Parent is VBSyntax.PropertyStatementSyntax) @@ -545,7 +600,8 @@ public override CSharpSyntaxNode VisitParameter(VBSyntax.ParameterSyntax node) var attributes = node.AttributeLists.SelectMany(ConvertAttribute).ToList(); int outAttributeIndex = attributes.FindIndex(a => a.Attributes.Single().Name.ToString() == "Out"); var modifiers = ConvertModifiers(node.Modifiers, TokenContext.Local); - if (outAttributeIndex > -1) { + if (outAttributeIndex > -1) + { attributes.RemoveAt(outAttributeIndex); modifiers = modifiers.Replace(SyntaxFactory.Token(SyntaxKind.RefKeyword), SyntaxFactory.Token(SyntaxKind.OutKeyword)); } @@ -562,6 +618,11 @@ public override CSharpSyntaxNode VisitParameter(VBSyntax.ParameterSyntax node) #region Expressions + public override CSharpSyntaxNode VisitAwaitExpression(VBSyntax.AwaitExpressionSyntax node) + { + return SyntaxFactory.AwaitExpression((ExpressionSyntax)node.Expression.Accept(this)); + } + public override CSharpSyntaxNode VisitCatchBlock(VBSyntax.CatchBlockSyntax node) { var stmt = node.CatchStatement; @@ -630,6 +691,11 @@ public override CSharpSyntaxNode VisitTryCastExpression(VBSyntax.TryCastExpressi public override CSharpSyntaxNode VisitLiteralExpression(VBSyntax.LiteralExpressionSyntax node) { + if (node.Token.Value == null) + { + var type = semanticModel.GetTypeInfo(node).ConvertedType; + return !type.IsReferenceType ? SyntaxFactory.DefaultExpression(SyntaxFactory.ParseTypeName(type.ToMinimalDisplayString(semanticModel, node.SpanStart))) : Literal(null); + } return Literal(node.Token.Value); } @@ -698,14 +764,15 @@ public override CSharpSyntaxNode VisitSimpleArgument(VBSyntax.SimpleArgumentSynt if (invocation is VBSyntax.ArrayCreationExpressionSyntax) return node.Expression.Accept(this); var symbol = invocation.TypeSwitch( - (VBSyntax.InvocationExpressionSyntax e) => ExtractMatch(semanticModel.GetSymbolInfo(e)) as IMethodSymbol, - (VBSyntax.ObjectCreationExpressionSyntax e) => ExtractMatch(semanticModel.GetSymbolInfo(e)) as IMethodSymbol, + (VBSyntax.InvocationExpressionSyntax e) => ExtractMatch(semanticModel.GetSymbolInfo(e)), + (VBSyntax.ObjectCreationExpressionSyntax e) => ExtractMatch(semanticModel.GetSymbolInfo(e)), + (VBSyntax.RaiseEventStatementSyntax e) => ExtractMatch(semanticModel.GetSymbolInfo(e.Name)), _ => { throw new NotSupportedException(); } ); SyntaxToken token = default(SyntaxToken); if (symbol != null) { - var p = symbol.Parameters[argID]; + var p = symbol.GetParameters()[argID]; switch (p.RefKind) { case RefKind.None: @@ -783,7 +850,7 @@ public override CSharpSyntaxNode VisitArrayCreationExpression(VBSyntax.ArrayCrea arguments = node.ArrayBounds.Arguments.Select(a => IncreaseArrayUpperBoundExpression(((VBSyntax.SimpleArgumentSyntax)a).Expression)); else arguments = Enumerable.Empty(); - var bounds = SyntaxFactory.SingletonList(SyntaxFactory.ArrayRankSpecifier(SyntaxFactory.SeparatedList(arguments))); + var bounds = SyntaxFactory.List(node.RankSpecifiers.Select(r => (ArrayRankSpecifierSyntax)r.Accept(this))); return SyntaxFactory.ArrayCreationExpression( SyntaxFactory.ArrayType((TypeSyntax)node.Type.Accept(this), bounds), (InitializerExpressionSyntax)node.Initializer?.Accept(this) @@ -897,6 +964,14 @@ public override CSharpSyntaxNode VisitBinaryExpression(VBSyntax.BinaryExpression public override CSharpSyntaxNode VisitInvocationExpression(VBSyntax.InvocationExpressionSyntax node) { + var invocationSymbol = semanticModel.GetSymbolInfo(node).Symbol; + var symbol = semanticModel.GetSymbolInfo(node.Expression).Symbol; + if (invocationSymbol?.IsIndexer() == true || symbol?.GetReturnType()?.IsArrayType() == true) + { + return SyntaxFactory.ElementAccessExpression( + (ExpressionSyntax)node.Expression.Accept(this), + SyntaxFactory.BracketedArgumentList(SyntaxFactory.SeparatedList(node.ArgumentList.Arguments.Select(a => (ArgumentSyntax)a.Accept(this))))); + } return SyntaxFactory.InvocationExpression( (ExpressionSyntax)node.Expression.Accept(this), (ArgumentListSyntax)node.ArgumentList.Accept(this) @@ -969,7 +1044,9 @@ private void SplitTypeParameters(VBSyntax.TypeParameterListSyntax typeParameterL { var tp = (TypeParameterSyntax)p.Accept(this); paramList.Add(tp); - constraintList.Add((TypeParameterConstraintClauseSyntax)p.TypeParameterConstraintClause.Accept(this)); + var constraint = (TypeParameterConstraintClauseSyntax)p.TypeParameterConstraintClause?.Accept(this); + if (constraint != null) + constraintList.Add(constraint); } parameters = SyntaxFactory.TypeParameterList(SyntaxFactory.SeparatedList(paramList)); constraints = SyntaxFactory.List(constraintList); @@ -1015,7 +1092,7 @@ public override CSharpSyntaxNode VisitTypeConstraint(VBSyntax.TypeConstraintSynt public override CSharpSyntaxNode VisitIdentifierName(VBSyntax.IdentifierNameSyntax node) { - return SyntaxFactory.IdentifierName(ConvertIdentifier(node.Identifier, semanticModel, node.Parent is VBSyntax.AsClauseSyntax)); + return SyntaxFactory.IdentifierName(ConvertIdentifier(node.Identifier, semanticModel, node.Parent is VBSyntax.AttributeSyntax)); } public override CSharpSyntaxNode VisitQualifiedName(VBSyntax.QualifiedNameSyntax node) diff --git a/RefactoringEssentials/CSharp/Converter/VisualBasicConverter.cs b/RefactoringEssentials/CSharp/Converter/VisualBasicConverter.cs index 17a7705b..345484da 100644 --- a/RefactoringEssentials/CSharp/Converter/VisualBasicConverter.cs +++ b/RefactoringEssentials/CSharp/Converter/VisualBasicConverter.cs @@ -20,7 +20,8 @@ enum TokenContext InterfaceOrModule, Member, VariableOrConst, - Local + Local, + MemberInModule } public static CSharpSyntaxNode Convert(VBasic.VisualBasicSyntaxNode input, SemanticModel semanticModel, Document targetDocument) @@ -87,15 +88,27 @@ static Dictionary SplitVariableDeclarations(V static ExpressionSyntax Literal(object o) => CodeRefactorings.ComputeConstantValueCodeRefactoringProvider.GetLiteralExpression(o); - static SyntaxToken ConvertIdentifier(SyntaxToken id, SemanticModel semanticModel, bool isInTypeContext = false) + static SyntaxToken ConvertIdentifier(SyntaxToken id, SemanticModel semanticModel, bool isAttribute = false) { var keywordKind = SyntaxFacts.GetKeywordKind(id.ValueText); if (keywordKind != SyntaxKind.None && !SyntaxFacts.IsPredefinedType(keywordKind)) return SyntaxFactory.Identifier("@" + id.ValueText); - var symbol = semanticModel.GetSymbolInfo(id.Parent).Symbol; string text = id.ValueText; - if (symbol != null && !string.IsNullOrWhiteSpace(symbol.Name)) - text = symbol.Name; + if (id.SyntaxTree == semanticModel.SyntaxTree) + { + var symbol = semanticModel.GetSymbolInfo(id.Parent).Symbol; + if (symbol != null && !string.IsNullOrWhiteSpace(symbol.Name)) + { + if (symbol.IsConstructor() && isAttribute) + { + text = symbol.ContainingType.Name; + if (text.EndsWith("Attribute", StringComparison.Ordinal)) + text = text.Remove(text.Length - "Attribute".Length); + } + else + text = symbol.Name; + } + } return SyntaxFactory.Identifier(text); } @@ -128,7 +141,7 @@ static IEnumerable ConvertModifiersCore(IEnumerable mo break; } } - if (!visibility && context == TokenContext.Member) + if (!visibility && (context == TokenContext.MemberInModule || context == TokenContext.Member)) yield return VisualBasicDefaultVisibility(context); } foreach (var token in modifiers.Where(m => !IgnoreInContext(m, context))) @@ -136,6 +149,8 @@ static IEnumerable ConvertModifiersCore(IEnumerable mo var m = ConvertModifier(token, context); if (m.HasValue) yield return m.Value; } + if (context == TokenContext.MemberInModule) + yield return SyntaxFactory.Token(SyntaxKind.StaticKeyword); } static bool IgnoreInContext(SyntaxToken m, TokenContext context) @@ -171,6 +186,8 @@ static SyntaxToken VisualBasicDefaultVisibility(TokenContext context) case TokenContext.VariableOrConst: case TokenContext.Member: return SyntaxFactory.Token(SyntaxKind.PrivateKeyword); + case TokenContext.MemberInModule: + return SyntaxFactory.Token(SyntaxKind.PublicKeyword); } throw new ArgumentOutOfRangeException(nameof(context)); } @@ -251,6 +268,13 @@ static SyntaxKind ConvertToken(VBasic.SyntaxKind t, TokenContext context = Token return SyntaxKind.ConstKeyword; case VBasic.SyntaxKind.PartialKeyword: return SyntaxKind.PartialKeyword; + case VBasic.SyntaxKind.MustInheritKeyword: + return SyntaxKind.AbstractKeyword; + case VBasic.SyntaxKind.MustOverrideKeyword: + return SyntaxKind.AbstractKeyword; + case VBasic.SyntaxKind.NotOverridableKeyword: + case VBasic.SyntaxKind.NotInheritableKeyword: + return SyntaxKind.SealedKeyword; // unary operators case VBasic.SyntaxKind.UnaryMinusExpression: return SyntaxKind.UnaryMinusExpression; @@ -268,6 +292,8 @@ static SyntaxKind ConvertToken(VBasic.SyntaxKind t, TokenContext context = Token return SyntaxKind.MultiplyExpression; case VBasic.SyntaxKind.DivideExpression: return SyntaxKind.DivideExpression; + case VBasic.SyntaxKind.ModuloExpression: + return SyntaxKind.ModuloExpression; case VBasic.SyntaxKind.AndAlsoExpression: return SyntaxKind.LogicalAndExpression; case VBasic.SyntaxKind.OrElseExpression: @@ -335,6 +361,8 @@ static SyntaxKind ConvertToken(VBasic.SyntaxKind t, TokenContext context = Token // case VBasic.SyntaxKind.AssemblyKeyword: return SyntaxKind.AssemblyKeyword; + case VBasic.SyntaxKind.AsyncKeyword: + return SyntaxKind.AsyncKeyword; } throw new NotSupportedException(t + " not supported!"); } diff --git a/RefactoringEssentials/Util/CSharpUtil.cs b/RefactoringEssentials/Util/CSharpUtil.cs index 83a3fbcc..3ae88549 100644 --- a/RefactoringEssentials/Util/CSharpUtil.cs +++ b/RefactoringEssentials/Util/CSharpUtil.cs @@ -226,5 +226,18 @@ public static bool AreConditionsEqual(ExpressionSyntax cond1, ExpressionSyntax c return false; return cond1.SkipParens().IsEquivalentTo(cond2.SkipParens(), true); } + + public static T WithBody(this T method, BlockSyntax body) where T : BaseMethodDeclarationSyntax + { + if (method == null) + throw new ArgumentNullException(nameof(method)); + var m = method as MethodDeclarationSyntax; + if (m != null) + return (T)((BaseMethodDeclarationSyntax)m.WithBody(body)); + var d = method as DestructorDeclarationSyntax; + if (d != null) + return (T)((BaseMethodDeclarationSyntax)d.WithBody(body)); + throw new NotSupportedException(); + } } } \ No newline at end of file diff --git a/RefactoringEssentials/Util/SymbolExtensions.cs b/RefactoringEssentials/Util/SymbolExtensions.cs index 26585503..c84a65bd 100644 --- a/RefactoringEssentials/Util/SymbolExtensions.cs +++ b/RefactoringEssentials/Util/SymbolExtensions.cs @@ -124,6 +124,9 @@ public static ImmutableArray GetParameters(this ISymbol symbol var property = symbol as IPropertySymbol; if (property != null) return property.Parameters; + var ev = symbol as IEventSymbol; + if (ev != null) + return ev.Type.GetDelegateInvokeMethod().Parameters; return ImmutableArray.Empty; } diff --git a/Tests/CSharp/Converter/ExpressionTests.cs b/Tests/CSharp/Converter/ExpressionTests.cs index 028f5fa6..ae0b128c 100644 --- a/Tests/CSharp/Converter/ExpressionTests.cs +++ b/Tests/CSharp/Converter/ExpressionTests.cs @@ -4,18 +4,22 @@ namespace RefactoringEssentials.Tests.CSharp.Converter { public class ExpressionTests : ConverterTestBase { - [Fact] - public void MultilineString() + [Fact(Skip = "Not implemented!")] + public void MultilineString() { TestConversionVisualBasicToCSharp(@"Class TestClass Private Sub TestMethod() Dim x = ""Hello, World!"" End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { var x = @""Hello, World!""; @@ -30,10 +34,14 @@ public void ConditionalExpression() Private Sub TestMethod(ByVal str As String) Dim result As Boolean = If((str = """"), True, False) End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod(string str) + private void TestMethod(string str) { bool result = (str == """") ? true : false; } @@ -47,10 +55,14 @@ public void NullCoalescingExpression() Private Sub TestMethod(ByVal str As String) Console.WriteLine(If(str, """")) End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod(string str) + private void TestMethod(string str) { Console.WriteLine(str ?? """"); } @@ -67,10 +79,14 @@ Dim length As Integer Console.WriteLine(""Test"" & length) Console.ReadKey() End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod(string str) + private void TestMethod(string str) { int length; length = str.Length; @@ -90,10 +106,14 @@ Private Sub TestMethod(ByVal str As String) Console.ReadKey() Dim redirectUri As String = context.OwinContext.Authentication?.AuthenticationResponseChallenge?.Properties?.RedirectUri End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod(string str) + private void TestMethod(string str) { int length = str?.Length ?? -1; Console.WriteLine(length); @@ -103,8 +123,8 @@ void TestMethod(string str) }"); } - [Fact] - public void ObjectInitializerExpression() + [Fact(Skip = "Not implemented!")] + public void ObjectInitializerExpression() { TestConversionVisualBasicToCSharp(@"Class StudentName Public LastName, FirstName As String @@ -122,7 +142,7 @@ class StudentName class TestClass { - void TestMethod(string str) + private void TestMethod(string str) { StudentName student2 = new StudentName { @@ -133,8 +153,8 @@ void TestMethod(string str) }"); } - [Fact] - public void ObjectInitializerExpression2() + [Fact(Skip = "Not implemented!")] + public void ObjectInitializerExpression2() { TestConversionVisualBasicToCSharp(@"Class TestClass Private Sub TestMethod(ByVal str As String) @@ -143,7 +163,7 @@ End Sub End Class", @" class TestClass { - void TestMethod(string str) + private void TestMethod(string str) { var student2 = new { FirstName = ""Craig"", @@ -162,12 +182,16 @@ Private member As Integer Private Sub TestMethod() Me.member = 0 End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { private int member; - void TestMethod() + private void TestMethod() { this.member = 0; } @@ -187,7 +211,11 @@ Inherits BaseTestClass Private Sub TestMethod() MyBase.member = 0 End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class BaseTestClass { public int member; @@ -195,7 +223,7 @@ class BaseTestClass class TestClass : BaseTestClass { - void TestMethod() + private void TestMethod() { base.member = 0; } @@ -210,13 +238,16 @@ Private Sub TestMethod() Dim test = Function(ByVal a As Integer) a * 2 test(3) End Sub -End Class", @" -class TestClass +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class TestClass { - void TestMethod() + private void TestMethod() { - var test = delegate(int a) { return a * 2 }; - + var test = int a => a * 2; test(3); } }"); @@ -236,15 +267,23 @@ End Function Dim test3 = Function(a, b) a Mod b test(3) End Sub -End Class", @" -class TestClass +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class TestClass { - void TestMethod() + private void TestMethod() { - var test = a => { return a * 2 }; - var test2 = (a, b) => { if (b > 0) return a / b; return 0; } + var test = a => a * 2; + var test2 = (a, b) => + { + if (b > 0) + return a / b; + return 0; + }; var test3 = (a, b) => a % b; - test(3); } }"); @@ -262,15 +301,19 @@ Private Async Sub TestMethod() Dim result As Integer = Await SomeAsyncMethod() Console.WriteLine(result) End Sub -End Class", @" -class TestClass +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class TestClass { - Task SomeAsyncMethod() + private Task SomeAsyncMethod() { return Task.FromResult(0); } - async void TestMethod() + private async void TestMethod() { int result = await SomeAsyncMethod(); Console.WriteLine(result); @@ -278,7 +321,7 @@ async void TestMethod() }"); } - [Fact] + [Fact(Skip = "Not implemented!")] public void Linq1() { TestConversionVisualBasicToCSharp(@"Private Shared Sub SimpleQuery() @@ -302,8 +345,8 @@ where n > 5 }"); } - [Fact] - public void Linq2() + [Fact(Skip = "Not implemented!")] + public void Linq2() { TestConversionVisualBasicToCSharp(@"Public Shared Sub Linq40() Dim numbers As Integer() = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0} @@ -337,8 +380,8 @@ group n by n % 5 into g }"); } - [Fact] - public void Linq3() + [Fact(Skip = "Not implemented!")] + public void Linq3() { TestConversionVisualBasicToCSharp(@"Class Product Public Category As String @@ -386,8 +429,8 @@ join p in products on c equals p.Category }"); } - [Fact] - public void Linq4() + [Fact(Skip = "Not implemented!")] + public void Linq4() { TestConversionVisualBasicToCSharp(@"Public Sub Linq103() Dim categories As String() = New String() {""Beverages"", ""Condiments"", ""Vegetables"", ""Dairy Products"", ""Seafood""} diff --git a/Tests/CSharp/Converter/MemberTests.cs b/Tests/CSharp/Converter/MemberTests.cs index 63d18f89..be033026 100644 --- a/Tests/CSharp/Converter/MemberTests.cs +++ b/Tests/CSharp/Converter/MemberTests.cs @@ -12,10 +12,15 @@ public void TestField() Const answer As Integer = 42 Private value As Integer = 10 ReadOnly v As Integer = 15 -End Class", @"class TestClass +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class TestClass { const int answer = 42; - int value = 10; + private int value = 10; readonly int v = 15; }"); } @@ -30,9 +35,16 @@ Public Sub TestMethod(Of T As {Class, New}, T2 As Structure, T3)( ByRef arg argument2 = Nothing argument3 = Nothing End Sub -End Class", @"class TestClass +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class TestClass { - public void TestMethod(out T argument, ref T2 argument2, T3 argument3) where T : class, new where T2 : struct + public void TestMethod(out T argument, ref T2 argument2, T3 argument3) + where T : class, new() + where T2 : struct { argument = null; argument2 = default(T2); @@ -49,9 +61,16 @@ public void TestMethodWithReturnType() Public Function TestMethod(Of T As {Class, New}, T2 As Structure, T3)( ByRef argument As T, ByRef argument2 As T2, ByVal argument3 As T3) As Integer Return 0 End Function -End Class", @"class TestClass +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class TestClass { - public int TestMethod(out T argument, ref T2 argument2, T3 argument3) where T : class, new where T2 : struct + public int TestMethod(out T argument, ref T2 argument2, T3 argument3) + where T : class, new() + where T2 : struct { return 0; } @@ -68,9 +87,16 @@ Public Shared Sub TestMethod(Of T As {Class, New}, T2 As Structure, T3)( By argument2 = Nothing argument3 = Nothing End Sub -End Class", @"class TestClass +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class TestClass { - public static void TestMethod(out T argument, ref T2 argument2, T3 argument3) where T : class, new where T2 : struct + public static void TestMethod(out T argument, ref T2 argument2, T3 argument3) + where T : class, new() + where T2 : struct { argument = null; argument2 = default(T2); @@ -85,7 +111,12 @@ public void TestAbstractMethod() TestConversionVisualBasicToCSharp( @"Class TestClass Public MustOverride Sub TestMethod() -End Class", @"class TestClass +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class TestClass { public abstract void TestMethod(); }"); @@ -101,9 +132,16 @@ Public NotOverridable Sub TestMethod(Of T As {Class, New}, T2 As Structure, T3)( argument2 = Nothing argument3 = Nothing End Sub -End Class", @"class TestClass +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class TestClass { - public sealed void TestMethod(out T argument, ref T2 argument2, T3 argument3) where T : class, new where T2 : struct + public sealed void TestMethod(out T argument, ref T2 argument2, T3 argument3) + where T : class, new() + where T2 : struct { argument = null; argument2 = default(T2); @@ -112,8 +150,8 @@ End Sub }"); } - [Fact] - public void TestExtensionMethod() + [Fact(Skip = "Not implemented!")] + public void TestExtensionMethod() { TestConversionVisualBasicToCSharp( @"Imports System.Runtime.CompilerServices @@ -122,7 +160,12 @@ Module TestClass Sub TestMethod(ByVal str As String) End Sub -End Module", @"static class TestClass +End Module", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +static class TestClass { public static void TestMethod(this String str) { @@ -130,8 +173,8 @@ public static void TestMethod(this String str) }"); } - [Fact] - public void TestExtensionMethodWithExistingImport() + [Fact(Skip = "Not implemented!")] + public void TestExtensionMethodWithExistingImport() { TestConversionVisualBasicToCSharp( @"Imports System.Runtime.CompilerServices @@ -140,7 +183,11 @@ Module TestClass Sub TestMethod(ByVal str As String) End Sub -End Module", @"using System.Runtime.CompilerServices; +End Module", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; +using System.Runtime.CompilerServices; static class TestClass { @@ -173,16 +220,36 @@ End Get Me.m_test3 = value End Set End Property -End Class", @"class TestClass +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class TestClass { public int Test { get; set; } - public int Test2 { - get { return 0; } + + public int Test2 + { + get + { + return 0; + } } - int m_test3; - public int Test3 { - get { return this.m_test3; } - set { this.m_test3 = value; } + + private int m_test3; + + public int Test3 + { + get + { + return this.m_test3; + } + + set + { + this.m_test3 = value; + } } }"); } @@ -194,7 +261,14 @@ public void TestConstructor() @"Class TestClass(Of T As {Class, New}, T2 As Structure, T3) Public Sub New( ByRef argument As T, ByRef argument2 As T2, ByVal argument3 As T3) End Sub -End Class", @"class TestClass where T : class, new where T2 : struct +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class TestClass + where T : class, new() + where T2 : struct { public TestClass(out T argument, ref T2 argument2, T3 argument3) { @@ -202,14 +276,19 @@ public TestClass(out T argument, ref T2 argument2, T3 argument3) }"); } - [Fact] + [Fact] public void TestDestructor() { TestConversionVisualBasicToCSharp( @"Class TestClass Protected Overrides Sub Finalize() End Sub -End Class", @"class TestClass +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class TestClass { ~TestClass() { @@ -223,14 +302,19 @@ public void TestEvent() TestConversionVisualBasicToCSharp( @"Class TestClass Public Event MyEvent As EventHandler -End Class", @"class TestClass +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class TestClass { public event EventHandler MyEvent; }"); } - [Fact] - public void TestCustomEvent() + [Fact(Skip = "Not implemented!")] + public void TestCustomEvent() { TestConversionVisualBasicToCSharp( @"Class TestClass @@ -245,6 +329,9 @@ End AddHandler End RemoveHandler End Event End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; class TestClass { @@ -261,8 +348,8 @@ public event EventHandler MyEvent { }"); } - [Fact] - public void TestIndexer() + [Fact(Skip = "Not implemented!")] + public void TestIndexer() { TestConversionVisualBasicToCSharp( @"Class TestClass @@ -284,7 +371,12 @@ End Get Me.m_test3 = value End Set End Property -End Class", @"class TestClass +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class TestClass { public int this[int index] { get; set; } public int this[string index] { diff --git a/Tests/CSharp/Converter/NamespaceLevelTests.cs b/Tests/CSharp/Converter/NamespaceLevelTests.cs index ccb43bed..5eca73e9 100644 --- a/Tests/CSharp/Converter/NamespaceLevelTests.cs +++ b/Tests/CSharp/Converter/NamespaceLevelTests.cs @@ -8,9 +8,13 @@ public class NamespaceLevelTests : ConverterTestBase public void TestNamespace() { TestConversionVisualBasicToCSharp(@"Namespace Test -End Namespace", @"namespace Test +End Namespace", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +namespace Test { - }"); } @@ -19,7 +23,12 @@ public void TestTopLevelAttribute() { TestConversionVisualBasicToCSharp( @"", - @"[assembly: CLSCompliant(true)]"); + @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +[assembly: CLSCompliant(true)]"); } [Fact] @@ -28,7 +37,11 @@ public void TestImports() TestConversionVisualBasicToCSharp( @"Imports SomeNamespace Imports VB = Microsoft.VisualBasic", - @"using SomeNamespace; + @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; +using SomeNamespace; using VB = Microsoft.VisualBasic;"); } @@ -38,7 +51,12 @@ public void TestClass() TestConversionVisualBasicToCSharp(@"Namespace Test.[class] Class TestClass(Of T) End Class -End Namespace", @"namespace Test.@class +End Namespace", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +namespace Test.@class { class TestClass { @@ -57,12 +75,22 @@ End Sub Private Sub Test2() End Sub End Module -End Namespace", @"namespace Test.@class +End Namespace", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +namespace Test.@class { internal static class TestClass { - public static void Test() {} - static void Test2() {} + public static void Test() + { + } + + private static void Test2() + { + } } }"); } @@ -73,7 +101,12 @@ public void TestAbstractClass() TestConversionVisualBasicToCSharp(@"Namespace Test.[class] MustInherit Class TestClass End Class -End Namespace", @"namespace Test.@class +End Namespace", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +namespace Test.@class { abstract class TestClass { @@ -87,7 +120,12 @@ public void TestSealedClass() TestConversionVisualBasicToCSharp(@"Namespace Test.[class] NotInheritable Class TestClass End Class -End Namespace", @"namespace Test.@class +End Namespace", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +namespace Test.@class { sealed class TestClass { @@ -103,9 +141,14 @@ public void TestInterface() Inherits System.IDisposable Sub Test() -End Interface", @"interface ITest : System.IDisposable +End Interface", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +interface ITest : System.IDisposable { - void Test (); + private void Test(); }"); } @@ -118,7 +161,12 @@ public void TestEnum() ArgumentOutOfRange_NeedNonNegNum ArgumentOutOfRange_NeedNonNegNumRequired Arg_ArrayPlusOffTooSmall -End Enum", @"internal enum ExceptionResource +End Enum", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +internal enum ExceptionResource { Argument_ImplementIComparable, ArgumentOutOfRange_NeedNonNegNum, @@ -135,7 +183,12 @@ public void TestClassInheritanceList() Implements System.IDisposable Protected MustOverride Sub Test() -End Class", @"abstract class ClassA : System.IDisposable +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +abstract class ClassA : System.IDisposable { protected abstract void Test(); }"); @@ -146,7 +199,12 @@ Inherits System.EventArgs Implements System.IDisposable Protected MustOverride Sub Test() -End Class", @"abstract class ClassA : System.EventArgs, System.IDisposable +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +abstract class ClassA : System.EventArgs, System.IDisposable { protected abstract void Test(); }"); @@ -161,37 +219,41 @@ Implements System.IComparable(Of MyType) Private Sub Test() End Sub -End Structure", @"struct MyType : System.IComparable +End Structure", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +struct MyType : System.IComparable { - void Test() {} + private void Test() + { + } }"); } [Fact] public void TestDelegate() { + const string usings = @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +"; + TestConversionVisualBasicToCSharp( @"Public Delegate Sub Test()", - @"public delegate void Test();"); + usings + @"public delegate void Test();"); TestConversionVisualBasicToCSharp( @"Public Delegate Function Test() As Integer", - @"public delegate int Test();"); + usings + @"public delegate int Test();"); TestConversionVisualBasicToCSharp( @"Public Delegate Sub Test(ByVal x As Integer)", - @"public delegate void Test(int x);"); + usings + @"public delegate void Test(int x);"); TestConversionVisualBasicToCSharp( @"Public Delegate Sub Test(ByRef x As Integer)", - @"public delegate void Test(ref int x);"); - } - - [Fact] - public void MoveImportsStatement() - { - TestConversionVisualBasicToCSharp(@"Imports SomeNamespace - -Namespace test -End Namespace", - "namespace test { using SomeNamespace; }"); + usings + @"public delegate void Test(ref int x);"); } [Fact] @@ -200,7 +262,14 @@ public void ClassImplementsInterface() TestConversionVisualBasicToCSharp(@"Class test Implements IComparable End Class", - "using System; class test : IComparable { }"); + @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class test : IComparable +{ +}"); } [Fact] @@ -209,7 +278,14 @@ public void ClassImplementsInterface2() TestConversionVisualBasicToCSharp(@"Class test Implements System.IComparable End Class", - "class test : System.IComparable { }"); + @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class test : System.IComparable +{ +}"); } [Fact] @@ -220,7 +296,15 @@ public void ClassInheritsClass() Class test Inherits InvalidDataException End Class", - "using System.IO; class test : InvalidDataException { }"); + @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; +using System.IO; + +class test : InvalidDataException +{ +}"); } [Fact] @@ -229,7 +313,14 @@ public void ClassInheritsClass2() TestConversionVisualBasicToCSharp(@"Class test Inherits System.IO.InvalidDataException End Class", - "class test : System.IO.InvalidDataException { }"); + @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class test : System.IO.InvalidDataException +{ +}"); } } } diff --git a/Tests/CSharp/Converter/SpecialConversionTests.cs b/Tests/CSharp/Converter/SpecialConversionTests.cs index 6d0d50c4..8fa2e353 100644 --- a/Tests/CSharp/Converter/SpecialConversionTests.cs +++ b/Tests/CSharp/Converter/SpecialConversionTests.cs @@ -2,52 +2,8 @@ namespace RefactoringEssentials.Tests.CSharp.Converter { - public class SpecialConversionTests : ConverterTestBase + public class SpecialConversionTests : ConverterTestBase { - [Fact] - public void TestSimpleInlineAssign() - { - TestConversionVisualBasicToCSharp( -@"Class TestClass - Private Sub TestMethod() - Dim a, b As Integer - b = __InlineAssignHelper(a, 5) - End Sub - - - Private Shared Function __InlineAssignHelper(Of T)(ByRef target As T, value As T) As T - target = value - Return value - End Function -End Class", @"class TestClass -{ - void TestMethod() - { - int a, b; - b = a = 5; - } -}"); - } - - [Fact] - public void TestSimplePostIncrementAssign() - { - TestConversionVisualBasicToCSharp( -@"Class TestClass - Private Sub TestMethod() - Dim b As Integer, a As Integer = 5 - b = Math.Min(System.Threading.Interlocked.Increment(a), a - 1) - End Sub -End Class", @"class TestClass -{ - void TestMethod() - { - int a = 5, b; - b = a++; - } -}"); - } - [Fact] public void RaiseEvent() { @@ -58,150 +14,18 @@ Private Event MyEvent As EventHandler Private Sub TestMethod() RaiseEvent MyEvent(Me, EventArgs.Empty) End Sub -End Class", @"class TestClass -{ - event EventHandler MyEvent; - - void TestMethod() - { - if (MyEvent != null) MyEvent(this, EventArgs.Empty); - } -}"); - TestConversionVisualBasicToCSharp( -@"Class TestClass - Private Sub TestMethod() - RaiseEvent MyEvent(Me, EventArgs.Empty) - End Sub -End Class", @"class TestClass -{ - void TestMethod() - { - if ((MyEvent != null)) MyEvent(this, EventArgs.Empty); - } -}"); - TestConversionVisualBasicToCSharp( -@"Class TestClass - Private Sub TestMethod() - RaiseEvent MyEvent(Me, EventArgs.Empty) - End Sub -End Class", @"class TestClass -{ - void TestMethod() - { - if (null != MyEvent) { MyEvent(this, EventArgs.Empty); } - } -}"); - TestConversionVisualBasicToCSharp( -@"Class TestClass - Private Sub TestMethod() - RaiseEvent MyEvent(Me, EventArgs.Empty) - End Sub -End Class", @"class TestClass -{ - void TestMethod() - { - if (this.MyEvent != null) MyEvent(this, EventArgs.Empty); - } -}"); - TestConversionVisualBasicToCSharp( -@"Class TestClass - Private Sub TestMethod() - RaiseEvent MyEvent(Me, EventArgs.Empty) - End Sub -End Class", @"class TestClass -{ - void TestMethod() - { - if (MyEvent != null) this.MyEvent(this, EventArgs.Empty); - } -}"); - TestConversionVisualBasicToCSharp( -@"Class TestClass - Private Sub TestMethod() - RaiseEvent MyEvent(Me, EventArgs.Empty) - End Sub -End Class", @"class TestClass -{ - void TestMethod() - { - if ((this.MyEvent != null)) { this.MyEvent(this, EventArgs.Empty); } - } -}"); - } +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; - [Fact] - public void IfStatementSimilarToRaiseEvent() - { - TestConversionVisualBasicToCSharp( -@"Class TestClass - Private Sub TestMethod() - If FullImage IsNot Nothing Then DrawImage() - End Sub -End Class", @"class TestClass +class TestClass { - void TestMethod() - { - if (FullImage != null) DrawImage(); - } -}"); - // regression test: - TestConversionVisualBasicToCSharp( -@"Class TestClass - Private Sub TestMethod() - If FullImage IsNot Nothing Then e.DrawImage() - End Sub -End Class", @"class TestClass -{ - void TestMethod() - { - if (FullImage != null) e.DrawImage(); - } -}"); - // with braces: - TestConversionVisualBasicToCSharp( -@"Class TestClass - Private Sub TestMethod() - If FullImage IsNot Nothing Then - DrawImage() - End If - End Sub -End Class", @"class TestClass -{ - void TestMethod() - { - if (FullImage != null) { DrawImage(); } - } -}"); - TestConversionVisualBasicToCSharp( -@"Class TestClass - Private Sub TestMethod() - If FullImage IsNot Nothing Then - e.DrawImage() - End If - End Sub -End Class", @"class TestClass -{ - void TestMethod() - { - if (FullImage != null) { e.DrawImage(); } - } -}"); - // another bug related to the IfStatement code: - TestConversionVisualBasicToCSharp( -@"Class TestClass - Private Sub TestMethod() - If Tiles IsNot Nothing Then + private event EventHandler MyEvent; - For Each t As Tile In Tiles - Me.TileTray.Controls.Remove(t) - Next - End If - End Sub -End Class", @"class TestClass -{ - void TestMethod() + private void TestMethod() { - if (Tiles != null) foreach (Tile t in Tiles) this.TileTray.Controls.Remove(t); + MyEvent?.Invoke(this, EventArgs.Empty); } }"); } diff --git a/Tests/CSharp/Converter/StatementTests.cs b/Tests/CSharp/Converter/StatementTests.cs index 141a02ab..dca4d6c9 100644 --- a/Tests/CSharp/Converter/StatementTests.cs +++ b/Tests/CSharp/Converter/StatementTests.cs @@ -15,21 +15,30 @@ End If While True End While - While True - End While - Do Loop While True End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { - if (true) ; - while (true) ; - for (;;) ; - do ; while (true); + if (true) + { + } + + while (true) + { + } + + do + { + } + while (true); } }"); } @@ -42,10 +51,14 @@ Private Sub TestMethod() Dim b As Integer b = 0 End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { int b; b = 0; @@ -60,10 +73,14 @@ public void AssignmentStatementInDeclaration() Private Sub TestMethod() Dim b As Integer = 0 End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { int b = 0; } @@ -77,10 +94,14 @@ public void AssignmentStatementInVarDeclaration() Private Sub TestMethod() Dim b = 0 End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { var b = 0; } @@ -95,10 +116,14 @@ Private Sub TestMethod() Dim b As String b = New String(""test"") End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { string b; b = new string(""test""); @@ -113,10 +138,14 @@ public void ObjectInitializationStatementInDeclaration() Private Sub TestMethod() Dim b As String = New String(""test"") End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { string b = new string(""test""); } @@ -130,10 +159,14 @@ public void ObjectInitializationStatementInVarDeclaration() Private Sub TestMethod() Dim b = New String(""test"") End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { var b = new string(""test""); } @@ -147,10 +180,14 @@ public void ArrayDeclarationStatement() Private Sub TestMethod() Dim b As Integer() End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { int[] b; } @@ -164,12 +201,21 @@ public void ArrayInitializationStatement() Private Sub TestMethod() Dim b As Integer() = {1, 2, 3} End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { - int[] b = { 1, 2, 3 }; + int[] b = + { + 1, + 2, + 3 + }; } }"); } @@ -181,12 +227,21 @@ public void ArrayInitializationStatementInVarDeclaration() Private Sub TestMethod() Dim b = {1, 2, 3} End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { - var b = { 1, 2, 3 }; + var b = + { + 1, + 2, + 3 + }; } }"); } @@ -198,29 +253,42 @@ public void ArrayInitializationStatementWithType() Private Sub TestMethod() Dim b As Integer() = New Integer() {1, 2, 3} End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { int[] b = new int[] { 1, 2, 3 }; } }"); } - [Fact] + [Fact(Skip = "Not implemented!")] public void ArrayInitializationStatementWithLength() { TestConversionVisualBasicToCSharp(@"Class TestClass Private Sub TestMethod() Dim b As Integer() = New Integer(2) {1, 2, 3} End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { - int[] b = new int[3] { 1, 2, 3 }; + int[] b = new int[3] + { + 1, + 2, + 3 + }; } }"); } @@ -232,27 +300,35 @@ public void MultidimensionalArrayDeclarationStatement() Private Sub TestMethod() Dim b As Integer(,) End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { int[,] b; } }"); } - [Fact] - public void MultidimensionalArrayInitializationStatement() + [Fact(Skip = "Not implemented!")] + public void MultidimensionalArrayInitializationStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass Private Sub TestMethod() Dim b As Integer(,) = {{1, 2}, {3, 4}} End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { int[,] b = { { 1, 2 }, { 3, 4 } }; } @@ -266,27 +342,35 @@ public void MultidimensionalArrayInitializationStatementWithType() Private Sub TestMethod() Dim b As Integer(,) = New Integer(,) {{1, 2}, {3, 4}} End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { int[,] b = new int[,] { { 1, 2 }, { 3, 4 } }; } }"); } - [Fact] - public void MultidimensionalArrayInitializationStatementWithLengths() + [Fact(Skip = "Not implemented!")] + public void MultidimensionalArrayInitializationStatementWithLengths() { TestConversionVisualBasicToCSharp(@"Class TestClass Private Sub TestMethod() Dim b As Integer(,) = New Integer(1, 1) {{1, 2}, {3, 4}} End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { int[,] b = new int[2, 2] { { 1, 2 }, { 3, 4 } }; } @@ -300,68 +384,84 @@ public void JaggedArrayDeclarationStatement() Private Sub TestMethod() Dim b As Integer()() End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { int[][] b; } }"); } - [Fact] - public void JaggedArrayInitializationStatement() + [Fact(Skip = "Not implemented!")] + public void JaggedArrayInitializationStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass Private Sub TestMethod() Dim b As Integer()() = {New Integer() {1, 2}, New Integer() {3, 4}} End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { int[][] b = { new int[] { 1, 2 }, new int[] { 3, 4 } }; } }"); } - [Fact] - public void JaggedArrayInitializationStatementWithType() + [Fact(Skip = "Not implemented!")] + public void JaggedArrayInitializationStatementWithType() { TestConversionVisualBasicToCSharp(@"Class TestClass Private Sub TestMethod() Dim b As Integer()() = New Integer()() {New Integer() {1, 2}, New Integer() {3, 4}} End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { int[][] b = new int[][] { new int[] { 1, 2 }, new int[] { 3, 4 } }; } }"); } - [Fact] - public void JaggedArrayInitializationStatementWithLength() + [Fact(Skip = "Not implemented!")] + public void JaggedArrayInitializationStatementWithLength() { TestConversionVisualBasicToCSharp(@"Class TestClass Private Sub TestMethod() Dim b As Integer()() = New Integer(1)() {New Integer() {1, 2}, New Integer() {3, 4}} End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { int[][] b = new int[2][] { new int[] { 1, 2 }, new int[] { 3, 4 } }; } }"); } - [Fact] + [Fact(Skip = "Not implemented!")] public void DeclarationStatements() { TestConversionVisualBasicToCSharp( @@ -373,8 +473,13 @@ Private Sub TestMethod() Dim text = ""This is my text!"" GoTo the_beginning End Sub -End Class", @"class Test { - void TestMethod() +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class Test { + private void TestMethod() { the_beginning: int value = 1; @@ -402,21 +507,24 @@ Dim b As Integer b = 3 End If End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod (int a) + private void TestMethod(int a) { int b; - if (a == 0) { + if (a == 0) b = 0; - } else if (a == 1) { + else if (a == 1) b = 1; - } else if (a == 2 || a == 3) { + else if (a == 2 || a == 3) b = 2; - } else { + else b = 3; - } } }"); } @@ -435,10 +543,14 @@ Dim b As Integer b = 1 End While End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { int b; b = 0; @@ -468,10 +580,14 @@ Dim b As Integer b = 1 Loop While b = 0 End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { int b; b = 0; @@ -498,10 +614,14 @@ For Each val As Integer In values If val = 3 Then Exit For Next End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod(int[] values) + private void TestMethod(int[] values) { foreach (int val in values) { @@ -524,10 +644,14 @@ For Each val In values If val = 3 Then Exit For Next End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod(int[] values) + private void TestMethod(int[] values) { foreach (var val in values) { @@ -551,63 +675,19 @@ SyncLock nullObject Console.WriteLine(nullObject) End SyncLock End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod(object nullObject) + private void TestMethod(object nullObject) { if (nullObject == null) throw new ArgumentNullException(nameof(nullObject)); - lock (nullObject) { + lock (nullObject) Console.WriteLine(nullObject); - } - } -}"); - } - - [Fact] - public void ForWithUnknownConditionAndSingleStatement() - { - TestConversionVisualBasicToCSharp(@"Class TestClass - Private Sub TestMethod() - i = 0 - - While unknownCondition - b(i) = s(i) - i += 1 - End While - End Sub -End Class", @" -class TestClass -{ - void TestMethod() - { - for (i = 0; unknownCondition; i++) - b[i] = s[i]; - } -}"); - } - - [Fact] - public void ForWithUnknownConditionAndBlock() - { - TestConversionVisualBasicToCSharp(@"Class TestClass - Private Sub TestMethod() - i = 0 - - While unknownCondition - b(i) = s(i) - i += 1 - End While - End Sub -End Class", @" -class TestClass -{ - void TestMethod() - { - for (i = 0; unknownCondition; i++) { - b[i] = s[i]; - } } }"); } @@ -617,16 +697,23 @@ public void ForWithSingleStatement() { TestConversionVisualBasicToCSharp(@"Class TestClass Private Sub TestMethod() - For i = 0 To [end] - 1 + Dim b, s As Integer() + For i = 0 To [end] b(i) = s(i) Next End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { - for (i = 0; i < end; i++) b[i] = s[i]; + int[] b, s; + for (i = 0; i <= end; i++) + b[i] = s[i]; } }"); } @@ -636,24 +723,29 @@ public void ForWithBlock() { TestConversionVisualBasicToCSharp(@"Class TestClass Private Sub TestMethod() + Dim b, s As Integer() For i = 0 To [end] - 1 b(i) = s(i) Next End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod() + private void TestMethod() { - for (i = 0; i < end; i++) { + int[] b, s; + for (i = 0; i <= end - 1; i++) b[i] = s[i]; - } } }"); } - [Fact] - public void LabeledAndForStatement() + [Fact(Skip = "Not implemented!")] + public void LabeledAndForStatement() { TestConversionVisualBasicToCSharp(@"Class GotoTest1 Private Shared Sub Main() @@ -690,7 +782,11 @@ GoTo Finish Console.WriteLine(""Press any key to exit."") Console.ReadKey() End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class GotoTest1 { static void Main() @@ -742,10 +838,14 @@ public void ThrowStatement() Private Sub TestMethod(ByVal nullObject As Object) If nullObject Is Nothing Then Throw New ArgumentNullException(NameOf(nullObject)) End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod(object nullObject) + private void TestMethod(object nullObject) { if (nullObject == null) throw new ArgumentNullException(nameof(nullObject)); @@ -753,7 +853,7 @@ void TestMethod(object nullObject) }"); } - [Fact] + [Fact(Skip = "Not implemented!")] public void AddRemoveHandler() { TestConversionVisualBasicToCSharp(@"Class TestClass @@ -772,69 +872,63 @@ End Sub Private Sub MyHandler(ByVal sender As Object, ByVal e As EventArgs) End Sub End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; class TestClass { public event EventHandler MyEvent; - void TestMethod(EventHandler e) + private void TestMethod(EventHandler e) { this.MyEvent += e; this.MyEvent += MyHandler; } - void TestMethod2(EventHandler e) + private void TestMethod2(EventHandler e) { this.MyEvent -= e; this.MyEvent -= MyHandler; } - void MyHandler(object sender, EventArgs e) + private void MyHandler(object sender, EventArgs e) { } }"); } - [Fact] - public void SelectCase1() + [Fact] + public void SelectCase1() { TestConversionVisualBasicToCSharp(@"Class TestClass Private Sub TestMethod(ByVal number As Integer) Select Case number Case 0, 1, 2 Console.Write(""number is 0, 1, 2"") - Case 3 - Console.Write(""section 3"") - GoTo _Select0_Case5 - Case 4 - Console.Write(""section 4"") - GoTo _Select0_CaseDefault Case 5 -_Select0_Case5: Console.Write(""section 5"") Case Else -_Select0_CaseDefault: Console.Write(""default section"") End Select End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - void TestMethod(int number) + private void TestMethod(int number) { - switch (number) { + switch (number) + { case 0: case 1: case 2: Console.Write(""number is 0, 1, 2""); break; - case 3: - Console.Write(""section 3""); - goto case 5; - case 4: - Console.Write(""section 4""); - goto default; case 5: Console.Write(""section 5""); break; @@ -868,7 +962,7 @@ End Try Try Console.WriteLine(""try"") - Catch __unusedIOException1__ As System.IO.IOException + Catch e2 As NotImplementedException Console.WriteLine(""catch1"") Catch e As Exception When Log(e.Message) Console.WriteLine(""catch2"") @@ -880,36 +974,57 @@ End Try Console.WriteLine(""finally"") End Try End Sub -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - static bool Log(string message) + private static bool Log(string message) { Console.WriteLine(message); return false; } - void TestMethod(int number) + private void TestMethod(int number) { - try { + try + { Console.WriteLine(""try""); - } catch (Exception e) { + } + catch (Exception e) + { Console.WriteLine(""catch1""); - } catch { + } + catch + { Console.WriteLine(""catch all""); - } finally { + } + finally + { Console.WriteLine(""finally""); } - try { + + try + { Console.WriteLine(""try""); - } catch (System.IO.IOException) { + } + catch (NotImplementedException e2) + { Console.WriteLine(""catch1""); - } catch (Exception e) when (Log(e.Message)) { + } + catch (Exception e) when (Log(e.Message)) + { Console.WriteLine(""catch2""); } - try { + + try + { Console.WriteLine(""try""); - } finally { + } + finally + { Console.WriteLine(""finally""); } } @@ -927,14 +1042,18 @@ If number < 0 Then Return Yield i Next End Function -End Class", @" +End Class", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + class TestClass { - IEnumerable TestMethod(int number) + private IEnumerable TestMethod(int number) { if (number < 0) yield break; - for (int i = 0; i < number; i++) + for (int i = 0; i <= number - 1; i++) yield return i; } }"); diff --git a/Tests/CSharp/Converter/TypeCastTests.cs b/Tests/CSharp/Converter/TypeCastTests.cs index 52e0acf5..bb341f3e 100644 --- a/Tests/CSharp/Converter/TypeCastTests.cs +++ b/Tests/CSharp/Converter/TypeCastTests.cs @@ -8,14 +8,24 @@ public class TypeCastTests : ConverterTestBase public void CastObjectToInteger() { TestConversionVisualBasicToCSharp( -@"Private Sub Test() - Dim o As Object = 5 - Dim i As Integer = CInt(o) -End Sub -", @"void Test() +@"Class Class1 + Private Sub Test() + Dim o As Object = 5 + Dim i As Integer = CInt(o) + End Sub +End Class +", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class Class1 { - object o = 5; - int i = (int) o; + private void Test() + { + object o = 5; + int i = (int)o; + } } "); } @@ -24,14 +34,24 @@ End Sub public void CastObjectToString() { TestConversionVisualBasicToCSharp( -@"Private Sub Test() - Dim o As Object = ""Test"" - Dim s As String = CStr(o) -End Sub -", @"void Test() +@"Class Class1 + Private Sub Test() + Dim o As Object = ""Test"" + Dim s As String = CStr(o) + End Sub +End Class +", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class Class1 { - object o = ""Test""; - string s = (string) o; + private void Test() + { + object o = ""Test""; + string s = (string)o; + } } "); } @@ -40,88 +60,143 @@ End Sub public void CastObjectToGenericList() { TestConversionVisualBasicToCSharp( -@"Private Sub Test() - Dim o As Object = New System.Collections.Generic.List(Of Integer)() - Dim l As System.Collections.Generic.List(Of Integer) = CType(o, System.Collections.Generic.List(Of Integer)) -End Sub -", @"void Test() +@"Class Class1 + Private Sub Test() + Dim o As Object = New System.Collections.Generic.List(Of Integer)() + Dim l As System.Collections.Generic.List(Of Integer) = CType(o, System.Collections.Generic.List(Of Integer)) + End Sub +End Class +", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class Class1 { - object o = new System.Collections.Generic.List(); - System.Collections.Generic.List l = (System.Collections.Generic.List) o; -} -"); + private void Test() + { + object o = new System.Collections.Generic.List(); + System.Collections.Generic.List l = (System.Collections.Generic.List)o; + } +}"); } [Fact] public void TryCastObjectToInteger() { TestConversionVisualBasicToCSharp( -@"Private Sub Test() - Dim o As Object = 5 - Dim i As System.Nullable(Of Integer) = TryCast(o, Integer) -End Sub -", @"void Test() +@"Class Class1 + Private Sub Test() + Dim o As Object = 5 + Dim i As System.Nullable(Of Integer) = TryCast(o, Integer) + End Sub +End Class +", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class Class1 { - object o = 5; - System.Nullable i = o as int; -} -"); + private void Test() + { + object o = 5; + System.Nullable i = o as int; + } +}"); } [Fact] public void TryCastObjectToGenericList() { TestConversionVisualBasicToCSharp( -@"Private Sub Test() - Dim o As Object = New System.Collections.Generic.List(Of Integer)() - Dim l As System.Collections.Generic.List(Of Integer) = TryCast(o, System.Collections.Generic.List(Of Integer)) -End Sub -", @"void Test() +@"Class Class1 + Private Sub Test() + Dim o As Object = New System.Collections.Generic.List(Of Integer)() + Dim l As System.Collections.Generic.List(Of Integer) = TryCast(o, System.Collections.Generic.List(Of Integer)) + End Sub +End Class +", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class Class1 { - object o = new System.Collections.Generic.List(); - System.Collections.Generic.List l = o as System.Collections.Generic.List; -} -"); + private void Test() + { + object o = new System.Collections.Generic.List(); + System.Collections.Generic.List l = o as System.Collections.Generic.List; + } +}"); } [Fact] public void CastConstantNumberToLong() { TestConversionVisualBasicToCSharp( -@"Private Sub Test() - Dim o As Object = 5L -End Sub -", @"void Test() +@"Class Class1 + Private Sub Test() + Dim o As Object = 5L + End Sub +End Class +", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class Class1 { - object o = 5L; -} -"); + private void Test() + { + object o = 5L; + } +}"); } [Fact] public void CastConstantNumberToFloat() { TestConversionVisualBasicToCSharp( -@"Private Sub Test() - Dim o As Object = 5F -End Sub -", @"void Test() +@"Class Class1 + Private Sub Test() + Dim o As Object = 5F + End Sub +End Class +", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class Class1 { - object o = 5.0f; -} -"); + private void Test() + { + object o = 5F; + } +}"); } [Fact] public void CastConstantNumberToDecimal() { TestConversionVisualBasicToCSharp( -@"Private Sub Test() - Dim o As Object = 5.0D -End Sub -", @"void Test() +@"Class Class1 + Private Sub Test() + Dim o As Object = 5.0D + End Sub +End Class +", @"using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualBasic; + +class Class1 { - object o = 5.0m; + private void Test() + { + object o = 5.0M; + } } "); } diff --git a/Tests/Common/ConverterTestBase.cs b/Tests/Common/ConverterTestBase.cs index a6658e58..de8ee12e 100644 --- a/Tests/Common/ConverterTestBase.cs +++ b/Tests/Common/ConverterTestBase.cs @@ -248,8 +248,8 @@ public void TestConversionVisualBasicToCSharp(string visualBasicCode, string exp expectedCsharpCode = Utils.HomogenizeEol(expectedCsharpCode).TrimEnd(); if (expectedCsharpCode != txt) { - int l = Math.Max(expectedCsharpCode.Length, txt.Length) * 3; - StringBuilder sb = new StringBuilder(l); + int l = Math.Max(expectedCsharpCode.Length, txt.Length); + StringBuilder sb = new StringBuilder(l * 4); sb.AppendLine("expected:"); sb.AppendLine(expectedCsharpCode); sb.AppendLine("got:"); From 6ea7b042965c443f5d46dcf96e1a05d789d0a0d2 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 10 Feb 2017 14:22:05 +0100 Subject: [PATCH 078/236] Squashed commit of the following: commit 69db4df899ade1c8c82697978cf9a0637c132d68 Merge: 72bd927 7b1e9b9 Author: Siegfried Pammer Date: Fri Feb 10 14:13:52 2017 +0100 Merge branch 'master' of https://github.com/SSkovboiSS/RefactoringEssentials into SSkovboiSS-master commit 7b1e9b943db495eed1a122b147391d40896b10ed Author: Andrew Boklashko Date: Thu Feb 2 01:46:51 2017 +0200 Update ConvertExpressionBodyToStatementBodyTests.cs commit c5a928529749340324873219a3ae5ed4fee6e1c1 Author: Andrew Boklashko Date: Thu Feb 2 01:36:12 2017 +0200 Update ConvertExpressionBodyToStatementBodyCodeRefactoringProvider.cs commit b5b92fe38c38972c1eb8469c8ef854e1f47a08db Author: Andrew Boklashko Date: Thu Feb 2 01:22:53 2017 +0200 Fixed void expressions were converting to ReturnStatement --- ...yToStatementBodyCodeRefactoringProvider.cs | 15 ++++++++++++--- ...nvertExpressionBodyToStatementBodyTests.cs | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertExpressionBodyToStatementBodyCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertExpressionBodyToStatementBodyCodeRefactoringProvider.cs index b6c433e4..a5f71a42 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertExpressionBodyToStatementBodyCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertExpressionBodyToStatementBodyCodeRefactoringProvider.cs @@ -33,7 +33,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte var token = root.FindToken(span.Start); var method = GetDeclaration(token); if (method != null) - HandleMethodCase(context, root, token, method); + HandleMethodCase(context, model, root, token, method); var property = GetDeclaration(token); if (property != null) @@ -61,11 +61,20 @@ static T GetDeclaration(SyntaxToken token) where T : MemberDeclarationSyntax return null; } - static void HandleMethodCase(CodeRefactoringContext context, SyntaxNode root, SyntaxToken token, MethodDeclarationSyntax method) + static void HandleMethodCase(CodeRefactoringContext context, SemanticModel model, SyntaxNode root, SyntaxToken token, MethodDeclarationSyntax method) { ExpressionSyntax expr; if (!IsExpressionBody(method.Body, method.ExpressionBody, out expr)) return; + + var methodSymbol = model.GetDeclaredSymbol(method); + if (methodSymbol == null) + return; + + BlockSyntax methodBody = methodSymbol.ReturnsVoid ? + SyntaxFactory.Block(SyntaxFactory.ExpressionStatement(expr)) : + SyntaxFactory.Block(SyntaxFactory.ReturnStatement(expr)); + context.RegisterRefactoring( CodeActionFactory.Create( token.Span, @@ -76,7 +85,7 @@ static void HandleMethodCase(CodeRefactoringContext context, SyntaxNode root, Sy var newRoot = root.ReplaceNode((SyntaxNode) method, method - .WithBody(SyntaxFactory.Block(SyntaxFactory.ReturnStatement(expr))) + .WithBody(methodBody) .WithExpressionBody(null) .WithSemicolonToken(SyntaxFactory.MissingToken(SyntaxKind.SemicolonToken)) .WithAdditionalAnnotations(Formatter.Annotation) diff --git a/Tests/CSharp/CodeRefactorings/ConvertExpressionBodyToStatementBodyTests.cs b/Tests/CSharp/CodeRefactorings/ConvertExpressionBodyToStatementBodyTests.cs index 54cd639e..dfe92a44 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertExpressionBodyToStatementBodyTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertExpressionBodyToStatementBodyTests.cs @@ -40,6 +40,25 @@ int TestProperty return 321; } } +}"); + } + + [Fact] + public void TestVoidMethod() + { + Test(@" +class TestClass +{ + void Foo(); + void $TestMethod() => Foo(); +}", @" +class TestClass +{ + void Foo(); + void TestMethod() + { + Foo(); + } }"); } } From ab4ac82f955080a9e0125eb56b3d977c7c1a9868 Mon Sep 17 00:00:00 2001 From: Andrew Boklashko Date: Sat, 11 Feb 2017 01:40:22 +0200 Subject: [PATCH 079/236] Fixed PutInsideUsingAction bug with impicitly typed variables --- .../Uncategorized/PutInsideUsingAction.cs | 7 ++++- .../CodeRefactorings/PutInsideUsingTests.cs | 28 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs index 3432da15..7352e3dd 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs @@ -150,9 +150,14 @@ private static void ExtractVariableDeclarationsBeforeUsing(SemanticModel semanti insideUsing.Insert(i + 1, needAssignment.Declarator.InitializerAsAssignment()); } + var typeSyntax = localDeclarationStmt.Declaration.Type; + var type = semanticModel.GetSymbolInfo(typeSyntax).Symbol; + beforeUsing.Add(SyntaxFactory.LocalDeclarationStatement( SyntaxFactory.VariableDeclaration( - localDeclarationStmt.Declaration.Type, + SyntaxFactory.ParseTypeName(type.ToMinimalDisplayString(semanticModel, typeSyntax.SpanStart)) + .WithLeadingTrivia(typeSyntax.GetLeadingTrivia()) + .WithTrailingTrivia(typeSyntax.GetTrailingTrivia()), SyntaxFactory.SeparatedList(variablesToMove.Select(x => x.Declarator.WithInitializer(null))) ) ) diff --git a/Tests/CSharp/CodeRefactorings/PutInsideUsingTests.cs b/Tests/CSharp/CodeRefactorings/PutInsideUsingTests.cs index 5bc6c00b..98154aca 100644 --- a/Tests/CSharp/CodeRefactorings/PutInsideUsingTests.cs +++ b/Tests/CSharp/CodeRefactorings/PutInsideUsingTests.cs @@ -390,6 +390,34 @@ void TestMethod (int i) a = 0; } +}"); + } + + [Fact] + public void TestChangeVarDeclarationToExplicit() + { + Test(@" +class TestClass +{ + void TestMethod () + { + System.IDisposable obj $= null; + var a = obj.GetHashCode(); + return a; + } +}", @" +class TestClass +{ + void TestMethod () + { + int a; + using (System.IDisposable obj = null) + { + a = obj.GetHashCode(); + } + + return a; + } }"); } } From 2bf8201c66365080fee67f1ba54240120712296a Mon Sep 17 00:00:00 2001 From: Andrew Boklashko Date: Sun, 12 Feb 2017 16:13:11 +0200 Subject: [PATCH 080/236] Declaration is changing only for var-typed variables --- .../Uncategorized/PutInsideUsingAction.cs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs index 7352e3dd..6be965ef 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs @@ -150,14 +150,22 @@ private static void ExtractVariableDeclarationsBeforeUsing(SemanticModel semanti insideUsing.Insert(i + 1, needAssignment.Declarator.InitializerAsAssignment()); } - var typeSyntax = localDeclarationStmt.Declaration.Type; - var type = semanticModel.GetSymbolInfo(typeSyntax).Symbol; + var localDeclarationTypeSyntax = localDeclarationStmt.Declaration.Type; + + if(localDeclarationTypeSyntax.IsVar) + { + var localDeclarationTypeSymbol = semanticModel.GetSymbolInfo(localDeclarationTypeSyntax).Symbol; + + var localDeclarationTypeName = localDeclarationTypeSymbol.ToMinimalDisplayString(semanticModel, localDeclarationTypeSyntax.SpanStart); + + localDeclarationTypeSyntax = SyntaxFactory.ParseTypeName(localDeclarationTypeName) + .WithLeadingTrivia(localDeclarationTypeSyntax.GetLeadingTrivia()) + .WithTrailingTrivia(localDeclarationTypeSyntax.GetTrailingTrivia()); + } beforeUsing.Add(SyntaxFactory.LocalDeclarationStatement( SyntaxFactory.VariableDeclaration( - SyntaxFactory.ParseTypeName(type.ToMinimalDisplayString(semanticModel, typeSyntax.SpanStart)) - .WithLeadingTrivia(typeSyntax.GetLeadingTrivia()) - .WithTrailingTrivia(typeSyntax.GetTrailingTrivia()), + localDeclarationTypeSyntax, SyntaxFactory.SeparatedList(variablesToMove.Select(x => x.Declarator.WithInitializer(null))) ) ) From 06985398f6c3f2094da2ad416ea1e3debd360761 Mon Sep 17 00:00:00 2001 From: Christoph Wille Date: Mon, 13 Feb 2017 08:36:34 +0100 Subject: [PATCH 081/236] NUnit -> xUnit in 2017 project --- Tests.2017/Tests.csproj | 21 +++++++++++++++++---- Tests.2017/packages.config | 10 ++++++++-- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/Tests.2017/Tests.csproj b/Tests.2017/Tests.csproj index 4d3368af..c5523819 100644 --- a/Tests.2017/Tests.csproj +++ b/Tests.2017/Tests.csproj @@ -1,5 +1,7 @@  + + Debug @@ -86,10 +88,6 @@ True - - ..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll - True - ..\packages\System.AppContext.4.1.0\lib\net46\System.AppContext.dll @@ -183,6 +181,19 @@ ..\packages\System.Xml.XPath.XDocument.4.0.1\lib\net46\System.Xml.XPath.XDocument.dll True + + ..\packages\xunit.abstractions.2.0.1\lib\net35\xunit.abstractions.dll + True + + + ..\packages\xunit.assert.2.2.0-rc1-build3507\lib\netstandard1.1\xunit.assert.dll + + + ..\packages\xunit.extensibility.core.2.2.0-rc1-build3507\lib\netstandard1.1\xunit.core.dll + + + ..\packages\xunit.extensibility.execution.2.2.0-rc1-build3507\lib\net452\xunit.execution.desktop.dll + @@ -1165,6 +1176,8 @@ + + diff --git a/Tests.2017/packages.config b/Tests.2017/packages.config index 494b427e..6998fb63 100644 --- a/Tests.2017/packages.config +++ b/Tests.2017/packages.config @@ -9,8 +9,6 @@ - - @@ -58,4 +56,12 @@ + + + + + + + + \ No newline at end of file From f118e3378e53c9fc8c3df3fbd2096af39ee60504 Mon Sep 17 00:00:00 2001 From: Christoph Wille Date: Mon, 13 Feb 2017 08:41:22 +0100 Subject: [PATCH 082/236] rc3 -> rc4 packages --- RefactoringEssentials.2017/RefactoringEssentials.csproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/RefactoringEssentials.2017/RefactoringEssentials.csproj b/RefactoringEssentials.2017/RefactoringEssentials.csproj index 6a8eba0e..7727ad88 100644 --- a/RefactoringEssentials.2017/RefactoringEssentials.csproj +++ b/RefactoringEssentials.2017/RefactoringEssentials.csproj @@ -1681,9 +1681,9 @@ - - - - + + + + \ No newline at end of file From adfbc8c8fc3e6de047a799cb5fa2d2950e7d15b9 Mon Sep 17 00:00:00 2001 From: Christoph Wille Date: Mon, 13 Feb 2017 09:03:24 +0100 Subject: [PATCH 083/236] Update packages in Tests --- Tests.2017/Tests.csproj | 149 +++++++++++++++++-------------------- Tests.2017/app.config | 38 +++++++++- Tests.2017/packages.config | 112 ++++++++++++++-------------- 3 files changed, 163 insertions(+), 136 deletions(-) diff --git a/Tests.2017/Tests.csproj b/Tests.2017/Tests.csproj index c5523819..11f6bcc5 100644 --- a/Tests.2017/Tests.csproj +++ b/Tests.2017/Tests.csproj @@ -1,8 +1,7 @@  - + - Debug AnyCPU @@ -59,127 +58,117 @@ + + ..\packages\ManagedEsent.1.9.4\lib\net40\Esent.Interop.dll + - ..\packages\Microsoft.CodeAnalysis.Common.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.dll - True + ..\packages\Microsoft.CodeAnalysis.Common.2.0.0-rc4\lib\netstandard1.3\Microsoft.CodeAnalysis.dll - ..\packages\Microsoft.CodeAnalysis.CSharp.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.dll - True + ..\packages\Microsoft.CodeAnalysis.CSharp.2.0.0-rc4\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.dll - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.Workspaces.dll - True + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.2.0.0-rc4\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + + + ..\packages\Microsoft.CodeAnalysis.Elfie.0.10.6-rc2\lib\net46\Microsoft.CodeAnalysis.Elfie.dll - ..\packages\Microsoft.CodeAnalysis.VisualBasic.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.VisualBasic.dll - True + ..\packages\Microsoft.CodeAnalysis.VisualBasic.2.0.0-rc4\lib\netstandard1.3\Microsoft.CodeAnalysis.VisualBasic.dll - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll - True + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.2.0.0-rc4\lib\netstandard1.3\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.2.0.0-rc\lib\net46\Microsoft.CodeAnalysis.Workspaces.dll - True + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.2.0.0-rc4\lib\net46\Microsoft.CodeAnalysis.Workspaces.dll - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.2.0.0-rc\lib\net46\Microsoft.CodeAnalysis.Workspaces.Desktop.dll - True + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.2.0.0-rc4\lib\net46\Microsoft.CodeAnalysis.Workspaces.Desktop.dll - ..\packages\System.AppContext.4.1.0\lib\net46\System.AppContext.dll - True + ..\packages\System.AppContext.4.3.0\lib\net46\System.AppContext.dll - ..\packages\System.Collections.Immutable.1.3.0\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + ..\packages\System.Collections.Immutable.1.3.1\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll True - - ..\packages\System.Console.4.0.0\lib\net46\System.Console.dll - True + + ..\packages\Microsoft.Composition.1.0.30\lib\portable-net45+win8+wp8+wpa81\System.Composition.AttributedModel.dll + + + ..\packages\Microsoft.Composition.1.0.30\lib\portable-net45+win8+wp8+wpa81\System.Composition.Convention.dll + + + ..\packages\Microsoft.Composition.1.0.30\lib\portable-net45+win8+wp8+wpa81\System.Composition.Hosting.dll + + + ..\packages\Microsoft.Composition.1.0.30\lib\portable-net45+win8+wp8+wpa81\System.Composition.Runtime.dll + + + ..\packages\Microsoft.Composition.1.0.30\lib\portable-net45+win8+wp8+wpa81\System.Composition.TypedParts.dll + + + ..\packages\System.Console.4.3.0\lib\net46\System.Console.dll - - ..\packages\System.Diagnostics.FileVersionInfo.4.0.0\lib\net46\System.Diagnostics.FileVersionInfo.dll - True + + ..\packages\System.Diagnostics.FileVersionInfo.4.3.0\lib\net46\System.Diagnostics.FileVersionInfo.dll - - ..\packages\System.Diagnostics.StackTrace.4.0.1\lib\net46\System.Diagnostics.StackTrace.dll - True + + ..\packages\System.Diagnostics.StackTrace.4.3.0\lib\net46\System.Diagnostics.StackTrace.dll - - ..\packages\System.IO.Compression.4.1.0\lib\net46\System.IO.Compression.dll - True + + ..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll - - ..\packages\System.IO.FileSystem.4.0.1\lib\net46\System.IO.FileSystem.dll - True + + ..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll - - ..\packages\System.IO.FileSystem.Primitives.4.0.1\lib\net46\System.IO.FileSystem.Primitives.dll - True + + ..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll - ..\packages\System.Reflection.Metadata.1.4.1-beta-24430-01\lib\portable-net45+win8\System.Reflection.Metadata.dll - True + ..\packages\System.Reflection.Metadata.1.4.2\lib\portable-net45+win8\System.Reflection.Metadata.dll ..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll True - - ..\packages\System.Security.Cryptography.Encoding.4.0.0\lib\net46\System.Security.Cryptography.Encoding.dll - True + + ..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll ..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll True - - ..\packages\System.Security.Cryptography.X509Certificates.4.1.0\lib\net461\System.Security.Cryptography.X509Certificates.dll - True + + ..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll - - ..\packages\System.Text.Encoding.CodePages.4.0.1\lib\net46\System.Text.Encoding.CodePages.dll - True + + ..\packages\System.Text.Encoding.CodePages.4.3.0\lib\net46\System.Text.Encoding.CodePages.dll - - ..\packages\System.Threading.Thread.4.0.0\lib\net46\System.Threading.Thread.dll - True + + ..\packages\System.Threading.Thread.4.3.0\lib\net46\System.Threading.Thread.dll + + + ..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll - - ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.AttributedModel.dll + + ..\packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll - - ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Convention.dll + + ..\packages\System.Xml.XmlDocument.4.3.0\lib\net46\System.Xml.XmlDocument.dll - - ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Hosting.dll + + ..\packages\System.Xml.XPath.4.3.0\lib\net46\System.Xml.XPath.dll - - ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.Runtime.dll - - - ..\packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.TypedParts.dll - - - ..\packages\System.Xml.XmlDocument.4.0.1\lib\net46\System.Xml.XmlDocument.dll - True - - - ..\packages\System.Xml.XPath.4.0.1\lib\net46\System.Xml.XPath.dll - True - - - ..\packages\System.Xml.XPath.XDocument.4.0.1\lib\net46\System.Xml.XPath.XDocument.dll - True + + ..\packages\System.Xml.XPath.XDocument.4.3.0\lib\net46\System.Xml.XPath.XDocument.dll ..\packages\xunit.abstractions.2.0.1\lib\net35\xunit.abstractions.dll @@ -1159,25 +1148,25 @@ AssemblyInfoBase.cs - - - - {18236d33-b3e1-45dc-99e7-230633a228b6} RefactoringEssentials + + + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - + diff --git a/Tests.2017/app.config b/Tests.2017/app.config index 7f87c86f..4d601271 100644 --- a/Tests.2017/app.config +++ b/Tests.2017/app.config @@ -32,7 +32,7 @@ - + @@ -42,6 +42,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests.2017/packages.config b/Tests.2017/packages.config index 6998fb63..c2782e77 100644 --- a/Tests.2017/packages.config +++ b/Tests.2017/packages.config @@ -1,67 +1,69 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - \ No newline at end of file From 1dc8f74e1e7307c1e1068698f83f099f73c7bfb3 Mon Sep 17 00:00:00 2001 From: Christoph Wille Date: Mon, 13 Feb 2017 13:49:37 +0100 Subject: [PATCH 084/236] Re-enable RE2017 build flag, see commit https://github.com/icsharpcode/RefactoringEssentials/commit/89358253c9c3f05b5e3655c41a8ea047b50148ee#diff-a205231dd82fe7ae025b14b56d96617f for potentially better impl --- RefactoringEssentials.2017/RefactoringEssentials.csproj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/RefactoringEssentials.2017/RefactoringEssentials.csproj b/RefactoringEssentials.2017/RefactoringEssentials.csproj index 7727ad88..3630fb66 100644 --- a/RefactoringEssentials.2017/RefactoringEssentials.csproj +++ b/RefactoringEssentials.2017/RefactoringEssentials.csproj @@ -10,6 +10,12 @@ Copyright 2010-2017 AlphaSierraPapa and Xamarin Inc. 5.0.0.0 + + TRACE;DEBUG;NETSTANDARD1_3;RE2017 + + + TRACE;RELEASE;NETSTANDARD1_3;RE2017 + Common\CodeContractsCodeRefactoringProvider.cs From ff1bf28366a6e04106dd84f9d0c9bcb6ea6dc685 Mon Sep 17 00:00:00 2001 From: Christoph Wille Date: Mon, 13 Feb 2017 15:11:50 +0100 Subject: [PATCH 085/236] Fix up prerequisites for installation --- Vsix.2017/source.extension.tt | 3 +-- Vsix.2017/source.extension.vsixmanifest | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Vsix.2017/source.extension.tt b/Vsix.2017/source.extension.tt index 5f4bbb01..edcee98a 100644 --- a/Vsix.2017/source.extension.tt +++ b/Vsix.2017/source.extension.tt @@ -29,7 +29,6 @@ - - + \ No newline at end of file diff --git a/Vsix.2017/source.extension.vsixmanifest b/Vsix.2017/source.extension.vsixmanifest index afeabcac..66216ee7 100644 --- a/Vsix.2017/source.extension.vsixmanifest +++ b/Vsix.2017/source.extension.vsixmanifest @@ -26,7 +26,6 @@ - - + \ No newline at end of file From 554c37163c3c2078a89cf30bb39138230684212c Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Wed, 15 Feb 2017 20:13:57 +0100 Subject: [PATCH 086/236] Fix referenced packages in DocGenerator.2017 --- DocGenerator.2017/DocGenerator.csproj | 135 +++++++++++++------------- DocGenerator.2017/app.config | 38 +++++++- DocGenerator.2017/packages.config | 111 ++++++++++----------- 3 files changed, 163 insertions(+), 121 deletions(-) diff --git a/DocGenerator.2017/DocGenerator.csproj b/DocGenerator.2017/DocGenerator.csproj index e828a07b..e2a08ae4 100644 --- a/DocGenerator.2017/DocGenerator.csproj +++ b/DocGenerator.2017/DocGenerator.csproj @@ -1,6 +1,6 @@  - + Debug @@ -54,100 +54,102 @@ + + ..\packages\ManagedEsent.1.9.4\lib\net40\Esent.Interop.dll + - ..\packages\Microsoft.CodeAnalysis.Common.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.dll - True + ..\packages\Microsoft.CodeAnalysis.Common.2.0.0-rc4\lib\netstandard1.3\Microsoft.CodeAnalysis.dll - ..\packages\Microsoft.CodeAnalysis.CSharp.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.dll - True + ..\packages\Microsoft.CodeAnalysis.CSharp.2.0.0-rc4\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.dll - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.Workspaces.dll - True + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.2.0.0-rc4\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + + + ..\packages\Microsoft.CodeAnalysis.Elfie.0.10.6-rc2\lib\net46\Microsoft.CodeAnalysis.Elfie.dll - ..\packages\Microsoft.CodeAnalysis.VisualBasic.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.VisualBasic.dll - True + ..\packages\Microsoft.CodeAnalysis.VisualBasic.2.0.0-rc4\lib\netstandard1.3\Microsoft.CodeAnalysis.VisualBasic.dll - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.2.0.0-rc\lib\netstandard1.3\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll - True + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.2.0.0-rc4\lib\netstandard1.3\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.2.0.0-rc\lib\net46\Microsoft.CodeAnalysis.Workspaces.dll - True + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.2.0.0-rc4\lib\net46\Microsoft.CodeAnalysis.Workspaces.dll - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.2.0.0-rc\lib\net46\Microsoft.CodeAnalysis.Workspaces.Desktop.dll - True + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.2.0.0-rc4\lib\net46\Microsoft.CodeAnalysis.Workspaces.Desktop.dll - ..\packages\System.AppContext.4.1.0\lib\net46\System.AppContext.dll - True + ..\packages\System.AppContext.4.3.0\lib\net46\System.AppContext.dll - ..\packages\System.Collections.Immutable.1.3.0\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + ..\packages\System.Collections.Immutable.1.3.1\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll True - - ..\Packages\Microsoft.Composition.1.0.27\lib\portable-net45+win8+wp8+wpa81\System.Composition.AttributedModel.dll + + ..\packages\Microsoft.Composition.1.0.30\lib\portable-net45+win8+wp8+wpa81\System.Composition.AttributedModel.dll - - ..\packages\System.Console.4.0.0\lib\net46\System.Console.dll - True + + ..\packages\Microsoft.Composition.1.0.30\lib\portable-net45+win8+wp8+wpa81\System.Composition.Convention.dll + + + ..\packages\Microsoft.Composition.1.0.30\lib\portable-net45+win8+wp8+wpa81\System.Composition.Hosting.dll + + + ..\packages\Microsoft.Composition.1.0.30\lib\portable-net45+win8+wp8+wpa81\System.Composition.Runtime.dll + + + ..\packages\Microsoft.Composition.1.0.30\lib\portable-net45+win8+wp8+wpa81\System.Composition.TypedParts.dll + + + ..\packages\System.Console.4.3.0\lib\net46\System.Console.dll - - ..\packages\System.Diagnostics.FileVersionInfo.4.0.0\lib\net46\System.Diagnostics.FileVersionInfo.dll - True + + ..\packages\System.Diagnostics.FileVersionInfo.4.3.0\lib\net46\System.Diagnostics.FileVersionInfo.dll - - ..\packages\System.Diagnostics.StackTrace.4.0.1\lib\net46\System.Diagnostics.StackTrace.dll - True + + ..\packages\System.Diagnostics.StackTrace.4.3.0\lib\net46\System.Diagnostics.StackTrace.dll - - ..\packages\System.IO.Compression.4.1.0\lib\net46\System.IO.Compression.dll - True + + ..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll - - ..\packages\System.IO.FileSystem.4.0.1\lib\net46\System.IO.FileSystem.dll - True + + ..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll - - ..\packages\System.IO.FileSystem.Primitives.4.0.1\lib\net46\System.IO.FileSystem.Primitives.dll - True + + ..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll - ..\packages\System.Reflection.Metadata.1.4.1-beta-24430-01\lib\portable-net45+win8\System.Reflection.Metadata.dll - True + ..\packages\System.Reflection.Metadata.1.4.2\lib\portable-net45+win8\System.Reflection.Metadata.dll ..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll True - - ..\packages\System.Security.Cryptography.Encoding.4.0.0\lib\net46\System.Security.Cryptography.Encoding.dll - True + + ..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll ..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll True - - ..\packages\System.Security.Cryptography.X509Certificates.4.1.0\lib\net461\System.Security.Cryptography.X509Certificates.dll - True + + ..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll - - ..\packages\System.Text.Encoding.CodePages.4.0.1\lib\net46\System.Text.Encoding.CodePages.dll - True + + ..\packages\System.Text.Encoding.CodePages.4.3.0\lib\net46\System.Text.Encoding.CodePages.dll - - ..\packages\System.Threading.Thread.4.0.0\lib\net46\System.Threading.Thread.dll - True + + ..\packages\System.Threading.Thread.4.3.0\lib\net46\System.Threading.Thread.dll + + + ..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll @@ -155,17 +157,17 @@ - - ..\packages\System.Xml.XmlDocument.4.0.1\lib\net46\System.Xml.XmlDocument.dll - True + + ..\packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll - - ..\packages\System.Xml.XPath.4.0.1\lib\net46\System.Xml.XPath.dll - True + + ..\packages\System.Xml.XmlDocument.4.3.0\lib\net46\System.Xml.XmlDocument.dll - - ..\packages\System.Xml.XPath.XDocument.4.0.1\lib\net46\System.Xml.XPath.XDocument.dll - True + + ..\packages\System.Xml.XPath.4.3.0\lib\net46\System.Xml.XPath.dll + + + ..\packages\System.Xml.XPath.XDocument.4.3.0\lib\net46\System.Xml.XPath.XDocument.dll @@ -187,10 +189,6 @@ - - - - {18236d33-b3e1-45dc-99e7-230633a228b6} @@ -204,6 +202,11 @@ AssemblyInfoBase.cs + + + + + @@ -211,7 +214,7 @@ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - + false - bin\Debug_Mono + bin\Debug_Mono.2017 4 Vsix false - bin\Mono_Release + bin\Mono_Release.2017 4 Vsix From afd46388082e03dd7acfd468f3a5e3a31558359c Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 16 Feb 2017 12:49:16 +0100 Subject: [PATCH 093/236] Fix crashes in various property refactorings when working with expression-bodied properties --- ...opertyToPropertyCodeRefactoringProvider.cs | 2 +- ...ToExpressionBodyCodeRefactoringProvider.cs | 2 +- ...yAndBackingFieldCodeRefactoringProvider.cs | 2 +- ...WithAutoPropertyCodeRefactoringProvider.cs | 13 ++++++++----- ...irtualConversionCodeRefactoringProvider.cs | 6 ++++-- .../ConvertAutoPropertyToPropertyTests.cs | 11 ++++++++++- ...nvertStatementBodyToExpressionBodyTests.cs | 19 +++++++++++++++++++ ...ropertyWithPropertyAndBackingFieldTests.cs | 14 ++++++++++++++ 8 files changed, 58 insertions(+), 11 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertAutoPropertyToPropertyCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertAutoPropertyToPropertyCodeRefactoringProvider.cs index 5bc22878..8730598c 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertAutoPropertyToPropertyCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertAutoPropertyToPropertyCodeRefactoringProvider.cs @@ -33,7 +33,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte if (property == null || !property.Identifier.Span.Contains(span)) return; - if (property.AccessorList.Accessors.Any(b => b.Body != null)) //ignore properties with >=1 accessor body + if (property.AccessorList?.Accessors.Any(b => b.Body != null) != false) //ignore properties with >=1 accessor body return; TypeDeclarationSyntax enclosingTypeDeclaration = property.Ancestors().OfType().FirstOrDefault(); diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertStatementBodyToExpressionBodyCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertStatementBodyToExpressionBodyCodeRefactoringProvider.cs index 7f4d8bc9..f7205fa3 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertStatementBodyToExpressionBodyCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertStatementBodyToExpressionBodyCodeRefactoringProvider.cs @@ -114,7 +114,7 @@ static void HandleMethodCase(CodeRefactoringContext context, SyntaxNode root, Sy static void HandlePropertyCase(CodeRefactoringContext context, SyntaxNode root, SyntaxToken token, PropertyDeclarationSyntax property) { - var getter = property.AccessorList.Accessors.FirstOrDefault(acc => acc.IsKind(SyntaxKind.GetAccessorDeclaration)); + var getter = property.AccessorList?.Accessors.FirstOrDefault(acc => acc.IsKind(SyntaxKind.GetAccessorDeclaration)); ExpressionSyntax expr; if (getter == null || property.AccessorList.Accessors.Count != 1 || !IsSimpleReturn(getter.Body, out expr)) return; diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider.cs index d33bfe73..2c5a56ba 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceAutoPropertyWithPropertyAndBackingFieldCodeRefactoringProvider.cs @@ -32,7 +32,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte if (property == null || !property.Identifier.Span.Contains(span)) return; - if (property.AccessorList.Accessors.Any(b => !IsEmptyOrNotImplemented(b.Body))) //ignore properties with >=1 accessor body + if (property.AccessorList?.Accessors.Any(b => !IsEmptyOrNotImplemented(b.Body)) != false) //ignore properties with >=1 accessor body return; TypeDeclarationSyntax enclosingTypeDeclaration = property.Ancestors().OfType().FirstOrDefault(); diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplacePropertyWithBackingFieldWithAutoPropertyCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplacePropertyWithBackingFieldWithAutoPropertyCodeRefactoringProvider.cs index 9e095dcd..6fb9e0ff 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplacePropertyWithBackingFieldWithAutoPropertyCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplacePropertyWithBackingFieldWithAutoPropertyCodeRefactoringProvider.cs @@ -73,8 +73,8 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte static bool IsEmptyComputedProperty(PropertyDeclarationSyntax property) { - var getter = property.AccessorList.Accessors.FirstOrDefault (a => a.IsKind (SyntaxKind.GetAccessorDeclaration)); - var setter = property.AccessorList.Accessors.FirstOrDefault (a => a.IsKind (SyntaxKind.SetAccessorDeclaration)); + var getter = property.AccessorList?.Accessors.FirstOrDefault (a => a.IsKind (SyntaxKind.GetAccessorDeclaration)); + var setter = property.AccessorList?.Accessors.FirstOrDefault (a => a.IsKind (SyntaxKind.SetAccessorDeclaration)); return getter != null && setter != null && IsNotImplemented(getter.Body) && IsNotImplemented(setter.Body); } static bool IsNotImplemented(BlockSyntax body) @@ -127,11 +127,14 @@ private Document PerformAction(Document document, SemanticModel model, SyntaxNod internal static IFieldSymbol GetBackingField(SemanticModel model, PropertyDeclarationSyntax property) { - var getter = property.AccessorList.Accessors.FirstOrDefault(a => a.IsKind(SyntaxKind.GetAccessorDeclaration)); - var setter = property.AccessorList.Accessors.FirstOrDefault(a => a.IsKind(SyntaxKind.SetAccessorDeclaration)); + if (property == null) + return null; + + var getter = property.AccessorList?.Accessors.FirstOrDefault(a => a.IsKind(SyntaxKind.GetAccessorDeclaration)); + var setter = property.AccessorList?.Accessors.FirstOrDefault(a => a.IsKind(SyntaxKind.SetAccessorDeclaration)); // automatic properties always need getter & setter - if (property == null || getter == null || setter == null || getter.Body == null || setter.Body == null) + if (getter == null || setter == null || getter.Body == null || setter.Body == null) return null; //todo: check version? if (property.Modifiers.Any(m => m.IsKind(SyntaxKind.AbstractKeyword)) || property.Parent is InterfaceDeclarationSyntax) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs index 71541cda..c2d8ef46 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs @@ -264,8 +264,10 @@ static SyntaxNode ImplementAbstractDeclaration(MemberDeclarationSyntax abstractD static bool CheckBody(MemberDeclarationSyntax node) { var property = node as BasePropertyDeclarationSyntax; - if (property != null && property.AccessorList.Accessors.Any(acc => !IsValidBody(acc.Body))) - return false; + if (property != null) { + if (property.AccessorList == null || property.AccessorList.Accessors.Any(acc => !IsValidBody(acc.Body))) + return false; + } var m = node as MethodDeclarationSyntax; if (m != null && !IsValidBody(m.Body)) diff --git a/Tests/CSharp/CodeRefactorings/ConvertAutoPropertyToPropertyTests.cs b/Tests/CSharp/CodeRefactorings/ConvertAutoPropertyToPropertyTests.cs index dc78e041..9d01c67f 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertAutoPropertyToPropertyTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertAutoPropertyToPropertyTests.cs @@ -28,7 +28,16 @@ string Test }"); } - [Fact(Skip="TODO")] + [Fact] + public void TestExpressionBodyNoCrash() + { + TestWrongContext(@"class TestClass +{ + string $Test => ""Hello World!""; +}"); + } + + [Fact(Skip = "Simplifier.Annotation not working! (bug in Roslyn)")] public void TestSimplify() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ConvertStatementBodyToExpressionBodyTests.cs b/Tests/CSharp/CodeRefactorings/ConvertStatementBodyToExpressionBodyTests.cs index 6b5d5d55..4194c6ed 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertStatementBodyToExpressionBodyTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertStatementBodyToExpressionBodyTests.cs @@ -91,6 +91,15 @@ int TestMethod(int i) }"); } + [Fact] + public void TestMethodWithExpressionBody() + { + TestWrongContext(@" +class TestClass +{ + int TestMethod(int i) => i << 8; +}"); + } [Fact] public void TestPropertyName() @@ -161,6 +170,16 @@ class TestClass }"); } + [Fact] + public void TestPropertyWithExpressionBody() + { + TestWrongContext(@" +class TestClass +{ + int $TestProperty => 5; +}"); + } + [Fact] public void TestIndexerName() { diff --git a/Tests/CSharp/CodeRefactorings/ReplaceAutoPropertyWithPropertyAndBackingFieldTests.cs b/Tests/CSharp/CodeRefactorings/ReplaceAutoPropertyWithPropertyAndBackingFieldTests.cs index fe9a301f..4b0b1cc0 100644 --- a/Tests/CSharp/CodeRefactorings/ReplaceAutoPropertyWithPropertyAndBackingFieldTests.cs +++ b/Tests/CSharp/CodeRefactorings/ReplaceAutoPropertyWithPropertyAndBackingFieldTests.cs @@ -83,6 +83,20 @@ public string Test ${ }"); } + [Fact] + public void TestAlreadyExpressionBody() + { + TestWrongContext(@"class TestClass +{ + public string Test => string.Empty; +}"); + + TestWrongContext(@"class TestClass +{ + string FooBar.Test => string.Empty; +}"); + } + [Fact] public void TestUnimplementedComputedProperty() From 0c09d9d5e32e76bfea6ad45578fae8a1deaeae29 Mon Sep 17 00:00:00 2001 From: Marius Ungureanu Date: Thu, 16 Feb 2017 15:15:32 +0200 Subject: [PATCH 094/236] [Refactoring] Optimize NotNull refactoring provider Move invariant of formatted strings outside the loop. Optimizes allocations done in HasReturnContract --- .../ContractEnsuresNotNullReturnRefactoringProvider.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractEnsuresNotNullReturnRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractEnsuresNotNullReturnRefactoringProvider.cs index 03b7f7a6..c9554083 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractEnsuresNotNullReturnRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ContractEnsuresNotNullReturnRefactoringProvider.cs @@ -103,14 +103,13 @@ static bool HasReturnContract(BlockSyntax bodyStatement, string returnType) { var workspace = new AdhocWorkspace(); + var rhsEnsures = $"Contract.Ensures(Contract.Result<{returnType}>() != null);"; + var lhsEnsures = $"Contract.Ensures(null != Contract.Result<{returnType}>());"; foreach (var expression in bodyStatement.DescendantNodes().OfType()) { var formatted = Formatter.Format(expression, workspace).ToString(); - if (formatted == $"Contract.Ensures(Contract.Result<{returnType}>() != null);") - return true; - - if (formatted == $"Contract.Ensures(null != Contract.Result<{returnType}>());") + if (formatted == rhsEnsures || formatted == lhsEnsures) return true; } return false; From 03a3eb07c701714ad9b442448a6056a28a68cbcc Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 16 Feb 2017 14:33:20 +0100 Subject: [PATCH 095/236] fix bug introduced by f1b429faaf97f3bcf62f78f0ca179467f2ac0acc --- ...irtualConversionCodeRefactoringProvider.cs | 21 ++------------- ...bstractVirtualNonVirtualConversionTests.cs | 26 ++++++++++++++----- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs index c2d8ef46..08077ccc 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs @@ -42,11 +42,10 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte if (declaration == null || declaration is BaseTypeDeclarationSyntax || declaration is ConstructorDeclarationSyntax - || declaration is DestructorDeclarationSyntax - || declaration.GetBodies().IsEmpty()) + || declaration is DestructorDeclarationSyntax) return; var modifiers = declaration.GetModifiers(); - if (modifiers.Any(m => m.IsKind(SyntaxKind.OverrideKeyword))) + if (modifiers.Any(m => m.IsKind(SyntaxKind.OverrideKeyword, SyntaxKind.ExternKeyword))) return; TypeDeclarationSyntax enclosingTypeDeclaration = declaration.Ancestors().OfType().FirstOrDefault(); @@ -55,24 +54,8 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte var explicitInterface = declaration.GetExplicitInterfaceSpecifierSyntax(); if (explicitInterface != null) - { return; - } - // if (selectedNode != node.NameToken) { - // if ((node is EventDeclaration && node is CustomEventDeclaration || selectedNode.Role != Roles.Identifier) && - // selectedNode.Role != IndexerDeclaration.ThisKeywordRole) { - // var modToken = selectedNode as CSharpModifierToken; - // if (modToken == null || (modToken.Modifier & (Modifiers.Abstract | Modifiers.Virtual)) == 0) - // yield break; - // } else { - // if (!(node is EventDeclaration || node is CustomEventDeclaration) && selectedNode.Parent != node) - // yield break; - // } - // } - // if (!node.GetChildByRole(EntityDeclaration.PrivateImplementationTypeRole).IsNull) - // yield break; - // if (enclosingTypeDeclaration.Modifiers.Any(m => m.IsKind(SyntaxKind.AbstractKeyword))) { if (modifiers.Any(m => m.IsKind(SyntaxKind.AbstractKeyword))) diff --git a/Tests/CSharp/CodeRefactorings/ToAbstractVirtualNonVirtualConversionTests.cs b/Tests/CSharp/CodeRefactorings/ToAbstractVirtualNonVirtualConversionTests.cs index 5360a730..b8f9d43f 100644 --- a/Tests/CSharp/CodeRefactorings/ToAbstractVirtualNonVirtualConversionTests.cs +++ b/Tests/CSharp/CodeRefactorings/ToAbstractVirtualNonVirtualConversionTests.cs @@ -101,7 +101,7 @@ class Test : IDisposable }"); } - [Fact(Skip = "broken")] + [Fact] public void AbstractToNonAbstractTest() { Test( @@ -117,7 +117,7 @@ public void Foo() }"); } - [Fact(Skip = "broken")] + [Fact] public void AbstractToVirtualTest() { Test( @@ -133,7 +133,7 @@ public virtual void Foo() }", 1); } - [Fact(Skip = "broken")] + [Fact] public void AbstractPropertyToNonAbstractTest() { Test( @@ -161,7 +161,7 @@ public int Foo }"); } - [Fact(Skip="broken")] + [Fact] public void AbstractEventToNonAbstractTest() { Test( @@ -176,7 +176,7 @@ abstract class Test }"); } - [Fact(Skip = "broken")] + [Fact] public void NonAbstractToAbstractTest() { Test( @@ -192,7 +192,7 @@ public void NonAbstractToAbstractTest() }"); } - [Fact(Skip = "broken")] + [Fact] public void NonAbstractEventToAbstractTest() { Test( @@ -253,6 +253,20 @@ class Test }"); } + [Fact] + public void ExternMethodTest() + { + TestWrongContext( + @"using System; +using System.Runtime.InteropServices; + +class Test +{ + [DllImport(""user32.dll"")] + static extern bool $CloseWindow(IntPtr hWnd); +}"); + } + [Fact] public void InvalidMethodTest() { From 94d5312ba6690a2c7bd1e894683a53256387053e Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 16 Feb 2017 15:13:20 +0100 Subject: [PATCH 096/236] use GetExplicitTypeSyntax in PutInsideUsingAction --- ...WithExplicitTypeCodeRefactoringProvider.cs | 21 +++++++++---------- .../Uncategorized/PutInsideUsingAction.cs | 11 +++------- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceVarWithExplicitTypeCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceVarWithExplicitTypeCodeRefactoringProvider.cs index b834061e..baa3a6f2 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceVarWithExplicitTypeCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceVarWithExplicitTypeCodeRefactoringProvider.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp; +using System; namespace RefactoringEssentials.CSharp.CodeRefactorings { @@ -46,32 +47,30 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte type = model.GetTypeInfo(foreachStatement.Type).Type; typeSyntax = foreachStatement.Type; } - if (type == null || !typeSyntax.IsVar || type.TypeKind == TypeKind.Error || type.TypeKind == TypeKind.Unknown) return; if (!(type.SpecialType != SpecialType.System_Nullable_T && type.TypeKind != TypeKind.Unknown && !ContainsAnonymousType(type))) - { return; - } context.RegisterRefactoring( CodeActionFactory.Create( token.Span, DiagnosticSeverity.Info, GettextCatalog.GetString("To explicit type"), - t2 => Task.FromResult(PerformAction(document, model, root, type, typeSyntax)) + t2 => Task.FromResult(PerformAction(document, root, typeSyntax, GetExplicitTypeSyntax(model, type, typeSyntax))) ) ); } - static Document PerformAction(Document document, SemanticModel model, SyntaxNode root, ITypeSymbol type, TypeSyntax typeSyntax) + public static TypeSyntax GetExplicitTypeSyntax(SemanticModel model, ISymbol type, TypeSyntax typeSyntax) { - var newRoot = root.ReplaceNode((SyntaxNode) - typeSyntax, - SyntaxFactory.ParseTypeName(type.ToMinimalDisplayString(model, typeSyntax.SpanStart)) + return SyntaxFactory.ParseTypeName(type.ToMinimalDisplayString(model, typeSyntax.SpanStart)) .WithLeadingTrivia(typeSyntax.GetLeadingTrivia()) - .WithTrailingTrivia(typeSyntax.GetTrailingTrivia()) - ); - return document.WithSyntaxRoot(newRoot); + .WithTrailingTrivia(typeSyntax.GetTrailingTrivia()); + } + + static Document PerformAction(Document document, SyntaxNode root, TypeSyntax typeSyntax, TypeSyntax replacementType) + { + return document.WithSyntaxRoot(root.ReplaceNode(typeSyntax, replacementType)); } static bool ContainsAnonymousType(ITypeSymbol type) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs index 6be965ef..a79a47d7 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs @@ -152,15 +152,10 @@ private static void ExtractVariableDeclarationsBeforeUsing(SemanticModel semanti var localDeclarationTypeSyntax = localDeclarationStmt.Declaration.Type; - if(localDeclarationTypeSyntax.IsVar) + if (localDeclarationTypeSyntax.IsVar) { - var localDeclarationTypeSymbol = semanticModel.GetSymbolInfo(localDeclarationTypeSyntax).Symbol; - - var localDeclarationTypeName = localDeclarationTypeSymbol.ToMinimalDisplayString(semanticModel, localDeclarationTypeSyntax.SpanStart); - - localDeclarationTypeSyntax = SyntaxFactory.ParseTypeName(localDeclarationTypeName) - .WithLeadingTrivia(localDeclarationTypeSyntax.GetLeadingTrivia()) - .WithTrailingTrivia(localDeclarationTypeSyntax.GetTrailingTrivia()); + localDeclarationTypeSyntax = ReplaceVarWithExplicitTypeCodeRefactoringProvider.GetExplicitTypeSyntax( + semanticModel, semanticModel.GetSymbolInfo(localDeclarationTypeSyntax).Symbol, localDeclarationTypeSyntax); } beforeUsing.Add(SyntaxFactory.LocalDeclarationStatement( From 2b0e31aebf57b5a92aa93fd4948910686762bdf7 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 16 Feb 2017 16:30:39 +0100 Subject: [PATCH 097/236] Move GetExplicitTypeSyntax to PutInsideUsingAction (as ReplaceVarWithExplicitTypeCodeRefactoringProvider will be removed in 2017) --- ...eplaceVarWithExplicitTypeCodeRefactoringProvider.cs | 9 +-------- .../Uncategorized/PutInsideUsingAction.cs | 10 ++++++++-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceVarWithExplicitTypeCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceVarWithExplicitTypeCodeRefactoringProvider.cs index baa3a6f2..a92c7297 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceVarWithExplicitTypeCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceVarWithExplicitTypeCodeRefactoringProvider.cs @@ -56,18 +56,11 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte token.Span, DiagnosticSeverity.Info, GettextCatalog.GetString("To explicit type"), - t2 => Task.FromResult(PerformAction(document, root, typeSyntax, GetExplicitTypeSyntax(model, type, typeSyntax))) + t2 => Task.FromResult(PerformAction(document, root, typeSyntax, PutInsideUsingAction.GetExplicitTypeSyntax(model, type, typeSyntax))) ) ); } - public static TypeSyntax GetExplicitTypeSyntax(SemanticModel model, ISymbol type, TypeSyntax typeSyntax) - { - return SyntaxFactory.ParseTypeName(type.ToMinimalDisplayString(model, typeSyntax.SpanStart)) - .WithLeadingTrivia(typeSyntax.GetLeadingTrivia()) - .WithTrailingTrivia(typeSyntax.GetTrailingTrivia()); - } - static Document PerformAction(Document document, SyntaxNode root, TypeSyntax typeSyntax, TypeSyntax replacementType) { return document.WithSyntaxRoot(root.ReplaceNode(typeSyntax, replacementType)); diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs index a79a47d7..10f469bd 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs @@ -154,8 +154,7 @@ private static void ExtractVariableDeclarationsBeforeUsing(SemanticModel semanti if (localDeclarationTypeSyntax.IsVar) { - localDeclarationTypeSyntax = ReplaceVarWithExplicitTypeCodeRefactoringProvider.GetExplicitTypeSyntax( - semanticModel, semanticModel.GetSymbolInfo(localDeclarationTypeSyntax).Symbol, localDeclarationTypeSyntax); + localDeclarationTypeSyntax = GetExplicitTypeSyntax(semanticModel, semanticModel.GetSymbolInfo(localDeclarationTypeSyntax).Symbol, localDeclarationTypeSyntax); } beforeUsing.Add(SyntaxFactory.LocalDeclarationStatement( @@ -169,6 +168,13 @@ private static void ExtractVariableDeclarationsBeforeUsing(SemanticModel semanti } } + public static TypeSyntax GetExplicitTypeSyntax(SemanticModel model, ISymbol type, TypeSyntax typeSyntax) + { + return SyntaxFactory.ParseTypeName(type.ToMinimalDisplayString(model, typeSyntax.SpanStart)) + .WithLeadingTrivia(typeSyntax.GetLeadingTrivia()) + .WithTrailingTrivia(typeSyntax.GetTrailingTrivia()); + } + private static bool IsEndingWithDispose(SemanticModel semanticModel, List insideUsing, ILocalSymbol disposableLocal) { var lastInUsingAsCall = (((insideUsing.LastOrDefault() as ExpressionStatementSyntax)?.Expression as InvocationExpressionSyntax)?.Expression as MemberAccessExpressionSyntax); From 3b356f81f10bad78da374207ca342b5875131879 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 16 Feb 2017 18:36:56 +0100 Subject: [PATCH 098/236] Workaround for strange MEF exception: No idea what's going on in VS 2015: A MEF Component threw an exception at runtime: System.InvalidCastException: Unable to cast object of type 'System.Reflection.RuntimeMethodInfo' to type 'System.Reflection.ConstructorInfo'. at Microsoft.VisualStudio.Composition.Reflection.ResolverExtensions.Resolve(ConstructorRef constructorRef) at Microsoft.VisualStudio.Composition.RuntimeComposition.RuntimePart.get_ImportingConstructor() at Microsoft.VisualStudio.Composition.RuntimeExportProviderFactory.RuntimeExportProvider.RuntimePartLifecycleTracker.CreateValue() at Microsoft.VisualStudio.Composition.ExportProvider.PartLifecycleTracker.Create() at Microsoft.VisualStudio.Composition.ExportProvider.PartLifecycleTracker.MoveNext(PartLifecycleState nextState) at Microsoft.VisualStudio.Composition.ExportProvider.PartLifecycleTracker.MoveToState(PartLifecycleState requiredState) at Microsoft.VisualStudio.Composition.ExportProvider.PartLifecycleTracker.GetValueReadyToExpose() at Microsoft.VisualStudio.Composition.RuntimeExportProviderFactory.RuntimeExportProvider.<>c__DisplayClass15_0.b__0() --- ...WithExplicitTypeCodeRefactoringProvider.cs | 2 +- .../Uncategorized/PutInsideUsingAction.cs | 10 +- RefactoringEssentials/Util/CSharpUtil.cs | 162 +++++++++--------- 3 files changed, 84 insertions(+), 90 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceVarWithExplicitTypeCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceVarWithExplicitTypeCodeRefactoringProvider.cs index a92c7297..9ae743a4 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceVarWithExplicitTypeCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ReplaceVarWithExplicitTypeCodeRefactoringProvider.cs @@ -56,7 +56,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte token.Span, DiagnosticSeverity.Info, GettextCatalog.GetString("To explicit type"), - t2 => Task.FromResult(PerformAction(document, root, typeSyntax, PutInsideUsingAction.GetExplicitTypeSyntax(model, type, typeSyntax))) + t2 => Task.FromResult(PerformAction(document, root, typeSyntax, type.ToSyntax(model, typeSyntax))) ) ); } diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs index 10f469bd..f785b5b5 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/PutInsideUsingAction.cs @@ -154,7 +154,8 @@ private static void ExtractVariableDeclarationsBeforeUsing(SemanticModel semanti if (localDeclarationTypeSyntax.IsVar) { - localDeclarationTypeSyntax = GetExplicitTypeSyntax(semanticModel, semanticModel.GetSymbolInfo(localDeclarationTypeSyntax).Symbol, localDeclarationTypeSyntax); + var localDeclarationType = (ITypeSymbol)semanticModel.GetSymbolInfo(localDeclarationTypeSyntax).Symbol; + localDeclarationTypeSyntax = localDeclarationType.ToSyntax(semanticModel, localDeclarationTypeSyntax); } beforeUsing.Add(SyntaxFactory.LocalDeclarationStatement( @@ -168,13 +169,6 @@ private static void ExtractVariableDeclarationsBeforeUsing(SemanticModel semanti } } - public static TypeSyntax GetExplicitTypeSyntax(SemanticModel model, ISymbol type, TypeSyntax typeSyntax) - { - return SyntaxFactory.ParseTypeName(type.ToMinimalDisplayString(model, typeSyntax.SpanStart)) - .WithLeadingTrivia(typeSyntax.GetLeadingTrivia()) - .WithTrailingTrivia(typeSyntax.GetTrailingTrivia()); - } - private static bool IsEndingWithDispose(SemanticModel semanticModel, List insideUsing, ILocalSymbol disposableLocal) { var lastInUsingAsCall = (((insideUsing.LastOrDefault() as ExpressionStatementSyntax)?.Expression as InvocationExpressionSyntax)?.Expression as MemberAccessExpressionSyntax); diff --git a/RefactoringEssentials/Util/CSharpUtil.cs b/RefactoringEssentials/Util/CSharpUtil.cs index 3ae88549..78930c6a 100644 --- a/RefactoringEssentials/Util/CSharpUtil.cs +++ b/RefactoringEssentials/Util/CSharpUtil.cs @@ -19,16 +19,13 @@ public static ExpressionSyntax InvertCondition(ExpressionSyntax condition) static ExpressionSyntax InvertConditionInternal(ExpressionSyntax condition) { - if (condition is ParenthesizedExpressionSyntax) - { + if (condition is ParenthesizedExpressionSyntax) { return SyntaxFactory.ParenthesizedExpression(InvertCondition(((ParenthesizedExpressionSyntax)condition).Expression)); } - if (condition is PrefixUnaryExpressionSyntax) - { + if (condition is PrefixUnaryExpressionSyntax) { var uOp = (PrefixUnaryExpressionSyntax)condition; - if (uOp.IsKind(SyntaxKind.LogicalNotExpression)) - { + if (uOp.IsKind(SyntaxKind.LogicalNotExpression)) { if (!(uOp.Parent is ExpressionSyntax)) return uOp.Operand.SkipParens(); return uOp.Operand; @@ -36,8 +33,7 @@ static ExpressionSyntax InvertConditionInternal(ExpressionSyntax condition) return SyntaxFactory.PrefixUnaryExpression(SyntaxKind.LogicalNotExpression, uOp); } - if (condition is BinaryExpressionSyntax) - { + if (condition is BinaryExpressionSyntax) { var bOp = (BinaryExpressionSyntax)condition; if (bOp.IsKind(SyntaxKind.LogicalAndExpression) || bOp.IsKind(SyntaxKind.LogicalOrExpression)) @@ -54,14 +50,12 @@ static ExpressionSyntax InvertConditionInternal(ExpressionSyntax condition) return SyntaxFactory.PrefixUnaryExpression(SyntaxKind.LogicalNotExpression, SyntaxFactory.ParenthesizedExpression(condition)); } - if (condition is ConditionalExpressionSyntax) - { + if (condition is ConditionalExpressionSyntax) { var cEx = condition as ConditionalExpressionSyntax; return cEx.WithCondition(InvertCondition(cEx.Condition)); } - if (condition is LiteralExpressionSyntax) - { + if (condition is LiteralExpressionSyntax) { if (condition.Kind() == SyntaxKind.TrueLiteralExpression) return SyntaxFactory.LiteralExpression(SyntaxKind.FalseLiteralExpression); if (condition.Kind() == SyntaxKind.FalseLiteralExpression) @@ -72,80 +66,77 @@ static ExpressionSyntax InvertConditionInternal(ExpressionSyntax condition) } - public static SyntaxKind GetExpressionOperatorTokenKind(SyntaxKind op) - { - switch (op) - { - case SyntaxKind.EqualsExpression: - return SyntaxKind.EqualsEqualsToken; - case SyntaxKind.NotEqualsExpression: - return SyntaxKind.ExclamationEqualsToken; - case SyntaxKind.GreaterThanExpression: - return SyntaxKind.GreaterThanToken; - case SyntaxKind.GreaterThanOrEqualExpression: - return SyntaxKind.GreaterThanEqualsToken; - case SyntaxKind.LessThanExpression: - return SyntaxKind.LessThanToken; - case SyntaxKind.LessThanOrEqualExpression: - return SyntaxKind.LessThanEqualsToken; - case SyntaxKind.BitwiseOrExpression: - return SyntaxKind.BarToken; - case SyntaxKind.LogicalOrExpression: - return SyntaxKind.BarBarToken; - case SyntaxKind.BitwiseAndExpression: - return SyntaxKind.AmpersandToken; - case SyntaxKind.LogicalAndExpression: - return SyntaxKind.AmpersandAmpersandToken; - case SyntaxKind.AddExpression: - return SyntaxKind.PlusToken; - case SyntaxKind.SubtractExpression: - return SyntaxKind.MinusToken; - case SyntaxKind.MultiplyExpression: - return SyntaxKind.AsteriskToken; - case SyntaxKind.DivideExpression: - return SyntaxKind.SlashToken; - case SyntaxKind.ModuloExpression: - return SyntaxKind.PercentToken; - // assignments - case SyntaxKind.SimpleAssignmentExpression: - return SyntaxKind.EqualsToken; - case SyntaxKind.AddAssignmentExpression: - return SyntaxKind.PlusEqualsToken; - case SyntaxKind.SubtractAssignmentExpression: - return SyntaxKind.MinusEqualsToken; - // unary - case SyntaxKind.UnaryPlusExpression: - return SyntaxKind.PlusToken; - case SyntaxKind.UnaryMinusExpression: - return SyntaxKind.MinusToken; - case SyntaxKind.LogicalNotExpression: - return SyntaxKind.ExclamationToken; - case SyntaxKind.BitwiseNotExpression: - return SyntaxKind.TildeToken; - } - throw new ArgumentOutOfRangeException(nameof(op)); - } - - /// - /// When negating an expression this is required, otherwise you would end up with - /// a or b -> !a or b - /// - public static ExpressionSyntax AddParensIfRequired(ExpressionSyntax expression, bool parenthesesRequiredForUnaryExpressions = true) + public static SyntaxKind GetExpressionOperatorTokenKind(SyntaxKind op) + { + switch (op) { + case SyntaxKind.EqualsExpression: + return SyntaxKind.EqualsEqualsToken; + case SyntaxKind.NotEqualsExpression: + return SyntaxKind.ExclamationEqualsToken; + case SyntaxKind.GreaterThanExpression: + return SyntaxKind.GreaterThanToken; + case SyntaxKind.GreaterThanOrEqualExpression: + return SyntaxKind.GreaterThanEqualsToken; + case SyntaxKind.LessThanExpression: + return SyntaxKind.LessThanToken; + case SyntaxKind.LessThanOrEqualExpression: + return SyntaxKind.LessThanEqualsToken; + case SyntaxKind.BitwiseOrExpression: + return SyntaxKind.BarToken; + case SyntaxKind.LogicalOrExpression: + return SyntaxKind.BarBarToken; + case SyntaxKind.BitwiseAndExpression: + return SyntaxKind.AmpersandToken; + case SyntaxKind.LogicalAndExpression: + return SyntaxKind.AmpersandAmpersandToken; + case SyntaxKind.AddExpression: + return SyntaxKind.PlusToken; + case SyntaxKind.SubtractExpression: + return SyntaxKind.MinusToken; + case SyntaxKind.MultiplyExpression: + return SyntaxKind.AsteriskToken; + case SyntaxKind.DivideExpression: + return SyntaxKind.SlashToken; + case SyntaxKind.ModuloExpression: + return SyntaxKind.PercentToken; + // assignments + case SyntaxKind.SimpleAssignmentExpression: + return SyntaxKind.EqualsToken; + case SyntaxKind.AddAssignmentExpression: + return SyntaxKind.PlusEqualsToken; + case SyntaxKind.SubtractAssignmentExpression: + return SyntaxKind.MinusEqualsToken; + // unary + case SyntaxKind.UnaryPlusExpression: + return SyntaxKind.PlusToken; + case SyntaxKind.UnaryMinusExpression: + return SyntaxKind.MinusToken; + case SyntaxKind.LogicalNotExpression: + return SyntaxKind.ExclamationToken; + case SyntaxKind.BitwiseNotExpression: + return SyntaxKind.TildeToken; + } + throw new ArgumentOutOfRangeException(nameof(op)); + } + + /// + /// When negating an expression this is required, otherwise you would end up with + /// a or b -> !a or b + /// + public static ExpressionSyntax AddParensIfRequired(ExpressionSyntax expression, bool parenthesesRequiredForUnaryExpressions = true) { if ((expression is BinaryExpressionSyntax) || (expression is AssignmentExpressionSyntax) || (expression is CastExpressionSyntax) || (expression is ParenthesizedLambdaExpressionSyntax) || (expression is SimpleLambdaExpressionSyntax) || - (expression is ConditionalExpressionSyntax)) - { + (expression is ConditionalExpressionSyntax)) { return SyntaxFactory.ParenthesizedExpression(expression); } if (parenthesesRequiredForUnaryExpressions && ((expression is PostfixUnaryExpressionSyntax) || - (expression is PrefixUnaryExpressionSyntax))) - { + (expression is PrefixUnaryExpressionSyntax))) { return SyntaxFactory.ParenthesizedExpression(expression); } @@ -160,8 +151,7 @@ public static ExpressionSyntax AddParensIfRequired(ExpressionSyntax expression, /// public static SyntaxKind NegateRelationalOperator(SyntaxKind op) { - switch (op) - { + switch (op) { case SyntaxKind.EqualsExpression: return SyntaxKind.NotEqualsExpression; case SyntaxKind.NotEqualsExpression: @@ -187,8 +177,7 @@ public static SyntaxKind NegateRelationalOperator(SyntaxKind op) /// public static bool IsRelationalOperator(SyntaxKind op) { - switch (op) - { + switch (op) { case SyntaxKind.EqualsExpression: case SyntaxKind.NotEqualsExpression: case SyntaxKind.GreaterThanExpression: @@ -210,8 +199,7 @@ public static bool IsRelationalOperator(SyntaxKind op) /// public static SyntaxKind NegateConditionOperator(SyntaxKind op) { - switch (op) - { + switch (op) { case SyntaxKind.LogicalOrExpression: return SyntaxKind.LogicalAndExpression; case SyntaxKind.LogicalAndExpression: @@ -240,4 +228,16 @@ public static T WithBody(this T method, BlockSyntax body) where T : BaseMetho throw new NotSupportedException(); } } + + static class WorkaroundForDumbVS2015ReflectionBug + { + internal static TypeSyntax ToSyntax(this ITypeSymbol type, SemanticModel model, TypeSyntax typeSyntax) + { + if (type == null) + throw new ArgumentNullException(nameof(type)); + return SyntaxFactory.ParseTypeName(type.ToMinimalDisplayString(model, typeSyntax.SpanStart)) + .WithLeadingTrivia(typeSyntax.GetLeadingTrivia()) + .WithTrailingTrivia(typeSyntax.GetTrailingTrivia()); + } + } } \ No newline at end of file From 30e8a832cfa33265368fd710b5a39b7cdfc00110 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 16 Feb 2017 18:58:55 +0100 Subject: [PATCH 099/236] Fix another threading problem: do not use Wait() --- Tests/CSharp/CodeRefactorings/CSharpCodeRefactoringTestBase.cs | 2 +- Tests/Common/DiagnosticTestBase.cs | 2 +- Tests/VB/CodeRefactorings/VBCodeRefactoringTestBase.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/CSharp/CodeRefactorings/CSharpCodeRefactoringTestBase.cs b/Tests/CSharp/CodeRefactorings/CSharpCodeRefactoringTestBase.cs index 2e7de5b4..d2e9e616 100644 --- a/Tests/CSharp/CodeRefactorings/CSharpCodeRefactoringTestBase.cs +++ b/Tests/CSharp/CodeRefactorings/CSharpCodeRefactoringTestBase.cs @@ -102,7 +102,7 @@ static List GetActions(CodeRefactoringProvider action, string input, doc = workspace.CurrentSolution.GetProject(projectId).GetDocument(documentId); var actions = new List(); var context = new CodeRefactoringContext(doc, selectedSpan, actions.Add, default(CancellationToken)); - action.ComputeRefactoringsAsync(context).Wait(); + action.ComputeRefactoringsAsync(context).GetAwaiter().GetResult(); if (markedSpan.Start > 0) { foreach (var nra in actions.OfType()) diff --git a/Tests/Common/DiagnosticTestBase.cs b/Tests/Common/DiagnosticTestBase.cs index 9e3ecbe6..2127d18d 100644 --- a/Tests/Common/DiagnosticTestBase.cs +++ b/Tests/Common/DiagnosticTestBase.cs @@ -122,7 +122,7 @@ protected static void RunFix(Workspace workspace, ProjectId projectId, DocumentI var document = workspace.CurrentSolution.GetProject(projectId).GetDocument(documentId); var actions = new List(); var context = new CodeFixContext(document, diagnostic, (fix, diags) => actions.Add(fix), default(CancellationToken)); - provider.RegisterCodeFixesAsync(context).Wait(); + provider.RegisterCodeFixesAsync(context).GetAwaiter().GetResult(); if (!actions.Any()) { Assert.True(false, "Provider has no fix for " + diagnostic.Id + " at " + diagnostic.Location.SourceSpan); diff --git a/Tests/VB/CodeRefactorings/VBCodeRefactoringTestBase.cs b/Tests/VB/CodeRefactorings/VBCodeRefactoringTestBase.cs index abab24a0..790c9300 100644 --- a/Tests/VB/CodeRefactorings/VBCodeRefactoringTestBase.cs +++ b/Tests/VB/CodeRefactorings/VBCodeRefactoringTestBase.cs @@ -100,7 +100,7 @@ static List GetActions(CodeRefactoringProvider action, string input, doc = workspace.CurrentSolution.GetProject(projectId).GetDocument(documentId); var actions = new List(); var context = new CodeRefactoringContext(doc, selectedSpan, actions.Add, default(CancellationToken)); - action.ComputeRefactoringsAsync(context).Wait(); + action.ComputeRefactoringsAsync(context).GetAwaiter().GetResult(); if (markedSpan.Start > 0) { foreach (var nra in actions.OfType()) From f9523f84ae3b2fc50f49761940292831a4238cb8 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 16 Feb 2017 19:20:19 +0100 Subject: [PATCH 100/236] fix #262 - Hide some refactors when editing an interface. --- ...opertyToPropertyCodeRefactoringProvider.cs | 17 ++------ ...teEventInvocatorCodeRefactoringProvider.cs | 2 + .../CreateCustomEventImplementationAction.cs | 43 ++++--------------- .../ConvertAutoPropertyToPropertyTests.cs | 9 ++++ ...tanceToStaticMethodCodeRefactoringTests.cs | 8 ++++ .../CreateCustomEventImplementationTests.cs | 8 ++++ .../CreateEventInvocatorTests.cs | 8 ++++ ...ropertyWithPropertyAndBackingFieldTests.cs | 8 ++++ ...bstractVirtualNonVirtualConversionTests.cs | 14 ++++++ 9 files changed, 70 insertions(+), 47 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertAutoPropertyToPropertyCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertAutoPropertyToPropertyCodeRefactoringProvider.cs index 8730598c..f103aebb 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertAutoPropertyToPropertyCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertAutoPropertyToPropertyCodeRefactoringProvider.cs @@ -32,12 +32,11 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte var property = root.FindNode(span) as PropertyDeclarationSyntax; if (property == null || !property.Identifier.Span.Contains(span)) return; - - if (property.AccessorList?.Accessors.Any(b => b.Body != null) != false) //ignore properties with >=1 accessor body + var enclosingTypeDeclaration = property.Ancestors().OfType().FirstOrDefault(); + if (enclosingTypeDeclaration == null || enclosingTypeDeclaration is InterfaceDeclarationSyntax) return; - - TypeDeclarationSyntax enclosingTypeDeclaration = property.Ancestors().OfType().FirstOrDefault(); - if(enclosingTypeDeclaration == null || enclosingTypeDeclaration is InterfaceDeclarationSyntax) + // ignore properties with >=1 accessor body + if (property.AccessorList?.Accessors.Any(b => b.Body != null) != false) return; context.RegisterRefactoring( CodeActionFactory.Create( @@ -46,13 +45,6 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte GettextCatalog.GetString("To computed property"), t2 => { - //string name = GetNameProposal(property.Identifier.ValueText, model, root); - - //create our new property - //var fieldExpression = name == "value" ? - // (ExpressionSyntax)SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, SyntaxFactory.ThisExpression(), SyntaxFactory.IdentifierName("value")) : - // SyntaxFactory.IdentifierName(name); - var getBody = SyntaxFactory.Block( SyntaxFactory.ThrowStatement( SyntaxFactory.ObjectCreationExpression( @@ -67,7 +59,6 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte var getter = SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration, getBody); var setter = SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration, getBody); - //var newPropAnno = new SyntaxAnnotation(); var newProperty = property.WithAccessorList(SyntaxFactory.AccessorList(new SyntaxList().Add(getter).Add(setter))); newProperty = newProperty.WithAdditionalAnnotations(Formatter.Annotation); var newRoot = root.ReplaceNode((SyntaxNode)property, newProperty); diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/CreateEventInvocatorCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/CreateEventInvocatorCodeRefactoringProvider.cs index 599c0d87..c2fec319 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/CreateEventInvocatorCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/CreateEventInvocatorCodeRefactoringProvider.cs @@ -37,6 +37,8 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte var declaredSymbol = model.GetDeclaredSymbol(node, cancellationToken); if (declaredSymbol == null || !declaredSymbol.IsKind(SymbolKind.Event)) return; + if (declaredSymbol.ContainingSymbol.IsInterfaceType()) + return; var invokeMethod = declaredSymbol.GetReturnType().GetDelegateInvokeMethod(); if (invokeMethod == null) return; diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/CreateCustomEventImplementationAction.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/CreateCustomEventImplementationAction.cs index 99fe68e7..ac0d4251 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/CreateCustomEventImplementationAction.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/CreateCustomEventImplementationAction.cs @@ -22,13 +22,12 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte return; var root = await model.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); var variableDeclarator = root.FindNode(span) as VariableDeclaratorSyntax; - if (variableDeclarator == null || - variableDeclarator.Parent == null || - variableDeclarator.Parent.Parent == null || - !variableDeclarator.Parent.Parent.IsKind(SyntaxKind.EventFieldDeclaration) || - !variableDeclarator.Identifier.Span.Contains(span)) + var eventDecl = variableDeclarator?.Parent?.Parent as EventFieldDeclarationSyntax; + + if (variableDeclarator == null || eventDecl == null || !variableDeclarator.Identifier.Span.Contains(span)) + return; + if (eventDecl.Parent is InterfaceDeclarationSyntax) return; - var eventDecl = (EventFieldDeclarationSyntax)variableDeclarator.Parent.Parent; context.RegisterRefactoring( CodeActionFactory.Create( @@ -37,37 +36,13 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte GettextCatalog.GetString("Create custom event implementation"), t2 => { - // var accessor = new Accessor - // { - // Body = new BlockStatement - // { - // new ThrowStatement( - // new ObjectCreateExpression(context.CreateShortType("System", "NotImplementedException"))) - // } - // }; - // var e = new CustomEventDeclaration - // { - // Name = node.Name, - // Modifiers = eventDecl.Modifiers, - // ReturnType = eventDecl.ReturnType.Clone (), - // AddAccessor = accessor, - // RemoveAccessor = (Accessor)accessor.Clone(), - // }; - // if (eventDecl.Variables.Count > 1) { - // var newEventDecl = (EventDeclaration)eventDecl.Clone (); - // newEventDecl.Variables.Remove ( - // newEventDecl.Variables.FirstOrNullObject (v => v.Name == node.Name)); - // script.InsertBefore (eventDecl, newEventDecl); - // } - // script.Replace (eventDecl, e); - var e = SyntaxFactory.EventDeclaration( eventDecl.AttributeLists, eventDecl.Modifiers, eventDecl.Declaration.Type, null, variableDeclarator.Identifier, - SyntaxFactory.AccessorList(SyntaxFactory.List(new[] { + SyntaxFactory.AccessorList(SyntaxFactory.List(new[] { SyntaxFactory.AccessorDeclaration(SyntaxKind.AddAccessorDeclaration, ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.CreateNotImplementedBody()), SyntaxFactory.AccessorDeclaration(SyntaxKind.RemoveAccessorDeclaration, ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.CreateNotImplementedBody()) })) @@ -77,12 +52,12 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte if (eventDecl.Declaration.Variables.Count > 1) { - newRoot = root.ReplaceNode((SyntaxNode) + newRoot = root.ReplaceNode( eventDecl, new SyntaxNode[] { eventDecl.WithDeclaration( eventDecl.Declaration.WithVariables( - SyntaxFactory.SeparatedList( + SyntaxFactory.SeparatedList( eventDecl.Declaration.Variables.Where(decl => decl != variableDeclarator) ) ) @@ -93,7 +68,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte } else { - newRoot = root.ReplaceNode((SyntaxNode)eventDecl, e.WithAdditionalAnnotations(Formatter.Annotation, Simplifier.Annotation)); + newRoot = root.ReplaceNode(eventDecl, e.WithAdditionalAnnotations(Formatter.Annotation, Simplifier.Annotation)); } return Task.FromResult(document.WithSyntaxRoot(newRoot)); diff --git a/Tests/CSharp/CodeRefactorings/ConvertAutoPropertyToPropertyTests.cs b/Tests/CSharp/CodeRefactorings/ConvertAutoPropertyToPropertyTests.cs index 9d01c67f..ef0710e7 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertAutoPropertyToPropertyTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertAutoPropertyToPropertyTests.cs @@ -37,6 +37,15 @@ public void TestExpressionBodyNoCrash() }"); } + [Fact] + public void TestInterfaceContext() + { + TestWrongContext( + "interface Test { string $Test2 { get; set; } }"); + TestWrongContext( + "interface Test { string $Test2 { get; } }"); + } + [Fact(Skip = "Simplifier.Annotation not working! (bug in Roslyn)")] public void TestSimplify() { diff --git a/Tests/CSharp/CodeRefactorings/ConvertInstanceToStaticMethodCodeRefactoringTests.cs b/Tests/CSharp/CodeRefactorings/ConvertInstanceToStaticMethodCodeRefactoringTests.cs index fc778d52..b98653ec 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertInstanceToStaticMethodCodeRefactoringTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertInstanceToStaticMethodCodeRefactoringTests.cs @@ -273,6 +273,14 @@ void Test(Foo foo) } }"); } + + [Fact] + public void TestInterfaceContext() + { + TestWrongContext( + "interface Test { void $TestMethod(); }" + ); + } } } diff --git a/Tests/CSharp/CodeRefactorings/CreateCustomEventImplementationTests.cs b/Tests/CSharp/CodeRefactorings/CreateCustomEventImplementationTests.cs index 52717ba2..52ea89bc 100644 --- a/Tests/CSharp/CodeRefactorings/CreateCustomEventImplementationTests.cs +++ b/Tests/CSharp/CodeRefactorings/CreateCustomEventImplementationTests.cs @@ -85,5 +85,13 @@ event EventHandler TestEvent } }"); } + + [Fact] + public void TestInterfaceContext() + { + TestWrongContext( + @"interface Test { event EventHandler $TestEvent; }" + ); + } } } diff --git a/Tests/CSharp/CodeRefactorings/CreateEventInvocatorTests.cs b/Tests/CSharp/CodeRefactorings/CreateEventInvocatorTests.cs index 9635325a..42b1c930 100644 --- a/Tests/CSharp/CodeRefactorings/CreateEventInvocatorTests.cs +++ b/Tests/CSharp/CodeRefactorings/CreateEventInvocatorTests.cs @@ -159,6 +159,14 @@ protected virtual void OnTested(EventArgs e) public event UnusualEventHandler Tested; }"); } + + [Fact] + public void TestInterfaceContext() + { + TestWrongContext( + "using System; interface Test { event EventHandler $TestEvent; }" + ); + } } } diff --git a/Tests/CSharp/CodeRefactorings/ReplaceAutoPropertyWithPropertyAndBackingFieldTests.cs b/Tests/CSharp/CodeRefactorings/ReplaceAutoPropertyWithPropertyAndBackingFieldTests.cs index 4b0b1cc0..8802284f 100644 --- a/Tests/CSharp/CodeRefactorings/ReplaceAutoPropertyWithPropertyAndBackingFieldTests.cs +++ b/Tests/CSharp/CodeRefactorings/ReplaceAutoPropertyWithPropertyAndBackingFieldTests.cs @@ -251,6 +251,14 @@ private set } }"); } + + [Fact] + public void TestInterfaceContext() + { + TestWrongContext( + "interface Test { int $Test2 { get; set; } }" + ); + } } } diff --git a/Tests/CSharp/CodeRefactorings/ToAbstractVirtualNonVirtualConversionTests.cs b/Tests/CSharp/CodeRefactorings/ToAbstractVirtualNonVirtualConversionTests.cs index b8f9d43f..5ad2f047 100644 --- a/Tests/CSharp/CodeRefactorings/ToAbstractVirtualNonVirtualConversionTests.cs +++ b/Tests/CSharp/CodeRefactorings/ToAbstractVirtualNonVirtualConversionTests.cs @@ -294,5 +294,19 @@ public void TestNullReferenceException() } "); } + + [Fact] + public void TestInterfaceContext() + { + TestWrongContext( + @"interface Test +{ + void $Test2(); + int $Test { get; set; } + event EventHandler $TestEvent; + } +" + ); + } } } \ No newline at end of file From b93c67d1f4f979436d7a78a3f5514bf9170632e7 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 16 Feb 2017 19:49:03 +0100 Subject: [PATCH 101/236] add test for #264 - NullReferenceException on ConvertConditionalTernaryToNullCoalescingAnalyzer --- ...nvertConditionalTernaryToNullCoalescingTests.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Tests/CSharp/Diagnostics/ConvertConditionalTernaryToNullCoalescingTests.cs b/Tests/CSharp/Diagnostics/ConvertConditionalTernaryToNullCoalescingTests.cs index 69358def..bda62501 100644 --- a/Tests/CSharp/Diagnostics/ConvertConditionalTernaryToNullCoalescingTests.cs +++ b/Tests/CSharp/Diagnostics/ConvertConditionalTernaryToNullCoalescingTests.cs @@ -214,6 +214,20 @@ void TestCase() } }"); } + + [Fact] + public void TestIssue264() + { + Analyze(@"using System.Collections.Generic; + +class Test +{ + void TestCase(Test[] tests) + { + var output = tests == null ? new List() : new List(tests); + } +}"); + } } } From 1df45b9ac6d252dd69964e12d12b0ec097d646fa Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 17 Feb 2017 07:48:07 +0100 Subject: [PATCH 102/236] Do not show ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider on private methods --- ...irtualConversionCodeRefactoringProvider.cs | 36 ++++++++++--------- ...bstractVirtualNonVirtualConversionTests.cs | 7 ++++ 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs index 08077ccc..d2055c29 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ToAbstractVirtualNonVirtualConversionCodeRefactoringProvider.cs @@ -25,21 +25,25 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte var token = root.FindToken(span.Start); - if (!token.IsKind(SyntaxKind.IdentifierToken) && - !token.IsKind(SyntaxKind.AbstractKeyword) && - !token.IsKind(SyntaxKind.VirtualKeyword) && - !token.IsKind(SyntaxKind.ThisKeyword)) + if (!token.IsKind(SyntaxKind.IdentifierToken, SyntaxKind.AbstractKeyword, SyntaxKind.VirtualKeyword, SyntaxKind.ThisKeyword)) return; - var declaration = token.Parent as MemberDeclarationSyntax; - if (token.IsKind(SyntaxKind.IdentifierToken)) - { - if (token.Parent.Parent.IsKind(SyntaxKind.VariableDeclaration) && - token.Parent.Parent.Parent.IsKind(SyntaxKind.EventFieldDeclaration)) - { - declaration = token.Parent.Parent.Parent as MemberDeclarationSyntax; + MemberDeclarationSyntax declaration; + ISymbol symbol = null; + if (token.IsKind(SyntaxKind.IdentifierToken)) { + if (token.Parent?.Parent?.IsKind(SyntaxKind.VariableDeclaration) == true) { + declaration = token.Parent?.Parent?.Parent as MemberDeclarationSyntax; + symbol = model.GetDeclaredSymbol(token.Parent); + } else { + declaration = token.Parent as MemberDeclarationSyntax; + if (declaration != null) + symbol = model.GetDeclaredSymbol(declaration); } + } else { + declaration = token.Parent as MemberDeclarationSyntax; + if (declaration != null) + symbol = model.GetDeclaredSymbol(declaration); } - if (declaration == null + if (declaration == null || symbol == null || declaration is BaseTypeDeclarationSyntax || declaration is ConstructorDeclarationSyntax || declaration is DestructorDeclarationSyntax) @@ -48,15 +52,15 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte if (modifiers.Any(m => m.IsKind(SyntaxKind.OverrideKeyword, SyntaxKind.ExternKeyword))) return; - TypeDeclarationSyntax enclosingTypeDeclaration = declaration.Ancestors().OfType().FirstOrDefault(); - if (enclosingTypeDeclaration == null || enclosingTypeDeclaration is InterfaceDeclarationSyntax) + var containingType = symbol.ContainingType; + if (symbol.DeclaredAccessibility == Accessibility.Private || containingType.IsInterfaceType()) return; var explicitInterface = declaration.GetExplicitInterfaceSpecifierSyntax(); if (explicitInterface != null) return; - if (enclosingTypeDeclaration.Modifiers.Any(m => m.IsKind(SyntaxKind.AbstractKeyword))) + if (containingType.IsAbstract) { if (modifiers.Any(m => m.IsKind(SyntaxKind.AbstractKeyword))) { @@ -121,7 +125,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte ) ); } - else if (!enclosingTypeDeclaration.Modifiers.Any(m => m.IsKind(SyntaxKind.StaticKeyword))) + else if (!containingType.IsStatic) { context.RegisterRefactoring(CodeActionFactory.Create( token.Span, diff --git a/Tests/CSharp/CodeRefactorings/ToAbstractVirtualNonVirtualConversionTests.cs b/Tests/CSharp/CodeRefactorings/ToAbstractVirtualNonVirtualConversionTests.cs index 5ad2f047..f247ef12 100644 --- a/Tests/CSharp/CodeRefactorings/ToAbstractVirtualNonVirtualConversionTests.cs +++ b/Tests/CSharp/CodeRefactorings/ToAbstractVirtualNonVirtualConversionTests.cs @@ -88,6 +88,13 @@ public virtual void Foo() }"); } + [Fact] + public void DoNotSuggestOnPrivateMethod() + { + TestWrongContext( + "class Test { void $Foo() { } }"); + } + [Fact] public void InvalidPrivateImplementationTypeTest() { From add77c5f73e94fe7f4b4c02ad64af299eca92869 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 17 Feb 2017 12:40:51 +0100 Subject: [PATCH 103/236] Reimplement UseMethodAnyAnalyzer + Fix --- .../ReplaceWithOfTypeAnalyzer.cs | 1 - .../UseMethodAnyAnalyzer.cs | 274 ++++++++++-------- .../UseMethodAnyCodeFixProvider.cs | 8 +- Tests/CSharp/Diagnostics/UseMethodAnyTests.cs | 54 ++-- 4 files changed, 179 insertions(+), 158 deletions(-) diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/ReplaceWithOfTypeAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/ReplaceWithOfTypeAnalyzer.cs index 23d2468f..991eeda6 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/ReplaceWithOfTypeAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/ReplaceWithOfTypeAnalyzer.cs @@ -177,7 +177,6 @@ static bool ExtractLambda(ArgumentSyntax argument, out ParameterSyntax parameter internal static InvocationExpressionSyntax MakeOfTypeCall(InvocationExpressionSyntax anyInvoke) { - var member = ((MemberAccessExpressionSyntax)anyInvoke.Expression).Name; ExpressionSyntax target; TypeSyntax type; if (MatchWhereSelect(anyInvoke, out target, out type)) diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/UseMethodAnyAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/UseMethodAnyAnalyzer.cs index 13679847..f1c40281 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/UseMethodAnyAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/UseMethodAnyAnalyzer.cs @@ -1,6 +1,9 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Diagnostics; using System.Collections.Immutable; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using System; namespace RefactoringEssentials.CSharp.Diagnostics { @@ -24,137 +27,158 @@ public override void Initialize(AnalysisContext context) { context.EnableConcurrentExecution(); context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); - //context.RegisterSyntaxNodeAction( - // (nodeContext) => { - // Diagnostic diagnostic; - // if (TryGetDiagnostic (nodeContext, out diagnostic)) { - // nodeContext.ReportDiagnostic(diagnostic); - // } - // }, - // new SyntaxKind[] { SyntaxKind.None } - //); + context.RegisterSyntaxNodeAction( + (nodeContext) => { + Diagnostic diagnostic; + if (TryGetDiagnostic(nodeContext, out diagnostic)) { + nodeContext.ReportDiagnostic(diagnostic); + } + }, + SyntaxKind.EqualsExpression, + SyntaxKind.NotEqualsExpression, + SyntaxKind.GreaterThanExpression, + SyntaxKind.GreaterThanOrEqualExpression, + SyntaxKind.LessThanExpression, + SyntaxKind.LessThanOrEqualExpression + ); } static bool TryGetDiagnostic(SyntaxNodeAnalysisContext nodeContext, out Diagnostic diagnostic) { diagnostic = default(Diagnostic); - //var node = nodeContext.Node as ; - //diagnostic = Diagnostic.Create (descriptor, node.GetLocation ()); - //return true; - return false; + var node = nodeContext.Node as BinaryExpressionSyntax; + ExpressionSyntax target; + ArgumentListSyntax arguments; + bool isNot; + if (!MatchCount0Or1(node, nodeContext.SemanticModel, out target, out arguments, out isNot)) + return false; + + diagnostic = Diagnostic.Create( + descriptor, + node.GetLocation(), + "Any()" + ); + return true; } - // class GatherVisitor : GatherVisitorBase - // { - // public GatherVisitor(SemanticModel semanticModel, Action addDiagnostic, CancellationToken cancellationToken) - // : base (semanticModel, addDiagnostic, cancellationToken) - // { - // } - //// - //// void AddDiagnosticAnalyzer2(BinaryOperatorExpression binaryOperatorExpression, Expression expr) - //// { - //// } - //// - //// readonly AstNode anyPattern = - //// new Choice { - //// PatternHelper.CommutativeOperatorWithOptionalParentheses( - //// new NamedNode ("invocation", new InvocationExpression(new MemberReferenceExpression(new AnyNode("expr"), "Count"))), - //// BinaryOperatorType.InEquality, - //// new PrimitiveExpression(0) - //// ), - //// new BinaryOperatorExpression ( - //// PatternHelper.OptionalParentheses(new NamedNode ("invocation", new InvocationExpression(new MemberReferenceExpression(new AnyNode("expr"), "Count")))), - //// BinaryOperatorType.GreaterThan, - //// PatternHelper.OptionalParentheses(new PrimitiveExpression(0)) - //// ), - //// new BinaryOperatorExpression ( - //// PatternHelper.OptionalParentheses(new PrimitiveExpression(0)), - //// BinaryOperatorType.LessThan, - //// PatternHelper.OptionalParentheses(new NamedNode ("invocation", new InvocationExpression(new MemberReferenceExpression(new AnyNode("expr"), "Count")))) - //// ), - //// new BinaryOperatorExpression ( - //// PatternHelper.OptionalParentheses(new NamedNode ("invocation", new InvocationExpression(new MemberReferenceExpression(new AnyNode("expr"), "Count")))), - //// BinaryOperatorType.GreaterThanOrEqual, - //// PatternHelper.OptionalParentheses(new PrimitiveExpression(1)) - //// ), - //// new BinaryOperatorExpression ( - //// PatternHelper.OptionalParentheses(new PrimitiveExpression(1)), - //// BinaryOperatorType.LessThanOrEqual, - //// PatternHelper.OptionalParentheses(new NamedNode ("invocation", new InvocationExpression(new MemberReferenceExpression(new AnyNode("expr"), "Count")))) - //// ) - //// }; - //// - //// readonly AstNode notAnyPattern = - //// new Choice { - //// PatternHelper.CommutativeOperatorWithOptionalParentheses( - //// new NamedNode ("invocation", new InvocationExpression(new MemberReferenceExpression(new AnyNode("expr"), "Count"))), - //// BinaryOperatorType.Equality, - //// new PrimitiveExpression(0) - //// ), - //// new BinaryOperatorExpression ( - //// PatternHelper.OptionalParentheses(new NamedNode ("invocation", new InvocationExpression(new MemberReferenceExpression(new AnyNode("expr"), "Count")))), - //// BinaryOperatorType.LessThan, - //// PatternHelper.OptionalParentheses(new PrimitiveExpression(1)) - //// ), - //// new BinaryOperatorExpression ( - //// PatternHelper.OptionalParentheses(new PrimitiveExpression(1)), - //// BinaryOperatorType.GreaterThan, - //// PatternHelper.OptionalParentheses(new NamedNode ("invocation", new InvocationExpression(new MemberReferenceExpression(new AnyNode("expr"), "Count")))) - //// ), - //// new BinaryOperatorExpression ( - //// PatternHelper.OptionalParentheses(new NamedNode ("invocation", new InvocationExpression(new MemberReferenceExpression(new AnyNode("expr"), "Count")))), - //// BinaryOperatorType.LessThanOrEqual, - //// PatternHelper.OptionalParentheses(new PrimitiveExpression(0)) - //// ), - //// new BinaryOperatorExpression ( - //// PatternHelper.OptionalParentheses(new PrimitiveExpression(0)), - //// BinaryOperatorType.GreaterThanOrEqual, - //// PatternHelper.OptionalParentheses(new NamedNode ("invocation", new InvocationExpression(new MemberReferenceExpression(new AnyNode("expr"), "Count")))) - //// ) - //// }; - //// - //// void AddMatch(BinaryOperatorExpression binaryOperatorExpression, Match match, bool negateAny) - //// { - //// AddDiagnosticAnalyzer(new CodeIssue( - //// binaryOperatorExpression, - //// ctx.TranslateString(""), - //// script => { - //// Expression expr = new InvocationExpression(new MemberReferenceExpression(match.Get("expr").First().Clone(), "Any")); - //// if (negateAny) - //// expr = new UnaryOperatorExpression(UnaryOperatorType.Not, expr); - //// script.Replace(binaryOperatorExpression, expr); - //// } - //// )); - //// } - //// - //// bool CheckMethod(Match match) - //// { - //// var invocation = match.Get("invocation").First(); - //// var rr = ctx.Resolve(invocation) as CSharpInvocationResolveResult; - //// if (rr == null || rr.IsError) - //// return false; - //// var method = rr.Member as IMethod; - //// return - //// method != null && - //// method.IsExtensionMethod && - //// method.DeclaringTypeDefinition.Namespace == "System.Linq" && - //// method.DeclaringTypeDefinition.Name == "Enumerable"; - //// } - //// - //// public override void VisitBinaryOperatorExpression(BinaryOperatorExpression binaryOperatorExpression) - //// { - //// base.VisitBinaryOperatorExpression(binaryOperatorExpression); - //// var match = anyPattern.Match(binaryOperatorExpression); - //// if (match.Success && CheckMethod (match)) { - //// AddMatch(binaryOperatorExpression, match, false); - //// return; - //// } - //// match = notAnyPattern.Match(binaryOperatorExpression); - //// if (match.Success && CheckMethod (match)) { - //// AddMatch(binaryOperatorExpression, match, true); - //// return; - //// } - //// } - // } + static bool MatchCount0Or1(BinaryExpressionSyntax node, SemanticModel semanticModel, out ExpressionSyntax target, out ArgumentListSyntax arguments, out bool isNot) + { + var left = node.Left.SkipParens(); + var right = node.Right.SkipParens(); + target = null; + arguments = null; + isNot = false; + + InvocationExpressionSyntax invocation = left as InvocationExpressionSyntax ?? right as InvocationExpressionSyntax; + SyntaxToken? constant = (right as LiteralExpressionSyntax)?.Token ?? (left as LiteralExpressionSyntax)?.Token; + + if (invocation == null || !(constant?.Value is int)) + return false; + if (semanticModel != null && !CheckInvocation(semanticModel, invocation)) + return false; + int constantValue = (int)constant?.Value; + bool callLeft = left == invocation; + + switch (node.Kind()) { + // invocation == 0 + // 0 == invocation + case SyntaxKind.EqualsExpression: + isNot = true; + if (constantValue != 0) + return false; + break; + // invocation != 0 + // 0 != invocation + case SyntaxKind.NotEqualsExpression: + if (constantValue != 0) + return false; + break; + // invocation > 0 + // 1 > invocation + case SyntaxKind.GreaterThanExpression: + if (callLeft) { + if (constantValue != 0) + return false; + } else { + isNot = true; + if (constantValue != 1) + return false; + } + break; + // invocation >= 1 + // 0 >= invocation + case SyntaxKind.GreaterThanOrEqualExpression: + if (callLeft) { + if (constantValue != 1) + return false; + } else { + isNot = true; + if (constantValue != 0) + return false; + } + break; + // 0 < invocation + // invocation < 1 + case SyntaxKind.LessThanExpression: + if (callLeft) { + isNot = true; + if (constantValue != 1) + return false; + } else { + if (constantValue != 0) + return false; + } + break; + // 1 <= invocation + // invocation <= 0 + case SyntaxKind.LessThanOrEqualExpression: + if (callLeft) { + isNot = true; + if (constantValue != 0) + return false; + } else { + if (constantValue != 1) + return false; + } + break; + default: + return false; + } + + target = (invocation.Expression as MemberAccessExpressionSyntax)?.Expression; + if (target == null) + return false; + + arguments = invocation.ArgumentList; + return true; + } + + private static bool CheckInvocation(SemanticModel semanticModel, InvocationExpressionSyntax invocation) + { + var symbol = semanticModel.GetSymbolInfo(invocation).Symbol; + return symbol != null + && symbol.Name == "Count" + && symbol.IsExtensionMethod() + && symbol.ContainingType.GetFullName() == "System.Linq.Enumerable"; + } + + internal static ExpressionSyntax MakeAnyCall(BinaryExpressionSyntax node) + { + ExpressionSyntax target; + ArgumentListSyntax arguments; + bool isNot; + if (MatchCount0Or1(node, null, out target, out arguments, out isNot)) { + var anyIdentifier = ((SimpleNameSyntax)SyntaxFactory.ParseName("Any")); + var invocation = SyntaxFactory.InvocationExpression( + SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, target, anyIdentifier), + SyntaxFactory.ArgumentList(arguments.Arguments) + ); + if (isNot) + return SyntaxFactory.PrefixUnaryExpression(SyntaxKind.LogicalNotExpression, invocation); + return invocation; + } + + return null; + } } } \ No newline at end of file diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/UseMethodAnyCodeFixProvider.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/UseMethodAnyCodeFixProvider.cs index 607691bf..b83d63cb 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/UseMethodAnyCodeFixProvider.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/UseMethodAnyCodeFixProvider.cs @@ -1,6 +1,7 @@ using Microsoft.CodeAnalysis; using System.Collections.Immutable; using Microsoft.CodeAnalysis.CodeFixes; +using Microsoft.CodeAnalysis.CSharp.Syntax; using System.Threading.Tasks; using System.Linq; @@ -31,11 +32,8 @@ public async override Task RegisterCodeFixesAsync(CodeFixContext context) var diagnostics = context.Diagnostics; var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); var diagnostic = diagnostics.First(); - var node = root.FindNode(context.Span); - //if (!node.IsKind(SyntaxKind.BaseList)) - // continue; - var newRoot = root.RemoveNode(node, SyntaxRemoveOptions.KeepNoTrivia); - // "Replace with call to '!Any()'" + var node = root.FindNode(context.Span, getInnermostNodeForTie: true) as BinaryExpressionSyntax; + var newRoot = root.ReplaceNode(node, UseMethodAnyAnalyzer.MakeAnyCall(node)); context.RegisterCodeFix(CodeActionFactory.Create(node.Span, diagnostic.Severity, "Replace with call to 'Any()'", document.WithSyntaxRoot(newRoot)), diagnostic); } } diff --git a/Tests/CSharp/Diagnostics/UseMethodAnyTests.cs b/Tests/CSharp/Diagnostics/UseMethodAnyTests.cs index 7149b7b1..b07857ea 100644 --- a/Tests/CSharp/Diagnostics/UseMethodAnyTests.cs +++ b/Tests/CSharp/Diagnostics/UseMethodAnyTests.cs @@ -15,75 +15,75 @@ class Bar public void Foo (string[] args) { if (" + expr + @") - Console.WriteLine (); + Console.WriteLine(); } } "; } - [Fact(Skip="TODO: Issue not ported yet")] + [Fact] public void TestAnyNotEqual() { - Test(ConstructExpression("args.Count () != 0"), ConstructExpression("args.Any ()")); + Analyze(ConstructExpression("$args.Count() != 0$"), ConstructExpression("args.Any()")); } - [Fact(Skip="TODO: Issue not ported yet")] + [Fact] public void TestAnyGreater() { - Test(ConstructExpression("args.Count () > 0"), ConstructExpression("args.Any ()")); + Analyze(ConstructExpression("$args.Count() > 0$"), ConstructExpression("args.Any()")); } - [Fact(Skip="TODO: Issue not ported yet")] + [Fact] public void TestAnyLower() { - Test(ConstructExpression("0 < args.Count ()"), ConstructExpression("args.Any ()")); + Analyze(ConstructExpression("$0 < args.Count()$"), ConstructExpression("args.Any()")); } - [Fact(Skip="TODO: Issue not ported yet")] + [Fact] public void TestAnyGreaterEqual() { - Test(ConstructExpression("args.Count () >= 1"), ConstructExpression("args.Any ()")); + Analyze(ConstructExpression("$args.Count() >= 1$"), ConstructExpression("args.Any()")); } - [Fact(Skip="TODO: Issue not ported yet")] + [Fact] public void TestAnyLessEqual() { - Test(ConstructExpression("1 <= args.Count ()"), ConstructExpression("args.Any ()")); + Analyze(ConstructExpression("$1 <= args.Count()$"), ConstructExpression("args.Any()")); } - [Fact(Skip="TODO: Issue not ported yet")] + [Fact] public void TestNotAnyEqual() { - Test(ConstructExpression("args.Count () == 0"), ConstructExpression("!args.Any ()")); + Analyze(ConstructExpression("$args.Count() == 0$"), ConstructExpression("!args.Any()")); } - [Fact(Skip="TODO: Issue not ported yet")] + [Fact] public void TestNotAnyLess() { - Test(ConstructExpression("args.Count () < 1"), ConstructExpression("!args.Any ()")); + Analyze(ConstructExpression("$args.Count() < 1$"), ConstructExpression("!args.Any()")); } - [Fact(Skip="TODO: Issue not ported yet")] + [Fact] public void TestNotAnyGreater() { - Test(ConstructExpression("1 > args.Count ()"), ConstructExpression("!args.Any ()")); + Analyze(ConstructExpression("$1 > args.Count()$"), ConstructExpression("!args.Any()")); } - [Fact(Skip="TODO: Issue not ported yet")] + [Fact] public void TestNotAnyLessEqual() { - Test(ConstructExpression("args.Count () <= 0"), ConstructExpression("!args.Any ()")); + Analyze(ConstructExpression("$args.Count() <= 0$"), ConstructExpression("!args.Any()")); } - [Fact(Skip="TODO: Issue not ported yet")] + [Fact] public void TestNotAnyGreaterEqual() { - Test(ConstructExpression("0 >= args.Count ()"), ConstructExpression("!args.Any ()")); + Analyze(ConstructExpression("$0 >= args.Count()$"), ConstructExpression("!args.Any()")); } - [Fact(Skip="TODO: Issue not ported yet")] + [Fact] public void TestDisable() { Analyze(@" @@ -93,15 +93,15 @@ class Bar { public void Foo (string[] args) { - // ReSharper disable once UseMethodAny - if (args.Count () > 0) + #pragma warning disable RECS0116 + if (args.Count() > 0) Console.WriteLine(); } } "); } - [Fact(Skip="TODO: Issue not ported yet")] + [Fact] public void TestWrongMethod() { Analyze(@" @@ -109,11 +109,11 @@ public void TestWrongMethod() using System.Linq; class Bar { - public int Count () { return 5; } + public int Count() { return 5; } public void Foo (Bar args) { - if (args.Count () > 0) + if (args.Count() > 0) Console.WriteLine(); } } From f477994b3137dd338593292b334ff8be296c81a7 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 17 Feb 2017 12:45:35 +0100 Subject: [PATCH 104/236] Clean up CSharpUtil --- RefactoringEssentials/Util/CSharpUtil.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/RefactoringEssentials/Util/CSharpUtil.cs b/RefactoringEssentials/Util/CSharpUtil.cs index 78930c6a..2831dd2a 100644 --- a/RefactoringEssentials/Util/CSharpUtil.cs +++ b/RefactoringEssentials/Util/CSharpUtil.cs @@ -227,11 +227,8 @@ public static T WithBody(this T method, BlockSyntax body) where T : BaseMetho return (T)((BaseMethodDeclarationSyntax)d.WithBody(body)); throw new NotSupportedException(); } - } - static class WorkaroundForDumbVS2015ReflectionBug - { - internal static TypeSyntax ToSyntax(this ITypeSymbol type, SemanticModel model, TypeSyntax typeSyntax) + public static TypeSyntax ToSyntax(this ITypeSymbol type, SemanticModel model, TypeSyntax typeSyntax) { if (type == null) throw new ArgumentNullException(nameof(type)); From 80aa616a842435c79e7cf3785e485bc31bd400a7 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 17 Feb 2017 13:48:49 +0100 Subject: [PATCH 105/236] Reactivate disabled test in ConditionalTernaryEqualBranchTests --- Tests/CSharp/Diagnostics/ConditionalTernaryEqualBranchTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/CSharp/Diagnostics/ConditionalTernaryEqualBranchTests.cs b/Tests/CSharp/Diagnostics/ConditionalTernaryEqualBranchTests.cs index 413fbe51..06e00c08 100644 --- a/Tests/CSharp/Diagnostics/ConditionalTernaryEqualBranchTests.cs +++ b/Tests/CSharp/Diagnostics/ConditionalTernaryEqualBranchTests.cs @@ -70,7 +70,7 @@ void Bar (string str) } - [Fact(Skip="Won't work with Roslyn < 1.1 due to a bug with equivalence checking of interpolated strings. Activate with Roslyn 1.1.")] + [Fact] public void TestNotEqualBranchesWithInterpolatedStrings() { Analyze(@"class Foo From 9b5e99f7b261ea63c544879f11dc21620c8921e1 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 17 Feb 2017 22:42:44 +0100 Subject: [PATCH 106/236] Reimplement AutoLinqSumAction --- .../Uncategorized/AutoLinqSumAction.cs | 709 ++++++++---------- .../UseMethodAnyAnalyzer.cs | 1 - .../CodeAnalyzers.CSharp.html | 3 +- .../CodeRefactorings.CSharp.html | 3 +- RefactoringEssentials/Util/CSharpUtil.cs | 11 + .../Util/EnumerableExtensions.cs | 13 + RefactoringEssentials/missing.md | 2 - .../CodeRefactorings/AutoLinqSumTests.cs | 659 ++++++++-------- 8 files changed, 663 insertions(+), 738 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/AutoLinqSumAction.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/AutoLinqSumAction.cs index 50523a12..caaa0167 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/AutoLinqSumAction.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/AutoLinqSumAction.cs @@ -1,418 +1,321 @@ using Microsoft.CodeAnalysis.CodeRefactorings; using Microsoft.CodeAnalysis; using System.Threading.Tasks; +using System.Collections.Generic; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.CSharp; +using System.Linq; +using Microsoft.CodeAnalysis.Formatting; namespace RefactoringEssentials.CSharp.CodeRefactorings { [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Convert loop to Linq expression")] - [NotPortedYet] public class AutoLinqSumAction : CodeRefactoringProvider { - // Disabled for nullables, since int? x = 3; x += null; has result x = null, - // but LINQ Sum behaves differently : nulls are treated as zero - //static readonly IEnumerable LinqSummableTypes = new string[] { - // "System.UInt16", - // "System.Int16", - // "System.UInt32", - // "System.Int32", - // "System.UInt64", - // "System.Int64", - // "System.Single", - // "System.Double", - // "System.Decimal" - //}; - - public override Task ComputeRefactoringsAsync(CodeRefactoringContext context) + public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) { - //var document = context.Document; - //var span = context.Span; - //var cancellationToken = context.CancellationToken; - //var model = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); - //if (model.IsFromGeneratedCode(cancellationToken)) - // return; - //var root = await model.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); - return Task.FromResult(0); + var document = context.Document; + if (document.Project.Solution.Workspace.Kind == WorkspaceKind.MiscellaneousFiles) + return; + var span = context.Span; + if (!span.IsEmpty) + return; + var cancellationToken = context.CancellationToken; + if (cancellationToken.IsCancellationRequested) + return; + var model = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); + if (model.IsFromGeneratedCode(cancellationToken)) + return; + var symbolInfo = model.GetSpeculativeSymbolInfo(span.Start, SyntaxFactory.ParseTypeName("Enumerable"), SpeculativeBindingOption.BindAsTypeOrNamespace); + if (symbolInfo.Symbol == null || symbolInfo.Symbol.ContainingNamespace.ToDisplayString() != "System.Linq") + return; + var root = await model.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); + var token = root.FindToken(span.Start); + var foreachStmt = token.Parent as ForEachStatementSyntax; + if (foreachStmt == null) + return; + var outputStatement = GetTransformedAssignmentExpression(model, foreachStmt); + if (outputStatement == null) + return; + context.RegisterRefactoring( + CodeActionFactory.Create( + token.Span, + DiagnosticSeverity.Info, + GettextCatalog.GetString("Convert foreach loop to LINQ expression"), + t2 => { + int indexOfSelf = foreachStmt.Parent.ChildNodes().IndexOf(n => foreachStmt == n); + var prevSibling = foreachStmt.Parent.ChildNodes().ElementAtOrDefault(indexOfSelf - 1) as StatementSyntax; + + ExpressionSyntax leftSide = outputStatement.Left; + ExpressionSyntax rightSide = outputStatement.Right; + ExpressionSyntax expressionToReplace = GetExpressionToReplace(prevSibling, leftSide); + + SyntaxNode newRoot; + if (expressionToReplace == null) { + newRoot = root.ReplaceNode(foreachStmt, SyntaxFactory.ExpressionStatement(outputStatement).WithAdditionalAnnotations(Formatter.Annotation)); + } else { + ExpressionSyntax replacementExpression = rightSide; + if (!IsZeroPrimitive(expressionToReplace)) { + replacementExpression = SyntaxFactory.BinaryExpression( + SyntaxKind.AddExpression, + CSharpUtil.AddParensIfRequired(expressionToReplace), + replacementExpression + ).WithAdditionalAnnotations(Formatter.Annotation); + } + newRoot = root.TrackNodes(foreachStmt, expressionToReplace); + newRoot = newRoot.ReplaceNode(newRoot.GetCurrentNode(expressionToReplace), replacementExpression); + newRoot = newRoot.RemoveNode(newRoot.GetCurrentNode(foreachStmt), SyntaxRemoveOptions.KeepNoTrivia); + } + return Task.FromResult(document.WithSyntaxRoot(newRoot)); + } + )); + } + + AssignmentExpressionSyntax GetTransformedAssignmentExpression(SemanticModel context, ForEachStatementSyntax foreachStatement) + { + ExpressionSyntax leftExpression, rightExpression; + if (!ExtractExpression(foreachStatement.Statement, out leftExpression, out rightExpression)) + return null; + if (leftExpression == null || rightExpression == null) + return null; + + if (!IsLinqSummableType(context.GetTypeInfo(leftExpression).Type)) + return null; + + if (rightExpression.DescendantNodesAndSelf().OfType().Any(n => ExpressionNotAllowed(n))) { + // Reject loops such as + // int k = 0; + // foreach (var x in y) { k += (z = 2); } + // or + // int k = 0; + // foreach (var x in y) { k += (z++); } + return null; + } + + ExpressionSyntax baseExpression = foreachStatement.Expression; + for (;;) { + ConditionalExpressionSyntax condition = rightExpression as ConditionalExpressionSyntax; + if (condition == null) break; + + if (EqualsLiteral(condition.WhenTrue, 0)) { + baseExpression = SyntaxFactory.InvocationExpression( + SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, baseExpression, (SimpleNameSyntax)SyntaxFactory.ParseName("Where")), + SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.Argument(BuildLambda(foreachStatement.Identifier, CSharpUtil.InvertCondition(condition.Condition))))) + ); + rightExpression = condition.WhenFalse; + continue; + } + + if (EqualsLiteral(condition.WhenFalse, 0)) { + baseExpression = SyntaxFactory.InvocationExpression( + SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, baseExpression, (SimpleNameSyntax)SyntaxFactory.ParseName("Where")), + SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.Argument(BuildLambda(foreachStatement.Identifier, condition.Condition)))) + ); + rightExpression = condition.WhenTrue; + continue; + } + break; + } + + SimpleNameSyntax method; + var arguments = new List(); + if (EqualsLiteral(rightExpression, 1)) { + method = (SimpleNameSyntax)SyntaxFactory.ParseName("Count"); + } else { + method = (SimpleNameSyntax)SyntaxFactory.ParseName("Sum"); + if (rightExpression.SkipParens().ToString() != foreachStatement.Identifier.ToString()) { + var lambda = BuildLambda(foreachStatement.Identifier, rightExpression); + arguments.Add(SyntaxFactory.Argument(lambda)); + } + } + + var rightSide = SyntaxFactory.InvocationExpression( + SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, baseExpression, method), + SyntaxFactory.ArgumentList(SyntaxFactory.SeparatedList(arguments)) + ); + + return SyntaxFactory.AssignmentExpression(SyntaxKind.AddAssignmentExpression, leftExpression, rightSide); + } + + bool EqualsLiteral(ExpressionSyntax expr, T literal) + { + return object.Equals(literal, (expr as LiteralExpressionSyntax)?.Token.Value); + } + + bool ExpressionNotAllowed(ExpressionSyntax expr) + { + switch (expr.Kind()) { + case SyntaxKind.AddAssignmentExpression: + case SyntaxKind.AndAssignmentExpression: + case SyntaxKind.DivideAssignmentExpression: + case SyntaxKind.ExclusiveOrAssignmentExpression: + case SyntaxKind.LeftShiftAssignmentExpression: + case SyntaxKind.ModuloAssignmentExpression: + case SyntaxKind.MultiplyAssignmentExpression: + case SyntaxKind.OrAssignmentExpression: + case SyntaxKind.RightShiftAssignmentExpression: + case SyntaxKind.SimpleAssignmentExpression: + case SyntaxKind.SubtractAssignmentExpression: + case SyntaxKind.PostIncrementExpression: + case SyntaxKind.PreIncrementExpression: + case SyntaxKind.PostDecrementExpression: + case SyntaxKind.PreDecrementExpression: + return true; + } + return false; + } + + bool IsZeroPrimitive(ExpressionSyntax expr) + { + //We want a very simple check -- no looking at constants, no constant folding, etc. + //So 1+1 should return false, but (0) should return true + expr = expr.SkipParens(); + return EqualsLiteral(expr, 0) + || EqualsLiteral(expr, 0f) + || EqualsLiteral(expr, 0d) + || EqualsLiteral(expr, 0m); } - // public async Task ComputeRefactoringsAsync(Document document, TextSpan span, CancellationToken cancellationToken) - // { - // var loop = GetForeachStatement (context); - // if (loop == null) { - // yield break; - // } - // - // if (context.GetResolverStateBefore(loop) - // .LookupSimpleNameOrTypeName("Enumerable", new List(), NameLookupMode.Type) - // .Type.FullName != "System.Linq.Enumerable") { - // - // yield break; - // } - // - // var outputStatement = GetTransformedAssignmentExpression (context, loop); - // if (outputStatement == null) { - // yield break; - // } - // - // yield return new CodeAction(context.TranslateString("Convert foreach loop to LINQ expression"), script => { - // - // var prevSibling = loop.GetPrevSibling(node => node is Statement); - // - // Expression leftSide = outputStatement.Left; - // Expression rightSide = outputStatement.Right; - // - // Expression expressionToReplace = GetExpressionToReplace(prevSibling, leftSide); - // - // if (expressionToReplace != null) { - // Expression replacementExpression = rightSide.Clone(); - // if (!IsZeroPrimitive(expressionToReplace)) { - // replacementExpression = new BinaryOperatorExpression(ParenthesizeIfNeeded(expressionToReplace).Clone(), - // BinaryOperatorType.Add, - // replacementExpression); - // } - // - // script.Replace(expressionToReplace, replacementExpression); - // script.Remove(loop); - // } - // else { - // script.Replace(loop, new ExpressionStatement(outputStatement)); - // } - // - // }, loop); - // } - // - // bool IsZeroPrimitive(Expression expr) - // { - // //We want a very simple check -- no looking at constants, no constant folding, etc. - // //So 1+1 should return false, but (0) should return true - // - // var parenthesizedExpression = expr as ParenthesizedExpression; - // if (parenthesizedExpression != null) { - // return IsZeroPrimitive(parenthesizedExpression.Expression); - // } - // - // var zeroLiteralInteger = new PrimitiveExpression(0); - // var zeroLiteralFloat = new PrimitiveExpression(0.0f); - // var zeroLiteralDouble = new PrimitiveExpression(0.0); - // var zeroLiteralDecimal = new PrimitiveExpression(0.0m); - // - // return SameNode(zeroLiteralInteger, expr) || - // SameNode(zeroLiteralFloat, expr) || - // SameNode(zeroLiteralDouble, expr) || - // SameNode(zeroLiteralDecimal, expr); - // } - // - // Expression GetExpressionToReplace(AstNode prevSibling, Expression requiredLeftSide) - // { - // if (prevSibling == null) { - // return null; - // } - // - // var declarationStatement = prevSibling as VariableDeclarationStatement; - // if (declarationStatement != null) - // { - // if (declarationStatement.Variables.Count != 1) { - // return null; - // } - // - // var identifierExpr = requiredLeftSide as IdentifierExpression; - // if (identifierExpr == null) { - // return null; - // } - // - // var variableDecl = declarationStatement.Variables.First(); - // - // if (!SameNode(identifierExpr.IdentifierToken, variableDecl.NameToken)) { - // return null; - // } - // - // return variableDecl.Initializer; - // } - // - // var exprStatement = prevSibling as ExpressionStatement; - // if (exprStatement != null) { - // var assignment = exprStatement.Expression as AssignmentExpression; - // if (assignment != null) { - // if (assignment.Operator != AssignmentOperatorType.Assign && - // assignment.Operator != AssignmentOperatorType.Add) { - // - // return null; - // } - // - // if (!SameNode(requiredLeftSide, assignment.Left)) { - // return null; - // } - // - // return assignment.Right; - // } - // } - // - // return null; - // } - // - // bool IsUnaryModifierExpression(UnaryOperatorExpression expr) - // { - // return expr.Operator == UnaryOperatorType.Increment || expr.Operator == UnaryOperatorType.PostIncrement || expr.Operator == UnaryOperatorType.Decrement || expr.Operator == UnaryOperatorType.PostDecrement; - // } - // - // AssignmentExpression GetTransformedAssignmentExpression (SemanticModel context, ForeachStatement foreachStatement) - // { - // var enumerableToIterate = foreachStatement.InExpression.Clone(); - // - // Statement statement = foreachStatement.EmbeddedStatement; - // - // Expression leftExpression, rightExpression; - // if (!ExtractExpression(statement, out leftExpression, out rightExpression)) { - // return null; - // } - // if (leftExpression == null || rightExpression == null) { - // return null; - // } - // - // var type = context.Resolve(leftExpression).Type; - // if (!IsLinqSummableType(type)) { - // return null; - // } - // - // if (rightExpression.DescendantsAndSelf.OfType().Any()) { - // // Reject loops such as - // // int k = 0; - // // foreach (var x in y) { k += (z = 2); } - // - // return null; - // } - // - // if (rightExpression.DescendantsAndSelf.OfType().Any(IsUnaryModifierExpression)) { - // // int k = 0; - // // foreach (var x in y) { k += (z++); } - // - // return null; - // } - // - // var zeroLiteral = new PrimitiveExpression(0); - // - // Expression baseExpression = enumerableToIterate; - // for (;;) { - // ConditionalExpression condition = rightExpression as ConditionalExpression; - // if (condition == null) { - // break; - // } - // - // if (SameNode(zeroLiteral, condition.TrueExpression)) { - // baseExpression = new InvocationExpression(new MemberReferenceExpression(baseExpression.Clone(), "Where"), - // BuildLambda(foreachStatement.VariableName, CSharpUtil.InvertCondition(condition.Condition))); - // rightExpression = condition.FalseExpression.Clone(); - // - // continue; - // } - // - // if (SameNode(zeroLiteral, condition.FalseExpression)) { - // baseExpression = new InvocationExpression(new MemberReferenceExpression(baseExpression.Clone(), "Where"), - // BuildLambda(foreachStatement.VariableName, condition.Condition.Clone())); - // rightExpression = condition.TrueExpression.Clone(); - // - // continue; - // } - // - // break; - // } - // - // var primitiveOne = new PrimitiveExpression(1); - // bool isPrimitiveOne = SameNode(primitiveOne, rightExpression); - // - // var arguments = new List(); - // - // string method = isPrimitiveOne ? "Count" : "Sum"; - // - // if (!isPrimitiveOne && !IsIdentifier(rightExpression, foreachStatement.VariableName)) { - // var lambda = BuildLambda(foreachStatement.VariableName, rightExpression); - // - // arguments.Add(lambda); - // } - // - // var rightSide = new InvocationExpression(new MemberReferenceExpression(baseExpression, method), arguments); - // - // return new AssignmentExpression(leftExpression.Clone(), AssignmentOperatorType.Add, rightSide); - // } - // - // static LambdaExpression BuildLambda(string variableName, Expression expression) - // { - // var lambda = new LambdaExpression(); - // lambda.Parameters.Add(new ParameterDeclaration() { - // Name = variableName - // }); - // lambda.Body = expression.Clone(); - // return lambda; - // } - // - // bool IsIdentifier(Expression expr, string variableName) - // { - // var identifierExpr = expr as IdentifierExpression; - // if (identifierExpr != null) { - // return identifierExpr.Identifier == variableName; - // } - // - // var parenthesizedExpr = expr as ParenthesizedExpression; - // if (parenthesizedExpr != null) { - // return IsIdentifier(parenthesizedExpr.Expression, variableName); - // } - // - // return false; - // } - // - // bool IsLinqSummableType(IType type) { - // return LinqSummableTypes.Contains(type.FullName); - // } - // - // bool ExtractExpression (Statement statement, out Expression leftSide, out Expression rightSide) { - // ExpressionStatement expression = statement as ExpressionStatement; - // if (expression != null) { - // AssignmentExpression assignment = expression.Expression as AssignmentExpression; - // if (assignment != null) { - // if (assignment.Operator == AssignmentOperatorType.Add) { - // leftSide = assignment.Left; - // rightSide = assignment.Right; - // return true; - // } - // if (assignment.Operator == AssignmentOperatorType.Subtract) { - // leftSide = assignment.Left; - // rightSide = new UnaryOperatorExpression(UnaryOperatorType.Minus, assignment.Right.Clone()); - // return true; - // } - // - // leftSide = null; - // rightSide = null; - // return false; - // } - // - // UnaryOperatorExpression unary = expression.Expression as UnaryOperatorExpression; - // if (unary != null) { - // leftSide = unary.Expression; - // if (unary.Operator == UnaryOperatorType.Increment || unary.Operator == UnaryOperatorType.PostIncrement) { - // rightSide = new PrimitiveExpression(1); - // return true; - // } else if (unary.Operator == UnaryOperatorType.Decrement || unary.Operator == UnaryOperatorType.PostDecrement) { - // rightSide = new PrimitiveExpression(-1); - // return true; - // } else { - // leftSide = null; - // rightSide = null; - // return false; - // } - // } - // } - // - // if (statement is EmptyStatement || statement.IsNull) { - // leftSide = null; - // rightSide = null; - // return true; - // } - // - // BlockStatement block = statement as BlockStatement; - // if (block != null) { - // leftSide = null; - // rightSide = null; - // - // foreach (Statement child in block.Statements) { - // Expression newLeft, newRight; - // if (!ExtractExpression(child, out newLeft, out newRight)) { - // leftSide = null; - // rightSide = null; - // return false; - // } - // - // if (newLeft == null) { - // continue; - // } - // - // if (leftSide == null) { - // leftSide = newLeft; - // rightSide = newRight; - // } else if (SameNode(leftSide, newLeft)) { - // rightSide = new BinaryOperatorExpression(ParenthesizeIfNeeded(rightSide).Clone(), - // BinaryOperatorType.Add, - // ParenthesizeIfNeeded(newRight).Clone()); - // } else { - // return false; - // } - // } - // - // return true; - // } - // - // IfElseStatement condition = statement as IfElseStatement; - // if (condition != null) { - // Expression ifLeft, ifRight; - // if (!ExtractExpression(condition.TrueStatement, out ifLeft, out ifRight)) { - // leftSide = null; - // rightSide = null; - // return false; - // } - // - // Expression elseLeft, elseRight; - // if (!ExtractExpression(condition.FalseStatement, out elseLeft, out elseRight)) { - // leftSide = null; - // rightSide = null; - // return false; - // } - // - // if (ifLeft == null && elseLeft == null) { - // leftSide = null; - // rightSide = null; - // return true; - // } - // - // if (ifLeft != null && elseLeft != null && !SameNode(ifLeft, elseLeft)) { - // leftSide = null; - // rightSide = null; - // return false; - // } - // - // ifRight = ifRight ?? new PrimitiveExpression(0); - // elseRight = elseRight ?? new PrimitiveExpression(0); - // - // leftSide = ifLeft ?? elseLeft; - // rightSide = new ConditionalExpression(condition.Condition.Clone(), ifRight.Clone(), elseRight.Clone()); - // return true; - // } - // - // leftSide = null; - // rightSide = null; - // return false; - // } - // - // Expression ParenthesizeIfNeeded(Expression expr) - // { - // if (expr is ConditionalExpression) { - // return new ParenthesizedExpression(expr.Clone()); - // } - // - // var binaryExpression = expr as BinaryOperatorExpression; - // if (binaryExpression != null) { - // if (binaryExpression.Operator != BinaryOperatorType.Multiply && - // binaryExpression.Operator != BinaryOperatorType.Divide && - // binaryExpression.Operator != BinaryOperatorType.Modulus) { - // - // return new ParenthesizedExpression(expr.Clone()); - // } - // } - // - // return expr; - // } - // - // bool SameNode(INode expr1, INode expr2) - // { - // Match m = expr1.Match(expr2); - // return m.Success; - // } - // - // static ForeachStatement GetForeachStatement (SemanticModel context) - // { - // var foreachStatement = context.GetNode(); - // if (foreachStatement == null || !foreachStatement.ForeachToken.Contains(context.Location)) - // return null; - // - // return foreachStatement; - // } + ExpressionSyntax GetExpressionToReplace(SyntaxNode prevSibling, ExpressionSyntax requiredLeftSide) + { + if (prevSibling == null) + return null; + + var declarationStatement = prevSibling as LocalDeclarationStatementSyntax; + if (declarationStatement != null) { + if (declarationStatement.Declaration?.Variables.Count != 1) + return null; + + var identifierExpr = requiredLeftSide as IdentifierNameSyntax; + if (identifierExpr == null) + return null; + + var variableDecl = declarationStatement.Declaration.Variables.First(); + if (identifierExpr.Identifier.Text != variableDecl.Identifier.Text) + return null; + + return variableDecl.Initializer.Value; + } + + var exprStatement = prevSibling as ExpressionStatementSyntax; + if (exprStatement != null) { + if (!exprStatement.Expression.IsKind(SyntaxKind.SimpleAssignmentExpression, SyntaxKind.AddAssignmentExpression)) + return null; + if (((AssignmentExpressionSyntax)exprStatement.Expression).Left.ToString() != requiredLeftSide.ToString()) + return null; + return ((AssignmentExpressionSyntax)exprStatement.Expression).Right; + } + + return null; + } + + static LambdaExpressionSyntax BuildLambda(SyntaxToken variableName, ExpressionSyntax expression) + { + return SyntaxFactory.SimpleLambdaExpression( + SyntaxFactory.Parameter(variableName), + expression + ); + } + + bool IsLinqSummableType(ITypeSymbol type) + { + // Disabled for nullables, since int? x = 3; x += null; has result x = null, + // but LINQ Sum behaves differently : nulls are treated as zero + switch (type.SpecialType) { + case SpecialType.System_UInt16: + case SpecialType.System_Int16: + case SpecialType.System_UInt32: + case SpecialType.System_Int32: + case SpecialType.System_UInt64: + case SpecialType.System_Int64: + case SpecialType.System_Single: + case SpecialType.System_Double: + case SpecialType.System_Decimal: + return true; + } + return false; + } + + bool ExtractExpression(StatementSyntax statement, out ExpressionSyntax leftSide, out ExpressionSyntax rightSide) + { + leftSide = null; + rightSide = null; + + if (statement == null || statement is EmptyStatementSyntax) + return true; + + switch (statement.Kind()) { + case SyntaxKind.ExpressionStatement: + var expression = ((ExpressionStatementSyntax)statement).Expression; + switch (expression?.Kind()) { + case SyntaxKind.AddAssignmentExpression: + leftSide = ((AssignmentExpressionSyntax)expression).Left; + rightSide = ((AssignmentExpressionSyntax)expression).Right; + return true; + case SyntaxKind.SubtractAssignmentExpression: + leftSide = ((AssignmentExpressionSyntax)expression).Left; + rightSide = SyntaxFactory.PrefixUnaryExpression(SyntaxKind.UnaryMinusExpression, ((AssignmentExpressionSyntax)expression).Right); + return true; + case SyntaxKind.PostDecrementExpression: + case SyntaxKind.PreDecrementExpression: + leftSide = expression.ExtractUnaryOperand(); + rightSide = ComputeConstantValueCodeRefactoringProvider.GetLiteralExpression(-1); + return true; + case SyntaxKind.PostIncrementExpression: + case SyntaxKind.PreIncrementExpression: + leftSide = expression.ExtractUnaryOperand(); + rightSide = ComputeConstantValueCodeRefactoringProvider.GetLiteralExpression(1); + return true; + } + return false; + case SyntaxKind.Block: + var block = (BlockSyntax)statement; + foreach (StatementSyntax child in block.Statements) { + ExpressionSyntax newLeft, newRight; + if (!ExtractExpression(child, out newLeft, out newRight)) + return false; + + if (newLeft == null) + continue; + + if (leftSide == null) { + leftSide = newLeft; + rightSide = newRight; + } else if (leftSide.IsEquivalentTo(newLeft)) { + rightSide = SyntaxFactory.BinaryExpression( + SyntaxKind.AddExpression, + CSharpUtil.AddParensIfRequired(rightSide), + CSharpUtil.AddParensIfRequired(newRight) + ); + } else { + return false; + } + } + return true; + case SyntaxKind.IfStatement: + var condition = (IfStatementSyntax)statement; + ExpressionSyntax ifLeft, ifRight; + if (!ExtractExpression(condition.Statement, out ifLeft, out ifRight)) + return false; + + ExpressionSyntax elseLeft, elseRight; + if (!ExtractExpression(condition.Else?.Statement, out elseLeft, out elseRight)) + return false; + + if (ifLeft == null && elseLeft == null) + return true; + if (ifLeft != null && elseLeft != null && !ifLeft.IsEquivalentTo(elseLeft)) + return false; + + ifRight = ifRight ?? ComputeConstantValueCodeRefactoringProvider.GetLiteralExpression(0); + elseRight = elseRight ?? ComputeConstantValueCodeRefactoringProvider.GetLiteralExpression(0); + + leftSide = ifLeft ?? elseLeft; + rightSide = SyntaxFactory.ConditionalExpression(condition.Condition, ifRight, elseRight); + return true; + } + return false; + } } } diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/UseMethodAnyAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/UseMethodAnyAnalyzer.cs index f1c40281..7937588c 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/UseMethodAnyAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/PracticesAndImprovements/UseMethodAnyAnalyzer.cs @@ -8,7 +8,6 @@ namespace RefactoringEssentials.CSharp.Diagnostics { [DiagnosticAnalyzer(LanguageNames.CSharp)] - [NotPortedYet] public class UseMethodAnyAnalyzer : DiagnosticAnalyzer { static readonly DiagnosticDescriptor descriptor = new DiagnosticDescriptor( diff --git a/RefactoringEssentials/CodeAnalyzers.CSharp.html b/RefactoringEssentials/CodeAnalyzers.CSharp.html index 1fdf8bef..12525704 100644 --- a/RefactoringEssentials/CodeAnalyzers.CSharp.html +++ b/RefactoringEssentials/CodeAnalyzers.CSharp.html @@ -15,7 +15,7 @@ -->

                      Supported Code Analyzers

                      -

                      120 code analyzers for C#

                      +

                      121 code analyzers for C#

                      • Suggests using the class declaring a static function when calling it (AccessToStaticMemberViaDerivedTypeAnalyzer)
                      • When initializing explicitly typed local variable or array type, array creation expression can be replaced with array initializer. (ArrayCreationCanBeReplacedWithArrayInitializerAnalyzer)
                      • @@ -135,6 +135,7 @@

                        Supported Code Analyzers

                      • [ThreadStatic] doesn't work with instance fields (ThreadStaticAtInstanceFieldAnalyzer)
                      • Parameter is never used (UnusedParameterAnalyzer)
                      • Type parameter is never used (UnusedTypeParameterAnalyzer)
                      • +
                      • Replace usages of 'Count()' with call to 'Any()' (UseMethodAnyAnalyzer)
                      • Warns about property or indexer setters and event adders or removers that do not use the value parameter (ValueParameterNotUsedAnalyzer)
                      • Validate Xml docs (XmlDocAnalyzer)
                      diff --git a/RefactoringEssentials/CodeRefactorings.CSharp.html b/RefactoringEssentials/CodeRefactorings.CSharp.html index c44d2d40..668b18db 100644 --- a/RefactoringEssentials/CodeRefactorings.CSharp.html +++ b/RefactoringEssentials/CodeRefactorings.CSharp.html @@ -15,7 +15,7 @@ -->

                      Supported Refactorings

                      -

                      103 code refactorings for C#

                      +

                      104 code refactorings for C#

                      • Adds another accessor (AddAnotherAccessorCodeRefactoringProvider)
                      • Add braces (AddBracesCodeRefactoringProvider)
                      • @@ -25,6 +25,7 @@

                        Supported Refactorings

                      • Introduce format item (AddNewFormatItemCodeRefactoringProvider)
                      • Add null check (AddNullCheckCodeRefactoringProvider)
                      • Add one or more optional parameters to an invocation, using their default values (AddOptionalParameterToInvocationCodeRefactoringProvider)
                      • +
                      • Convert loop to Linq expression (AutoLinqSumAction)
                      • Check array index value (CheckArrayIndexValueCodeRefactoringProvider)
                      • Check collection index value (CheckCollectionIndexValueCodeRefactoringProvider)
                      • Check dictionary key value (CheckDictionaryKeyValueCodeRefactoringProvider)
                      • diff --git a/RefactoringEssentials/Util/CSharpUtil.cs b/RefactoringEssentials/Util/CSharpUtil.cs index 2831dd2a..bb200a3b 100644 --- a/RefactoringEssentials/Util/CSharpUtil.cs +++ b/RefactoringEssentials/Util/CSharpUtil.cs @@ -215,6 +215,17 @@ public static bool AreConditionsEqual(ExpressionSyntax cond1, ExpressionSyntax c return cond1.SkipParens().IsEquivalentTo(cond2.SkipParens(), true); } + public static ExpressionSyntax ExtractUnaryOperand(this ExpressionSyntax expr) + { + if (expr == null) + throw new ArgumentNullException(nameof(expr)); + if (expr is PostfixUnaryExpressionSyntax) + return ((PostfixUnaryExpressionSyntax)expr).Operand; + if (expr is PrefixUnaryExpressionSyntax) + return ((PrefixUnaryExpressionSyntax)expr).Operand; + return null; + } + public static T WithBody(this T method, BlockSyntax body) where T : BaseMethodDeclarationSyntax { if (method == null) diff --git a/RefactoringEssentials/Util/EnumerableExtensions.cs b/RefactoringEssentials/Util/EnumerableExtensions.cs index 03254116..ce53340d 100644 --- a/RefactoringEssentials/Util/EnumerableExtensions.cs +++ b/RefactoringEssentials/Util/EnumerableExtensions.cs @@ -348,5 +348,18 @@ public static bool Contains(this IEnumerable sequence, Func predi { return sequence.Any(predicate); } + + public static int IndexOf(this IEnumerable sequence, Func predicate) + { + if (sequence == null) + throw new ArgumentNullException(nameof(sequence)); + int index = 0; + foreach (var item in sequence) { + if (predicate(item)) + return index; + index++; + } + return -1; + } } } diff --git a/RefactoringEssentials/missing.md b/RefactoringEssentials/missing.md index b793c4b7..42b53b30 100644 --- a/RefactoringEssentials/missing.md +++ b/RefactoringEssentials/missing.md @@ -5,7 +5,6 @@ **C#** -* AutoLinqSumAction * ChangeAccessModifierAction * CreateIndexerAction * GenerateGetterAction @@ -52,6 +51,5 @@ * UnusedAnonymousMethodSignatureAnalyzer * UseArrayCreationExpressionAnalyzer * UseIsOperatorAnalyzer -* UseMethodAnyAnalyzer * UseMethodIsInstanceOfTypeAnalyzer diff --git a/Tests/CSharp/CodeRefactorings/AutoLinqSumTests.cs b/Tests/CSharp/CodeRefactorings/AutoLinqSumTests.cs index adf3ee75..797b8d85 100644 --- a/Tests/CSharp/CodeRefactorings/AutoLinqSumTests.cs +++ b/Tests/CSharp/CodeRefactorings/AutoLinqSumTests.cs @@ -5,7 +5,7 @@ namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { public class AutoLinqSumActionTests : CSharpCodeRefactoringTestBase { - [Fact(Skip="Not implemented!")] + [Fact] public void TestSimpleIntegerLoop() { string source = @" @@ -13,12 +13,12 @@ public void TestSimpleIntegerLoop() class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - $foreach (var x in list) - result += x; - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + $foreach (var x in list) + result += x; + } }"; string result = @" @@ -26,17 +26,17 @@ void TestMethod() { class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - result += list.Sum (); - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + result += list.Sum(); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestMergedIntegerLoop() { string source = @" @@ -44,12 +44,12 @@ public void TestMergedIntegerLoop() class TestClass { - void TestMethod() { - var list = new int[] { 1, 2, 3 }; - int result = 0; - $foreach (var x in list) - result += x; - } + void TestMethod() { + var list = new int[] { 1, 2, 3 }; + int result = 0; + $foreach (var x in list) + result += x; + } }"; string result = @" @@ -57,16 +57,16 @@ void TestMethod() { class TestClass { - void TestMethod() { - var list = new int[] { 1, 2, 3 }; - int result = list.Sum (); - } + void TestMethod() { + var list = new int[] { 1, 2, 3 }; + int result = list.Sum(); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestNonZeroMergedIntegerLoop() { string source = @" @@ -74,12 +74,12 @@ public void TestNonZeroMergedIntegerLoop() class TestClass { - void TestMethod() { - var list = new int[] { 1, 2, 3 }; - int result = 1; - $foreach (var x in list) - result += x; - } + void TestMethod() { + var list = new int[] { 1, 2, 3 }; + int result = 1; + $foreach (var x in list) + result += x; + } }"; string result = @" @@ -87,16 +87,16 @@ void TestMethod() { class TestClass { - void TestMethod() { - var list = new int[] { 1, 2, 3 }; - int result = 1 + list.Sum (); - } + void TestMethod() { + var list = new int[] { 1, 2, 3 }; + int result = 1 + list.Sum(); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestMergedAssignmentIntegerLoop() { string source = @" @@ -104,13 +104,13 @@ public void TestMergedAssignmentIntegerLoop() class TestClass { - void TestMethod() { - var list = new int[] { 1, 2, 3 }; - int result; - result = 1; - $foreach (var x in list) - result += x; - } + void TestMethod() { + var list = new int[] { 1, 2, 3 }; + int result; + result = 1; + $foreach (var x in list) + result += x; + } }"; string result = @" @@ -118,17 +118,17 @@ void TestMethod() { class TestClass { - void TestMethod() { - var list = new int[] { 1, 2, 3 }; - int result; - result = 1 + list.Sum (); - } + void TestMethod() { + var list = new int[] { 1, 2, 3 }; + int result; + result = 1 + list.Sum(); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestMergedDecimal() { string source = @" @@ -136,12 +136,12 @@ public void TestMergedDecimal() class TestClass { - void TestMethod() { - var list = new int[] { 1, 2, 3 }; - decimal result = 0.0m; - $foreach (var x in list) - result += x; - } + void TestMethod() { + var list = new int[] { 1, 2, 3 }; + decimal result = 0.0m; + $foreach (var x in list) + result += x; + } }"; string result = @" @@ -149,16 +149,16 @@ void TestMethod() { class TestClass { - void TestMethod() { - var list = new int[] { 1, 2, 3 }; - decimal result = list.Sum (); - } + void TestMethod() { + var list = new int[] { 1, 2, 3 }; + decimal result = list.Sum(); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestIntegerLoopInBlock() { string source = @" @@ -166,13 +166,13 @@ public void TestIntegerLoopInBlock() class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - $foreach (var x in list) { - result += x; - } - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + $foreach (var x in list) { + result += x; + } + } }"; string result = @" @@ -180,17 +180,17 @@ void TestMethod() { class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - result += list.Sum (); - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + result += list.Sum(); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestExpression() { string source = @" @@ -198,13 +198,13 @@ public void TestExpression() class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - $foreach (var x in list) { - result += x * 2; - } - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + $foreach (var x in list) { + result += x * 2; + } + } }"; string result = @" @@ -212,14 +212,14 @@ void TestMethod() { class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - result += list.Sum (x => x * 2); - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + result += list.Sum(x => x * 2); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } [Fact] @@ -230,18 +230,18 @@ public void TestDisabledForStrings() class TestClass { - void TestMethod() { - string result = string.Empty; - var list = new string[] { ""a"", ""b"" }; - $foreach (var x in list) { - result += x; - } - } + void TestMethod() { + string result = string.Empty; + var list = new string[] { ""a"", ""b"" }; + $foreach (var x in list) { + result += x; + } + } }"; TestWrongContext(source); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestShort() { string source = @" @@ -249,12 +249,12 @@ public void TestShort() class TestClass { - void TestMethod() { - short result = 0; - var list = new short[] { 1, 2, 3 }; - $foreach (var x in list) - result += x; - } + void TestMethod() { + short result = 0; + var list = new short[] { 1, 2, 3 }; + $foreach (var x in list) + result += x; + } }"; string result = @" @@ -262,17 +262,17 @@ void TestMethod() { class TestClass { - void TestMethod() { - short result = 0; - var list = new short[] { 1, 2, 3 }; - result += list.Sum (); - } + void TestMethod() { + short result = 0; + var list = new short[] { 1, 2, 3 }; + result += list.Sum(); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestLong() { string source = @" @@ -280,12 +280,12 @@ public void TestLong() class TestClass { - void TestMethod() { - long result = 0; - var list = new long[] { 1, 2, 3 }; - $foreach (var x in list) - result += x; - } + void TestMethod() { + long result = 0; + var list = new long[] { 1, 2, 3 }; + $foreach (var x in list) + result += x; + } }"; string result = @" @@ -293,17 +293,16 @@ void TestMethod() { class TestClass { - void TestMethod() { - long result = 0; - var list = new long[] { 1, 2, 3 }; - result += list.Sum (); - } + void TestMethod() { + long result = 0; + var list = new long[] { 1, 2, 3 }; + result += list.Sum(); + } }"; - - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestUnsignedLong() { string source = @" @@ -311,12 +310,12 @@ public void TestUnsignedLong() class TestClass { - void TestMethod() { - ulong result = 0; - var list = new ulong[] { 1, 2, 3 }; - $foreach (var x in list) - result += x; - } + void TestMethod() { + ulong result = 0; + var list = new ulong[] { 1, 2, 3 }; + $foreach (var x in list) + result += x; + } }"; string result = @" @@ -324,17 +323,17 @@ void TestMethod() { class TestClass { - void TestMethod() { - ulong result = 0; - var list = new ulong[] { 1, 2, 3 }; - result += list.Sum (); - } + void TestMethod() { + ulong result = 0; + var list = new ulong[] { 1, 2, 3 }; + result += list.Sum(); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestFloat() { string source = @" @@ -342,12 +341,12 @@ public void TestFloat() class TestClass { - void TestMethod() { - float result = 0; - var list = new float[] { 1, 2, 3 }; - $foreach (var x in list) - result += x; - } + void TestMethod() { + float result = 0; + var list = new float[] { 1, 2, 3 }; + $foreach (var x in list) + result += x; + } }"; string result = @" @@ -355,17 +354,17 @@ void TestMethod() { class TestClass { - void TestMethod() { - float result = 0; - var list = new float[] { 1, 2, 3 }; - result += list.Sum (); - } + void TestMethod() { + float result = 0; + var list = new float[] { 1, 2, 3 }; + result += list.Sum(); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestDouble() { string source = @" @@ -373,12 +372,12 @@ public void TestDouble() class TestClass { - void TestMethod() { - double result = 0; - var list = new double[] { 1, 2, 3 }; - $foreach (var x in list) - result += x; - } + void TestMethod() { + double result = 0; + var list = new double[] { 1, 2, 3 }; + $foreach (var x in list) + result += x; + } }"; string result = @" @@ -386,17 +385,17 @@ void TestMethod() { class TestClass { - void TestMethod() { - double result = 0; - var list = new double[] { 1, 2, 3 }; - result += list.Sum (); - } + void TestMethod() { + double result = 0; + var list = new double[] { 1, 2, 3 }; + result += list.Sum(); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestDecimal() { string source = @" @@ -404,12 +403,12 @@ public void TestDecimal() class TestClass { - void TestMethod() { - decimal result = 0; - var list = new decimal[] { 1, 2, 3 }; - $foreach (var x in list) - result += x; - } + void TestMethod() { + decimal result = 0; + var list = new decimal[] { 1, 2, 3 }; + $foreach (var x in list) + result += x; + } }"; string result = @" @@ -417,17 +416,17 @@ void TestMethod() { class TestClass { - void TestMethod() { - decimal result = 0; - var list = new decimal[] { 1, 2, 3 }; - result += list.Sum (); - } + void TestMethod() { + decimal result = 0; + var list = new decimal[] { 1, 2, 3 }; + result += list.Sum(); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestMinus() { string source = @" @@ -435,13 +434,13 @@ public void TestMinus() class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - $foreach (var x in list) { - result -= x; - } - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + $foreach (var x in list) { + result -= x; + } + } }"; string result = @" @@ -449,17 +448,17 @@ void TestMethod() { class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - result += list.Sum (x => -x); - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + result += list.Sum(x => -x); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestCombined() { string source = @" @@ -467,14 +466,14 @@ public void TestCombined() class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - $foreach (var x in list) { - result += x; - result += 2 * x; - } - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + $foreach (var x in list) { + result += x; + result += 2 * x; + } + } }"; string result = @" @@ -482,17 +481,17 @@ void TestMethod() { class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - result += list.Sum (x => x + 2 * x); - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + result += list.Sum(x => x + (2 * x)); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestCombinedPrecedence() { string source = @" @@ -500,14 +499,14 @@ public void TestCombinedPrecedence() class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - $foreach (var x in list) { - result += x; - result += x << 1; - } - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + $foreach (var x in list) { + result += x; + result += x << 1; + } + } }"; string result = @" @@ -515,17 +514,17 @@ void TestMethod() { class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - result += list.Sum (x => x + (x << 1)); - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + result += list.Sum(x => x + (x << 1)); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestEmptyStatements() { string source = @" @@ -533,14 +532,14 @@ public void TestEmptyStatements() class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - $foreach (var x in list) { - result += x; - ; - } - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + $foreach (var x in list) { + result += x; + ; + } + } }"; string result = @" @@ -548,17 +547,17 @@ void TestMethod() { class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - result += list.Sum (); - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + result += list.Sum(); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestSimpleConditional() { string source = @" @@ -566,14 +565,14 @@ public void TestSimpleConditional() class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - $foreach (var x in list) { - if (x > 0) - result += x; - } - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + $foreach (var x in list) { + if (x > 0) + result += x; + } + } }"; string result = @" @@ -581,17 +580,17 @@ void TestMethod() { class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - result += list.Where (x => x > 0).Sum (); - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + result += list.Where(x => x > 0).Sum(); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestInvertedConditional() { string source = @" @@ -599,16 +598,16 @@ public void TestInvertedConditional() class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - $foreach (var x in list) { - if (x > 0) - ; - else - result += x; - } - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + $foreach (var x in list) { + if (x > 0) + ; + else + result += x; + } + } }"; string result = @" @@ -616,17 +615,17 @@ void TestMethod() { class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - result += list.Where (x => x <= 0).Sum (); - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + result += list.Where(x => x <= 0).Sum(); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestIncrement() { string source = @" @@ -634,13 +633,13 @@ public void TestIncrement() class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - $foreach (var x in list) { - result++; - } - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + $foreach (var x in list) { + result++; + } + } }"; string result = @" @@ -648,17 +647,17 @@ void TestMethod() { class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - result += list.Count (); - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + result += list.Count(); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestCompleteConditional() { string source = @" @@ -666,16 +665,16 @@ public void TestCompleteConditional() class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - $foreach (var x in list) { - if (x > 0) - result += x * 2; - else - result += x; - } - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + $foreach (var x in list) { + if (x > 0) + result += x * 2; + else + result += x; + } + } }"; string result = @" @@ -683,14 +682,14 @@ void TestMethod() { class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2, 3 }; - result += list.Sum (x => x > 0 ? x * 2 : x); - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2, 3 }; + result += list.Sum(x => x > 0 ? x * 2 : x); + } }"; - Assert.Equal(result, RunContextAction(new AutoLinqSumAction(), source)); + Test(source, result); } [Fact] @@ -701,14 +700,14 @@ public void TestDisabledForSideEffects() class TestClass { - void TestMethod() { - string result = string.Empty; - var list = new string[] { ""a"", ""b"" }; - $foreach (var x in list) { - TestMethod(); - result += x; - } - } + void TestMethod() { + string result = string.Empty; + var list = new string[] { ""a"", ""b"" }; + $foreach (var x in list) { + TestMethod(); + result += x; + } + } }"; TestWrongContext(source); } @@ -721,14 +720,14 @@ public void TestDisabledForInnerAssignments() class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2 }; - int p = 0; - $foreach (var x in list) { - result += (p = x); - } - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2 }; + int p = 0; + $foreach (var x in list) { + result += (p = x); + } + } }"; TestWrongContext(source); } @@ -741,14 +740,14 @@ public void TestDisabledForInnerIncrements() class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2 }; - int p = 0; - $foreach (var x in list) { - result += (p++); - } - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2 }; + int p = 0; + $foreach (var x in list) { + result += (p++); + } + } }"; TestWrongContext(source); } @@ -759,13 +758,13 @@ public void TestDisabledForNoLinq() string source = @" class TestClass { - void TestMethod() { - int result = 0; - var list = new int[] { 1, 2 }; - $foreach (var x in list) { - result += x; - } - } + void TestMethod() { + int result = 0; + var list = new int[] { 1, 2 }; + $foreach (var x in list) { + result += x; + } + } }"; TestWrongContext(source); } From c26a4926ead8b0570f69c486943935486b2a9072 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 17 Feb 2017 23:22:50 +0100 Subject: [PATCH 107/236] Fix CheckIfParameterIsNullTests --- .../CheckIfParameterIsNullTests.cs | 86 ++++++++----------- 1 file changed, 37 insertions(+), 49 deletions(-) diff --git a/Tests/CSharp/CodeRefactorings/CheckIfParameterIsNullTests.cs b/Tests/CSharp/CodeRefactorings/CheckIfParameterIsNullTests.cs index 40877e74..2778af1a 100644 --- a/Tests/CSharp/CodeRefactorings/CheckIfParameterIsNullTests.cs +++ b/Tests/CSharp/CodeRefactorings/CheckIfParameterIsNullTests.cs @@ -12,59 +12,47 @@ public class CheckIfParameterIsNullTests : CSharpCodeRefactoringTestBase [Fact] public void Test() { - string result = RunContextAction( - new CheckIfParameterIsNullCodeRefactoringProvider(), - "using System;" + Environment.NewLine + - "class TestClass" + Environment.NewLine + - "{" + Environment.NewLine + - " void Test (string $param)" + Environment.NewLine + - " {" + Environment.NewLine + - " Console.WriteLine (param);" + Environment.NewLine + - " }" + Environment.NewLine + - "}" - ); - - Assert.Equal( - "using System;" + Environment.NewLine + - "class TestClass" + Environment.NewLine + - "{" + Environment.NewLine + - " void Test (string param)" + Environment.NewLine + - " {" + Environment.NewLine + - " if (param == null)" + Environment.NewLine + - " throw new ArgumentNullException(nameof(param));" + Environment.NewLine + - " Console.WriteLine (param);" + Environment.NewLine + - " }" + Environment.NewLine + - "}", result); + Test(@"using System; +class TestClass +{ + void Test (string $param) + { + Console.WriteLine (param); + } +}", @"using System; +class TestClass +{ + void Test (string param) + { + if (param == null) + throw new ArgumentNullException(nameof(param)); + Console.WriteLine (param); + } +}"); } - [Fact(Skip="Broken.")] + [Fact] public void TestWithComment() { - string result = RunContextAction( - new CheckIfParameterIsNullCodeRefactoringProvider(), - "using System;" + Environment.NewLine + - "class TestClass" + Environment.NewLine + - "{" + Environment.NewLine + - " void Test (string $param)" + Environment.NewLine + - " {" + Environment.NewLine + - " // Some comment" + Environment.NewLine + - " Console.WriteLine (param);" + Environment.NewLine + - " }" + Environment.NewLine + - "}" - ); - - Assert.Equal( - "using System;" + Environment.NewLine + - "class TestClass" + Environment.NewLine + - "{" + Environment.NewLine + - " void Test (string param)" + Environment.NewLine + - " {" + Environment.NewLine + - " if (param == null)" + Environment.NewLine + - " throw new ArgumentNullException(\"param\");" + Environment.NewLine + - " // Some comment" + Environment.NewLine + - " Console.WriteLine (param);" + Environment.NewLine + - " }" + Environment.NewLine + - "}", result); + Test(@"using System; +class TestClass +{ + void Test (string $param) + { + // Some comment + Console.WriteLine(param); + } +}", @"using System; +class TestClass +{ + void Test (string param) + { + if (param == null) + throw new ArgumentNullException(nameof(param)); + // Some comment + Console.WriteLine(param); + } +}"); } [Fact] From 7e0d862f6784d5b39de63f8b63e9c73dc66b5988 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 17 Feb 2017 23:44:11 +0100 Subject: [PATCH 108/236] Fix broken test --- ...rtStringFormatToInterpolatedStringTests.cs | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/Tests/CSharp/CodeRefactorings/ConvertStringFormatToInterpolatedStringTests.cs b/Tests/CSharp/CodeRefactorings/ConvertStringFormatToInterpolatedStringTests.cs index 6bd73845..46d80871 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertStringFormatToInterpolatedStringTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertStringFormatToInterpolatedStringTests.cs @@ -1,3 +1,4 @@ +using System; using RefactoringEssentials.CSharp.CodeRefactorings; using Xunit; @@ -72,12 +73,27 @@ void Foo () }"); } - [Fact(Skip="Broken on windows")] + [Fact] public void TestVerbatimStringFormat() { Test( - "class TestClass\n{\n void Foo ()\n {\n var world = \"World\";\n var str = $string.Format (@\"Hello \"\" {0}\n!\", world);\n }\n}", - "class TestClass\n{\n void Foo ()\n {\n var world = \"World\";\n var str = $\"Hello \\\" {world}\\n!\";\n }\n}"); + @"class TestClass +{ + void Foo () + { + var world = ""World""; + var str = $string.Format (@""Hello """" {0} +!"", world); + } +}", + @"class TestClass +{ + void Foo () + { + var world = ""World""; + var str = $""Hello \"" {world}" + Environment.NewLine.Replace("\r", "\\r").Replace("\n", "\\n") + @"!""; + } +}"); } } } From 5409d483e780ccf8fb5e3834e4d8e6f8dfc64ff9 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 18 Feb 2017 09:15:20 +0100 Subject: [PATCH 109/236] Improve output of CSharpCodeRefactoringTestBase for xUnit --- .../CSharpCodeRefactoringTestBase.cs | 36 ++++++------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/Tests/CSharp/CodeRefactorings/CSharpCodeRefactoringTestBase.cs b/Tests/CSharp/CodeRefactorings/CSharpCodeRefactoringTestBase.cs index d2e9e616..38725ff1 100644 --- a/Tests/CSharp/CodeRefactorings/CSharpCodeRefactoringTestBase.cs +++ b/Tests/CSharp/CodeRefactorings/CSharpCodeRefactoringTestBase.cs @@ -12,6 +12,7 @@ using Microsoft.CodeAnalysis.CodeActions; using Microsoft.CodeAnalysis.Simplification; using Xunit; +using System.Text; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { @@ -30,17 +31,18 @@ public void Test(CodeRefactoringProvider provider, string input, string output, bool passed = result == output; if (!passed) { - Console.WriteLine("-----------Expected:"); - Console.WriteLine(output); - Console.WriteLine("-----------Got:"); - Console.WriteLine(result); + StringBuilder sb = new StringBuilder(); + sb.AppendLine("-----------Expected:"); + sb.AppendLine(output); + sb.AppendLine("-----------Got:"); + sb.AppendLine(result); + Assert.True(passed, sb.ToString()); } - Assert.Equal(output, result); } - internal static List GetActions(string input) where T : CodeRefactoringProvider, new() + internal static List GetActions(string input) where T : CodeRefactoringProvider, new() { - CSharpDiagnosticTestBase.TestWorkspace workspace; + DiagnosticTestBase.TestWorkspace workspace; Document doc; return GetActions(new T(), input, out workspace, out doc); } @@ -135,32 +137,14 @@ protected string RunContextAction(CodeRefactoringProvider action, string input, protected void TestWrongContext(CodeRefactoringProvider action, string input) { Document doc; - RefactoringEssentials.Tests.CSharp.Diagnostics.CSharpDiagnosticTestBase.TestWorkspace workspace; + CSharpDiagnosticTestBase.TestWorkspace workspace; var actions = GetActions(action, input, out workspace, out doc); Assert.True(actions == null || actions.Count == 0, action.GetType() + " shouldn't be valid there."); } - protected void TestWrongContext(string input) where T : CodeRefactoringProvider, new() { TestWrongContext(new T(), input); } - - // protected List GetActions (string input) where T : CodeActionProvider, new () - // { - // var ctx = TestRefactoringContext.Create(input); - // ctx.FormattingOptions = formattingOptions; - // return new T().GetActions(ctx).ToList(); - // } - // - // protected void TestActionDescriptions (CodeActionProvider provider, string input, params string[] expected) - // { - // var ctx = TestRefactoringContext.Create(input); - // ctx.FormattingOptions = formattingOptions; - // var actions = provider.GetActions(ctx).ToList(); - // Assert.Equal( - // expected, - // actions.Select(a => a.Description).ToArray()); - // } } } From 6650d81cbf1246dba80c18db514253a9fd83e1f4 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 18 Feb 2017 09:25:48 +0100 Subject: [PATCH 110/236] Reimplement GenerateGetterAction --- .../Uncategorized/GenerateGetterAction.cs | 153 +++++++++--------- .../CodeRefactorings.CSharp.html | 3 +- RefactoringEssentials/missing.md | 1 - .../CodeRefactorings/GenerateGetterTests.cs | 127 ++++++++++++--- 4 files changed, 188 insertions(+), 96 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/GenerateGetterAction.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/GenerateGetterAction.cs index f7c585e6..7e40a7f2 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/GenerateGetterAction.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/GenerateGetterAction.cs @@ -1,85 +1,92 @@ -using Microsoft.CodeAnalysis.CodeRefactorings; -using Microsoft.CodeAnalysis; +using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CodeRefactorings; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Formatting; namespace RefactoringEssentials.CSharp.CodeRefactorings { [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Generate getter")] - [NotPortedYet] public class GenerateGetterAction : CodeRefactoringProvider { - public override Task ComputeRefactoringsAsync(CodeRefactoringContext context) + public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) + { + var document = context.Document; + if (document.Project.Solution.Workspace.Kind == WorkspaceKind.MiscellaneousFiles) + return; + var span = context.Span; + if (!span.IsEmpty) + return; + var cancellationToken = context.CancellationToken; + if (cancellationToken.IsCancellationRequested) + return; + var model = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); + if (model.IsFromGeneratedCode(cancellationToken)) + return; + var root = await model.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); + var token = root.FindToken(span.Start); + if (!(token.Parent is VariableDeclaratorSyntax)) + return; + var declarator = (VariableDeclaratorSyntax)token.Parent; + var fieldDeclaration = declarator.Parent?.Parent as FieldDeclarationSyntax; + if (fieldDeclaration == null) + return; + var enclosingType = fieldDeclaration.Parent as TypeDeclarationSyntax; + if (enclosingType == null) + return; + foreach (var member in enclosingType.Members) { + if (member is PropertyDeclarationSyntax && ContainsGetter(model, (PropertyDeclarationSyntax)member, declarator)) + return; + } + context.RegisterRefactoring( + CodeActionFactory.Create( + token.Span, + DiagnosticSeverity.Info, + GettextCatalog.GetString("Generate getter"), + t2 => { + var newRoot = root.InsertNodesAfter(fieldDeclaration, new[] { GeneratePropertyDeclaration(fieldDeclaration, declarator) }); + return Task.FromResult(document.WithSyntaxRoot(newRoot)); + } + ) + ); + } + + static PropertyDeclarationSyntax GeneratePropertyDeclaration(FieldDeclarationSyntax field, VariableDeclaratorSyntax initializer) + { + var modifiers = SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PublicKeyword)); + if (field.Modifiers.Any(m => m.IsKind(SyntaxKind.StaticKeyword))) + modifiers = modifiers.Add(SyntaxFactory.Token(SyntaxKind.StaticKeyword)); + + string propertyName = NameProposalService.GetNameProposal(initializer.Identifier.ValueText, SyntaxKind.PropertyDeclaration); + var block = SyntaxFactory.Block(SyntaxFactory.ReturnStatement(SyntaxFactory.IdentifierName(initializer.Identifier))); + return SyntaxFactory.PropertyDeclaration(field.Declaration.Type, propertyName) + .WithModifiers(modifiers) + .WithAccessorList( + SyntaxFactory.AccessorList(SyntaxFactory.SingletonList( + SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration, block) + )) + ).WithAdditionalAnnotations(Formatter.Annotation); + } + + static bool ContainsGetter(SemanticModel model, PropertyDeclarationSyntax property, VariableDeclaratorSyntax declarator) { - //var document = context.Document; - //var span = context.Span; - //var cancellationToken = context.CancellationToken; - //var model = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); - //if (model.IsFromGeneratedCode(cancellationToken)) - // return; - //var root = await model.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); - return Task.FromResult(0); + var symbol = model.GetDeclaredSymbol(declarator); + if (property.ExpressionBody != null) + return model.GetSymbolInfo(property.ExpressionBody.Expression).Symbol == symbol; + var getter = property.AccessorList?.Accessors.FirstOrDefault(a => a.IsKind(SyntaxKind.GetAccessorDeclaration)); + if (getter == null || getter.Body?.Statements.Count != 1) + return false; +#if RE2017 +#warning "Check for get => ExpressionBody!" +#endif + var ret = getter.Body?.Statements.Single() as ReturnStatementSyntax; + if (ret == null) + return false; + return model.GetSymbolInfo(ret.Expression).Symbol == symbol; } - // public async Task ComputeRefactoringsAsync(Document document, TextSpan span, CancellationToken cancellationToken) - // { - // var initializer = GetVariableInitializer(context); - // if (initializer == null || !initializer.NameToken.Contains(context.Location)) { - // yield break; - // } - // var type = initializer.Parent.Parent as TypeDeclaration; - // if (type == null) { - // yield break; - // } - // foreach (var member in type.Members) { - // if (member is PropertyDeclaration && ContainsGetter((PropertyDeclaration)member, initializer)) { - // yield break; - // } - // } - // var field = initializer.Parent as FieldDeclaration; - // if (field == null) { - // yield break; - // } - // - // yield return new CodeAction(context.TranslateString("Create getter"), script => { - // script.InsertWithCursor( - // context.TranslateString("Create getter"), - // Script.InsertPosition.After, - // GeneratePropertyDeclaration(context, field, initializer)); - // }, initializer); - // } - // - // static PropertyDeclaration GeneratePropertyDeclaration (SemanticModel context, FieldDeclaration field, VariableInitializer initializer) - // { - // var mod = RefactoringEssentials.Modifiers.Public; - // if (field.HasModifier (RefactoringEssentials.Modifiers.Static)) - // mod |= RefactoringEssentials.Modifiers.Static; - // - // return new PropertyDeclaration () { - // Modifiers = mod, - // Name = context.GetNameProposal (initializer.Name, false), - // ReturnType = field.ReturnType.Clone (), - // Getter = new Accessor () { - // Body = new BlockStatement () { - // new ReturnStatement (new IdentifierExpression (initializer.Name)) - // } - // } - // }; - // } - // - // bool ContainsGetter (PropertyDeclaration property, VariableInitializer initializer) - // { - // if (property.Getter.IsNull || property.Getter.Body.Statements.Count () != 1) - // return false; - // var ret = property.Getter.Body.Statements.Single () as ReturnStatement; - // if (ret == null) - // return false; - // return ret.Expression.IsMatch (new IdentifierExpression (initializer.Name)) || - // ret.Expression.IsMatch (new MemberReferenceExpression (new ThisReferenceExpression (), initializer.Name)); - // } - // - // VariableInitializer GetVariableInitializer (SemanticModel context) - // { - // return context.GetNode (); - // } } } diff --git a/RefactoringEssentials/CodeRefactorings.CSharp.html b/RefactoringEssentials/CodeRefactorings.CSharp.html index 668b18db..ae55bcf6 100644 --- a/RefactoringEssentials/CodeRefactorings.CSharp.html +++ b/RefactoringEssentials/CodeRefactorings.CSharp.html @@ -15,7 +15,7 @@ -->

                        Supported Refactorings

                        -

                        104 code refactorings for C#

                        +

                        105 code refactorings for C#

                        • Adds another accessor (AddAnotherAccessorCodeRefactoringProvider)
                        • Add braces (AddBracesCodeRefactoringProvider)
                        • @@ -81,6 +81,7 @@

                          Supported Refactorings

                        • Swap 'Equals' target and argument (FlipEqualsTargetAndArgumentCodeRefactoringProvider)
                        • Flip an operator operands (FlipOperatorArgumentsCodeRefactoringProvider)
                        • Flip an relational operator operands (FlipRelationalOperatorArgumentsCodeRefactoringProvider)
                        • +
                        • Generate getter (GenerateGetterAction)
                        • Generate switch labels (GenerateSwitchLabelsCodeRefactoringProvider)
                        • Import static class with using directive in file (ImportStaticClassWithUsingCodeRefactoringProvider)
                        • Initialize auto property from constructor parameter (InitializeAutoPropertyFromConstructorParameterCodeRefactoringProvider)
                        • diff --git a/RefactoringEssentials/missing.md b/RefactoringEssentials/missing.md index 42b53b30..950c05bf 100644 --- a/RefactoringEssentials/missing.md +++ b/RefactoringEssentials/missing.md @@ -7,7 +7,6 @@ * ChangeAccessModifierAction * CreateIndexerAction -* GenerateGetterAction * IntroduceConstantAction * LinqFluentToQueryAction * LinqQueryToFluentAction diff --git a/Tests/CSharp/CodeRefactorings/GenerateGetterTests.cs b/Tests/CSharp/CodeRefactorings/GenerateGetterTests.cs index f4e52db8..006c182e 100644 --- a/Tests/CSharp/CodeRefactorings/GenerateGetterTests.cs +++ b/Tests/CSharp/CodeRefactorings/GenerateGetterTests.cs @@ -4,30 +4,115 @@ namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - public class GenerateGetterTests : CSharpCodeRefactoringTestBase + public class GenerateGetterTests : CSharpCodeRefactoringTestBase { - [Fact(Skip="Needs insertion cursor mode.")] + [Fact] public void Test() { - string result = RunContextAction( - new GenerateGetterAction(), - "using System;" + Environment.NewLine + - "class TestClass" + Environment.NewLine + - "{" + Environment.NewLine + - " int $myField;" + Environment.NewLine + - "}" - ); - Assert.Equal( - "using System;" + Environment.NewLine + - "class TestClass" + Environment.NewLine + - "{" + Environment.NewLine + - " public int MyField {" + Environment.NewLine + - " get {" + Environment.NewLine + - " return myField;" + Environment.NewLine + - " }" + Environment.NewLine + - " }" + Environment.NewLine + - " int myField;" + Environment.NewLine + - "}", result); + Test(@"using System; +class TestClass +{ + int $myField; +}", @"using System; +class TestClass +{ + int myField; + + public int MyField + { + get + { + return myField; + } + } +}"); + + Test(@"using System; +class TestClass +{ + static int $myField; +}", @"using System; +class TestClass +{ + static int myField; + + public static int MyField + { + get + { + return myField; + } + } +}"); + } + + [Fact] + public void TestSimilarPropertyExists() + { + Test(@"using System; +class TestClass +{ + int $myField; + + public int Test => 5; +}", @"using System; +class TestClass +{ + int myField; + + public int MyField + { + get + { + return myField; + } + } + + public int Test => 5; +}"); + } + + [Fact] + public void TestAlreadyImplemented() + { + TestWrongContext(@"using System; +class TestClass +{ + int $myField; + + public int MyField { get { return myField; } } +}"); + + TestWrongContext(@"using System; +class TestClass +{ + int $myField; + + public int MyField { get { return this.myField; } } +}"); + + TestWrongContext(@"using System; +class TestClass +{ + int $myField; + + public int MyField => myField; +}"); + TestWrongContext(@"using System; +class TestClass +{ + int $myField; + + public int MyField => this.myField; +}"); + + TestWrongContext(@"using System; +class TestClass +{ + int $myField; + + public int MyField { get { return myField; } set { myField = value; } }; +}"); } } } \ No newline at end of file From 7f3294948b6d4c80434e0645e37e56ff8b0ccd68 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 18 Feb 2017 09:26:21 +0100 Subject: [PATCH 111/236] Add back some more tests --- .../Uncategorized/AutoLinqSumAction.cs | 10 +++++----- .../CSharp/CodeRefactorings/ConvertForToWhileTests.cs | 2 +- .../ReplaceAssignmentWithPostfixExpressionTests.cs | 2 +- .../ReplacePostfixExpressionWithAssignmentTests.cs | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/AutoLinqSumAction.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/AutoLinqSumAction.cs index caaa0167..19d81cea 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/AutoLinqSumAction.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/AutoLinqSumAction.cs @@ -1,10 +1,10 @@ -using Microsoft.CodeAnalysis.CodeRefactorings; -using Microsoft.CodeAnalysis; -using System.Threading.Tasks; using System.Collections.Generic; -using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.CSharp; using System.Linq; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CodeRefactorings; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Formatting; namespace RefactoringEssentials.CSharp.CodeRefactorings diff --git a/Tests/CSharp/CodeRefactorings/ConvertForToWhileTests.cs b/Tests/CSharp/CodeRefactorings/ConvertForToWhileTests.cs index 9139f117..7bf6cbb0 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertForToWhileTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertForToWhileTests.cs @@ -67,7 +67,7 @@ void Foo (object[] o) }"); } - [Fact(Skip="Broken.")] + [Fact] public void TestSimpleForWithComment2() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ReplaceAssignmentWithPostfixExpressionTests.cs b/Tests/CSharp/CodeRefactorings/ReplaceAssignmentWithPostfixExpressionTests.cs index 6a63c717..66a254e2 100644 --- a/Tests/CSharp/CodeRefactorings/ReplaceAssignmentWithPostfixExpressionTests.cs +++ b/Tests/CSharp/CodeRefactorings/ReplaceAssignmentWithPostfixExpressionTests.cs @@ -25,7 +25,7 @@ void Foo (int i) }"); } - [Fact(Skip="broken")] + [Fact] public void TestAddWithComment() { Test(@" diff --git a/Tests/CSharp/CodeRefactorings/ReplacePostfixExpressionWithAssignmentTests.cs b/Tests/CSharp/CodeRefactorings/ReplacePostfixExpressionWithAssignmentTests.cs index 075fa800..8f8cda11 100644 --- a/Tests/CSharp/CodeRefactorings/ReplacePostfixExpressionWithAssignmentTests.cs +++ b/Tests/CSharp/CodeRefactorings/ReplacePostfixExpressionWithAssignmentTests.cs @@ -25,7 +25,7 @@ void Foo (int i) }"); } - [Fact(Skip="broken")] + [Fact] public void TestAddWithComment() { Test(@" From 47b035765e2d65bbf979c654f48934d904b2de22 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 18 Feb 2017 09:49:43 +0100 Subject: [PATCH 112/236] Fix ConvertIfStatementToConditionalTernaryExpressionTests --- ...ntToConditionalTernaryExpressionCodeRefactoringProvider.cs | 4 ++++ .../ConvertIfStatementToConditionalTernaryExpressionTests.cs | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertIfStatementToConditionalTernaryExpressionCodeRefactoringProvider.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertIfStatementToConditionalTernaryExpressionCodeRefactoringProvider.cs index 2f698f0c..3385cc55 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertIfStatementToConditionalTernaryExpressionCodeRefactoringProvider.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Synced/ConvertIfStatementToConditionalTernaryExpressionCodeRefactoringProvider.cs @@ -108,6 +108,10 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte assignmentTargetType.GenerateTypeSyntax(Simplifier.Annotation), falseAssignmentExpr).WithAdditionalAnnotations(Formatter.Annotation); } + if (trueAssignmentExpr.IsAnyAssignExpression()) + trueAssignmentExpr = SyntaxFactory.ParenthesizedExpression(trueAssignmentExpr); + if (falseAssignmentExpr.IsAnyAssignExpression()) + falseAssignmentExpr = SyntaxFactory.ParenthesizedExpression(falseAssignmentExpr); context.RegisterRefactoring( CodeActionFactory.Create(span, DiagnosticSeverity.Info, GettextCatalog.GetString("To '?:' expression"), diff --git a/Tests/CSharp/CodeRefactorings/ConvertIfStatementToConditionalTernaryExpressionTests.cs b/Tests/CSharp/CodeRefactorings/ConvertIfStatementToConditionalTernaryExpressionTests.cs index 0fd42870..dbcf5cf5 100644 --- a/Tests/CSharp/CodeRefactorings/ConvertIfStatementToConditionalTernaryExpressionTests.cs +++ b/Tests/CSharp/CodeRefactorings/ConvertIfStatementToConditionalTernaryExpressionTests.cs @@ -195,7 +195,7 @@ void TestMethod(int i) }"); } - [Fact(Skip="Are there any cases where this is needed ?")] + [Fact] public void TestInsertNecessaryParentheses() { Test(@" From 0b7eef0deed1c1b96112757c530726c471113c1e Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 18 Feb 2017 15:43:49 +0100 Subject: [PATCH 113/236] Turn LocalVariableNotUsedAnalyzer into a code fix for CS0168 --- ...168LocalVariableNotUsedCodeFixProvider.cs} | 30 +++-- .../CSharp/Diagnostics/CSharpDiagnosticIDs.cs | 2 +- .../LocalVariableNotUsedAnalyzer.cs | 99 ----------------- .../CodeAnalyzers.CSharp.html | 3 +- RefactoringEssentials/CodeFixes.CSharp.html | 3 +- .../RefactoringEssentials.csproj | 3 +- ...ocalVariableNotUsedCodeFixProviderTests.cs | 103 ++++++++++++++++++ .../CSharp/CodeFixes/CSharpCodeFixTestBase.cs | 1 - .../LocalVariableNotUsedIssueTests.cs | 103 ------------------ Tests/Tests.csproj | 2 +- 10 files changed, 122 insertions(+), 227 deletions(-) rename RefactoringEssentials/CSharp/{Diagnostics/Synced/RedundanciesInDeclaration/LocalVariableNotUsedCodeFixProvider.cs => CodeFixes/Custom/CS0168LocalVariableNotUsedCodeFixProvider.cs} (63%) delete mode 100644 RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/LocalVariableNotUsedAnalyzer.cs create mode 100644 Tests/CSharp/CodeFixes/CS0168LocalVariableNotUsedCodeFixProviderTests.cs delete mode 100644 Tests/CSharp/Diagnostics/LocalVariableNotUsedIssueTests.cs diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/LocalVariableNotUsedCodeFixProvider.cs b/RefactoringEssentials/CSharp/CodeFixes/Custom/CS0168LocalVariableNotUsedCodeFixProvider.cs similarity index 63% rename from RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/LocalVariableNotUsedCodeFixProvider.cs rename to RefactoringEssentials/CSharp/CodeFixes/Custom/CS0168LocalVariableNotUsedCodeFixProvider.cs index 4e633342..df4bdfda 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/LocalVariableNotUsedCodeFixProvider.cs +++ b/RefactoringEssentials/CSharp/CodeFixes/Custom/CS0168LocalVariableNotUsedCodeFixProvider.cs @@ -5,18 +5,14 @@ using System.Linq; using System.Threading.Tasks; -namespace RefactoringEssentials.CSharp.Diagnostics +namespace RefactoringEssentials.CSharp.CodeFixes { [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] - public class LocalVariableNotUsedCodeFixProvider : CodeFixProvider + public class CS0168LocalVariableNotUsedCodeFixProvider : CodeFixProvider { - public override ImmutableArray FixableDiagnosticIds - { - get - { - return ImmutableArray.Create(CSharpDiagnosticIDs.LocalVariableNotUsedAnalyzerID); - } - } + public const string CS0168 = "CS0168"; // The variable 'var' is declared but never used + + public override ImmutableArray FixableDiagnosticIds => ImmutableArray.Create(CS0168); public override FixAllProvider GetFixAllProvider() { @@ -38,17 +34,17 @@ public async override Task RegisterCodeFixesAsync(CodeFixContext context) if (variableDeclarationSyntax == null) return; // This is a workaround to avoid working with implausible syntax tree on syntax errors - var block = variableDeclarationSyntax.Parent.Parent as BlockSyntax; + var block = variableDeclarationSyntax.Parent?.Parent as BlockSyntax; if (block == null) return; - - if (variableDeclarationSyntax.Variables.Count == 1) - { - var newRoot = root.RemoveNode(node.Parent.Parent, SyntaxRemoveOptions.KeepNoTrivia); - context.RegisterCodeFix(CodeActionFactory.Create(node.Span, diagnostic.Severity, "Remove unused local variable", document.WithSyntaxRoot(newRoot)), diagnostic); + SyntaxNode nodeToRemove; + if (variableDeclarationSyntax.Variables.Count == 1) { + nodeToRemove = node.Parent.Parent; + } else { + nodeToRemove = node; } - - // TODO Support declarations with multiple variables. + var newRoot = root.RemoveNode(nodeToRemove, SyntaxRemoveOptions.KeepNoTrivia); + context.RegisterCodeFix(CodeActionFactory.Create(node.Span, diagnostic.Severity, "Remove unused local variable", document.WithSyntaxRoot(newRoot)), diagnostic); } } } diff --git a/RefactoringEssentials/CSharp/Diagnostics/CSharpDiagnosticIDs.cs b/RefactoringEssentials/CSharp/Diagnostics/CSharpDiagnosticIDs.cs index b91fb1c9..b9966d50 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/CSharpDiagnosticIDs.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/CSharpDiagnosticIDs.cs @@ -157,7 +157,7 @@ public static class CSharpDiagnosticIDs public const string ConvertToConstantAnalyzerID = "RECS0153"; public const string UnusedParameterAnalyzerID = "RECS0154"; public const string FormatStringProblemAnalyzerID = "RECS0155"; - public const string LocalVariableNotUsedAnalyzerID = "RECS0156"; +// public const string LocalVariableNotUsedAnalyzerID = "RECS0156"; public const string ThreadStaticAtInstanceFieldAnalyzerID = "RECS0157"; public const string RedundantUnsafeContextAnalyzerID = "RECS0158"; public const string RedundantOverriddenMemberAnalyzerID = "RECS0159"; diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/LocalVariableNotUsedAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/LocalVariableNotUsedAnalyzer.cs deleted file mode 100644 index 938937d0..00000000 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/LocalVariableNotUsedAnalyzer.cs +++ /dev/null @@ -1,99 +0,0 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.Diagnostics; -using System.Collections.Immutable; -using System.Linq; - -namespace RefactoringEssentials.CSharp.Diagnostics -{ - [DiagnosticAnalyzer(LanguageNames.CSharp)] - public class LocalVariableNotUsedAnalyzer : DiagnosticAnalyzer - { - private static readonly DiagnosticDescriptor descriptor = new DiagnosticDescriptor( - CSharpDiagnosticIDs.LocalVariableNotUsedAnalyzerID, - GettextCatalog.GetString("Local variable is never used"), - GettextCatalog.GetString("Local variable is never used"), - DiagnosticAnalyzerCategories.RedundanciesInDeclarations, - DiagnosticSeverity.Warning, - isEnabledByDefault: true, - helpLinkUri: HelpLink.CreateFor(CSharpDiagnosticIDs.LocalVariableNotUsedAnalyzerID) - ); - - public override ImmutableArray SupportedDiagnostics => ImmutableArray.Create(descriptor); - - public override void Initialize(AnalysisContext context) - { - context.EnableConcurrentExecution(); - context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); - context.RegisterSyntaxNodeAction( - (nodeContext) => - { - Diagnostic diagnostic; - if (TryGetUnusedLocalVariableDiagnostic(nodeContext, out diagnostic)) - { - nodeContext.ReportDiagnostic(diagnostic); - } - }, - SyntaxKind.MethodDeclaration - ); - } - - private static bool TryGetUnusedLocalVariableDiagnostic(SyntaxNodeAnalysisContext nodeContext, out Diagnostic diagnostic) - { - diagnostic = default(Diagnostic); - - var method = nodeContext.Node as MethodDeclarationSyntax; - if ((method == null) || (method.Body == null)) - return false; - - var dataFlow = nodeContext.SemanticModel.AnalyzeDataFlow(method.Body); - - var variablesDeclared = dataFlow.VariablesDeclared; - var variablesRead = dataFlow.ReadInside.Union(dataFlow.ReadOutside); - var unused = variablesDeclared.Except(variablesRead).Except(dataFlow.WrittenInside).ToArray(); - - if (unused.Any()) - { - foreach (var unusedVar in unused) - { - - diagnostic = Diagnostic.Create(descriptor, unusedVar.Locations.First()); - return true; - } - } - return false; - } - - private static bool TryGetDiagnostic(SyntaxNodeAnalysisContext nodeContext, out Diagnostic diagnostic) - { - diagnostic = default(Diagnostic); - - var localDeclarationUnused = nodeContext.Node as LocalDeclarationStatementSyntax; - var body = localDeclarationUnused?.Parent as BlockSyntax; - if (body == null) - return false; - - var dataFlow = nodeContext.SemanticModel.AnalyzeDataFlow(body); - var variablesDeclared = dataFlow.VariablesDeclared; - var variablesRead = dataFlow.ReadInside.Union(dataFlow.ReadOutside); - var unused = variablesDeclared.Except(variablesRead).ToArray(); - if (unused == null) - return false; - - if (localDeclarationUnused.Declaration == null || !localDeclarationUnused.Declaration.Variables.Any()) - return false; - - var localDeclarationSymbol = nodeContext.SemanticModel.GetDeclaredSymbol(localDeclarationUnused.Declaration.Variables.FirstOrDefault()); - if (unused.Any()) - { - if (unused.Contains(localDeclarationSymbol)) - { - diagnostic = Diagnostic.Create(descriptor, localDeclarationUnused.Declaration.GetLocation()); - return true; - } - } - return false; - } - } -} \ No newline at end of file diff --git a/RefactoringEssentials/CodeAnalyzers.CSharp.html b/RefactoringEssentials/CodeAnalyzers.CSharp.html index 12525704..21f337fb 100644 --- a/RefactoringEssentials/CodeAnalyzers.CSharp.html +++ b/RefactoringEssentials/CodeAnalyzers.CSharp.html @@ -15,7 +15,7 @@ -->

                          Supported Code Analyzers

                          -

                          121 code analyzers for C#

                          +

                          120 code analyzers for C#

                          • Suggests using the class declaring a static function when calling it (AccessToStaticMemberViaDerivedTypeAnalyzer)
                          • When initializing explicitly typed local variable or array type, array creation expression can be replaced with array initializer. (ArrayCreationCanBeReplacedWithArrayInitializerAnalyzer)
                          • @@ -58,7 +58,6 @@

                            Supported Code Analyzers

                          • Function does not reach its end or a 'return' statement by any of possible execution paths (FunctionNeverReturnsAnalyzer)
                          • If an extension method is called as static method convert it to method syntax (InvokeAsExtensionMethodAnalyzer)
                          • Local variable has the same name as a member and hides it (LocalVariableHidesMemberAnalyzer)
                          • -
                          • Local variable is never used (LocalVariableNotUsedAnalyzer)
                          • Lowercase 'l' is often confused with '1' (LongLiteralEndingLowerLAnalyzer)
                          • Member hides static member from outer class (MemberHidesStaticFromOuterClassAnalyzer)
                          • Method with optional parameter is hidden by overload (MethodOverloadWithOptionalParameterAnalyzer)
                          • diff --git a/RefactoringEssentials/CodeFixes.CSharp.html b/RefactoringEssentials/CodeFixes.CSharp.html index 4a337dd1..0fe26515 100644 --- a/RefactoringEssentials/CodeFixes.CSharp.html +++ b/RefactoringEssentials/CodeFixes.CSharp.html @@ -15,12 +15,13 @@ -->

                            Additional Supported Code Fixes

                            -

                            9 code fixes for C#

                            +

                            10 code fixes for C#

                            • CS0108UseNewKeywordIfHidingIntendedCodeFixProvider
                            • CS0152DuplicateCaseLabelValueCodeFixProvider
                            • CS0162UnreachableCodeDetectedCodeFixProvider
                            • CS0164LabelHasNotBeenReferencedCodeFixProvider
                            • +
                            • CS0168LocalVariableNotUsedCodeFixProvider
                            • CS0759RedundantPartialMethodCodeFixProvider
                            • CS1105ExtensionMethodMustBeDeclaredStaticCodeFixProvider
                            • CS1520MethodMustHaveAReturnTypeCodeFixProvider
                            • diff --git a/RefactoringEssentials/RefactoringEssentials.csproj b/RefactoringEssentials/RefactoringEssentials.csproj index 2203b1c4..043998d8 100644 --- a/RefactoringEssentials/RefactoringEssentials.csproj +++ b/RefactoringEssentials/RefactoringEssentials.csproj @@ -235,7 +235,6 @@ - @@ -357,7 +356,7 @@ - + diff --git a/Tests/CSharp/CodeFixes/CS0168LocalVariableNotUsedCodeFixProviderTests.cs b/Tests/CSharp/CodeFixes/CS0168LocalVariableNotUsedCodeFixProviderTests.cs new file mode 100644 index 00000000..24ef2e35 --- /dev/null +++ b/Tests/CSharp/CodeFixes/CS0168LocalVariableNotUsedCodeFixProviderTests.cs @@ -0,0 +1,103 @@ +using RefactoringEssentials.CSharp.CodeFixes; +using Xunit; + +namespace RefactoringEssentials.Tests.CSharp.CodeFixes +{ + public class CS0168LocalVariableNotUsedCodeFixProviderTests : CSharpCodeFixTestBase + { + [Fact] + public void TestUnusedVariable() + { + var input = @" +class TestClass { + void TestMethod () + { + int $i$; + } +}"; + var output = @" +class TestClass { + void TestMethod () + { + } +}"; + Test(input, output); + } + + [Fact] + public void TestUnusedVariable2() + { + var input2 = @" +class TestClass { + void TestMethod () + { + int $i$, j; + j = 1; + } +}"; + var output2 = @" +class TestClass { + void TestMethod () + { + int j; + j = 1; + } +}"; + Test(input2, output2); + } + + [Fact] + public void TestUsedVariable() + { + var input1 = @" +class TestClass { + void TestMethod () + { + int i = 0; + } +}"; + var input2 = @" +class TestClass { + void TestMethod () + { + int i; + i = 0; + } +}"; + TestWrongContext(input1); + TestWrongContext(input2); + } + + [Fact] + public void TestUnusedForeachVariable() + { + var input = @" +class TestClass { + void TestMethod () + { + var array = new int[10]; + foreach (var i in array) { + } + } +}"; + TestWrongContext(input); + } + + [Fact] + public void TestUsedForeachVariable() + { + var input = @" +class TestClass { + void TestMethod () + { + var array = new int[10]; + int j = 0; + foreach (var i in array) { + j += i; + } + } +}"; + TestWrongContext(input); + } + } +} \ No newline at end of file diff --git a/Tests/CSharp/CodeFixes/CSharpCodeFixTestBase.cs b/Tests/CSharp/CodeFixes/CSharpCodeFixTestBase.cs index eb8293ba..615460c5 100644 --- a/Tests/CSharp/CodeFixes/CSharpCodeFixTestBase.cs +++ b/Tests/CSharp/CodeFixes/CSharpCodeFixTestBase.cs @@ -105,7 +105,6 @@ static List GetActions(CodeFixProvider action, string input, out Dia { if (action.FixableDiagnosticIds.Contains(d.Id)) { - if (selectedSpan.Start > 0) Assert.True(selectedSpan == d.Location.SourceSpan, "Activation span does not match."); diff --git a/Tests/CSharp/Diagnostics/LocalVariableNotUsedIssueTests.cs b/Tests/CSharp/Diagnostics/LocalVariableNotUsedIssueTests.cs deleted file mode 100644 index 5e815b6b..00000000 --- a/Tests/CSharp/Diagnostics/LocalVariableNotUsedIssueTests.cs +++ /dev/null @@ -1,103 +0,0 @@ -using RefactoringEssentials.CSharp.Diagnostics; -using Xunit; - -namespace RefactoringEssentials.Tests.CSharp.Diagnostics -{ - public class LocalVariableNotUsedTests : CSharpDiagnosticTestBase - { - [Fact] - public void TestUnusedVariable() - { - var input = @" -class TestClass { - void TestMethod () - { - int $i$; - } -}"; - var output = @" -class TestClass { - void TestMethod () - { - } -}"; - Analyze(input, output); - } - - [Fact(Skip="Support for multiple variables not implemented yet. Reactivate when finished.")] - public void TestUnusedVariable2() - { - var input2 = @" -class TestClass { - void TestMethod () - { - int $i$, j; - j = 1; - } -}"; - var output2 = @" -class TestClass { - void TestMethod () - { - int j; - j = 1; - } -}"; - Analyze(input2, output2); - } - - [Fact] - public void TestUsedVariable() - { - var input1 = @" -class TestClass { - void TestMethod () - { - int i = 0; - } -}"; - var input2 = @" -class TestClass { - void TestMethod () - { - int i; - i = 0; - } -}"; - Analyze(input1); - Analyze(input2); - } - - [Fact] - public void TestUnusedForeachVariable() - { - var input = @" -class TestClass { - void TestMethod () - { - var array = new int[10]; - foreach (var i in array) { - } - } -}"; - Analyze(input); - } - - [Fact] - public void TestUsedForeachVariable() - { - var input = @" -class TestClass { - void TestMethod () - { - var array = new int[10]; - int j = 0; - foreach (var i in array) { - j += i; - } - } -}"; - Analyze(input); - } - } -} \ No newline at end of file diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index 85bad2c4..c0f1e8c5 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -252,7 +252,7 @@ - + From d8dd5ed68198c2c4c183ce18b2f2e7e84ab507cd Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 18 Feb 2017 17:02:27 +0100 Subject: [PATCH 114/236] Fix UnusedParameterAnalyzer: reimplement support for indexers --- .../UnusedParameterAnalyzer.cs | 125 +++++++---------- .../Util/ISymbolExtensions.cs | 34 +++++ .../Diagnostics/UnusedParameterTests.cs | 132 +++++++++--------- 3 files changed, 150 insertions(+), 141 deletions(-) diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedParameterAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedParameterAnalyzer.cs index fd0a4931..03825800 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedParameterAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedParameterAnalyzer.cs @@ -10,7 +10,7 @@ namespace RefactoringEssentials.CSharp.Diagnostics { - [DiagnosticAnalyzer(LanguageNames.CSharp)] + [DiagnosticAnalyzer(LanguageNames.CSharp)] public class UnusedParameterAnalyzer : DiagnosticAnalyzer { static readonly DiagnosticDescriptor descriptor = new DiagnosticDescriptor( @@ -34,10 +34,8 @@ public override void Initialize(AnalysisContext context) void Analyze(CompilationStartAnalysisContext compilationContext) { var compilation = compilationContext.Compilation; - compilationContext.RegisterSyntaxTreeAction(delegate (SyntaxTreeAnalysisContext context) - { - try - { + compilationContext.RegisterSyntaxTreeAction(delegate (SyntaxTreeAnalysisContext context) { + try { if (!compilation.SyntaxTrees.Contains(context.Tree)) return; var semanticModel = compilation.GetSemanticModel(context.Tree); @@ -50,8 +48,7 @@ void Analyze(CompilationStartAnalysisContext compilationContext) var analyzer = new NodeAnalyzer(context, model, usageVisitor); analyzer.Visit(root); - } - catch (OperationCanceledException) {} + } catch (OperationCanceledException) { } }); } @@ -63,10 +60,10 @@ class GetDelgateUsagesVisitor : CSharpSyntaxWalker readonly CancellationToken token; public GetDelgateUsagesVisitor(SemanticModel ctx, CancellationToken token) - { + { this.token = token; this.ctx = ctx; - } + } public override void VisitBlock(BlockSyntax node) { @@ -83,7 +80,7 @@ public override void VisitIdentifierName(IdentifierNameSyntax node) UsedMethods.Add(mgr.Symbol); } } - + public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax node) { base.VisitMemberAccessExpression(node); @@ -95,9 +92,9 @@ public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax no } static bool IsTargetOfInvocation(SyntaxNode node) - { + { return node.Parent is InvocationExpressionSyntax; - } + } } class NodeAnalyzer : CSharpSyntaxWalker @@ -137,13 +134,10 @@ public override void VisitClassDeclaration(ClassDeclarationSyntax node) static INamedTypeSymbol GetImplementingInterface(ISymbol enclosingSymbol, INamedTypeSymbol containingType) { INamedTypeSymbol result = null; - foreach (var iface in containingType.AllInterfaces) - { - foreach (var member in iface.GetMembers()) - { + foreach (var iface in containingType.AllInterfaces) { + foreach (var member in iface.GetMembers()) { var implementation = containingType.FindImplementationForInterfaceMember(member); - if (implementation == enclosingSymbol) - { + if (implementation == enclosingSymbol) { if (result != null) return null; result = iface; @@ -185,7 +179,7 @@ public override void VisitMethodDeclaration(MethodDeclarationSyntax node) } } - Analyze(node.ParameterList.Parameters, new SyntaxNode[] { node.Body, node.ExpressionBody }); + Analyze(node.ParameterList.Parameters, new SyntaxNode[] { node.Body, node.ExpressionBody }, node.Kind()); } public override void VisitConstructorDeclaration(ConstructorDeclarationSyntax node) @@ -193,53 +187,45 @@ public override void VisitConstructorDeclaration(ConstructorDeclarationSyntax no base.VisitConstructorDeclaration(node); if (node.ParameterList.Parameters.Count == 0) return; - - Analyze(node.ParameterList.Parameters, new SyntaxNode[] { node.Body, node.Initializer }); + + Analyze(node.ParameterList.Parameters, new SyntaxNode[] { node.Body, node.Initializer }, node.Kind()); } public override void VisitAnonymousMethodExpression(AnonymousMethodExpressionSyntax node) { base.VisitAnonymousMethodExpression(node); if (node.ParameterList != null) - Analyze(node.ParameterList.Parameters, new[] { node.Block }); + Analyze(node.ParameterList.Parameters, new[] { node.Block }, node.Kind()); } - /* - @Rpinski: Disabled indexer support, since it's not possible to compare - an indexer parameter symbol with the one resolved from its reference in indexer's getter. - => Analyzer not able to detect parameter usage correctly. - */ - //public override void VisitIndexerDeclaration(IndexerDeclarationSyntax node) - //{ - // base.VisitIndexerDeclaration(node); - // if (node.Modifiers.Any(m => m.IsKind(SyntaxKind.VirtualKeyword) || m.IsKind(SyntaxKind.NewKeyword) || m.IsKind(SyntaxKind.PartialKeyword))) - // return; - // if (node.GetBodies().IsEmpty()) - // return; - // var member = model.GetDeclaredSymbol(node); - // if (member.IsOverride) - // return; - - // if (member.ExplicitInterfaceImplementations().Length > 0) - // return; - // if (GetImplementingInterface(member, member.ContainingType) != null) - // return; - // Analyze(node.ParameterList.Parameters, node.GetBodies()); - //} + public override void VisitIndexerDeclaration(IndexerDeclarationSyntax node) + { + base.VisitIndexerDeclaration(node); + if (node.Modifiers.Any(m => m.IsKind(SyntaxKind.VirtualKeyword) || m.IsKind(SyntaxKind.NewKeyword) || m.IsKind(SyntaxKind.PartialKeyword))) + return; + if (node.GetBodies().IsEmpty()) + return; + var member = model.GetDeclaredSymbol(node); + if (member.IsOverride) + return; + + if (member.ExplicitInterfaceImplementations().Length > 0) + return; + if (GetImplementingInterface(member, member.ContainingType) != null) + return; + Analyze(node.ParameterList.Parameters, node.GetBodies(), node.Kind()); + } - void Analyze(SeparatedSyntaxList parameterList, IEnumerable nodesToAnalyze) + void Analyze(SeparatedSyntaxList parameterList, IEnumerable nodesToAnalyze, SyntaxKind containerKind) { - var parameters = new List(); + var parameters = new List(); var parameterNodes = new List(); - foreach (var param in parameterList) - { + foreach (var param in parameterList) { var resolveResult = model.GetDeclaredSymbol(param); if (resolveResult == null) continue; - if (param.Parent.Parent.IsKind(SyntaxKind.ConstructorDeclaration)) - { - if (resolveResult.Type.Name == "StreamingContext" && resolveResult.Type.ContainingNamespace.ToDisplayString() == "System.Runtime.Serialization") - { + if (containerKind == SyntaxKind.ConstructorDeclaration) { + if (resolveResult.Type.Name == "StreamingContext" && resolveResult.Type.ContainingNamespace.ToDisplayString() == "System.Runtime.Serialization") { // commonly unused parameter in constructors associated with ISerializable return; } @@ -247,35 +233,24 @@ void Analyze(SeparatedSyntaxList parameterList, IEnumerable p.Name == id); - - if (idx >= 0) - { - var sym = model.GetSymbolInfo(identifierNameSyntax).Symbol; - if (parameters[idx] == sym) - { - parameters.RemoveAt(idx); - parameterNodes.RemoveAt(idx); - if (parameters.Count == 0) - goto quit; - } - } + if (identifierNameSyntax == null) continue; + var sym = model.GetSymbolInfo(identifierNameSyntax).Symbol as IParameterSymbol; + if (sym == null || sym.Ordinal < 0) continue; + var p = parameters[sym.Ordinal]; + if (sym.GetContainingMemberOrThis() == p.GetContainingMemberOrThis()) { + parameters.RemoveAt(p.Ordinal); + parameterNodes.RemoveAt(p.Ordinal); + if (parameters.Count == 0) + return; } } } - quit: - foreach (var param in parameterNodes) - { + foreach (var param in parameterNodes) { ctx.ReportDiagnostic(Diagnostic.Create(descriptor, param.Identifier.GetLocation(), param.Identifier.ValueText)); } } diff --git a/RefactoringEssentials/Util/ISymbolExtensions.cs b/RefactoringEssentials/Util/ISymbolExtensions.cs index 9a9820dc..3b5900a1 100644 --- a/RefactoringEssentials/Util/ISymbolExtensions.cs +++ b/RefactoringEssentials/Util/ISymbolExtensions.cs @@ -467,6 +467,40 @@ public static IEnumerable GetDeclarations(this ISymbol symbol) : SpecializedCollections.EmptyEnumerable(); } + public static ISymbol GetContainingMemberOrThis(this ISymbol symbol) + { + if (symbol == null) + return null; + switch (symbol.Kind) { + case SymbolKind.Assembly: + case SymbolKind.NetModule: + case SymbolKind.Namespace: + case SymbolKind.Preprocessing: + case SymbolKind.Alias: + case SymbolKind.ArrayType: + case SymbolKind.DynamicType: + case SymbolKind.ErrorType: + case SymbolKind.NamedType: + case SymbolKind.PointerType: + case SymbolKind.Label: + throw new NotSupportedException(); + case SymbolKind.Field: + case SymbolKind.Property: + case SymbolKind.Event: + return symbol; + case SymbolKind.Method: + if (symbol.IsAccessorMethod()) + return ((IMethodSymbol)symbol).AssociatedSymbol; + return symbol; + case SymbolKind.Local: + case SymbolKind.Parameter: + case SymbolKind.TypeParameter: + case SymbolKind.RangeVariable: + return GetContainingMemberOrThis(symbol.ContainingSymbol); + default: + throw new ArgumentOutOfRangeException(); + } + } } } diff --git a/Tests/CSharp/Diagnostics/UnusedParameterTests.cs b/Tests/CSharp/Diagnostics/UnusedParameterTests.cs index 984275ef..1a384b75 100644 --- a/Tests/CSharp/Diagnostics/UnusedParameterTests.cs +++ b/Tests/CSharp/Diagnostics/UnusedParameterTests.cs @@ -10,9 +10,9 @@ public void TestUnusedParameter() { var input = @" class TestClass { - void TestMethod (int $i$) - { - } + void TestMethod (int $i$) + { + } }"; Analyze(input); } @@ -22,10 +22,10 @@ public void TestUnusedParameterMethodGetsCalled() { var input = @" class TestClass { - void TestMethod (int $i$) - { - TestMethod(0); - } + void TestMethod (int $i$) + { + TestMethod(0); + } }"; Analyze(input); } @@ -35,12 +35,12 @@ public void TestInterfaceImplementation() { var input = @" interface ITestClass { - void TestMethod (int i); + void TestMethod (int i); } class TestClass : ITestClass { - public void TestMethod (int i) - { - } + public void TestMethod (int i) + { + } }"; Analyze(input); } @@ -50,12 +50,12 @@ public void TestAbstractMethodImplementation() { var input = @" abstract class TestBase { - public abstract void TestMethod (int i); + public abstract void TestMethod (int i); } class TestClass : TestBase { - public override void TestMethod (int i) - { - } + public override void TestMethod (int i) + { + } }"; Analyze(input); } @@ -65,10 +65,10 @@ public void TestUsedParameter() { var input = @" class TestClass { - void TestMethod (int i) - { - i = 1; - } + void TestMethod (int i) + { + i = 1; + } }"; Analyze(input); } @@ -78,11 +78,11 @@ public void TestLambda() { var input = @" class TestClass { - void TestMethod () - { - System.Action a = i => { - }; - } + void TestMethod () + { + System.Action a = i => { + }; + } }"; Analyze(input); } @@ -92,11 +92,11 @@ public void TestAnonymousMethod() { var input = @" class TestClass { - void TestMethod () - { - System.Action a = delegate (int $i$) { - }; - } + void TestMethod () + { + System.Action a = delegate (int $i$) { + }; + } }"; Analyze(input); } @@ -107,12 +107,12 @@ public void TestMethodUsedAsDelegateMethod() { var input = @"using System; class TestClass { - public event EventHandler FooEvt; - void TestMethod () - { - FooEvt += FooBar; - } - void FooBar (object sender, EventArgs e) {} + public event EventHandler FooEvt; + void TestMethod () + { + FooEvt += FooBar; + } + void FooBar (object sender, EventArgs e) {} }"; Analyze(input); } @@ -122,7 +122,7 @@ public void TestMethodLooksLikeEventHandlerButNotUsedAsSuch() { var input = @"using System; class TestClass { - void FooBar (object $sender$, EventArgs $e$) {} + void FooBar (object $sender$, EventArgs $e$) {} }"; Analyze(input); } @@ -135,7 +135,7 @@ public void TestMethodUsedAsDelegateInOtherPart() // we just rely on heuristics if the class is partial var input = @"using System; partial class TestClass { - void FooBar (object sender, EventArgs e) {} + void FooBar (object sender, EventArgs e) {} }"; Analyze(input); } @@ -145,9 +145,9 @@ public void UnusedParameterInConstructor() { var input = @" class TestClass { - public TestClass(int $i$) - { - } + public TestClass(int $i$) + { + } }"; Analyze(input); } @@ -157,9 +157,9 @@ public void TestUnusedParameterInVirtualMethod() { var input = @" class TestClass { - public virtual void TestMethod (int i) - { - } + public virtual void TestMethod (int i) + { + } }"; Analyze(input); } @@ -169,9 +169,9 @@ public void TestUnusedParameterInShadowedMethod() { var input = @" class TestClass { - public new void TestMethod (int i) - { - } + public new void TestMethod (int i) + { + } }"; Analyze(input); } @@ -181,9 +181,9 @@ public void TestUnusedParameterInPartialMethod() { var input = @" partial class TestClass { - partial void TestMethod (int i) - { - } + partial void TestMethod (int i) + { + } }"; Analyze(input); } @@ -194,11 +194,11 @@ public void SerializationConstructor() var input = @"using System; using System.Runtime.Serialization; class TestClass : ISerializable { - string text; - protected TestClass(SerializationInfo info, StreamingContext context) - { - this.text = info.GetString(""Text""); - } + string text; + protected TestClass(SerializationInfo info, StreamingContext context) + { + this.text = info.GetString(""Text""); + } }"; Analyze(input); } @@ -216,32 +216,32 @@ public class ExportAttribute : Attribute {} } class TestClass : ISerializable { - - [Export (""run:"")] - public void Run (NSObject dummy) - { - // something - } + + [Export (""run:"")] + public void Run (NSObject dummy) + { + // something + } }"; Analyze(input); } - [Fact(Skip="Support for indexers disabled")] + [Fact] public void TestUnusedParameterInExpressionBodiedIndexer() { var input = @" class TestClass { - public string this[int $i$] => ""; + public string this[int $i$] => ""; }"; Analyze(input); } - [Fact(Skip="Support for indexers disabled")] + [Fact] public void TestUsedParameterInExpressionBodiedIndexer() { var input = @" class TestClass { - public string this[int i] => i.ToString(); + public string this[int i] => i.ToString(); }"; Analyze(input); } @@ -251,7 +251,7 @@ public void TestUnusedParameterInExpressionBodiedMethod() { var input = @" class TestClass { - public string TestMethod(int $i$) => ""; + public string TestMethod(int $i$) => ""; }"; Analyze(input); } @@ -261,7 +261,7 @@ public void TestUsedParameterInExpressionBodiedMethod() { var input = @" class TestClass { - public string TestMethod(int i) => i.ToString(); + public string TestMethod(int i) => i.ToString(); }"; Analyze(input); } From f7829121322db51272d6ab53cfa37cb052a1fdaa Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 18 Feb 2017 17:50:37 +0100 Subject: [PATCH 115/236] Improve test output of CSharpCodeFixTestBase --- Tests/CSharp/CodeFixes/CSharpCodeFixTestBase.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Tests/CSharp/CodeFixes/CSharpCodeFixTestBase.cs b/Tests/CSharp/CodeFixes/CSharpCodeFixTestBase.cs index 615460c5..18be3a17 100644 --- a/Tests/CSharp/CodeFixes/CSharpCodeFixTestBase.cs +++ b/Tests/CSharp/CodeFixes/CSharpCodeFixTestBase.cs @@ -11,6 +11,7 @@ using Microsoft.CodeAnalysis.CodeActions; using Microsoft.CodeAnalysis.CodeFixes; using Xunit; +using System.Text; namespace RefactoringEssentials.Tests.CSharp.CodeFixes { @@ -29,12 +30,13 @@ public void Test(CodeFixProvider provider, string input, string output, int acti bool passed = result == output; if (!passed) { - Console.WriteLine("-----------Expected:"); - Console.WriteLine(output); - Console.WriteLine("-----------Got:"); - Console.WriteLine(result); + StringBuilder sb = new StringBuilder(); + sb.AppendLine("-----------Expected:"); + sb.AppendLine(output); + sb.AppendLine("-----------Got:"); + sb.AppendLine(result); + Assert.True(passed, sb.ToString()); } - Assert.Equal(output, result); } internal static List GetActions(string input) where T : CodeFixProvider, new() From 9e34fe3ab315946cab847275e7aa2718df819f89 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 18 Feb 2017 17:51:17 +0100 Subject: [PATCH 116/236] Reimplement StaticConstructorParameterAnalyzer as CS0132StaticConstructorParameterCodeFixProvider --- ...aticConstructorParameterCodeFixProvider.cs | 39 ++++++++++++++++++ RefactoringEssentials/CodeFixes.CSharp.html | 3 +- .../RefactoringEssentials.csproj | 1 + .../CS0132StaticConstructorParameterTests.cs | 39 ++++++++++++++++++ .../StaticConstructorParameterTests.cs | 40 ------------------- Tests/Tests.csproj | 2 +- 6 files changed, 82 insertions(+), 42 deletions(-) create mode 100644 RefactoringEssentials/CSharp/CodeFixes/Custom/CS0132StaticConstructorParameterCodeFixProvider.cs create mode 100644 Tests/CSharp/CodeFixes/CS0132StaticConstructorParameterTests.cs delete mode 100644 Tests/CSharp/Diagnostics/StaticConstructorParameterTests.cs diff --git a/RefactoringEssentials/CSharp/CodeFixes/Custom/CS0132StaticConstructorParameterCodeFixProvider.cs b/RefactoringEssentials/CSharp/CodeFixes/Custom/CS0132StaticConstructorParameterCodeFixProvider.cs new file mode 100644 index 00000000..e51ea25e --- /dev/null +++ b/RefactoringEssentials/CSharp/CodeFixes/Custom/CS0132StaticConstructorParameterCodeFixProvider.cs @@ -0,0 +1,39 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CodeFixes; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using System.Collections.Immutable; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Formatting; + +namespace RefactoringEssentials.CSharp.CodeFixes +{ + [ExportCodeFixProvider(LanguageNames.CSharp), System.Composition.Shared] + public class CS0132StaticConstructorParameterCodeFixProvider : CodeFixProvider + { + public const string CS0132 = "CS0132"; // 'constructor' : a static constructor must be parameterless + + public override ImmutableArray FixableDiagnosticIds => ImmutableArray.Create(CS0132); + + public override FixAllProvider GetFixAllProvider() + { + return WellKnownFixAllProviders.BatchFixer; + } + + public async override Task RegisterCodeFixesAsync(CodeFixContext context) + { + var document = context.Document; + var cancellationToken = context.CancellationToken; + var span = context.Span; + var diagnostics = context.Diagnostics; + var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); + var diagnostic = diagnostics.First(); + var node = root.FindNode(context.Span) as ConstructorDeclarationSyntax; + if (node == null) + return; + var newRoot = root.ReplaceNode(node.ParameterList, SyntaxFactory.ParameterList()).WithAdditionalAnnotations(Formatter.Annotation); + context.RegisterCodeFix(CodeActionFactory.Create(node.Span, diagnostic.Severity, "Remove parameters from static constructor", document.WithSyntaxRoot(newRoot)), diagnostic); + } + } +} diff --git a/RefactoringEssentials/CodeFixes.CSharp.html b/RefactoringEssentials/CodeFixes.CSharp.html index 0fe26515..165eea31 100644 --- a/RefactoringEssentials/CodeFixes.CSharp.html +++ b/RefactoringEssentials/CodeFixes.CSharp.html @@ -15,9 +15,10 @@ -->

                              Additional Supported Code Fixes

                              -

                              10 code fixes for C#

                              +

                              11 code fixes for C#

                              • CS0108UseNewKeywordIfHidingIntendedCodeFixProvider
                              • +
                              • CS0132StaticConstructorParameterCodeFixProvider
                              • CS0152DuplicateCaseLabelValueCodeFixProvider
                              • CS0162UnreachableCodeDetectedCodeFixProvider
                              • CS0164LabelHasNotBeenReferencedCodeFixProvider
                              • diff --git a/RefactoringEssentials/RefactoringEssentials.csproj b/RefactoringEssentials/RefactoringEssentials.csproj index 043998d8..eefe5048 100644 --- a/RefactoringEssentials/RefactoringEssentials.csproj +++ b/RefactoringEssentials/RefactoringEssentials.csproj @@ -57,6 +57,7 @@ + diff --git a/Tests/CSharp/CodeFixes/CS0132StaticConstructorParameterTests.cs b/Tests/CSharp/CodeFixes/CS0132StaticConstructorParameterTests.cs new file mode 100644 index 00000000..b7124f53 --- /dev/null +++ b/Tests/CSharp/CodeFixes/CS0132StaticConstructorParameterTests.cs @@ -0,0 +1,39 @@ +using RefactoringEssentials.CSharp.CodeFixes; +using Xunit; + +namespace RefactoringEssentials.Tests.CSharp.CodeFixes +{ + public class CS0132StaticConstructorParameterTests : CSharpCodeFixTestBase + { + [Fact] + public void TestSimpleCase() + { + Test(@"class Foo +{ + static $Foo$(int bar) + { + } +}", @"class Foo +{ + static Foo() + { + } +}"); + } + + [Fact] + public void TestNoIssue() + { + TestWrongContext(@" + class Foo + { + static Foo () + { + } + } + "); + } + + } +} + diff --git a/Tests/CSharp/Diagnostics/StaticConstructorParameterTests.cs b/Tests/CSharp/Diagnostics/StaticConstructorParameterTests.cs deleted file mode 100644 index 427cdb8e..00000000 --- a/Tests/CSharp/Diagnostics/StaticConstructorParameterTests.cs +++ /dev/null @@ -1,40 +0,0 @@ -namespace RefactoringEssentials.Tests.CSharp.Diagnostics -{ - public class StaticConstructorParameterTests : CSharpDiagnosticTestBase - { - // [Fact(Skip="Should be a code fix")] - // public void TestSimpleCase() - // { - // Analyze(@" - //class Foo - //{ - // static $Foo$(int bar) - // { - // } - //} - //", @" - //class Foo - //{ - // static Foo() - // { - // } - //} - //"); - // } - - // [Fact(Skip="Should be a code fix")] - // public void TestNoIssue() - // { - // Analyze(@" - //class Foo - //{ - // static Foo () - // { - // } - //} - //"); - // } - - } -} - diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index c0f1e8c5..669a3521 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -231,6 +231,7 @@ + @@ -340,7 +341,6 @@ - From 996a0b40455e42a650364fc60f6e6c259e0dfb92 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 18 Feb 2017 18:02:59 +0100 Subject: [PATCH 117/236] Update 2017 project files --- .../RefactoringEssentials.csproj | 8 ++------ Tests.2017/Tests.csproj | 12 ++++++------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/RefactoringEssentials.2017/RefactoringEssentials.csproj b/RefactoringEssentials.2017/RefactoringEssentials.csproj index 8e8d4d03..66b4dee5 100644 --- a/RefactoringEssentials.2017/RefactoringEssentials.csproj +++ b/RefactoringEssentials.2017/RefactoringEssentials.csproj @@ -41,6 +41,7 @@ CSharp\CodeFixes\Custom\CS0108UseNewKeywordIfHidingIntendedCodeFixProvider.cs + CSharp\CodeFixes\Custom\CS0152DuplicateCaseLabelValueCodeFixProvider.cs @@ -50,6 +51,7 @@ CSharp\CodeFixes\Custom\CS0164LabelHasNotBeenReferencedCodeFixProvider.cs + CSharp\CodeFixes\Custom\CS0759RedundantPartialMethodCodeFixProvider.cs @@ -1268,12 +1270,6 @@ CSharp\Diagnostics\Synced\RedundanciesInDeclaration\EnumUnderlyingTypeIsIntCodeFixProvider.cs - - CSharp\Diagnostics\Synced\RedundanciesInDeclaration\LocalVariableNotUsedAnalyzer.cs - - - CSharp\Diagnostics\Synced\RedundanciesInDeclaration\LocalVariableNotUsedCodeFixProvider.cs - CSharp\Diagnostics\Synced\RedundanciesInDeclaration\PartialTypeWithSinglePartAnalyzer.cs diff --git a/Tests.2017/Tests.csproj b/Tests.2017/Tests.csproj index f0264906..d6c0d2c8 100644 --- a/Tests.2017/Tests.csproj +++ b/Tests.2017/Tests.csproj @@ -209,12 +209,18 @@ CSharp\CodeFixes\CS0108UseNewKeywordIfHidingIntendedTests.cs + + CSharp\CodeFixes\CS0132StaticConstructorParameterTests.cs + CSharp\CodeFixes\CS0152DuplicateCaseLabelValueTests.cs CSharp\CodeFixes\CS0164LabelHasNotBeenReferencedTests.cs + + CSharp\CodeFixes\CS0168LocalVariableNotUsedCodeFixProviderTests.cs + CSharp\CodeFixes\CS0759RedundantPartialMethodTests.cs @@ -707,9 +713,6 @@ CSharp\Diagnostics\LocalVariableHidesMemberTests.cs - - CSharp\Diagnostics\LocalVariableNotUsedIssueTests.cs - CSharp\Diagnostics\LockThisTests.cs @@ -974,9 +977,6 @@ CSharp\Diagnostics\SimplifyConditionalTernaryExpressionTests.cs - - CSharp\Diagnostics\StaticConstructorParameterTests.cs - CSharp\Diagnostics\StaticEventSubscriptionTests.cs From 772bb5bff5a79d4fc280fe50dbd8c131ea31b646 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 18 Feb 2017 18:47:44 +0100 Subject: [PATCH 118/236] Fix bug in UnusedParameterAnalyzer --- .../UnusedParameterAnalyzer.cs | 9 +++++---- .../CSharp/Diagnostics/UnusedParameterTests.cs | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedParameterAnalyzer.cs b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedParameterAnalyzer.cs index 03825800..031baa25 100644 --- a/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedParameterAnalyzer.cs +++ b/RefactoringEssentials/CSharp/Diagnostics/Synced/RedundanciesInDeclaration/UnusedParameterAnalyzer.cs @@ -241,10 +241,11 @@ void Analyze(SeparatedSyntaxList parameterList, IEnumerable param.Ordinal == sym.Ordinal); + if (idx < 0) continue; + if (sym.GetContainingMemberOrThis() == parameters[idx].GetContainingMemberOrThis()) { + parameters.RemoveAt(idx); + parameterNodes.RemoveAt(idx); if (parameters.Count == 0) return; } diff --git a/Tests/CSharp/Diagnostics/UnusedParameterTests.cs b/Tests/CSharp/Diagnostics/UnusedParameterTests.cs index 1a384b75..8fa452a6 100644 --- a/Tests/CSharp/Diagnostics/UnusedParameterTests.cs +++ b/Tests/CSharp/Diagnostics/UnusedParameterTests.cs @@ -262,6 +262,23 @@ public void TestUsedParameterInExpressionBodiedMethod() var input = @" class TestClass { public string TestMethod(int i) => i.ToString(); +}"; + Analyze(input); + } + + [Fact] + public void TestMultipleUsedParameters() + { + var input = @" +class TestClass { + int b; + + void TestMethod (int a, int b, int c) + { + Console.WriteLine(a); + Console.WriteLine(b); + Console.WriteLine(c); + } }"; Analyze(input); } From a712cf329f1b1ad7bdfae7ef4e77f32631dfbabf Mon Sep 17 00:00:00 2001 From: Andrew Boklashko Date: Sun, 19 Feb 2017 14:54:08 +0200 Subject: [PATCH 119/236] Reimplemented ChangeAccessModifierAction --- .../CodeRefactorings.CSharp.html | 3 +- RefactoringEssentials.2017/missing.md | 1 - .../ChangeAccessModifierAction.cs | 284 +++++++++--------- .../Util/CommonAccessibilityUtilities.cs | 33 ++ .../Util/SyntaxTokenExtensions.cs | 19 ++ .../ChangeAccessModifierTests.cs | 51 ++-- 6 files changed, 226 insertions(+), 165 deletions(-) diff --git a/RefactoringEssentials.2017/CodeRefactorings.CSharp.html b/RefactoringEssentials.2017/CodeRefactorings.CSharp.html index 5e30708e..4c57268b 100644 --- a/RefactoringEssentials.2017/CodeRefactorings.CSharp.html +++ b/RefactoringEssentials.2017/CodeRefactorings.CSharp.html @@ -15,7 +15,7 @@ -->

                                Supported Refactorings

                                -

                                103 code refactorings for C#

                                +

                                104 code refactorings for C#

                                • Adds another accessor (AddAnotherAccessorCodeRefactoringProvider)
                                • Add braces (AddBracesCodeRefactoringProvider)
                                • @@ -25,6 +25,7 @@

                                  Supported Refactorings

                                • Introduce format item (AddNewFormatItemCodeRefactoringProvider)
                                • Add null check (AddNullCheckCodeRefactoringProvider)
                                • Add one or more optional parameters to an invocation, using their default values (AddOptionalParameterToInvocationCodeRefactoringProvider)
                                • +
                                • Changes the access level of an entity declaration (ChangeAccessModifierAction)
                                • Check array index value (CheckArrayIndexValueCodeRefactoringProvider)
                                • Check collection index value (CheckCollectionIndexValueCodeRefactoringProvider)
                                • Check dictionary key value (CheckDictionaryKeyValueCodeRefactoringProvider)
                                • diff --git a/RefactoringEssentials.2017/missing.md b/RefactoringEssentials.2017/missing.md index 31ea15dc..ddecc49a 100644 --- a/RefactoringEssentials.2017/missing.md +++ b/RefactoringEssentials.2017/missing.md @@ -6,7 +6,6 @@ **C#** * AutoLinqSumAction -* ChangeAccessModifierAction * CreateIndexerAction * GenerateGetterAction * IntroduceConstantAction diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/ChangeAccessModifierAction.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/ChangeAccessModifierAction.cs index 8480df2b..793bf55c 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/ChangeAccessModifierAction.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/ChangeAccessModifierAction.cs @@ -1,161 +1,155 @@ -using Microsoft.CodeAnalysis.CodeRefactorings; -using Microsoft.CodeAnalysis; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CodeRefactorings; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; namespace RefactoringEssentials.CSharp.CodeRefactorings { - [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Change the access level of an entity declaration")] - [NotPortedYet] + [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = "Change access level")] /// /// Changes the access level of an entity declaration /// public class ChangeAccessModifierAction : CodeRefactoringProvider { - // Dictionary accessibilityLevels = new Dictionary { - // { "private", Modifiers.Private }, - // { "protected", Modifiers.Protected }, - // { "protected internal", Modifiers.Protected | Modifiers.Internal }, - // { "internal", Modifiers.Internal }, - // { "public", Modifiers.Public } - // }; + public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) + { + var document = context.Document; + if (document.Project.Solution.Workspace.Kind == WorkspaceKind.MiscellaneousFiles) + return; + var span = context.Span; + if (!span.IsEmpty) + return; + var cancellationToken = context.CancellationToken; + if (cancellationToken.IsCancellationRequested) + return; + var model = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); + if (model.IsFromGeneratedCode(cancellationToken)) + return; + var root = await model.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); + var token = root.FindToken(span.Start); + if (!token.IsIdentifierOrAccessorOrAccessibilityModifier()) + return; + var node = token.Parent; + while (node != null && !(node is MemberDeclarationSyntax || node is AccessorDeclarationSyntax)) + node = node.Parent; + if (node == null || node.IsKind(SyntaxKind.InterfaceDeclaration, SyntaxKind.EnumMemberDeclaration)) + return; + + ISymbol symbol = null; + switch(node) + { + case FieldDeclarationSyntax field: + symbol = model.GetDeclaredSymbol(field.Declaration.Variables.First(), cancellationToken); + break; + + case MemberDeclarationSyntax member: + symbol = model.GetDeclaredSymbol(member, cancellationToken); + break; + + case AccessorDeclarationSyntax accessor: + symbol = model.GetDeclaredSymbol(accessor, cancellationToken); + break; + } + + if (!symbol.AccessibilityChangeable()) + return; + + foreach (var accessibility in GetPossibleAccessibilities(model, symbol, node, cancellationToken)) + { + var modifiers = GetAccessibilityModifiers(accessibility); + context.RegisterRefactoring(CodeActionFactory.Create( + token.Span, + DiagnosticSeverity.Info, + GettextCatalog.GetString("To " + String.Join(" ", modifiers)), + t => + { + var newRoot = root.ReplaceNode( + node, + node.WithoutLeadingTrivia().WithModifiers(modifiers).WithLeadingTrivia(node.GetLeadingTrivia())); + + return Task.FromResult(document.WithSyntaxRoot(newRoot)); + })); + } + } - public override Task ComputeRefactoringsAsync(CodeRefactoringContext context) + static IEnumerable GetPossibleAccessibilities(SemanticModel model, ISymbol member, SyntaxNode declaration, CancellationToken cancellationToken) { - //var document = context.Document; - //var span = context.Span; - //var cancellationToken = context.CancellationToken; - //var model = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); - //if (model.IsFromGeneratedCode(cancellationToken)) - // return; - //var root = await model.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); - return Task.FromResult(0); + IEnumerable result = null; + var containingType = member.ContainingType; + if (containingType == null) + { + if (member.IsPublic()) + result = new [] { Accessibility.Internal }; + + result = new [] { Accessibility.Public }; + } + else if (containingType.IsValueType) + { + result = new [] + { + Accessibility.Private, + Accessibility.Internal, + Accessibility.Public + }; + } + else + { + result = new[] + { + Accessibility.Private, + Accessibility.Protected, + Accessibility.Internal, + Accessibility.ProtectedOrInternal, + Accessibility.Public + }; + if (member.IsAccessorMethod()) + { + var propertyDeclaration = declaration.Ancestors().OfType().FirstOrDefault(); + if (propertyDeclaration != null) + { + var property = model.GetDeclaredSymbol(propertyDeclaration, cancellationToken); + result = result.Where(a => a < property.DeclaredAccessibility); + } + + } + } + + return result.Where(a => a != member.DeclaredAccessibility); } - // public async Task ComputeRefactoringsAsync(Document document, TextSpan span, CancellationToken cancellationToken) - // { - // var node = context.GetNode(); - // if (node == null) - // yield break; - // - // var selectedNode = node.GetNodeAt(context.Location); - // if (selectedNode == null) - // yield break; - // - // if (selectedNode.Role != PropertyDeclaration.SetKeywordRole && - // selectedNode.Role != PropertyDeclaration.GetKeywordRole && - // selectedNode != node.NameToken) { - // if (selectedNode.Role == EntityDeclaration.ModifierRole) { - // var mod = (CSharpModifierToken)selectedNode; - // if ((mod.Modifier & Modifiers.VisibilityMask) == 0) - // yield break; - // } else { - // yield break; - // } - // } - // - // if (node is EnumMemberDeclaration) { - // yield break; - // } - // - // if (node.HasModifier(Modifiers.Override)) - // yield break; - // - // var parentTypeDeclaration = node.GetParent(); - // if (parentTypeDeclaration != null && parentTypeDeclaration.ClassType == ClassType.Interface) { - // //Interface members have no access modifiers - // yield break; - // } - // - // var resolveResult = context.Resolve(node) as MemberResolveResult; - // if (resolveResult != null) { - // if (resolveResult.Member.ImplementedInterfaceMembers.Any()) - // yield break; - // } - // - // foreach (var accessName in accessibilityLevels.Keys) { - // var access = accessibilityLevels [accessName]; - // - // if (parentTypeDeclaration == null && ((access & (Modifiers.Private | Modifiers.Protected)) != 0)) { - // //Top-level declarations can only be public or internal - // continue; - // } - // - // var accessor = node as Accessor; - // if (accessor != null) { - // //Allow only converting to modifiers stricter than the parent entity - // - // var actualParentAccess = GetActualAccess(parentTypeDeclaration, accessor.GetParent()); - // if (access != actualParentAccess && !IsStricterThan (access, actualParentAccess)) { - // continue; - // } - // } - // - // if (GetActualAccess(parentTypeDeclaration, node) != access) { - // yield return GetActionForLevel(context, accessName, access, node, selectedNode); - // } - // } - // } - // - // static bool IsStricterThan(Modifiers access1, Modifiers access2) - // { - // //First cover the basic cases - // if (access1 == access2) { - // return false; - // } - // - // if (access1 == Modifiers.Private) { - // return true; - // } - // if (access2 == Modifiers.Private) { - // return false; - // } - // - // if (access1 == Modifiers.Public) { - // return false; - // } - // if (access2 == Modifiers.Public) { - // return true; - // } - // - // return access2 == (Modifiers.Protected | Modifiers.Internal); - // } - // - // static Modifiers GetActualAccess(AstNode parentTypeDeclaration, EntityDeclaration node) - // { - // Modifiers nodeAccess = node.Modifiers & Modifiers.VisibilityMask; - // if (nodeAccess == Modifiers.None && node is Accessor) { - // EntityDeclaration parent = node.GetParent(); - // - // nodeAccess = parent.Modifiers & Modifiers.VisibilityMask; - // } - // - // if (nodeAccess == Modifiers.None) { - // if (parentTypeDeclaration == null) { - // return Modifiers.Internal; - // } - // return Modifiers.Private; - // } - // - // return nodeAccess & Modifiers.VisibilityMask; - // } - // - // CodeAction GetActionForLevel(SemanticModel context, string accessName, Modifiers access, EntityDeclaration node, AstNode selectedNode) - // { - // return new CodeAction(context.TranslateString("To " + accessName), script => { - // - // Modifiers newModifiers = node.Modifiers; - // newModifiers &= ~Modifiers.VisibilityMask; - // - // if (!(node is Accessor) || access != (node.GetParent().Modifiers & Modifiers.VisibilityMask)) { - // //Do not add access modifier for accessors if the new access level is the same as the parent - // //That is, in public int X { $private get; } if access == public, then the result should not have the modifier - // newModifiers |= access; - // } - // - // script.ChangeModifier(node, newModifiers); - // - // }, selectedNode); - // } + public static SyntaxTokenList GetAccessibilityModifiers(Accessibility accessibility) + { + var tokenList = new List(); + switch (accessibility) + { + case Accessibility.Private: + tokenList.Add(SyntaxFactory.Token(SyntaxKind.PrivateKeyword)); + break; + + case Accessibility.Protected: + tokenList.Add(SyntaxFactory.Token(SyntaxKind.ProtectedKeyword)); + break; + + case Accessibility.Internal: + tokenList.Add(SyntaxFactory.Token(SyntaxKind.InternalKeyword)); + break; + + case Accessibility.ProtectedOrInternal: + tokenList.Add(SyntaxFactory.Token(SyntaxKind.ProtectedKeyword)); + tokenList.Add(SyntaxFactory.Token(SyntaxKind.InternalKeyword)); + break; + + case Accessibility.Public: + tokenList.Add(SyntaxFactory.Token(SyntaxKind.PublicKeyword)); + break; + } + return SyntaxFactory.TokenList(tokenList.Select(t => t.WithTrailingTrivia(SyntaxFactory.SyntaxTrivia(SyntaxKind.WhitespaceTrivia, " ")))); + } } } diff --git a/RefactoringEssentials/Util/CommonAccessibilityUtilities.cs b/RefactoringEssentials/Util/CommonAccessibilityUtilities.cs index 650c4a6b..f7727677 100644 --- a/RefactoringEssentials/Util/CommonAccessibilityUtilities.cs +++ b/RefactoringEssentials/Util/CommonAccessibilityUtilities.cs @@ -36,6 +36,39 @@ public static Accessibility Minimum(Accessibility accessibility1, Accessibility return Accessibility.Public; } + + public static bool AccessibilityChangeable(this ISymbol member) + { + if (member == null || + member.IsOverride || + member.IsUserDefinedOperator() || + member.IsDestructor() || + member.IsEventAccessor() || + (member.ContainingType?.IsInterfaceType() ?? false) || + member.ExplicitInterfaceImplementations().Length > 0 || + IsInterfaceImplementation(member)) + return false; + return true; + } + + static bool IsInterfaceImplementation(ISymbol member) + { + var containingType = member.ContainingType; + if (containingType == null) + return false; + + foreach (var iface in containingType.AllInterfaces) + { + foreach (var imember in iface.GetMembers()) + { + var implementation = containingType.FindImplementationForInterfaceMember(imember); + if (implementation == member) + return true; + } + } + + return false; + } } } diff --git a/RefactoringEssentials/Util/SyntaxTokenExtensions.cs b/RefactoringEssentials/Util/SyntaxTokenExtensions.cs index ef6209b5..13999946 100644 --- a/RefactoringEssentials/Util/SyntaxTokenExtensions.cs +++ b/RefactoringEssentials/Util/SyntaxTokenExtensions.cs @@ -1131,5 +1131,24 @@ public static bool IsValidAttributeTarget(this SyntaxToken token) } } + public static bool IsIdentifierOrAccessorOrAccessibilityModifier(this SyntaxToken token) + { + switch (token.Kind()) + { + case SyntaxKind.IdentifierName: + case SyntaxKind.IdentifierToken: + case SyntaxKind.GetKeyword: + case SyntaxKind.SetKeyword: + case SyntaxKind.PrivateKeyword: + case SyntaxKind.ProtectedKeyword: + case SyntaxKind.InternalKeyword: + case SyntaxKind.PublicKeyword: + return true; + + default: + return false; + } + } + } } diff --git a/Tests/CSharp/CodeRefactorings/ChangeAccessModifierTests.cs b/Tests/CSharp/CodeRefactorings/ChangeAccessModifierTests.cs index 5e8c4dd2..294fca63 100644 --- a/Tests/CSharp/CodeRefactorings/ChangeAccessModifierTests.cs +++ b/Tests/CSharp/CodeRefactorings/ChangeAccessModifierTests.cs @@ -25,6 +25,18 @@ interface Test }"); } + [Fact] + public void TestType() + { + Test(@" +class $Foo +{ +}", @" +public class Foo +{ +}"); + } + [Fact] public void TestNoExplicitInterfaceImplementationMember() { @@ -53,19 +65,7 @@ class TestClass : Test }"); } - [Fact(Skip="Not implemented!")] - public void TestType() - { - Test(@" -class $Foo -{ -}", @" -public class Foo -{ -}"); - } - - [Fact(Skip="Not implemented!")] + [Fact] public void TestMethodToProtected() { Test(@" @@ -83,7 +83,7 @@ protected void Bar () }"); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestPrivateMethodToProtected() { Test(@" @@ -101,7 +101,7 @@ protected void Bar () }"); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestMethodToProtectedInternal() { Test(@" @@ -116,10 +116,10 @@ class Foo protected internal void Bar () { } -}", 1); +}", 2); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestAccessor() { Test(@" @@ -152,7 +152,7 @@ private int Bar }"); } - [Fact(Skip="Not implemented!")] + [Fact] public void TestChangeAccessor() { Test(@" @@ -205,7 +205,22 @@ class BaseClass : IDisposable }"); } + [Fact] + public void TestChangeField() + { + Test(@" +class Foo +{ + $public int f; +}", @" +class Foo +{ + private int f; +}"); + } } + + } From 66411ce44e0d59958c6129a35a61989ba908ae95 Mon Sep 17 00:00:00 2001 From: Andrew Boklashko Date: Sun, 19 Feb 2017 16:44:28 +0200 Subject: [PATCH 120/236] Refactored to accept C# 5.0 --- .../ChangeAccessModifierAction.cs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/ChangeAccessModifierAction.cs b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/ChangeAccessModifierAction.cs index 793bf55c..368be4af 100644 --- a/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/ChangeAccessModifierAction.cs +++ b/RefactoringEssentials/CSharp/CodeRefactorings/Uncategorized/ChangeAccessModifierAction.cs @@ -41,21 +41,21 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte return; ISymbol symbol = null; - switch(node) + var field = node as FieldDeclarationSyntax; + if(field != null) + symbol = model.GetDeclaredSymbol(field.Declaration.Variables.First(), cancellationToken); + else { - case FieldDeclarationSyntax field: - symbol = model.GetDeclaredSymbol(field.Declaration.Variables.First(), cancellationToken); - break; - - case MemberDeclarationSyntax member: + var member = node as MemberDeclarationSyntax; + if(member != null) symbol = model.GetDeclaredSymbol(member, cancellationToken); - break; - - case AccessorDeclarationSyntax accessor: - symbol = model.GetDeclaredSymbol(accessor, cancellationToken); - break; + else + { + var accessor = node as AccessorDeclarationSyntax; + if(accessor != null) + symbol = model.GetDeclaredSymbol(accessor, cancellationToken); + } } - if (!symbol.AccessibilityChangeable()) return; From 561b997d117fa6b34d937ef4ba1dcd1dbc70cc66 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 19 Feb 2017 16:34:10 +0100 Subject: [PATCH 121/236] Update version to 4.8 --- BuildTools/appveyor.yml | 4 ++-- RefactoringEssentials.2017/RefactoringEssentials.version | 4 ++-- RefactoringEssentials/CodeRefactorings.CSharp.html | 3 ++- RefactoringEssentials/Properties/AssemblyInfoBase.cs | 4 ++-- .../RefactoringEssentials.Library.nuspec | 6 +++--- RefactoringEssentials/RefactoringEssentials.nuspec | 6 +++--- RefactoringEssentials/RefactoringEssentials.version | 8 ++++---- RefactoringEssentials/missing.md | 1 - Vsix/source.extension.vsixmanifest | 6 +++--- 9 files changed, 21 insertions(+), 21 deletions(-) diff --git a/BuildTools/appveyor.yml b/BuildTools/appveyor.yml index 4efcc41e..8d11501c 100644 --- a/BuildTools/appveyor.yml +++ b/BuildTools/appveyor.yml @@ -4,7 +4,7 @@ only: - release - version: 4.6.{build} + version: 4.8.{build} os: Visual Studio 2015 @@ -34,7 +34,7 @@ only: - master - version: 4.6.{build} + version: 4.8.{build} os: Visual Studio 2015 diff --git a/RefactoringEssentials.2017/RefactoringEssentials.version b/RefactoringEssentials.2017/RefactoringEssentials.version index 4beffd99..72fb88c0 100644 --- a/RefactoringEssentials.2017/RefactoringEssentials.version +++ b/RefactoringEssentials.2017/RefactoringEssentials.version @@ -1,4 +1,4 @@ nuget_version=5.0.0 full_version=5.0.0.0 -release_notes_link=https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 -copyright=Copyright (c) 2014-2016 AlphaSierraPapa \ No newline at end of file +release_notes_link=https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.8 +copyright=Copyright (c) 2014-2017 AlphaSierraPapa \ No newline at end of file diff --git a/RefactoringEssentials/CodeRefactorings.CSharp.html b/RefactoringEssentials/CodeRefactorings.CSharp.html index ae55bcf6..deae686d 100644 --- a/RefactoringEssentials/CodeRefactorings.CSharp.html +++ b/RefactoringEssentials/CodeRefactorings.CSharp.html @@ -15,7 +15,7 @@ -->

                                  Supported Refactorings

                                  -

                                  105 code refactorings for C#

                                  +

                                  106 code refactorings for C#

                                  • Adds another accessor (AddAnotherAccessorCodeRefactoringProvider)
                                  • Add braces (AddBracesCodeRefactoringProvider)
                                  • @@ -26,6 +26,7 @@

                                    Supported Refactorings

                                  • Add null check (AddNullCheckCodeRefactoringProvider)
                                  • Add one or more optional parameters to an invocation, using their default values (AddOptionalParameterToInvocationCodeRefactoringProvider)
                                  • Convert loop to Linq expression (AutoLinqSumAction)
                                  • +
                                  • Change access level (ChangeAccessModifierAction)
                                  • Check array index value (CheckArrayIndexValueCodeRefactoringProvider)
                                  • Check collection index value (CheckCollectionIndexValueCodeRefactoringProvider)
                                  • Check dictionary key value (CheckDictionaryKeyValueCodeRefactoringProvider)
                                  • diff --git a/RefactoringEssentials/Properties/AssemblyInfoBase.cs b/RefactoringEssentials/Properties/AssemblyInfoBase.cs index 0c7d5340..8f6bc1f3 100644 --- a/RefactoringEssentials/Properties/AssemblyInfoBase.cs +++ b/RefactoringEssentials/Properties/AssemblyInfoBase.cs @@ -9,8 +9,8 @@ [assembly: AssemblyCompany("ICSharpCode")] [assembly: AssemblyProduct("Refactoring Essentials")] [assembly: AssemblyCopyright("Copyright 2010-2016 AlphaSierraPapa and Xamarin Inc.")] -[assembly: AssemblyVersion("4.6.0.0")] -[assembly: AssemblyFileVersion("4.6.0")] +[assembly: AssemblyVersion("4.8.0.0")] +[assembly: AssemblyFileVersion("4.8.0")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. diff --git a/RefactoringEssentials/RefactoringEssentials.Library.nuspec b/RefactoringEssentials/RefactoringEssentials.Library.nuspec index 81e3616c..37b6f38b 100644 --- a/RefactoringEssentials/RefactoringEssentials.Library.nuspec +++ b/RefactoringEssentials/RefactoringEssentials.Library.nuspec @@ -3,7 +3,7 @@ RefactoringEssentials.Library - 4.6.0 + 4.8.0 Refactoring Essentials IC#Code IC#Code @@ -12,8 +12,8 @@ https://raw.githubusercontent.com/icsharpcode/RefactoringEssentials/master/RefactoringEssentials/Images/refactoringessentials-logo32.png false Analyzers and Code Fixes as a library, intended for IDE builders - Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 for more information. - Copyright (c) 2014-2016 AlphaSierraPapa + Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.8 for more information. + Copyright (c) 2014-2017 AlphaSierraPapa VS 2015 Roslyn Analyzer Refactoring diff --git a/RefactoringEssentials/RefactoringEssentials.nuspec b/RefactoringEssentials/RefactoringEssentials.nuspec index 90c8c7bb..486d6f06 100644 --- a/RefactoringEssentials/RefactoringEssentials.nuspec +++ b/RefactoringEssentials/RefactoringEssentials.nuspec @@ -3,7 +3,7 @@ RefactoringEssentials - 4.6.0 + 4.8.0 Refactoring Essentials IC#Code IC#Code @@ -13,9 +13,9 @@ false Analyzers and Code Fixes for Visual Studio 2015 (Roslyn-based). Intended for build integration. If you need Visual Studio integration only, please check out the VSIX (Visual Studio extension) from our Web site. - Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 for more information. + Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.8 for more information. - Copyright (c) 2014-2016 AlphaSierraPapa + Copyright (c) 2014-2017 AlphaSierraPapa VS 2015 Roslyn Analyzer Refactoring true diff --git a/RefactoringEssentials/RefactoringEssentials.version b/RefactoringEssentials/RefactoringEssentials.version index 2f8d3b54..4c1aeb5b 100644 --- a/RefactoringEssentials/RefactoringEssentials.version +++ b/RefactoringEssentials/RefactoringEssentials.version @@ -1,4 +1,4 @@ -nuget_version=4.6.0 -full_version=4.6.0.0 -release_notes_link=https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 -copyright=Copyright (c) 2014-2016 AlphaSierraPapa \ No newline at end of file +nuget_version=4.8.0 +full_version=4.8.0.0 +release_notes_link=https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.8 +copyright=Copyright (c) 2014-2017 AlphaSierraPapa \ No newline at end of file diff --git a/RefactoringEssentials/missing.md b/RefactoringEssentials/missing.md index 950c05bf..2e721626 100644 --- a/RefactoringEssentials/missing.md +++ b/RefactoringEssentials/missing.md @@ -5,7 +5,6 @@ **C#** -* ChangeAccessModifierAction * CreateIndexerAction * IntroduceConstantAction * LinqFluentToQueryAction diff --git a/Vsix/source.extension.vsixmanifest b/Vsix/source.extension.vsixmanifest index 742f9bfc..61e84ffe 100644 --- a/Vsix/source.extension.vsixmanifest +++ b/Vsix/source.extension.vsixmanifest @@ -2,12 +2,12 @@ - + Refactoring Essentials for Visual Studio Free refactorings for C# and Visual Basic (VB) - plus more! license.txt - https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 - https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 + https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.8 + https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.8 Images\refactoringessentials-logo90.png Images\refactoringessentials-preview.png From 472c2bfc28cbdf3d2c5d9802507f00dd4c341980 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 19 Feb 2017 16:38:35 +0100 Subject: [PATCH 122/236] Update versioning info --- BuildTools/appveyor.yml | 4 ++-- RefactoringEssentials.2017/RefactoringEssentials.version | 4 ++-- RefactoringEssentials/CodeRefactorings.CSharp.html | 3 ++- RefactoringEssentials/Properties/AssemblyInfoBase.cs | 4 ++-- .../RefactoringEssentials.Library.nuspec | 6 +++--- RefactoringEssentials/RefactoringEssentials.nuspec | 6 +++--- RefactoringEssentials/RefactoringEssentials.version | 8 ++++---- RefactoringEssentials/missing.md | 1 - Vsix/source.extension.vsixmanifest | 6 +++--- 9 files changed, 21 insertions(+), 21 deletions(-) diff --git a/BuildTools/appveyor.yml b/BuildTools/appveyor.yml index 675edb80..af563e61 100644 --- a/BuildTools/appveyor.yml +++ b/BuildTools/appveyor.yml @@ -4,7 +4,7 @@ only: - release - version: 4.5.{build} + version: 4.9.{build} os: Visual Studio 2015 @@ -34,7 +34,7 @@ only: - master - version: 4.5.{build} + version: 4.9.{build} os: Visual Studio 2015 diff --git a/RefactoringEssentials.2017/RefactoringEssentials.version b/RefactoringEssentials.2017/RefactoringEssentials.version index 4beffd99..72fb88c0 100644 --- a/RefactoringEssentials.2017/RefactoringEssentials.version +++ b/RefactoringEssentials.2017/RefactoringEssentials.version @@ -1,4 +1,4 @@ nuget_version=5.0.0 full_version=5.0.0.0 -release_notes_link=https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 -copyright=Copyright (c) 2014-2016 AlphaSierraPapa \ No newline at end of file +release_notes_link=https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.8 +copyright=Copyright (c) 2014-2017 AlphaSierraPapa \ No newline at end of file diff --git a/RefactoringEssentials/CodeRefactorings.CSharp.html b/RefactoringEssentials/CodeRefactorings.CSharp.html index ae55bcf6..deae686d 100644 --- a/RefactoringEssentials/CodeRefactorings.CSharp.html +++ b/RefactoringEssentials/CodeRefactorings.CSharp.html @@ -15,7 +15,7 @@ -->

                                    Supported Refactorings

                                    -

                                    105 code refactorings for C#

                                    +

                                    106 code refactorings for C#

                                    • Adds another accessor (AddAnotherAccessorCodeRefactoringProvider)
                                    • Add braces (AddBracesCodeRefactoringProvider)
                                    • @@ -26,6 +26,7 @@

                                      Supported Refactorings

                                    • Add null check (AddNullCheckCodeRefactoringProvider)
                                    • Add one or more optional parameters to an invocation, using their default values (AddOptionalParameterToInvocationCodeRefactoringProvider)
                                    • Convert loop to Linq expression (AutoLinqSumAction)
                                    • +
                                    • Change access level (ChangeAccessModifierAction)
                                    • Check array index value (CheckArrayIndexValueCodeRefactoringProvider)
                                    • Check collection index value (CheckCollectionIndexValueCodeRefactoringProvider)
                                    • Check dictionary key value (CheckDictionaryKeyValueCodeRefactoringProvider)
                                    • diff --git a/RefactoringEssentials/Properties/AssemblyInfoBase.cs b/RefactoringEssentials/Properties/AssemblyInfoBase.cs index 4d15cd5c..b0ba76e3 100644 --- a/RefactoringEssentials/Properties/AssemblyInfoBase.cs +++ b/RefactoringEssentials/Properties/AssemblyInfoBase.cs @@ -9,8 +9,8 @@ [assembly: AssemblyCompany("ICSharpCode")] [assembly: AssemblyProduct("Refactoring Essentials")] [assembly: AssemblyCopyright("Copyright 2010-2016 AlphaSierraPapa and Xamarin Inc.")] -[assembly: AssemblyVersion("4.5.0.0")] -[assembly: AssemblyFileVersion("4.5.0")] +[assembly: AssemblyVersion("4.9.0.0")] +[assembly: AssemblyFileVersion("4.9.0")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. diff --git a/RefactoringEssentials/RefactoringEssentials.Library.nuspec b/RefactoringEssentials/RefactoringEssentials.Library.nuspec index b754be37..cdcb07f5 100644 --- a/RefactoringEssentials/RefactoringEssentials.Library.nuspec +++ b/RefactoringEssentials/RefactoringEssentials.Library.nuspec @@ -3,7 +3,7 @@ RefactoringEssentials.Library - 4.5.0 + 4.9.0 Refactoring Essentials IC#Code IC#Code @@ -12,8 +12,8 @@ https://raw.githubusercontent.com/icsharpcode/RefactoringEssentials/master/RefactoringEssentials/Images/refactoringessentials-logo32.png false Analyzers and Code Fixes as a library, intended for IDE builders - Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 for more information. - Copyright (c) 2014-2016 AlphaSierraPapa + Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.8 for more information. + Copyright (c) 2014-2017 AlphaSierraPapa VS 2015 Roslyn Analyzer Refactoring diff --git a/RefactoringEssentials/RefactoringEssentials.nuspec b/RefactoringEssentials/RefactoringEssentials.nuspec index 2ea898fc..96894a52 100644 --- a/RefactoringEssentials/RefactoringEssentials.nuspec +++ b/RefactoringEssentials/RefactoringEssentials.nuspec @@ -3,7 +3,7 @@ RefactoringEssentials - 4.5.0 + 4.9.0 Refactoring Essentials IC#Code IC#Code @@ -13,9 +13,9 @@ false Analyzers and Code Fixes for Visual Studio 2015 (Roslyn-based). Intended for build integration. If you need Visual Studio integration only, please check out the VSIX (Visual Studio extension) from our Web site. - Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 for more information. + Please see https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.8 for more information. - Copyright (c) 2014-2016 AlphaSierraPapa + Copyright (c) 2014-2017 AlphaSierraPapa VS 2015 Roslyn Analyzer Refactoring true diff --git a/RefactoringEssentials/RefactoringEssentials.version b/RefactoringEssentials/RefactoringEssentials.version index 43bdcfc0..5c277f0f 100644 --- a/RefactoringEssentials/RefactoringEssentials.version +++ b/RefactoringEssentials/RefactoringEssentials.version @@ -1,4 +1,4 @@ -nuget_version=4.5.0 -full_version=4.5.0.0 -release_notes_link=https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 -copyright=Copyright (c) 2014-2016 AlphaSierraPapa \ No newline at end of file +nuget_version=4.9.0 +full_version=4.9.0.0 +release_notes_link=https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.8 +copyright=Copyright (c) 2014-2017 AlphaSierraPapa \ No newline at end of file diff --git a/RefactoringEssentials/missing.md b/RefactoringEssentials/missing.md index 950c05bf..2e721626 100644 --- a/RefactoringEssentials/missing.md +++ b/RefactoringEssentials/missing.md @@ -5,7 +5,6 @@ **C#** -* ChangeAccessModifierAction * CreateIndexerAction * IntroduceConstantAction * LinqFluentToQueryAction diff --git a/Vsix/source.extension.vsixmanifest b/Vsix/source.extension.vsixmanifest index bd454135..1eeff171 100644 --- a/Vsix/source.extension.vsixmanifest +++ b/Vsix/source.extension.vsixmanifest @@ -2,12 +2,12 @@ - + Refactoring Essentials for Visual Studio Free refactorings for C# and Visual Basic (VB) - plus more! license.txt - https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 - https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.6 + https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.8 + https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-4.8 Images\refactoringessentials-logo90.png Images\refactoringessentials-preview.png From 6dfe8f9777c59f2befaa01d0ada01e113596a7cf Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Mon, 20 Feb 2017 07:36:39 +0100 Subject: [PATCH 123/236] Fix unit tests --- RefactoringEssentials/CodeRefactorings.CSharp.html | 2 +- ...OnlyAutoPropertyFromConstructorParameterTests.cs | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/RefactoringEssentials/CodeRefactorings.CSharp.html b/RefactoringEssentials/CodeRefactorings.CSharp.html index 442a12de..45844d99 100644 --- a/RefactoringEssentials/CodeRefactorings.CSharp.html +++ b/RefactoringEssentials/CodeRefactorings.CSharp.html @@ -15,7 +15,7 @@ -->

                                      Supported Refactorings

                                      -

                                      106 code refactorings for C#

                                      +

                                      107 code refactorings for C#

                                      • Adds another accessor (AddAnotherAccessorCodeRefactoringProvider)
                                      • Add braces (AddBracesCodeRefactoringProvider)
                                      • diff --git a/Tests/CSharp/CodeRefactorings/InitializeReadOnlyAutoPropertyFromConstructorParameterTests.cs b/Tests/CSharp/CodeRefactorings/InitializeReadOnlyAutoPropertyFromConstructorParameterTests.cs index b24b49dc..208d2561 100644 --- a/Tests/CSharp/CodeRefactorings/InitializeReadOnlyAutoPropertyFromConstructorParameterTests.cs +++ b/Tests/CSharp/CodeRefactorings/InitializeReadOnlyAutoPropertyFromConstructorParameterTests.cs @@ -1,12 +1,11 @@ -using NUnit.Framework; +using Xunit; using RefactoringEssentials.CSharp.CodeRefactorings; namespace RefactoringEssentials.Tests.CSharp.CodeRefactorings { - [TestFixture] public class InitializeReadOnlyAutoPropertyFromConstructorParameterTests : CSharpCodeRefactoringTestBase { - [Test] + [Fact] public void InitialiseInteger() { Test(@" @@ -27,7 +26,7 @@ public Foo(int x, int y) }"); } - [Test] + [Fact] public void InitialiseInterface() { Test(@" @@ -48,7 +47,7 @@ public Foo(int x, ICedd cedd) }"); } - [Test] + [Fact] public void NotInParameterList() { TestWrongContext(@" @@ -60,7 +59,7 @@ class Foo }"); } - [Test] + [Fact] public void NotInParameterValue() { TestWrongContext(@" @@ -72,7 +71,7 @@ public Foo($int x, int y) }"); } - [Test] + [Fact] public void NotInConstructor() { TestWrongContext(@" From 3be2f0b57d6ed033388673dd5a80f63e5f529645 Mon Sep 17 00:00:00 2001 From: Christoph Wille Date: Mon, 20 Feb 2017 14:56:06 +0100 Subject: [PATCH 124/236] Update to xUnit 2.2 rtm Fix build: duplicate test source file due to recent merge --- Tests.2017/Tests.csproj | 19 ++++++++----------- Tests.2017/packages.config | 12 ++++++------ 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/Tests.2017/Tests.csproj b/Tests.2017/Tests.csproj index a12cce48..e2f22cf0 100644 --- a/Tests.2017/Tests.csproj +++ b/Tests.2017/Tests.csproj @@ -1,7 +1,7 @@  + - Debug AnyCPU @@ -174,14 +174,14 @@ ..\packages\xunit.abstractions.2.0.1\lib\net35\xunit.abstractions.dll True - - ..\packages\xunit.assert.2.2.0-rc1-build3507\lib\netstandard1.1\xunit.assert.dll + + ..\packages\xunit.assert.2.2.0\lib\netstandard1.1\xunit.assert.dll - - ..\packages\xunit.extensibility.core.2.2.0-rc1-build3507\lib\netstandard1.1\xunit.core.dll + + ..\packages\xunit.extensibility.core.2.2.0\lib\netstandard1.1\xunit.core.dll - - ..\packages\xunit.extensibility.execution.2.2.0-rc1-build3507\lib\net452\xunit.execution.desktop.dll + + ..\packages\xunit.extensibility.execution.2.2.0\lib\net452\xunit.execution.desktop.dll @@ -293,9 +293,6 @@ CSharp\CodeRefactorings\ContractRequiresNotNullTests.cs - - CSharp\CodeRefactorings\ContractRequiresNotNullTests.cs - CSharp\CodeRefactorings\ConvertAnonymousMethodToLambdaTests.cs @@ -1165,8 +1162,8 @@ This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - + diff --git a/Tests.2017/packages.config b/Tests.2017/packages.config index c2782e77..a81b8789 100644 --- a/Tests.2017/packages.config +++ b/Tests.2017/packages.config @@ -59,11 +59,11 @@ - + - - - - - + + + + + \ No newline at end of file From c5f520a29ac2c39976d368967a9a723e8d41b959 Mon Sep 17 00:00:00 2001 From: Christoph Wille Date: Mon, 20 Feb 2017 14:58:15 +0100 Subject: [PATCH 125/236] Remove old build automation (CruiseControl.NET on build.sharpdevelop.net) --- Build/Automated.RefactoringEssentials.proj | 80 - Build/BuildAndTest.bat | 8 - .../ICSharpCode.SharpZipLib.dll | Bin 143360 -> 0 bytes .../MSBuild.Community.Tasks.Targets | 73 - .../MSBuild.Community.Tasks.dll | Bin 155648 -> 0 bytes .../MSBuild.Community.Tasks.xml | 4752 ----------------- Build/Tools/MSBuildCommunityTasks/Sample.proj | 153 - .../Tools/NUnit/lib/nunit-console-runner.dll | Bin 36864 -> 0 bytes Build/Tools/NUnit/lib/nunit.core.dll | Bin 155648 -> 0 bytes .../Tools/NUnit/lib/nunit.core.interfaces.dll | Bin 61440 -> 0 bytes Build/Tools/NUnit/lib/nunit.util.dll | Bin 135168 -> 0 bytes Build/Tools/NUnit/license.txt | 15 - .../Tools/NUnit/nunit-console-dotnet2-x86.exe | Bin 32768 -> 0 bytes .../nunit-console-dotnet2-x86.exe.config | 25 - Build/Tools/NUnit/nunit-console-dotnet2.exe | Bin 32768 -> 0 bytes .../NUnit/nunit-console-dotnet2.exe.config | 25 - Build/Tools/NUnit/nunit-console-x86.exe | Bin 32768 -> 0 bytes .../Tools/NUnit/nunit-console-x86.exe.config | 25 - Build/Tools/NUnit/nunit-console.exe | Bin 32768 -> 0 bytes Build/Tools/NUnit/nunit-console.exe.config | 25 - Build/Tools/NUnit/nunit.framework.dll | Bin 151552 -> 0 bytes RefactoringEssentials.BuildAutomation.sln | 127 - 22 files changed, 5308 deletions(-) delete mode 100644 Build/Automated.RefactoringEssentials.proj delete mode 100644 Build/BuildAndTest.bat delete mode 100644 Build/Tools/MSBuildCommunityTasks/ICSharpCode.SharpZipLib.dll delete mode 100644 Build/Tools/MSBuildCommunityTasks/MSBuild.Community.Tasks.Targets delete mode 100644 Build/Tools/MSBuildCommunityTasks/MSBuild.Community.Tasks.dll delete mode 100644 Build/Tools/MSBuildCommunityTasks/MSBuild.Community.Tasks.xml delete mode 100644 Build/Tools/MSBuildCommunityTasks/Sample.proj delete mode 100644 Build/Tools/NUnit/lib/nunit-console-runner.dll delete mode 100644 Build/Tools/NUnit/lib/nunit.core.dll delete mode 100644 Build/Tools/NUnit/lib/nunit.core.interfaces.dll delete mode 100644 Build/Tools/NUnit/lib/nunit.util.dll delete mode 100644 Build/Tools/NUnit/license.txt delete mode 100644 Build/Tools/NUnit/nunit-console-dotnet2-x86.exe delete mode 100644 Build/Tools/NUnit/nunit-console-dotnet2-x86.exe.config delete mode 100644 Build/Tools/NUnit/nunit-console-dotnet2.exe delete mode 100644 Build/Tools/NUnit/nunit-console-dotnet2.exe.config delete mode 100644 Build/Tools/NUnit/nunit-console-x86.exe delete mode 100644 Build/Tools/NUnit/nunit-console-x86.exe.config delete mode 100644 Build/Tools/NUnit/nunit-console.exe delete mode 100644 Build/Tools/NUnit/nunit-console.exe.config delete mode 100644 Build/Tools/NUnit/nunit.framework.dll delete mode 100644 RefactoringEssentials.BuildAutomation.sln diff --git a/Build/Automated.RefactoringEssentials.proj b/Build/Automated.RefactoringEssentials.proj deleted file mode 100644 index d7d98ea6..00000000 --- a/Build/Automated.RefactoringEssentials.proj +++ /dev/null @@ -1,80 +0,0 @@ - - - - - $(MSBuildProjectDirectory)\.. - - $(ProjectDir)\bin - $(MSBuildProjectDirectory)\Tools\NUnit - $(RefactoringEssentialsBin)\Tools\x86NUnit - - $(MSBuildProjectDirectory)\Tools\MSBuildCommunityTasks - - - C:\Program Files (x86)\MSBuild\14.0\Bin - "$(MSBuild14)\msbuild.exe" - - /p:Configuration=Release "/p:Platform=Any CPU" - $(BuildProperties) "/p:BranchName=$(BranchName)" - $(BuildProperties) $(AdditionalBuildProperties) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Build/BuildAndTest.bat b/Build/BuildAndTest.bat deleted file mode 100644 index 8bd95da1..00000000 --- a/Build/BuildAndTest.bat +++ /dev/null @@ -1,8 +0,0 @@ -@echo This script simulates what the build server is doing -@rem /p:AdditionalBuildProperties="/v:d /p:MSBuildTargetsVerbose=true" -%windir%\microsoft.net\framework\v4.0.30319\msbuild Automated.RefactoringEssentials.proj /p:ArtefactsOutputDir="%CD%\results" /p:TestReportsDir="%CD%\results" -@IF %ERRORLEVEL% NEQ 0 GOTO err -@exit /B 0 -:err -@PAUSE -@exit /B 1 \ No newline at end of file diff --git a/Build/Tools/MSBuildCommunityTasks/ICSharpCode.SharpZipLib.dll b/Build/Tools/MSBuildCommunityTasks/ICSharpCode.SharpZipLib.dll deleted file mode 100644 index 77bafe8ba867a1618b8735200289f6fad68b825e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143360 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 - - - - - $(MSBuildExtensionsPath)\MSBuildCommunityTasks - $(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Build/Tools/MSBuildCommunityTasks/MSBuild.Community.Tasks.dll b/Build/Tools/MSBuildCommunityTasks/MSBuild.Community.Tasks.dll deleted file mode 100644 index 16a02d8b9bc4fd2eaab335f27f33f81c170e1432..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155648 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ξDLyj-ZIQi4z)r5Qpa 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≫oV~fK09+dn9JGxA{Gc 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 diff --git a/Build/Tools/MSBuildCommunityTasks/MSBuild.Community.Tasks.xml b/Build/Tools/MSBuildCommunityTasks/MSBuild.Community.Tasks.xml deleted file mode 100644 index f8859bb5..00000000 --- a/Build/Tools/MSBuildCommunityTasks/MSBuild.Community.Tasks.xml +++ /dev/null @@ -1,4752 +0,0 @@ - - - - MSBuild.Community.Tasks - - - - - Generates an AssemblyInfo files - - - Generates a common version file. - - ]]> - Generates a complete version file. - - ]]> - - - - - The default value of . - The value is "AssemblyInfo.cs". - - - - - Initializes a new instance of the class. - - - - - When overridden in a derived class, executes the task. - - - true if the task successfully executed; otherwise, false. - - - - - Gets or sets the code language. - - The code language. - - - - Gets or sets a value indicating whether [COMVisible]. - - true if [COMVisible]; otherwise, false. - - - - Gets or sets a value indicating whether [CLSCompliant]. - - true if [CLSCompliant]; otherwise, false. - - - - Gets or sets the GUID. - - The GUID. - - - - Gets or sets the assembly title. - - The assembly title. - - - - Gets or sets the assembly description. - - The assembly description. - - - - Gets or sets the assembly configuration. - - The assembly configuration. - - - - Gets or sets the assembly company. - - The assembly company. - - - - Gets or sets the assembly product. - - The assembly product. - - - - Gets or sets the assembly copyright. - - The assembly copyright. - - - - Gets or sets the assembly trademark. - - The assembly trademark. - - - - Gets or sets the assembly culture. - - The assembly culture. - - - - Gets or sets the assembly version. - - The assembly version. - - - - Gets or sets the assembly file version. - - The assembly file version. - - - - Gets or sets the assembly key file. - - - - - Gets or sets the assembly key name. - - - - - Gets or sets the assembly delay sign value. - - - - - Gets or sets the output file. - - The output file. - - - - Changes the attributes of files and/or directories - - - Make file Readonly, Hidden and System. - - ]]> - Clear Hidden and System attributes. - - ]]> - Make file Normal. - - ]]> - - - - - Executes the task. - - if the task ran successfully; - otherwise . - - - - Gets or sets the list of files to change attributes on. - - The files to change attributes on. - - - - Gets or sets the list of directories to change attributes on. - - The directories to change attributes on. - - - - Gets or sets file's archive status. - - true if archive; otherwise, false. - - - - Gets or sets a value indicating file is compressed. - - true if compressed; otherwise, false. - - - - Gets or sets a value indicating file is encrypted. - - true if encrypted; otherwise, false. - - - - Gets or sets a value indicating file is hidden, and thus is not included in an ordinary directory listing. - - true if hidden; otherwise, false. - - - - Gets or sets a value indicating file is normal and has no other attributes set. - - true if normal; otherwise, false. - - - - Gets or sets a value indicating file is read-only. - - true if read-only; otherwise, false. - - - - Gets or sets a value indicating file is a system file. - - true if system; otherwise, false. - - - - A wrapper for the ILMerge tool. - - - - The ILMerge tool itself must be installed separately. - It is available here. - - - The command line options "/wildcards" and "/lib" of ILMerge is not supported, - because MSBuild is in charge of expanding wildcards for item groups. - - - - This example merges two assemblies A.dll and B.dll into one: - - $(testDir)\ilmergetest.dll - $(testDir)\keypair.snk - $(testDir)\ExcludeTypes.txt - $(testDir)\ilmergetest.log - - - - - - - - - - - - ]]> - - - - - Gets the standard installation path of ILMerge.exe. - - - If ILMerge is not installed at its standard installation path, - provide its location to . - - Returns [ProgramFiles]\Microsoft\ILMerge.exe. - - - - Returns a string value containing the command line arguments - to pass directly to the executable file. - - - Returns a string value containing the command line arguments - to pass directly to the executable file. - - - - - Gets or sets the names of public types - to be renamed when they are duplicates. - - - Set to an empty item group to allow all public types to be renamed. - Don't provide this parameter if no duplicates of public types are allowed. - Corresponds to command line option "/allowDup". - The default value is null. - - - - - Gets or sets the flag to treat an assembly - with a zero PeKind flag - (this is the value of the field listed as .corflags in the Manifest) - as if it was ILonly. - - - Corresponds to command line option "/zeroPeKind". - The default value is false. - - - - - Gets or sets the attribute assembly - from whre to get all of the assembly-level attributes - such as Culture, Version, etc. - It will also be used to get the Win32 Resources from. - - - This property is mutually exclusive with . - - When not specified, then the Win32 Resources from the primary assembly - are copied over into the target assembly. - - Corresponds to command line option "/attr". - The default value is null. - - - - - Gets or sets the flag to indicate - whether to augment the list of input assemblies - to its "transitive closure". - - - - An assembly is considered part of the transitive closure if it is referenced, - either directly or indirectly, - from one of the originally specified input assemblies - and it has an external reference to one of the input assemblies, - or one of the assemblies that has such a reference. - - Corresponds to command line option "/closed". - The default value is false. - - - - - Gets or sets the flag to indicate - whether to copy the assembly level attributes - of each input assembly over into the target assembly. - - - - Any duplicate attribute overwrites a previously copied attribute. - The input assemblies are processed in the order they are specified. - - This parameter is mutually exclusive with . - Corresponds to command line option "/copyattrs". - The default value is false. - - - - - Gets or sets the flag to indicate - whether to preserve any .pdb files - that are found for the input assemblies - into a .pdb file for the target assembly. - - - Corresponds to command line option "/ndebug". - The default value is true. - - - - - Gets or sets the flag to indicate - whether the target assembly will be delay signed. - - - This property can be set only in conjunction with . - Corresponds to command line option "/delaysign". - The default value is false. - - - - - Gets or sets the file - that will be used to identify types - that are not to have their visibility modified. - - - - If an empty item group is provided, - then all types in any assembly other than the primary assembly are made non-public. - - Omit this parameter to prevent ILMerge from modifying the visibility of any types. - - The contents of the file should be one per line. - The regular expressions are matched against each type's full name, - e.g., System.Collections.IList. - If the match fails, it is tried again with the assembly name (surrounded by square brackets) - prepended to the type name. - Thus, the pattern \[A\].* excludes all types in assembly A from being made non-public. - The pattern N.T will match all types named T in the namespace named N - no matter what assembly they are defined in. - - Corresponds to command line option "/internalize". - The default value is null. - - - - - Gets or sets the input assemblies to merge. - - - - - Gets or sets the .snk file - to sign the target assembly. - - - Can be used with . - Corresponds to command line option "/keyfile". - The default value is null. - - - - - Gets or sets a log file - to write log messages to. - - - - If an empty item group is provided, - then log messages are writte to . - - Corresponds to command line option "/log". - The default value is null. - - - - - Gets or sets the target assembly. - - - Corresponds to command line option "/out". - - - - - Gets or sets the flag to indicate - whether external assembly references in the manifest - of the target assembly will use public keys (false) - or public key tokens (true). - - - Corresponds to command line option "/publickeytokens". - The default value is false. - - - - - Gets or sets the .NET framework version for the target assembly. - - - Valid values are "v1", "v1.1", "v2". - Corresponds to the first part of command line option "/targetplatform". - The default value is null. - - - - - Gets or sets the directory in which mscorlib.dll is to be found. - - - Can only be used in conjunction with . - Corresponds to the second part of command line option "/targetplatform". - The default value is null. - - - - - Gets or sets the indicator - whether the target assembly is created as a library (Dll), - a console application (Exe) or as a Windows application (WinExe). - - - Corresponds to command line option "/target". - The default value is the same kind as that of the primary assembly. - - - - - Gets or sets the version number of the target assembly. - - - The parameter should look like 6.2.1.3. - Corresponds to command line option "/ver". - The default value is null. - - - - - Gets or sets the flag to indicate - whether to merge XML documentation files - into one for the target assembly. - - - Corresponds to command line option "/xmldocs". - The default value is false. - - - - - Gets the name of the executable file to run. - - - - - Different ways to specify the assembly in a UsingTask element. - - - - - Assembly file name (Default): <UsingTask AssemblyFile="foo.dll" /> - - - - - Assembly location: <UsingTask AssemblyName="foo" /> - - - - - Assembly Name: <UsingTask AssemblyFile="bin\debug\foo.dll" /> - - - - - Assembly fully qualified name: <UsingTask AssemblyName="foo.dll,version ...." /> - - - - - A Task that generates a XSD schema of the tasks in an assembly. - - - Creates schema for MSBuild Community Task project - - ]]> - - - - - When overridden in a derived class, executes the task. - - - true if the task successfully executed; otherwise, false. - - - - - Gets or sets the list of path to analyse. - - - - - Gets or sets the output path for the generated files. - - - - - Gets the list of path to the generated XSD schema. - - - - - Gets or sets a value indicating if the task list (using UsingTask) - has to be genereted. - - - - - Gets or sets a value indicating how the assembly is specified in the - UsingTask element. - - - - - - Gets or sets a value indicating wheter documentation should be ignored - even if available (Default is false). - - - - - Gets the path to the task list if it was generated. - - - - - Gets or sets a value indicating if the - MsBuild schema inclusing should be ignored - - - - - Gets or sets a list of included schemas - - - - - The kind of Subversion node. The names match the text output - by "svn info". - - - - - Node is a file - - - - - Node is a directory - - - - - Unknown node type - - - - - The Subversion schedule type. - - - - - Normal schedule - - - - - Unknown schedule. - - - - - Run the "svn info" command and parse the output - - - This example will determine the Subversion repository root for the. - current directory and print it out. - - - - - - - ]]> - - - - - Subversion client base class - - - - - Initializes a new instance of the class. - - - - - Generates the SVN command. - - - - - - Generates the SVN arguments. - - - - - - Returns a string value containing the command line arguments to pass directly to the executable file. - - - A string value containing the command line arguments to pass directly to the executable file. - - - - - Indicates whether all task paratmeters are valid. - - - true if all task parameters are valid; otherwise, false. - - - - - Logs the events from text output. - - The single line. - The message importance. - - - - Returns the fully qualified path to the executable file. - - - The fully qualified path to the executable file. - - - - - Logs the starting point of the run to all registered loggers. - - A descriptive message to provide loggers, usually the command line and switches. - - - - Gets or sets the command. - - The command. - - - - Gets or sets the arguments. - - The arguments. - - - - Gets or sets the username. - - The username. - - - - Gets or sets the password. - - The password. - - - - Gets or sets the verbose. - - The verbose. - - - - Gets or sets the force. - - The force. - - - - Gets or sets the message. - - The message. - - - - Gets or sets the repository path. - - The repository path. - - - - Gets or sets the local path. - - The local path. - - - - Gets or sets the targets. - - The targets. - - - - Gets or sets the revision. - - The revision. - - - - Gets or sets the command switchs. - - The command switchs. - - - - Gets the with which to log errors. - - - The with which to log errors. - - - - Gets the name of the executable file to run. - - - The name of the executable file to run. - - - - Initializes a new instance of the class. - - - - - Reset all instance variables to their default (unset) state. - - - - - Indicates whether all task paratmeters are valid. - - - true if all task parameters are valid; otherwise, false. - - - - - Execute the task. - - true if execution is successful, false if not. - - - - "svn.exe info" prints out key/value pairs separated by a colon. - - A line of text printed out by svn.exe - The key string. empty if no key/value found. - The value string. empty of no key/value found. - true if a key/value pair found. false if not - - - - Parse a subversion date/time value. They print out a date that - looks like this "2006-02-09 14:36:05 -0600 (Thu, 09 Feb 2006)" which - isn't directly parsable by the DateTime class. - - - - - - - Parse the text output from the command and log the lines. - - One line of text output from the tool being run. - The message importance. - - - - Return the repository root or null if not set by Subversion. - - - - - Return the repository UUID value from Subversion. - - - - - The Subversion node kind. - - - - - - The author who last changed this node. - - - - - The last changed revision number. - - - - - The date this node was last changed. - - - - - The Subversion schedule type. - - - - - - Gets the current date and time. - - - See - - DateTimeFormatInfo - for the syntax of the format string. - - Using the Time task to get the Month, Day, - Year, Hour, Minute, and Second: - - - - - - - - - ]]> - Set property "BuildDate" to the current date and time: - - - ]]> - - - - - When overridden in a derived class, executes the task. - - - True if the task successfully executed; otherwise, false. - - - - - Gets or sets the format string - for output parameter . - - - See - - DateTimeFormatInfo - for the syntax of the format string. - - - - - Gets the month component of the date represented by this instance. - - - - - Gets the day of the month represented by this instance. - - - - - Gets the year component of the date represented by this instance. - - - - - Gets the hour component of the date represented by this instance. - - - - - Gets the minute component of the date represented by this instance. - - - - - Gets the seconds component of the date represented by this instance. - - - - - Gets the milliseconds component of the date represented by this instance. - - - - - Gets the number of ticks that represent the date and time of this instance. - - - - - Gets or sets a value that indicates whether the time represented by this instance is based - on local time, Coordinated Universal Time (UTC), or neither. - - - Possible values are: - - Local (default), - Utc, - Unspecified - - - - - - - Gets the time of day for this instance. - - - - - Gets the day of the year represented by this instance. - - - - - Gets the day of the week represented by this instance. - - - - - Gets the value of this instance to its equivalent string representation. - If input parameter is provided, - the value is formatted according to it. - - - - - Gets the value of this instance to its equivalent short date string representation. - - - - - Gets the value of this instance to its equivalent long date string representation. - - - - - Gets the value of this instance to its equivalent short time string representation. - - - - - Gets the value of this instance to its equivalent long time string representation. - - - - - Gets the internal time value. - - - - - A task to merge and transform - a set of xml files. - - -

                                        - The xml files of parameter - are merged into one xml document, - wrapped with a root tag - (defaults to ). -

                                        -

                                        - If only one input file is provided, - merging and wrapping can be omitted - by setting to an empty string. -

                                        -

                                        - The root tag can be given any number of attributes - by providing a list of semicolon-delimited name/value pairs - to parameter . - For example: RootAttributes="foo=bar;date=$(buildDate)" -

                                        -

                                        - Parameter defaults to - one attribute with a name specified by , - and a local time stamp as value. - To suppress the default value, an empty parameter - RootAttributes="" - must be specified explicitely. -

                                        -

                                        - The xsl transformation file - specified by parameter - is applied on the input. -

                                        -

                                        - The - can be given any number of metadata, - which will be handed to the xsl transformation - as parameters. -

                                        -

                                        - The output is written to the file - specified by parameter . -

                                        -
                                        - - This example for generating a report - from a set of NUnit xml results: - - - $(project) - $(configuration) - $(MSBuildProjectFullPath) - $(MSBuildBinPath) - $(MSBuildCommunityTasksPath)\$(nunitReportXsl) - - - - - - ]]> - - This examples shows all available task attributes: - - - - - ]]> - -
                                        - - - The default value for . - The value is "mergedroot". - - - - - The name of the default attribute - of the . - The value is "created", - and the attribute will contain a local time stamp. - - - - - When overridden in a derived class, executes the task. - - - Returns true if the task successfully executed; otherwise, false. - - - - - Gets or sets the xml input files. - - - - - Gets or sets the xml tag name - of the root tag wrapped - around the merged xml input files. - - - - - Gets or sets the list of - semicolon-delimited name/value pairs - of the . - For example: RootAttributes="foo=bar;date=$(buildDate)" - - - - - Gets or sets the path of the - xsl transformation file to apply. - - - The property can be given any number of metadata, - which will be handed to the xsl transformation - as parameters. - - - - - Gets or sets the path of the output file. - - - - - Replace text in file(s) using a Regular Expression. - - Search for a version number and update the revision. - - ]]> - - - - - Initializes a new instance of the class. - - - - - When overridden in a derived class, executes the task. - - - true if the task successfully executed; otherwise, false. - - - - - Gets or sets the files to update. - - The files. - - - - Gets or sets the regex. - - The regex. - - - - Gets or sets a value specifies case-insensitive matching. . - - true if [ignore case]; otherwise, false. - - - - Gets or sets a value changing the meaning of ^ and $ so they match at the beginning and end, - respectively, of any line, and not just the beginning and end of the entire string. - - true if multiline; otherwise, false. - - - - Gets or sets a value changing the meaning of the dot (.) so it matches - every character (instead of every character except \n). - - true if singleline; otherwise, false. - - - - Gets or sets the maximum number of times the replacement can occur. - - The replacement count. - - - - Gets or sets the replacement text. - - The replacement text. - - - - Uses FxCop to analyse managed code assemblies and reports on - their design best-practice compliance. - - - Shows how to analyse an assembly and use an XSLT stylesheet - to present the report as an HTML file. If the static anlysis fails, - the build does not stop - this is controlled with the FailOnError - parameter. - - ]]> - - If you include the MSBuild.Community.Tasks.Targets file - in you build project, the ItemGroup @(FxCopRuleAssemblies) is defined - with the standard FxCop Rules Assemblies. - - - - Executes the task. - - if the task ran successfully; - otherwise . - - - - Returns the fully qualified path to the executable file. - - - The fully qualified path to the executable file. - - - - - Returns a string value containing the command line arguments - to pass directly to the executable file. - - - A string value containing the command line arguments to pass - directly to the executable file. - - - - - Returns the directory in which to run the executable file. - - - The directory in which to run the executable file, - or a null reference (Nothing in Visual Basic) if the executable file - should be run in the current directory. - - - - - Applies the XSL transformation specified in /outXsl to the - analysis report before saving the file. - - - - - Directs analysis output to the console or to the - Output window in Visual Studio .NET. By default, - the XSL file FxCopConsoleOutput.xsl is applied to the - output before it is displayed. - - - - - Specifies additional directories to search for assembly dependencies. - FxCopCmd always searches the target assembly directory and the current - working directory. - - - - - Specifies the target assembly to analyze. - - - - - Specifies the XSL or XSLT file that contains a transformation to - be applied to the analysis output before it is displayed in the console. - - - - - Specifies the name of an analysis report or project file to import. - Any messages in the imported file that are marked as excluded are not - included in the analysis results. - - - - - Specifies the filename(s) of FxCop project file(s). - - - - - Specifies the file name for the analysis report. - - - - - Specifies the XSL or XSLT file that is referenced by the - xml-stylesheet processing instruction in the analysis report. - - - - - Specifies the location of the version of Mscorlib.dll - that was used when building the target assemblies if this - version is not installed on the computer running FxCopCmd. - - - - - Specifies the filename of FxCop project file. - - - - - Includes a summary report with the informational - messages returned by FxCopCmd. - - - - - Comma-separated list of type names to analyze. This option disables - analysis of assemblies, namespaces, and resources; only the specified - types and their members are included in the analysis. - Use the wildcard character '*' at the end of the name to select multiple types. - - - - - Saves the results of the analysis in the project file. - - - - - Gets or sets the working directory. - - The working directory. - - The directory in which to run the executable file, or a null reference (Nothing in Visual Basic) if the executable file should be run in the current directory. - - - - - Gets or sets a value indicating whether the output is verbose. - - true if verbose; otherwise, false. - - - - Gets or sets a value indicating whether the build should - fail if static code analysis reports errors. Defaults to - true. - - true if verbose; otherwise, false. - - - - Gets the name of the executable file to run. - - - The name of the executable file to run. - - - - Base task for any IIS-related task. - - Stores the base logic for gathering the IIS version and server and port checking. This - base task also stores common properties for other related tasks. - - - - IIS version. - - - - - Gets the IIS version. - - The for IIS. - - - - - Gets the remote machine OS version. - - Returns a of the operating system. - - - - - Verifies that the IIS root exists based on the and . - - - - - - Helper method for that verifies the server port exists. - - The site to verify the port. - Boolean value indicating the status of the port check. - - - - - Gets or sets the name of the server. The default value is 'localhost'. - - The name of the server. - - - - Gets or sets the server port. - - The server port. - - - - Gets or sets the IIS server path. - - Is in the form 'IIS://localhost/W3SVC/1/Root'. - The IIS server path. - - - - Gets or sets the application path. - - Is in the form '/LM/W3SVC/1/Root'. - The application path. - - - - Gets or sets the IIS application pool path. - - Is in the form 'IIS://localhost/W3SVC/AppPools'. - The IIS application pool path. - - - - Gets or sets the username for the account the task will run under. This property - is needed if you specified a for a remote machine. - - The username of the account. - - - - Gets or sets the password for the account the task will run under. This property - is needed if you specified a for a remote machine. - - The password of the account. - - - - Defines the possible IIS versions supported by the task. - - - - - IIS version 4.x - - - - - IIS version 5.x - - - - - IIS version 6.x - - - - - Defines the possible application pool actions to be performed. - - - - - Recycles an application pool. - - - - - Stops and restarts the application pool. - - - - - Starts the application pool. - - - - - Stops the application pool. - - - - - Defines the current application pool state. - - - - - The application pool is starting. - - - - - The application pool has started. - - - - - The application pool is stopping. - - - - - The application pool has stopped. - - - - - Defines the actions that can be performed on a service. - - - - - Starts a service. - - - - - Stops a service. - - - - - Restarts a service. - - - - - Pauses a running service. - - - - - Continues a paused service. - - - - - Task that can control a Windows service. - - - Restart Web Server - - ]]> - - - - - Task that can determine the status of a specified service - on a target server. - - - Check status of SQL Server - - - - - ]]> - - - - - The unknown - returned when the service does not exist. - The value is "Unknown". - - - - - Initializes a new instance of the class. - - - - - Executes the task. - - if the task ran successfully; - otherwise . - - - - Gets the service controller. - - - - - - Gets or sets the name of the service. - - The name of the service. - - - - Gets or sets the name of the machine. - - The name of the machine. - - - - Gets or sets the status. - - The status of the service. - - - - Gets a value indicating whether the service can be paused and resumed. - - - true if this instance can pause and continue; otherwise, false. - - - - - Gets a value indicating whether the service should be notified when the system is shutting down. - - - true if this instance can shutdown; otherwise, false. - - - - - Gets a value indicating whether the service can be stopped after it has started. - - true if this instance can stop; otherwise, false. - - - - Gets a friendly name for the service. - - The name of the display. - - - - Gets a value indicating whether the service exists. - - true if the service exists; otherwise, false. - - - - Initializes a new instance of the class. - - - - - Executes the task. - - if the task ran successfully; - otherwise . - - - - Gets or sets the to perform on the service. - - The action to perform on the service. - - - - - Gets or sets the timeout for the command. The default is - one minute. - - The timeout for the command. - - - - Task that can strip the source control information from a - Visual Studio Solution and subprojects. - - This task is useful if you keep an archive of the - source tree at each build milestone, because it's irritating to have - to remove source control binding manually once you've copied a - version of the code from your archive. - - - - Executes the task. - - if the task ran successfully; - otherwise . - - - - Uploads a file using File Transfer Protocol (FTP). - - Upload a file. - - ]]> - - - - - Initializes a new instance of the class. - - - - - When overridden in a derived class, executes the task. - - - true if the task successfully executed; otherwise, false. - - - - - Gets or sets the local file to upload. - - The local file. - - - - Gets or sets the remote URI to upload. - - The remote URI. - - - - Gets or sets the username. - - The username. - - - - Gets or sets the password. - - The password. - - - - Gets or sets the behavior of a client application's data transfer process. - - true if [use passive]; otherwise, false. - - - - Creates a new application pool on a local or remote machine with IIS installed. The default is - to create the new application pool on the local machine. If connecting to a remote machine, you can - specify the and for the task - to run under. - - Create a new application pool on the local machine. - - ]]> - - - - - When overridden in a derived class, executes the task. - - - True if the task successfully executed; otherwise, false. - - - - - Gets or sets the name of the application pool. - - The name of the application pool. - - - - The AppPoolAutoStart property indicates to the World Wide Web Publishing Service (WWW service) - to automatically start an application pool when the application pool is created or when IIS - is started, if the value of this property is set to true. - - Value indicating if AppPoolAutoStart is enabled or disabled. - - - - The AppPoolIdentityType property allows application pools to run as a specific user account: - - 0 - The application pool runs as NT AUTHORITY\SYSTEM. - 1 - The application pool runs as NT AUTHORITY\LOCAL SERVICE. - 2 - The application pool runs as NT AUTHORITY\NETWORK SERVICE. - 3 - The application pool runs as a specific user account, defined by the property. - - Value indicating the application pool identity type. - - - - The AppPoolQueueLength property indicates to the Universal Listener how many requests - to queue up for an application pool before rejecting future requests. When the limit - for this property is exceeded, IIS rejects the additional requests with a 503 error. - - Value indicating the application pool queue length. - - - - The AutoShutdownAppPoolExe property specifies an executable to run when the World Wide Web - Publishing Service (WWW service) shuts down an application pool for rapid fail protection. You - can use the property to send parameters to the executable. - - Value indicating the application pool auto shutdown executable. - - - - The AutoShutdownAppPoolParams property specifies any command-line parameters for the executable that - is specified in the AutoShutdownAppPoolExe property. You can use these two properties in the following - way to send e-mail, for example, when the World Wide Web Publishing Service (WWW service) shuts down - an application pool for rapid fail protection: - - AutoShutdownAppPoolExe = "C:\LogAndSendMail.bat" - AutoShutdownAppPoolParams = "-AppPoolName %1%" - - where %1% represents the application pool name. - - Value indicating the parameters for the application pool auto shutdown executable. - - - - The CPUAction property configures the action(s) that IIS takes when Microsoft Windows NT ® job objects - run. Only one Windows NT job object exists per application pool, therefore the CPUAction property - is configured on a per application pool basis. - - Possible values: - 0 - No action is taken except that a warning is written to the event log when the CPU limit is exceeded. - 1 - Application pool worker processes that exceed their CPU limit will be forced to shut down. - - Value indicating the CPU action. - - - - The CPULimit property configures the maximum percentage of CPU resources that worker processes - in an application pool are allowed to consume over a period of time, as indicated by the - property. Set this property by specifying a percentage of CPU - usage, multiplied by 1000. For example, if you want the CPU usage limit to be 50%, set CPULimit to 50,000. - - Value indicating the CPU limit. - - - - The CPUResetInterval property specifies the reset period (in minutes) for CPU monitoring and - throttling limits on the application pool. When the number of minutes elapsed since the last - process accounting reset equals the number specified by this property, IIS will reset the CPU - timers for both the logging and limit intervals. Setting the value of this property to 0 - disables CPU monitoring. - - Value indicating the CPU reset interval. - - - - The DisallowOverlappingRotation property specifies whether or not the World Wide Web Publishing - Service (WWW Service) should start up another worker process to replace the existing worker - process while it is shutting down. - - Value indicating the DisallowOverlappingRotation. - - - - The DisallowRotationOnConfigChange property specifies whether or not the World Wide Web Publishing - Service (WWW Service) should rotate worker processes in an application pool when the configuration - has changed. This means that the worker processes will not pick up application pool changes to - values passed to the worker process, such as and . - - Value indicating the DisallowRotationOnConfigChange. - - - - The IdleTimeout property specifies how long (in minutes) a worker process should run idle if no new - requests are received and the worker process is not processing requests. After the allotted time - passes, the worker process should request to be shut down by the World Wide Web Publishing Service (WWW Service). - - Value indicating the idle timeout. - - - - The LoadBalancerCapabilities property specifies behavior when a service is unavailable. A setting of 1 - terminates the connection. A setting of 2 sends error code 503. - - Value indicating the load balancer capabilities. - - - - The LogEventOnRecycle property specifies that IIS should log an event when an application pool is - recycled. Application pools recycle for a variety of reasons. In order for IIS to log the event, the - LogEventOnRecycle property must have a bit set corresponding to the reason for the recycle. - - Value indicating which recycle events to log. - - - - The LogonMethod property contains an integer that specifies the logon method for cleartext - logons. Valid settings are: - - 0 for interactive logon. - 1 for batch logon. - 2 for network logon. - 3 for cleartext logon. - - Value indicating the logon method. - - - - The MaxProcesses property determines the maximum number of worker processes an application pool - allows to service requests for an application pool. This property cannot be set to 0 because there - are no unmanaged pools. - - Value indicating the maximum number of worker processes allowed by the application pool. - - - - The OrphanActionExe property specifies an executable to run when the World Wide Web Publishing - Service (WWW service) orphans a worker process. You can use the property - to send parameters to the executable. - - The value for the orphan action executable. - - - - The OrphanActionParams property specifies command-line parameters for the executable - specified by the property. - - Value indicating the orphan action parameters. - - - - The OrphanWorkerProcess property, when set to true, notifies the World Wide Web Publishing - Service (WWW Service) not to terminate a worker process that fails to respond to pings, but - to instead orphan the worker process in the application pool if the worker process suffers - fatal errors. - - Value indicating the orphan worker process. - - - - The PeriodicRestartMemory property specifies the amount of virtual memory (in KB) that a - worker process can use before the worker process recycles. The maximum value supported - for this property is 4,294,967 KB. - - Value indicating the amount of memory. - - - - The PeriodicRestartPrivateMemory property specifies the amount of private memory (in KB) that a - worker process can use before the worker process recycles. The maximum value supported - for this property is 4,294,967 KB. - - Value indicating the amount of memory. - - - - The PeriodicRestartRequests property indicates the number of requests the OOP application - should process, after which it is recycled. - - Value indicating the number of requests. - - - - The PeriodicRestartSchedule property specifies the time (in 24 hour format) that the application - will be rotated. Each time is in local time and is specified in the following format: - - PeriodicRestartSchedule="hh:mm,hh:mm,hh:mm" - - Value indicating the restart schedule. - - - - The PeriodicRestartTime property specifies the period of time, in minutes, after which IIS - rotates an isolated OOP application. Setting the value of this property to 0 disables the - property. The maximum supported value for this property is 71,582. - - Value indicating the restart time period. - - - - The PingingEnabled property specifies whether the World Wide Web Publishing Service - (WWW Service) should periodically monitor the health of a worker process. Setting the - value of this property to true indicates to the WWW service to monitor the worker - processes to ensure that the they are running and healthy. - - Value indicating if pinging is enabled or disabled. - - - - The PingInterval property specifies the period of time (in seconds) between health-monitoring - pings that the World Wide Web Publishing Service (WWW Service) sends to a worker process. - - Value indicating the ping interval. - - - - The PingResponseTime property specifies the amount of time (in seconds) that a worker process - is given to respond to a health monitoring ping. After the time limit is exceeded, the World - Wide Web Publishing Service (WWW Service) terminates the worker process. - - Value indicating the ping response time. - - - - Setting the RapidFailProtection property to true instructs the World Wide Web Publishing - Service (WWW service) to put all applications in an application pool out of service if the - number of worker process crashes has reached the maximum specified by the - property, within the number of minutes specified - by the property. - - Value indicating if rapid fail protection is enabled or disabled. - - - - The RapidFailProtectionInterval property specifies the number of minutes before the failure - count for a process is reset. See . - - Value indicating the rapid fail protection interval. - - - - The RapidFailProtectionMaxCrashes property specifies the maximum number of failures - allowed within the number of minutes specified by the - property. See . - - Value indicating the maximum number of crashes. - - - - The ShutdownTimeLimit property specifies the amount of time (in seconds) after a recycle - threshold has been reached that IIS waits for all old requests to finish running in a worker - process before terminating the worker process. - - Value indicating the shutdown time limit. - - - - Setting the SMPAffinitized property to true indicates that a particular worker process - assigned to an application pool should be assigned to a given CPU. This property is used - in conjunction with the property to configure a - particular processor a worker process will be assigned to. - - Value indicating if SMPAffinitized is enabled or disabled. - - - - The SMPProcessorAffinityMask property configures the hexadecimal processor mask. The hexadecimal - processor mask indicates to which CPU the worker processes in an application pool should be - bound. Before this property takes affect, the property must be set - to true for the application pool. These properties cannot be set through IIS Manager. - - Do not set this property to zero. Doing so causes no SMP affinity to be configured, creating an - error condition. The default DWORD value is 4294967295 (or -1), which is represented in hexadecimal - as 0xFFFFFFFF. A value of 0xFFFFFFFF in SMPProcessorAffinityMask indicates that all processors are enabled. - - Value indicating the SMP processor affinity bit mask. - - - - The value of the StartupTimeLimit property specifies the amount of time (in seconds) that the World Wide - Web Publishing Service (WWW Service) should wait for a worker process to finish starting up and - reporting to the WWW Service. - - Value indicating the startup time limit. - - - - The WAMUserName property specifies the account user name that IIS uses by default as the COM+ - application identity for newly created IIS out-of-process applications. The values of this - property and its companion property, , are set when IIS is installed, and - match the user name and password values in the Microsoft Windows user account, which is established - at the same time. Changing the value of this property is not recommended. If you do, change - it to a valid Windows user account, and change WAMUserPass to the corresponding password - for the new account. - - Important: - Changes to WAMUserName and WAMUserPass may disrupt the operation of existing IIS out-of-process - applications. You can synchronize application identities using Component Services to edit the - user name and password values, found on the Identity tab of the property sheet for each package. - - In-process applications are not affected by these property values. - - Value indicating the username. - - - - The WAMUserPass property specifies the password for the account that IIS uses by default as the COM+ - application identity for newly created IIS out-of-process applications. The values of this property - and its companion property, , are set when IIS is installed, and match the - password and user name values in the Microsoft Windows user account (IWAM_ MachineName, where MachineName - is the name of the machine on which IIS is installed) established at the same time. - - Important: - Changing the value of this property is not recommended. If you do, you must change the Windows account - password to the identical value. You must also synchronize existing IIS out-of-process application - identities, using Component Services to edit the user name and password values, which are found on the - Identity tab of the property sheet for each package. - - In-process applications are not affected by these property values. - - Value indicating the password. - - - - Creates a new web directory on a local or remote machine with IIS installed. The default is - to create the new web directory on the local machine. The physical path is required to already exist - on the target machine. If connecting to a remote machine, you can specify the - and for the task to run under. - - Create a new web directory on the local machine. - - ]]> - - - - - When overridden in a derived class, executes the task. - - - True if the task successfully executed; otherwise, false. - - - - - Gets or sets the name of the virtual directory. - - The name of the virtual directory. - - - - Gets or sets the virtual directory physical path. The physical directory must - exist before this task executes. - - The virtual directory physical path. - - - - Gets or sets a value that indicates if the file - or the contents of the folder may be executed, regardless of file type. - - A value indicating if AccessExecute is enabled or disabled. - - - - A value of true indicates that remote requests to execute applications - are denied; only requests from the same computer as the IIS server succeed - if the AccessExecute property is set to true. You cannot set - AccessNoRemoteExecute to false to enable remote requests, and set - to false to disable local requests. - - Value indicating if AccessNoRemoteExecute is enabled or disabled. - - - - A value of true indicates that remote requests to view files are denied; only - requests from the same computer as the IIS server succeed if the - property is set to true. You cannot set to false to enable - remote requests, and set to false to disable local requests. - - Value indicating if AccessNoRemoteRead is enabled or disabled. - - - - A value of true indicates that remote requests to view dynamic content are denied; only - requests from the same computer as the IIS server succeed if the property - is set to true. You cannot set AccessNoRemoteScript to false to enable remote requests, - and set to false to disable local requests. - - Value indicating if AccessNoRemoteScript is enabled or disabled. - - - - A value of true indicates that remote requests to create or change files are denied; only - requests from the same computer as the IIS server succeed if the property - is set to true. You cannot set AccessNoRemoteWrite to false to enable remote requests, - and set to false to disable local requests. - - Value indicating if AccessNoRemoteWrite is enabled or disabled. - - - - A value of true indicates that the file or the contents of the folder may be read - through Microsoft Internet Explorer. - - Value indicating if AccessRead is enabled or disabled. - - - - A value of true indicates that users are allowed to access source code if either - Read or Write permissions are set. Source code includes scripts in Microsoft ® Active - Server Pages (ASP) applications. - - Value indicating if AccessSource is enabled or disabled. - - - - A value of true indicates that the file or the contents of the folder may be executed - if they are script files or static content. A value of false only allows static files, - such as HTML files, to be served. - - Value indicating if AccessScript is enabled or disabled. - - - - A value of true indicates that file access requires SSL file permission processing, with - or without a client certificate. - - Value indicating if AccessSsl is enabled or disabled. - - - - A value of true indicates that file access requires SSL file permission processing - with a minimum key size of 128 bits, with or without a client certificate. - - Value indicating if AccessSsl128 is enabled or disabled. - - - - A value of true indicates that SSL file permission processing maps a client certificate - to a Microsoft Windows ® operating system user-account. The property - must also be set to true for the mapping to occur. - - Value indicating if AccessSslMapCert is enabled or disabled. - - - - A value of true indicates that SSL file access processing requests a certificate from - the client. A value of false indicates that access continues if the client does not have - a certificate. Some versions of Internet Explorer will close the connection if the server - requests a certificate and a certificate is not available (even if - is also set to true). - - Value indicating if AccessSslNegotiateCert is enabled or disabled. - - - - A value of true indicates that SSL file access processing requests a certificate from the - client. If the client provides no certificate, the connection is closed. - must also be set to true when using AccessSSLRequireCert. - - Value indicating if AccessSslRequireCert is enabled or disabled. - - - - A value of true indicates that users are allowed to upload files and their associated - properties to the enabled directory on your server or to change content in a Write-enabled - file. Write can be implemented only with a browser that supports the PUT feature of - the HTTP 1.1 protocol standard. - - Value indicating if AccessWrite is enabled or disabled. - - - - The AnonymousPasswordSync property indicates whether IIS should handle the user password - for anonymous users attempting to access resources. - - Value indicating if AnonymousPasswordSync is enabled or disabled. - - - - The AppAllowClientDebug property specifies whether ASP client-side debugging - is enabled. This property is independent of , which - applies to server-side debugging. - - Value indicating if AppAllowClientDebug is enabled or disabled. - - - - The AppAllowDebugging property specifies whether ASP debugging is enabled on - the server. This property is independent of the property, - which applies to client-side debugging. - - Value indicating if AppAllowDebugging is enabled or disabled. - - - - The AspAllowSessionState property enables session state persistence for the ASP application. - - Value indicating if the AspAllowSessionState is enabled or disabled. - - - - The AspBufferingOn property specifies whether output from an ASP application will be buffered. - - Value indicating if the AspBufferingOn is enabled or disabled. - - - - The AspEnableApplicationRestart determines whether an ASP application can be - automatically restarted. When changes are made to Global.asa or metabase properties - that affect an application, the application will not restart unless the - AspEnableApplicationRestart property is set to true. - - Value indicating if AspEnableApplicationRestart is enabled or disabled. - - - - The AspEnableAspHtmlFallback property controls the behavior of ASP when a - new request is to be rejected due to a full request queue. - - Value indicating if AspEnableAspHtmlFallback is enabled or disabled. - - - - The AspEnableChunkedEncoding property specifies whether HTTP 1.1 chunked - transfer encoding is enabled for the World Wide Web Publishing Service (WWW service). - - Value indicating if AspEnableChunkedEncoding is enabled or disabled. - - - - The AspErrorsToNTLog property specifies which ASP errors are written to the - Windows event log. ASP errors are written to the client browser and to the IIS - log files by default. - - Value indicating if AspErrorsToNTLog is enabled or disabled. - - - - The AspEnableParentPaths property specifies whether an ASP page allows paths - relative to the current directory (using the ..\ notation) or above the current directory. - - Value indicating if AspEnableParentPaths is enabled or disabled. - - - - The AspEnableTypelibCache property specifies whether type libraries are cached - on the server. The World Wide Web Publishing Service (WWW service) setting for - this property is applicable to all in-process and pooled out-of-process application - nodes, at all levels. Metabase settings at the Web server level or lower are ignored - for in-process and pooled out-of-process applications. However, settings at the Web - server level or lower are used if that node is an isolated out-of-process application. - - Value indicating if AspEnableTypelibCache is enabled or disabled. - - - - The AspExceptionCatchEnable property specifies whether ASP pages trap exceptions - thrown by components. - - Value indicating if AspExceptionCatchEnable is enabled or disabled. - - - - The AspLogErrorRequests property controls whether the Web server writes ASP errors - to the application section of the Windows event log. ASP errors are written to the - client browser and to the IIS log files by default. - - Value indicating if AspLogErrorRequests is enabled or disabled. - - - - The AspScriptErrorSentToBrowser property specifies whether the Web server writes - debugging specifics (file name, error, line number, description) to the client - browser, in addition to logging them to the Windows Event Log. The - property provides the error message to be sent if this property is set to false. - - Value indicating if AspScriptErrorSentToBrowser is enabled or disabled. - - - - The AspTrackThreadingModel property specifies whether IIS checks the threading model - of any components (COM objects) that your application creates. The preferred setting - of this metabase property is false. - - Value indicating if AspTrackThreadingModel is enabled or disabled. - - - - Specifies Anonymous authentication as one of the possible Windows authentication - schemes returned to clients as being available. - - Value indicating if AuthAnonymous is enabled or disabled. - - - - Specifies Basic authentication as one of the possible Windows authentication - schemes returned to clients as being available. - - Value indicating if AuthBasic is enabled or disabled. - - - - Specifies Integrated Windows authentication (also known as Challenge/Response or - NTLM authentication) as one of the possible Windows authentication schemes - returned to clients as being available. - - Value indicating if AuthNtlm is enabled or disabled. - - - - Setting this flag to true specifies that authentication persists only for a single - request on a connection. IIS resets the authentication at the end of each request, and - forces re-authentication on the next request of the session. - - Value indicating if AuthPersistSingleRequest is enabled or disabled. - - - - Setting this flag to true specifies authentication will persist only across single - requests on a connection if the connection is by proxy. IIS will reset the authentication - at the end of the request if the current authenticated request is by proxy and it is - not the special case where IIS is running MSPROXY. - - Value indicating if AuthPersistSingleRequestIfProxy is enabled or disabled. - - - - Setting this flag to true specifies that authentication is valid for a single request if - by proxy. IIS will reset the authentication at the end of the request and force - re-authentication on the next request if the current authenticated request is by - proxy of any type. - - Value indicating if AuthPersistSingleRequestAlwaysIfProxy is enabled or disabled. - - - - The CacheControlNoCache property specifies the HTTP 1.1 directive to prevent caching of content. - - Value indicating if CacheControlNoCache is enabled or disabled. - - - - The CacheISAPI property indicates whether ISAPI extensions are cached in memory after first use. - - Value indicating if CacheIsapi is enabled or disabled. - - - - The ContentIndexed property specifies whether the installed content indexer should - index content under this directory tree. - - Value indicating if ContentIndexed is enabled or disabled. - - - - This property specifies whether process accounting and throttling should be performed - for ISAPI extensions and ASP applications. To perform process accounting on CGI - applications, use the property . - - Value indicating if CpuAppEnabled is enabled or disabled. - - - - This property indicates whether IIS should perform process accounting for CGI - applications. To effectively throttle CGI applications, use the CgiTimeout - property. To use process accounting for ISAPI and ASP applications, use . - - Value indicating if CpuCgiEnabled is enabled or disabled. - - - - The CreateCGIWithNewConsole property indicates whether a CGI application runs in its own console. - - Value indicating if CreateCgiWithNewConsole is enabled or disabled. - - - - The CreateProcessAsUser property specifies whether a CGI process is created in the system context or in the context of the requesting user. - - Value indicating if CreateProcessAsUser is enabled or disabled. - - - - When set to true, date information is displayed when browsing directories. - - Value indicating if DirBrowseShowDate is enabled or disabled. - - - - When set to true, file name extensions are displayed when browsing directories. - - Value indicating if DirBrowseShowExtension is enabled or disabled. - - - - When set to true, date information is displayed in extended format when displaying directories. - - Value indicating if DirBrowseShowLongDate is enabled or disabled. - - - - When set to true, file size information is displayed when browsing directories. - - Value indicating if DirBrowseShowSize is enabled or disabled. - - - - When set to true, file time information is displayed when displaying directories. - - Value indicating if DirBrowseShowTime is enabled or disabled. - - - - The DontLog property specifies whether client requests are written to the IIS log files. - - Value indicating if DontLog is enabled or disabled. - - - - When set to true, the default document (specified by the property) for - a directory is loaded when the directory is browsed. - - Value indicating if EnableDefaultDoc is enabled or disabled. - - - - When set to true, directory browsing is enabled. - - Value indicating if EnableDirBrowsing is enabled or disabled. - - - - The EnableDocFooter property enables or disables custom footers specified by - the DefaultDocFooter property. - - Value indicating if EnableDocFooter is enabled or disabled. - - - - The EnableReverseDns property enables or disables reverse Domain Name Server (DNS) lookups - for the World Wide Web Publishing Service (WWW service). Reverse lookups involve looking - up the domain name when the IP address is known. Reverse DNS lookups can use significant - resources and time. - - Value indicating if EnableReverseDns is enabled or disabled. - - - - The SSIExecDisable property specifies whether server-side include (SSI) #exec directives - are disabled under this path. - - Value indicating if SsiExecDisable is enabled or disabled. - - - - The UNCAuthenticationPassthrough property enables user authentication passthrough - for Universal Naming Convention (UNC) virtual root access (for authentication schemes - that support delegation). - - Value indicating if UncAuthenticationPassthrough is enabled or disabled. - - - - The AspScriptErrorMessage property specifies the error message to send to the browser - if specific debugging errors are not sent to the client (if - is set to false). - - Value indicating if AspScriptErrorMessage is enabled or disabled. - - - - The DefaultDoc contains one or more file names of default documents that will be returned - to the client if no file name is included in the client's request. The default document - will be returned if the flag of the DirBrowseFlags property - is set to true for the directory. This property can contain a list of default document - file names separated by a comma and a space, for example Default.htm, Default.asp. - - Listing of the default documents for the web application. - - - - Deletes an existing application pool on a local or remote machine with IIS installed. The default is - to delete an existing application pool on the local machine. If connecting to a remote machine, you can - specify the and for the task - to run under. - - Delete an existing application pool on the local machine. - - ]]> - - - - - When overridden in a derived class, executes the task. - - - True if the task successfully executed; otherwise, false. - - - - - Gets or sets the name of the application pool. - - The name of the application pool. - - - - Deletes a web directory on a local or remote machine with IIS installed. The default is - to delete the web directory on the local machine. If connecting to a remote machine, you - can specify the and for the - task to run under. - - Deletes a web directory on the local machine. - - ]]> - - - - - When overridden in a derived class, executes the task. - - - True if the task successfully executed; otherwise, false. - - - - - Gets or sets the name of the virtual directory. - - The name of the virtual directory. - - - - Actions the can do. - - - - Start the applicaiton pool - - - Stop the applicaiton pool - - - Restart the applicaiton pool - - - Recycle the applicaiton pool - - - - Allows control for an application pool on a local or remote machine with IIS installed. The default is - to control the application pool on the local machine. If connecting to a remote machine, you can - specify the and for the task - to run under. - - Restart an application pool on the local machine. - - ]]> - - - - - When overridden in a derived class, executes the task. - - - True if the task successfully executed; otherwise, false. - - - - - Gets or sets the name of the app pool. - - The name of the app pool. - - - - Gets or sets the application pool action. - - The application pool action. - - - - - Sends an email message - - Example of sending an email. - - - - ]]> - - - - - Initializes a new instance of the class. - - - - Sends an email message - Returns true if successful - - - - List of files to attach to message - - - - - List of addresss that contains the blind carbon copy (BCC) recipients for this e-mail message - - - - - List of addresss that contains the carbon copy (CC) recipients for this e-mail message - - - - - The email message body - - - - - The from address for this e-mail message - - - This property is required. - - - - - A value indicating whether the mail message body is in Html - - - - - The priority of this e-mail message - - - Possible values are High, Normal, and Low - - - - - The subject line for this e-mail message - - - This property is required. - - - - - The name or IP address of the host used for SMTP transactions - - - This property is required. - - - - - List of addresss that contains the recipients of this e-mail message - - - This property is required. - - - - - Gets or sets the username. - - The username. - - - - Gets or sets the password. - - The password. - - - - Add numbers - - Adding numbers: - - - - - ]]> - - - - - Math task base class - - - - - When overridden in a derived class, executes the task. - - - true if the task successfully executed; otherwise, false. - - - - - Strings array to decimal array. - - The numbers. - - - - - Gets or sets the numbers to work with. - - The numbers. - - - - Gets or sets the result. - - The result. - - - - Gets or sets the numeric format. - - The numeric format. - - - - When overridden in a derived class, executes the task. - - - true if the task successfully executed; otherwise, false. - - - - - Divide numbers - - - - - - - ]]> - - - - - When overridden in a derived class, executes the task. - - - true if the task successfully executed; otherwise, false. - - - - - Multiple numbers - - - - - - - ]]> - - - - - When overridden in a derived class, executes the task. - - - true if the task successfully executed; otherwise, false. - - - - - Subtract numbers - - - - - - - ]]> - - - - - When overridden in a derived class, executes the task. - - - true if the task successfully executed; otherwise, false. - - - - - Moves files on the filesystem to a new location. - - - Move a file to another folder - - ]]> - Rename a file - - ]]> - - - - - When overridden in a derived class, executes the task. - - - true if the task successfully executed; otherwise, false. - - - - - Gets the items that were successfully moved. - - The moved files. - - - - Gets or sets the list of files to moved the source files to. - - - This list is expected to be a one-to-one mapping with the - list specified in the SourceFiles parameter. That is, the - first file specified in SourceFiles will be moved to the - first location specified in DestinationFiles, and so forth. - - The destination files. - - - - Gets or sets the directory to which you want to move the files. - - The destination folder. - - - - Gets or sets the source files to move. - - The source files to move. - - - - Runs the NDoc application. - - Generated html help file. - - ]]> - - - - - Initializes a new instance of the class. - - - - - Returns a string value containing the command line arguments to pass directly to the executable file. - - - A string value containing the command line arguments to pass directly to the executable file. - - - - - Returns the fully qualified path to the executable file. - - - The fully qualified path to the executable file. - - - - - Logs the starting point of the run to all registered loggers. - - A descriptive message to provide loggers, usually the command line and switches. - - - - Returns the directory in which to run the executable file. - - - The directory in which to run the executable file, or a null reference (Nothing in Visual Basic) if the executable file should be run in the current directory. - - - - - Gets or sets the documenter. - - The documenter. - Available documenters are VS.NET_2003, JavaDoc, LaTeX, LinearHtml, MSDN, XML. - - - - Gets or sets the project file path. - - The project file path. - - - - Gets or sets a value indicating whether the output is verbose. - - true if verbose; otherwise, false. - - - - Gets or sets the working directory. - - The working directory. - - The directory in which to run the executable file, or a null reference (Nothing in Visual Basic) if the executable file should be run in the current directory. - - - - - Gets the name of the executable file to run. - - - The name of the executable file to run. - - - - Gets the with which to log errors. - - - The with which to log errors. - - - - Run NUnit on a group of assemblies. - - Run NUnit tests. - - - - - - - ]]> - - - - - The default relative path of the NUnit installation. - The value is @"NUnit-Net-2.0 2.2.5\bin". - - - - - Initializes a new instance of the class. - - - - - Returns a string value containing the command line arguments to pass directly to the executable file. - - - A string value containing the command line arguments to pass directly to the executable file. - - - - - Returns the fully qualified path to the executable file. - - - The fully qualified path to the executable file. - - - - - Logs the starting point of the run to all registered loggers. - - A descriptive message to provide loggers, usually the command line and switches. - - - - Returns the directory in which to run the executable file. - - - The directory in which to run the executable file, or a null reference (Nothing in Visual Basic) if the executable file should be run in the current directory. - - - - - Gets or sets the assemblies. - - The assemblies. - - - - Gets or sets the include category. - - The include category. - - - - Gets or sets the exclude category. - - The exclude category. - - - - Gets or sets the fixture. - - The fixture. - - - - Gets or sets the XSLT transform file. - - The XSLT transform file. - - - - Gets or sets the output XML file. - - The output XML file. - - - - Gets or sets the working directory. - - The working directory. - - The directory in which to run the executable file, or a null reference (Nothing in Visual Basic) if the executable file should be run in the current directory. - - - - - Gets the name of the executable file to run. - - - The name of the executable file to run. - - - - Gets the with which to log errors. - - - The with which to log errors. - - - - A strongly-typed resource class, for looking up localized strings, etc. - - - - - Returns the cached ResourceManager instance used by this class. - - - - - Overrides the current thread's CurrentUICulture property for all - resource lookups using this strongly typed resource class. - - - - - Looks up a localized string similar to Attrib directory '{0}'. {1}. - - - - - Looks up a localized string similar to Attrib file '{0}'. {1}. - - - - - Looks up a localized string similar to File Not Found: {0}. - - - - - Looks up a localized string similar to Local File Not Found: {0}. - - - - - Looks up a localized string similar to {0}% Complete ({1}). - - - - - Looks up a localized string similar to Transfered {0} ({1}) in {2}. - - - - - Looks up a localized string similar to Upload File Complete, {0}. - - - - - Looks up a localized string similar to Uploading "{0}" - to "{1}" - . - - - - - Looks up a localized string similar to The URI "{0}" scheme is not valid.. - - - - - Looks up a localized string similar to Emailing "{0}".. - - - - - Looks up a localized string similar to "{0}" is not a number.. - - - - - Looks up a localized string similar to Creating directory "{0}".. - - - - - Looks up a localized string similar to Could not move the file "{0}" to the destination file "{1}", because the destination is a folder instead of a file. To move the source file into a folder, consider using the DestinationFolder parameter instead of DestinationFiles.. - - - - - Looks up a localized string similar to Unable to move file "{0}" to "{1}". {2}. - - - - - Looks up a localized string similar to Both "{0}" and "{1}" were specified as input parameters in the project file. Please choose one or the other.. - - - - - Looks up a localized string similar to Moving file from "{0}" to "{1}".. - - - - - Looks up a localized string similar to No destination specified for Move. Please supply either "{0}" or "{1}".. - - - - - Looks up a localized string similar to The source file "{0}" is actually a directory. The "Move" task does not support moving directories.. - - - - - Looks up a localized string similar to Could not find the NUnit Project File open command. Please make sure NUnit is installed.. - - - - - Looks up a localized string similar to The "{0}" task was not given a value for the required parameter "{1}".. - - - - - Looks up a localized string similar to Read Windows Registry. - - - - - Looks up a localized string similar to Write Windows Registry. - - - - - Looks up a localized string similar to Cannot continue service {0} on computer '{1}' as it does not support the pause and continue.. - - - - - Looks up a localized string similar to Cannot pause service {0} on computer '{1}' as it does not support the pause and continue.. - - - - - Looks up a localized string similar to Cannot stop service {0} on computer '{1}'.. - - - - - Looks up a localized string similar to {0} service was continued successfully.. - - - - - Looks up a localized string similar to {0} service is continuing .... - - - - - Looks up a localized string similar to Couldn't find the '{0}' service on '{1}'. - - - - - Looks up a localized string similar to Cannot continue service {0} on computer '{1}' as its not currently paused.. - - - - - Looks up a localized string similar to Cannot pause service {0} on computer '{1}' as its not currently started.. - - - - - Looks up a localized string similar to {0} service was paused successfully.. - - - - - Looks up a localized string similar to {0} service is pausing .... - - - - - Looks up a localized string similar to {0} service was started successfully.. - - - - - Looks up a localized string similar to {0} service is starting .... - - - - - Looks up a localized string similar to The '{0}' service on '{1}' is '{2}'.. - - - - - Looks up a localized string similar to {0} service was stopped successfully.. - - - - - Looks up a localized string similar to {0} service is stopping .... - - - - - Looks up a localized string similar to LocalPath is not a working subversion copy.. - - - - - Looks up a localized string similar to Failed to get current date!. - - - - - Looks up a localized string similar to Getting current date.. - - - - - Looks up a localized string similar to "{2}" refers to {0} item(s), and "{3}" refers to {1} item(s). They must have the same number of items.. - - - - - Looks up a localized string similar to extracted "{0}". - - - - - Looks up a localized string similar to Unzip File "{0}" - to Directory "{1}" - . - - - - - Looks up a localized string similar to Unzipped file "{0}" successfully.. - - - - - Looks up a localized string similar to Version file "{0}" not found .. - - - - - Looks up a localized string similar to Version "{0}" read from file "{1}".. - - - - - Looks up a localized string similar to Unable to read version number from "{0}". {1}. - - - - - Looks up a localized string similar to Unable to write version number to "{0}". {1}". - - - - - Looks up a localized string similar to Version "{0}" wrote to file "{1}".. - - - - - Looks up a localized string similar to Reading Xml Document "{0}".. - - - - - Looks up a localized string similar to {0} node(s) selected for read.. - - - - - Looks up a localized string similar to XmlRead Result: "{0}". - - - - - Looks up a localized string similar to Updating Xml Document "{0}".. - - - - - Looks up a localized string similar to {0} node(s) selected for update.. - - - - - Looks up a localized string similar to XmlUpdate Wrote: "{0}". - - - - - Looks up a localized string similar to Adding Parameter \"{0}\": \"{1}\". - - - - - Looks up a localized string similar to Adding root attribute {0}=\"{1}\". - - - - - Looks up a localized string similar to Creating root tag \"{0}\". - - - - - Looks up a localized string similar to No input files. - - - - - Looks up a localized string similar to No root tag inserted. - - - - - Looks up a localized string similar to added "{0}". - - - - - Looks up a localized string similar to Creating zip file "{0}".. - - - - - Looks up a localized string similar to Zip File Not Found: {0}. - - - - - Looks up a localized string similar to Created zip file "{0}" successfully.. - - - - - Reads a value from the Registry - - Read .NET Framework install root from Registry. - - - - - ]]> - - - - - Initializes a new instance of the class. - - - - - When overridden in a derived class, executes the task. - - - true if the task successfully executed; otherwise, false. - - - - - Gets or sets the full registry path of the key, beginning with a valid registry root, such as "HKEY_CURRENT_USER". - - The name of the key. - - - - Gets or sets the name of the name/value pair. - - The name of the value. - - - - Gets or sets the default value. - - The default value. - - - - Gets the stored value. - - The value. - - - - Writes a value to the Registry - - Write a value to Registry - - ]]> - - - - - Initializes a new instance of the class. - - - - - When overridden in a derived class, executes the task. - - - true if the task successfully executed; otherwise, false. - - - - - Gets or sets the full registry path of the key, beginning with a valid registry root, such as "HKEY_CURRENT_USER". - - The name of the key. - - - - Gets or sets the name of the name/value pair. - - The name of the value. - - - - Gets or sets the value to be stored. - - The value. - - - - Executes code contained within the task. - - - Simple script that writes to the console - - - - - - - - - - */ -function copy(source, destination) { - var stackSource = []; - var stackDest = []; - - if (destination) { - if (isTypedArray(destination) || isArrayBuffer(destination)) { - throw ngMinErr('cpta', "Can't copy! TypedArray destination cannot be mutated."); - } - if (source === destination) { - throw ngMinErr('cpi', "Can't copy! Source and destination are identical."); - } - - // Empty the destination object - if (isArray(destination)) { - destination.length = 0; - } else { - forEach(destination, function(value, key) { - if (key !== '$$hashKey') { - delete destination[key]; - } - }); - } - - stackSource.push(source); - stackDest.push(destination); - return copyRecurse(source, destination); - } - - return copyElement(source); - - function copyRecurse(source, destination) { - var h = destination.$$hashKey; - var key; - if (isArray(source)) { - for (var i = 0, ii = source.length; i < ii; i++) { - destination.push(copyElement(source[i])); - } - } else if (isBlankObject(source)) { - // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty - for (key in source) { - destination[key] = copyElement(source[key]); - } - } else if (source && typeof source.hasOwnProperty === 'function') { - // Slow path, which must rely on hasOwnProperty - for (key in source) { - if (source.hasOwnProperty(key)) { - destination[key] = copyElement(source[key]); - } - } - } else { - // Slowest path --- hasOwnProperty can't be called as a method - for (key in source) { - if (hasOwnProperty.call(source, key)) { - destination[key] = copyElement(source[key]); - } - } - } - setHashKey(destination, h); - return destination; - } - - function copyElement(source) { - // Simple values - if (!isObject(source)) { - return source; - } - - // Already copied values - var index = stackSource.indexOf(source); - if (index !== -1) { - return stackDest[index]; - } - - if (isWindow(source) || isScope(source)) { - throw ngMinErr('cpws', - "Can't copy! Making copies of Window or Scope instances is not supported."); - } - - var needsRecurse = false; - var destination = copyType(source); - - if (destination === undefined) { - destination = isArray(source) ? [] : Object.create(getPrototypeOf(source)); - needsRecurse = true; - } - - stackSource.push(source); - stackDest.push(destination); - - return needsRecurse - ? copyRecurse(source, destination) - : destination; - } - - function copyType(source) { - switch (toString.call(source)) { - case '[object Int8Array]': - case '[object Int16Array]': - case '[object Int32Array]': - case '[object Float32Array]': - case '[object Float64Array]': - case '[object Uint8Array]': - case '[object Uint8ClampedArray]': - case '[object Uint16Array]': - case '[object Uint32Array]': - return new source.constructor(copyElement(source.buffer)); - - case '[object ArrayBuffer]': - //Support: IE10 - if (!source.slice) { - var copied = new ArrayBuffer(source.byteLength); - new Uint8Array(copied).set(new Uint8Array(source)); - return copied; - } - return source.slice(0); - - case '[object Boolean]': - case '[object Number]': - case '[object String]': - case '[object Date]': - return new source.constructor(source.valueOf()); - - case '[object RegExp]': - var re = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]); - re.lastIndex = source.lastIndex; - return re; - - case '[object Blob]': - return new source.constructor([source], {type: source.type}); - } - - if (isFunction(source.cloneNode)) { - return source.cloneNode(true); - } - } -} - -/** - * Creates a shallow copy of an object, an array or a primitive. - * - * Assumes that there are no proto properties for objects. - */ -function shallowCopy(src, dst) { - if (isArray(src)) { - dst = dst || []; - - for (var i = 0, ii = src.length; i < ii; i++) { - dst[i] = src[i]; - } - } else if (isObject(src)) { - dst = dst || {}; - - for (var key in src) { - if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) { - dst[key] = src[key]; - } - } - } - - return dst || src; -} - - -/** - * @ngdoc function - * @name angular.equals - * @module ng - * @kind function - * - * @description - * Determines if two objects or two values are equivalent. Supports value types, regular - * expressions, arrays and objects. - * - * Two objects or values are considered equivalent if at least one of the following is true: - * - * * Both objects or values pass `===` comparison. - * * Both objects or values are of the same type and all of their properties are equal by - * comparing them with `angular.equals`. - * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal) - * * Both values represent the same regular expression (In JavaScript, - * /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual - * representation matches). - * - * During a property comparison, properties of `function` type and properties with names - * that begin with `$` are ignored. - * - * Scope and DOMWindow objects are being compared only by identify (`===`). - * - * @param {*} o1 Object or value to compare. - * @param {*} o2 Object or value to compare. - * @returns {boolean} True if arguments are equal. - */ -function equals(o1, o2) { - if (o1 === o2) return true; - if (o1 === null || o2 === null) return false; - if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN - var t1 = typeof o1, t2 = typeof o2, length, key, keySet; - if (t1 == t2 && t1 == 'object') { - if (isArray(o1)) { - if (!isArray(o2)) return false; - if ((length = o1.length) == o2.length) { - for (key = 0; key < length; key++) { - if (!equals(o1[key], o2[key])) return false; - } - return true; - } - } else if (isDate(o1)) { - if (!isDate(o2)) return false; - return equals(o1.getTime(), o2.getTime()); - } else if (isRegExp(o1)) { - if (!isRegExp(o2)) return false; - return o1.toString() == o2.toString(); - } else { - if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || - isArray(o2) || isDate(o2) || isRegExp(o2)) return false; - keySet = createMap(); - for (key in o1) { - if (key.charAt(0) === '$' || isFunction(o1[key])) continue; - if (!equals(o1[key], o2[key])) return false; - keySet[key] = true; - } - for (key in o2) { - if (!(key in keySet) && - key.charAt(0) !== '$' && - isDefined(o2[key]) && - !isFunction(o2[key])) return false; - } - return true; - } - } - return false; -} - -var csp = function() { - if (!isDefined(csp.rules)) { - - - var ngCspElement = (document.querySelector('[ng-csp]') || - document.querySelector('[data-ng-csp]')); - - if (ngCspElement) { - var ngCspAttribute = ngCspElement.getAttribute('ng-csp') || - ngCspElement.getAttribute('data-ng-csp'); - csp.rules = { - noUnsafeEval: !ngCspAttribute || (ngCspAttribute.indexOf('no-unsafe-eval') !== -1), - noInlineStyle: !ngCspAttribute || (ngCspAttribute.indexOf('no-inline-style') !== -1) - }; - } else { - csp.rules = { - noUnsafeEval: noUnsafeEval(), - noInlineStyle: false - }; - } - } - - return csp.rules; - - function noUnsafeEval() { - try { - /* jshint -W031, -W054 */ - new Function(''); - /* jshint +W031, +W054 */ - return false; - } catch (e) { - return true; - } - } -}; - -/** - * @ngdoc directive - * @module ng - * @name ngJq - * - * @element ANY - * @param {string=} ngJq the name of the library available under `window` - * to be used for angular.element - * @description - * Use this directive to force the angular.element library. This should be - * used to force either jqLite by leaving ng-jq blank or setting the name of - * the jquery variable under window (eg. jQuery). - * - * Since angular looks for this directive when it is loaded (doesn't wait for the - * DOMContentLoaded event), it must be placed on an element that comes before the script - * which loads angular. Also, only the first instance of `ng-jq` will be used and all - * others ignored. - * - * @example - * This example shows how to force jqLite using the `ngJq` directive to the `html` tag. - ```html - - - ... - ... - - ``` - * @example - * This example shows how to use a jQuery based library of a different name. - * The library name must be available at the top most 'window'. - ```html - - - ... - ... - - ``` - */ -var jq = function() { - if (isDefined(jq.name_)) return jq.name_; - var el; - var i, ii = ngAttrPrefixes.length, prefix, name; - for (i = 0; i < ii; ++i) { - prefix = ngAttrPrefixes[i]; - if (el = document.querySelector('[' + prefix.replace(':', '\\:') + 'jq]')) { - name = el.getAttribute(prefix + 'jq'); - break; - } - } - - return (jq.name_ = name); -}; - -function concat(array1, array2, index) { - return array1.concat(slice.call(array2, index)); -} - -function sliceArgs(args, startIndex) { - return slice.call(args, startIndex || 0); -} - - -/* jshint -W101 */ -/** - * @ngdoc function - * @name angular.bind - * @module ng - * @kind function - * - * @description - * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for - * `fn`). You can supply optional `args` that are prebound to the function. This feature is also - * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as - * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application). - * - * @param {Object} self Context which `fn` should be evaluated in. - * @param {function()} fn Function to be bound. - * @param {...*} args Optional arguments to be prebound to the `fn` function call. - * @returns {function()} Function that wraps the `fn` with all the specified bindings. - */ -/* jshint +W101 */ -function bind(self, fn) { - var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : []; - if (isFunction(fn) && !(fn instanceof RegExp)) { - return curryArgs.length - ? function() { - return arguments.length - ? fn.apply(self, concat(curryArgs, arguments, 0)) - : fn.apply(self, curryArgs); - } - : function() { - return arguments.length - ? fn.apply(self, arguments) - : fn.call(self); - }; - } else { - // in IE, native methods are not functions so they cannot be bound (note: they don't need to be) - return fn; - } -} - - -function toJsonReplacer(key, value) { - var val = value; - - if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') { - val = undefined; - } else if (isWindow(value)) { - val = '$WINDOW'; - } else if (value && document === value) { - val = '$DOCUMENT'; - } else if (isScope(value)) { - val = '$SCOPE'; - } - - return val; -} - - -/** - * @ngdoc function - * @name angular.toJson - * @module ng - * @kind function - * - * @description - * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be - * stripped since angular uses this notation internally. - * - * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON. - * @param {boolean|number} [pretty=2] If set to true, the JSON output will contain newlines and whitespace. - * If set to an integer, the JSON output will contain that many spaces per indentation. - * @returns {string|undefined} JSON-ified string representing `obj`. - */ -function toJson(obj, pretty) { - if (isUndefined(obj)) return undefined; - if (!isNumber(pretty)) { - pretty = pretty ? 2 : null; - } - return JSON.stringify(obj, toJsonReplacer, pretty); -} - - -/** - * @ngdoc function - * @name angular.fromJson - * @module ng - * @kind function - * - * @description - * Deserializes a JSON string. - * - * @param {string} json JSON string to deserialize. - * @returns {Object|Array|string|number} Deserialized JSON string. - */ -function fromJson(json) { - return isString(json) - ? JSON.parse(json) - : json; -} - - -var ALL_COLONS = /:/g; -function timezoneToOffset(timezone, fallback) { - // IE/Edge do not "understand" colon (`:`) in timezone - timezone = timezone.replace(ALL_COLONS, ''); - var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000; - return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset; -} - - -function addDateMinutes(date, minutes) { - date = new Date(date.getTime()); - date.setMinutes(date.getMinutes() + minutes); - return date; -} - - -function convertTimezoneToLocal(date, timezone, reverse) { - reverse = reverse ? -1 : 1; - var dateTimezoneOffset = date.getTimezoneOffset(); - var timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset); - return addDateMinutes(date, reverse * (timezoneOffset - dateTimezoneOffset)); -} - - -/** - * @returns {string} Returns the string representation of the element. - */ -function startingTag(element) { - element = jqLite(element).clone(); - try { - // turns out IE does not let you set .html() on elements which - // are not allowed to have children. So we just ignore it. - element.empty(); - } catch (e) {} - var elemHtml = jqLite('
                                        ').append(element).html(); - try { - return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) : - elemHtml. - match(/^(<[^>]+>)/)[1]. - replace(/^<([\w\-]+)/, function(match, nodeName) {return '<' + lowercase(nodeName);}); - } catch (e) { - return lowercase(elemHtml); - } - -} - - -///////////////////////////////////////////////// - -/** - * Tries to decode the URI component without throwing an exception. - * - * @private - * @param str value potential URI component to check. - * @returns {boolean} True if `value` can be decoded - * with the decodeURIComponent function. - */ -function tryDecodeURIComponent(value) { - try { - return decodeURIComponent(value); - } catch (e) { - // Ignore any invalid uri component - } -} - - -/** - * Parses an escaped url query string into key-value pairs. - * @returns {Object.} - */ -function parseKeyValue(/**string*/keyValue) { - var obj = {}; - forEach((keyValue || "").split('&'), function(keyValue) { - var splitPoint, key, val; - if (keyValue) { - key = keyValue = keyValue.replace(/\+/g,'%20'); - splitPoint = keyValue.indexOf('='); - if (splitPoint !== -1) { - key = keyValue.substring(0, splitPoint); - val = keyValue.substring(splitPoint + 1); - } - key = tryDecodeURIComponent(key); - if (isDefined(key)) { - val = isDefined(val) ? tryDecodeURIComponent(val) : true; - if (!hasOwnProperty.call(obj, key)) { - obj[key] = val; - } else if (isArray(obj[key])) { - obj[key].push(val); - } else { - obj[key] = [obj[key],val]; - } - } - } - }); - return obj; -} - -function toKeyValue(obj) { - var parts = []; - forEach(obj, function(value, key) { - if (isArray(value)) { - forEach(value, function(arrayValue) { - parts.push(encodeUriQuery(key, true) + - (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true))); - }); - } else { - parts.push(encodeUriQuery(key, true) + - (value === true ? '' : '=' + encodeUriQuery(value, true))); - } - }); - return parts.length ? parts.join('&') : ''; -} - - -/** - * We need our custom method because encodeURIComponent is too aggressive and doesn't follow - * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path - * segments: - * segment = *pchar - * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" - * pct-encoded = "%" HEXDIG HEXDIG - * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" - * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" - * / "*" / "+" / "," / ";" / "=" - */ -function encodeUriSegment(val) { - return encodeUriQuery(val, true). - replace(/%26/gi, '&'). - replace(/%3D/gi, '='). - replace(/%2B/gi, '+'); -} - - -/** - * This method is intended for encoding *key* or *value* parts of query component. We need a custom - * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be - * encoded per http://tools.ietf.org/html/rfc3986: - * query = *( pchar / "/" / "?" ) - * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" - * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" - * pct-encoded = "%" HEXDIG HEXDIG - * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" - * / "*" / "+" / "," / ";" / "=" - */ -function encodeUriQuery(val, pctEncodeSpaces) { - return encodeURIComponent(val). - replace(/%40/gi, '@'). - replace(/%3A/gi, ':'). - replace(/%24/g, '$'). - replace(/%2C/gi, ','). - replace(/%3B/gi, ';'). - replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); -} - -var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-']; - -function getNgAttribute(element, ngAttr) { - var attr, i, ii = ngAttrPrefixes.length; - for (i = 0; i < ii; ++i) { - attr = ngAttrPrefixes[i] + ngAttr; - if (isString(attr = element.getAttribute(attr))) { - return attr; - } - } - return null; -} - -/** - * @ngdoc directive - * @name ngApp - * @module ng - * - * @element ANY - * @param {angular.Module} ngApp an optional application - * {@link angular.module module} name to load. - * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be - * created in "strict-di" mode. This means that the application will fail to invoke functions which - * do not use explicit function annotation (and are thus unsuitable for minification), as described - * in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in - * tracking down the root of these bugs. - * - * @description - * - * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive - * designates the **root element** of the application and is typically placed near the root element - * of the page - e.g. on the `` or `` tags. - * - * There are a few things to keep in mind when using `ngApp`: - * - only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp` - * found in the document will be used to define the root element to auto-bootstrap as an - * application. To run multiple applications in an HTML document you must manually bootstrap them using - * {@link angular.bootstrap} instead. - * - AngularJS applications cannot be nested within each other. - * - Do not use a directive that uses {@link ng.$compile#transclusion transclusion} on the same element as `ngApp`. - * This includes directives such as {@link ng.ngIf `ngIf`}, {@link ng.ngInclude `ngInclude`} and - * {@link ngRoute.ngView `ngView`}. - * Doing this misplaces the app {@link ng.$rootElement `$rootElement`} and the app's {@link auto.$injector injector}, - * causing animations to stop working and making the injector inaccessible from outside the app. - * - * You can specify an **AngularJS module** to be used as the root module for the application. This - * module will be loaded into the {@link auto.$injector} when the application is bootstrapped. It - * should contain the application code needed or have dependencies on other modules that will - * contain the code. See {@link angular.module} for more information. - * - * In the example below if the `ngApp` directive were not placed on the `html` element then the - * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}` - * would not be resolved to `3`. - * - * `ngApp` is the easiest, and most common way to bootstrap an application. - * - - -
                                        - I can add: {{a}} + {{b}} = {{ a+b }} -
                                        -
                                        - - angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) { - $scope.a = 1; - $scope.b = 2; - }); - -
                                        - * - * Using `ngStrictDi`, you would see something like this: - * - - -
                                        -
                                        - I can add: {{a}} + {{b}} = {{ a+b }} - -

                                        This renders because the controller does not fail to - instantiate, by using explicit annotation style (see - script.js for details) -

                                        -
                                        - -
                                        - Name:
                                        - Hello, {{name}}! - -

                                        This renders because the controller does not fail to - instantiate, by using explicit annotation style - (see script.js for details) -

                                        -
                                        - -
                                        - I can add: {{a}} + {{b}} = {{ a+b }} - -

                                        The controller could not be instantiated, due to relying - on automatic function annotations (which are disabled in - strict mode). As such, the content of this section is not - interpolated, and there should be an error in your web console. -

                                        -
                                        -
                                        -
                                        - - angular.module('ngAppStrictDemo', []) - // BadController will fail to instantiate, due to relying on automatic function annotation, - // rather than an explicit annotation - .controller('BadController', function($scope) { - $scope.a = 1; - $scope.b = 2; - }) - // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated, - // due to using explicit annotations using the array style and $inject property, respectively. - .controller('GoodController1', ['$scope', function($scope) { - $scope.a = 1; - $scope.b = 2; - }]) - .controller('GoodController2', GoodController2); - function GoodController2($scope) { - $scope.name = "World"; - } - GoodController2.$inject = ['$scope']; - - - div[ng-controller] { - margin-bottom: 1em; - -webkit-border-radius: 4px; - border-radius: 4px; - border: 1px solid; - padding: .5em; - } - div[ng-controller^=Good] { - border-color: #d6e9c6; - background-color: #dff0d8; - color: #3c763d; - } - div[ng-controller^=Bad] { - border-color: #ebccd1; - background-color: #f2dede; - color: #a94442; - margin-bottom: 0; - } - -
                                        - */ -function angularInit(element, bootstrap) { - var appElement, - module, - config = {}; - - // The element `element` has priority over any other element - forEach(ngAttrPrefixes, function(prefix) { - var name = prefix + 'app'; - - if (!appElement && element.hasAttribute && element.hasAttribute(name)) { - appElement = element; - module = element.getAttribute(name); - } - }); - forEach(ngAttrPrefixes, function(prefix) { - var name = prefix + 'app'; - var candidate; - - if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\:') + ']'))) { - appElement = candidate; - module = candidate.getAttribute(name); - } - }); - if (appElement) { - config.strictDi = getNgAttribute(appElement, "strict-di") !== null; - bootstrap(appElement, module ? [module] : [], config); - } -} - -/** - * @ngdoc function - * @name angular.bootstrap - * @module ng - * @description - * Use this function to manually start up angular application. - * - * For more information, see the {@link guide/bootstrap Bootstrap guide}. - * - * Angular will detect if it has been loaded into the browser more than once and only allow the - * first loaded script to be bootstrapped and will report a warning to the browser console for - * each of the subsequent scripts. This prevents strange results in applications, where otherwise - * multiple instances of Angular try to work on the DOM. - * - *
                                        - * **Note:** Protractor based end-to-end tests cannot use this function to bootstrap manually. - * They must use {@link ng.directive:ngApp ngApp}. - *
                                        - * - *
                                        - * **Note:** Do not bootstrap the app on an element with a directive that uses {@link ng.$compile#transclusion transclusion}, - * such as {@link ng.ngIf `ngIf`}, {@link ng.ngInclude `ngInclude`} and {@link ngRoute.ngView `ngView`}. - * Doing this misplaces the app {@link ng.$rootElement `$rootElement`} and the app's {@link auto.$injector injector}, - * causing animations to stop working and making the injector inaccessible from outside the app. - *
                                        - * - * ```html - * - * - * - *
                                        - * {{greeting}} - *
                                        - * - * - * - * - * - * ``` - * - * @param {DOMElement} element DOM element which is the root of angular application. - * @param {Array=} modules an array of modules to load into the application. - * Each item in the array should be the name of a predefined module or a (DI annotated) - * function that will be invoked by the injector as a `config` block. - * See: {@link angular.module modules} - * @param {Object=} config an object for defining configuration options for the application. The - * following keys are supported: - * - * * `strictDi` - disable automatic function annotation for the application. This is meant to - * assist in finding bugs which break minified code. Defaults to `false`. - * - * @returns {auto.$injector} Returns the newly created injector for this app. - */ -function bootstrap(element, modules, config) { - if (!isObject(config)) config = {}; - var defaultConfig = { - strictDi: false - }; - config = extend(defaultConfig, config); - var doBootstrap = function() { - element = jqLite(element); - - if (element.injector()) { - var tag = (element[0] === document) ? 'document' : startingTag(element); - //Encode angle brackets to prevent input from being sanitized to empty string #8683 - throw ngMinErr( - 'btstrpd', - "App Already Bootstrapped with this Element '{0}'", - tag.replace(//,'>')); - } - - modules = modules || []; - modules.unshift(['$provide', function($provide) { - $provide.value('$rootElement', element); - }]); - - if (config.debugInfoEnabled) { - // Pushing so that this overrides `debugInfoEnabled` setting defined in user's `modules`. - modules.push(['$compileProvider', function($compileProvider) { - $compileProvider.debugInfoEnabled(true); - }]); - } - - modules.unshift('ng'); - var injector = createInjector(modules, config.strictDi); - injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector', - function bootstrapApply(scope, element, compile, injector) { - scope.$apply(function() { - element.data('$injector', injector); - compile(element)(scope); - }); - }] - ); - return injector; - }; - - var NG_ENABLE_DEBUG_INFO = /^NG_ENABLE_DEBUG_INFO!/; - var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/; - - if (window && NG_ENABLE_DEBUG_INFO.test(window.name)) { - config.debugInfoEnabled = true; - window.name = window.name.replace(NG_ENABLE_DEBUG_INFO, ''); - } - - if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) { - return doBootstrap(); - } - - window.name = window.name.replace(NG_DEFER_BOOTSTRAP, ''); - angular.resumeBootstrap = function(extraModules) { - forEach(extraModules, function(module) { - modules.push(module); - }); - return doBootstrap(); - }; - - if (isFunction(angular.resumeDeferredBootstrap)) { - angular.resumeDeferredBootstrap(); - } -} - -/** - * @ngdoc function - * @name angular.reloadWithDebugInfo - * @module ng - * @description - * Use this function to reload the current application with debug information turned on. - * This takes precedence over a call to `$compileProvider.debugInfoEnabled(false)`. - * - * See {@link ng.$compileProvider#debugInfoEnabled} for more. - */ -function reloadWithDebugInfo() { - window.name = 'NG_ENABLE_DEBUG_INFO!' + window.name; - window.location.reload(); -} - -/** - * @name angular.getTestability - * @module ng - * @description - * Get the testability service for the instance of Angular on the given - * element. - * @param {DOMElement} element DOM element which is the root of angular application. - */ -function getTestability(rootElement) { - var injector = angular.element(rootElement).injector(); - if (!injector) { - throw ngMinErr('test', - 'no injector found for element argument to getTestability'); - } - return injector.get('$$testability'); -} - -var SNAKE_CASE_REGEXP = /[A-Z]/g; -function snake_case(name, separator) { - separator = separator || '_'; - return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) { - return (pos ? separator : '') + letter.toLowerCase(); - }); -} - -var bindJQueryFired = false; -function bindJQuery() { - var originalCleanData; - - if (bindJQueryFired) { - return; - } - - // bind to jQuery if present; - var jqName = jq(); - jQuery = isUndefined(jqName) ? window.jQuery : // use jQuery (if present) - !jqName ? undefined : // use jqLite - window[jqName]; // use jQuery specified by `ngJq` - - // Use jQuery if it exists with proper functionality, otherwise default to us. - // Angular 1.2+ requires jQuery 1.7+ for on()/off() support. - // Angular 1.3+ technically requires at least jQuery 2.1+ but it may work with older - // versions. It will not work for sure with jQuery <1.7, though. - if (jQuery && jQuery.fn.on) { - jqLite = jQuery; - extend(jQuery.fn, { - scope: JQLitePrototype.scope, - isolateScope: JQLitePrototype.isolateScope, - controller: JQLitePrototype.controller, - injector: JQLitePrototype.injector, - inheritedData: JQLitePrototype.inheritedData - }); - - // All nodes removed from the DOM via various jQuery APIs like .remove() - // are passed through jQuery.cleanData. Monkey-patch this method to fire - // the $destroy event on all removed nodes. - originalCleanData = jQuery.cleanData; - jQuery.cleanData = function(elems) { - var events; - for (var i = 0, elem; (elem = elems[i]) != null; i++) { - events = jQuery._data(elem, "events"); - if (events && events.$destroy) { - jQuery(elem).triggerHandler('$destroy'); - } - } - originalCleanData(elems); - }; - } else { - jqLite = JQLite; - } - - angular.element = jqLite; - - // Prevent double-proxying. - bindJQueryFired = true; -} - -/** - * throw error if the argument is falsy. - */ -function assertArg(arg, name, reason) { - if (!arg) { - throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required")); - } - return arg; -} - -function assertArgFn(arg, name, acceptArrayAnnotation) { - if (acceptArrayAnnotation && isArray(arg)) { - arg = arg[arg.length - 1]; - } - - assertArg(isFunction(arg), name, 'not a function, got ' + - (arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg)); - return arg; -} - -/** - * throw error if the name given is hasOwnProperty - * @param {String} name the name to test - * @param {String} context the context in which the name is used, such as module or directive - */ -function assertNotHasOwnProperty(name, context) { - if (name === 'hasOwnProperty') { - throw ngMinErr('badname', "hasOwnProperty is not a valid {0} name", context); - } -} - -/** - * Return the value accessible from the object by path. Any undefined traversals are ignored - * @param {Object} obj starting object - * @param {String} path path to traverse - * @param {boolean} [bindFnToScope=true] - * @returns {Object} value as accessible by path - */ -//TODO(misko): this function needs to be removed -function getter(obj, path, bindFnToScope) { - if (!path) return obj; - var keys = path.split('.'); - var key; - var lastInstance = obj; - var len = keys.length; - - for (var i = 0; i < len; i++) { - key = keys[i]; - if (obj) { - obj = (lastInstance = obj)[key]; - } - } - if (!bindFnToScope && isFunction(obj)) { - return bind(lastInstance, obj); - } - return obj; -} - -/** - * Return the DOM siblings between the first and last node in the given array. - * @param {Array} array like object - * @returns {Array} the inputted object or a jqLite collection containing the nodes - */ -function getBlockNodes(nodes) { - // TODO(perf): update `nodes` instead of creating a new object? - var node = nodes[0]; - var endNode = nodes[nodes.length - 1]; - var blockNodes; - - for (var i = 1; node !== endNode && (node = node.nextSibling); i++) { - if (blockNodes || nodes[i] !== node) { - if (!blockNodes) { - blockNodes = jqLite(slice.call(nodes, 0, i)); - } - blockNodes.push(node); - } - } - - return blockNodes || nodes; -} - - -/** - * Creates a new object without a prototype. This object is useful for lookup without having to - * guard against prototypically inherited properties via hasOwnProperty. - * - * Related micro-benchmarks: - * - http://jsperf.com/object-create2 - * - http://jsperf.com/proto-map-lookup/2 - * - http://jsperf.com/for-in-vs-object-keys2 - * - * @returns {Object} - */ -function createMap() { - return Object.create(null); -} - -var NODE_TYPE_ELEMENT = 1; -var NODE_TYPE_ATTRIBUTE = 2; -var NODE_TYPE_TEXT = 3; -var NODE_TYPE_COMMENT = 8; -var NODE_TYPE_DOCUMENT = 9; -var NODE_TYPE_DOCUMENT_FRAGMENT = 11; - -/** - * @ngdoc type - * @name angular.Module - * @module ng - * @description - * - * Interface for configuring angular {@link angular.module modules}. - */ - -function setupModuleLoader(window) { - - var $injectorMinErr = minErr('$injector'); - var ngMinErr = minErr('ng'); - - function ensure(obj, name, factory) { - return obj[name] || (obj[name] = factory()); - } - - var angular = ensure(window, 'angular', Object); - - // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap - angular.$$minErr = angular.$$minErr || minErr; - - return ensure(angular, 'module', function() { - /** @type {Object.} */ - var modules = {}; - - /** - * @ngdoc function - * @name angular.module - * @module ng - * @description - * - * The `angular.module` is a global place for creating, registering and retrieving Angular - * modules. - * All modules (angular core or 3rd party) that should be available to an application must be - * registered using this mechanism. - * - * Passing one argument retrieves an existing {@link angular.Module}, - * whereas passing more than one argument creates a new {@link angular.Module} - * - * - * # Module - * - * A module is a collection of services, directives, controllers, filters, and configuration information. - * `angular.module` is used to configure the {@link auto.$injector $injector}. - * - * ```js - * // Create a new module - * var myModule = angular.module('myModule', []); - * - * // register a new service - * myModule.value('appName', 'MyCoolApp'); - * - * // configure existing services inside initialization blocks. - * myModule.config(['$locationProvider', function($locationProvider) { - * // Configure existing providers - * $locationProvider.hashPrefix('!'); - * }]); - * ``` - * - * Then you can create an injector and load your modules like this: - * - * ```js - * var injector = angular.injector(['ng', 'myModule']) - * ``` - * - * However it's more likely that you'll just use - * {@link ng.directive:ngApp ngApp} or - * {@link angular.bootstrap} to simplify this process for you. - * - * @param {!string} name The name of the module to create or retrieve. - * @param {!Array.=} requires If specified then new module is being created. If - * unspecified then the module is being retrieved for further configuration. - * @param {Function=} configFn Optional configuration function for the module. Same as - * {@link angular.Module#config Module#config()}. - * @returns {angular.Module} new module with the {@link angular.Module} api. - */ - return function module(name, requires, configFn) { - var assertNotHasOwnProperty = function(name, context) { - if (name === 'hasOwnProperty') { - throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context); - } - }; - - assertNotHasOwnProperty(name, 'module'); - if (requires && modules.hasOwnProperty(name)) { - modules[name] = null; - } - return ensure(modules, name, function() { - if (!requires) { - throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " + - "the module name or forgot to load it. If registering a module ensure that you " + - "specify the dependencies as the second argument.", name); - } - - /** @type {!Array.>} */ - var invokeQueue = []; - - /** @type {!Array.} */ - var configBlocks = []; - - /** @type {!Array.} */ - var runBlocks = []; - - var config = invokeLater('$injector', 'invoke', 'push', configBlocks); - - /** @type {angular.Module} */ - var moduleInstance = { - // Private state - _invokeQueue: invokeQueue, - _configBlocks: configBlocks, - _runBlocks: runBlocks, - - /** - * @ngdoc property - * @name angular.Module#requires - * @module ng - * - * @description - * Holds the list of modules which the injector will load before the current module is - * loaded. - */ - requires: requires, - - /** - * @ngdoc property - * @name angular.Module#name - * @module ng - * - * @description - * Name of the module. - */ - name: name, - - - /** - * @ngdoc method - * @name angular.Module#provider - * @module ng - * @param {string} name service name - * @param {Function} providerType Construction function for creating new instance of the - * service. - * @description - * See {@link auto.$provide#provider $provide.provider()}. - */ - provider: invokeLaterAndSetModuleName('$provide', 'provider'), - - /** - * @ngdoc method - * @name angular.Module#factory - * @module ng - * @param {string} name service name - * @param {Function} providerFunction Function for creating new instance of the service. - * @description - * See {@link auto.$provide#factory $provide.factory()}. - */ - factory: invokeLaterAndSetModuleName('$provide', 'factory'), - - /** - * @ngdoc method - * @name angular.Module#service - * @module ng - * @param {string} name service name - * @param {Function} constructor A constructor function that will be instantiated. - * @description - * See {@link auto.$provide#service $provide.service()}. - */ - service: invokeLaterAndSetModuleName('$provide', 'service'), - - /** - * @ngdoc method - * @name angular.Module#value - * @module ng - * @param {string} name service name - * @param {*} object Service instance object. - * @description - * See {@link auto.$provide#value $provide.value()}. - */ - value: invokeLater('$provide', 'value'), - - /** - * @ngdoc method - * @name angular.Module#constant - * @module ng - * @param {string} name constant name - * @param {*} object Constant value. - * @description - * Because the constants are fixed, they get applied before other provide methods. - * See {@link auto.$provide#constant $provide.constant()}. - */ - constant: invokeLater('$provide', 'constant', 'unshift'), - - /** - * @ngdoc method - * @name angular.Module#decorator - * @module ng - * @param {string} The name of the service to decorate. - * @param {Function} This function will be invoked when the service needs to be - * instantiated and should return the decorated service instance. - * @description - * See {@link auto.$provide#decorator $provide.decorator()}. - */ - decorator: invokeLaterAndSetModuleName('$provide', 'decorator'), - - /** - * @ngdoc method - * @name angular.Module#animation - * @module ng - * @param {string} name animation name - * @param {Function} animationFactory Factory function for creating new instance of an - * animation. - * @description - * - * **NOTE**: animations take effect only if the **ngAnimate** module is loaded. - * - * - * Defines an animation hook that can be later used with - * {@link $animate $animate} service and directives that use this service. - * - * ```js - * module.animation('.animation-name', function($inject1, $inject2) { - * return { - * eventName : function(element, done) { - * //code to run the animation - * //once complete, then run done() - * return function cancellationFunction(element) { - * //code to cancel the animation - * } - * } - * } - * }) - * ``` - * - * See {@link ng.$animateProvider#register $animateProvider.register()} and - * {@link ngAnimate ngAnimate module} for more information. - */ - animation: invokeLaterAndSetModuleName('$animateProvider', 'register'), - - /** - * @ngdoc method - * @name angular.Module#filter - * @module ng - * @param {string} name Filter name - this must be a valid angular expression identifier - * @param {Function} filterFactory Factory function for creating new instance of filter. - * @description - * See {@link ng.$filterProvider#register $filterProvider.register()}. - * - *
                                        - * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. - * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace - * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores - * (`myapp_subsection_filterx`). - *
                                        - */ - filter: invokeLaterAndSetModuleName('$filterProvider', 'register'), - - /** - * @ngdoc method - * @name angular.Module#controller - * @module ng - * @param {string|Object} name Controller name, or an object map of controllers where the - * keys are the names and the values are the constructors. - * @param {Function} constructor Controller constructor function. - * @description - * See {@link ng.$controllerProvider#register $controllerProvider.register()}. - */ - controller: invokeLaterAndSetModuleName('$controllerProvider', 'register'), - - /** - * @ngdoc method - * @name angular.Module#directive - * @module ng - * @param {string|Object} name Directive name, or an object map of directives where the - * keys are the names and the values are the factories. - * @param {Function} directiveFactory Factory function for creating new instance of - * directives. - * @description - * See {@link ng.$compileProvider#directive $compileProvider.directive()}. - */ - directive: invokeLaterAndSetModuleName('$compileProvider', 'directive'), - - /** - * @ngdoc method - * @name angular.Module#component - * @module ng - * @param {string} name Name of the component in camel-case (i.e. myComp which will match as my-comp) - * @param {Object} options Component definition object (a simplified - * {@link ng.$compile#directive-definition-object directive definition object}) - * - * @description - * See {@link ng.$compileProvider#component $compileProvider.component()}. - */ - component: invokeLaterAndSetModuleName('$compileProvider', 'component'), - - /** - * @ngdoc method - * @name angular.Module#config - * @module ng - * @param {Function} configFn Execute this function on module load. Useful for service - * configuration. - * @description - * Use this method to register work which needs to be performed on module loading. - * For more about how to configure services, see - * {@link providers#provider-recipe Provider Recipe}. - */ - config: config, - - /** - * @ngdoc method - * @name angular.Module#run - * @module ng - * @param {Function} initializationFn Execute this function after injector creation. - * Useful for application initialization. - * @description - * Use this method to register work which should be performed when the injector is done - * loading all modules. - */ - run: function(block) { - runBlocks.push(block); - return this; - } - }; - - if (configFn) { - config(configFn); - } - - return moduleInstance; - - /** - * @param {string} provider - * @param {string} method - * @param {String=} insertMethod - * @returns {angular.Module} - */ - function invokeLater(provider, method, insertMethod, queue) { - if (!queue) queue = invokeQueue; - return function() { - queue[insertMethod || 'push']([provider, method, arguments]); - return moduleInstance; - }; - } - - /** - * @param {string} provider - * @param {string} method - * @returns {angular.Module} - */ - function invokeLaterAndSetModuleName(provider, method) { - return function(recipeName, factoryFunction) { - if (factoryFunction && isFunction(factoryFunction)) factoryFunction.$$moduleName = name; - invokeQueue.push([provider, method, arguments]); - return moduleInstance; - }; - } - }); - }; - }); - -} - -/* global: toDebugString: true */ - -function serializeObject(obj) { - var seen = []; - - return JSON.stringify(obj, function(key, val) { - val = toJsonReplacer(key, val); - if (isObject(val)) { - - if (seen.indexOf(val) >= 0) return '...'; - - seen.push(val); - } - return val; - }); -} - -function toDebugString(obj) { - if (typeof obj === 'function') { - return obj.toString().replace(/ \{[\s\S]*$/, ''); - } else if (isUndefined(obj)) { - return 'undefined'; - } else if (typeof obj !== 'string') { - return serializeObject(obj); - } - return obj; -} - -/* global angularModule: true, - version: true, - - $CompileProvider, - - htmlAnchorDirective, - inputDirective, - inputDirective, - formDirective, - scriptDirective, - selectDirective, - styleDirective, - optionDirective, - ngBindDirective, - ngBindHtmlDirective, - ngBindTemplateDirective, - ngClassDirective, - ngClassEvenDirective, - ngClassOddDirective, - ngCloakDirective, - ngControllerDirective, - ngFormDirective, - ngHideDirective, - ngIfDirective, - ngIncludeDirective, - ngIncludeFillContentDirective, - ngInitDirective, - ngNonBindableDirective, - ngPluralizeDirective, - ngRepeatDirective, - ngShowDirective, - ngStyleDirective, - ngSwitchDirective, - ngSwitchWhenDirective, - ngSwitchDefaultDirective, - ngOptionsDirective, - ngTranscludeDirective, - ngModelDirective, - ngListDirective, - ngChangeDirective, - patternDirective, - patternDirective, - requiredDirective, - requiredDirective, - minlengthDirective, - minlengthDirective, - maxlengthDirective, - maxlengthDirective, - ngValueDirective, - ngModelOptionsDirective, - ngAttributeAliasDirectives, - ngEventDirectives, - - $AnchorScrollProvider, - $AnimateProvider, - $CoreAnimateCssProvider, - $$CoreAnimateJsProvider, - $$CoreAnimateQueueProvider, - $$AnimateRunnerFactoryProvider, - $$AnimateAsyncRunFactoryProvider, - $BrowserProvider, - $CacheFactoryProvider, - $ControllerProvider, - $DateProvider, - $DocumentProvider, - $ExceptionHandlerProvider, - $FilterProvider, - $$ForceReflowProvider, - $InterpolateProvider, - $IntervalProvider, - $$HashMapProvider, - $HttpProvider, - $HttpParamSerializerProvider, - $HttpParamSerializerJQLikeProvider, - $HttpBackendProvider, - $xhrFactoryProvider, - $LocationProvider, - $LogProvider, - $ParseProvider, - $RootScopeProvider, - $QProvider, - $$QProvider, - $$SanitizeUriProvider, - $SceProvider, - $SceDelegateProvider, - $SnifferProvider, - $TemplateCacheProvider, - $TemplateRequestProvider, - $$TestabilityProvider, - $TimeoutProvider, - $$RAFProvider, - $WindowProvider, - $$jqLiteProvider, - $$CookieReaderProvider -*/ - - -/** - * @ngdoc object - * @name angular.version - * @module ng - * @description - * An object that contains information about the current AngularJS version. - * - * This object has the following properties: - * - * - `full` – `{string}` – Full version string, such as "0.9.18". - * - `major` – `{number}` – Major version number, such as "0". - * - `minor` – `{number}` – Minor version number, such as "9". - * - `dot` – `{number}` – Dot version number, such as "18". - * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat". - */ -var version = { - full: '1.5.2', // all of these placeholder strings will be replaced by grunt's - major: 1, // package task - minor: 5, - dot: 2, - codeName: 'differential-recovery' -}; - - -function publishExternalAPI(angular) { - extend(angular, { - 'bootstrap': bootstrap, - 'copy': copy, - 'extend': extend, - 'merge': merge, - 'equals': equals, - 'element': jqLite, - 'forEach': forEach, - 'injector': createInjector, - 'noop': noop, - 'bind': bind, - 'toJson': toJson, - 'fromJson': fromJson, - 'identity': identity, - 'isUndefined': isUndefined, - 'isDefined': isDefined, - 'isString': isString, - 'isFunction': isFunction, - 'isObject': isObject, - 'isNumber': isNumber, - 'isElement': isElement, - 'isArray': isArray, - 'version': version, - 'isDate': isDate, - 'lowercase': lowercase, - 'uppercase': uppercase, - 'callbacks': {counter: 0}, - 'getTestability': getTestability, - '$$minErr': minErr, - '$$csp': csp, - 'reloadWithDebugInfo': reloadWithDebugInfo - }); - - angularModule = setupModuleLoader(window); - - angularModule('ng', ['ngLocale'], ['$provide', - function ngModule($provide) { - // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it. - $provide.provider({ - $$sanitizeUri: $$SanitizeUriProvider - }); - $provide.provider('$compile', $CompileProvider). - directive({ - a: htmlAnchorDirective, - input: inputDirective, - textarea: inputDirective, - form: formDirective, - script: scriptDirective, - select: selectDirective, - style: styleDirective, - option: optionDirective, - ngBind: ngBindDirective, - ngBindHtml: ngBindHtmlDirective, - ngBindTemplate: ngBindTemplateDirective, - ngClass: ngClassDirective, - ngClassEven: ngClassEvenDirective, - ngClassOdd: ngClassOddDirective, - ngCloak: ngCloakDirective, - ngController: ngControllerDirective, - ngForm: ngFormDirective, - ngHide: ngHideDirective, - ngIf: ngIfDirective, - ngInclude: ngIncludeDirective, - ngInit: ngInitDirective, - ngNonBindable: ngNonBindableDirective, - ngPluralize: ngPluralizeDirective, - ngRepeat: ngRepeatDirective, - ngShow: ngShowDirective, - ngStyle: ngStyleDirective, - ngSwitch: ngSwitchDirective, - ngSwitchWhen: ngSwitchWhenDirective, - ngSwitchDefault: ngSwitchDefaultDirective, - ngOptions: ngOptionsDirective, - ngTransclude: ngTranscludeDirective, - ngModel: ngModelDirective, - ngList: ngListDirective, - ngChange: ngChangeDirective, - pattern: patternDirective, - ngPattern: patternDirective, - required: requiredDirective, - ngRequired: requiredDirective, - minlength: minlengthDirective, - ngMinlength: minlengthDirective, - maxlength: maxlengthDirective, - ngMaxlength: maxlengthDirective, - ngValue: ngValueDirective, - ngModelOptions: ngModelOptionsDirective - }). - directive({ - ngInclude: ngIncludeFillContentDirective - }). - directive(ngAttributeAliasDirectives). - directive(ngEventDirectives); - $provide.provider({ - $anchorScroll: $AnchorScrollProvider, - $animate: $AnimateProvider, - $animateCss: $CoreAnimateCssProvider, - $$animateJs: $$CoreAnimateJsProvider, - $$animateQueue: $$CoreAnimateQueueProvider, - $$AnimateRunner: $$AnimateRunnerFactoryProvider, - $$animateAsyncRun: $$AnimateAsyncRunFactoryProvider, - $browser: $BrowserProvider, - $cacheFactory: $CacheFactoryProvider, - $controller: $ControllerProvider, - $document: $DocumentProvider, - $exceptionHandler: $ExceptionHandlerProvider, - $filter: $FilterProvider, - $$forceReflow: $$ForceReflowProvider, - $interpolate: $InterpolateProvider, - $interval: $IntervalProvider, - $http: $HttpProvider, - $httpParamSerializer: $HttpParamSerializerProvider, - $httpParamSerializerJQLike: $HttpParamSerializerJQLikeProvider, - $httpBackend: $HttpBackendProvider, - $xhrFactory: $xhrFactoryProvider, - $location: $LocationProvider, - $log: $LogProvider, - $parse: $ParseProvider, - $rootScope: $RootScopeProvider, - $q: $QProvider, - $$q: $$QProvider, - $sce: $SceProvider, - $sceDelegate: $SceDelegateProvider, - $sniffer: $SnifferProvider, - $templateCache: $TemplateCacheProvider, - $templateRequest: $TemplateRequestProvider, - $$testability: $$TestabilityProvider, - $timeout: $TimeoutProvider, - $window: $WindowProvider, - $$rAF: $$RAFProvider, - $$jqLite: $$jqLiteProvider, - $$HashMap: $$HashMapProvider, - $$cookieReader: $$CookieReaderProvider - }); - } - ]); -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Any commits to this file should be reviewed with security in mind. * - * Changes to this file can potentially create security vulnerabilities. * - * An approval from 2 Core members with history of modifying * - * this file is required. * - * * - * Does the change somehow allow for arbitrary javascript to be executed? * - * Or allows for someone to change the prototype of built-in objects? * - * Or gives undesired access to variables likes document or window? * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* global JQLitePrototype: true, - addEventListenerFn: true, - removeEventListenerFn: true, - BOOLEAN_ATTR: true, - ALIASED_ATTR: true, -*/ - -////////////////////////////////// -//JQLite -////////////////////////////////// - -/** - * @ngdoc function - * @name angular.element - * @module ng - * @kind function - * - * @description - * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element. - * - * If jQuery is available, `angular.element` is an alias for the - * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element` - * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or **jqLite**. - * - * jqLite is a tiny, API-compatible subset of jQuery that allows - * Angular to manipulate the DOM in a cross-browser compatible way. jqLite implements only the most - * commonly needed functionality with the goal of having a very small footprint. - * - * To use `jQuery`, simply ensure it is loaded before the `angular.js` file. You can also use the - * {@link ngJq `ngJq`} directive to specify that jqlite should be used over jQuery, or to use a - * specific version of jQuery if multiple versions exist on the page. - * - *
                                        **Note:** All element references in Angular are always wrapped with jQuery or - * jqLite (such as the element argument in a directive's compile / link function). They are never raw DOM references.
                                        - * - *
                                        **Note:** Keep in mind that this function will not find elements - * by tag name / CSS selector. For lookups by tag name, try instead `angular.element(document).find(...)` - * or `$document.find()`, or use the standard DOM APIs, e.g. `document.querySelectorAll()`.
                                        - * - * ## Angular's jqLite - * jqLite provides only the following jQuery methods: - * - * - [`addClass()`](http://api.jquery.com/addClass/) - * - [`after()`](http://api.jquery.com/after/) - * - [`append()`](http://api.jquery.com/append/) - * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters - * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData - * - [`children()`](http://api.jquery.com/children/) - Does not support selectors - * - [`clone()`](http://api.jquery.com/clone/) - * - [`contents()`](http://api.jquery.com/contents/) - * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyle()`. - * As a setter, does not convert numbers to strings or append 'px', and also does not have automatic property prefixing. - * - [`data()`](http://api.jquery.com/data/) - * - [`detach()`](http://api.jquery.com/detach/) - * - [`empty()`](http://api.jquery.com/empty/) - * - [`eq()`](http://api.jquery.com/eq/) - * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name - * - [`hasClass()`](http://api.jquery.com/hasClass/) - * - [`html()`](http://api.jquery.com/html/) - * - [`next()`](http://api.jquery.com/next/) - Does not support selectors - * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData - * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces, selectors or event object as parameter - * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors - * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors - * - [`prepend()`](http://api.jquery.com/prepend/) - * - [`prop()`](http://api.jquery.com/prop/) - * - [`ready()`](http://api.jquery.com/ready/) - * - [`remove()`](http://api.jquery.com/remove/) - * - [`removeAttr()`](http://api.jquery.com/removeAttr/) - * - [`removeClass()`](http://api.jquery.com/removeClass/) - * - [`removeData()`](http://api.jquery.com/removeData/) - * - [`replaceWith()`](http://api.jquery.com/replaceWith/) - * - [`text()`](http://api.jquery.com/text/) - * - [`toggleClass()`](http://api.jquery.com/toggleClass/) - * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers. - * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces or event object as parameter - * - [`val()`](http://api.jquery.com/val/) - * - [`wrap()`](http://api.jquery.com/wrap/) - * - * ## jQuery/jqLite Extras - * Angular also provides the following additional methods and events to both jQuery and jqLite: - * - * ### Events - * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event - * on all DOM nodes being removed. This can be used to clean up any 3rd party bindings to the DOM - * element before it is removed. - * - * ### Methods - * - `controller(name)` - retrieves the controller of the current element or its parent. By default - * retrieves controller associated with the `ngController` directive. If `name` is provided as - * camelCase directive name, then the controller for this directive will be retrieved (e.g. - * `'ngModel'`). - * - `injector()` - retrieves the injector of the current element or its parent. - * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current - * element or its parent. Requires {@link guide/production#disabling-debug-data Debug Data} to - * be enabled. - * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the - * current element. This getter should be used only on elements that contain a directive which starts a new isolate - * scope. Calling `scope()` on this element always returns the original non-isolate scope. - * Requires {@link guide/production#disabling-debug-data Debug Data} to be enabled. - * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top - * parent element is reached. - * - * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery. - * @returns {Object} jQuery object. - */ - -JQLite.expando = 'ng339'; - -var jqCache = JQLite.cache = {}, - jqId = 1, - addEventListenerFn = function(element, type, fn) { - element.addEventListener(type, fn, false); - }, - removeEventListenerFn = function(element, type, fn) { - element.removeEventListener(type, fn, false); - }; - -/* - * !!! This is an undocumented "private" function !!! - */ -JQLite._data = function(node) { - //jQuery always returns an object on cache miss - return this.cache[node[this.expando]] || {}; -}; - -function jqNextId() { return ++jqId; } - - -var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g; -var MOZ_HACK_REGEXP = /^moz([A-Z])/; -var MOUSE_EVENT_MAP= { mouseleave: "mouseout", mouseenter: "mouseover"}; -var jqLiteMinErr = minErr('jqLite'); - -/** - * Converts snake_case to camelCase. - * Also there is special case for Moz prefix starting with upper case letter. - * @param name Name to normalize - */ -function camelCase(name) { - return name. - replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) { - return offset ? letter.toUpperCase() : letter; - }). - replace(MOZ_HACK_REGEXP, 'Moz$1'); -} - -var SINGLE_TAG_REGEXP = /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/; -var HTML_REGEXP = /<|&#?\w+;/; -var TAG_NAME_REGEXP = /<([\w:-]+)/; -var XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi; - -var wrapMap = { - 'option': [1, ''], - - 'thead': [1, '', '
                                        '], - 'col': [2, '', '
                                        '], - 'tr': [2, '', '
                                        '], - 'td': [3, '', '
                                        '], - '_default': [0, "", ""] -}; - -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - - -function jqLiteIsTextNode(html) { - return !HTML_REGEXP.test(html); -} - -function jqLiteAcceptsData(node) { - // The window object can accept data but has no nodeType - // Otherwise we are only interested in elements (1) and documents (9) - var nodeType = node.nodeType; - return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT; -} - -function jqLiteHasData(node) { - for (var key in jqCache[node.ng339]) { - return true; - } - return false; -} - -function jqLiteCleanData(nodes) { - for (var i = 0, ii = nodes.length; i < ii; i++) { - jqLiteRemoveData(nodes[i]); - } -} - -function jqLiteBuildFragment(html, context) { - var tmp, tag, wrap, - fragment = context.createDocumentFragment(), - nodes = [], i; - - if (jqLiteIsTextNode(html)) { - // Convert non-html into a text node - nodes.push(context.createTextNode(html)); - } else { - // Convert html into DOM nodes - tmp = tmp || fragment.appendChild(context.createElement("div")); - tag = (TAG_NAME_REGEXP.exec(html) || ["", ""])[1].toLowerCase(); - wrap = wrapMap[tag] || wrapMap._default; - tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, "<$1>") + wrap[2]; - - // Descend through wrappers to the right content - i = wrap[0]; - while (i--) { - tmp = tmp.lastChild; - } - - nodes = concat(nodes, tmp.childNodes); - - tmp = fragment.firstChild; - tmp.textContent = ""; - } - - // Remove wrapper from fragment - fragment.textContent = ""; - fragment.innerHTML = ""; // Clear inner HTML - forEach(nodes, function(node) { - fragment.appendChild(node); - }); - - return fragment; -} - -function jqLiteParseHTML(html, context) { - context = context || document; - var parsed; - - if ((parsed = SINGLE_TAG_REGEXP.exec(html))) { - return [context.createElement(parsed[1])]; - } - - if ((parsed = jqLiteBuildFragment(html, context))) { - return parsed.childNodes; - } - - return []; -} - -function jqLiteWrapNode(node, wrapper) { - var parent = node.parentNode; - - if (parent) { - parent.replaceChild(wrapper, node); - } - - wrapper.appendChild(node); -} - - -// IE9-11 has no method "contains" in SVG element and in Node.prototype. Bug #10259. -var jqLiteContains = Node.prototype.contains || function(arg) { - // jshint bitwise: false - return !!(this.compareDocumentPosition(arg) & 16); - // jshint bitwise: true -}; - -///////////////////////////////////////////// -function JQLite(element) { - if (element instanceof JQLite) { - return element; - } - - var argIsString; - - if (isString(element)) { - element = trim(element); - argIsString = true; - } - if (!(this instanceof JQLite)) { - if (argIsString && element.charAt(0) != '<') { - throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element'); - } - return new JQLite(element); - } - - if (argIsString) { - jqLiteAddNodes(this, jqLiteParseHTML(element)); - } else { - jqLiteAddNodes(this, element); - } -} - -function jqLiteClone(element) { - return element.cloneNode(true); -} - -function jqLiteDealoc(element, onlyDescendants) { - if (!onlyDescendants) jqLiteRemoveData(element); - - if (element.querySelectorAll) { - var descendants = element.querySelectorAll('*'); - for (var i = 0, l = descendants.length; i < l; i++) { - jqLiteRemoveData(descendants[i]); - } - } -} - -function jqLiteOff(element, type, fn, unsupported) { - if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument'); - - var expandoStore = jqLiteExpandoStore(element); - var events = expandoStore && expandoStore.events; - var handle = expandoStore && expandoStore.handle; - - if (!handle) return; //no listeners registered - - if (!type) { - for (type in events) { - if (type !== '$destroy') { - removeEventListenerFn(element, type, handle); - } - delete events[type]; - } - } else { - - var removeHandler = function(type) { - var listenerFns = events[type]; - if (isDefined(fn)) { - arrayRemove(listenerFns || [], fn); - } - if (!(isDefined(fn) && listenerFns && listenerFns.length > 0)) { - removeEventListenerFn(element, type, handle); - delete events[type]; - } - }; - - forEach(type.split(' '), function(type) { - removeHandler(type); - if (MOUSE_EVENT_MAP[type]) { - removeHandler(MOUSE_EVENT_MAP[type]); - } - }); - } -} - -function jqLiteRemoveData(element, name) { - var expandoId = element.ng339; - var expandoStore = expandoId && jqCache[expandoId]; - - if (expandoStore) { - if (name) { - delete expandoStore.data[name]; - return; - } - - if (expandoStore.handle) { - if (expandoStore.events.$destroy) { - expandoStore.handle({}, '$destroy'); - } - jqLiteOff(element); - } - delete jqCache[expandoId]; - element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it - } -} - - -function jqLiteExpandoStore(element, createIfNecessary) { - var expandoId = element.ng339, - expandoStore = expandoId && jqCache[expandoId]; - - if (createIfNecessary && !expandoStore) { - element.ng339 = expandoId = jqNextId(); - expandoStore = jqCache[expandoId] = {events: {}, data: {}, handle: undefined}; - } - - return expandoStore; -} - - -function jqLiteData(element, key, value) { - if (jqLiteAcceptsData(element)) { - - var isSimpleSetter = isDefined(value); - var isSimpleGetter = !isSimpleSetter && key && !isObject(key); - var massGetter = !key; - var expandoStore = jqLiteExpandoStore(element, !isSimpleGetter); - var data = expandoStore && expandoStore.data; - - if (isSimpleSetter) { // data('key', value) - data[key] = value; - } else { - if (massGetter) { // data() - return data; - } else { - if (isSimpleGetter) { // data('key') - // don't force creation of expandoStore if it doesn't exist yet - return data && data[key]; - } else { // mass-setter: data({key1: val1, key2: val2}) - extend(data, key); - } - } - } - } -} - -function jqLiteHasClass(element, selector) { - if (!element.getAttribute) return false; - return ((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " "). - indexOf(" " + selector + " ") > -1); -} - -function jqLiteRemoveClass(element, cssClasses) { - if (cssClasses && element.setAttribute) { - forEach(cssClasses.split(' '), function(cssClass) { - element.setAttribute('class', trim( - (" " + (element.getAttribute('class') || '') + " ") - .replace(/[\n\t]/g, " ") - .replace(" " + trim(cssClass) + " ", " ")) - ); - }); - } -} - -function jqLiteAddClass(element, cssClasses) { - if (cssClasses && element.setAttribute) { - var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ') - .replace(/[\n\t]/g, " "); - - forEach(cssClasses.split(' '), function(cssClass) { - cssClass = trim(cssClass); - if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) { - existingClasses += cssClass + ' '; - } - }); - - element.setAttribute('class', trim(existingClasses)); - } -} - - -function jqLiteAddNodes(root, elements) { - // THIS CODE IS VERY HOT. Don't make changes without benchmarking. - - if (elements) { - - // if a Node (the most common case) - if (elements.nodeType) { - root[root.length++] = elements; - } else { - var length = elements.length; - - // if an Array or NodeList and not a Window - if (typeof length === 'number' && elements.window !== elements) { - if (length) { - for (var i = 0; i < length; i++) { - root[root.length++] = elements[i]; - } - } - } else { - root[root.length++] = elements; - } - } - } -} - - -function jqLiteController(element, name) { - return jqLiteInheritedData(element, '$' + (name || 'ngController') + 'Controller'); -} - -function jqLiteInheritedData(element, name, value) { - // if element is the document object work with the html element instead - // this makes $(document).scope() possible - if (element.nodeType == NODE_TYPE_DOCUMENT) { - element = element.documentElement; - } - var names = isArray(name) ? name : [name]; - - while (element) { - for (var i = 0, ii = names.length; i < ii; i++) { - if (isDefined(value = jqLite.data(element, names[i]))) return value; - } - - // If dealing with a document fragment node with a host element, and no parent, use the host - // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM - // to lookup parent controllers. - element = element.parentNode || (element.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && element.host); - } -} - -function jqLiteEmpty(element) { - jqLiteDealoc(element, true); - while (element.firstChild) { - element.removeChild(element.firstChild); - } -} - -function jqLiteRemove(element, keepData) { - if (!keepData) jqLiteDealoc(element); - var parent = element.parentNode; - if (parent) parent.removeChild(element); -} - - -function jqLiteDocumentLoaded(action, win) { - win = win || window; - if (win.document.readyState === 'complete') { - // Force the action to be run async for consistent behavior - // from the action's point of view - // i.e. it will definitely not be in a $apply - win.setTimeout(action); - } else { - // No need to unbind this handler as load is only ever called once - jqLite(win).on('load', action); - } -} - -////////////////////////////////////////// -// Functions which are declared directly. -////////////////////////////////////////// -var JQLitePrototype = JQLite.prototype = { - ready: function(fn) { - var fired = false; - - function trigger() { - if (fired) return; - fired = true; - fn(); - } - - // check if document is already loaded - if (document.readyState === 'complete') { - setTimeout(trigger); - } else { - this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9 - // we can not use jqLite since we are not done loading and jQuery could be loaded later. - // jshint -W064 - JQLite(window).on('load', trigger); // fallback to window.onload for others - // jshint +W064 - } - }, - toString: function() { - var value = []; - forEach(this, function(e) { value.push('' + e);}); - return '[' + value.join(', ') + ']'; - }, - - eq: function(index) { - return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]); - }, - - length: 0, - push: push, - sort: [].sort, - splice: [].splice -}; - -////////////////////////////////////////// -// Functions iterating getter/setters. -// these functions return self on setter and -// value on get. -////////////////////////////////////////// -var BOOLEAN_ATTR = {}; -forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) { - BOOLEAN_ATTR[lowercase(value)] = value; -}); -var BOOLEAN_ELEMENTS = {}; -forEach('input,select,option,textarea,button,form,details'.split(','), function(value) { - BOOLEAN_ELEMENTS[value] = true; -}); -var ALIASED_ATTR = { - 'ngMinlength': 'minlength', - 'ngMaxlength': 'maxlength', - 'ngMin': 'min', - 'ngMax': 'max', - 'ngPattern': 'pattern' -}; - -function getBooleanAttrName(element, name) { - // check dom last since we will most likely fail on name - var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()]; - - // booleanAttr is here twice to minimize DOM access - return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr; -} - -function getAliasedAttrName(name) { - return ALIASED_ATTR[name]; -} - -forEach({ - data: jqLiteData, - removeData: jqLiteRemoveData, - hasData: jqLiteHasData, - cleanData: jqLiteCleanData -}, function(fn, name) { - JQLite[name] = fn; -}); - -forEach({ - data: jqLiteData, - inheritedData: jqLiteInheritedData, - - scope: function(element) { - // Can't use jqLiteData here directly so we stay compatible with jQuery! - return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']); - }, - - isolateScope: function(element) { - // Can't use jqLiteData here directly so we stay compatible with jQuery! - return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate'); - }, - - controller: jqLiteController, - - injector: function(element) { - return jqLiteInheritedData(element, '$injector'); - }, - - removeAttr: function(element, name) { - element.removeAttribute(name); - }, - - hasClass: jqLiteHasClass, - - css: function(element, name, value) { - name = camelCase(name); - - if (isDefined(value)) { - element.style[name] = value; - } else { - return element.style[name]; - } - }, - - attr: function(element, name, value) { - var nodeType = element.nodeType; - if (nodeType === NODE_TYPE_TEXT || nodeType === NODE_TYPE_ATTRIBUTE || nodeType === NODE_TYPE_COMMENT) { - return; - } - var lowercasedName = lowercase(name); - if (BOOLEAN_ATTR[lowercasedName]) { - if (isDefined(value)) { - if (!!value) { - element[name] = true; - element.setAttribute(name, lowercasedName); - } else { - element[name] = false; - element.removeAttribute(lowercasedName); - } - } else { - return (element[name] || - (element.attributes.getNamedItem(name) || noop).specified) - ? lowercasedName - : undefined; - } - } else if (isDefined(value)) { - element.setAttribute(name, value); - } else if (element.getAttribute) { - // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code - // some elements (e.g. Document) don't have get attribute, so return undefined - var ret = element.getAttribute(name, 2); - // normalize non-existing attributes to undefined (as jQuery) - return ret === null ? undefined : ret; - } - }, - - prop: function(element, name, value) { - if (isDefined(value)) { - element[name] = value; - } else { - return element[name]; - } - }, - - text: (function() { - getText.$dv = ''; - return getText; - - function getText(element, value) { - if (isUndefined(value)) { - var nodeType = element.nodeType; - return (nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_TEXT) ? element.textContent : ''; - } - element.textContent = value; - } - })(), - - val: function(element, value) { - if (isUndefined(value)) { - if (element.multiple && nodeName_(element) === 'select') { - var result = []; - forEach(element.options, function(option) { - if (option.selected) { - result.push(option.value || option.text); - } - }); - return result.length === 0 ? null : result; - } - return element.value; - } - element.value = value; - }, - - html: function(element, value) { - if (isUndefined(value)) { - return element.innerHTML; - } - jqLiteDealoc(element, true); - element.innerHTML = value; - }, - - empty: jqLiteEmpty -}, function(fn, name) { - /** - * Properties: writes return selection, reads return first value - */ - JQLite.prototype[name] = function(arg1, arg2) { - var i, key; - var nodeCount = this.length; - - // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it - // in a way that survives minification. - // jqLiteEmpty takes no arguments but is a setter. - if (fn !== jqLiteEmpty && - (isUndefined((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2))) { - if (isObject(arg1)) { - - // we are a write, but the object properties are the key/values - for (i = 0; i < nodeCount; i++) { - if (fn === jqLiteData) { - // data() takes the whole object in jQuery - fn(this[i], arg1); - } else { - for (key in arg1) { - fn(this[i], key, arg1[key]); - } - } - } - // return self for chaining - return this; - } else { - // we are a read, so read the first child. - // TODO: do we still need this? - var value = fn.$dv; - // Only if we have $dv do we iterate over all, otherwise it is just the first element. - var jj = (isUndefined(value)) ? Math.min(nodeCount, 1) : nodeCount; - for (var j = 0; j < jj; j++) { - var nodeValue = fn(this[j], arg1, arg2); - value = value ? value + nodeValue : nodeValue; - } - return value; - } - } else { - // we are a write, so apply to all children - for (i = 0; i < nodeCount; i++) { - fn(this[i], arg1, arg2); - } - // return self for chaining - return this; - } - }; -}); - -function createEventHandler(element, events) { - var eventHandler = function(event, type) { - // jQuery specific api - event.isDefaultPrevented = function() { - return event.defaultPrevented; - }; - - var eventFns = events[type || event.type]; - var eventFnsLength = eventFns ? eventFns.length : 0; - - if (!eventFnsLength) return; - - if (isUndefined(event.immediatePropagationStopped)) { - var originalStopImmediatePropagation = event.stopImmediatePropagation; - event.stopImmediatePropagation = function() { - event.immediatePropagationStopped = true; - - if (event.stopPropagation) { - event.stopPropagation(); - } - - if (originalStopImmediatePropagation) { - originalStopImmediatePropagation.call(event); - } - }; - } - - event.isImmediatePropagationStopped = function() { - return event.immediatePropagationStopped === true; - }; - - // Some events have special handlers that wrap the real handler - var handlerWrapper = eventFns.specialHandlerWrapper || defaultHandlerWrapper; - - // Copy event handlers in case event handlers array is modified during execution. - if ((eventFnsLength > 1)) { - eventFns = shallowCopy(eventFns); - } - - for (var i = 0; i < eventFnsLength; i++) { - if (!event.isImmediatePropagationStopped()) { - handlerWrapper(element, event, eventFns[i]); - } - } - }; - - // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all - // events on `element` - eventHandler.elem = element; - return eventHandler; -} - -function defaultHandlerWrapper(element, event, handler) { - handler.call(element, event); -} - -function specialMouseHandlerWrapper(target, event, handler) { - // Refer to jQuery's implementation of mouseenter & mouseleave - // Read about mouseenter and mouseleave: - // http://www.quirksmode.org/js/events_mouse.html#link8 - var related = event.relatedTarget; - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if (!related || (related !== target && !jqLiteContains.call(target, related))) { - handler.call(target, event); - } -} - -////////////////////////////////////////// -// Functions iterating traversal. -// These functions chain results into a single -// selector. -////////////////////////////////////////// -forEach({ - removeData: jqLiteRemoveData, - - on: function jqLiteOn(element, type, fn, unsupported) { - if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters'); - - // Do not add event handlers to non-elements because they will not be cleaned up. - if (!jqLiteAcceptsData(element)) { - return; - } - - var expandoStore = jqLiteExpandoStore(element, true); - var events = expandoStore.events; - var handle = expandoStore.handle; - - if (!handle) { - handle = expandoStore.handle = createEventHandler(element, events); - } - - // http://jsperf.com/string-indexof-vs-split - var types = type.indexOf(' ') >= 0 ? type.split(' ') : [type]; - var i = types.length; - - var addHandler = function(type, specialHandlerWrapper, noEventListener) { - var eventFns = events[type]; - - if (!eventFns) { - eventFns = events[type] = []; - eventFns.specialHandlerWrapper = specialHandlerWrapper; - if (type !== '$destroy' && !noEventListener) { - addEventListenerFn(element, type, handle); - } - } - - eventFns.push(fn); - }; - - while (i--) { - type = types[i]; - if (MOUSE_EVENT_MAP[type]) { - addHandler(MOUSE_EVENT_MAP[type], specialMouseHandlerWrapper); - addHandler(type, undefined, true); - } else { - addHandler(type); - } - } - }, - - off: jqLiteOff, - - one: function(element, type, fn) { - element = jqLite(element); - - //add the listener twice so that when it is called - //you can remove the original function and still be - //able to call element.off(ev, fn) normally - element.on(type, function onFn() { - element.off(type, fn); - element.off(type, onFn); - }); - element.on(type, fn); - }, - - replaceWith: function(element, replaceNode) { - var index, parent = element.parentNode; - jqLiteDealoc(element); - forEach(new JQLite(replaceNode), function(node) { - if (index) { - parent.insertBefore(node, index.nextSibling); - } else { - parent.replaceChild(node, element); - } - index = node; - }); - }, - - children: function(element) { - var children = []; - forEach(element.childNodes, function(element) { - if (element.nodeType === NODE_TYPE_ELEMENT) { - children.push(element); - } - }); - return children; - }, - - contents: function(element) { - return element.contentDocument || element.childNodes || []; - }, - - append: function(element, node) { - var nodeType = element.nodeType; - if (nodeType !== NODE_TYPE_ELEMENT && nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT) return; - - node = new JQLite(node); - - for (var i = 0, ii = node.length; i < ii; i++) { - var child = node[i]; - element.appendChild(child); - } - }, - - prepend: function(element, node) { - if (element.nodeType === NODE_TYPE_ELEMENT) { - var index = element.firstChild; - forEach(new JQLite(node), function(child) { - element.insertBefore(child, index); - }); - } - }, - - wrap: function(element, wrapNode) { - jqLiteWrapNode(element, jqLite(wrapNode).eq(0).clone()[0]); - }, - - remove: jqLiteRemove, - - detach: function(element) { - jqLiteRemove(element, true); - }, - - after: function(element, newElement) { - var index = element, parent = element.parentNode; - newElement = new JQLite(newElement); - - for (var i = 0, ii = newElement.length; i < ii; i++) { - var node = newElement[i]; - parent.insertBefore(node, index.nextSibling); - index = node; - } - }, - - addClass: jqLiteAddClass, - removeClass: jqLiteRemoveClass, - - toggleClass: function(element, selector, condition) { - if (selector) { - forEach(selector.split(' '), function(className) { - var classCondition = condition; - if (isUndefined(classCondition)) { - classCondition = !jqLiteHasClass(element, className); - } - (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className); - }); - } - }, - - parent: function(element) { - var parent = element.parentNode; - return parent && parent.nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT ? parent : null; - }, - - next: function(element) { - return element.nextElementSibling; - }, - - find: function(element, selector) { - if (element.getElementsByTagName) { - return element.getElementsByTagName(selector); - } else { - return []; - } - }, - - clone: jqLiteClone, - - triggerHandler: function(element, event, extraParameters) { - - var dummyEvent, eventFnsCopy, handlerArgs; - var eventName = event.type || event; - var expandoStore = jqLiteExpandoStore(element); - var events = expandoStore && expandoStore.events; - var eventFns = events && events[eventName]; - - if (eventFns) { - // Create a dummy event to pass to the handlers - dummyEvent = { - preventDefault: function() { this.defaultPrevented = true; }, - isDefaultPrevented: function() { return this.defaultPrevented === true; }, - stopImmediatePropagation: function() { this.immediatePropagationStopped = true; }, - isImmediatePropagationStopped: function() { return this.immediatePropagationStopped === true; }, - stopPropagation: noop, - type: eventName, - target: element - }; - - // If a custom event was provided then extend our dummy event with it - if (event.type) { - dummyEvent = extend(dummyEvent, event); - } - - // Copy event handlers in case event handlers array is modified during execution. - eventFnsCopy = shallowCopy(eventFns); - handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent]; - - forEach(eventFnsCopy, function(fn) { - if (!dummyEvent.isImmediatePropagationStopped()) { - fn.apply(element, handlerArgs); - } - }); - } - } -}, function(fn, name) { - /** - * chaining functions - */ - JQLite.prototype[name] = function(arg1, arg2, arg3) { - var value; - - for (var i = 0, ii = this.length; i < ii; i++) { - if (isUndefined(value)) { - value = fn(this[i], arg1, arg2, arg3); - if (isDefined(value)) { - // any function which returns a value needs to be wrapped - value = jqLite(value); - } - } else { - jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3)); - } - } - return isDefined(value) ? value : this; - }; - - // bind legacy bind/unbind to on/off - JQLite.prototype.bind = JQLite.prototype.on; - JQLite.prototype.unbind = JQLite.prototype.off; -}); - - -// Provider for private $$jqLite service -function $$jqLiteProvider() { - this.$get = function $$jqLite() { - return extend(JQLite, { - hasClass: function(node, classes) { - if (node.attr) node = node[0]; - return jqLiteHasClass(node, classes); - }, - addClass: function(node, classes) { - if (node.attr) node = node[0]; - return jqLiteAddClass(node, classes); - }, - removeClass: function(node, classes) { - if (node.attr) node = node[0]; - return jqLiteRemoveClass(node, classes); - } - }); - }; -} - -/** - * Computes a hash of an 'obj'. - * Hash of a: - * string is string - * number is number as string - * object is either result of calling $$hashKey function on the object or uniquely generated id, - * that is also assigned to the $$hashKey property of the object. - * - * @param obj - * @returns {string} hash string such that the same input will have the same hash string. - * The resulting string key is in 'type:hashKey' format. - */ -function hashKey(obj, nextUidFn) { - var key = obj && obj.$$hashKey; - - if (key) { - if (typeof key === 'function') { - key = obj.$$hashKey(); - } - return key; - } - - var objType = typeof obj; - if (objType == 'function' || (objType == 'object' && obj !== null)) { - key = obj.$$hashKey = objType + ':' + (nextUidFn || nextUid)(); - } else { - key = objType + ':' + obj; - } - - return key; -} - -/** - * HashMap which can use objects as keys - */ -function HashMap(array, isolatedUid) { - if (isolatedUid) { - var uid = 0; - this.nextUid = function() { - return ++uid; - }; - } - forEach(array, this.put, this); -} -HashMap.prototype = { - /** - * Store key value pair - * @param key key to store can be any type - * @param value value to store can be any type - */ - put: function(key, value) { - this[hashKey(key, this.nextUid)] = value; - }, - - /** - * @param key - * @returns {Object} the value for the key - */ - get: function(key) { - return this[hashKey(key, this.nextUid)]; - }, - - /** - * Remove the key/value pair - * @param key - */ - remove: function(key) { - var value = this[key = hashKey(key, this.nextUid)]; - delete this[key]; - return value; - } -}; - -var $$HashMapProvider = [function() { - this.$get = [function() { - return HashMap; - }]; -}]; - -/** - * @ngdoc function - * @module ng - * @name angular.injector - * @kind function - * - * @description - * Creates an injector object that can be used for retrieving services as well as for - * dependency injection (see {@link guide/di dependency injection}). - * - * @param {Array.} modules A list of module functions or their aliases. See - * {@link angular.module}. The `ng` module must be explicitly added. - * @param {boolean=} [strictDi=false] Whether the injector should be in strict mode, which - * disallows argument name annotation inference. - * @returns {injector} Injector object. See {@link auto.$injector $injector}. - * - * @example - * Typical usage - * ```js - * // create an injector - * var $injector = angular.injector(['ng']); - * - * // use the injector to kick off your application - * // use the type inference to auto inject arguments, or use implicit injection - * $injector.invoke(function($rootScope, $compile, $document) { - * $compile($document)($rootScope); - * $rootScope.$digest(); - * }); - * ``` - * - * Sometimes you want to get access to the injector of a currently running Angular app - * from outside Angular. Perhaps, you want to inject and compile some markup after the - * application has been bootstrapped. You can do this using the extra `injector()` added - * to JQuery/jqLite elements. See {@link angular.element}. - * - * *This is fairly rare but could be the case if a third party library is injecting the - * markup.* - * - * In the following example a new block of HTML containing a `ng-controller` - * directive is added to the end of the document body by JQuery. We then compile and link - * it into the current AngularJS scope. - * - * ```js - * var $div = $('
                                        {{content.label}}
                                        '); - * $(document.body).append($div); - * - * angular.element(document).injector().invoke(function($compile) { - * var scope = angular.element($div).scope(); - * $compile($div)(scope); - * }); - * ``` - */ - - -/** - * @ngdoc module - * @name auto - * @description - * - * Implicit module which gets automatically added to each {@link auto.$injector $injector}. - */ - -var ARROW_ARG = /^([^\(]+?)=>/; -var FN_ARGS = /^[^\(]*\(\s*([^\)]*)\)/m; -var FN_ARG_SPLIT = /,/; -var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/; -var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; -var $injectorMinErr = minErr('$injector'); - -function extractArgs(fn) { - var fnText = fn.toString().replace(STRIP_COMMENTS, ''), - args = fnText.match(ARROW_ARG) || fnText.match(FN_ARGS); - return args; -} - -function anonFn(fn) { - // For anonymous functions, showing at the very least the function signature can help in - // debugging. - var args = extractArgs(fn); - if (args) { - return 'function(' + (args[1] || '').replace(/[\s\r\n]+/, ' ') + ')'; - } - return 'fn'; -} - -function annotate(fn, strictDi, name) { - var $inject, - argDecl, - last; - - if (typeof fn === 'function') { - if (!($inject = fn.$inject)) { - $inject = []; - if (fn.length) { - if (strictDi) { - if (!isString(name) || !name) { - name = fn.name || anonFn(fn); - } - throw $injectorMinErr('strictdi', - '{0} is not using explicit annotation and cannot be invoked in strict mode', name); - } - argDecl = extractArgs(fn); - forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) { - arg.replace(FN_ARG, function(all, underscore, name) { - $inject.push(name); - }); - }); - } - fn.$inject = $inject; - } - } else if (isArray(fn)) { - last = fn.length - 1; - assertArgFn(fn[last], 'fn'); - $inject = fn.slice(0, last); - } else { - assertArgFn(fn, 'fn', true); - } - return $inject; -} - -/////////////////////////////////////// - -/** - * @ngdoc service - * @name $injector - * - * @description - * - * `$injector` is used to retrieve object instances as defined by - * {@link auto.$provide provider}, instantiate types, invoke methods, - * and load modules. - * - * The following always holds true: - * - * ```js - * var $injector = angular.injector(); - * expect($injector.get('$injector')).toBe($injector); - * expect($injector.invoke(function($injector) { - * return $injector; - * })).toBe($injector); - * ``` - * - * # Injection Function Annotation - * - * JavaScript does not have annotations, and annotations are needed for dependency injection. The - * following are all valid ways of annotating function with injection arguments and are equivalent. - * - * ```js - * // inferred (only works if code not minified/obfuscated) - * $injector.invoke(function(serviceA){}); - * - * // annotated - * function explicit(serviceA) {}; - * explicit.$inject = ['serviceA']; - * $injector.invoke(explicit); - * - * // inline - * $injector.invoke(['serviceA', function(serviceA){}]); - * ``` - * - * ## Inference - * - * In JavaScript calling `toString()` on a function returns the function definition. The definition - * can then be parsed and the function arguments can be extracted. This method of discovering - * annotations is disallowed when the injector is in strict mode. - * *NOTE:* This does not work with minification, and obfuscation tools since these tools change the - * argument names. - * - * ## `$inject` Annotation - * By adding an `$inject` property onto a function the injection parameters can be specified. - * - * ## Inline - * As an array of injection names, where the last item in the array is the function to call. - */ - -/** - * @ngdoc method - * @name $injector#get - * - * @description - * Return an instance of the service. - * - * @param {string} name The name of the instance to retrieve. - * @param {string=} caller An optional string to provide the origin of the function call for error messages. - * @return {*} The instance. - */ - -/** - * @ngdoc method - * @name $injector#invoke - * - * @description - * Invoke the method and supply the method arguments from the `$injector`. - * - * @param {Function|Array.} fn The injectable function to invoke. Function parameters are - * injected according to the {@link guide/di $inject Annotation} rules. - * @param {Object=} self The `this` for the invoked method. - * @param {Object=} locals Optional object. If preset then any argument names are read from this - * object first, before the `$injector` is consulted. - * @returns {*} the value returned by the invoked `fn` function. - */ - -/** - * @ngdoc method - * @name $injector#has - * - * @description - * Allows the user to query if the particular service exists. - * - * @param {string} name Name of the service to query. - * @returns {boolean} `true` if injector has given service. - */ - -/** - * @ngdoc method - * @name $injector#instantiate - * @description - * Create a new instance of JS type. The method takes a constructor function, invokes the new - * operator, and supplies all of the arguments to the constructor function as specified by the - * constructor annotation. - * - * @param {Function} Type Annotated constructor function. - * @param {Object=} locals Optional object. If preset then any argument names are read from this - * object first, before the `$injector` is consulted. - * @returns {Object} new instance of `Type`. - */ - -/** - * @ngdoc method - * @name $injector#annotate - * - * @description - * Returns an array of service names which the function is requesting for injection. This API is - * used by the injector to determine which services need to be injected into the function when the - * function is invoked. There are three ways in which the function can be annotated with the needed - * dependencies. - * - * # Argument names - * - * The simplest form is to extract the dependencies from the arguments of the function. This is done - * by converting the function into a string using `toString()` method and extracting the argument - * names. - * ```js - * // Given - * function MyController($scope, $route) { - * // ... - * } - * - * // Then - * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); - * ``` - * - * You can disallow this method by using strict injection mode. - * - * This method does not work with code minification / obfuscation. For this reason the following - * annotation strategies are supported. - * - * # The `$inject` property - * - * If a function has an `$inject` property and its value is an array of strings, then the strings - * represent names of services to be injected into the function. - * ```js - * // Given - * var MyController = function(obfuscatedScope, obfuscatedRoute) { - * // ... - * } - * // Define function dependencies - * MyController['$inject'] = ['$scope', '$route']; - * - * // Then - * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); - * ``` - * - * # The array notation - * - * It is often desirable to inline Injected functions and that's when setting the `$inject` property - * is very inconvenient. In these situations using the array notation to specify the dependencies in - * a way that survives minification is a better choice: - * - * ```js - * // We wish to write this (not minification / obfuscation safe) - * injector.invoke(function($compile, $rootScope) { - * // ... - * }); - * - * // We are forced to write break inlining - * var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) { - * // ... - * }; - * tmpFn.$inject = ['$compile', '$rootScope']; - * injector.invoke(tmpFn); - * - * // To better support inline function the inline annotation is supported - * injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) { - * // ... - * }]); - * - * // Therefore - * expect(injector.annotate( - * ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}]) - * ).toEqual(['$compile', '$rootScope']); - * ``` - * - * @param {Function|Array.} fn Function for which dependent service names need to - * be retrieved as described above. - * - * @param {boolean=} [strictDi=false] Disallow argument name annotation inference. - * - * @returns {Array.} The names of the services which the function requires. - */ - - - - -/** - * @ngdoc service - * @name $provide - * - * @description - * - * The {@link auto.$provide $provide} service has a number of methods for registering components - * with the {@link auto.$injector $injector}. Many of these functions are also exposed on - * {@link angular.Module}. - * - * An Angular **service** is a singleton object created by a **service factory**. These **service - * factories** are functions which, in turn, are created by a **service provider**. - * The **service providers** are constructor functions. When instantiated they must contain a - * property called `$get`, which holds the **service factory** function. - * - * When you request a service, the {@link auto.$injector $injector} is responsible for finding the - * correct **service provider**, instantiating it and then calling its `$get` **service factory** - * function to get the instance of the **service**. - * - * Often services have no configuration options and there is no need to add methods to the service - * provider. The provider will be no more than a constructor function with a `$get` property. For - * these cases the {@link auto.$provide $provide} service has additional helper methods to register - * services without specifying a provider. - * - * * {@link auto.$provide#provider provider(provider)} - registers a **service provider** with the - * {@link auto.$injector $injector} - * * {@link auto.$provide#constant constant(obj)} - registers a value/object that can be accessed by - * providers and services. - * * {@link auto.$provide#value value(obj)} - registers a value/object that can only be accessed by - * services, not providers. - * * {@link auto.$provide#factory factory(fn)} - registers a service **factory function**, `fn`, - * that will be wrapped in a **service provider** object, whose `$get` property will contain the - * given factory function. - * * {@link auto.$provide#service service(class)} - registers a **constructor function**, `class` - * that will be wrapped in a **service provider** object, whose `$get` property will instantiate - * a new object using the given constructor function. - * - * See the individual methods for more information and examples. - */ - -/** - * @ngdoc method - * @name $provide#provider - * @description - * - * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions - * are constructor functions, whose instances are responsible for "providing" a factory for a - * service. - * - * Service provider names start with the name of the service they provide followed by `Provider`. - * For example, the {@link ng.$log $log} service has a provider called - * {@link ng.$logProvider $logProvider}. - * - * Service provider objects can have additional methods which allow configuration of the provider - * and its service. Importantly, you can configure what kind of service is created by the `$get` - * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a - * method {@link ng.$logProvider#debugEnabled debugEnabled} - * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the - * console or not. - * - * @param {string} name The name of the instance. NOTE: the provider will be available under `name + - 'Provider'` key. - * @param {(Object|function())} provider If the provider is: - * - * - `Object`: then it should have a `$get` method. The `$get` method will be invoked using - * {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created. - * - `Constructor`: a new instance of the provider will be created using - * {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`. - * - * @returns {Object} registered provider instance - - * @example - * - * The following example shows how to create a simple event tracking service and register it using - * {@link auto.$provide#provider $provide.provider()}. - * - * ```js - * // Define the eventTracker provider - * function EventTrackerProvider() { - * var trackingUrl = '/track'; - * - * // A provider method for configuring where the tracked events should been saved - * this.setTrackingUrl = function(url) { - * trackingUrl = url; - * }; - * - * // The service factory function - * this.$get = ['$http', function($http) { - * var trackedEvents = {}; - * return { - * // Call this to track an event - * event: function(event) { - * var count = trackedEvents[event] || 0; - * count += 1; - * trackedEvents[event] = count; - * return count; - * }, - * // Call this to save the tracked events to the trackingUrl - * save: function() { - * $http.post(trackingUrl, trackedEvents); - * } - * }; - * }]; - * } - * - * describe('eventTracker', function() { - * var postSpy; - * - * beforeEach(module(function($provide) { - * // Register the eventTracker provider - * $provide.provider('eventTracker', EventTrackerProvider); - * })); - * - * beforeEach(module(function(eventTrackerProvider) { - * // Configure eventTracker provider - * eventTrackerProvider.setTrackingUrl('/custom-track'); - * })); - * - * it('tracks events', inject(function(eventTracker) { - * expect(eventTracker.event('login')).toEqual(1); - * expect(eventTracker.event('login')).toEqual(2); - * })); - * - * it('saves to the tracking url', inject(function(eventTracker, $http) { - * postSpy = spyOn($http, 'post'); - * eventTracker.event('login'); - * eventTracker.save(); - * expect(postSpy).toHaveBeenCalled(); - * expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track'); - * expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track'); - * expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 }); - * })); - * }); - * ``` - */ - -/** - * @ngdoc method - * @name $provide#factory - * @description - * - * Register a **service factory**, which will be called to return the service instance. - * This is short for registering a service where its provider consists of only a `$get` property, - * which is the given service factory function. - * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to - * configure your service in a provider. - * - * @param {string} name The name of the instance. - * @param {Function|Array.} $getFn The injectable $getFn for the instance creation. - * Internally this is a short hand for `$provide.provider(name, {$get: $getFn})`. - * @returns {Object} registered provider instance - * - * @example - * Here is an example of registering a service - * ```js - * $provide.factory('ping', ['$http', function($http) { - * return function ping() { - * return $http.send('/ping'); - * }; - * }]); - * ``` - * You would then inject and use this service like this: - * ```js - * someModule.controller('Ctrl', ['ping', function(ping) { - * ping(); - * }]); - * ``` - */ - - -/** - * @ngdoc method - * @name $provide#service - * @description - * - * Register a **service constructor**, which will be invoked with `new` to create the service - * instance. - * This is short for registering a service where its provider's `$get` property is a factory - * function that returns an instance instantiated by the injector from the service constructor - * function. - * - * Internally it looks a bit like this: - * - * ``` - * { - * $get: function() { - * return $injector.instantiate(constructor); - * } - * } - * ``` - * - * - * You should use {@link auto.$provide#service $provide.service(class)} if you define your service - * as a type/class. - * - * @param {string} name The name of the instance. - * @param {Function|Array.} constructor An injectable class (constructor function) - * that will be instantiated. - * @returns {Object} registered provider instance - * - * @example - * Here is an example of registering a service using - * {@link auto.$provide#service $provide.service(class)}. - * ```js - * var Ping = function($http) { - * this.$http = $http; - * }; - * - * Ping.$inject = ['$http']; - * - * Ping.prototype.send = function() { - * return this.$http.get('/ping'); - * }; - * $provide.service('ping', Ping); - * ``` - * You would then inject and use this service like this: - * ```js - * someModule.controller('Ctrl', ['ping', function(ping) { - * ping.send(); - * }]); - * ``` - */ - - -/** - * @ngdoc method - * @name $provide#value - * @description - * - * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a - * number, an array, an object or a function. This is short for registering a service where its - * provider's `$get` property is a factory function that takes no arguments and returns the **value - * service**. That also means it is not possible to inject other services into a value service. - * - * Value services are similar to constant services, except that they cannot be injected into a - * module configuration function (see {@link angular.Module#config}) but they can be overridden by - * an Angular {@link auto.$provide#decorator decorator}. - * - * @param {string} name The name of the instance. - * @param {*} value The value. - * @returns {Object} registered provider instance - * - * @example - * Here are some examples of creating value services. - * ```js - * $provide.value('ADMIN_USER', 'admin'); - * - * $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 }); - * - * $provide.value('halfOf', function(value) { - * return value / 2; - * }); - * ``` - */ - - -/** - * @ngdoc method - * @name $provide#constant - * @description - * - * Register a **constant service** with the {@link auto.$injector $injector}, such as a string, - * a number, an array, an object or a function. Like the {@link auto.$provide#value value}, it is not - * possible to inject other services into a constant. - * - * But unlike {@link auto.$provide#value value}, a constant can be - * injected into a module configuration function (see {@link angular.Module#config}) and it cannot - * be overridden by an Angular {@link auto.$provide#decorator decorator}. - * - * @param {string} name The name of the constant. - * @param {*} value The constant value. - * @returns {Object} registered instance - * - * @example - * Here a some examples of creating constants: - * ```js - * $provide.constant('SHARD_HEIGHT', 306); - * - * $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']); - * - * $provide.constant('double', function(value) { - * return value * 2; - * }); - * ``` - */ - - -/** - * @ngdoc method - * @name $provide#decorator - * @description - * - * Register a **service decorator** with the {@link auto.$injector $injector}. A service decorator - * intercepts the creation of a service, allowing it to override or modify the behavior of the - * service. The object returned by the decorator may be the original service, or a new service - * object which replaces or wraps and delegates to the original service. - * - * @param {string} name The name of the service to decorate. - * @param {Function|Array.} decorator This function will be invoked when the service needs to be - * instantiated and should return the decorated service instance. The function is called using - * the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable. - * Local injection arguments: - * - * * `$delegate` - The original service instance, which can be monkey patched, configured, - * decorated or delegated to. - * - * @example - * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting - * calls to {@link ng.$log#error $log.warn()}. - * ```js - * $provide.decorator('$log', ['$delegate', function($delegate) { - * $delegate.warn = $delegate.error; - * return $delegate; - * }]); - * ``` - */ - - -function createInjector(modulesToLoad, strictDi) { - strictDi = (strictDi === true); - var INSTANTIATING = {}, - providerSuffix = 'Provider', - path = [], - loadedModules = new HashMap([], true), - providerCache = { - $provide: { - provider: supportObject(provider), - factory: supportObject(factory), - service: supportObject(service), - value: supportObject(value), - constant: supportObject(constant), - decorator: decorator - } - }, - providerInjector = (providerCache.$injector = - createInternalInjector(providerCache, function(serviceName, caller) { - if (angular.isString(caller)) { - path.push(caller); - } - throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- ')); - })), - instanceCache = {}, - protoInstanceInjector = - createInternalInjector(instanceCache, function(serviceName, caller) { - var provider = providerInjector.get(serviceName + providerSuffix, caller); - return instanceInjector.invoke( - provider.$get, provider, undefined, serviceName); - }), - instanceInjector = protoInstanceInjector; - - providerCache['$injector' + providerSuffix] = { $get: valueFn(protoInstanceInjector) }; - var runBlocks = loadModules(modulesToLoad); - instanceInjector = protoInstanceInjector.get('$injector'); - instanceInjector.strictDi = strictDi; - forEach(runBlocks, function(fn) { if (fn) instanceInjector.invoke(fn); }); - - return instanceInjector; - - //////////////////////////////////// - // $provider - //////////////////////////////////// - - function supportObject(delegate) { - return function(key, value) { - if (isObject(key)) { - forEach(key, reverseParams(delegate)); - } else { - return delegate(key, value); - } - }; - } - - function provider(name, provider_) { - assertNotHasOwnProperty(name, 'service'); - if (isFunction(provider_) || isArray(provider_)) { - provider_ = providerInjector.instantiate(provider_); - } - if (!provider_.$get) { - throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name); - } - return providerCache[name + providerSuffix] = provider_; - } - - function enforceReturnValue(name, factory) { - return function enforcedReturnValue() { - var result = instanceInjector.invoke(factory, this); - if (isUndefined(result)) { - throw $injectorMinErr('undef', "Provider '{0}' must return a value from $get factory method.", name); - } - return result; - }; - } - - function factory(name, factoryFn, enforce) { - return provider(name, { - $get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn - }); - } - - function service(name, constructor) { - return factory(name, ['$injector', function($injector) { - return $injector.instantiate(constructor); - }]); - } - - function value(name, val) { return factory(name, valueFn(val), false); } - - function constant(name, value) { - assertNotHasOwnProperty(name, 'constant'); - providerCache[name] = value; - instanceCache[name] = value; - } - - function decorator(serviceName, decorFn) { - var origProvider = providerInjector.get(serviceName + providerSuffix), - orig$get = origProvider.$get; - - origProvider.$get = function() { - var origInstance = instanceInjector.invoke(orig$get, origProvider); - return instanceInjector.invoke(decorFn, null, {$delegate: origInstance}); - }; - } - - //////////////////////////////////// - // Module Loading - //////////////////////////////////// - function loadModules(modulesToLoad) { - assertArg(isUndefined(modulesToLoad) || isArray(modulesToLoad), 'modulesToLoad', 'not an array'); - var runBlocks = [], moduleFn; - forEach(modulesToLoad, function(module) { - if (loadedModules.get(module)) return; - loadedModules.put(module, true); - - function runInvokeQueue(queue) { - var i, ii; - for (i = 0, ii = queue.length; i < ii; i++) { - var invokeArgs = queue[i], - provider = providerInjector.get(invokeArgs[0]); - - provider[invokeArgs[1]].apply(provider, invokeArgs[2]); - } - } - - try { - if (isString(module)) { - moduleFn = angularModule(module); - runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks); - runInvokeQueue(moduleFn._invokeQueue); - runInvokeQueue(moduleFn._configBlocks); - } else if (isFunction(module)) { - runBlocks.push(providerInjector.invoke(module)); - } else if (isArray(module)) { - runBlocks.push(providerInjector.invoke(module)); - } else { - assertArgFn(module, 'module'); - } - } catch (e) { - if (isArray(module)) { - module = module[module.length - 1]; - } - if (e.message && e.stack && e.stack.indexOf(e.message) == -1) { - // Safari & FF's stack traces don't contain error.message content - // unlike those of Chrome and IE - // So if stack doesn't contain message, we create a new string that contains both. - // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here. - /* jshint -W022 */ - e = e.message + '\n' + e.stack; - } - throw $injectorMinErr('modulerr', "Failed to instantiate module {0} due to:\n{1}", - module, e.stack || e.message || e); - } - }); - return runBlocks; - } - - //////////////////////////////////// - // internal Injector - //////////////////////////////////// - - function createInternalInjector(cache, factory) { - - function getService(serviceName, caller) { - if (cache.hasOwnProperty(serviceName)) { - if (cache[serviceName] === INSTANTIATING) { - throw $injectorMinErr('cdep', 'Circular dependency found: {0}', - serviceName + ' <- ' + path.join(' <- ')); - } - return cache[serviceName]; - } else { - try { - path.unshift(serviceName); - cache[serviceName] = INSTANTIATING; - return cache[serviceName] = factory(serviceName, caller); - } catch (err) { - if (cache[serviceName] === INSTANTIATING) { - delete cache[serviceName]; - } - throw err; - } finally { - path.shift(); - } - } - } - - - function injectionArgs(fn, locals, serviceName) { - var args = [], - $inject = createInjector.$$annotate(fn, strictDi, serviceName); - - for (var i = 0, length = $inject.length; i < length; i++) { - var key = $inject[i]; - if (typeof key !== 'string') { - throw $injectorMinErr('itkn', - 'Incorrect injection token! Expected service name as string, got {0}', key); - } - args.push(locals && locals.hasOwnProperty(key) ? locals[key] : - getService(key, serviceName)); - } - return args; - } - - function isClass(func) { - // IE 9-11 do not support classes and IE9 leaks with the code below. - if (msie <= 11) { - return false; - } - // Workaround for MS Edge. - // Check https://connect.microsoft.com/IE/Feedback/Details/2211653 - return typeof func === 'function' - && /^(?:class\s|constructor\()/.test(Function.prototype.toString.call(func)); - } - - function invoke(fn, self, locals, serviceName) { - if (typeof locals === 'string') { - serviceName = locals; - locals = null; - } - - var args = injectionArgs(fn, locals, serviceName); - if (isArray(fn)) { - fn = fn[fn.length - 1]; - } - - if (!isClass(fn)) { - // http://jsperf.com/angularjs-invoke-apply-vs-switch - // #5388 - return fn.apply(self, args); - } else { - args.unshift(null); - return new (Function.prototype.bind.apply(fn, args))(); - } - } - - - function instantiate(Type, locals, serviceName) { - // Check if Type is annotated and use just the given function at n-1 as parameter - // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]); - var ctor = (isArray(Type) ? Type[Type.length - 1] : Type); - var args = injectionArgs(Type, locals, serviceName); - // Empty object at position 0 is ignored for invocation with `new`, but required. - args.unshift(null); - return new (Function.prototype.bind.apply(ctor, args))(); - } - - - return { - invoke: invoke, - instantiate: instantiate, - get: getService, - annotate: createInjector.$$annotate, - has: function(name) { - return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name); - } - }; - } -} - -createInjector.$$annotate = annotate; - -/** - * @ngdoc provider - * @name $anchorScrollProvider - * - * @description - * Use `$anchorScrollProvider` to disable automatic scrolling whenever - * {@link ng.$location#hash $location.hash()} changes. - */ -function $AnchorScrollProvider() { - - var autoScrollingEnabled = true; - - /** - * @ngdoc method - * @name $anchorScrollProvider#disableAutoScrolling - * - * @description - * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically detect changes to - * {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.
                                        - * Use this method to disable automatic scrolling. - * - * If automatic scrolling is disabled, one must explicitly call - * {@link ng.$anchorScroll $anchorScroll()} in order to scroll to the element related to the - * current hash. - */ - this.disableAutoScrolling = function() { - autoScrollingEnabled = false; - }; - - /** - * @ngdoc service - * @name $anchorScroll - * @kind function - * @requires $window - * @requires $location - * @requires $rootScope - * - * @description - * When called, it scrolls to the element related to the specified `hash` or (if omitted) to the - * current value of {@link ng.$location#hash $location.hash()}, according to the rules specified - * in the - * [HTML5 spec](http://www.w3.org/html/wg/drafts/html/master/browsers.html#the-indicated-part-of-the-document). - * - * It also watches the {@link ng.$location#hash $location.hash()} and automatically scrolls to - * match any anchor whenever it changes. This can be disabled by calling - * {@link ng.$anchorScrollProvider#disableAutoScrolling $anchorScrollProvider.disableAutoScrolling()}. - * - * Additionally, you can use its {@link ng.$anchorScroll#yOffset yOffset} property to specify a - * vertical scroll-offset (either fixed or dynamic). - * - * @param {string=} hash The hash specifying the element to scroll to. If omitted, the value of - * {@link ng.$location#hash $location.hash()} will be used. - * - * @property {(number|function|jqLite)} yOffset - * If set, specifies a vertical scroll-offset. This is often useful when there are fixed - * positioned elements at the top of the page, such as navbars, headers etc. - * - * `yOffset` can be specified in various ways: - * - **number**: A fixed number of pixels to be used as offset.

                                        - * - **function**: A getter function called everytime `$anchorScroll()` is executed. Must return - * a number representing the offset (in pixels).

                                        - * - **jqLite**: A jqLite/jQuery element to be used for specifying the offset. The distance from - * the top of the page to the element's bottom will be used as offset.
                                        - * **Note**: The element will be taken into account only as long as its `position` is set to - * `fixed`. This option is useful, when dealing with responsive navbars/headers that adjust - * their height and/or positioning according to the viewport's size. - * - *
                                        - *
                                        - * In order for `yOffset` to work properly, scrolling should take place on the document's root and - * not some child element. - *
                                        - * - * @example - - -
                                        - Go to bottom - You're at the bottom! -
                                        -
                                        - - angular.module('anchorScrollExample', []) - .controller('ScrollController', ['$scope', '$location', '$anchorScroll', - function ($scope, $location, $anchorScroll) { - $scope.gotoBottom = function() { - // set the location.hash to the id of - // the element you wish to scroll to. - $location.hash('bottom'); - - // call $anchorScroll() - $anchorScroll(); - }; - }]); - - - #scrollArea { - height: 280px; - overflow: auto; - } - - #bottom { - display: block; - margin-top: 2000px; - } - -
                                        - * - *
                                        - * The example below illustrates the use of a vertical scroll-offset (specified as a fixed value). - * See {@link ng.$anchorScroll#yOffset $anchorScroll.yOffset} for more details. - * - * @example - - - -
                                        - Anchor {{x}} of 5 -
                                        -
                                        - - angular.module('anchorScrollOffsetExample', []) - .run(['$anchorScroll', function($anchorScroll) { - $anchorScroll.yOffset = 50; // always scroll by 50 extra pixels - }]) - .controller('headerCtrl', ['$anchorScroll', '$location', '$scope', - function ($anchorScroll, $location, $scope) { - $scope.gotoAnchor = function(x) { - var newHash = 'anchor' + x; - if ($location.hash() !== newHash) { - // set the $location.hash to `newHash` and - // $anchorScroll will automatically scroll to it - $location.hash('anchor' + x); - } else { - // call $anchorScroll() explicitly, - // since $location.hash hasn't changed - $anchorScroll(); - } - }; - } - ]); - - - body { - padding-top: 50px; - } - - .anchor { - border: 2px dashed DarkOrchid; - padding: 10px 10px 200px 10px; - } - - .fixed-header { - background-color: rgba(0, 0, 0, 0.2); - height: 50px; - position: fixed; - top: 0; left: 0; right: 0; - } - - .fixed-header > a { - display: inline-block; - margin: 5px 15px; - } - -
                                        - */ - this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) { - var document = $window.document; - - // Helper function to get first anchor from a NodeList - // (using `Array#some()` instead of `angular#forEach()` since it's more performant - // and working in all supported browsers.) - function getFirstAnchor(list) { - var result = null; - Array.prototype.some.call(list, function(element) { - if (nodeName_(element) === 'a') { - result = element; - return true; - } - }); - return result; - } - - function getYOffset() { - - var offset = scroll.yOffset; - - if (isFunction(offset)) { - offset = offset(); - } else if (isElement(offset)) { - var elem = offset[0]; - var style = $window.getComputedStyle(elem); - if (style.position !== 'fixed') { - offset = 0; - } else { - offset = elem.getBoundingClientRect().bottom; - } - } else if (!isNumber(offset)) { - offset = 0; - } - - return offset; - } - - function scrollTo(elem) { - if (elem) { - elem.scrollIntoView(); - - var offset = getYOffset(); - - if (offset) { - // `offset` is the number of pixels we should scroll UP in order to align `elem` properly. - // This is true ONLY if the call to `elem.scrollIntoView()` initially aligns `elem` at the - // top of the viewport. - // - // IF the number of pixels from the top of `elem` to the end of the page's content is less - // than the height of the viewport, then `elem.scrollIntoView()` will align the `elem` some - // way down the page. - // - // This is often the case for elements near the bottom of the page. - // - // In such cases we do not need to scroll the whole `offset` up, just the difference between - // the top of the element and the offset, which is enough to align the top of `elem` at the - // desired position. - var elemTop = elem.getBoundingClientRect().top; - $window.scrollBy(0, elemTop - offset); - } - } else { - $window.scrollTo(0, 0); - } - } - - function scroll(hash) { - hash = isString(hash) ? hash : $location.hash(); - var elm; - - // empty hash, scroll to the top of the page - if (!hash) scrollTo(null); - - // element with given id - else if ((elm = document.getElementById(hash))) scrollTo(elm); - - // first anchor with given name :-D - else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) scrollTo(elm); - - // no element and hash == 'top', scroll to the top of the page - else if (hash === 'top') scrollTo(null); - } - - // does not scroll when user clicks on anchor link that is currently on - // (no url change, no $location.hash() change), browser native does scroll - if (autoScrollingEnabled) { - $rootScope.$watch(function autoScrollWatch() {return $location.hash();}, - function autoScrollWatchAction(newVal, oldVal) { - // skip the initial scroll if $location.hash is empty - if (newVal === oldVal && newVal === '') return; - - jqLiteDocumentLoaded(function() { - $rootScope.$evalAsync(scroll); - }); - }); - } - - return scroll; - }]; -} - -var $animateMinErr = minErr('$animate'); -var ELEMENT_NODE = 1; -var NG_ANIMATE_CLASSNAME = 'ng-animate'; - -function mergeClasses(a,b) { - if (!a && !b) return ''; - if (!a) return b; - if (!b) return a; - if (isArray(a)) a = a.join(' '); - if (isArray(b)) b = b.join(' '); - return a + ' ' + b; -} - -function extractElementNode(element) { - for (var i = 0; i < element.length; i++) { - var elm = element[i]; - if (elm.nodeType === ELEMENT_NODE) { - return elm; - } - } -} - -function splitClasses(classes) { - if (isString(classes)) { - classes = classes.split(' '); - } - - // Use createMap() to prevent class assumptions involving property names in - // Object.prototype - var obj = createMap(); - forEach(classes, function(klass) { - // sometimes the split leaves empty string values - // incase extra spaces were applied to the options - if (klass.length) { - obj[klass] = true; - } - }); - return obj; -} - -// if any other type of options value besides an Object value is -// passed into the $animate.method() animation then this helper code -// will be run which will ignore it. While this patch is not the -// greatest solution to this, a lot of existing plugins depend on -// $animate to either call the callback (< 1.2) or return a promise -// that can be changed. This helper function ensures that the options -// are wiped clean incase a callback function is provided. -function prepareAnimateOptions(options) { - return isObject(options) - ? options - : {}; -} - -var $$CoreAnimateJsProvider = function() { - this.$get = noop; -}; - -// this is prefixed with Core since it conflicts with -// the animateQueueProvider defined in ngAnimate/animateQueue.js -var $$CoreAnimateQueueProvider = function() { - var postDigestQueue = new HashMap(); - var postDigestElements = []; - - this.$get = ['$$AnimateRunner', '$rootScope', - function($$AnimateRunner, $rootScope) { - return { - enabled: noop, - on: noop, - off: noop, - pin: noop, - - push: function(element, event, options, domOperation) { - domOperation && domOperation(); - - options = options || {}; - options.from && element.css(options.from); - options.to && element.css(options.to); - - if (options.addClass || options.removeClass) { - addRemoveClassesPostDigest(element, options.addClass, options.removeClass); - } - - var runner = new $$AnimateRunner(); // jshint ignore:line - - // since there are no animations to run the runner needs to be - // notified that the animation call is complete. - runner.complete(); - return runner; - } - }; - - - function updateData(data, classes, value) { - var changed = false; - if (classes) { - classes = isString(classes) ? classes.split(' ') : - isArray(classes) ? classes : []; - forEach(classes, function(className) { - if (className) { - changed = true; - data[className] = value; - } - }); - } - return changed; - } - - function handleCSSClassChanges() { - forEach(postDigestElements, function(element) { - var data = postDigestQueue.get(element); - if (data) { - var existing = splitClasses(element.attr('class')); - var toAdd = ''; - var toRemove = ''; - forEach(data, function(status, className) { - var hasClass = !!existing[className]; - if (status !== hasClass) { - if (status) { - toAdd += (toAdd.length ? ' ' : '') + className; - } else { - toRemove += (toRemove.length ? ' ' : '') + className; - } - } - }); - - forEach(element, function(elm) { - toAdd && jqLiteAddClass(elm, toAdd); - toRemove && jqLiteRemoveClass(elm, toRemove); - }); - postDigestQueue.remove(element); - } - }); - postDigestElements.length = 0; - } - - - function addRemoveClassesPostDigest(element, add, remove) { - var data = postDigestQueue.get(element) || {}; - - var classesAdded = updateData(data, add, true); - var classesRemoved = updateData(data, remove, false); - - if (classesAdded || classesRemoved) { - - postDigestQueue.put(element, data); - postDigestElements.push(element); - - if (postDigestElements.length === 1) { - $rootScope.$$postDigest(handleCSSClassChanges); - } - } - } - }]; -}; - -/** - * @ngdoc provider - * @name $animateProvider - * - * @description - * Default implementation of $animate that doesn't perform any animations, instead just - * synchronously performs DOM updates and resolves the returned runner promise. - * - * In order to enable animations the `ngAnimate` module has to be loaded. - * - * To see the functional implementation check out `src/ngAnimate/animate.js`. - */ -var $AnimateProvider = ['$provide', function($provide) { - var provider = this; - - this.$$registeredAnimations = Object.create(null); - - /** - * @ngdoc method - * @name $animateProvider#register - * - * @description - * Registers a new injectable animation factory function. The factory function produces the - * animation object which contains callback functions for each event that is expected to be - * animated. - * - * * `eventFn`: `function(element, ... , doneFunction, options)` - * The element to animate, the `doneFunction` and the options fed into the animation. Depending - * on the type of animation additional arguments will be injected into the animation function. The - * list below explains the function signatures for the different animation methods: - * - * - setClass: function(element, addedClasses, removedClasses, doneFunction, options) - * - addClass: function(element, addedClasses, doneFunction, options) - * - removeClass: function(element, removedClasses, doneFunction, options) - * - enter, leave, move: function(element, doneFunction, options) - * - animate: function(element, fromStyles, toStyles, doneFunction, options) - * - * Make sure to trigger the `doneFunction` once the animation is fully complete. - * - * ```js - * return { - * //enter, leave, move signature - * eventFn : function(element, done, options) { - * //code to run the animation - * //once complete, then run done() - * return function endFunction(wasCancelled) { - * //code to cancel the animation - * } - * } - * } - * ``` - * - * @param {string} name The name of the animation (this is what the class-based CSS value will be compared to). - * @param {Function} factory The factory function that will be executed to return the animation - * object. - */ - this.register = function(name, factory) { - if (name && name.charAt(0) !== '.') { - throw $animateMinErr('notcsel', "Expecting class selector starting with '.' got '{0}'.", name); - } - - var key = name + '-animation'; - provider.$$registeredAnimations[name.substr(1)] = key; - $provide.factory(key, factory); - }; - - /** - * @ngdoc method - * @name $animateProvider#classNameFilter - * - * @description - * Sets and/or returns the CSS class regular expression that is checked when performing - * an animation. Upon bootstrap the classNameFilter value is not set at all and will - * therefore enable $animate to attempt to perform an animation on any element that is triggered. - * When setting the `classNameFilter` value, animations will only be performed on elements - * that successfully match the filter expression. This in turn can boost performance - * for low-powered devices as well as applications containing a lot of structural operations. - * @param {RegExp=} expression The className expression which will be checked against all animations - * @return {RegExp} The current CSS className expression value. If null then there is no expression value - */ - this.classNameFilter = function(expression) { - if (arguments.length === 1) { - this.$$classNameFilter = (expression instanceof RegExp) ? expression : null; - if (this.$$classNameFilter) { - var reservedRegex = new RegExp("(\\s+|\\/)" + NG_ANIMATE_CLASSNAME + "(\\s+|\\/)"); - if (reservedRegex.test(this.$$classNameFilter.toString())) { - throw $animateMinErr('nongcls','$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the "{0}" CSS class.', NG_ANIMATE_CLASSNAME); - - } - } - } - return this.$$classNameFilter; - }; - - this.$get = ['$$animateQueue', function($$animateQueue) { - function domInsert(element, parentElement, afterElement) { - // if for some reason the previous element was removed - // from the dom sometime before this code runs then let's - // just stick to using the parent element as the anchor - if (afterElement) { - var afterNode = extractElementNode(afterElement); - if (afterNode && !afterNode.parentNode && !afterNode.previousElementSibling) { - afterElement = null; - } - } - afterElement ? afterElement.after(element) : parentElement.prepend(element); - } - - /** - * @ngdoc service - * @name $animate - * @description The $animate service exposes a series of DOM utility methods that provide support - * for animation hooks. The default behavior is the application of DOM operations, however, - * when an animation is detected (and animations are enabled), $animate will do the heavy lifting - * to ensure that animation runs with the triggered DOM operation. - * - * By default $animate doesn't trigger any animations. This is because the `ngAnimate` module isn't - * included and only when it is active then the animation hooks that `$animate` triggers will be - * functional. Once active then all structural `ng-` directives will trigger animations as they perform - * their DOM-related operations (enter, leave and move). Other directives such as `ngClass`, - * `ngShow`, `ngHide` and `ngMessages` also provide support for animations. - * - * It is recommended that the`$animate` service is always used when executing DOM-related procedures within directives. - * - * To learn more about enabling animation support, click here to visit the - * {@link ngAnimate ngAnimate module page}. - */ - return { - // we don't call it directly since non-existant arguments may - // be interpreted as null within the sub enabled function - - /** - * - * @ngdoc method - * @name $animate#on - * @kind function - * @description Sets up an event listener to fire whenever the animation event (enter, leave, move, etc...) - * has fired on the given element or among any of its children. Once the listener is fired, the provided callback - * is fired with the following params: - * - * ```js - * $animate.on('enter', container, - * function callback(element, phase) { - * // cool we detected an enter animation within the container - * } - * ); - * ``` - * - * @param {string} event the animation event that will be captured (e.g. enter, leave, move, addClass, removeClass, etc...) - * @param {DOMElement} container the container element that will capture each of the animation events that are fired on itself - * as well as among its children - * @param {Function} callback the callback function that will be fired when the listener is triggered - * - * The arguments present in the callback function are: - * * `element` - The captured DOM element that the animation was fired on. - * * `phase` - The phase of the animation. The two possible phases are **start** (when the animation starts) and **close** (when it ends). - */ - on: $$animateQueue.on, - - /** - * - * @ngdoc method - * @name $animate#off - * @kind function - * @description Deregisters an event listener based on the event which has been associated with the provided element. This method - * can be used in three different ways depending on the arguments: - * - * ```js - * // remove all the animation event listeners listening for `enter` - * $animate.off('enter'); - * - * // remove all the animation event listeners listening for `enter` on the given element and its children - * $animate.off('enter', container); - * - * // remove the event listener function provided by `callback` that is set - * // to listen for `enter` on the given `container` as well as its children - * $animate.off('enter', container, callback); - * ``` - * - * @param {string} event the animation event (e.g. enter, leave, move, addClass, removeClass, etc...) - * @param {DOMElement=} container the container element the event listener was placed on - * @param {Function=} callback the callback function that was registered as the listener - */ - off: $$animateQueue.off, - - /** - * @ngdoc method - * @name $animate#pin - * @kind function - * @description Associates the provided element with a host parent element to allow the element to be animated even if it exists - * outside of the DOM structure of the Angular application. By doing so, any animation triggered via `$animate` can be issued on the - * element despite being outside the realm of the application or within another application. Say for example if the application - * was bootstrapped on an element that is somewhere inside of the `` tag, but we wanted to allow for an element to be situated - * as a direct child of `document.body`, then this can be achieved by pinning the element via `$animate.pin(element)`. Keep in mind - * that calling `$animate.pin(element, parentElement)` will not actually insert into the DOM anywhere; it will just create the association. - * - * Note that this feature is only active when the `ngAnimate` module is used. - * - * @param {DOMElement} element the external element that will be pinned - * @param {DOMElement} parentElement the host parent element that will be associated with the external element - */ - pin: $$animateQueue.pin, - - /** - * - * @ngdoc method - * @name $animate#enabled - * @kind function - * @description Used to get and set whether animations are enabled or not on the entire application or on an element and its children. This - * function can be called in four ways: - * - * ```js - * // returns true or false - * $animate.enabled(); - * - * // changes the enabled state for all animations - * $animate.enabled(false); - * $animate.enabled(true); - * - * // returns true or false if animations are enabled for an element - * $animate.enabled(element); - * - * // changes the enabled state for an element and its children - * $animate.enabled(element, true); - * $animate.enabled(element, false); - * ``` - * - * @param {DOMElement=} element the element that will be considered for checking/setting the enabled state - * @param {boolean=} enabled whether or not the animations will be enabled for the element - * - * @return {boolean} whether or not animations are enabled - */ - enabled: $$animateQueue.enabled, - - /** - * @ngdoc method - * @name $animate#cancel - * @kind function - * @description Cancels the provided animation. - * - * @param {Promise} animationPromise The animation promise that is returned when an animation is started. - */ - cancel: function(runner) { - runner.end && runner.end(); - }, - - /** - * - * @ngdoc method - * @name $animate#enter - * @kind function - * @description Inserts the element into the DOM either after the `after` element (if provided) or - * as the first child within the `parent` element and then triggers an animation. - * A promise is returned that will be resolved during the next digest once the animation - * has completed. - * - * @param {DOMElement} element the element which will be inserted into the DOM - * @param {DOMElement} parent the parent element which will append the element as - * a child (so long as the after element is not present) - * @param {DOMElement=} after the sibling element after which the element will be appended - * @param {object=} options an optional collection of options/styles that will be applied to the element - * - * @return {Promise} the animation callback promise - */ - enter: function(element, parent, after, options) { - parent = parent && jqLite(parent); - after = after && jqLite(after); - parent = parent || after.parent(); - domInsert(element, parent, after); - return $$animateQueue.push(element, 'enter', prepareAnimateOptions(options)); - }, - - /** - * - * @ngdoc method - * @name $animate#move - * @kind function - * @description Inserts (moves) the element into its new position in the DOM either after - * the `after` element (if provided) or as the first child within the `parent` element - * and then triggers an animation. A promise is returned that will be resolved - * during the next digest once the animation has completed. - * - * @param {DOMElement} element the element which will be moved into the new DOM position - * @param {DOMElement} parent the parent element which will append the element as - * a child (so long as the after element is not present) - * @param {DOMElement=} after the sibling element after which the element will be appended - * @param {object=} options an optional collection of options/styles that will be applied to the element - * - * @return {Promise} the animation callback promise - */ - move: function(element, parent, after, options) { - parent = parent && jqLite(parent); - after = after && jqLite(after); - parent = parent || after.parent(); - domInsert(element, parent, after); - return $$animateQueue.push(element, 'move', prepareAnimateOptions(options)); - }, - - /** - * @ngdoc method - * @name $animate#leave - * @kind function - * @description Triggers an animation and then removes the element from the DOM. - * When the function is called a promise is returned that will be resolved during the next - * digest once the animation has completed. - * - * @param {DOMElement} element the element which will be removed from the DOM - * @param {object=} options an optional collection of options/styles that will be applied to the element - * - * @return {Promise} the animation callback promise - */ - leave: function(element, options) { - return $$animateQueue.push(element, 'leave', prepareAnimateOptions(options), function() { - element.remove(); - }); - }, - - /** - * @ngdoc method - * @name $animate#addClass - * @kind function - * - * @description Triggers an addClass animation surrounding the addition of the provided CSS class(es). Upon - * execution, the addClass operation will only be handled after the next digest and it will not trigger an - * animation if element already contains the CSS class or if the class is removed at a later step. - * Note that class-based animations are treated differently compared to structural animations - * (like enter, move and leave) since the CSS classes may be added/removed at different points - * depending if CSS or JavaScript animations are used. - * - * @param {DOMElement} element the element which the CSS classes will be applied to - * @param {string} className the CSS class(es) that will be added (multiple classes are separated via spaces) - * @param {object=} options an optional collection of options/styles that will be applied to the element - * - * @return {Promise} the animation callback promise - */ - addClass: function(element, className, options) { - options = prepareAnimateOptions(options); - options.addClass = mergeClasses(options.addclass, className); - return $$animateQueue.push(element, 'addClass', options); - }, - - /** - * @ngdoc method - * @name $animate#removeClass - * @kind function - * - * @description Triggers a removeClass animation surrounding the removal of the provided CSS class(es). Upon - * execution, the removeClass operation will only be handled after the next digest and it will not trigger an - * animation if element does not contain the CSS class or if the class is added at a later step. - * Note that class-based animations are treated differently compared to structural animations - * (like enter, move and leave) since the CSS classes may be added/removed at different points - * depending if CSS or JavaScript animations are used. - * - * @param {DOMElement} element the element which the CSS classes will be applied to - * @param {string} className the CSS class(es) that will be removed (multiple classes are separated via spaces) - * @param {object=} options an optional collection of options/styles that will be applied to the element - * - * @return {Promise} the animation callback promise - */ - removeClass: function(element, className, options) { - options = prepareAnimateOptions(options); - options.removeClass = mergeClasses(options.removeClass, className); - return $$animateQueue.push(element, 'removeClass', options); - }, - - /** - * @ngdoc method - * @name $animate#setClass - * @kind function - * - * @description Performs both the addition and removal of a CSS classes on an element and (during the process) - * triggers an animation surrounding the class addition/removal. Much like `$animate.addClass` and - * `$animate.removeClass`, `setClass` will only evaluate the classes being added/removed once a digest has - * passed. Note that class-based animations are treated differently compared to structural animations - * (like enter, move and leave) since the CSS classes may be added/removed at different points - * depending if CSS or JavaScript animations are used. - * - * @param {DOMElement} element the element which the CSS classes will be applied to - * @param {string} add the CSS class(es) that will be added (multiple classes are separated via spaces) - * @param {string} remove the CSS class(es) that will be removed (multiple classes are separated via spaces) - * @param {object=} options an optional collection of options/styles that will be applied to the element - * - * @return {Promise} the animation callback promise - */ - setClass: function(element, add, remove, options) { - options = prepareAnimateOptions(options); - options.addClass = mergeClasses(options.addClass, add); - options.removeClass = mergeClasses(options.removeClass, remove); - return $$animateQueue.push(element, 'setClass', options); - }, - - /** - * @ngdoc method - * @name $animate#animate - * @kind function - * - * @description Performs an inline animation on the element which applies the provided to and from CSS styles to the element. - * If any detected CSS transition, keyframe or JavaScript matches the provided className value, then the animation will take - * on the provided styles. For example, if a transition animation is set for the given classNamem, then the provided `from` and - * `to` styles will be applied alongside the given transition. If the CSS style provided in `from` does not have a corresponding - * style in `to`, the style in `from` is applied immediately, and no animation is run. - * If a JavaScript animation is detected then the provided styles will be given in as function parameters into the `animate` - * method (or as part of the `options` parameter): - * - * ```js - * ngModule.animation('.my-inline-animation', function() { - * return { - * animate : function(element, from, to, done, options) { - * //animation - * done(); - * } - * } - * }); - * ``` - * - * @param {DOMElement} element the element which the CSS styles will be applied to - * @param {object} from the from (starting) CSS styles that will be applied to the element and across the animation. - * @param {object} to the to (destination) CSS styles that will be applied to the element and across the animation. - * @param {string=} className an optional CSS class that will be applied to the element for the duration of the animation. If - * this value is left as empty then a CSS class of `ng-inline-animate` will be applied to the element. - * (Note that if no animation is detected then this value will not be applied to the element.) - * @param {object=} options an optional collection of options/styles that will be applied to the element - * - * @return {Promise} the animation callback promise - */ - animate: function(element, from, to, className, options) { - options = prepareAnimateOptions(options); - options.from = options.from ? extend(options.from, from) : from; - options.to = options.to ? extend(options.to, to) : to; - - className = className || 'ng-inline-animate'; - options.tempClasses = mergeClasses(options.tempClasses, className); - return $$animateQueue.push(element, 'animate', options); - } - }; - }]; -}]; - -var $$AnimateAsyncRunFactoryProvider = function() { - this.$get = ['$$rAF', function($$rAF) { - var waitQueue = []; - - function waitForTick(fn) { - waitQueue.push(fn); - if (waitQueue.length > 1) return; - $$rAF(function() { - for (var i = 0; i < waitQueue.length; i++) { - waitQueue[i](); - } - waitQueue = []; - }); - } - - return function() { - var passed = false; - waitForTick(function() { - passed = true; - }); - return function(callback) { - passed ? callback() : waitForTick(callback); - }; - }; - }]; -}; - -var $$AnimateRunnerFactoryProvider = function() { - this.$get = ['$q', '$sniffer', '$$animateAsyncRun', '$document', '$timeout', - function($q, $sniffer, $$animateAsyncRun, $document, $timeout) { - - var INITIAL_STATE = 0; - var DONE_PENDING_STATE = 1; - var DONE_COMPLETE_STATE = 2; - - AnimateRunner.chain = function(chain, callback) { - var index = 0; - - next(); - function next() { - if (index === chain.length) { - callback(true); - return; - } - - chain[index](function(response) { - if (response === false) { - callback(false); - return; - } - index++; - next(); - }); - } - }; - - AnimateRunner.all = function(runners, callback) { - var count = 0; - var status = true; - forEach(runners, function(runner) { - runner.done(onProgress); - }); - - function onProgress(response) { - status = status && response; - if (++count === runners.length) { - callback(status); - } - } - }; - - function AnimateRunner(host) { - this.setHost(host); - - var rafTick = $$animateAsyncRun(); - var timeoutTick = function(fn) { - $timeout(fn, 0, false); - }; - - this._doneCallbacks = []; - this._tick = function(fn) { - var doc = $document[0]; - - // the document may not be ready or attached - // to the module for some internal tests - if (doc && doc.hidden) { - timeoutTick(fn); - } else { - rafTick(fn); - } - }; - this._state = 0; - } - - AnimateRunner.prototype = { - setHost: function(host) { - this.host = host || {}; - }, - - done: function(fn) { - if (this._state === DONE_COMPLETE_STATE) { - fn(); - } else { - this._doneCallbacks.push(fn); - } - }, - - progress: noop, - - getPromise: function() { - if (!this.promise) { - var self = this; - this.promise = $q(function(resolve, reject) { - self.done(function(status) { - status === false ? reject() : resolve(); - }); - }); - } - return this.promise; - }, - - then: function(resolveHandler, rejectHandler) { - return this.getPromise().then(resolveHandler, rejectHandler); - }, - - 'catch': function(handler) { - return this.getPromise()['catch'](handler); - }, - - 'finally': function(handler) { - return this.getPromise()['finally'](handler); - }, - - pause: function() { - if (this.host.pause) { - this.host.pause(); - } - }, - - resume: function() { - if (this.host.resume) { - this.host.resume(); - } - }, - - end: function() { - if (this.host.end) { - this.host.end(); - } - this._resolve(true); - }, - - cancel: function() { - if (this.host.cancel) { - this.host.cancel(); - } - this._resolve(false); - }, - - complete: function(response) { - var self = this; - if (self._state === INITIAL_STATE) { - self._state = DONE_PENDING_STATE; - self._tick(function() { - self._resolve(response); - }); - } - }, - - _resolve: function(response) { - if (this._state !== DONE_COMPLETE_STATE) { - forEach(this._doneCallbacks, function(fn) { - fn(response); - }); - this._doneCallbacks.length = 0; - this._state = DONE_COMPLETE_STATE; - } - } - }; - - return AnimateRunner; - }]; -}; - -/** - * @ngdoc service - * @name $animateCss - * @kind object - * - * @description - * This is the core version of `$animateCss`. By default, only when the `ngAnimate` is included, - * then the `$animateCss` service will actually perform animations. - * - * Click here {@link ngAnimate.$animateCss to read the documentation for $animateCss}. - */ -var $CoreAnimateCssProvider = function() { - this.$get = ['$$rAF', '$q', '$$AnimateRunner', function($$rAF, $q, $$AnimateRunner) { - - return function(element, initialOptions) { - // all of the animation functions should create - // a copy of the options data, however, if a - // parent service has already created a copy then - // we should stick to using that - var options = initialOptions || {}; - if (!options.$$prepared) { - options = copy(options); - } - - // there is no point in applying the styles since - // there is no animation that goes on at all in - // this version of $animateCss. - if (options.cleanupStyles) { - options.from = options.to = null; - } - - if (options.from) { - element.css(options.from); - options.from = null; - } - - /* jshint newcap: false */ - var closed, runner = new $$AnimateRunner(); - return { - start: run, - end: run - }; - - function run() { - $$rAF(function() { - applyAnimationContents(); - if (!closed) { - runner.complete(); - } - closed = true; - }); - return runner; - } - - function applyAnimationContents() { - if (options.addClass) { - element.addClass(options.addClass); - options.addClass = null; - } - if (options.removeClass) { - element.removeClass(options.removeClass); - options.removeClass = null; - } - if (options.to) { - element.css(options.to); - options.to = null; - } - } - }; - }]; -}; - -/* global stripHash: true */ - -/** - * ! This is a private undocumented service ! - * - * @name $browser - * @requires $log - * @description - * This object has two goals: - * - * - hide all the global state in the browser caused by the window object - * - abstract away all the browser specific features and inconsistencies - * - * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser` - * service, which can be used for convenient testing of the application without the interaction with - * the real browser apis. - */ -/** - * @param {object} window The global window object. - * @param {object} document jQuery wrapped document. - * @param {object} $log window.console or an object with the same interface. - * @param {object} $sniffer $sniffer service - */ -function Browser(window, document, $log, $sniffer) { - var self = this, - location = window.location, - history = window.history, - setTimeout = window.setTimeout, - clearTimeout = window.clearTimeout, - pendingDeferIds = {}; - - self.isMock = false; - - var outstandingRequestCount = 0; - var outstandingRequestCallbacks = []; - - // TODO(vojta): remove this temporary api - self.$$completeOutstandingRequest = completeOutstandingRequest; - self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; }; - - /** - * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks` - * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed. - */ - function completeOutstandingRequest(fn) { - try { - fn.apply(null, sliceArgs(arguments, 1)); - } finally { - outstandingRequestCount--; - if (outstandingRequestCount === 0) { - while (outstandingRequestCallbacks.length) { - try { - outstandingRequestCallbacks.pop()(); - } catch (e) { - $log.error(e); - } - } - } - } - } - - function getHash(url) { - var index = url.indexOf('#'); - return index === -1 ? '' : url.substr(index); - } - - /** - * @private - * Note: this method is used only by scenario runner - * TODO(vojta): prefix this method with $$ ? - * @param {function()} callback Function that will be called when no outstanding request - */ - self.notifyWhenNoOutstandingRequests = function(callback) { - if (outstandingRequestCount === 0) { - callback(); - } else { - outstandingRequestCallbacks.push(callback); - } - }; - - ////////////////////////////////////////////////////////////// - // URL API - ////////////////////////////////////////////////////////////// - - var cachedState, lastHistoryState, - lastBrowserUrl = location.href, - baseElement = document.find('base'), - pendingLocation = null; - - cacheState(); - lastHistoryState = cachedState; - - /** - * @name $browser#url - * - * @description - * GETTER: - * Without any argument, this method just returns current value of location.href. - * - * SETTER: - * With at least one argument, this method sets url to new value. - * If html5 history api supported, pushState/replaceState is used, otherwise - * location.href/location.replace is used. - * Returns its own instance to allow chaining - * - * NOTE: this api is intended for use only by the $location service. Please use the - * {@link ng.$location $location service} to change url. - * - * @param {string} url New url (when used as setter) - * @param {boolean=} replace Should new url replace current history record? - * @param {object=} state object to use with pushState/replaceState - */ - self.url = function(url, replace, state) { - // In modern browsers `history.state` is `null` by default; treating it separately - // from `undefined` would cause `$browser.url('/foo')` to change `history.state` - // to undefined via `pushState`. Instead, let's change `undefined` to `null` here. - if (isUndefined(state)) { - state = null; - } - - // Android Browser BFCache causes location, history reference to become stale. - if (location !== window.location) location = window.location; - if (history !== window.history) history = window.history; - - // setter - if (url) { - var sameState = lastHistoryState === state; - - // Don't change anything if previous and current URLs and states match. This also prevents - // IE<10 from getting into redirect loop when in LocationHashbangInHtml5Url mode. - // See https://github.com/angular/angular.js/commit/ffb2701 - if (lastBrowserUrl === url && (!$sniffer.history || sameState)) { - return self; - } - var sameBase = lastBrowserUrl && stripHash(lastBrowserUrl) === stripHash(url); - lastBrowserUrl = url; - lastHistoryState = state; - // Don't use history API if only the hash changed - // due to a bug in IE10/IE11 which leads - // to not firing a `hashchange` nor `popstate` event - // in some cases (see #9143). - if ($sniffer.history && (!sameBase || !sameState)) { - history[replace ? 'replaceState' : 'pushState'](state, '', url); - cacheState(); - // Do the assignment again so that those two variables are referentially identical. - lastHistoryState = cachedState; - } else { - if (!sameBase || pendingLocation) { - pendingLocation = url; - } - if (replace) { - location.replace(url); - } else if (!sameBase) { - location.href = url; - } else { - location.hash = getHash(url); - } - if (location.href !== url) { - pendingLocation = url; - } - } - return self; - // getter - } else { - // - pendingLocation is needed as browsers don't allow to read out - // the new location.href if a reload happened or if there is a bug like in iOS 9 (see - // https://openradar.appspot.com/22186109). - // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172 - return pendingLocation || location.href.replace(/%27/g,"'"); - } - }; - - /** - * @name $browser#state - * - * @description - * This method is a getter. - * - * Return history.state or null if history.state is undefined. - * - * @returns {object} state - */ - self.state = function() { - return cachedState; - }; - - var urlChangeListeners = [], - urlChangeInit = false; - - function cacheStateAndFireUrlChange() { - pendingLocation = null; - cacheState(); - fireUrlChange(); - } - - function getCurrentState() { - try { - return history.state; - } catch (e) { - // MSIE can reportedly throw when there is no state (UNCONFIRMED). - } - } - - // This variable should be used *only* inside the cacheState function. - var lastCachedState = null; - function cacheState() { - // This should be the only place in $browser where `history.state` is read. - cachedState = getCurrentState(); - cachedState = isUndefined(cachedState) ? null : cachedState; - - // Prevent callbacks fo fire twice if both hashchange & popstate were fired. - if (equals(cachedState, lastCachedState)) { - cachedState = lastCachedState; - } - lastCachedState = cachedState; - } - - function fireUrlChange() { - if (lastBrowserUrl === self.url() && lastHistoryState === cachedState) { - return; - } - - lastBrowserUrl = self.url(); - lastHistoryState = cachedState; - forEach(urlChangeListeners, function(listener) { - listener(self.url(), cachedState); - }); - } - - /** - * @name $browser#onUrlChange - * - * @description - * Register callback function that will be called, when url changes. - * - * It's only called when the url is changed from outside of angular: - * - user types different url into address bar - * - user clicks on history (forward/back) button - * - user clicks on a link - * - * It's not called when url is changed by $browser.url() method - * - * The listener gets called with new url as parameter. - * - * NOTE: this api is intended for use only by the $location service. Please use the - * {@link ng.$location $location service} to monitor url changes in angular apps. - * - * @param {function(string)} listener Listener function to be called when url changes. - * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous. - */ - self.onUrlChange = function(callback) { - // TODO(vojta): refactor to use node's syntax for events - if (!urlChangeInit) { - // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera) - // don't fire popstate when user change the address bar and don't fire hashchange when url - // changed by push/replaceState - - // html5 history api - popstate event - if ($sniffer.history) jqLite(window).on('popstate', cacheStateAndFireUrlChange); - // hashchange event - jqLite(window).on('hashchange', cacheStateAndFireUrlChange); - - urlChangeInit = true; - } - - urlChangeListeners.push(callback); - return callback; - }; - - /** - * @private - * Remove popstate and hashchange handler from window. - * - * NOTE: this api is intended for use only by $rootScope. - */ - self.$$applicationDestroyed = function() { - jqLite(window).off('hashchange popstate', cacheStateAndFireUrlChange); - }; - - /** - * Checks whether the url has changed outside of Angular. - * Needs to be exported to be able to check for changes that have been done in sync, - * as hashchange/popstate events fire in async. - */ - self.$$checkUrlChange = fireUrlChange; - - ////////////////////////////////////////////////////////////// - // Misc API - ////////////////////////////////////////////////////////////// - - /** - * @name $browser#baseHref - * - * @description - * Returns current - * (always relative - without domain) - * - * @returns {string} The current base href - */ - self.baseHref = function() { - var href = baseElement.attr('href'); - return href ? href.replace(/^(https?\:)?\/\/[^\/]*/, '') : ''; - }; - - /** - * @name $browser#defer - * @param {function()} fn A function, who's execution should be deferred. - * @param {number=} [delay=0] of milliseconds to defer the function execution. - * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`. - * - * @description - * Executes a fn asynchronously via `setTimeout(fn, delay)`. - * - * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using - * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed - * via `$browser.defer.flush()`. - * - */ - self.defer = function(fn, delay) { - var timeoutId; - outstandingRequestCount++; - timeoutId = setTimeout(function() { - delete pendingDeferIds[timeoutId]; - completeOutstandingRequest(fn); - }, delay || 0); - pendingDeferIds[timeoutId] = true; - return timeoutId; - }; - - - /** - * @name $browser#defer.cancel - * - * @description - * Cancels a deferred task identified with `deferId`. - * - * @param {*} deferId Token returned by the `$browser.defer` function. - * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully - * canceled. - */ - self.defer.cancel = function(deferId) { - if (pendingDeferIds[deferId]) { - delete pendingDeferIds[deferId]; - clearTimeout(deferId); - completeOutstandingRequest(noop); - return true; - } - return false; - }; - -} - -function $BrowserProvider() { - this.$get = ['$window', '$log', '$sniffer', '$document', - function($window, $log, $sniffer, $document) { - return new Browser($window, $document, $log, $sniffer); - }]; -} - -/** - * @ngdoc service - * @name $cacheFactory - * - * @description - * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to - * them. - * - * ```js - * - * var cache = $cacheFactory('cacheId'); - * expect($cacheFactory.get('cacheId')).toBe(cache); - * expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined(); - * - * cache.put("key", "value"); - * cache.put("another key", "another value"); - * - * // We've specified no options on creation - * expect(cache.info()).toEqual({id: 'cacheId', size: 2}); - * - * ``` - * - * - * @param {string} cacheId Name or id of the newly created cache. - * @param {object=} options Options object that specifies the cache behavior. Properties: - * - * - `{number=}` `capacity` — turns the cache into LRU cache. - * - * @returns {object} Newly created cache object with the following set of methods: - * - * - `{object}` `info()` — Returns id, size, and options of cache. - * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns - * it. - * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss. - * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache. - * - `{void}` `removeAll()` — Removes all cached values. - * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory. - * - * @example - - -
                                        - - - - -

                                        Cached Values

                                        -
                                        - - : - -
                                        - -

                                        Cache Info

                                        -
                                        - - : - -
                                        -
                                        -
                                        - - angular.module('cacheExampleApp', []). - controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) { - $scope.keys = []; - $scope.cache = $cacheFactory('cacheId'); - $scope.put = function(key, value) { - if (angular.isUndefined($scope.cache.get(key))) { - $scope.keys.push(key); - } - $scope.cache.put(key, angular.isUndefined(value) ? null : value); - }; - }]); - - - p { - margin: 10px 0 3px; - } - -
                                        - */ -function $CacheFactoryProvider() { - - this.$get = function() { - var caches = {}; - - function cacheFactory(cacheId, options) { - if (cacheId in caches) { - throw minErr('$cacheFactory')('iid', "CacheId '{0}' is already taken!", cacheId); - } - - var size = 0, - stats = extend({}, options, {id: cacheId}), - data = createMap(), - capacity = (options && options.capacity) || Number.MAX_VALUE, - lruHash = createMap(), - freshEnd = null, - staleEnd = null; - - /** - * @ngdoc type - * @name $cacheFactory.Cache - * - * @description - * A cache object used to store and retrieve data, primarily used by - * {@link $http $http} and the {@link ng.directive:script script} directive to cache - * templates and other data. - * - * ```js - * angular.module('superCache') - * .factory('superCache', ['$cacheFactory', function($cacheFactory) { - * return $cacheFactory('super-cache'); - * }]); - * ``` - * - * Example test: - * - * ```js - * it('should behave like a cache', inject(function(superCache) { - * superCache.put('key', 'value'); - * superCache.put('another key', 'another value'); - * - * expect(superCache.info()).toEqual({ - * id: 'super-cache', - * size: 2 - * }); - * - * superCache.remove('another key'); - * expect(superCache.get('another key')).toBeUndefined(); - * - * superCache.removeAll(); - * expect(superCache.info()).toEqual({ - * id: 'super-cache', - * size: 0 - * }); - * })); - * ``` - */ - return caches[cacheId] = { - - /** - * @ngdoc method - * @name $cacheFactory.Cache#put - * @kind function - * - * @description - * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be - * retrieved later, and incrementing the size of the cache if the key was not already - * present in the cache. If behaving like an LRU cache, it will also remove stale - * entries from the set. - * - * It will not insert undefined values into the cache. - * - * @param {string} key the key under which the cached data is stored. - * @param {*} value the value to store alongside the key. If it is undefined, the key - * will not be stored. - * @returns {*} the value stored. - */ - put: function(key, value) { - if (isUndefined(value)) return; - if (capacity < Number.MAX_VALUE) { - var lruEntry = lruHash[key] || (lruHash[key] = {key: key}); - - refresh(lruEntry); - } - - if (!(key in data)) size++; - data[key] = value; - - if (size > capacity) { - this.remove(staleEnd.key); - } - - return value; - }, - - /** - * @ngdoc method - * @name $cacheFactory.Cache#get - * @kind function - * - * @description - * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object. - * - * @param {string} key the key of the data to be retrieved - * @returns {*} the value stored. - */ - get: function(key) { - if (capacity < Number.MAX_VALUE) { - var lruEntry = lruHash[key]; - - if (!lruEntry) return; - - refresh(lruEntry); - } - - return data[key]; - }, - - - /** - * @ngdoc method - * @name $cacheFactory.Cache#remove - * @kind function - * - * @description - * Removes an entry from the {@link $cacheFactory.Cache Cache} object. - * - * @param {string} key the key of the entry to be removed - */ - remove: function(key) { - if (capacity < Number.MAX_VALUE) { - var lruEntry = lruHash[key]; - - if (!lruEntry) return; - - if (lruEntry == freshEnd) freshEnd = lruEntry.p; - if (lruEntry == staleEnd) staleEnd = lruEntry.n; - link(lruEntry.n,lruEntry.p); - - delete lruHash[key]; - } - - if (!(key in data)) return; - - delete data[key]; - size--; - }, - - - /** - * @ngdoc method - * @name $cacheFactory.Cache#removeAll - * @kind function - * - * @description - * Clears the cache object of any entries. - */ - removeAll: function() { - data = createMap(); - size = 0; - lruHash = createMap(); - freshEnd = staleEnd = null; - }, - - - /** - * @ngdoc method - * @name $cacheFactory.Cache#destroy - * @kind function - * - * @description - * Destroys the {@link $cacheFactory.Cache Cache} object entirely, - * removing it from the {@link $cacheFactory $cacheFactory} set. - */ - destroy: function() { - data = null; - stats = null; - lruHash = null; - delete caches[cacheId]; - }, - - - /** - * @ngdoc method - * @name $cacheFactory.Cache#info - * @kind function - * - * @description - * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}. - * - * @returns {object} an object with the following properties: - *
                                          - *
                                        • **id**: the id of the cache instance
                                        • - *
                                        • **size**: the number of entries kept in the cache instance
                                        • - *
                                        • **...**: any additional properties from the options object when creating the - * cache.
                                        • - *
                                        - */ - info: function() { - return extend({}, stats, {size: size}); - } - }; - - - /** - * makes the `entry` the freshEnd of the LRU linked list - */ - function refresh(entry) { - if (entry != freshEnd) { - if (!staleEnd) { - staleEnd = entry; - } else if (staleEnd == entry) { - staleEnd = entry.n; - } - - link(entry.n, entry.p); - link(entry, freshEnd); - freshEnd = entry; - freshEnd.n = null; - } - } - - - /** - * bidirectionally links two entries of the LRU linked list - */ - function link(nextEntry, prevEntry) { - if (nextEntry != prevEntry) { - if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify - if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify - } - } - } - - - /** - * @ngdoc method - * @name $cacheFactory#info - * - * @description - * Get information about all the caches that have been created - * - * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info` - */ - cacheFactory.info = function() { - var info = {}; - forEach(caches, function(cache, cacheId) { - info[cacheId] = cache.info(); - }); - return info; - }; - - - /** - * @ngdoc method - * @name $cacheFactory#get - * - * @description - * Get access to a cache object by the `cacheId` used when it was created. - * - * @param {string} cacheId Name or id of a cache to access. - * @returns {object} Cache object identified by the cacheId or undefined if no such cache. - */ - cacheFactory.get = function(cacheId) { - return caches[cacheId]; - }; - - - return cacheFactory; - }; -} - -/** - * @ngdoc service - * @name $templateCache - * - * @description - * The first time a template is used, it is loaded in the template cache for quick retrieval. You - * can load templates directly into the cache in a `script` tag, or by consuming the - * `$templateCache` service directly. - * - * Adding via the `script` tag: - * - * ```html - * - * ``` - * - * **Note:** the `script` tag containing the template does not need to be included in the `head` of - * the document, but it must be a descendent of the {@link ng.$rootElement $rootElement} (IE, - * element with ng-app attribute), otherwise the template will be ignored. - * - * Adding via the `$templateCache` service: - * - * ```js - * var myApp = angular.module('myApp', []); - * myApp.run(function($templateCache) { - * $templateCache.put('templateId.html', 'This is the content of the template'); - * }); - * ``` - * - * To retrieve the template later, simply use it in your HTML: - * ```html - *
                                        - * ``` - * - * or get it via Javascript: - * ```js - * $templateCache.get('templateId.html') - * ``` - * - * See {@link ng.$cacheFactory $cacheFactory}. - * - */ -function $TemplateCacheProvider() { - this.$get = ['$cacheFactory', function($cacheFactory) { - return $cacheFactory('templates'); - }]; -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Any commits to this file should be reviewed with security in mind. * - * Changes to this file can potentially create security vulnerabilities. * - * An approval from 2 Core members with history of modifying * - * this file is required. * - * * - * Does the change somehow allow for arbitrary javascript to be executed? * - * Or allows for someone to change the prototype of built-in objects? * - * Or gives undesired access to variables likes document or window? * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE! - * - * DOM-related variables: - * - * - "node" - DOM Node - * - "element" - DOM Element or Node - * - "$node" or "$element" - jqLite-wrapped node or element - * - * - * Compiler related stuff: - * - * - "linkFn" - linking fn of a single directive - * - "nodeLinkFn" - function that aggregates all linking fns for a particular node - * - "childLinkFn" - function that aggregates all linking fns for child nodes of a particular node - * - "compositeLinkFn" - function that aggregates all linking fns for a compilation root (nodeList) - */ - - -/** - * @ngdoc service - * @name $compile - * @kind function - * - * @description - * Compiles an HTML string or DOM into a template and produces a template function, which - * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together. - * - * The compilation is a process of walking the DOM tree and matching DOM elements to - * {@link ng.$compileProvider#directive directives}. - * - *
                                        - * **Note:** This document is an in-depth reference of all directive options. - * For a gentle introduction to directives with examples of common use cases, - * see the {@link guide/directive directive guide}. - *
                                        - * - * ## Comprehensive Directive API - * - * There are many different options for a directive. - * - * The difference resides in the return value of the factory function. - * You can either return a "Directive Definition Object" (see below) that defines the directive properties, - * or just the `postLink` function (all other properties will have the default values). - * - *
                                        - * **Best Practice:** It's recommended to use the "directive definition object" form. - *
                                        - * - * Here's an example directive declared with a Directive Definition Object: - * - * ```js - * var myModule = angular.module(...); - * - * myModule.directive('directiveName', function factory(injectables) { - * var directiveDefinitionObject = { - * priority: 0, - * template: '
                                        ', // or // function(tElement, tAttrs) { ... }, - * // or - * // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... }, - * transclude: false, - * restrict: 'A', - * templateNamespace: 'html', - * scope: false, - * controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... }, - * controllerAs: 'stringIdentifier', - * bindToController: false, - * require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'], - * compile: function compile(tElement, tAttrs, transclude) { - * return { - * pre: function preLink(scope, iElement, iAttrs, controller) { ... }, - * post: function postLink(scope, iElement, iAttrs, controller) { ... } - * } - * // or - * // return function postLink( ... ) { ... } - * }, - * // or - * // link: { - * // pre: function preLink(scope, iElement, iAttrs, controller) { ... }, - * // post: function postLink(scope, iElement, iAttrs, controller) { ... } - * // } - * // or - * // link: function postLink( ... ) { ... } - * }; - * return directiveDefinitionObject; - * }); - * ``` - * - *
                                        - * **Note:** Any unspecified options will use the default value. You can see the default values below. - *
                                        - * - * Therefore the above can be simplified as: - * - * ```js - * var myModule = angular.module(...); - * - * myModule.directive('directiveName', function factory(injectables) { - * var directiveDefinitionObject = { - * link: function postLink(scope, iElement, iAttrs) { ... } - * }; - * return directiveDefinitionObject; - * // or - * // return function postLink(scope, iElement, iAttrs) { ... } - * }); - * ``` - * - * - * - * ### Directive Definition Object - * - * The directive definition object provides instructions to the {@link ng.$compile - * compiler}. The attributes are: - * - * #### `multiElement` - * When this property is set to true, the HTML compiler will collect DOM nodes between - * nodes with the attributes `directive-name-start` and `directive-name-end`, and group them - * together as the directive elements. It is recommended that this feature be used on directives - * which are not strictly behavioral (such as {@link ngClick}), and which - * do not manipulate or replace child nodes (such as {@link ngInclude}). - * - * #### `priority` - * When there are multiple directives defined on a single DOM element, sometimes it - * is necessary to specify the order in which the directives are applied. The `priority` is used - * to sort the directives before their `compile` functions get called. Priority is defined as a - * number. Directives with greater numerical `priority` are compiled first. Pre-link functions - * are also run in priority order, but post-link functions are run in reverse order. The order - * of directives with the same priority is undefined. The default priority is `0`. - * - * #### `terminal` - * If set to true then the current `priority` will be the last set of directives - * which will execute (any directives at the current priority will still execute - * as the order of execution on same `priority` is undefined). Note that expressions - * and other directives used in the directive's template will also be excluded from execution. - * - * #### `scope` - * The scope property can be `true`, an object or a falsy value: - * - * * **falsy:** No scope will be created for the directive. The directive will use its parent's scope. - * - * * **`true`:** A new child scope that prototypically inherits from its parent will be created for - * the directive's element. If multiple directives on the same element request a new scope, - * only one new scope is created. The new scope rule does not apply for the root of the template - * since the root of the template always gets a new scope. - * - * * **`{...}` (an object hash):** A new "isolate" scope is created for the directive's element. The - * 'isolate' scope differs from normal scope in that it does not prototypically inherit from its parent - * scope. This is useful when creating reusable components, which should not accidentally read or modify - * data in the parent scope. - * - * The 'isolate' scope object hash defines a set of local scope properties derived from attributes on the - * directive's element. These local properties are useful for aliasing values for templates. The keys in - * the object hash map to the name of the property on the isolate scope; the values define how the property - * is bound to the parent scope, via matching attributes on the directive's element: - * - * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is - * always a string since DOM attributes are strings. If no `attr` name is specified then the - * attribute name is assumed to be the same as the local name. Given `` and the isolate scope definition `scope: { localName:'@myAttr' }`, - * the directive's scope property `localName` will reflect the interpolated value of `hello - * {{name}}`. As the `name` attribute changes so will the `localName` property on the directive's - * scope. The `name` is read from the parent scope (not the directive's scope). - * - * * `=` or `=attr` - set up a bidirectional binding between a local scope property and an expression - * passed via the attribute `attr`. The expression is evaluated in the context of the parent scope. - * If no `attr` name is specified then the attribute name is assumed to be the same as the local - * name. Given `` and the isolate scope definition `scope: { - * localModel: '=myAttr' }`, the property `localModel` on the directive's scope will reflect the - * value of `parentModel` on the parent scope. Changes to `parentModel` will be reflected in - * `localModel` and vice versa. Optional attributes should be marked as such with a question mark: - * `=?` or `=?attr`. If the binding expression is non-assignable, or if the attribute isn't - * optional and doesn't exist, an exception ({@link error/$compile/nonassign `$compile:nonassign`}) - * will be thrown upon discovering changes to the local value, since it will be impossible to sync - * them back to the parent scope. By default, the {@link ng.$rootScope.Scope#$watch `$watch`} - * method is used for tracking changes, and the equality check is based on object identity. - * However, if an object literal or an array literal is passed as the binding expression, the - * equality check is done by value (using the {@link angular.equals} function). It's also possible - * to watch the evaluated value shallowly with {@link ng.$rootScope.Scope#$watchCollection - * `$watchCollection`}: use `=*` or `=*attr` (`=*?` or `=*?attr` if the attribute is optional). - * - * * `<` or `` and directive definition of - * `scope: { localModel:'` and the isolate scope definition `scope: { - * localFn:'&myAttr' }`, the isolate scope property `localFn` will point to a function wrapper for - * the `count = count + value` expression. Often it's desirable to pass data from the isolated scope - * via an expression to the parent scope. This can be done by passing a map of local variable names - * and values into the expression wrapper fn. For example, if the expression is `increment(amount)` - * then we can specify the amount value by calling the `localFn` as `localFn({amount: 22})`. - * - * In general it's possible to apply more than one directive to one element, but there might be limitations - * depending on the type of scope required by the directives. The following points will help explain these limitations. - * For simplicity only two directives are taken into account, but it is also applicable for several directives: - * - * * **no scope** + **no scope** => Two directives which don't require their own scope will use their parent's scope - * * **child scope** + **no scope** => Both directives will share one single child scope - * * **child scope** + **child scope** => Both directives will share one single child scope - * * **isolated scope** + **no scope** => The isolated directive will use it's own created isolated scope. The other directive will use - * its parent's scope - * * **isolated scope** + **child scope** => **Won't work!** Only one scope can be related to one element. Therefore these directives cannot - * be applied to the same element. - * * **isolated scope** + **isolated scope** => **Won't work!** Only one scope can be related to one element. Therefore these directives - * cannot be applied to the same element. - * - * - * #### `bindToController` - * This property is used to bind scope properties directly to the controller. It can be either - * `true` or an object hash with the same format as the `scope` property. Additionally, a controller - * alias must be set, either by using `controllerAs: 'myAlias'` or by specifying the alias in the controller - * definition: `controller: 'myCtrl as myAlias'`. - * - * When an isolate scope is used for a directive (see above), `bindToController: true` will - * allow a component to have its properties bound to the controller, rather than to scope. - * - * After the controller is instantiated, the initial values of the isolate scope bindings will be bound to the controller - * properties. You can access these bindings once they have been initialized by providing a controller method called - * `$onInit`, which is called after all the controllers on an element have been constructed and had their bindings - * initialized. - * - *
                                        - * **Deprecation warning:** although bindings for non-ES6 class controllers are currently - * bound to `this` before the controller constructor is called, this use is now deprecated. Please place initialization - * code that relies upon bindings inside a `$onInit` method on the controller, instead. - *
                                        - * - * It is also possible to set `bindToController` to an object hash with the same format as the `scope` property. - * This will set up the scope bindings to the controller directly. Note that `scope` can still be used - * to define which kind of scope is created. By default, no scope is created. Use `scope: {}` to create an isolate - * scope (useful for component directives). - * - * If both `bindToController` and `scope` are defined and have object hashes, `bindToController` overrides `scope`. - * - * - * #### `controller` - * Controller constructor function. The controller is instantiated before the - * pre-linking phase and can be accessed by other directives (see - * `require` attribute). This allows the directives to communicate with each other and augment - * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals: - * - * * `$scope` - Current scope associated with the element - * * `$element` - Current element - * * `$attrs` - Current attributes object for the element - * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope: - * `function([scope], cloneLinkingFn, futureParentElement, slotName)`: - * * `scope`: (optional) override the scope. - * * `cloneLinkingFn`: (optional) argument to create clones of the original transcluded content. - * * `futureParentElement` (optional): - * * defines the parent to which the `cloneLinkingFn` will add the cloned elements. - * * default: `$element.parent()` resp. `$element` for `transclude:'element'` resp. `transclude:true`. - * * only needed for transcludes that are allowed to contain non html elements (e.g. SVG elements) - * and when the `cloneLinkinFn` is passed, - * as those elements need to created and cloned in a special way when they are defined outside their - * usual containers (e.g. like ``). - * * See also the `directive.templateNamespace` property. - * * `slotName`: (optional) the name of the slot to transclude. If falsy (e.g. `null`, `undefined` or `''`) - * then the default translusion is provided. - * The `$transclude` function also has a method on it, `$transclude.isSlotFilled(slotName)`, which returns - * `true` if the specified slot contains content (i.e. one or more DOM nodes). - * - * The controller can provide the following methods that act as life-cycle hooks: - * * `$onInit` - Called on each controller after all the controllers on an element have been constructed and - * had their bindings initialized (and before the pre & post linking functions for the directives on - * this element). This is a good place to put initialization code for your controller. - * - * #### `require` - * Require another directive and inject its controller as the fourth argument to the linking function. The - * `require` property can be a string, an array or an object: - * * a **string** containing the name of the directive to pass to the linking function - * * an **array** containing the names of directives to pass to the linking function. The argument passed to the - * linking function will be an array of controllers in the same order as the names in the `require` property - * * an **object** whose property values are the names of the directives to pass to the linking function. The argument - * passed to the linking function will also be an object with matching keys, whose values will hold the corresponding - * controllers. - * - * If the `require` property is an object and `bindToController` is truthy, then the required controllers are - * bound to the controller using the keys of the `require` property. This binding occurs after all the controllers - * have been constructed but before `$onInit` is called. - * See the {@link $compileProvider#component} helper for an example of how this can be used. - * - * If no such required directive(s) can be found, or if the directive does not have a controller, then an error is - * raised (unless no link function is specified and the required controllers are not being bound to the directive - * controller, in which case error checking is skipped). The name can be prefixed with: - * - * * (no prefix) - Locate the required controller on the current element. Throw an error if not found. - * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found. - * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found. - * * `^^` - Locate the required controller by searching the element's parents. Throw an error if not found. - * * `?^` - Attempt to locate the required controller by searching the element and its parents or pass - * `null` to the `link` fn if not found. - * * `?^^` - Attempt to locate the required controller by searching the element's parents, or pass - * `null` to the `link` fn if not found. - * - * - * #### `controllerAs` - * Identifier name for a reference to the controller in the directive's scope. - * This allows the controller to be referenced from the directive template. This is especially - * useful when a directive is used as component, i.e. with an `isolate` scope. It's also possible - * to use it in a directive without an `isolate` / `new` scope, but you need to be aware that the - * `controllerAs` reference might overwrite a property that already exists on the parent scope. - * - * - * #### `restrict` - * String of subset of `EACM` which restricts the directive to a specific directive - * declaration style. If omitted, the defaults (elements and attributes) are used. - * - * * `E` - Element name (default): `` - * * `A` - Attribute (default): `
                                        ` - * * `C` - Class: `
                                        ` - * * `M` - Comment: `` - * - * - * #### `templateNamespace` - * String representing the document type used by the markup in the template. - * AngularJS needs this information as those elements need to be created and cloned - * in a special way when they are defined outside their usual containers like `` and ``. - * - * * `html` - All root nodes in the template are HTML. Root nodes may also be - * top-level elements such as `` or ``. - * * `svg` - The root nodes in the template are SVG elements (excluding ``). - * * `math` - The root nodes in the template are MathML elements (excluding ``). - * - * If no `templateNamespace` is specified, then the namespace is considered to be `html`. - * - * #### `template` - * HTML markup that may: - * * Replace the contents of the directive's element (default). - * * Replace the directive's element itself (if `replace` is true - DEPRECATED). - * * Wrap the contents of the directive's element (if `transclude` is true). - * - * Value may be: - * - * * A string. For example `
                                        {{delete_str}}
                                        `. - * * A function which takes two arguments `tElement` and `tAttrs` (described in the `compile` - * function api below) and returns a string value. - * - * - * #### `templateUrl` - * This is similar to `template` but the template is loaded from the specified URL, asynchronously. - * - * Because template loading is asynchronous the compiler will suspend compilation of directives on that element - * for later when the template has been resolved. In the meantime it will continue to compile and link - * sibling and parent elements as though this element had not contained any directives. - * - * The compiler does not suspend the entire compilation to wait for templates to be loaded because this - * would result in the whole app "stalling" until all templates are loaded asynchronously - even in the - * case when only one deeply nested directive has `templateUrl`. - * - * Template loading is asynchronous even if the template has been preloaded into the {@link $templateCache} - * - * You can specify `templateUrl` as a string representing the URL or as a function which takes two - * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns - * a string value representing the url. In either case, the template URL is passed through {@link - * $sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}. - * - * - * #### `replace` ([*DEPRECATED*!], will be removed in next major release - i.e. v2.0) - * specify what the template should replace. Defaults to `false`. - * - * * `true` - the template will replace the directive's element. - * * `false` - the template will replace the contents of the directive's element. - * - * The replacement process migrates all of the attributes / classes from the old element to the new - * one. See the {@link guide/directive#template-expanding-directive - * Directives Guide} for an example. - * - * There are very few scenarios where element replacement is required for the application function, - * the main one being reusable custom components that are used within SVG contexts - * (because SVG doesn't work with custom elements in the DOM tree). - * - * #### `transclude` - * Extract the contents of the element where the directive appears and make it available to the directive. - * The contents are compiled and provided to the directive as a **transclusion function**. See the - * {@link $compile#transclusion Transclusion} section below. - * - * - * #### `compile` - * - * ```js - * function compile(tElement, tAttrs, transclude) { ... } - * ``` - * - * The compile function deals with transforming the template DOM. Since most directives do not do - * template transformation, it is not used often. The compile function takes the following arguments: - * - * * `tElement` - template element - The element where the directive has been declared. It is - * safe to do template transformation on the element and child elements only. - * - * * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared - * between all directive compile functions. - * - * * `transclude` - [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)` - * - *
                                        - * **Note:** The template instance and the link instance may be different objects if the template has - * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that - * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration - * should be done in a linking function rather than in a compile function. - *
                                        - - *
                                        - * **Note:** The compile function cannot handle directives that recursively use themselves in their - * own templates or compile functions. Compiling these directives results in an infinite loop and - * stack overflow errors. - * - * This can be avoided by manually using $compile in the postLink function to imperatively compile - * a directive's template instead of relying on automatic template compilation via `template` or - * `templateUrl` declaration or manual compilation inside the compile function. - *
                                        - * - *
                                        - * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it - * e.g. does not know about the right outer scope. Please use the transclude function that is passed - * to the link function instead. - *
                                        - - * A compile function can have a return value which can be either a function or an object. - * - * * returning a (post-link) function - is equivalent to registering the linking function via the - * `link` property of the config object when the compile function is empty. - * - * * returning an object with function(s) registered via `pre` and `post` properties - allows you to - * control when a linking function should be called during the linking phase. See info about - * pre-linking and post-linking functions below. - * - * - * #### `link` - * This property is used only if the `compile` property is not defined. - * - * ```js - * function link(scope, iElement, iAttrs, controller, transcludeFn) { ... } - * ``` - * - * The link function is responsible for registering DOM listeners as well as updating the DOM. It is - * executed after the template has been cloned. This is where most of the directive logic will be - * put. - * - * * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the - * directive for registering {@link ng.$rootScope.Scope#$watch watches}. - * - * * `iElement` - instance element - The element where the directive is to be used. It is safe to - * manipulate the children of the element only in `postLink` function since the children have - * already been linked. - * - * * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared - * between all directive linking functions. - * - * * `controller` - the directive's required controller instance(s) - Instances are shared - * among all directives, which allows the directives to use the controllers as a communication - * channel. The exact value depends on the directive's `require` property: - * * no controller(s) required: the directive's own controller, or `undefined` if it doesn't have one - * * `string`: the controller instance - * * `array`: array of controller instances - * - * If a required controller cannot be found, and it is optional, the instance is `null`, - * otherwise the {@link error:$compile:ctreq Missing Required Controller} error is thrown. - * - * Note that you can also require the directive's own controller - it will be made available like - * any other controller. - * - * * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope. - * This is the same as the `$transclude` - * parameter of directive controllers, see there for details. - * `function([scope], cloneLinkingFn, futureParentElement)`. - * - * #### Pre-linking function - * - * Executed before the child elements are linked. Not safe to do DOM transformation since the - * compiler linking function will fail to locate the correct elements for linking. - * - * #### Post-linking function - * - * Executed after the child elements are linked. - * - * Note that child elements that contain `templateUrl` directives will not have been compiled - * and linked since they are waiting for their template to load asynchronously and their own - * compilation and linking has been suspended until that occurs. - * - * It is safe to do DOM transformation in the post-linking function on elements that are not waiting - * for their async templates to be resolved. - * - * - * ### Transclusion - * - * Transclusion is the process of extracting a collection of DOM elements from one part of the DOM and - * copying them to another part of the DOM, while maintaining their connection to the original AngularJS - * scope from where they were taken. - * - * Transclusion is used (often with {@link ngTransclude}) to insert the - * original contents of a directive's element into a specified place in the template of the directive. - * The benefit of transclusion, over simply moving the DOM elements manually, is that the transcluded - * content has access to the properties on the scope from which it was taken, even if the directive - * has isolated scope. - * See the {@link guide/directive#creating-a-directive-that-wraps-other-elements Directives Guide}. - * - * This makes it possible for the widget to have private state for its template, while the transcluded - * content has access to its originating scope. - * - *
                                        - * **Note:** When testing an element transclude directive you must not place the directive at the root of the - * DOM fragment that is being compiled. See {@link guide/unit-testing#testing-transclusion-directives - * Testing Transclusion Directives}. - *
                                        - * - * There are three kinds of transclusion depending upon whether you want to transclude just the contents of the - * directive's element, the entire element or multiple parts of the element contents: - * - * * `true` - transclude the content (i.e. the child nodes) of the directive's element. - * * `'element'` - transclude the whole of the directive's element including any directives on this - * element that defined at a lower priority than this directive. When used, the `template` - * property is ignored. - * * **`{...}` (an object hash):** - map elements of the content onto transclusion "slots" in the template. - * - * **Mult-slot transclusion** is declared by providing an object for the `transclude` property. - * - * This object is a map where the keys are the name of the slot to fill and the value is an element selector - * used to match the HTML to the slot. The element selector should be in normalized form (e.g. `myElement`) - * and will match the standard element variants (e.g. `my-element`, `my:element`, `data-my-element`, etc). - * - * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives} - * - * If the element selector is prefixed with a `?` then that slot is optional. - * - * For example, the transclude object `{ slotA: '?myCustomElement' }` maps `` elements to - * the `slotA` slot, which can be accessed via the `$transclude` function or via the {@link ngTransclude} directive. - * - * Slots that are not marked as optional (`?`) will trigger a compile time error if there are no matching elements - * in the transclude content. If you wish to know if an optional slot was filled with content, then you can call - * `$transclude.isSlotFilled(slotName)` on the transclude function passed to the directive's link function and - * injectable into the directive's controller. - * - * - * #### Transclusion Functions - * - * When a directive requests transclusion, the compiler extracts its contents and provides a **transclusion - * function** to the directive's `link` function and `controller`. This transclusion function is a special - * **linking function** that will return the compiled contents linked to a new transclusion scope. - * - *
                                        - * If you are just using {@link ngTransclude} then you don't need to worry about this function, since - * ngTransclude will deal with it for us. - *
                                        - * - * If you want to manually control the insertion and removal of the transcluded content in your directive - * then you must use this transclude function. When you call a transclude function it returns a a jqLite/JQuery - * object that contains the compiled DOM, which is linked to the correct transclusion scope. - * - * When you call a transclusion function you can pass in a **clone attach function**. This function accepts - * two parameters, `function(clone, scope) { ... }`, where the `clone` is a fresh compiled copy of your transcluded - * content and the `scope` is the newly created transclusion scope, to which the clone is bound. - * - *
                                        - * **Best Practice**: Always provide a `cloneFn` (clone attach function) when you call a transclude function - * since you then get a fresh clone of the original DOM and also have access to the new transclusion scope. - *
                                        - * - * It is normal practice to attach your transcluded content (`clone`) to the DOM inside your **clone - * attach function**: - * - * ```js - * var transcludedContent, transclusionScope; - * - * $transclude(function(clone, scope) { - * element.append(clone); - * transcludedContent = clone; - * transclusionScope = scope; - * }); - * ``` - * - * Later, if you want to remove the transcluded content from your DOM then you should also destroy the - * associated transclusion scope: - * - * ```js - * transcludedContent.remove(); - * transclusionScope.$destroy(); - * ``` - * - *
                                        - * **Best Practice**: if you intend to add and remove transcluded content manually in your directive - * (by calling the transclude function to get the DOM and calling `element.remove()` to remove it), - * then you are also responsible for calling `$destroy` on the transclusion scope. - *
                                        - * - * The built-in DOM manipulation directives, such as {@link ngIf}, {@link ngSwitch} and {@link ngRepeat} - * automatically destroy their transcluded clones as necessary so you do not need to worry about this if - * you are simply using {@link ngTransclude} to inject the transclusion into your directive. - * - * - * #### Transclusion Scopes - * - * When you call a transclude function it returns a DOM fragment that is pre-bound to a **transclusion - * scope**. This scope is special, in that it is a child of the directive's scope (and so gets destroyed - * when the directive's scope gets destroyed) but it inherits the properties of the scope from which it - * was taken. - * - * For example consider a directive that uses transclusion and isolated scope. The DOM hierarchy might look - * like this: - * - * ```html - *
                                        - *
                                        - *
                                        - *
                                        - *
                                        - *
                                        - * ``` - * - * The `$parent` scope hierarchy will look like this: - * - ``` - - $rootScope - - isolate - - transclusion - ``` - * - * but the scopes will inherit prototypically from different scopes to their `$parent`. - * - ``` - - $rootScope - - transclusion - - isolate - ``` - * - * - * ### Attributes - * - * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the - * `link()` or `compile()` functions. It has a variety of uses. - * - * * *Accessing normalized attribute names:* Directives like 'ngBind' can be expressed in many ways: - * 'ng:bind', `data-ng-bind`, or 'x-ng-bind'. The attributes object allows for normalized access - * to the attributes. - * - * * *Directive inter-communication:* All directives share the same instance of the attributes - * object which allows the directives to use the attributes object as inter directive - * communication. - * - * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object - * allowing other directives to read the interpolated value. - * - * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes - * that contain interpolation (e.g. `src="{{bar}}"`). Not only is this very efficient but it's also - * the only way to easily get the actual value because during the linking phase the interpolation - * hasn't been evaluated yet and so the value is at this time set to `undefined`. - * - * ```js - * function linkingFn(scope, elm, attrs, ctrl) { - * // get the attribute value - * console.log(attrs.ngModel); - * - * // change the attribute - * attrs.$set('ngModel', 'new value'); - * - * // observe changes to interpolated attribute - * attrs.$observe('ngModel', function(value) { - * console.log('ngModel has changed value to ' + value); - * }); - * } - * ``` - * - * ## Example - * - *
                                        - * **Note**: Typically directives are registered with `module.directive`. The example below is - * to illustrate how `$compile` works. - *
                                        - * - - - -
                                        -
                                        -
                                        -
                                        -
                                        -
                                        - - it('should auto compile', function() { - var textarea = $('textarea'); - var output = $('div[compile]'); - // The initial state reads 'Hello Angular'. - expect(output.getText()).toBe('Hello Angular'); - textarea.clear(); - textarea.sendKeys('{{name}}!'); - expect(output.getText()).toBe('Angular!'); - }); - -
                                        - - * - * - * @param {string|DOMElement} element Element or HTML string to compile into a template function. - * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives - DEPRECATED. - * - *
                                        - * **Note:** Passing a `transclude` function to the $compile function is deprecated, as it - * e.g. will not use the right outer scope. Please pass the transclude function as a - * `parentBoundTranscludeFn` to the link function instead. - *
                                        - * - * @param {number} maxPriority only apply directives lower than given priority (Only effects the - * root element(s), not their children) - * @returns {function(scope, cloneAttachFn=, options=)} a link function which is used to bind template - * (a DOM element/tree) to a scope. Where: - * - * * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to. - * * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the - * `template` and call the `cloneAttachFn` function allowing the caller to attach the - * cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is - * called as:
                                        `cloneAttachFn(clonedElement, scope)` where: - * - * * `clonedElement` - is a clone of the original `element` passed into the compiler. - * * `scope` - is the current scope with which the linking function is working with. - * - * * `options` - An optional object hash with linking options. If `options` is provided, then the following - * keys may be used to control linking behavior: - * - * * `parentBoundTranscludeFn` - the transclude function made available to - * directives; if given, it will be passed through to the link functions of - * directives found in `element` during compilation. - * * `transcludeControllers` - an object hash with keys that map controller names - * to a hash with the key `instance`, which maps to the controller instance; - * if given, it will make the controllers available to directives on the compileNode: - * ``` - * { - * parent: { - * instance: parentControllerInstance - * } - * } - * ``` - * * `futureParentElement` - defines the parent to which the `cloneAttachFn` will add - * the cloned elements; only needed for transcludes that are allowed to contain non html - * elements (e.g. SVG elements). See also the directive.controller property. - * - * Calling the linking function returns the element of the template. It is either the original - * element passed in, or the clone of the element if the `cloneAttachFn` is provided. - * - * After linking the view is not updated until after a call to $digest which typically is done by - * Angular automatically. - * - * If you need access to the bound view, there are two ways to do it: - * - * - If you are not asking the linking function to clone the template, create the DOM element(s) - * before you send them to the compiler and keep this reference around. - * ```js - * var element = $compile('

                                        {{total}}

                                        ')(scope); - * ``` - * - * - if on the other hand, you need the element to be cloned, the view reference from the original - * example would not point to the clone, but rather to the original template that was cloned. In - * this case, you can access the clone via the cloneAttachFn: - * ```js - * var templateElement = angular.element('

                                        {{total}}

                                        '), - * scope = ....; - * - * var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) { - * //attach the clone to DOM document at the right place - * }); - * - * //now we have reference to the cloned DOM via `clonedElement` - * ``` - * - * - * For information on how the compiler works, see the - * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide. - */ - -var $compileMinErr = minErr('$compile'); - -/** - * @ngdoc provider - * @name $compileProvider - * - * @description - */ -$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider']; -function $CompileProvider($provide, $$sanitizeUriProvider) { - var hasDirectives = {}, - Suffix = 'Directive', - COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\w\-]+)\s+(.*)$/, - CLASS_DIRECTIVE_REGEXP = /(([\w\-]+)(?:\:([^;]+))?;?)/, - ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'), - REQUIRE_PREFIX_REGEXP = /^(?:(\^\^?)?(\?)?(\^\^?)?)?/; - - // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes - // The assumption is that future DOM event attribute names will begin with - // 'on' and be composed of only English letters. - var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/; - var bindingCache = createMap(); - - function parseIsolateBindings(scope, directiveName, isController) { - var LOCAL_REGEXP = /^\s*([@&<]|=(\*?))(\??)\s*(\w*)\s*$/; - - var bindings = {}; - - forEach(scope, function(definition, scopeName) { - if (definition in bindingCache) { - bindings[scopeName] = bindingCache[definition]; - return; - } - var match = definition.match(LOCAL_REGEXP); - - if (!match) { - throw $compileMinErr('iscp', - "Invalid {3} for directive '{0}'." + - " Definition: {... {1}: '{2}' ...}", - directiveName, scopeName, definition, - (isController ? "controller bindings definition" : - "isolate scope definition")); - } - - bindings[scopeName] = { - mode: match[1][0], - collection: match[2] === '*', - optional: match[3] === '?', - attrName: match[4] || scopeName - }; - if (match[4]) { - bindingCache[definition] = bindings[scopeName]; - } - }); - - return bindings; - } - - function parseDirectiveBindings(directive, directiveName) { - var bindings = { - isolateScope: null, - bindToController: null - }; - if (isObject(directive.scope)) { - if (directive.bindToController === true) { - bindings.bindToController = parseIsolateBindings(directive.scope, - directiveName, true); - bindings.isolateScope = {}; - } else { - bindings.isolateScope = parseIsolateBindings(directive.scope, - directiveName, false); - } - } - if (isObject(directive.bindToController)) { - bindings.bindToController = - parseIsolateBindings(directive.bindToController, directiveName, true); - } - if (isObject(bindings.bindToController)) { - var controller = directive.controller; - var controllerAs = directive.controllerAs; - if (!controller) { - // There is no controller, there may or may not be a controllerAs property - throw $compileMinErr('noctrl', - "Cannot bind to controller without directive '{0}'s controller.", - directiveName); - } else if (!identifierForController(controller, controllerAs)) { - // There is a controller, but no identifier or controllerAs property - throw $compileMinErr('noident', - "Cannot bind to controller without identifier for directive '{0}'.", - directiveName); - } - } - return bindings; - } - - function assertValidDirectiveName(name) { - var letter = name.charAt(0); - if (!letter || letter !== lowercase(letter)) { - throw $compileMinErr('baddir', "Directive name '{0}' is invalid. The first character must be a lowercase letter", name); - } - if (name !== name.trim()) { - throw $compileMinErr('baddir', - "Directive name '{0}' is invalid. The name should not contain leading or trailing whitespaces", - name); - } - } - - /** - * @ngdoc method - * @name $compileProvider#directive - * @kind function - * - * @description - * Register a new directive with the compiler. - * - * @param {string|Object} name Name of the directive in camel-case (i.e. ngBind which - * will match as ng-bind), or an object map of directives where the keys are the - * names and the values are the factories. - * @param {Function|Array} directiveFactory An injectable directive factory function. See the - * {@link guide/directive directive guide} and the {@link $compile compile API} for more info. - * @returns {ng.$compileProvider} Self for chaining. - */ - this.directive = function registerDirective(name, directiveFactory) { - assertNotHasOwnProperty(name, 'directive'); - if (isString(name)) { - assertValidDirectiveName(name); - assertArg(directiveFactory, 'directiveFactory'); - if (!hasDirectives.hasOwnProperty(name)) { - hasDirectives[name] = []; - $provide.factory(name + Suffix, ['$injector', '$exceptionHandler', - function($injector, $exceptionHandler) { - var directives = []; - forEach(hasDirectives[name], function(directiveFactory, index) { - try { - var directive = $injector.invoke(directiveFactory); - if (isFunction(directive)) { - directive = { compile: valueFn(directive) }; - } else if (!directive.compile && directive.link) { - directive.compile = valueFn(directive.link); - } - directive.priority = directive.priority || 0; - directive.index = index; - directive.name = directive.name || name; - directive.require = directive.require || (directive.controller && directive.name); - directive.restrict = directive.restrict || 'EA'; - directive.$$moduleName = directiveFactory.$$moduleName; - directives.push(directive); - } catch (e) { - $exceptionHandler(e); - } - }); - return directives; - }]); - } - hasDirectives[name].push(directiveFactory); - } else { - forEach(name, reverseParams(registerDirective)); - } - return this; - }; - - /** - * @ngdoc method - * @name $compileProvider#component - * @module ng - * @param {string} name Name of the component in camelCase (i.e. `myComp` which will match ``) - * @param {Object} options Component definition object (a simplified - * {@link ng.$compile#directive-definition-object directive definition object}), - * with the following properties (all optional): - * - * - `controller` – `{(string|function()=}` – controller constructor function that should be - * associated with newly created scope or the name of a {@link ng.$compile#-controller- - * registered controller} if passed as a string. An empty `noop` function by default. - * - `controllerAs` – `{string=}` – identifier name for to reference the controller in the component's scope. - * If present, the controller will be published to scope under the `controllerAs` name. - * If not present, this will default to be `$ctrl`. - * - `template` – `{string=|function()=}` – html template as a string or a function that - * returns an html template as a string which should be used as the contents of this component. - * Empty string by default. - * - * If `template` is a function, then it is {@link auto.$injector#invoke injected} with - * the following locals: - * - * - `$element` - Current element - * - `$attrs` - Current attributes object for the element - * - * - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html - * template that should be used as the contents of this component. - * - * If `templateUrl` is a function, then it is {@link auto.$injector#invoke injected} with - * the following locals: - * - * - `$element` - Current element - * - `$attrs` - Current attributes object for the element - * - * - `bindings` – `{object=}` – defines bindings between DOM attributes and component properties. - * Component properties are always bound to the component controller and not to the scope. - * See {@link ng.$compile#-bindtocontroller- `bindToController`}. - * - `transclude` – `{boolean=}` – whether {@link $compile#transclusion content transclusion} is enabled. - * Disabled by default. - * - `$...` – additional properties to attach to the directive factory function and the controller - * constructor function. (This is used by the component router to annotate) - * - * @returns {ng.$compileProvider} the compile provider itself, for chaining of function calls. - * @description - * Register a **component definition** with the compiler. This is a shorthand for registering a special - * type of directive, which represents a self-contained UI component in your application. Such components - * are always isolated (i.e. `scope: {}`) and are always restricted to elements (i.e. `restrict: 'E'`). - * - * Component definitions are very simple and do not require as much configuration as defining general - * directives. Component definitions usually consist only of a template and a controller backing it. - * - * In order to make the definition easier, components enforce best practices like use of `controllerAs`, - * `bindToController`. They always have **isolate scope** and are restricted to elements. - * - * Here are a few examples of how you would usually define components: - * - * ```js - * var myMod = angular.module(...); - * myMod.component('myComp', { - * template: '
                                        My name is {{$ctrl.name}}
                                        ', - * controller: function() { - * this.name = 'shahar'; - * } - * }); - * - * myMod.component('myComp', { - * template: '
                                        My name is {{$ctrl.name}}
                                        ', - * bindings: {name: '@'} - * }); - * - * myMod.component('myComp', { - * templateUrl: 'views/my-comp.html', - * controller: 'MyCtrl', - * controllerAs: 'ctrl', - * bindings: {name: '@'} - * }); - * - * ``` - * For more examples, and an in-depth guide, see the {@link guide/component component guide}. - * - *
                                        - * See also {@link ng.$compileProvider#directive $compileProvider.directive()}. - */ - this.component = function registerComponent(name, options) { - var controller = options.controller || noop; - - function factory($injector) { - function makeInjectable(fn) { - if (isFunction(fn) || isArray(fn)) { - return function(tElement, tAttrs) { - return $injector.invoke(fn, this, {$element: tElement, $attrs: tAttrs}); - }; - } else { - return fn; - } - } - - var template = (!options.template && !options.templateUrl ? '' : options.template); - return { - controller: controller, - controllerAs: identifierForController(options.controller) || options.controllerAs || '$ctrl', - template: makeInjectable(template), - templateUrl: makeInjectable(options.templateUrl), - transclude: options.transclude, - scope: {}, - bindToController: options.bindings || {}, - restrict: 'E', - require: options.require - }; - } - - // Copy any annotation properties (starting with $) over to the factory function - // These could be used by libraries such as the new component router - forEach(options, function(val, key) { - if (key.charAt(0) === '$') { - factory[key] = val; - controller[key] = val; - } - }); - - factory.$inject = ['$injector']; - - return this.directive(name, factory); - }; - - - /** - * @ngdoc method - * @name $compileProvider#aHrefSanitizationWhitelist - * @kind function - * - * @description - * Retrieves or overrides the default regular expression that is used for whitelisting of safe - * urls during a[href] sanitization. - * - * The sanitization is a security measure aimed at preventing XSS attacks via html links. - * - * Any url about to be assigned to a[href] via data-binding is first normalized and turned into - * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` - * regular expression. If a match is found, the original url is written into the dom. Otherwise, - * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. - * - * @param {RegExp=} regexp New regexp to whitelist urls with. - * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for - * chaining otherwise. - */ - this.aHrefSanitizationWhitelist = function(regexp) { - if (isDefined(regexp)) { - $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp); - return this; - } else { - return $$sanitizeUriProvider.aHrefSanitizationWhitelist(); - } - }; - - - /** - * @ngdoc method - * @name $compileProvider#imgSrcSanitizationWhitelist - * @kind function - * - * @description - * Retrieves or overrides the default regular expression that is used for whitelisting of safe - * urls during img[src] sanitization. - * - * The sanitization is a security measure aimed at prevent XSS attacks via html links. - * - * Any url about to be assigned to img[src] via data-binding is first normalized and turned into - * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` - * regular expression. If a match is found, the original url is written into the dom. Otherwise, - * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. - * - * @param {RegExp=} regexp New regexp to whitelist urls with. - * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for - * chaining otherwise. - */ - this.imgSrcSanitizationWhitelist = function(regexp) { - if (isDefined(regexp)) { - $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp); - return this; - } else { - return $$sanitizeUriProvider.imgSrcSanitizationWhitelist(); - } - }; - - /** - * @ngdoc method - * @name $compileProvider#debugInfoEnabled - * - * @param {boolean=} enabled update the debugInfoEnabled state if provided, otherwise just return the - * current debugInfoEnabled state - * @returns {*} current value if used as getter or itself (chaining) if used as setter - * - * @kind function - * - * @description - * Call this method to enable/disable various debug runtime information in the compiler such as adding - * binding information and a reference to the current scope on to DOM elements. - * If enabled, the compiler will add the following to DOM elements that have been bound to the scope - * * `ng-binding` CSS class - * * `$binding` data property containing an array of the binding expressions - * - * You may want to disable this in production for a significant performance boost. See - * {@link guide/production#disabling-debug-data Disabling Debug Data} for more. - * - * The default value is true. - */ - var debugInfoEnabled = true; - this.debugInfoEnabled = function(enabled) { - if (isDefined(enabled)) { - debugInfoEnabled = enabled; - return this; - } - return debugInfoEnabled; - }; - - this.$get = [ - '$injector', '$interpolate', '$exceptionHandler', '$templateRequest', '$parse', - '$controller', '$rootScope', '$sce', '$animate', '$$sanitizeUri', - function($injector, $interpolate, $exceptionHandler, $templateRequest, $parse, - $controller, $rootScope, $sce, $animate, $$sanitizeUri) { - - var SIMPLE_ATTR_NAME = /^\w/; - var specialAttrHolder = document.createElement('div'); - function Attributes(element, attributesToCopy) { - if (attributesToCopy) { - var keys = Object.keys(attributesToCopy); - var i, l, key; - - for (i = 0, l = keys.length; i < l; i++) { - key = keys[i]; - this[key] = attributesToCopy[key]; - } - } else { - this.$attr = {}; - } - - this.$$element = element; - } - - Attributes.prototype = { - /** - * @ngdoc method - * @name $compile.directive.Attributes#$normalize - * @kind function - * - * @description - * Converts an attribute name (e.g. dash/colon/underscore-delimited string, optionally prefixed with `x-` or - * `data-`) to its normalized, camelCase form. - * - * Also there is special case for Moz prefix starting with upper case letter. - * - * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives} - * - * @param {string} name Name to normalize - */ - $normalize: directiveNormalize, - - - /** - * @ngdoc method - * @name $compile.directive.Attributes#$addClass - * @kind function - * - * @description - * Adds the CSS class value specified by the classVal parameter to the element. If animations - * are enabled then an animation will be triggered for the class addition. - * - * @param {string} classVal The className value that will be added to the element - */ - $addClass: function(classVal) { - if (classVal && classVal.length > 0) { - $animate.addClass(this.$$element, classVal); - } - }, - - /** - * @ngdoc method - * @name $compile.directive.Attributes#$removeClass - * @kind function - * - * @description - * Removes the CSS class value specified by the classVal parameter from the element. If - * animations are enabled then an animation will be triggered for the class removal. - * - * @param {string} classVal The className value that will be removed from the element - */ - $removeClass: function(classVal) { - if (classVal && classVal.length > 0) { - $animate.removeClass(this.$$element, classVal); - } - }, - - /** - * @ngdoc method - * @name $compile.directive.Attributes#$updateClass - * @kind function - * - * @description - * Adds and removes the appropriate CSS class values to the element based on the difference - * between the new and old CSS class values (specified as newClasses and oldClasses). - * - * @param {string} newClasses The current CSS className value - * @param {string} oldClasses The former CSS className value - */ - $updateClass: function(newClasses, oldClasses) { - var toAdd = tokenDifference(newClasses, oldClasses); - if (toAdd && toAdd.length) { - $animate.addClass(this.$$element, toAdd); - } - - var toRemove = tokenDifference(oldClasses, newClasses); - if (toRemove && toRemove.length) { - $animate.removeClass(this.$$element, toRemove); - } - }, - - /** - * Set a normalized attribute on the element in a way such that all directives - * can share the attribute. This function properly handles boolean attributes. - * @param {string} key Normalized key. (ie ngAttribute) - * @param {string|boolean} value The value to set. If `null` attribute will be deleted. - * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute. - * Defaults to true. - * @param {string=} attrName Optional none normalized name. Defaults to key. - */ - $set: function(key, value, writeAttr, attrName) { - // TODO: decide whether or not to throw an error if "class" - //is set through this function since it may cause $updateClass to - //become unstable. - - var node = this.$$element[0], - booleanKey = getBooleanAttrName(node, key), - aliasedKey = getAliasedAttrName(key), - observer = key, - nodeName; - - if (booleanKey) { - this.$$element.prop(key, value); - attrName = booleanKey; - } else if (aliasedKey) { - this[aliasedKey] = value; - observer = aliasedKey; - } - - this[key] = value; - - // translate normalized key to actual key - if (attrName) { - this.$attr[key] = attrName; - } else { - attrName = this.$attr[key]; - if (!attrName) { - this.$attr[key] = attrName = snake_case(key, '-'); - } - } - - nodeName = nodeName_(this.$$element); - - if ((nodeName === 'a' && (key === 'href' || key === 'xlinkHref')) || - (nodeName === 'img' && key === 'src')) { - // sanitize a[href] and img[src] values - this[key] = value = $$sanitizeUri(value, key === 'src'); - } else if (nodeName === 'img' && key === 'srcset') { - // sanitize img[srcset] values - var result = ""; - - // first check if there are spaces because it's not the same pattern - var trimmedSrcset = trim(value); - // ( 999x ,| 999w ,| ,|, ) - var srcPattern = /(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/; - var pattern = /\s/.test(trimmedSrcset) ? srcPattern : /(,)/; - - // split srcset into tuple of uri and descriptor except for the last item - var rawUris = trimmedSrcset.split(pattern); - - // for each tuples - var nbrUrisWith2parts = Math.floor(rawUris.length / 2); - for (var i = 0; i < nbrUrisWith2parts; i++) { - var innerIdx = i * 2; - // sanitize the uri - result += $$sanitizeUri(trim(rawUris[innerIdx]), true); - // add the descriptor - result += (" " + trim(rawUris[innerIdx + 1])); - } - - // split the last item into uri and descriptor - var lastTuple = trim(rawUris[i * 2]).split(/\s/); - - // sanitize the last uri - result += $$sanitizeUri(trim(lastTuple[0]), true); - - // and add the last descriptor if any - if (lastTuple.length === 2) { - result += (" " + trim(lastTuple[1])); - } - this[key] = value = result; - } - - if (writeAttr !== false) { - if (value === null || isUndefined(value)) { - this.$$element.removeAttr(attrName); - } else { - if (SIMPLE_ATTR_NAME.test(attrName)) { - this.$$element.attr(attrName, value); - } else { - setSpecialAttr(this.$$element[0], attrName, value); - } - } - } - - // fire observers - var $$observers = this.$$observers; - $$observers && forEach($$observers[observer], function(fn) { - try { - fn(value); - } catch (e) { - $exceptionHandler(e); - } - }); - }, - - - /** - * @ngdoc method - * @name $compile.directive.Attributes#$observe - * @kind function - * - * @description - * Observes an interpolated attribute. - * - * The observer function will be invoked once during the next `$digest` following - * compilation. The observer is then invoked whenever the interpolated value - * changes. - * - * @param {string} key Normalized key. (ie ngAttribute) . - * @param {function(interpolatedValue)} fn Function that will be called whenever - the interpolated value of the attribute changes. - * See the {@link guide/interpolation#how-text-and-attribute-bindings-work Interpolation - * guide} for more info. - * @returns {function()} Returns a deregistration function for this observer. - */ - $observe: function(key, fn) { - var attrs = this, - $$observers = (attrs.$$observers || (attrs.$$observers = createMap())), - listeners = ($$observers[key] || ($$observers[key] = [])); - - listeners.push(fn); - $rootScope.$evalAsync(function() { - if (!listeners.$$inter && attrs.hasOwnProperty(key) && !isUndefined(attrs[key])) { - // no one registered attribute interpolation function, so lets call it manually - fn(attrs[key]); - } - }); - - return function() { - arrayRemove(listeners, fn); - }; - } - }; - - function setSpecialAttr(element, attrName, value) { - // Attributes names that do not start with letters (such as `(click)`) cannot be set using `setAttribute` - // so we have to jump through some hoops to get such an attribute - // https://github.com/angular/angular.js/pull/13318 - specialAttrHolder.innerHTML = ""; - var attributes = specialAttrHolder.firstChild.attributes; - var attribute = attributes[0]; - // We have to remove the attribute from its container element before we can add it to the destination element - attributes.removeNamedItem(attribute.name); - attribute.value = value; - element.attributes.setNamedItem(attribute); - } - - function safeAddClass($element, className) { - try { - $element.addClass(className); - } catch (e) { - // ignore, since it means that we are trying to set class on - // SVG element, where class name is read-only. - } - } - - - var startSymbol = $interpolate.startSymbol(), - endSymbol = $interpolate.endSymbol(), - denormalizeTemplate = (startSymbol == '{{' && endSymbol == '}}') - ? identity - : function denormalizeTemplate(template) { - return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol); - }, - NG_ATTR_BINDING = /^ngAttr[A-Z]/; - var MULTI_ELEMENT_DIR_RE = /^(.+)Start$/; - - compile.$$addBindingInfo = debugInfoEnabled ? function $$addBindingInfo($element, binding) { - var bindings = $element.data('$binding') || []; - - if (isArray(binding)) { - bindings = bindings.concat(binding); - } else { - bindings.push(binding); - } - - $element.data('$binding', bindings); - } : noop; - - compile.$$addBindingClass = debugInfoEnabled ? function $$addBindingClass($element) { - safeAddClass($element, 'ng-binding'); - } : noop; - - compile.$$addScopeInfo = debugInfoEnabled ? function $$addScopeInfo($element, scope, isolated, noTemplate) { - var dataName = isolated ? (noTemplate ? '$isolateScopeNoTemplate' : '$isolateScope') : '$scope'; - $element.data(dataName, scope); - } : noop; - - compile.$$addScopeClass = debugInfoEnabled ? function $$addScopeClass($element, isolated) { - safeAddClass($element, isolated ? 'ng-isolate-scope' : 'ng-scope'); - } : noop; - - compile.$$createComment = function(directiveName, comment) { - var content = ''; - if (debugInfoEnabled) { - content = ' ' + (directiveName || '') + ': ' + (comment || '') + ' '; - } - return document.createComment(content); - }; - - return compile; - - //================================ - - function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, - previousCompileContext) { - if (!($compileNodes instanceof jqLite)) { - // jquery always rewraps, whereas we need to preserve the original selector so that we can - // modify it. - $compileNodes = jqLite($compileNodes); - } - - var NOT_EMPTY = /\S+/; - - // We can not compile top level text elements since text nodes can be merged and we will - // not be able to attach scope data to them, so we will wrap them in - for (var i = 0, len = $compileNodes.length; i < len; i++) { - var domNode = $compileNodes[i]; - - if (domNode.nodeType === NODE_TYPE_TEXT && domNode.nodeValue.match(NOT_EMPTY) /* non-empty */) { - jqLiteWrapNode(domNode, $compileNodes[i] = document.createElement('span')); - } - } - - var compositeLinkFn = - compileNodes($compileNodes, transcludeFn, $compileNodes, - maxPriority, ignoreDirective, previousCompileContext); - compile.$$addScopeClass($compileNodes); - var namespace = null; - return function publicLinkFn(scope, cloneConnectFn, options) { - assertArg(scope, 'scope'); - - if (previousCompileContext && previousCompileContext.needsNewScope) { - // A parent directive did a replace and a directive on this element asked - // for transclusion, which caused us to lose a layer of element on which - // we could hold the new transclusion scope, so we will create it manually - // here. - scope = scope.$parent.$new(); - } - - options = options || {}; - var parentBoundTranscludeFn = options.parentBoundTranscludeFn, - transcludeControllers = options.transcludeControllers, - futureParentElement = options.futureParentElement; - - // When `parentBoundTranscludeFn` is passed, it is a - // `controllersBoundTransclude` function (it was previously passed - // as `transclude` to directive.link) so we must unwrap it to get - // its `boundTranscludeFn` - if (parentBoundTranscludeFn && parentBoundTranscludeFn.$$boundTransclude) { - parentBoundTranscludeFn = parentBoundTranscludeFn.$$boundTransclude; - } - - if (!namespace) { - namespace = detectNamespaceForChildElements(futureParentElement); - } - var $linkNode; - if (namespace !== 'html') { - // When using a directive with replace:true and templateUrl the $compileNodes - // (or a child element inside of them) - // might change, so we need to recreate the namespace adapted compileNodes - // for call to the link function. - // Note: This will already clone the nodes... - $linkNode = jqLite( - wrapTemplate(namespace, jqLite('
                                        ').append($compileNodes).html()) - ); - } else if (cloneConnectFn) { - // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart - // and sometimes changes the structure of the DOM. - $linkNode = JQLitePrototype.clone.call($compileNodes); - } else { - $linkNode = $compileNodes; - } - - if (transcludeControllers) { - for (var controllerName in transcludeControllers) { - $linkNode.data('$' + controllerName + 'Controller', transcludeControllers[controllerName].instance); - } - } - - compile.$$addScopeInfo($linkNode, scope); - - if (cloneConnectFn) cloneConnectFn($linkNode, scope); - if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn); - return $linkNode; - }; - } - - function detectNamespaceForChildElements(parentElement) { - // TODO: Make this detect MathML as well... - var node = parentElement && parentElement[0]; - if (!node) { - return 'html'; - } else { - return nodeName_(node) !== 'foreignobject' && toString.call(node).match(/SVG/) ? 'svg' : 'html'; - } - } - - /** - * Compile function matches each node in nodeList against the directives. Once all directives - * for a particular node are collected their compile functions are executed. The compile - * functions return values - the linking functions - are combined into a composite linking - * function, which is the a linking function for the node. - * - * @param {NodeList} nodeList an array of nodes or NodeList to compile - * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the - * scope argument is auto-generated to the new child of the transcluded parent scope. - * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then - * the rootElement must be set the jqLite collection of the compile root. This is - * needed so that the jqLite collection items can be replaced with widgets. - * @param {number=} maxPriority Max directive priority. - * @returns {Function} A composite linking function of all of the matched directives or null. - */ - function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective, - previousCompileContext) { - var linkFns = [], - attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound; - - for (var i = 0; i < nodeList.length; i++) { - attrs = new Attributes(); - - // we must always refer to nodeList[i] since the nodes can be replaced underneath us. - directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined, - ignoreDirective); - - nodeLinkFn = (directives.length) - ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement, - null, [], [], previousCompileContext) - : null; - - if (nodeLinkFn && nodeLinkFn.scope) { - compile.$$addScopeClass(attrs.$$element); - } - - childLinkFn = (nodeLinkFn && nodeLinkFn.terminal || - !(childNodes = nodeList[i].childNodes) || - !childNodes.length) - ? null - : compileNodes(childNodes, - nodeLinkFn ? ( - (nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement) - && nodeLinkFn.transclude) : transcludeFn); - - if (nodeLinkFn || childLinkFn) { - linkFns.push(i, nodeLinkFn, childLinkFn); - linkFnFound = true; - nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn; - } - - //use the previous context only for the first element in the virtual group - previousCompileContext = null; - } - - // return a linking function if we have found anything, null otherwise - return linkFnFound ? compositeLinkFn : null; - - function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) { - var nodeLinkFn, childLinkFn, node, childScope, i, ii, idx, childBoundTranscludeFn; - var stableNodeList; - - - if (nodeLinkFnFound) { - // copy nodeList so that if a nodeLinkFn removes or adds an element at this DOM level our - // offsets don't get screwed up - var nodeListLength = nodeList.length; - stableNodeList = new Array(nodeListLength); - - // create a sparse array by only copying the elements which have a linkFn - for (i = 0; i < linkFns.length; i+=3) { - idx = linkFns[i]; - stableNodeList[idx] = nodeList[idx]; - } - } else { - stableNodeList = nodeList; - } - - for (i = 0, ii = linkFns.length; i < ii;) { - node = stableNodeList[linkFns[i++]]; - nodeLinkFn = linkFns[i++]; - childLinkFn = linkFns[i++]; - - if (nodeLinkFn) { - if (nodeLinkFn.scope) { - childScope = scope.$new(); - compile.$$addScopeInfo(jqLite(node), childScope); - } else { - childScope = scope; - } - - if (nodeLinkFn.transcludeOnThisElement) { - childBoundTranscludeFn = createBoundTranscludeFn( - scope, nodeLinkFn.transclude, parentBoundTranscludeFn); - - } else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) { - childBoundTranscludeFn = parentBoundTranscludeFn; - - } else if (!parentBoundTranscludeFn && transcludeFn) { - childBoundTranscludeFn = createBoundTranscludeFn(scope, transcludeFn); - - } else { - childBoundTranscludeFn = null; - } - - nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn); - - } else if (childLinkFn) { - childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn); - } - } - } - } - - function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) { - function boundTranscludeFn(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) { - - if (!transcludedScope) { - transcludedScope = scope.$new(false, containingScope); - transcludedScope.$$transcluded = true; - } - - return transcludeFn(transcludedScope, cloneFn, { - parentBoundTranscludeFn: previousBoundTranscludeFn, - transcludeControllers: controllers, - futureParentElement: futureParentElement - }); - } - - // We need to attach the transclusion slots onto the `boundTranscludeFn` - // so that they are available inside the `controllersBoundTransclude` function - var boundSlots = boundTranscludeFn.$$slots = createMap(); - for (var slotName in transcludeFn.$$slots) { - if (transcludeFn.$$slots[slotName]) { - boundSlots[slotName] = createBoundTranscludeFn(scope, transcludeFn.$$slots[slotName], previousBoundTranscludeFn); - } else { - boundSlots[slotName] = null; - } - } - - return boundTranscludeFn; - } - - /** - * Looks for directives on the given node and adds them to the directive collection which is - * sorted. - * - * @param node Node to search. - * @param directives An array to which the directives are added to. This array is sorted before - * the function returns. - * @param attrs The shared attrs object which is used to populate the normalized attributes. - * @param {number=} maxPriority Max directive priority. - */ - function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) { - var nodeType = node.nodeType, - attrsMap = attrs.$attr, - match, - className; - - switch (nodeType) { - case NODE_TYPE_ELEMENT: /* Element */ - // use the node name: - addDirective(directives, - directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective); - - // iterate over the attributes - for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes, - j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) { - var attrStartName = false; - var attrEndName = false; - - attr = nAttrs[j]; - name = attr.name; - value = trim(attr.value); - - // support ngAttr attribute binding - ngAttrName = directiveNormalize(name); - if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) { - name = name.replace(PREFIX_REGEXP, '') - .substr(8).replace(/_(.)/g, function(match, letter) { - return letter.toUpperCase(); - }); - } - - var multiElementMatch = ngAttrName.match(MULTI_ELEMENT_DIR_RE); - if (multiElementMatch && directiveIsMultiElement(multiElementMatch[1])) { - attrStartName = name; - attrEndName = name.substr(0, name.length - 5) + 'end'; - name = name.substr(0, name.length - 6); - } - - nName = directiveNormalize(name.toLowerCase()); - attrsMap[nName] = name; - if (isNgAttr || !attrs.hasOwnProperty(nName)) { - attrs[nName] = value; - if (getBooleanAttrName(node, nName)) { - attrs[nName] = true; // presence means true - } - } - addAttrInterpolateDirective(node, directives, value, nName, isNgAttr); - addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName, - attrEndName); - } - - // use class as directive - className = node.className; - if (isObject(className)) { - // Maybe SVGAnimatedString - className = className.animVal; - } - if (isString(className) && className !== '') { - while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) { - nName = directiveNormalize(match[2]); - if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) { - attrs[nName] = trim(match[3]); - } - className = className.substr(match.index + match[0].length); - } - } - break; - case NODE_TYPE_TEXT: /* Text Node */ - if (msie === 11) { - // Workaround for #11781 - while (node.parentNode && node.nextSibling && node.nextSibling.nodeType === NODE_TYPE_TEXT) { - node.nodeValue = node.nodeValue + node.nextSibling.nodeValue; - node.parentNode.removeChild(node.nextSibling); - } - } - addTextInterpolateDirective(directives, node.nodeValue); - break; - case NODE_TYPE_COMMENT: /* Comment */ - try { - match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue); - if (match) { - nName = directiveNormalize(match[1]); - if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) { - attrs[nName] = trim(match[2]); - } - } - } catch (e) { - // turns out that under some circumstances IE9 throws errors when one attempts to read - // comment's node value. - // Just ignore it and continue. (Can't seem to reproduce in test case.) - } - break; - } - - directives.sort(byPriority); - return directives; - } - - /** - * Given a node with an directive-start it collects all of the siblings until it finds - * directive-end. - * @param node - * @param attrStart - * @param attrEnd - * @returns {*} - */ - function groupScan(node, attrStart, attrEnd) { - var nodes = []; - var depth = 0; - if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) { - do { - if (!node) { - throw $compileMinErr('uterdir', - "Unterminated attribute, found '{0}' but no matching '{1}' found.", - attrStart, attrEnd); - } - if (node.nodeType == NODE_TYPE_ELEMENT) { - if (node.hasAttribute(attrStart)) depth++; - if (node.hasAttribute(attrEnd)) depth--; - } - nodes.push(node); - node = node.nextSibling; - } while (depth > 0); - } else { - nodes.push(node); - } - - return jqLite(nodes); - } - - /** - * Wrapper for linking function which converts normal linking function into a grouped - * linking function. - * @param linkFn - * @param attrStart - * @param attrEnd - * @returns {Function} - */ - function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) { - return function groupedElementsLink(scope, element, attrs, controllers, transcludeFn) { - element = groupScan(element[0], attrStart, attrEnd); - return linkFn(scope, element, attrs, controllers, transcludeFn); - }; - } - - /** - * A function generator that is used to support both eager and lazy compilation - * linking function. - * @param eager - * @param $compileNodes - * @param transcludeFn - * @param maxPriority - * @param ignoreDirective - * @param previousCompileContext - * @returns {Function} - */ - function compilationGenerator(eager, $compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext) { - var compiled; - - if (eager) { - return compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext); - } - return function lazyCompilation() { - if (!compiled) { - compiled = compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext); - - // Null out all of these references in order to make them eligible for garbage collection - // since this is a potentially long lived closure - $compileNodes = transcludeFn = previousCompileContext = null; - } - return compiled.apply(this, arguments); - }; - } - - /** - * Once the directives have been collected, their compile functions are executed. This method - * is responsible for inlining directive templates as well as terminating the application - * of the directives if the terminal directive has been reached. - * - * @param {Array} directives Array of collected directives to execute their compile function. - * this needs to be pre-sorted by priority order. - * @param {Node} compileNode The raw DOM node to apply the compile functions to - * @param {Object} templateAttrs The shared attribute function - * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the - * scope argument is auto-generated to the new - * child of the transcluded parent scope. - * @param {JQLite} jqCollection If we are working on the root of the compile tree then this - * argument has the root jqLite array so that we can replace nodes - * on it. - * @param {Object=} originalReplaceDirective An optional directive that will be ignored when - * compiling the transclusion. - * @param {Array.} preLinkFns - * @param {Array.} postLinkFns - * @param {Object} previousCompileContext Context used for previous compilation of the current - * node - * @returns {Function} linkFn - */ - function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, - jqCollection, originalReplaceDirective, preLinkFns, postLinkFns, - previousCompileContext) { - previousCompileContext = previousCompileContext || {}; - - var terminalPriority = -Number.MAX_VALUE, - newScopeDirective = previousCompileContext.newScopeDirective, - controllerDirectives = previousCompileContext.controllerDirectives, - newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective, - templateDirective = previousCompileContext.templateDirective, - nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective, - hasTranscludeDirective = false, - hasTemplate = false, - hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective, - $compileNode = templateAttrs.$$element = jqLite(compileNode), - directive, - directiveName, - $template, - replaceDirective = originalReplaceDirective, - childTranscludeFn = transcludeFn, - linkFn, - didScanForMultipleTransclusion = false, - mightHaveMultipleTransclusionError = false, - directiveValue; - - // executes all directives on the current element - for (var i = 0, ii = directives.length; i < ii; i++) { - directive = directives[i]; - var attrStart = directive.$$start; - var attrEnd = directive.$$end; - - // collect multiblock sections - if (attrStart) { - $compileNode = groupScan(compileNode, attrStart, attrEnd); - } - $template = undefined; - - if (terminalPriority > directive.priority) { - break; // prevent further processing of directives - } - - if (directiveValue = directive.scope) { - - // skip the check for directives with async templates, we'll check the derived sync - // directive when the template arrives - if (!directive.templateUrl) { - if (isObject(directiveValue)) { - // This directive is trying to add an isolated scope. - // Check that there is no scope of any kind already - assertNoDuplicate('new/isolated scope', newIsolateScopeDirective || newScopeDirective, - directive, $compileNode); - newIsolateScopeDirective = directive; - } else { - // This directive is trying to add a child scope. - // Check that there is no isolated scope already - assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive, - $compileNode); - } - } - - newScopeDirective = newScopeDirective || directive; - } - - directiveName = directive.name; - - // If we encounter a condition that can result in transclusion on the directive, - // then scan ahead in the remaining directives for others that may cause a multiple - // transclusion error to be thrown during the compilation process. If a matching directive - // is found, then we know that when we encounter a transcluded directive, we need to eagerly - // compile the `transclude` function rather than doing it lazily in order to throw - // exceptions at the correct time - if (!didScanForMultipleTransclusion && ((directive.replace && (directive.templateUrl || directive.template)) - || (directive.transclude && !directive.$$tlb))) { - var candidateDirective; - - for (var scanningIndex = i + 1; candidateDirective = directives[scanningIndex++];) { - if ((candidateDirective.transclude && !candidateDirective.$$tlb) - || (candidateDirective.replace && (candidateDirective.templateUrl || candidateDirective.template))) { - mightHaveMultipleTransclusionError = true; - break; - } - } - - didScanForMultipleTransclusion = true; - } - - if (!directive.templateUrl && directive.controller) { - directiveValue = directive.controller; - controllerDirectives = controllerDirectives || createMap(); - assertNoDuplicate("'" + directiveName + "' controller", - controllerDirectives[directiveName], directive, $compileNode); - controllerDirectives[directiveName] = directive; - } - - if (directiveValue = directive.transclude) { - hasTranscludeDirective = true; - - // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion. - // This option should only be used by directives that know how to safely handle element transclusion, - // where the transcluded nodes are added or replaced after linking. - if (!directive.$$tlb) { - assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode); - nonTlbTranscludeDirective = directive; - } - - if (directiveValue == 'element') { - hasElementTranscludeDirective = true; - terminalPriority = directive.priority; - $template = $compileNode; - $compileNode = templateAttrs.$$element = - jqLite(compile.$$createComment(directiveName, templateAttrs[directiveName])); - compileNode = $compileNode[0]; - replaceWith(jqCollection, sliceArgs($template), compileNode); - - childTranscludeFn = compilationGenerator(mightHaveMultipleTransclusionError, $template, transcludeFn, terminalPriority, - replaceDirective && replaceDirective.name, { - // Don't pass in: - // - controllerDirectives - otherwise we'll create duplicates controllers - // - newIsolateScopeDirective or templateDirective - combining templates with - // element transclusion doesn't make sense. - // - // We need only nonTlbTranscludeDirective so that we prevent putting transclusion - // on the same element more than once. - nonTlbTranscludeDirective: nonTlbTranscludeDirective - }); - } else { - - var slots = createMap(); - - $template = jqLite(jqLiteClone(compileNode)).contents(); - - if (isObject(directiveValue)) { - - // We have transclusion slots, - // collect them up, compile them and store their transclusion functions - $template = []; - - var slotMap = createMap(); - var filledSlots = createMap(); - - // Parse the element selectors - forEach(directiveValue, function(elementSelector, slotName) { - // If an element selector starts with a ? then it is optional - var optional = (elementSelector.charAt(0) === '?'); - elementSelector = optional ? elementSelector.substring(1) : elementSelector; - - slotMap[elementSelector] = slotName; - - // We explicitly assign `null` since this implies that a slot was defined but not filled. - // Later when calling boundTransclusion functions with a slot name we only error if the - // slot is `undefined` - slots[slotName] = null; - - // filledSlots contains `true` for all slots that are either optional or have been - // filled. This is used to check that we have not missed any required slots - filledSlots[slotName] = optional; - }); - - // Add the matching elements into their slot - forEach($compileNode.contents(), function(node) { - var slotName = slotMap[directiveNormalize(nodeName_(node))]; - if (slotName) { - filledSlots[slotName] = true; - slots[slotName] = slots[slotName] || []; - slots[slotName].push(node); - } else { - $template.push(node); - } - }); - - // Check for required slots that were not filled - forEach(filledSlots, function(filled, slotName) { - if (!filled) { - throw $compileMinErr('reqslot', 'Required transclusion slot `{0}` was not filled.', slotName); - } - }); - - for (var slotName in slots) { - if (slots[slotName]) { - // Only define a transclusion function if the slot was filled - slots[slotName] = compilationGenerator(mightHaveMultipleTransclusionError, slots[slotName], transcludeFn); - } - } - } - - $compileNode.empty(); // clear contents - childTranscludeFn = compilationGenerator(mightHaveMultipleTransclusionError, $template, transcludeFn, undefined, - undefined, { needsNewScope: directive.$$isolateScope || directive.$$newScope}); - childTranscludeFn.$$slots = slots; - } - } - - if (directive.template) { - hasTemplate = true; - assertNoDuplicate('template', templateDirective, directive, $compileNode); - templateDirective = directive; - - directiveValue = (isFunction(directive.template)) - ? directive.template($compileNode, templateAttrs) - : directive.template; - - directiveValue = denormalizeTemplate(directiveValue); - - if (directive.replace) { - replaceDirective = directive; - if (jqLiteIsTextNode(directiveValue)) { - $template = []; - } else { - $template = removeComments(wrapTemplate(directive.templateNamespace, trim(directiveValue))); - } - compileNode = $template[0]; - - if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { - throw $compileMinErr('tplrt', - "Template for directive '{0}' must have exactly one root element. {1}", - directiveName, ''); - } - - replaceWith(jqCollection, $compileNode, compileNode); - - var newTemplateAttrs = {$attr: {}}; - - // combine directives from the original node and from the template: - // - take the array of directives for this element - // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed) - // - collect directives from the template and sort them by priority - // - combine directives as: processed + template + unprocessed - var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs); - var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1)); - - if (newIsolateScopeDirective || newScopeDirective) { - // The original directive caused the current element to be replaced but this element - // also needs to have a new scope, so we need to tell the template directives - // that they would need to get their scope from further up, if they require transclusion - markDirectiveScope(templateDirectives, newIsolateScopeDirective, newScopeDirective); - } - directives = directives.concat(templateDirectives).concat(unprocessedDirectives); - mergeTemplateAttributes(templateAttrs, newTemplateAttrs); - - ii = directives.length; - } else { - $compileNode.html(directiveValue); - } - } - - if (directive.templateUrl) { - hasTemplate = true; - assertNoDuplicate('template', templateDirective, directive, $compileNode); - templateDirective = directive; - - if (directive.replace) { - replaceDirective = directive; - } - - nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode, - templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, { - controllerDirectives: controllerDirectives, - newScopeDirective: (newScopeDirective !== directive) && newScopeDirective, - newIsolateScopeDirective: newIsolateScopeDirective, - templateDirective: templateDirective, - nonTlbTranscludeDirective: nonTlbTranscludeDirective - }); - ii = directives.length; - } else if (directive.compile) { - try { - linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn); - if (isFunction(linkFn)) { - addLinkFns(null, linkFn, attrStart, attrEnd); - } else if (linkFn) { - addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd); - } - } catch (e) { - $exceptionHandler(e, startingTag($compileNode)); - } - } - - if (directive.terminal) { - nodeLinkFn.terminal = true; - terminalPriority = Math.max(terminalPriority, directive.priority); - } - - } - - nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true; - nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective; - nodeLinkFn.templateOnThisElement = hasTemplate; - nodeLinkFn.transclude = childTranscludeFn; - - previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective; - - // might be normal or delayed nodeLinkFn depending on if templateUrl is present - return nodeLinkFn; - - //////////////////// - - function addLinkFns(pre, post, attrStart, attrEnd) { - if (pre) { - if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd); - pre.require = directive.require; - pre.directiveName = directiveName; - if (newIsolateScopeDirective === directive || directive.$$isolateScope) { - pre = cloneAndAnnotateFn(pre, {isolateScope: true}); - } - preLinkFns.push(pre); - } - if (post) { - if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd); - post.require = directive.require; - post.directiveName = directiveName; - if (newIsolateScopeDirective === directive || directive.$$isolateScope) { - post = cloneAndAnnotateFn(post, {isolateScope: true}); - } - postLinkFns.push(post); - } - } - - function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) { - var i, ii, linkFn, isolateScope, controllerScope, elementControllers, transcludeFn, $element, - attrs, removeScopeBindingWatches, removeControllerBindingWatches; - - if (compileNode === linkNode) { - attrs = templateAttrs; - $element = templateAttrs.$$element; - } else { - $element = jqLite(linkNode); - attrs = new Attributes($element, templateAttrs); - } - - controllerScope = scope; - if (newIsolateScopeDirective) { - isolateScope = scope.$new(true); - } else if (newScopeDirective) { - controllerScope = scope.$parent; - } - - if (boundTranscludeFn) { - // track `boundTranscludeFn` so it can be unwrapped if `transcludeFn` - // is later passed as `parentBoundTranscludeFn` to `publicLinkFn` - transcludeFn = controllersBoundTransclude; - transcludeFn.$$boundTransclude = boundTranscludeFn; - // expose the slots on the `$transclude` function - transcludeFn.isSlotFilled = function(slotName) { - return !!boundTranscludeFn.$$slots[slotName]; - }; - } - - if (controllerDirectives) { - elementControllers = setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope, newIsolateScopeDirective); - } - - if (newIsolateScopeDirective) { - // Initialize isolate scope bindings for new isolate scope directive. - compile.$$addScopeInfo($element, isolateScope, true, !(templateDirective && (templateDirective === newIsolateScopeDirective || - templateDirective === newIsolateScopeDirective.$$originalDirective))); - compile.$$addScopeClass($element, true); - isolateScope.$$isolateBindings = - newIsolateScopeDirective.$$isolateBindings; - removeScopeBindingWatches = initializeDirectiveBindings(scope, attrs, isolateScope, - isolateScope.$$isolateBindings, - newIsolateScopeDirective); - if (removeScopeBindingWatches) { - isolateScope.$on('$destroy', removeScopeBindingWatches); - } - } - - // Initialize bindToController bindings - for (var name in elementControllers) { - var controllerDirective = controllerDirectives[name]; - var controller = elementControllers[name]; - var bindings = controllerDirective.$$bindings.bindToController; - - if (controller.identifier && bindings) { - removeControllerBindingWatches = - initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective); - } - - var controllerResult = controller(); - if (controllerResult !== controller.instance) { - // If the controller constructor has a return value, overwrite the instance - // from setupControllers - controller.instance = controllerResult; - $element.data('$' + controllerDirective.name + 'Controller', controllerResult); - removeControllerBindingWatches && removeControllerBindingWatches(); - removeControllerBindingWatches = - initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective); - } - } - - // Bind the required controllers to the controller, if `require` is an object and `bindToController` is truthy - forEach(controllerDirectives, function(controllerDirective, name) { - var require = controllerDirective.require; - if (controllerDirective.bindToController && !isArray(require) && isObject(require)) { - extend(elementControllers[name].instance, getControllers(name, require, $element, elementControllers)); - } - }); - - // Trigger the `$onInit` method on all controllers that have one - forEach(elementControllers, function(controller) { - if (isFunction(controller.instance.$onInit)) { - controller.instance.$onInit(); - } - }); - - // PRELINKING - for (i = 0, ii = preLinkFns.length; i < ii; i++) { - linkFn = preLinkFns[i]; - invokeLinkFn(linkFn, - linkFn.isolateScope ? isolateScope : scope, - $element, - attrs, - linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), - transcludeFn - ); - } - - // RECURSION - // We only pass the isolate scope, if the isolate directive has a template, - // otherwise the child elements do not belong to the isolate directive. - var scopeToChild = scope; - if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) { - scopeToChild = isolateScope; - } - childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn); - - // POSTLINKING - for (i = postLinkFns.length - 1; i >= 0; i--) { - linkFn = postLinkFns[i]; - invokeLinkFn(linkFn, - linkFn.isolateScope ? isolateScope : scope, - $element, - attrs, - linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), - transcludeFn - ); - } - - // This is the function that is injected as `$transclude`. - // Note: all arguments are optional! - function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement, slotName) { - var transcludeControllers; - // No scope passed in: - if (!isScope(scope)) { - slotName = futureParentElement; - futureParentElement = cloneAttachFn; - cloneAttachFn = scope; - scope = undefined; - } - - if (hasElementTranscludeDirective) { - transcludeControllers = elementControllers; - } - if (!futureParentElement) { - futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element; - } - if (slotName) { - // slotTranscludeFn can be one of three things: - // * a transclude function - a filled slot - // * `null` - an optional slot that was not filled - // * `undefined` - a slot that was not declared (i.e. invalid) - var slotTranscludeFn = boundTranscludeFn.$$slots[slotName]; - if (slotTranscludeFn) { - return slotTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild); - } else if (isUndefined(slotTranscludeFn)) { - throw $compileMinErr('noslot', - 'No parent directive that requires a transclusion with slot name "{0}". ' + - 'Element: {1}', - slotName, startingTag($element)); - } - } else { - return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild); - } - } - } - } - - function getControllers(directiveName, require, $element, elementControllers) { - var value; - - if (isString(require)) { - var match = require.match(REQUIRE_PREFIX_REGEXP); - var name = require.substring(match[0].length); - var inheritType = match[1] || match[3]; - var optional = match[2] === '?'; - - //If only parents then start at the parent element - if (inheritType === '^^') { - $element = $element.parent(); - //Otherwise attempt getting the controller from elementControllers in case - //the element is transcluded (and has no data) and to avoid .data if possible - } else { - value = elementControllers && elementControllers[name]; - value = value && value.instance; - } - - if (!value) { - var dataName = '$' + name + 'Controller'; - value = inheritType ? $element.inheritedData(dataName) : $element.data(dataName); - } - - if (!value && !optional) { - throw $compileMinErr('ctreq', - "Controller '{0}', required by directive '{1}', can't be found!", - name, directiveName); - } - } else if (isArray(require)) { - value = []; - for (var i = 0, ii = require.length; i < ii; i++) { - value[i] = getControllers(directiveName, require[i], $element, elementControllers); - } - } else if (isObject(require)) { - value = {}; - forEach(require, function(controller, property) { - value[property] = getControllers(directiveName, controller, $element, elementControllers); - }); - } - - return value || null; - } - - function setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope, newIsolateScopeDirective) { - var elementControllers = createMap(); - for (var controllerKey in controllerDirectives) { - var directive = controllerDirectives[controllerKey]; - var locals = { - $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope, - $element: $element, - $attrs: attrs, - $transclude: transcludeFn - }; - - var controller = directive.controller; - if (controller == '@') { - controller = attrs[directive.name]; - } - - var controllerInstance = $controller(controller, locals, true, directive.controllerAs); - - // For directives with element transclusion the element is a comment. - // In this case .data will not attach any data. - // Instead, we save the controllers for the element in a local hash and attach to .data - // later, once we have the actual element. - elementControllers[directive.name] = controllerInstance; - $element.data('$' + directive.name + 'Controller', controllerInstance.instance); - } - return elementControllers; - } - - // Depending upon the context in which a directive finds itself it might need to have a new isolated - // or child scope created. For instance: - // * if the directive has been pulled into a template because another directive with a higher priority - // asked for element transclusion - // * if the directive itself asks for transclusion but it is at the root of a template and the original - // element was replaced. See https://github.com/angular/angular.js/issues/12936 - function markDirectiveScope(directives, isolateScope, newScope) { - for (var j = 0, jj = directives.length; j < jj; j++) { - directives[j] = inherit(directives[j], {$$isolateScope: isolateScope, $$newScope: newScope}); - } - } - - /** - * looks up the directive and decorates it with exception handling and proper parameters. We - * call this the boundDirective. - * - * @param {string} name name of the directive to look up. - * @param {string} location The directive must be found in specific format. - * String containing any of theses characters: - * - * * `E`: element name - * * `A': attribute - * * `C`: class - * * `M`: comment - * @returns {boolean} true if directive was added. - */ - function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName, - endAttrName) { - if (name === ignoreDirective) return null; - var match = null; - if (hasDirectives.hasOwnProperty(name)) { - for (var directive, directives = $injector.get(name + Suffix), - i = 0, ii = directives.length; i < ii; i++) { - try { - directive = directives[i]; - if ((isUndefined(maxPriority) || maxPriority > directive.priority) && - directive.restrict.indexOf(location) != -1) { - if (startAttrName) { - directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName}); - } - if (!directive.$$bindings) { - var bindings = directive.$$bindings = - parseDirectiveBindings(directive, directive.name); - if (isObject(bindings.isolateScope)) { - directive.$$isolateBindings = bindings.isolateScope; - } - } - tDirectives.push(directive); - match = directive; - } - } catch (e) { $exceptionHandler(e); } - } - } - return match; - } - - - /** - * looks up the directive and returns true if it is a multi-element directive, - * and therefore requires DOM nodes between -start and -end markers to be grouped - * together. - * - * @param {string} name name of the directive to look up. - * @returns true if directive was registered as multi-element. - */ - function directiveIsMultiElement(name) { - if (hasDirectives.hasOwnProperty(name)) { - for (var directive, directives = $injector.get(name + Suffix), - i = 0, ii = directives.length; i < ii; i++) { - directive = directives[i]; - if (directive.multiElement) { - return true; - } - } - } - return false; - } - - /** - * When the element is replaced with HTML template then the new attributes - * on the template need to be merged with the existing attributes in the DOM. - * The desired effect is to have both of the attributes present. - * - * @param {object} dst destination attributes (original DOM) - * @param {object} src source attributes (from the directive template) - */ - function mergeTemplateAttributes(dst, src) { - var srcAttr = src.$attr, - dstAttr = dst.$attr, - $element = dst.$$element; - - // reapply the old attributes to the new element - forEach(dst, function(value, key) { - if (key.charAt(0) != '$') { - if (src[key] && src[key] !== value) { - value += (key === 'style' ? ';' : ' ') + src[key]; - } - dst.$set(key, value, true, srcAttr[key]); - } - }); - - // copy the new attributes on the old attrs object - forEach(src, function(value, key) { - if (key == 'class') { - safeAddClass($element, value); - dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value; - } else if (key == 'style') { - $element.attr('style', $element.attr('style') + ';' + value); - dst['style'] = (dst['style'] ? dst['style'] + ';' : '') + value; - // `dst` will never contain hasOwnProperty as DOM parser won't let it. - // You will get an "InvalidCharacterError: DOM Exception 5" error if you - // have an attribute like "has-own-property" or "data-has-own-property", etc. - } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) { - dst[key] = value; - dstAttr[key] = srcAttr[key]; - } - }); - } - - - function compileTemplateUrl(directives, $compileNode, tAttrs, - $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) { - var linkQueue = [], - afterTemplateNodeLinkFn, - afterTemplateChildLinkFn, - beforeTemplateCompileNode = $compileNode[0], - origAsyncDirective = directives.shift(), - derivedSyncDirective = inherit(origAsyncDirective, { - templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective - }), - templateUrl = (isFunction(origAsyncDirective.templateUrl)) - ? origAsyncDirective.templateUrl($compileNode, tAttrs) - : origAsyncDirective.templateUrl, - templateNamespace = origAsyncDirective.templateNamespace; - - $compileNode.empty(); - - $templateRequest(templateUrl) - .then(function(content) { - var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn; - - content = denormalizeTemplate(content); - - if (origAsyncDirective.replace) { - if (jqLiteIsTextNode(content)) { - $template = []; - } else { - $template = removeComments(wrapTemplate(templateNamespace, trim(content))); - } - compileNode = $template[0]; - - if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { - throw $compileMinErr('tplrt', - "Template for directive '{0}' must have exactly one root element. {1}", - origAsyncDirective.name, templateUrl); - } - - tempTemplateAttrs = {$attr: {}}; - replaceWith($rootElement, $compileNode, compileNode); - var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs); - - if (isObject(origAsyncDirective.scope)) { - // the original directive that caused the template to be loaded async required - // an isolate scope - markDirectiveScope(templateDirectives, true); - } - directives = templateDirectives.concat(directives); - mergeTemplateAttributes(tAttrs, tempTemplateAttrs); - } else { - compileNode = beforeTemplateCompileNode; - $compileNode.html(content); - } - - directives.unshift(derivedSyncDirective); - - afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs, - childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns, - previousCompileContext); - forEach($rootElement, function(node, i) { - if (node == compileNode) { - $rootElement[i] = $compileNode[0]; - } - }); - afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn); - - while (linkQueue.length) { - var scope = linkQueue.shift(), - beforeTemplateLinkNode = linkQueue.shift(), - linkRootElement = linkQueue.shift(), - boundTranscludeFn = linkQueue.shift(), - linkNode = $compileNode[0]; - - if (scope.$$destroyed) continue; - - if (beforeTemplateLinkNode !== beforeTemplateCompileNode) { - var oldClasses = beforeTemplateLinkNode.className; - - if (!(previousCompileContext.hasElementTranscludeDirective && - origAsyncDirective.replace)) { - // it was cloned therefore we have to clone as well. - linkNode = jqLiteClone(compileNode); - } - replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode); - - // Copy in CSS classes from original node - safeAddClass(jqLite(linkNode), oldClasses); - } - if (afterTemplateNodeLinkFn.transcludeOnThisElement) { - childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); - } else { - childBoundTranscludeFn = boundTranscludeFn; - } - afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, - childBoundTranscludeFn); - } - linkQueue = null; - }); - - return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) { - var childBoundTranscludeFn = boundTranscludeFn; - if (scope.$$destroyed) return; - if (linkQueue) { - linkQueue.push(scope, - node, - rootElement, - childBoundTranscludeFn); - } else { - if (afterTemplateNodeLinkFn.transcludeOnThisElement) { - childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); - } - afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn); - } - }; - } - - - /** - * Sorting function for bound directives. - */ - function byPriority(a, b) { - var diff = b.priority - a.priority; - if (diff !== 0) return diff; - if (a.name !== b.name) return (a.name < b.name) ? -1 : 1; - return a.index - b.index; - } - - function assertNoDuplicate(what, previousDirective, directive, element) { - - function wrapModuleNameIfDefined(moduleName) { - return moduleName ? - (' (module: ' + moduleName + ')') : - ''; - } - - if (previousDirective) { - throw $compileMinErr('multidir', 'Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}', - previousDirective.name, wrapModuleNameIfDefined(previousDirective.$$moduleName), - directive.name, wrapModuleNameIfDefined(directive.$$moduleName), what, startingTag(element)); - } - } - - - function addTextInterpolateDirective(directives, text) { - var interpolateFn = $interpolate(text, true); - if (interpolateFn) { - directives.push({ - priority: 0, - compile: function textInterpolateCompileFn(templateNode) { - var templateNodeParent = templateNode.parent(), - hasCompileParent = !!templateNodeParent.length; - - // When transcluding a template that has bindings in the root - // we don't have a parent and thus need to add the class during linking fn. - if (hasCompileParent) compile.$$addBindingClass(templateNodeParent); - - return function textInterpolateLinkFn(scope, node) { - var parent = node.parent(); - if (!hasCompileParent) compile.$$addBindingClass(parent); - compile.$$addBindingInfo(parent, interpolateFn.expressions); - scope.$watch(interpolateFn, function interpolateFnWatchAction(value) { - node[0].nodeValue = value; - }); - }; - } - }); - } - } - - - function wrapTemplate(type, template) { - type = lowercase(type || 'html'); - switch (type) { - case 'svg': - case 'math': - var wrapper = document.createElement('div'); - wrapper.innerHTML = '<' + type + '>' + template + ''; - return wrapper.childNodes[0].childNodes; - default: - return template; - } - } - - - function getTrustedContext(node, attrNormalizedName) { - if (attrNormalizedName == "srcdoc") { - return $sce.HTML; - } - var tag = nodeName_(node); - // maction[xlink:href] can source SVG. It's not limited to . - if (attrNormalizedName == "xlinkHref" || - (tag == "form" && attrNormalizedName == "action") || - (tag != "img" && (attrNormalizedName == "src" || - attrNormalizedName == "ngSrc"))) { - return $sce.RESOURCE_URL; - } - } - - - function addAttrInterpolateDirective(node, directives, value, name, allOrNothing) { - var trustedContext = getTrustedContext(node, name); - allOrNothing = ALL_OR_NOTHING_ATTRS[name] || allOrNothing; - - var interpolateFn = $interpolate(value, true, trustedContext, allOrNothing); - - // no interpolation found -> ignore - if (!interpolateFn) return; - - - if (name === "multiple" && nodeName_(node) === "select") { - throw $compileMinErr("selmulti", - "Binding to the 'multiple' attribute is not supported. Element: {0}", - startingTag(node)); - } - - directives.push({ - priority: 100, - compile: function() { - return { - pre: function attrInterpolatePreLinkFn(scope, element, attr) { - var $$observers = (attr.$$observers || (attr.$$observers = createMap())); - - if (EVENT_HANDLER_ATTR_REGEXP.test(name)) { - throw $compileMinErr('nodomevents', - "Interpolations for HTML DOM event attributes are disallowed. Please use the " + - "ng- versions (such as ng-click instead of onclick) instead."); - } - - // If the attribute has changed since last $interpolate()ed - var newValue = attr[name]; - if (newValue !== value) { - // we need to interpolate again since the attribute value has been updated - // (e.g. by another directive's compile function) - // ensure unset/empty values make interpolateFn falsy - interpolateFn = newValue && $interpolate(newValue, true, trustedContext, allOrNothing); - value = newValue; - } - - // if attribute was updated so that there is no interpolation going on we don't want to - // register any observers - if (!interpolateFn) return; - - // initialize attr object so that it's ready in case we need the value for isolate - // scope initialization, otherwise the value would not be available from isolate - // directive's linking fn during linking phase - attr[name] = interpolateFn(scope); - - ($$observers[name] || ($$observers[name] = [])).$$inter = true; - (attr.$$observers && attr.$$observers[name].$$scope || scope). - $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) { - //special case for class attribute addition + removal - //so that class changes can tap into the animation - //hooks provided by the $animate service. Be sure to - //skip animations when the first digest occurs (when - //both the new and the old values are the same) since - //the CSS classes are the non-interpolated values - if (name === 'class' && newValue != oldValue) { - attr.$updateClass(newValue, oldValue); - } else { - attr.$set(name, newValue); - } - }); - } - }; - } - }); - } - - - /** - * This is a special jqLite.replaceWith, which can replace items which - * have no parents, provided that the containing jqLite collection is provided. - * - * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes - * in the root of the tree. - * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep - * the shell, but replace its DOM node reference. - * @param {Node} newNode The new DOM node. - */ - function replaceWith($rootElement, elementsToRemove, newNode) { - var firstElementToRemove = elementsToRemove[0], - removeCount = elementsToRemove.length, - parent = firstElementToRemove.parentNode, - i, ii; - - if ($rootElement) { - for (i = 0, ii = $rootElement.length; i < ii; i++) { - if ($rootElement[i] == firstElementToRemove) { - $rootElement[i++] = newNode; - for (var j = i, j2 = j + removeCount - 1, - jj = $rootElement.length; - j < jj; j++, j2++) { - if (j2 < jj) { - $rootElement[j] = $rootElement[j2]; - } else { - delete $rootElement[j]; - } - } - $rootElement.length -= removeCount - 1; - - // If the replaced element is also the jQuery .context then replace it - // .context is a deprecated jQuery api, so we should set it only when jQuery set it - // http://api.jquery.com/context/ - if ($rootElement.context === firstElementToRemove) { - $rootElement.context = newNode; - } - break; - } - } - } - - if (parent) { - parent.replaceChild(newNode, firstElementToRemove); - } - - // Append all the `elementsToRemove` to a fragment. This will... - // - remove them from the DOM - // - allow them to still be traversed with .nextSibling - // - allow a single fragment.qSA to fetch all elements being removed - var fragment = document.createDocumentFragment(); - for (i = 0; i < removeCount; i++) { - fragment.appendChild(elementsToRemove[i]); - } - - if (jqLite.hasData(firstElementToRemove)) { - // Copy over user data (that includes Angular's $scope etc.). Don't copy private - // data here because there's no public interface in jQuery to do that and copying over - // event listeners (which is the main use of private data) wouldn't work anyway. - jqLite.data(newNode, jqLite.data(firstElementToRemove)); - - // Remove $destroy event listeners from `firstElementToRemove` - jqLite(firstElementToRemove).off('$destroy'); - } - - // Cleanup any data/listeners on the elements and children. - // This includes invoking the $destroy event on any elements with listeners. - jqLite.cleanData(fragment.querySelectorAll('*')); - - // Update the jqLite collection to only contain the `newNode` - for (i = 1; i < removeCount; i++) { - delete elementsToRemove[i]; - } - elementsToRemove[0] = newNode; - elementsToRemove.length = 1; - } - - - function cloneAndAnnotateFn(fn, annotation) { - return extend(function() { return fn.apply(null, arguments); }, fn, annotation); - } - - - function invokeLinkFn(linkFn, scope, $element, attrs, controllers, transcludeFn) { - try { - linkFn(scope, $element, attrs, controllers, transcludeFn); - } catch (e) { - $exceptionHandler(e, startingTag($element)); - } - } - - - // Set up $watches for isolate scope and controller bindings. This process - // only occurs for isolate scopes and new scopes with controllerAs. - function initializeDirectiveBindings(scope, attrs, destination, bindings, directive) { - var removeWatchCollection = []; - forEach(bindings, function initializeBinding(definition, scopeName) { - var attrName = definition.attrName, - optional = definition.optional, - mode = definition.mode, // @, =, or & - lastValue, - parentGet, parentSet, compare, removeWatch; - - switch (mode) { - - case '@': - if (!optional && !hasOwnProperty.call(attrs, attrName)) { - destination[scopeName] = attrs[attrName] = void 0; - } - attrs.$observe(attrName, function(value) { - if (isString(value)) { - destination[scopeName] = value; - } - }); - attrs.$$observers[attrName].$$scope = scope; - lastValue = attrs[attrName]; - if (isString(lastValue)) { - // If the attribute has been provided then we trigger an interpolation to ensure - // the value is there for use in the link fn - destination[scopeName] = $interpolate(lastValue)(scope); - } else if (isBoolean(lastValue)) { - // If the attributes is one of the BOOLEAN_ATTR then Angular will have converted - // the value to boolean rather than a string, so we special case this situation - destination[scopeName] = lastValue; - } - break; - - case '=': - if (!hasOwnProperty.call(attrs, attrName)) { - if (optional) break; - attrs[attrName] = void 0; - } - if (optional && !attrs[attrName]) break; - - parentGet = $parse(attrs[attrName]); - if (parentGet.literal) { - compare = equals; - } else { - compare = function simpleCompare(a, b) { return a === b || (a !== a && b !== b); }; - } - parentSet = parentGet.assign || function() { - // reset the change, or we will throw this exception on every $digest - lastValue = destination[scopeName] = parentGet(scope); - throw $compileMinErr('nonassign', - "Expression '{0}' in attribute '{1}' used with directive '{2}' is non-assignable!", - attrs[attrName], attrName, directive.name); - }; - lastValue = destination[scopeName] = parentGet(scope); - var parentValueWatch = function parentValueWatch(parentValue) { - if (!compare(parentValue, destination[scopeName])) { - // we are out of sync and need to copy - if (!compare(parentValue, lastValue)) { - // parent changed and it has precedence - destination[scopeName] = parentValue; - } else { - // if the parent can be assigned then do so - parentSet(scope, parentValue = destination[scopeName]); - } - } - return lastValue = parentValue; - }; - parentValueWatch.$stateful = true; - if (definition.collection) { - removeWatch = scope.$watchCollection(attrs[attrName], parentValueWatch); - } else { - removeWatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal); - } - removeWatchCollection.push(removeWatch); - break; - - case '<': - if (!hasOwnProperty.call(attrs, attrName)) { - if (optional) break; - attrs[attrName] = void 0; - } - if (optional && !attrs[attrName]) break; - - parentGet = $parse(attrs[attrName]); - - destination[scopeName] = parentGet(scope); - - removeWatch = scope.$watch(parentGet, function parentValueWatchAction(newParentValue) { - destination[scopeName] = newParentValue; - }, parentGet.literal); - - removeWatchCollection.push(removeWatch); - break; - - case '&': - // Don't assign Object.prototype method to scope - parentGet = attrs.hasOwnProperty(attrName) ? $parse(attrs[attrName]) : noop; - - // Don't assign noop to destination if expression is not valid - if (parentGet === noop && optional) break; - - destination[scopeName] = function(locals) { - return parentGet(scope, locals); - }; - break; - } - }); - - return removeWatchCollection.length && function removeWatches() { - for (var i = 0, ii = removeWatchCollection.length; i < ii; ++i) { - removeWatchCollection[i](); - } - }; - } - }]; -} - -var PREFIX_REGEXP = /^((?:x|data)[\:\-_])/i; -/** - * Converts all accepted directives format into proper directive name. - * @param name Name to normalize - */ -function directiveNormalize(name) { - return camelCase(name.replace(PREFIX_REGEXP, '')); -} - -/** - * @ngdoc type - * @name $compile.directive.Attributes - * - * @description - * A shared object between directive compile / linking functions which contains normalized DOM - * element attributes. The values reflect current binding state `{{ }}`. The normalization is - * needed since all of these are treated as equivalent in Angular: - * - * ``` - * - * ``` - */ - -/** - * @ngdoc property - * @name $compile.directive.Attributes#$attr - * - * @description - * A map of DOM element attribute names to the normalized name. This is - * needed to do reverse lookup from normalized name back to actual name. - */ - - -/** - * @ngdoc method - * @name $compile.directive.Attributes#$set - * @kind function - * - * @description - * Set DOM element attribute value. - * - * - * @param {string} name Normalized element attribute name of the property to modify. The name is - * reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr} - * property to the original name. - * @param {string} value Value to set the attribute to. The value can be an interpolated string. - */ - - - -/** - * Closure compiler type information - */ - -function nodesetLinkingFn( - /* angular.Scope */ scope, - /* NodeList */ nodeList, - /* Element */ rootElement, - /* function(Function) */ boundTranscludeFn -) {} - -function directiveLinkingFn( - /* nodesetLinkingFn */ nodesetLinkingFn, - /* angular.Scope */ scope, - /* Node */ node, - /* Element */ rootElement, - /* function(Function) */ boundTranscludeFn -) {} - -function tokenDifference(str1, str2) { - var values = '', - tokens1 = str1.split(/\s+/), - tokens2 = str2.split(/\s+/); - - outer: - for (var i = 0; i < tokens1.length; i++) { - var token = tokens1[i]; - for (var j = 0; j < tokens2.length; j++) { - if (token == tokens2[j]) continue outer; - } - values += (values.length > 0 ? ' ' : '') + token; - } - return values; -} - -function removeComments(jqNodes) { - jqNodes = jqLite(jqNodes); - var i = jqNodes.length; - - if (i <= 1) { - return jqNodes; - } - - while (i--) { - var node = jqNodes[i]; - if (node.nodeType === NODE_TYPE_COMMENT) { - splice.call(jqNodes, i, 1); - } - } - return jqNodes; -} - -var $controllerMinErr = minErr('$controller'); - - -var CNTRL_REG = /^(\S+)(\s+as\s+([\w$]+))?$/; -function identifierForController(controller, ident) { - if (ident && isString(ident)) return ident; - if (isString(controller)) { - var match = CNTRL_REG.exec(controller); - if (match) return match[3]; - } -} - - -/** - * @ngdoc provider - * @name $controllerProvider - * @description - * The {@link ng.$controller $controller service} is used by Angular to create new - * controllers. - * - * This provider allows controller registration via the - * {@link ng.$controllerProvider#register register} method. - */ -function $ControllerProvider() { - var controllers = {}, - globals = false; - - /** - * @ngdoc method - * @name $controllerProvider#has - * @param {string} name Controller name to check. - */ - this.has = function(name) { - return controllers.hasOwnProperty(name); - }; - - /** - * @ngdoc method - * @name $controllerProvider#register - * @param {string|Object} name Controller name, or an object map of controllers where the keys are - * the names and the values are the constructors. - * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI - * annotations in the array notation). - */ - this.register = function(name, constructor) { - assertNotHasOwnProperty(name, 'controller'); - if (isObject(name)) { - extend(controllers, name); - } else { - controllers[name] = constructor; - } - }; - - /** - * @ngdoc method - * @name $controllerProvider#allowGlobals - * @description If called, allows `$controller` to find controller constructors on `window` - */ - this.allowGlobals = function() { - globals = true; - }; - - - this.$get = ['$injector', '$window', function($injector, $window) { - - /** - * @ngdoc service - * @name $controller - * @requires $injector - * - * @param {Function|string} constructor If called with a function then it's considered to be the - * controller constructor function. Otherwise it's considered to be a string which is used - * to retrieve the controller constructor using the following steps: - * - * * check if a controller with given name is registered via `$controllerProvider` - * * check if evaluating the string on the current scope returns a constructor - * * if $controllerProvider#allowGlobals, check `window[constructor]` on the global - * `window` object (not recommended) - * - * The string can use the `controller as property` syntax, where the controller instance is published - * as the specified property on the `scope`; the `scope` must be injected into `locals` param for this - * to work correctly. - * - * @param {Object} locals Injection locals for Controller. - * @return {Object} Instance of given controller. - * - * @description - * `$controller` service is responsible for instantiating controllers. - * - * It's just a simple call to {@link auto.$injector $injector}, but extracted into - * a service, so that one can override this service with [BC version](https://gist.github.com/1649788). - */ - return function $controller(expression, locals, later, ident) { - // PRIVATE API: - // param `later` --- indicates that the controller's constructor is invoked at a later time. - // If true, $controller will allocate the object with the correct - // prototype chain, but will not invoke the controller until a returned - // callback is invoked. - // param `ident` --- An optional label which overrides the label parsed from the controller - // expression, if any. - var instance, match, constructor, identifier; - later = later === true; - if (ident && isString(ident)) { - identifier = ident; - } - - if (isString(expression)) { - match = expression.match(CNTRL_REG); - if (!match) { - throw $controllerMinErr('ctrlfmt', - "Badly formed controller string '{0}'. " + - "Must match `__name__ as __id__` or `__name__`.", expression); - } - constructor = match[1], - identifier = identifier || match[3]; - expression = controllers.hasOwnProperty(constructor) - ? controllers[constructor] - : getter(locals.$scope, constructor, true) || - (globals ? getter($window, constructor, true) : undefined); - - assertArgFn(expression, constructor, true); - } - - if (later) { - // Instantiate controller later: - // This machinery is used to create an instance of the object before calling the - // controller's constructor itself. - // - // This allows properties to be added to the controller before the constructor is - // invoked. Primarily, this is used for isolate scope bindings in $compile. - // - // This feature is not intended for use by applications, and is thus not documented - // publicly. - // Object creation: http://jsperf.com/create-constructor/2 - var controllerPrototype = (isArray(expression) ? - expression[expression.length - 1] : expression).prototype; - instance = Object.create(controllerPrototype || null); - - if (identifier) { - addIdentifier(locals, identifier, instance, constructor || expression.name); - } - - var instantiate; - return instantiate = extend(function $controllerInit() { - var result = $injector.invoke(expression, instance, locals, constructor); - if (result !== instance && (isObject(result) || isFunction(result))) { - instance = result; - if (identifier) { - // If result changed, re-assign controllerAs value to scope. - addIdentifier(locals, identifier, instance, constructor || expression.name); - } - } - return instance; - }, { - instance: instance, - identifier: identifier - }); - } - - instance = $injector.instantiate(expression, locals, constructor); - - if (identifier) { - addIdentifier(locals, identifier, instance, constructor || expression.name); - } - - return instance; - }; - - function addIdentifier(locals, identifier, instance, name) { - if (!(locals && isObject(locals.$scope))) { - throw minErr('$controller')('noscp', - "Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.", - name, identifier); - } - - locals.$scope[identifier] = instance; - } - }]; -} - -/** - * @ngdoc service - * @name $document - * @requires $window - * - * @description - * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object. - * - * @example - - -
                                        -

                                        $document title:

                                        -

                                        window.document title:

                                        -
                                        -
                                        - - angular.module('documentExample', []) - .controller('ExampleController', ['$scope', '$document', function($scope, $document) { - $scope.title = $document[0].title; - $scope.windowTitle = angular.element(window.document)[0].title; - }]); - -
                                        - */ -function $DocumentProvider() { - this.$get = ['$window', function(window) { - return jqLite(window.document); - }]; -} - -/** - * @ngdoc service - * @name $exceptionHandler - * @requires ng.$log - * - * @description - * Any uncaught exception in angular expressions is delegated to this service. - * The default implementation simply delegates to `$log.error` which logs it into - * the browser console. - * - * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by - * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing. - * - * ## Example: - * - * ```js - * angular.module('exceptionOverride', []).factory('$exceptionHandler', function() { - * return function(exception, cause) { - * exception.message += ' (caused by "' + cause + '")'; - * throw exception; - * }; - * }); - * ``` - * - * This example will override the normal action of `$exceptionHandler`, to make angular - * exceptions fail hard when they happen, instead of just logging to the console. - * - *
                                        - * Note, that code executed in event-listeners (even those registered using jqLite's `on`/`bind` - * methods) does not delegate exceptions to the {@link ng.$exceptionHandler $exceptionHandler} - * (unless executed during a digest). - * - * If you wish, you can manually delegate exceptions, e.g. - * `try { ... } catch(e) { $exceptionHandler(e); }` - * - * @param {Error} exception Exception associated with the error. - * @param {string=} cause optional information about the context in which - * the error was thrown. - * - */ -function $ExceptionHandlerProvider() { - this.$get = ['$log', function($log) { - return function(exception, cause) { - $log.error.apply($log, arguments); - }; - }]; -} - -var $$ForceReflowProvider = function() { - this.$get = ['$document', function($document) { - return function(domNode) { - //the line below will force the browser to perform a repaint so - //that all the animated elements within the animation frame will - //be properly updated and drawn on screen. This is required to - //ensure that the preparation animation is properly flushed so that - //the active state picks up from there. DO NOT REMOVE THIS LINE. - //DO NOT OPTIMIZE THIS LINE. THE MINIFIER WILL REMOVE IT OTHERWISE WHICH - //WILL RESULT IN AN UNPREDICTABLE BUG THAT IS VERY HARD TO TRACK DOWN AND - //WILL TAKE YEARS AWAY FROM YOUR LIFE. - if (domNode) { - if (!domNode.nodeType && domNode instanceof jqLite) { - domNode = domNode[0]; - } - } else { - domNode = $document[0].body; - } - return domNode.offsetWidth + 1; - }; - }]; -}; - -var APPLICATION_JSON = 'application/json'; -var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'}; -var JSON_START = /^\[|^\{(?!\{)/; -var JSON_ENDS = { - '[': /]$/, - '{': /}$/ -}; -var JSON_PROTECTION_PREFIX = /^\)\]\}',?\n/; -var $httpMinErr = minErr('$http'); -var $httpMinErrLegacyFn = function(method) { - return function() { - throw $httpMinErr('legacy', 'The method `{0}` on the promise returned from `$http` has been disabled.', method); - }; -}; - -function serializeValue(v) { - if (isObject(v)) { - return isDate(v) ? v.toISOString() : toJson(v); - } - return v; -} - - -function $HttpParamSerializerProvider() { - /** - * @ngdoc service - * @name $httpParamSerializer - * @description - * - * Default {@link $http `$http`} params serializer that converts objects to strings - * according to the following rules: - * - * * `{'foo': 'bar'}` results in `foo=bar` - * * `{'foo': Date.now()}` results in `foo=2015-04-01T09%3A50%3A49.262Z` (`toISOString()` and encoded representation of a Date object) - * * `{'foo': ['bar', 'baz']}` results in `foo=bar&foo=baz` (repeated key for each array element) - * * `{'foo': {'bar':'baz'}}` results in `foo=%7B%22bar%22%3A%22baz%22%7D"` (stringified and encoded representation of an object) - * - * Note that serializer will sort the request parameters alphabetically. - * */ - - this.$get = function() { - return function ngParamSerializer(params) { - if (!params) return ''; - var parts = []; - forEachSorted(params, function(value, key) { - if (value === null || isUndefined(value)) return; - if (isArray(value)) { - forEach(value, function(v) { - parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(v))); - }); - } else { - parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(value))); - } - }); - - return parts.join('&'); - }; - }; -} - -function $HttpParamSerializerJQLikeProvider() { - /** - * @ngdoc service - * @name $httpParamSerializerJQLike - * @description - * - * Alternative {@link $http `$http`} params serializer that follows - * jQuery's [`param()`](http://api.jquery.com/jquery.param/) method logic. - * The serializer will also sort the params alphabetically. - * - * To use it for serializing `$http` request parameters, set it as the `paramSerializer` property: - * - * ```js - * $http({ - * url: myUrl, - * method: 'GET', - * params: myParams, - * paramSerializer: '$httpParamSerializerJQLike' - * }); - * ``` - * - * It is also possible to set it as the default `paramSerializer` in the - * {@link $httpProvider#defaults `$httpProvider`}. - * - * Additionally, you can inject the serializer and use it explicitly, for example to serialize - * form data for submission: - * - * ```js - * .controller(function($http, $httpParamSerializerJQLike) { - * //... - * - * $http({ - * url: myUrl, - * method: 'POST', - * data: $httpParamSerializerJQLike(myData), - * headers: { - * 'Content-Type': 'application/x-www-form-urlencoded' - * } - * }); - * - * }); - * ``` - * - * */ - this.$get = function() { - return function jQueryLikeParamSerializer(params) { - if (!params) return ''; - var parts = []; - serialize(params, '', true); - return parts.join('&'); - - function serialize(toSerialize, prefix, topLevel) { - if (toSerialize === null || isUndefined(toSerialize)) return; - if (isArray(toSerialize)) { - forEach(toSerialize, function(value, index) { - serialize(value, prefix + '[' + (isObject(value) ? index : '') + ']'); - }); - } else if (isObject(toSerialize) && !isDate(toSerialize)) { - forEachSorted(toSerialize, function(value, key) { - serialize(value, prefix + - (topLevel ? '' : '[') + - key + - (topLevel ? '' : ']')); - }); - } else { - parts.push(encodeUriQuery(prefix) + '=' + encodeUriQuery(serializeValue(toSerialize))); - } - } - }; - }; -} - -function defaultHttpResponseTransform(data, headers) { - if (isString(data)) { - // Strip json vulnerability protection prefix and trim whitespace - var tempData = data.replace(JSON_PROTECTION_PREFIX, '').trim(); - - if (tempData) { - var contentType = headers('Content-Type'); - if ((contentType && (contentType.indexOf(APPLICATION_JSON) === 0)) || isJsonLike(tempData)) { - data = fromJson(tempData); - } - } - } - - return data; -} - -function isJsonLike(str) { - var jsonStart = str.match(JSON_START); - return jsonStart && JSON_ENDS[jsonStart[0]].test(str); -} - -/** - * Parse headers into key value object - * - * @param {string} headers Raw headers as a string - * @returns {Object} Parsed headers as key value object - */ -function parseHeaders(headers) { - var parsed = createMap(), i; - - function fillInParsed(key, val) { - if (key) { - parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; - } - } - - if (isString(headers)) { - forEach(headers.split('\n'), function(line) { - i = line.indexOf(':'); - fillInParsed(lowercase(trim(line.substr(0, i))), trim(line.substr(i + 1))); - }); - } else if (isObject(headers)) { - forEach(headers, function(headerVal, headerKey) { - fillInParsed(lowercase(headerKey), trim(headerVal)); - }); - } - - return parsed; -} - - -/** - * Returns a function that provides access to parsed headers. - * - * Headers are lazy parsed when first requested. - * @see parseHeaders - * - * @param {(string|Object)} headers Headers to provide access to. - * @returns {function(string=)} Returns a getter function which if called with: - * - * - if called with single an argument returns a single header value or null - * - if called with no arguments returns an object containing all headers. - */ -function headersGetter(headers) { - var headersObj; - - return function(name) { - if (!headersObj) headersObj = parseHeaders(headers); - - if (name) { - var value = headersObj[lowercase(name)]; - if (value === void 0) { - value = null; - } - return value; - } - - return headersObj; - }; -} - - -/** - * Chain all given functions - * - * This function is used for both request and response transforming - * - * @param {*} data Data to transform. - * @param {function(string=)} headers HTTP headers getter fn. - * @param {number} status HTTP status code of the response. - * @param {(Function|Array.)} fns Function or an array of functions. - * @returns {*} Transformed data. - */ -function transformData(data, headers, status, fns) { - if (isFunction(fns)) { - return fns(data, headers, status); - } - - forEach(fns, function(fn) { - data = fn(data, headers, status); - }); - - return data; -} - - -function isSuccess(status) { - return 200 <= status && status < 300; -} - - -/** - * @ngdoc provider - * @name $httpProvider - * @description - * Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service. - * */ -function $HttpProvider() { - /** - * @ngdoc property - * @name $httpProvider#defaults - * @description - * - * Object containing default values for all {@link ng.$http $http} requests. - * - * - **`defaults.cache`** - {boolean|Object} - A boolean value or object created with - * {@link ng.$cacheFactory `$cacheFactory`} to enable or disable caching of HTTP responses - * by default. See {@link $http#caching $http Caching} for more information. - * - * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token. - * Defaults value is `'XSRF-TOKEN'`. - * - * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the - * XSRF token. Defaults value is `'X-XSRF-TOKEN'`. - * - * - **`defaults.headers`** - {Object} - Default headers for all $http requests. - * Refer to {@link ng.$http#setting-http-headers $http} for documentation on - * setting default headers. - * - **`defaults.headers.common`** - * - **`defaults.headers.post`** - * - **`defaults.headers.put`** - * - **`defaults.headers.patch`** - * - * - * - **`defaults.paramSerializer`** - `{string|function(Object):string}` - A function - * used to the prepare string representation of request parameters (specified as an object). - * If specified as string, it is interpreted as a function registered with the {@link auto.$injector $injector}. - * Defaults to {@link ng.$httpParamSerializer $httpParamSerializer}. - * - **/ - var defaults = this.defaults = { - // transform incoming response data - transformResponse: [defaultHttpResponseTransform], - - // transform outgoing request data - transformRequest: [function(d) { - return isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? toJson(d) : d; - }], - - // default headers - headers: { - common: { - 'Accept': 'application/json, text/plain, */*' - }, - post: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), - put: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), - patch: shallowCopy(CONTENT_TYPE_APPLICATION_JSON) - }, - - xsrfCookieName: 'XSRF-TOKEN', - xsrfHeaderName: 'X-XSRF-TOKEN', - - paramSerializer: '$httpParamSerializer' - }; - - var useApplyAsync = false; - /** - * @ngdoc method - * @name $httpProvider#useApplyAsync - * @description - * - * Configure $http service to combine processing of multiple http responses received at around - * the same time via {@link ng.$rootScope.Scope#$applyAsync $rootScope.$applyAsync}. This can result in - * significant performance improvement for bigger applications that make many HTTP requests - * concurrently (common during application bootstrap). - * - * Defaults to false. If no value is specified, returns the current configured value. - * - * @param {boolean=} value If true, when requests are loaded, they will schedule a deferred - * "apply" on the next tick, giving time for subsequent requests in a roughly ~10ms window - * to load and share the same digest cycle. - * - * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining. - * otherwise, returns the current configured value. - **/ - this.useApplyAsync = function(value) { - if (isDefined(value)) { - useApplyAsync = !!value; - return this; - } - return useApplyAsync; - }; - - var useLegacyPromise = true; - /** - * @ngdoc method - * @name $httpProvider#useLegacyPromiseExtensions - * @description - * - * Configure `$http` service to return promises without the shorthand methods `success` and `error`. - * This should be used to make sure that applications work without these methods. - * - * Defaults to true. If no value is specified, returns the current configured value. - * - * @param {boolean=} value If true, `$http` will return a promise with the deprecated legacy `success` and `error` methods. - * - * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining. - * otherwise, returns the current configured value. - **/ - this.useLegacyPromiseExtensions = function(value) { - if (isDefined(value)) { - useLegacyPromise = !!value; - return this; - } - return useLegacyPromise; - }; - - /** - * @ngdoc property - * @name $httpProvider#interceptors - * @description - * - * Array containing service factories for all synchronous or asynchronous {@link ng.$http $http} - * pre-processing of request or postprocessing of responses. - * - * These service factories are ordered by request, i.e. they are applied in the same order as the - * array, on request, but reverse order, on response. - * - * {@link ng.$http#interceptors Interceptors detailed info} - **/ - var interceptorFactories = this.interceptors = []; - - this.$get = ['$httpBackend', '$$cookieReader', '$cacheFactory', '$rootScope', '$q', '$injector', - function($httpBackend, $$cookieReader, $cacheFactory, $rootScope, $q, $injector) { - - var defaultCache = $cacheFactory('$http'); - - /** - * Make sure that default param serializer is exposed as a function - */ - defaults.paramSerializer = isString(defaults.paramSerializer) ? - $injector.get(defaults.paramSerializer) : defaults.paramSerializer; - - /** - * Interceptors stored in reverse order. Inner interceptors before outer interceptors. - * The reversal is needed so that we can build up the interception chain around the - * server request. - */ - var reversedInterceptors = []; - - forEach(interceptorFactories, function(interceptorFactory) { - reversedInterceptors.unshift(isString(interceptorFactory) - ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory)); - }); - - /** - * @ngdoc service - * @kind function - * @name $http - * @requires ng.$httpBackend - * @requires $cacheFactory - * @requires $rootScope - * @requires $q - * @requires $injector - * - * @description - * The `$http` service is a core Angular service that facilitates communication with the remote - * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest) - * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP). - * - * For unit testing applications that use `$http` service, see - * {@link ngMock.$httpBackend $httpBackend mock}. - * - * For a higher level of abstraction, please check out the {@link ngResource.$resource - * $resource} service. - * - * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by - * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage - * it is important to familiarize yourself with these APIs and the guarantees they provide. - * - * - * ## General usage - * The `$http` service is a function which takes a single argument — a {@link $http#usage configuration object} — - * that is used to generate an HTTP request and returns a {@link ng.$q promise}. - * - * ```js - * // Simple GET request example: - * $http({ - * method: 'GET', - * url: '/someUrl' - * }).then(function successCallback(response) { - * // this callback will be called asynchronously - * // when the response is available - * }, function errorCallback(response) { - * // called asynchronously if an error occurs - * // or server returns response with an error status. - * }); - * ``` - * - * The response object has these properties: - * - * - **data** – `{string|Object}` – The response body transformed with the transform - * functions. - * - **status** – `{number}` – HTTP status code of the response. - * - **headers** – `{function([headerName])}` – Header getter function. - * - **config** – `{Object}` – The configuration object that was used to generate the request. - * - **statusText** – `{string}` – HTTP status text of the response. - * - * A response status code between 200 and 299 is considered a success status and - * will result in the success callback being called. Note that if the response is a redirect, - * XMLHttpRequest will transparently follow it, meaning that the error callback will not be - * called for such responses. - * - * - * ## Shortcut methods - * - * Shortcut methods are also available. All shortcut methods require passing in the URL, and - * request data must be passed in for POST/PUT requests. An optional config can be passed as the - * last argument. - * - * ```js - * $http.get('/someUrl', config).then(successCallback, errorCallback); - * $http.post('/someUrl', data, config).then(successCallback, errorCallback); - * ``` - * - * Complete list of shortcut methods: - * - * - {@link ng.$http#get $http.get} - * - {@link ng.$http#head $http.head} - * - {@link ng.$http#post $http.post} - * - {@link ng.$http#put $http.put} - * - {@link ng.$http#delete $http.delete} - * - {@link ng.$http#jsonp $http.jsonp} - * - {@link ng.$http#patch $http.patch} - * - * - * ## Writing Unit Tests that use $http - * When unit testing (using {@link ngMock ngMock}), it is necessary to call - * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending - * request using trained responses. - * - * ``` - * $httpBackend.expectGET(...); - * $http.get(...); - * $httpBackend.flush(); - * ``` - * - * ## Deprecation Notice - *
                                        - * The `$http` legacy promise methods `success` and `error` have been deprecated. - * Use the standard `then` method instead. - * If {@link $httpProvider#useLegacyPromiseExtensions `$httpProvider.useLegacyPromiseExtensions`} is set to - * `false` then these methods will throw {@link $http:legacy `$http/legacy`} error. - *
                                        - * - * ## Setting HTTP Headers - * - * The $http service will automatically add certain HTTP headers to all requests. These defaults - * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration - * object, which currently contains this default configuration: - * - * - `$httpProvider.defaults.headers.common` (headers that are common for all requests): - * - `Accept: application/json, text/plain, * / *` - * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests) - * - `Content-Type: application/json` - * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests) - * - `Content-Type: application/json` - * - * To add or overwrite these defaults, simply add or remove a property from these configuration - * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object - * with the lowercased HTTP method name as the key, e.g. - * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }`. - * - * The defaults can also be set at runtime via the `$http.defaults` object in the same - * fashion. For example: - * - * ``` - * module.run(function($http) { - * $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w'; - * }); - * ``` - * - * In addition, you can supply a `headers` property in the config object passed when - * calling `$http(config)`, which overrides the defaults without changing them globally. - * - * To explicitly remove a header automatically added via $httpProvider.defaults.headers on a per request basis, - * Use the `headers` property, setting the desired header to `undefined`. For example: - * - * ```js - * var req = { - * method: 'POST', - * url: 'http://example.com', - * headers: { - * 'Content-Type': undefined - * }, - * data: { test: 'test' } - * } - * - * $http(req).then(function(){...}, function(){...}); - * ``` - * - * ## Transforming Requests and Responses - * - * Both requests and responses can be transformed using transformation functions: `transformRequest` - * and `transformResponse`. These properties can be a single function that returns - * the transformed value (`function(data, headersGetter, status)`) or an array of such transformation functions, - * which allows you to `push` or `unshift` a new transformation function into the transformation chain. - * - *
                                        - * **Note:** Angular does not make a copy of the `data` parameter before it is passed into the `transformRequest` pipeline. - * That means changes to the properties of `data` are not local to the transform function (since Javascript passes objects by reference). - * For example, when calling `$http.get(url, $scope.myObject)`, modifications to the object's properties in a transformRequest - * function will be reflected on the scope and in any templates where the object is data-bound. - * To prevent his, transform functions should have no side-effects. - * If you need to modify properties, it is recommended to make a copy of the data, or create new object to return. - *
                                        - * - * ### Default Transformations - * - * The `$httpProvider` provider and `$http` service expose `defaults.transformRequest` and - * `defaults.transformResponse` properties. If a request does not provide its own transformations - * then these will be applied. - * - * You can augment or replace the default transformations by modifying these properties by adding to or - * replacing the array. - * - * Angular provides the following default transformations: - * - * Request transformations (`$httpProvider.defaults.transformRequest` and `$http.defaults.transformRequest`): - * - * - If the `data` property of the request configuration object contains an object, serialize it - * into JSON format. - * - * Response transformations (`$httpProvider.defaults.transformResponse` and `$http.defaults.transformResponse`): - * - * - If XSRF prefix is detected, strip it (see Security Considerations section below). - * - If JSON response is detected, deserialize it using a JSON parser. - * - * - * ### Overriding the Default Transformations Per Request - * - * If you wish override the request/response transformations only for a single request then provide - * `transformRequest` and/or `transformResponse` properties on the configuration object passed - * into `$http`. - * - * Note that if you provide these properties on the config object the default transformations will be - * overwritten. If you wish to augment the default transformations then you must include them in your - * local transformation array. - * - * The following code demonstrates adding a new response transformation to be run after the default response - * transformations have been run. - * - * ```js - * function appendTransform(defaults, transform) { - * - * // We can't guarantee that the default transformation is an array - * defaults = angular.isArray(defaults) ? defaults : [defaults]; - * - * // Append the new transformation to the defaults - * return defaults.concat(transform); - * } - * - * $http({ - * url: '...', - * method: 'GET', - * transformResponse: appendTransform($http.defaults.transformResponse, function(value) { - * return doTransform(value); - * }) - * }); - * ``` - * - * - * ## Caching - * - * {@link ng.$http `$http`} responses are not cached by default. To enable caching, you must - * set the config.cache value or the default cache value to TRUE or to a cache object (created - * with {@link ng.$cacheFactory `$cacheFactory`}). If defined, the value of config.cache takes - * precedence over the default cache value. - * - * In order to: - * * cache all responses - set the default cache value to TRUE or to a cache object - * * cache a specific response - set config.cache value to TRUE or to a cache object - * - * If caching is enabled, but neither the default cache nor config.cache are set to a cache object, - * then the default `$cacheFactory($http)` object is used. - * - * The default cache value can be set by updating the - * {@link ng.$http#defaults `$http.defaults.cache`} property or the - * {@link $httpProvider#defaults `$httpProvider.defaults.cache`} property. - * - * When caching is enabled, {@link ng.$http `$http`} stores the response from the server using - * the relevant cache object. The next time the same request is made, the response is returned - * from the cache without sending a request to the server. - * - * Take note that: - * - * * Only GET and JSONP requests are cached. - * * The cache key is the request URL including search parameters; headers are not considered. - * * Cached responses are returned asynchronously, in the same way as responses from the server. - * * If multiple identical requests are made using the same cache, which is not yet populated, - * one request will be made to the server and remaining requests will return the same response. - * * A cache-control header on the response does not affect if or how responses are cached. - * - * - * ## Interceptors - * - * Before you start creating interceptors, be sure to understand the - * {@link ng.$q $q and deferred/promise APIs}. - * - * For purposes of global error handling, authentication, or any kind of synchronous or - * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be - * able to intercept requests before they are handed to the server and - * responses before they are handed over to the application code that - * initiated these requests. The interceptors leverage the {@link ng.$q - * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing. - * - * The interceptors are service factories that are registered with the `$httpProvider` by - * adding them to the `$httpProvider.interceptors` array. The factory is called and - * injected with dependencies (if specified) and returns the interceptor. - * - * There are two kinds of interceptors (and two kinds of rejection interceptors): - * - * * `request`: interceptors get called with a http {@link $http#usage config} object. The function is free to - * modify the `config` object or create a new one. The function needs to return the `config` - * object directly, or a promise containing the `config` or a new `config` object. - * * `requestError`: interceptor gets called when a previous interceptor threw an error or - * resolved with a rejection. - * * `response`: interceptors get called with http `response` object. The function is free to - * modify the `response` object or create a new one. The function needs to return the `response` - * object directly, or as a promise containing the `response` or a new `response` object. - * * `responseError`: interceptor gets called when a previous interceptor threw an error or - * resolved with a rejection. - * - * - * ```js - * // register the interceptor as a service - * $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) { - * return { - * // optional method - * 'request': function(config) { - * // do something on success - * return config; - * }, - * - * // optional method - * 'requestError': function(rejection) { - * // do something on error - * if (canRecover(rejection)) { - * return responseOrNewPromise - * } - * return $q.reject(rejection); - * }, - * - * - * - * // optional method - * 'response': function(response) { - * // do something on success - * return response; - * }, - * - * // optional method - * 'responseError': function(rejection) { - * // do something on error - * if (canRecover(rejection)) { - * return responseOrNewPromise - * } - * return $q.reject(rejection); - * } - * }; - * }); - * - * $httpProvider.interceptors.push('myHttpInterceptor'); - * - * - * // alternatively, register the interceptor via an anonymous factory - * $httpProvider.interceptors.push(function($q, dependency1, dependency2) { - * return { - * 'request': function(config) { - * // same as above - * }, - * - * 'response': function(response) { - * // same as above - * } - * }; - * }); - * ``` - * - * ## Security Considerations - * - * When designing web applications, consider security threats from: - * - * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) - * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) - * - * Both server and the client must cooperate in order to eliminate these threats. Angular comes - * pre-configured with strategies that address these issues, but for this to work backend server - * cooperation is required. - * - * ### JSON Vulnerability Protection - * - * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) - * allows third party website to turn your JSON resource URL into - * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To - * counter this your server can prefix all JSON requests with following string `")]}',\n"`. - * Angular will automatically strip the prefix before processing it as JSON. - * - * For example if your server needs to return: - * ```js - * ['one','two'] - * ``` - * - * which is vulnerable to attack, your server can return: - * ```js - * )]}', - * ['one','two'] - * ``` - * - * Angular will strip the prefix, before processing the JSON. - * - * - * ### Cross Site Request Forgery (XSRF) Protection - * - * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is an attack technique by - * which the attacker can trick an authenticated user into unknowingly executing actions on your - * website. Angular provides a mechanism to counter XSRF. When performing XHR requests, the - * $http service reads a token from a cookie (by default, `XSRF-TOKEN`) and sets it as an HTTP - * header (`X-XSRF-TOKEN`). Since only JavaScript that runs on your domain could read the - * cookie, your server can be assured that the XHR came from JavaScript running on your domain. - * The header will not be set for cross-domain requests. - * - * To take advantage of this, your server needs to set a token in a JavaScript readable session - * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the - * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure - * that only JavaScript running on your domain could have sent the request. The token must be - * unique for each user and must be verifiable by the server (to prevent the JavaScript from - * making up its own tokens). We recommend that the token is a digest of your site's - * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography)) - * for added security. - * - * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName - * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time, - * or the per-request config object. - * - * In order to prevent collisions in environments where multiple Angular apps share the - * same domain or subdomain, we recommend that each application uses unique cookie name. - * - * @param {object} config Object describing the request to be made and how it should be - * processed. The object has following properties: - * - * - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc) - * - **url** – `{string}` – Absolute or relative URL of the resource that is being requested. - * - **params** – `{Object.}` – Map of strings or objects which will be serialized - * with the `paramSerializer` and appended as GET parameters. - * - **data** – `{string|Object}` – Data to be sent as the request message data. - * - **headers** – `{Object}` – Map of strings or functions which return strings representing - * HTTP headers to send to the server. If the return value of a function is null, the - * header will not be sent. Functions accept a config object as an argument. - * - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token. - * - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token. - * - **transformRequest** – - * `{function(data, headersGetter)|Array.}` – - * transform function or an array of such functions. The transform function takes the http - * request body and headers and returns its transformed (typically serialized) version. - * See {@link ng.$http#overriding-the-default-transformations-per-request - * Overriding the Default Transformations} - * - **transformResponse** – - * `{function(data, headersGetter, status)|Array.}` – - * transform function or an array of such functions. The transform function takes the http - * response body, headers and status and returns its transformed (typically deserialized) version. - * See {@link ng.$http#overriding-the-default-transformations-per-request - * Overriding the Default Transformations} - * - **paramSerializer** - `{string|function(Object):string}` - A function used to - * prepare the string representation of request parameters (specified as an object). - * If specified as string, it is interpreted as function registered with the - * {@link $injector $injector}, which means you can create your own serializer - * by registering it as a {@link auto.$provide#service service}. - * The default serializer is the {@link $httpParamSerializer $httpParamSerializer}; - * alternatively, you can use the {@link $httpParamSerializerJQLike $httpParamSerializerJQLike} - * - **cache** – `{boolean|Object}` – A boolean value or object created with - * {@link ng.$cacheFactory `$cacheFactory`} to enable or disable caching of the HTTP response. - * See {@link $http#caching $http Caching} for more information. - * - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} - * that should abort the request when resolved. - * - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the - * XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials) - * for more information. - * - **responseType** - `{string}` - see - * [XMLHttpRequest.responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype). - * - * @returns {HttpPromise} Returns a {@link ng.$q `Promise}` that will be resolved to a response object - * when the request succeeds or fails. - * - * - * @property {Array.} pendingRequests Array of config objects for currently pending - * requests. This is primarily meant to be used for debugging purposes. - * - * - * @example - - -
                                        - - -
                                        - - - -
                                        http status code: {{status}}
                                        -
                                        http response data: {{data}}
                                        -
                                        -
                                        - - angular.module('httpExample', []) - .controller('FetchController', ['$scope', '$http', '$templateCache', - function($scope, $http, $templateCache) { - $scope.method = 'GET'; - $scope.url = 'http-hello.html'; - - $scope.fetch = function() { - $scope.code = null; - $scope.response = null; - - $http({method: $scope.method, url: $scope.url, cache: $templateCache}). - then(function(response) { - $scope.status = response.status; - $scope.data = response.data; - }, function(response) { - $scope.data = response.data || "Request failed"; - $scope.status = response.status; - }); - }; - - $scope.updateModel = function(method, url) { - $scope.method = method; - $scope.url = url; - }; - }]); - - - Hello, $http! - - - var status = element(by.binding('status')); - var data = element(by.binding('data')); - var fetchBtn = element(by.id('fetchbtn')); - var sampleGetBtn = element(by.id('samplegetbtn')); - var sampleJsonpBtn = element(by.id('samplejsonpbtn')); - var invalidJsonpBtn = element(by.id('invalidjsonpbtn')); - - it('should make an xhr GET request', function() { - sampleGetBtn.click(); - fetchBtn.click(); - expect(status.getText()).toMatch('200'); - expect(data.getText()).toMatch(/Hello, \$http!/); - }); - -// Commented out due to flakes. See https://github.com/angular/angular.js/issues/9185 -// it('should make a JSONP request to angularjs.org', function() { -// sampleJsonpBtn.click(); -// fetchBtn.click(); -// expect(status.getText()).toMatch('200'); -// expect(data.getText()).toMatch(/Super Hero!/); -// }); - - it('should make JSONP request to invalid URL and invoke the error handler', - function() { - invalidJsonpBtn.click(); - fetchBtn.click(); - expect(status.getText()).toMatch('0'); - expect(data.getText()).toMatch('Request failed'); - }); - -
                                        - */ - function $http(requestConfig) { - - if (!isObject(requestConfig)) { - throw minErr('$http')('badreq', 'Http request configuration must be an object. Received: {0}', requestConfig); - } - - if (!isString(requestConfig.url)) { - throw minErr('$http')('badreq', 'Http request configuration url must be a string. Received: {0}', requestConfig.url); - } - - var config = extend({ - method: 'get', - transformRequest: defaults.transformRequest, - transformResponse: defaults.transformResponse, - paramSerializer: defaults.paramSerializer - }, requestConfig); - - config.headers = mergeHeaders(requestConfig); - config.method = uppercase(config.method); - config.paramSerializer = isString(config.paramSerializer) ? - $injector.get(config.paramSerializer) : config.paramSerializer; - - var serverRequest = function(config) { - var headers = config.headers; - var reqData = transformData(config.data, headersGetter(headers), undefined, config.transformRequest); - - // strip content-type if data is undefined - if (isUndefined(reqData)) { - forEach(headers, function(value, header) { - if (lowercase(header) === 'content-type') { - delete headers[header]; - } - }); - } - - if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) { - config.withCredentials = defaults.withCredentials; - } - - // send request - return sendReq(config, reqData).then(transformResponse, transformResponse); - }; - - var chain = [serverRequest, undefined]; - var promise = $q.when(config); - - // apply interceptors - forEach(reversedInterceptors, function(interceptor) { - if (interceptor.request || interceptor.requestError) { - chain.unshift(interceptor.request, interceptor.requestError); - } - if (interceptor.response || interceptor.responseError) { - chain.push(interceptor.response, interceptor.responseError); - } - }); - - while (chain.length) { - var thenFn = chain.shift(); - var rejectFn = chain.shift(); - - promise = promise.then(thenFn, rejectFn); - } - - if (useLegacyPromise) { - promise.success = function(fn) { - assertArgFn(fn, 'fn'); - - promise.then(function(response) { - fn(response.data, response.status, response.headers, config); - }); - return promise; - }; - - promise.error = function(fn) { - assertArgFn(fn, 'fn'); - - promise.then(null, function(response) { - fn(response.data, response.status, response.headers, config); - }); - return promise; - }; - } else { - promise.success = $httpMinErrLegacyFn('success'); - promise.error = $httpMinErrLegacyFn('error'); - } - - return promise; - - function transformResponse(response) { - // make a copy since the response must be cacheable - var resp = extend({}, response); - resp.data = transformData(response.data, response.headers, response.status, - config.transformResponse); - return (isSuccess(response.status)) - ? resp - : $q.reject(resp); - } - - function executeHeaderFns(headers, config) { - var headerContent, processedHeaders = {}; - - forEach(headers, function(headerFn, header) { - if (isFunction(headerFn)) { - headerContent = headerFn(config); - if (headerContent != null) { - processedHeaders[header] = headerContent; - } - } else { - processedHeaders[header] = headerFn; - } - }); - - return processedHeaders; - } - - function mergeHeaders(config) { - var defHeaders = defaults.headers, - reqHeaders = extend({}, config.headers), - defHeaderName, lowercaseDefHeaderName, reqHeaderName; - - defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]); - - // using for-in instead of forEach to avoid unnecessary iteration after header has been found - defaultHeadersIteration: - for (defHeaderName in defHeaders) { - lowercaseDefHeaderName = lowercase(defHeaderName); - - for (reqHeaderName in reqHeaders) { - if (lowercase(reqHeaderName) === lowercaseDefHeaderName) { - continue defaultHeadersIteration; - } - } - - reqHeaders[defHeaderName] = defHeaders[defHeaderName]; - } - - // execute if header value is a function for merged headers - return executeHeaderFns(reqHeaders, shallowCopy(config)); - } - } - - $http.pendingRequests = []; - - /** - * @ngdoc method - * @name $http#get - * - * @description - * Shortcut method to perform `GET` request. - * - * @param {string} url Relative or absolute URL specifying the destination of the request - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - - /** - * @ngdoc method - * @name $http#delete - * - * @description - * Shortcut method to perform `DELETE` request. - * - * @param {string} url Relative or absolute URL specifying the destination of the request - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - - /** - * @ngdoc method - * @name $http#head - * - * @description - * Shortcut method to perform `HEAD` request. - * - * @param {string} url Relative or absolute URL specifying the destination of the request - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - - /** - * @ngdoc method - * @name $http#jsonp - * - * @description - * Shortcut method to perform `JSONP` request. - * - * @param {string} url Relative or absolute URL specifying the destination of the request. - * The name of the callback should be the string `JSON_CALLBACK`. - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - createShortMethods('get', 'delete', 'head', 'jsonp'); - - /** - * @ngdoc method - * @name $http#post - * - * @description - * Shortcut method to perform `POST` request. - * - * @param {string} url Relative or absolute URL specifying the destination of the request - * @param {*} data Request content - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - - /** - * @ngdoc method - * @name $http#put - * - * @description - * Shortcut method to perform `PUT` request. - * - * @param {string} url Relative or absolute URL specifying the destination of the request - * @param {*} data Request content - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - - /** - * @ngdoc method - * @name $http#patch - * - * @description - * Shortcut method to perform `PATCH` request. - * - * @param {string} url Relative or absolute URL specifying the destination of the request - * @param {*} data Request content - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - createShortMethodsWithData('post', 'put', 'patch'); - - /** - * @ngdoc property - * @name $http#defaults - * - * @description - * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of - * default headers, withCredentials as well as request and response transformations. - * - * See "Setting HTTP Headers" and "Transforming Requests and Responses" sections above. - */ - $http.defaults = defaults; - - - return $http; - - - function createShortMethods(names) { - forEach(arguments, function(name) { - $http[name] = function(url, config) { - return $http(extend({}, config || {}, { - method: name, - url: url - })); - }; - }); - } - - - function createShortMethodsWithData(name) { - forEach(arguments, function(name) { - $http[name] = function(url, data, config) { - return $http(extend({}, config || {}, { - method: name, - url: url, - data: data - })); - }; - }); - } - - - /** - * Makes the request. - * - * !!! ACCESSES CLOSURE VARS: - * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests - */ - function sendReq(config, reqData) { - var deferred = $q.defer(), - promise = deferred.promise, - cache, - cachedResp, - reqHeaders = config.headers, - url = buildUrl(config.url, config.paramSerializer(config.params)); - - $http.pendingRequests.push(config); - promise.then(removePendingReq, removePendingReq); - - - if ((config.cache || defaults.cache) && config.cache !== false && - (config.method === 'GET' || config.method === 'JSONP')) { - cache = isObject(config.cache) ? config.cache - : isObject(defaults.cache) ? defaults.cache - : defaultCache; - } - - if (cache) { - cachedResp = cache.get(url); - if (isDefined(cachedResp)) { - if (isPromiseLike(cachedResp)) { - // cached request has already been sent, but there is no response yet - cachedResp.then(resolvePromiseWithResult, resolvePromiseWithResult); - } else { - // serving from cache - if (isArray(cachedResp)) { - resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]); - } else { - resolvePromise(cachedResp, 200, {}, 'OK'); - } - } - } else { - // put the promise for the non-transformed response into cache as a placeholder - cache.put(url, promise); - } - } - - - // if we won't have the response in cache, set the xsrf headers and - // send the request to the backend - if (isUndefined(cachedResp)) { - var xsrfValue = urlIsSameOrigin(config.url) - ? $$cookieReader()[config.xsrfCookieName || defaults.xsrfCookieName] - : undefined; - if (xsrfValue) { - reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue; - } - - $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout, - config.withCredentials, config.responseType); - } - - return promise; - - - /** - * Callback registered to $httpBackend(): - * - caches the response if desired - * - resolves the raw $http promise - * - calls $apply - */ - function done(status, response, headersString, statusText) { - if (cache) { - if (isSuccess(status)) { - cache.put(url, [status, response, parseHeaders(headersString), statusText]); - } else { - // remove promise from the cache - cache.remove(url); - } - } - - function resolveHttpPromise() { - resolvePromise(response, status, headersString, statusText); - } - - if (useApplyAsync) { - $rootScope.$applyAsync(resolveHttpPromise); - } else { - resolveHttpPromise(); - if (!$rootScope.$$phase) $rootScope.$apply(); - } - } - - - /** - * Resolves the raw $http promise. - */ - function resolvePromise(response, status, headers, statusText) { - //status: HTTP response status code, 0, -1 (aborted by timeout / promise) - status = status >= -1 ? status : 0; - - (isSuccess(status) ? deferred.resolve : deferred.reject)({ - data: response, - status: status, - headers: headersGetter(headers), - config: config, - statusText: statusText - }); - } - - function resolvePromiseWithResult(result) { - resolvePromise(result.data, result.status, shallowCopy(result.headers()), result.statusText); - } - - function removePendingReq() { - var idx = $http.pendingRequests.indexOf(config); - if (idx !== -1) $http.pendingRequests.splice(idx, 1); - } - } - - - function buildUrl(url, serializedParams) { - if (serializedParams.length > 0) { - url += ((url.indexOf('?') == -1) ? '?' : '&') + serializedParams; - } - return url; - } - }]; -} - -/** - * @ngdoc service - * @name $xhrFactory - * - * @description - * Factory function used to create XMLHttpRequest objects. - * - * Replace or decorate this service to create your own custom XMLHttpRequest objects. - * - * ``` - * angular.module('myApp', []) - * .factory('$xhrFactory', function() { - * return function createXhr(method, url) { - * return new window.XMLHttpRequest({mozSystem: true}); - * }; - * }); - * ``` - * - * @param {string} method HTTP method of the request (GET, POST, PUT, ..) - * @param {string} url URL of the request. - */ -function $xhrFactoryProvider() { - this.$get = function() { - return function createXhr() { - return new window.XMLHttpRequest(); - }; - }; -} - -/** - * @ngdoc service - * @name $httpBackend - * @requires $window - * @requires $document - * @requires $xhrFactory - * - * @description - * HTTP backend used by the {@link ng.$http service} that delegates to - * XMLHttpRequest object or JSONP and deals with browser incompatibilities. - * - * You should never need to use this service directly, instead use the higher-level abstractions: - * {@link ng.$http $http} or {@link ngResource.$resource $resource}. - * - * During testing this implementation is swapped with {@link ngMock.$httpBackend mock - * $httpBackend} which can be trained with responses. - */ -function $HttpBackendProvider() { - this.$get = ['$browser', '$window', '$document', '$xhrFactory', function($browser, $window, $document, $xhrFactory) { - return createHttpBackend($browser, $xhrFactory, $browser.defer, $window.angular.callbacks, $document[0]); - }]; -} - -function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) { - // TODO(vojta): fix the signature - return function(method, url, post, callback, headers, timeout, withCredentials, responseType) { - $browser.$$incOutstandingRequestCount(); - url = url || $browser.url(); - - if (lowercase(method) == 'jsonp') { - var callbackId = '_' + (callbacks.counter++).toString(36); - callbacks[callbackId] = function(data) { - callbacks[callbackId].data = data; - callbacks[callbackId].called = true; - }; - - var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId), - callbackId, function(status, text) { - completeRequest(callback, status, callbacks[callbackId].data, "", text); - callbacks[callbackId] = noop; - }); - } else { - - var xhr = createXhr(method, url); - - xhr.open(method, url, true); - forEach(headers, function(value, key) { - if (isDefined(value)) { - xhr.setRequestHeader(key, value); - } - }); - - xhr.onload = function requestLoaded() { - var statusText = xhr.statusText || ''; - - // responseText is the old-school way of retrieving response (supported by IE9) - // response/responseType properties were introduced in XHR Level2 spec (supported by IE10) - var response = ('response' in xhr) ? xhr.response : xhr.responseText; - - // normalize IE9 bug (http://bugs.jquery.com/ticket/1450) - var status = xhr.status === 1223 ? 204 : xhr.status; - - // fix status code when it is 0 (0 status is undocumented). - // Occurs when accessing file resources or on Android 4.1 stock browser - // while retrieving files from application cache. - if (status === 0) { - status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0; - } - - completeRequest(callback, - status, - response, - xhr.getAllResponseHeaders(), - statusText); - }; - - var requestError = function() { - // The response is always empty - // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error - completeRequest(callback, -1, null, null, ''); - }; - - xhr.onerror = requestError; - xhr.onabort = requestError; - - if (withCredentials) { - xhr.withCredentials = true; - } - - if (responseType) { - try { - xhr.responseType = responseType; - } catch (e) { - // WebKit added support for the json responseType value on 09/03/2013 - // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are - // known to throw when setting the value "json" as the response type. Other older - // browsers implementing the responseType - // - // The json response type can be ignored if not supported, because JSON payloads are - // parsed on the client-side regardless. - if (responseType !== 'json') { - throw e; - } - } - } - - xhr.send(isUndefined(post) ? null : post); - } - - if (timeout > 0) { - var timeoutId = $browserDefer(timeoutRequest, timeout); - } else if (isPromiseLike(timeout)) { - timeout.then(timeoutRequest); - } - - - function timeoutRequest() { - jsonpDone && jsonpDone(); - xhr && xhr.abort(); - } - - function completeRequest(callback, status, response, headersString, statusText) { - // cancel timeout and subsequent timeout promise resolution - if (isDefined(timeoutId)) { - $browserDefer.cancel(timeoutId); - } - jsonpDone = xhr = null; - - callback(status, response, headersString, statusText); - $browser.$$completeOutstandingRequest(noop); - } - }; - - function jsonpReq(url, callbackId, done) { - // we can't use jQuery/jqLite here because jQuery does crazy stuff with script elements, e.g.: - // - fetches local scripts via XHR and evals them - // - adds and immediately removes script elements from the document - var script = rawDocument.createElement('script'), callback = null; - script.type = "text/javascript"; - script.src = url; - script.async = true; - - callback = function(event) { - removeEventListenerFn(script, "load", callback); - removeEventListenerFn(script, "error", callback); - rawDocument.body.removeChild(script); - script = null; - var status = -1; - var text = "unknown"; - - if (event) { - if (event.type === "load" && !callbacks[callbackId].called) { - event = { type: "error" }; - } - text = event.type; - status = event.type === "error" ? 404 : 200; - } - - if (done) { - done(status, text); - } - }; - - addEventListenerFn(script, "load", callback); - addEventListenerFn(script, "error", callback); - rawDocument.body.appendChild(script); - return callback; - } -} - -var $interpolateMinErr = angular.$interpolateMinErr = minErr('$interpolate'); -$interpolateMinErr.throwNoconcat = function(text) { - throw $interpolateMinErr('noconcat', - "Error while interpolating: {0}\nStrict Contextual Escaping disallows " + - "interpolations that concatenate multiple expressions when a trusted value is " + - "required. See http://docs.angularjs.org/api/ng.$sce", text); -}; - -$interpolateMinErr.interr = function(text, err) { - return $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text, err.toString()); -}; - -/** - * @ngdoc provider - * @name $interpolateProvider - * - * @description - * - * Used for configuring the interpolation markup. Defaults to `{{` and `}}`. - * - *
                                        - * This feature is sometimes used to mix different markup languages, e.g. to wrap an Angular - * template within a Python Jinja template (or any other template language). Mixing templating - * languages is **very dangerous**. The embedding template language will not safely escape Angular - * expressions, so any user-controlled values in the template will cause Cross Site Scripting (XSS) - * security bugs! - *
                                        - * - * @example - - - -
                                        - //demo.label// -
                                        -
                                        - - it('should interpolate binding with custom symbols', function() { - expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.'); - }); - -
                                        - */ -function $InterpolateProvider() { - var startSymbol = '{{'; - var endSymbol = '}}'; - - /** - * @ngdoc method - * @name $interpolateProvider#startSymbol - * @description - * Symbol to denote start of expression in the interpolated string. Defaults to `{{`. - * - * @param {string=} value new value to set the starting symbol to. - * @returns {string|self} Returns the symbol when used as getter and self if used as setter. - */ - this.startSymbol = function(value) { - if (value) { - startSymbol = value; - return this; - } else { - return startSymbol; - } - }; - - /** - * @ngdoc method - * @name $interpolateProvider#endSymbol - * @description - * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. - * - * @param {string=} value new value to set the ending symbol to. - * @returns {string|self} Returns the symbol when used as getter and self if used as setter. - */ - this.endSymbol = function(value) { - if (value) { - endSymbol = value; - return this; - } else { - return endSymbol; - } - }; - - - this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) { - var startSymbolLength = startSymbol.length, - endSymbolLength = endSymbol.length, - escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), 'g'), - escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), 'g'); - - function escape(ch) { - return '\\\\\\' + ch; - } - - function unescapeText(text) { - return text.replace(escapedStartRegexp, startSymbol). - replace(escapedEndRegexp, endSymbol); - } - - function stringify(value) { - if (value == null) { // null || undefined - return ''; - } - switch (typeof value) { - case 'string': - break; - case 'number': - value = '' + value; - break; - default: - value = toJson(value); - } - - return value; - } - - //TODO: this is the same as the constantWatchDelegate in parse.js - function constantWatchDelegate(scope, listener, objectEquality, constantInterp) { - var unwatch; - return unwatch = scope.$watch(function constantInterpolateWatch(scope) { - unwatch(); - return constantInterp(scope); - }, listener, objectEquality); - } - - /** - * @ngdoc service - * @name $interpolate - * @kind function - * - * @requires $parse - * @requires $sce - * - * @description - * - * Compiles a string with markup into an interpolation function. This service is used by the - * HTML {@link ng.$compile $compile} service for data binding. See - * {@link ng.$interpolateProvider $interpolateProvider} for configuring the - * interpolation markup. - * - * - * ```js - * var $interpolate = ...; // injected - * var exp = $interpolate('Hello {{name | uppercase}}!'); - * expect(exp({name:'Angular'})).toEqual('Hello ANGULAR!'); - * ``` - * - * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is - * `true`, the interpolation function will return `undefined` unless all embedded expressions - * evaluate to a value other than `undefined`. - * - * ```js - * var $interpolate = ...; // injected - * var context = {greeting: 'Hello', name: undefined }; - * - * // default "forgiving" mode - * var exp = $interpolate('{{greeting}} {{name}}!'); - * expect(exp(context)).toEqual('Hello !'); - * - * // "allOrNothing" mode - * exp = $interpolate('{{greeting}} {{name}}!', false, null, true); - * expect(exp(context)).toBeUndefined(); - * context.name = 'Angular'; - * expect(exp(context)).toEqual('Hello Angular!'); - * ``` - * - * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior. - * - * ####Escaped Interpolation - * $interpolate provides a mechanism for escaping interpolation markers. Start and end markers - * can be escaped by preceding each of their characters with a REVERSE SOLIDUS U+005C (backslash). - * It will be rendered as a regular start/end marker, and will not be interpreted as an expression - * or binding. - * - * This enables web-servers to prevent script injection attacks and defacing attacks, to some - * degree, while also enabling code examples to work without relying on the - * {@link ng.directive:ngNonBindable ngNonBindable} directive. - * - * **For security purposes, it is strongly encouraged that web servers escape user-supplied data, - * replacing angle brackets (<, >) with &lt; and &gt; respectively, and replacing all - * interpolation start/end markers with their escaped counterparts.** - * - * Escaped interpolation markers are only replaced with the actual interpolation markers in rendered - * output when the $interpolate service processes the text. So, for HTML elements interpolated - * by {@link ng.$compile $compile}, or otherwise interpolated with the `mustHaveExpression` parameter - * set to `true`, the interpolated text must contain an unescaped interpolation expression. As such, - * this is typically useful only when user-data is used in rendering a template from the server, or - * when otherwise untrusted data is used by a directive. - * - * - * - *
                                        - *

                                        {{apptitle}}: \{\{ username = "defaced value"; \}\} - *

                                        - *

                                        {{username}} attempts to inject code which will deface the - * application, but fails to accomplish their task, because the server has correctly - * escaped the interpolation start/end markers with REVERSE SOLIDUS U+005C (backslash) - * characters.

                                        - *

                                        Instead, the result of the attempted script injection is visible, and can be removed - * from the database by an administrator.

                                        - *
                                        - *
                                        - *
                                        - * - * @param {string} text The text with markup to interpolate. - * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have - * embedded expression in order to return an interpolation function. Strings with no - * embedded expression will return null for the interpolation function. - * @param {string=} trustedContext when provided, the returned function passes the interpolated - * result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult, - * trustedContext)} before returning it. Refer to the {@link ng.$sce $sce} service that - * provides Strict Contextual Escaping for details. - * @param {boolean=} allOrNothing if `true`, then the returned function returns undefined - * unless all embedded expressions evaluate to a value other than `undefined`. - * @returns {function(context)} an interpolation function which is used to compute the - * interpolated string. The function has these parameters: - * - * - `context`: evaluation context for all expressions embedded in the interpolated text - */ - function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) { - // Provide a quick exit and simplified result function for text with no interpolation - if (!text.length || text.indexOf(startSymbol) === -1) { - var constantInterp; - if (!mustHaveExpression) { - var unescapedText = unescapeText(text); - constantInterp = valueFn(unescapedText); - constantInterp.exp = text; - constantInterp.expressions = []; - constantInterp.$$watchDelegate = constantWatchDelegate; - } - return constantInterp; - } - - allOrNothing = !!allOrNothing; - var startIndex, - endIndex, - index = 0, - expressions = [], - parseFns = [], - textLength = text.length, - exp, - concat = [], - expressionPositions = []; - - while (index < textLength) { - if (((startIndex = text.indexOf(startSymbol, index)) != -1) && - ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1)) { - if (index !== startIndex) { - concat.push(unescapeText(text.substring(index, startIndex))); - } - exp = text.substring(startIndex + startSymbolLength, endIndex); - expressions.push(exp); - parseFns.push($parse(exp, parseStringifyInterceptor)); - index = endIndex + endSymbolLength; - expressionPositions.push(concat.length); - concat.push(''); - } else { - // we did not find an interpolation, so we have to add the remainder to the separators array - if (index !== textLength) { - concat.push(unescapeText(text.substring(index))); - } - break; - } - } - - // Concatenating expressions makes it hard to reason about whether some combination of - // concatenated values are unsafe to use and could easily lead to XSS. By requiring that a - // single expression be used for iframe[src], object[src], etc., we ensure that the value - // that's used is assigned or constructed by some JS code somewhere that is more testable or - // make it obvious that you bound the value to some user controlled value. This helps reduce - // the load when auditing for XSS issues. - if (trustedContext && concat.length > 1) { - $interpolateMinErr.throwNoconcat(text); - } - - if (!mustHaveExpression || expressions.length) { - var compute = function(values) { - for (var i = 0, ii = expressions.length; i < ii; i++) { - if (allOrNothing && isUndefined(values[i])) return; - concat[expressionPositions[i]] = values[i]; - } - return concat.join(''); - }; - - var getValue = function(value) { - return trustedContext ? - $sce.getTrusted(trustedContext, value) : - $sce.valueOf(value); - }; - - return extend(function interpolationFn(context) { - var i = 0; - var ii = expressions.length; - var values = new Array(ii); - - try { - for (; i < ii; i++) { - values[i] = parseFns[i](context); - } - - return compute(values); - } catch (err) { - $exceptionHandler($interpolateMinErr.interr(text, err)); - } - - }, { - // all of these properties are undocumented for now - exp: text, //just for compatibility with regular watchers created via $watch - expressions: expressions, - $$watchDelegate: function(scope, listener) { - var lastValue; - return scope.$watchGroup(parseFns, function interpolateFnWatcher(values, oldValues) { - var currValue = compute(values); - if (isFunction(listener)) { - listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope); - } - lastValue = currValue; - }); - } - }); - } - - function parseStringifyInterceptor(value) { - try { - value = getValue(value); - return allOrNothing && !isDefined(value) ? value : stringify(value); - } catch (err) { - $exceptionHandler($interpolateMinErr.interr(text, err)); - } - } - } - - - /** - * @ngdoc method - * @name $interpolate#startSymbol - * @description - * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`. - * - * Use {@link ng.$interpolateProvider#startSymbol `$interpolateProvider.startSymbol`} to change - * the symbol. - * - * @returns {string} start symbol. - */ - $interpolate.startSymbol = function() { - return startSymbol; - }; - - - /** - * @ngdoc method - * @name $interpolate#endSymbol - * @description - * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. - * - * Use {@link ng.$interpolateProvider#endSymbol `$interpolateProvider.endSymbol`} to change - * the symbol. - * - * @returns {string} end symbol. - */ - $interpolate.endSymbol = function() { - return endSymbol; - }; - - return $interpolate; - }]; -} - -function $IntervalProvider() { - this.$get = ['$rootScope', '$window', '$q', '$$q', '$browser', - function($rootScope, $window, $q, $$q, $browser) { - var intervals = {}; - - - /** - * @ngdoc service - * @name $interval - * - * @description - * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay` - * milliseconds. - * - * The return value of registering an interval function is a promise. This promise will be - * notified upon each tick of the interval, and will be resolved after `count` iterations, or - * run indefinitely if `count` is not defined. The value of the notification will be the - * number of iterations that have run. - * To cancel an interval, call `$interval.cancel(promise)`. - * - * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to - * move forward by `millis` milliseconds and trigger any functions scheduled to run in that - * time. - * - *
                                        - * **Note**: Intervals created by this service must be explicitly destroyed when you are finished - * with them. In particular they are not automatically destroyed when a controller's scope or a - * directive's element are destroyed. - * You should take this into consideration and make sure to always cancel the interval at the - * appropriate moment. See the example below for more details on how and when to do this. - *
                                        - * - * @param {function()} fn A function that should be called repeatedly. - * @param {number} delay Number of milliseconds between each function call. - * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat - * indefinitely. - * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise - * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. - * @param {...*=} Pass additional parameters to the executed function. - * @returns {promise} A promise which will be notified on each iteration. - * - * @example - * - * - * - * - *
                                        - *
                                        - *
                                        - * Current time is: - *
                                        - * Blood 1 : {{blood_1}} - * Blood 2 : {{blood_2}} - * - * - * - *
                                        - *
                                        - * - *
                                        - *
                                        - */ - function interval(fn, delay, count, invokeApply) { - var hasParams = arguments.length > 4, - args = hasParams ? sliceArgs(arguments, 4) : [], - setInterval = $window.setInterval, - clearInterval = $window.clearInterval, - iteration = 0, - skipApply = (isDefined(invokeApply) && !invokeApply), - deferred = (skipApply ? $$q : $q).defer(), - promise = deferred.promise; - - count = isDefined(count) ? count : 0; - - promise.$$intervalId = setInterval(function tick() { - if (skipApply) { - $browser.defer(callback); - } else { - $rootScope.$evalAsync(callback); - } - deferred.notify(iteration++); - - if (count > 0 && iteration >= count) { - deferred.resolve(iteration); - clearInterval(promise.$$intervalId); - delete intervals[promise.$$intervalId]; - } - - if (!skipApply) $rootScope.$apply(); - - }, delay); - - intervals[promise.$$intervalId] = deferred; - - return promise; - - function callback() { - if (!hasParams) { - fn(iteration); - } else { - fn.apply(null, args); - } - } - } - - - /** - * @ngdoc method - * @name $interval#cancel - * - * @description - * Cancels a task associated with the `promise`. - * - * @param {Promise=} promise returned by the `$interval` function. - * @returns {boolean} Returns `true` if the task was successfully canceled. - */ - interval.cancel = function(promise) { - if (promise && promise.$$intervalId in intervals) { - intervals[promise.$$intervalId].reject('canceled'); - $window.clearInterval(promise.$$intervalId); - delete intervals[promise.$$intervalId]; - return true; - } - return false; - }; - - return interval; - }]; -} - -/** - * @ngdoc service - * @name $locale - * - * @description - * $locale service provides localization rules for various Angular components. As of right now the - * only public api is: - * - * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`) - */ - -var PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/, - DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21}; -var $locationMinErr = minErr('$location'); - - -/** - * Encode path using encodeUriSegment, ignoring forward slashes - * - * @param {string} path Path to encode - * @returns {string} - */ -function encodePath(path) { - var segments = path.split('/'), - i = segments.length; - - while (i--) { - segments[i] = encodeUriSegment(segments[i]); - } - - return segments.join('/'); -} - -function parseAbsoluteUrl(absoluteUrl, locationObj) { - var parsedUrl = urlResolve(absoluteUrl); - - locationObj.$$protocol = parsedUrl.protocol; - locationObj.$$host = parsedUrl.hostname; - locationObj.$$port = toInt(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null; -} - - -function parseAppUrl(relativeUrl, locationObj) { - var prefixed = (relativeUrl.charAt(0) !== '/'); - if (prefixed) { - relativeUrl = '/' + relativeUrl; - } - var match = urlResolve(relativeUrl); - locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ? - match.pathname.substring(1) : match.pathname); - locationObj.$$search = parseKeyValue(match.search); - locationObj.$$hash = decodeURIComponent(match.hash); - - // make sure path starts with '/'; - if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') { - locationObj.$$path = '/' + locationObj.$$path; - } -} - - -/** - * - * @param {string} begin - * @param {string} whole - * @returns {string} returns text from whole after begin or undefined if it does not begin with - * expected string. - */ -function beginsWith(begin, whole) { - if (whole.indexOf(begin) === 0) { - return whole.substr(begin.length); - } -} - - -function stripHash(url) { - var index = url.indexOf('#'); - return index == -1 ? url : url.substr(0, index); -} - -function trimEmptyHash(url) { - return url.replace(/(#.+)|#$/, '$1'); -} - - -function stripFile(url) { - return url.substr(0, stripHash(url).lastIndexOf('/') + 1); -} - -/* return the server only (scheme://host:port) */ -function serverBase(url) { - return url.substring(0, url.indexOf('/', url.indexOf('//') + 2)); -} - - -/** - * LocationHtml5Url represents an url - * This object is exposed as $location service when HTML5 mode is enabled and supported - * - * @constructor - * @param {string} appBase application base URL - * @param {string} appBaseNoFile application base URL stripped of any filename - * @param {string} basePrefix url path prefix - */ -function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) { - this.$$html5 = true; - basePrefix = basePrefix || ''; - parseAbsoluteUrl(appBase, this); - - - /** - * Parse given html5 (regular) url string into properties - * @param {string} url HTML5 url - * @private - */ - this.$$parse = function(url) { - var pathUrl = beginsWith(appBaseNoFile, url); - if (!isString(pathUrl)) { - throw $locationMinErr('ipthprfx', 'Invalid url "{0}", missing path prefix "{1}".', url, - appBaseNoFile); - } - - parseAppUrl(pathUrl, this); - - if (!this.$$path) { - this.$$path = '/'; - } - - this.$$compose(); - }; - - /** - * Compose url and update `absUrl` property - * @private - */ - this.$$compose = function() { - var search = toKeyValue(this.$$search), - hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; - - this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; - this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/' - }; - - this.$$parseLinkUrl = function(url, relHref) { - if (relHref && relHref[0] === '#') { - // special case for links to hash fragments: - // keep the old url and only replace the hash fragment - this.hash(relHref.slice(1)); - return true; - } - var appUrl, prevAppUrl; - var rewrittenUrl; - - if (isDefined(appUrl = beginsWith(appBase, url))) { - prevAppUrl = appUrl; - if (isDefined(appUrl = beginsWith(basePrefix, appUrl))) { - rewrittenUrl = appBaseNoFile + (beginsWith('/', appUrl) || appUrl); - } else { - rewrittenUrl = appBase + prevAppUrl; - } - } else if (isDefined(appUrl = beginsWith(appBaseNoFile, url))) { - rewrittenUrl = appBaseNoFile + appUrl; - } else if (appBaseNoFile == url + '/') { - rewrittenUrl = appBaseNoFile; - } - if (rewrittenUrl) { - this.$$parse(rewrittenUrl); - } - return !!rewrittenUrl; - }; -} - - -/** - * LocationHashbangUrl represents url - * This object is exposed as $location service when developer doesn't opt into html5 mode. - * It also serves as the base class for html5 mode fallback on legacy browsers. - * - * @constructor - * @param {string} appBase application base URL - * @param {string} appBaseNoFile application base URL stripped of any filename - * @param {string} hashPrefix hashbang prefix - */ -function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) { - - parseAbsoluteUrl(appBase, this); - - - /** - * Parse given hashbang url into properties - * @param {string} url Hashbang url - * @private - */ - this.$$parse = function(url) { - var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url); - var withoutHashUrl; - - if (!isUndefined(withoutBaseUrl) && withoutBaseUrl.charAt(0) === '#') { - - // The rest of the url starts with a hash so we have - // got either a hashbang path or a plain hash fragment - withoutHashUrl = beginsWith(hashPrefix, withoutBaseUrl); - if (isUndefined(withoutHashUrl)) { - // There was no hashbang prefix so we just have a hash fragment - withoutHashUrl = withoutBaseUrl; - } - - } else { - // There was no hashbang path nor hash fragment: - // If we are in HTML5 mode we use what is left as the path; - // Otherwise we ignore what is left - if (this.$$html5) { - withoutHashUrl = withoutBaseUrl; - } else { - withoutHashUrl = ''; - if (isUndefined(withoutBaseUrl)) { - appBase = url; - this.replace(); - } - } - } - - parseAppUrl(withoutHashUrl, this); - - this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase); - - this.$$compose(); - - /* - * In Windows, on an anchor node on documents loaded from - * the filesystem, the browser will return a pathname - * prefixed with the drive name ('/C:/path') when a - * pathname without a drive is set: - * * a.setAttribute('href', '/foo') - * * a.pathname === '/C:/foo' //true - * - * Inside of Angular, we're always using pathnames that - * do not include drive names for routing. - */ - function removeWindowsDriveName(path, url, base) { - /* - Matches paths for file protocol on windows, - such as /C:/foo/bar, and captures only /foo/bar. - */ - var windowsFilePathExp = /^\/[A-Z]:(\/.*)/; - - var firstPathSegmentMatch; - - //Get the relative path from the input URL. - if (url.indexOf(base) === 0) { - url = url.replace(base, ''); - } - - // The input URL intentionally contains a first path segment that ends with a colon. - if (windowsFilePathExp.exec(url)) { - return path; - } - - firstPathSegmentMatch = windowsFilePathExp.exec(path); - return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path; - } - }; - - /** - * Compose hashbang url and update `absUrl` property - * @private - */ - this.$$compose = function() { - var search = toKeyValue(this.$$search), - hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; - - this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; - this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : ''); - }; - - this.$$parseLinkUrl = function(url, relHref) { - if (stripHash(appBase) == stripHash(url)) { - this.$$parse(url); - return true; - } - return false; - }; -} - - -/** - * LocationHashbangUrl represents url - * This object is exposed as $location service when html5 history api is enabled but the browser - * does not support it. - * - * @constructor - * @param {string} appBase application base URL - * @param {string} appBaseNoFile application base URL stripped of any filename - * @param {string} hashPrefix hashbang prefix - */ -function LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) { - this.$$html5 = true; - LocationHashbangUrl.apply(this, arguments); - - this.$$parseLinkUrl = function(url, relHref) { - if (relHref && relHref[0] === '#') { - // special case for links to hash fragments: - // keep the old url and only replace the hash fragment - this.hash(relHref.slice(1)); - return true; - } - - var rewrittenUrl; - var appUrl; - - if (appBase == stripHash(url)) { - rewrittenUrl = url; - } else if ((appUrl = beginsWith(appBaseNoFile, url))) { - rewrittenUrl = appBase + hashPrefix + appUrl; - } else if (appBaseNoFile === url + '/') { - rewrittenUrl = appBaseNoFile; - } - if (rewrittenUrl) { - this.$$parse(rewrittenUrl); - } - return !!rewrittenUrl; - }; - - this.$$compose = function() { - var search = toKeyValue(this.$$search), - hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; - - this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; - // include hashPrefix in $$absUrl when $$url is empty so IE9 does not reload page because of removal of '#' - this.$$absUrl = appBase + hashPrefix + this.$$url; - }; - -} - - -var locationPrototype = { - - /** - * Are we in html5 mode? - * @private - */ - $$html5: false, - - /** - * Has any change been replacing? - * @private - */ - $$replace: false, - - /** - * @ngdoc method - * @name $location#absUrl - * - * @description - * This method is getter only. - * - * Return full url representation with all segments encoded according to rules specified in - * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt). - * - * - * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo - * var absUrl = $location.absUrl(); - * // => "http://example.com/#/some/path?foo=bar&baz=xoxo" - * ``` - * - * @return {string} full url - */ - absUrl: locationGetter('$$absUrl'), - - /** - * @ngdoc method - * @name $location#url - * - * @description - * This method is getter / setter. - * - * Return url (e.g. `/path?a=b#hash`) when called without any parameter. - * - * Change path, search and hash, when called with parameter and return `$location`. - * - * - * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo - * var url = $location.url(); - * // => "/some/path?foo=bar&baz=xoxo" - * ``` - * - * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`) - * @return {string} url - */ - url: function(url) { - if (isUndefined(url)) { - return this.$$url; - } - - var match = PATH_MATCH.exec(url); - if (match[1] || url === '') this.path(decodeURIComponent(match[1])); - if (match[2] || match[1] || url === '') this.search(match[3] || ''); - this.hash(match[5] || ''); - - return this; - }, - - /** - * @ngdoc method - * @name $location#protocol - * - * @description - * This method is getter only. - * - * Return protocol of current url. - * - * - * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo - * var protocol = $location.protocol(); - * // => "http" - * ``` - * - * @return {string} protocol of current url - */ - protocol: locationGetter('$$protocol'), - - /** - * @ngdoc method - * @name $location#host - * - * @description - * This method is getter only. - * - * Return host of current url. - * - * Note: compared to the non-angular version `location.host` which returns `hostname:port`, this returns the `hostname` portion only. - * - * - * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo - * var host = $location.host(); - * // => "example.com" - * - * // given url http://user:password@example.com:8080/#/some/path?foo=bar&baz=xoxo - * host = $location.host(); - * // => "example.com" - * host = location.host; - * // => "example.com:8080" - * ``` - * - * @return {string} host of current url. - */ - host: locationGetter('$$host'), - - /** - * @ngdoc method - * @name $location#port - * - * @description - * This method is getter only. - * - * Return port of current url. - * - * - * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo - * var port = $location.port(); - * // => 80 - * ``` - * - * @return {Number} port - */ - port: locationGetter('$$port'), - - /** - * @ngdoc method - * @name $location#path - * - * @description - * This method is getter / setter. - * - * Return path of current url when called without any parameter. - * - * Change path when called with parameter and return `$location`. - * - * Note: Path should always begin with forward slash (/), this method will add the forward slash - * if it is missing. - * - * - * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo - * var path = $location.path(); - * // => "/some/path" - * ``` - * - * @param {(string|number)=} path New path - * @return {string} path - */ - path: locationGetterSetter('$$path', function(path) { - path = path !== null ? path.toString() : ''; - return path.charAt(0) == '/' ? path : '/' + path; - }), - - /** - * @ngdoc method - * @name $location#search - * - * @description - * This method is getter / setter. - * - * Return search part (as object) of current url when called without any parameter. - * - * Change search part when called with parameter and return `$location`. - * - * - * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo - * var searchObject = $location.search(); - * // => {foo: 'bar', baz: 'xoxo'} - * - * // set foo to 'yipee' - * $location.search('foo', 'yipee'); - * // $location.search() => {foo: 'yipee', baz: 'xoxo'} - * ``` - * - * @param {string|Object.|Object.>} search New search params - string or - * hash object. - * - * When called with a single argument the method acts as a setter, setting the `search` component - * of `$location` to the specified value. - * - * If the argument is a hash object containing an array of values, these values will be encoded - * as duplicate search parameters in the url. - * - * @param {(string|Number|Array|boolean)=} paramValue If `search` is a string or number, then `paramValue` - * will override only a single search property. - * - * If `paramValue` is an array, it will override the property of the `search` component of - * `$location` specified via the first argument. - * - * If `paramValue` is `null`, the property specified via the first argument will be deleted. - * - * If `paramValue` is `true`, the property specified via the first argument will be added with no - * value nor trailing equal sign. - * - * @return {Object} If called with no arguments returns the parsed `search` object. If called with - * one or more arguments returns `$location` object itself. - */ - search: function(search, paramValue) { - switch (arguments.length) { - case 0: - return this.$$search; - case 1: - if (isString(search) || isNumber(search)) { - search = search.toString(); - this.$$search = parseKeyValue(search); - } else if (isObject(search)) { - search = copy(search, {}); - // remove object undefined or null properties - forEach(search, function(value, key) { - if (value == null) delete search[key]; - }); - - this.$$search = search; - } else { - throw $locationMinErr('isrcharg', - 'The first argument of the `$location#search()` call must be a string or an object.'); - } - break; - default: - if (isUndefined(paramValue) || paramValue === null) { - delete this.$$search[search]; - } else { - this.$$search[search] = paramValue; - } - } - - this.$$compose(); - return this; - }, - - /** - * @ngdoc method - * @name $location#hash - * - * @description - * This method is getter / setter. - * - * Returns the hash fragment when called without any parameters. - * - * Changes the hash fragment when called with a parameter and returns `$location`. - * - * - * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue - * var hash = $location.hash(); - * // => "hashValue" - * ``` - * - * @param {(string|number)=} hash New hash fragment - * @return {string} hash - */ - hash: locationGetterSetter('$$hash', function(hash) { - return hash !== null ? hash.toString() : ''; - }), - - /** - * @ngdoc method - * @name $location#replace - * - * @description - * If called, all changes to $location during the current `$digest` will replace the current history - * record, instead of adding a new one. - */ - replace: function() { - this.$$replace = true; - return this; - } -}; - -forEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], function(Location) { - Location.prototype = Object.create(locationPrototype); - - /** - * @ngdoc method - * @name $location#state - * - * @description - * This method is getter / setter. - * - * Return the history state object when called without any parameter. - * - * Change the history state object when called with one parameter and return `$location`. - * The state object is later passed to `pushState` or `replaceState`. - * - * NOTE: This method is supported only in HTML5 mode and only in browsers supporting - * the HTML5 History API (i.e. methods `pushState` and `replaceState`). If you need to support - * older browsers (like IE9 or Android < 4.0), don't use this method. - * - * @param {object=} state State object for pushState or replaceState - * @return {object} state - */ - Location.prototype.state = function(state) { - if (!arguments.length) { - return this.$$state; - } - - if (Location !== LocationHtml5Url || !this.$$html5) { - throw $locationMinErr('nostate', 'History API state support is available only ' + - 'in HTML5 mode and only in browsers supporting HTML5 History API'); - } - // The user might modify `stateObject` after invoking `$location.state(stateObject)` - // but we're changing the $$state reference to $browser.state() during the $digest - // so the modification window is narrow. - this.$$state = isUndefined(state) ? null : state; - - return this; - }; -}); - - -function locationGetter(property) { - return function() { - return this[property]; - }; -} - - -function locationGetterSetter(property, preprocess) { - return function(value) { - if (isUndefined(value)) { - return this[property]; - } - - this[property] = preprocess(value); - this.$$compose(); - - return this; - }; -} - - -/** - * @ngdoc service - * @name $location - * - * @requires $rootElement - * - * @description - * The $location service parses the URL in the browser address bar (based on the - * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL - * available to your application. Changes to the URL in the address bar are reflected into - * $location service and changes to $location are reflected into the browser address bar. - * - * **The $location service:** - * - * - Exposes the current URL in the browser address bar, so you can - * - Watch and observe the URL. - * - Change the URL. - * - Synchronizes the URL with the browser when the user - * - Changes the address bar. - * - Clicks the back or forward button (or clicks a History link). - * - Clicks on a link. - * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash). - * - * For more information see {@link guide/$location Developer Guide: Using $location} - */ - -/** - * @ngdoc provider - * @name $locationProvider - * @description - * Use the `$locationProvider` to configure how the application deep linking paths are stored. - */ -function $LocationProvider() { - var hashPrefix = '', - html5Mode = { - enabled: false, - requireBase: true, - rewriteLinks: true - }; - - /** - * @ngdoc method - * @name $locationProvider#hashPrefix - * @description - * @param {string=} prefix Prefix for hash part (containing path and search) - * @returns {*} current value if used as getter or itself (chaining) if used as setter - */ - this.hashPrefix = function(prefix) { - if (isDefined(prefix)) { - hashPrefix = prefix; - return this; - } else { - return hashPrefix; - } - }; - - /** - * @ngdoc method - * @name $locationProvider#html5Mode - * @description - * @param {(boolean|Object)=} mode If boolean, sets `html5Mode.enabled` to value. - * If object, sets `enabled`, `requireBase` and `rewriteLinks` to respective values. Supported - * properties: - * - **enabled** – `{boolean}` – (default: false) If true, will rely on `history.pushState` to - * change urls where supported. Will fall back to hash-prefixed paths in browsers that do not - * support `pushState`. - * - **requireBase** - `{boolean}` - (default: `true`) When html5Mode is enabled, specifies - * whether or not a tag is required to be present. If `enabled` and `requireBase` are - * true, and a base tag is not present, an error will be thrown when `$location` is injected. - * See the {@link guide/$location $location guide for more information} - * - **rewriteLinks** - `{boolean}` - (default: `true`) When html5Mode is enabled, - * enables/disables url rewriting for relative links. - * - * @returns {Object} html5Mode object if used as getter or itself (chaining) if used as setter - */ - this.html5Mode = function(mode) { - if (isBoolean(mode)) { - html5Mode.enabled = mode; - return this; - } else if (isObject(mode)) { - - if (isBoolean(mode.enabled)) { - html5Mode.enabled = mode.enabled; - } - - if (isBoolean(mode.requireBase)) { - html5Mode.requireBase = mode.requireBase; - } - - if (isBoolean(mode.rewriteLinks)) { - html5Mode.rewriteLinks = mode.rewriteLinks; - } - - return this; - } else { - return html5Mode; - } - }; - - /** - * @ngdoc event - * @name $location#$locationChangeStart - * @eventType broadcast on root scope - * @description - * Broadcasted before a URL will change. - * - * This change can be prevented by calling - * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more - * details about event object. Upon successful change - * {@link ng.$location#$locationChangeSuccess $locationChangeSuccess} is fired. - * - * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when - * the browser supports the HTML5 History API. - * - * @param {Object} angularEvent Synthetic event object. - * @param {string} newUrl New URL - * @param {string=} oldUrl URL that was before it was changed. - * @param {string=} newState New history state object - * @param {string=} oldState History state object that was before it was changed. - */ - - /** - * @ngdoc event - * @name $location#$locationChangeSuccess - * @eventType broadcast on root scope - * @description - * Broadcasted after a URL was changed. - * - * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when - * the browser supports the HTML5 History API. - * - * @param {Object} angularEvent Synthetic event object. - * @param {string} newUrl New URL - * @param {string=} oldUrl URL that was before it was changed. - * @param {string=} newState New history state object - * @param {string=} oldState History state object that was before it was changed. - */ - - this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', '$window', - function($rootScope, $browser, $sniffer, $rootElement, $window) { - var $location, - LocationMode, - baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to '' - initialUrl = $browser.url(), - appBase; - - if (html5Mode.enabled) { - if (!baseHref && html5Mode.requireBase) { - throw $locationMinErr('nobase', - "$location in HTML5 mode requires a tag to be present!"); - } - appBase = serverBase(initialUrl) + (baseHref || '/'); - LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url; - } else { - appBase = stripHash(initialUrl); - LocationMode = LocationHashbangUrl; - } - var appBaseNoFile = stripFile(appBase); - - $location = new LocationMode(appBase, appBaseNoFile, '#' + hashPrefix); - $location.$$parseLinkUrl(initialUrl, initialUrl); - - $location.$$state = $browser.state(); - - var IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i; - - function setBrowserUrlWithFallback(url, replace, state) { - var oldUrl = $location.url(); - var oldState = $location.$$state; - try { - $browser.url(url, replace, state); - - // Make sure $location.state() returns referentially identical (not just deeply equal) - // state object; this makes possible quick checking if the state changed in the digest - // loop. Checking deep equality would be too expensive. - $location.$$state = $browser.state(); - } catch (e) { - // Restore old values if pushState fails - $location.url(oldUrl); - $location.$$state = oldState; - - throw e; - } - } - - $rootElement.on('click', function(event) { - // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser) - // currently we open nice url link and redirect then - - if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.shiftKey || event.which == 2 || event.button == 2) return; - - var elm = jqLite(event.target); - - // traverse the DOM up to find first A tag - while (nodeName_(elm[0]) !== 'a') { - // ignore rewriting if no A tag (reached root element, or no parent - removed from document) - if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return; - } - - var absHref = elm.prop('href'); - // get the actual href attribute - see - // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx - var relHref = elm.attr('href') || elm.attr('xlink:href'); - - if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') { - // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during - // an animation. - absHref = urlResolve(absHref.animVal).href; - } - - // Ignore when url is started with javascript: or mailto: - if (IGNORE_URI_REGEXP.test(absHref)) return; - - if (absHref && !elm.attr('target') && !event.isDefaultPrevented()) { - if ($location.$$parseLinkUrl(absHref, relHref)) { - // We do a preventDefault for all urls that are part of the angular application, - // in html5mode and also without, so that we are able to abort navigation without - // getting double entries in the location history. - event.preventDefault(); - // update location manually - if ($location.absUrl() != $browser.url()) { - $rootScope.$apply(); - // hack to work around FF6 bug 684208 when scenario runner clicks on links - $window.angular['ff-684208-preventDefault'] = true; - } - } - } - }); - - - // rewrite hashbang url <> html5 url - if (trimEmptyHash($location.absUrl()) != trimEmptyHash(initialUrl)) { - $browser.url($location.absUrl(), true); - } - - var initializing = true; - - // update $location when $browser url changes - $browser.onUrlChange(function(newUrl, newState) { - - if (isUndefined(beginsWith(appBaseNoFile, newUrl))) { - // If we are navigating outside of the app then force a reload - $window.location.href = newUrl; - return; - } - - $rootScope.$evalAsync(function() { - var oldUrl = $location.absUrl(); - var oldState = $location.$$state; - var defaultPrevented; - newUrl = trimEmptyHash(newUrl); - $location.$$parse(newUrl); - $location.$$state = newState; - - defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, - newState, oldState).defaultPrevented; - - // if the location was changed by a `$locationChangeStart` handler then stop - // processing this location change - if ($location.absUrl() !== newUrl) return; - - if (defaultPrevented) { - $location.$$parse(oldUrl); - $location.$$state = oldState; - setBrowserUrlWithFallback(oldUrl, false, oldState); - } else { - initializing = false; - afterLocationChange(oldUrl, oldState); - } - }); - if (!$rootScope.$$phase) $rootScope.$digest(); - }); - - // update browser - $rootScope.$watch(function $locationWatch() { - var oldUrl = trimEmptyHash($browser.url()); - var newUrl = trimEmptyHash($location.absUrl()); - var oldState = $browser.state(); - var currentReplace = $location.$$replace; - var urlOrStateChanged = oldUrl !== newUrl || - ($location.$$html5 && $sniffer.history && oldState !== $location.$$state); - - if (initializing || urlOrStateChanged) { - initializing = false; - - $rootScope.$evalAsync(function() { - var newUrl = $location.absUrl(); - var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, - $location.$$state, oldState).defaultPrevented; - - // if the location was changed by a `$locationChangeStart` handler then stop - // processing this location change - if ($location.absUrl() !== newUrl) return; - - if (defaultPrevented) { - $location.$$parse(oldUrl); - $location.$$state = oldState; - } else { - if (urlOrStateChanged) { - setBrowserUrlWithFallback(newUrl, currentReplace, - oldState === $location.$$state ? null : $location.$$state); - } - afterLocationChange(oldUrl, oldState); - } - }); - } - - $location.$$replace = false; - - // we don't need to return anything because $evalAsync will make the digest loop dirty when - // there is a change - }); - - return $location; - - function afterLocationChange(oldUrl, oldState) { - $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl, - $location.$$state, oldState); - } -}]; -} - -/** - * @ngdoc service - * @name $log - * @requires $window - * - * @description - * Simple service for logging. Default implementation safely writes the message - * into the browser's console (if present). - * - * The main purpose of this service is to simplify debugging and troubleshooting. - * - * The default is to log `debug` messages. You can use - * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this. - * - * @example - - - angular.module('logExample', []) - .controller('LogController', ['$scope', '$log', function($scope, $log) { - $scope.$log = $log; - $scope.message = 'Hello World!'; - }]); - - -
                                        -

                                        Reload this page with open console, enter text and hit the log button...

                                        - - - - - - -
                                        -
                                        -
                                        - */ - -/** - * @ngdoc provider - * @name $logProvider - * @description - * Use the `$logProvider` to configure how the application logs messages - */ -function $LogProvider() { - var debug = true, - self = this; - - /** - * @ngdoc method - * @name $logProvider#debugEnabled - * @description - * @param {boolean=} flag enable or disable debug level messages - * @returns {*} current value if used as getter or itself (chaining) if used as setter - */ - this.debugEnabled = function(flag) { - if (isDefined(flag)) { - debug = flag; - return this; - } else { - return debug; - } - }; - - this.$get = ['$window', function($window) { - return { - /** - * @ngdoc method - * @name $log#log - * - * @description - * Write a log message - */ - log: consoleLog('log'), - - /** - * @ngdoc method - * @name $log#info - * - * @description - * Write an information message - */ - info: consoleLog('info'), - - /** - * @ngdoc method - * @name $log#warn - * - * @description - * Write a warning message - */ - warn: consoleLog('warn'), - - /** - * @ngdoc method - * @name $log#error - * - * @description - * Write an error message - */ - error: consoleLog('error'), - - /** - * @ngdoc method - * @name $log#debug - * - * @description - * Write a debug message - */ - debug: (function() { - var fn = consoleLog('debug'); - - return function() { - if (debug) { - fn.apply(self, arguments); - } - }; - }()) - }; - - function formatError(arg) { - if (arg instanceof Error) { - if (arg.stack) { - arg = (arg.message && arg.stack.indexOf(arg.message) === -1) - ? 'Error: ' + arg.message + '\n' + arg.stack - : arg.stack; - } else if (arg.sourceURL) { - arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line; - } - } - return arg; - } - - function consoleLog(type) { - var console = $window.console || {}, - logFn = console[type] || console.log || noop, - hasApply = false; - - // Note: reading logFn.apply throws an error in IE11 in IE8 document mode. - // The reason behind this is that console.log has type "object" in IE8... - try { - hasApply = !!logFn.apply; - } catch (e) {} - - if (hasApply) { - return function() { - var args = []; - forEach(arguments, function(arg) { - args.push(formatError(arg)); - }); - return logFn.apply(console, args); - }; - } - - // we are IE which either doesn't have window.console => this is noop and we do nothing, - // or we are IE where console.log doesn't have apply so we log at least first 2 args - return function(arg1, arg2) { - logFn(arg1, arg2 == null ? '' : arg2); - }; - } - }]; -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Any commits to this file should be reviewed with security in mind. * - * Changes to this file can potentially create security vulnerabilities. * - * An approval from 2 Core members with history of modifying * - * this file is required. * - * * - * Does the change somehow allow for arbitrary javascript to be executed? * - * Or allows for someone to change the prototype of built-in objects? * - * Or gives undesired access to variables likes document or window? * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -var $parseMinErr = minErr('$parse'); - -// Sandboxing Angular Expressions -// ------------------------------ -// Angular expressions are generally considered safe because these expressions only have direct -// access to `$scope` and locals. However, one can obtain the ability to execute arbitrary JS code by -// obtaining a reference to native JS functions such as the Function constructor. -// -// As an example, consider the following Angular expression: -// -// {}.toString.constructor('alert("evil JS code")') -// -// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits -// against the expression language, but not to prevent exploits that were enabled by exposing -// sensitive JavaScript or browser APIs on Scope. Exposing such objects on a Scope is never a good -// practice and therefore we are not even trying to protect against interaction with an object -// explicitly exposed in this way. -// -// In general, it is not possible to access a Window object from an angular expression unless a -// window or some DOM object that has a reference to window is published onto a Scope. -// Similarly we prevent invocations of function known to be dangerous, as well as assignments to -// native objects. -// -// See https://docs.angularjs.org/guide/security - - -function ensureSafeMemberName(name, fullExpression) { - if (name === "__defineGetter__" || name === "__defineSetter__" - || name === "__lookupGetter__" || name === "__lookupSetter__" - || name === "__proto__") { - throw $parseMinErr('isecfld', - 'Attempting to access a disallowed field in Angular expressions! ' - + 'Expression: {0}', fullExpression); - } - return name; -} - -function getStringValue(name) { - // Property names must be strings. This means that non-string objects cannot be used - // as keys in an object. Any non-string object, including a number, is typecasted - // into a string via the toString method. - // -- MDN, https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Property_accessors#Property_names - // - // So, to ensure that we are checking the same `name` that JavaScript would use, we cast it - // to a string. It's not always possible. If `name` is an object and its `toString` method is - // 'broken' (doesn't return a string, isn't a function, etc.), an error will be thrown: - // - // TypeError: Cannot convert object to primitive value - // - // For performance reasons, we don't catch this error here and allow it to propagate up the call - // stack. Note that you'll get the same error in JavaScript if you try to access a property using - // such a 'broken' object as a key. - return name + ''; -} - -function ensureSafeObject(obj, fullExpression) { - // nifty check if obj is Function that is fast and works across iframes and other contexts - if (obj) { - if (obj.constructor === obj) { - throw $parseMinErr('isecfn', - 'Referencing Function in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } else if (// isWindow(obj) - obj.window === obj) { - throw $parseMinErr('isecwindow', - 'Referencing the Window in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } else if (// isElement(obj) - obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) { - throw $parseMinErr('isecdom', - 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } else if (// block Object so that we can't get hold of dangerous Object.* methods - obj === Object) { - throw $parseMinErr('isecobj', - 'Referencing Object in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } - } - return obj; -} - -var CALL = Function.prototype.call; -var APPLY = Function.prototype.apply; -var BIND = Function.prototype.bind; - -function ensureSafeFunction(obj, fullExpression) { - if (obj) { - if (obj.constructor === obj) { - throw $parseMinErr('isecfn', - 'Referencing Function in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } else if (obj === CALL || obj === APPLY || obj === BIND) { - throw $parseMinErr('isecff', - 'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } - } -} - -function ensureSafeAssignContext(obj, fullExpression) { - if (obj) { - if (obj === (0).constructor || obj === (false).constructor || obj === ''.constructor || - obj === {}.constructor || obj === [].constructor || obj === Function.constructor) { - throw $parseMinErr('isecaf', - 'Assigning to a constructor is disallowed! Expression: {0}', fullExpression); - } - } -} - -var OPERATORS = createMap(); -forEach('+ - * / % === !== == != < > <= >= && || ! = |'.split(' '), function(operator) { OPERATORS[operator] = true; }); -var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'}; - - -///////////////////////////////////////// - - -/** - * @constructor - */ -var Lexer = function(options) { - this.options = options; -}; - -Lexer.prototype = { - constructor: Lexer, - - lex: function(text) { - this.text = text; - this.index = 0; - this.tokens = []; - - while (this.index < this.text.length) { - var ch = this.text.charAt(this.index); - if (ch === '"' || ch === "'") { - this.readString(ch); - } else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) { - this.readNumber(); - } else if (this.isIdent(ch)) { - this.readIdent(); - } else if (this.is(ch, '(){}[].,;:?')) { - this.tokens.push({index: this.index, text: ch}); - this.index++; - } else if (this.isWhitespace(ch)) { - this.index++; - } else { - var ch2 = ch + this.peek(); - var ch3 = ch2 + this.peek(2); - var op1 = OPERATORS[ch]; - var op2 = OPERATORS[ch2]; - var op3 = OPERATORS[ch3]; - if (op1 || op2 || op3) { - var token = op3 ? ch3 : (op2 ? ch2 : ch); - this.tokens.push({index: this.index, text: token, operator: true}); - this.index += token.length; - } else { - this.throwError('Unexpected next character ', this.index, this.index + 1); - } - } - } - return this.tokens; - }, - - is: function(ch, chars) { - return chars.indexOf(ch) !== -1; - }, - - peek: function(i) { - var num = i || 1; - return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false; - }, - - isNumber: function(ch) { - return ('0' <= ch && ch <= '9') && typeof ch === "string"; - }, - - isWhitespace: function(ch) { - // IE treats non-breaking space as \u00A0 - return (ch === ' ' || ch === '\r' || ch === '\t' || - ch === '\n' || ch === '\v' || ch === '\u00A0'); - }, - - isIdent: function(ch) { - return ('a' <= ch && ch <= 'z' || - 'A' <= ch && ch <= 'Z' || - '_' === ch || ch === '$'); - }, - - isExpOperator: function(ch) { - return (ch === '-' || ch === '+' || this.isNumber(ch)); - }, - - throwError: function(error, start, end) { - end = end || this.index; - var colStr = (isDefined(start) - ? 's ' + start + '-' + this.index + ' [' + this.text.substring(start, end) + ']' - : ' ' + end); - throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].', - error, colStr, this.text); - }, - - readNumber: function() { - var number = ''; - var start = this.index; - while (this.index < this.text.length) { - var ch = lowercase(this.text.charAt(this.index)); - if (ch == '.' || this.isNumber(ch)) { - number += ch; - } else { - var peekCh = this.peek(); - if (ch == 'e' && this.isExpOperator(peekCh)) { - number += ch; - } else if (this.isExpOperator(ch) && - peekCh && this.isNumber(peekCh) && - number.charAt(number.length - 1) == 'e') { - number += ch; - } else if (this.isExpOperator(ch) && - (!peekCh || !this.isNumber(peekCh)) && - number.charAt(number.length - 1) == 'e') { - this.throwError('Invalid exponent'); - } else { - break; - } - } - this.index++; - } - this.tokens.push({ - index: start, - text: number, - constant: true, - value: Number(number) - }); - }, - - readIdent: function() { - var start = this.index; - while (this.index < this.text.length) { - var ch = this.text.charAt(this.index); - if (!(this.isIdent(ch) || this.isNumber(ch))) { - break; - } - this.index++; - } - this.tokens.push({ - index: start, - text: this.text.slice(start, this.index), - identifier: true - }); - }, - - readString: function(quote) { - var start = this.index; - this.index++; - var string = ''; - var rawString = quote; - var escape = false; - while (this.index < this.text.length) { - var ch = this.text.charAt(this.index); - rawString += ch; - if (escape) { - if (ch === 'u') { - var hex = this.text.substring(this.index + 1, this.index + 5); - if (!hex.match(/[\da-f]{4}/i)) { - this.throwError('Invalid unicode escape [\\u' + hex + ']'); - } - this.index += 4; - string += String.fromCharCode(parseInt(hex, 16)); - } else { - var rep = ESCAPE[ch]; - string = string + (rep || ch); - } - escape = false; - } else if (ch === '\\') { - escape = true; - } else if (ch === quote) { - this.index++; - this.tokens.push({ - index: start, - text: rawString, - constant: true, - value: string - }); - return; - } else { - string += ch; - } - this.index++; - } - this.throwError('Unterminated quote', start); - } -}; - -var AST = function(lexer, options) { - this.lexer = lexer; - this.options = options; -}; - -AST.Program = 'Program'; -AST.ExpressionStatement = 'ExpressionStatement'; -AST.AssignmentExpression = 'AssignmentExpression'; -AST.ConditionalExpression = 'ConditionalExpression'; -AST.LogicalExpression = 'LogicalExpression'; -AST.BinaryExpression = 'BinaryExpression'; -AST.UnaryExpression = 'UnaryExpression'; -AST.CallExpression = 'CallExpression'; -AST.MemberExpression = 'MemberExpression'; -AST.Identifier = 'Identifier'; -AST.Literal = 'Literal'; -AST.ArrayExpression = 'ArrayExpression'; -AST.Property = 'Property'; -AST.ObjectExpression = 'ObjectExpression'; -AST.ThisExpression = 'ThisExpression'; -AST.LocalsExpression = 'LocalsExpression'; - -// Internal use only -AST.NGValueParameter = 'NGValueParameter'; - -AST.prototype = { - ast: function(text) { - this.text = text; - this.tokens = this.lexer.lex(text); - - var value = this.program(); - - if (this.tokens.length !== 0) { - this.throwError('is an unexpected token', this.tokens[0]); - } - - return value; - }, - - program: function() { - var body = []; - while (true) { - if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']')) - body.push(this.expressionStatement()); - if (!this.expect(';')) { - return { type: AST.Program, body: body}; - } - } - }, - - expressionStatement: function() { - return { type: AST.ExpressionStatement, expression: this.filterChain() }; - }, - - filterChain: function() { - var left = this.expression(); - var token; - while ((token = this.expect('|'))) { - left = this.filter(left); - } - return left; - }, - - expression: function() { - return this.assignment(); - }, - - assignment: function() { - var result = this.ternary(); - if (this.expect('=')) { - result = { type: AST.AssignmentExpression, left: result, right: this.assignment(), operator: '='}; - } - return result; - }, - - ternary: function() { - var test = this.logicalOR(); - var alternate; - var consequent; - if (this.expect('?')) { - alternate = this.expression(); - if (this.consume(':')) { - consequent = this.expression(); - return { type: AST.ConditionalExpression, test: test, alternate: alternate, consequent: consequent}; - } - } - return test; - }, - - logicalOR: function() { - var left = this.logicalAND(); - while (this.expect('||')) { - left = { type: AST.LogicalExpression, operator: '||', left: left, right: this.logicalAND() }; - } - return left; - }, - - logicalAND: function() { - var left = this.equality(); - while (this.expect('&&')) { - left = { type: AST.LogicalExpression, operator: '&&', left: left, right: this.equality()}; - } - return left; - }, - - equality: function() { - var left = this.relational(); - var token; - while ((token = this.expect('==','!=','===','!=='))) { - left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.relational() }; - } - return left; - }, - - relational: function() { - var left = this.additive(); - var token; - while ((token = this.expect('<', '>', '<=', '>='))) { - left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.additive() }; - } - return left; - }, - - additive: function() { - var left = this.multiplicative(); - var token; - while ((token = this.expect('+','-'))) { - left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.multiplicative() }; - } - return left; - }, - - multiplicative: function() { - var left = this.unary(); - var token; - while ((token = this.expect('*','/','%'))) { - left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.unary() }; - } - return left; - }, - - unary: function() { - var token; - if ((token = this.expect('+', '-', '!'))) { - return { type: AST.UnaryExpression, operator: token.text, prefix: true, argument: this.unary() }; - } else { - return this.primary(); - } - }, - - primary: function() { - var primary; - if (this.expect('(')) { - primary = this.filterChain(); - this.consume(')'); - } else if (this.expect('[')) { - primary = this.arrayDeclaration(); - } else if (this.expect('{')) { - primary = this.object(); - } else if (this.selfReferential.hasOwnProperty(this.peek().text)) { - primary = copy(this.selfReferential[this.consume().text]); - } else if (this.options.literals.hasOwnProperty(this.peek().text)) { - primary = { type: AST.Literal, value: this.options.literals[this.consume().text]}; - } else if (this.peek().identifier) { - primary = this.identifier(); - } else if (this.peek().constant) { - primary = this.constant(); - } else { - this.throwError('not a primary expression', this.peek()); - } - - var next; - while ((next = this.expect('(', '[', '.'))) { - if (next.text === '(') { - primary = {type: AST.CallExpression, callee: primary, arguments: this.parseArguments() }; - this.consume(')'); - } else if (next.text === '[') { - primary = { type: AST.MemberExpression, object: primary, property: this.expression(), computed: true }; - this.consume(']'); - } else if (next.text === '.') { - primary = { type: AST.MemberExpression, object: primary, property: this.identifier(), computed: false }; - } else { - this.throwError('IMPOSSIBLE'); - } - } - return primary; - }, - - filter: function(baseExpression) { - var args = [baseExpression]; - var result = {type: AST.CallExpression, callee: this.identifier(), arguments: args, filter: true}; - - while (this.expect(':')) { - args.push(this.expression()); - } - - return result; - }, - - parseArguments: function() { - var args = []; - if (this.peekToken().text !== ')') { - do { - args.push(this.expression()); - } while (this.expect(',')); - } - return args; - }, - - identifier: function() { - var token = this.consume(); - if (!token.identifier) { - this.throwError('is not a valid identifier', token); - } - return { type: AST.Identifier, name: token.text }; - }, - - constant: function() { - // TODO check that it is a constant - return { type: AST.Literal, value: this.consume().value }; - }, - - arrayDeclaration: function() { - var elements = []; - if (this.peekToken().text !== ']') { - do { - if (this.peek(']')) { - // Support trailing commas per ES5.1. - break; - } - elements.push(this.expression()); - } while (this.expect(',')); - } - this.consume(']'); - - return { type: AST.ArrayExpression, elements: elements }; - }, - - object: function() { - var properties = [], property; - if (this.peekToken().text !== '}') { - do { - if (this.peek('}')) { - // Support trailing commas per ES5.1. - break; - } - property = {type: AST.Property, kind: 'init'}; - if (this.peek().constant) { - property.key = this.constant(); - } else if (this.peek().identifier) { - property.key = this.identifier(); - } else { - this.throwError("invalid key", this.peek()); - } - this.consume(':'); - property.value = this.expression(); - properties.push(property); - } while (this.expect(',')); - } - this.consume('}'); - - return {type: AST.ObjectExpression, properties: properties }; - }, - - throwError: function(msg, token) { - throw $parseMinErr('syntax', - 'Syntax Error: Token \'{0}\' {1} at column {2} of the expression [{3}] starting at [{4}].', - token.text, msg, (token.index + 1), this.text, this.text.substring(token.index)); - }, - - consume: function(e1) { - if (this.tokens.length === 0) { - throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); - } - - var token = this.expect(e1); - if (!token) { - this.throwError('is unexpected, expecting [' + e1 + ']', this.peek()); - } - return token; - }, - - peekToken: function() { - if (this.tokens.length === 0) { - throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); - } - return this.tokens[0]; - }, - - peek: function(e1, e2, e3, e4) { - return this.peekAhead(0, e1, e2, e3, e4); - }, - - peekAhead: function(i, e1, e2, e3, e4) { - if (this.tokens.length > i) { - var token = this.tokens[i]; - var t = token.text; - if (t === e1 || t === e2 || t === e3 || t === e4 || - (!e1 && !e2 && !e3 && !e4)) { - return token; - } - } - return false; - }, - - expect: function(e1, e2, e3, e4) { - var token = this.peek(e1, e2, e3, e4); - if (token) { - this.tokens.shift(); - return token; - } - return false; - }, - - selfReferential: { - 'this': {type: AST.ThisExpression }, - '$locals': {type: AST.LocalsExpression } - } -}; - -function ifDefined(v, d) { - return typeof v !== 'undefined' ? v : d; -} - -function plusFn(l, r) { - if (typeof l === 'undefined') return r; - if (typeof r === 'undefined') return l; - return l + r; -} - -function isStateless($filter, filterName) { - var fn = $filter(filterName); - return !fn.$stateful; -} - -function findConstantAndWatchExpressions(ast, $filter) { - var allConstants; - var argsToWatch; - switch (ast.type) { - case AST.Program: - allConstants = true; - forEach(ast.body, function(expr) { - findConstantAndWatchExpressions(expr.expression, $filter); - allConstants = allConstants && expr.expression.constant; - }); - ast.constant = allConstants; - break; - case AST.Literal: - ast.constant = true; - ast.toWatch = []; - break; - case AST.UnaryExpression: - findConstantAndWatchExpressions(ast.argument, $filter); - ast.constant = ast.argument.constant; - ast.toWatch = ast.argument.toWatch; - break; - case AST.BinaryExpression: - findConstantAndWatchExpressions(ast.left, $filter); - findConstantAndWatchExpressions(ast.right, $filter); - ast.constant = ast.left.constant && ast.right.constant; - ast.toWatch = ast.left.toWatch.concat(ast.right.toWatch); - break; - case AST.LogicalExpression: - findConstantAndWatchExpressions(ast.left, $filter); - findConstantAndWatchExpressions(ast.right, $filter); - ast.constant = ast.left.constant && ast.right.constant; - ast.toWatch = ast.constant ? [] : [ast]; - break; - case AST.ConditionalExpression: - findConstantAndWatchExpressions(ast.test, $filter); - findConstantAndWatchExpressions(ast.alternate, $filter); - findConstantAndWatchExpressions(ast.consequent, $filter); - ast.constant = ast.test.constant && ast.alternate.constant && ast.consequent.constant; - ast.toWatch = ast.constant ? [] : [ast]; - break; - case AST.Identifier: - ast.constant = false; - ast.toWatch = [ast]; - break; - case AST.MemberExpression: - findConstantAndWatchExpressions(ast.object, $filter); - if (ast.computed) { - findConstantAndWatchExpressions(ast.property, $filter); - } - ast.constant = ast.object.constant && (!ast.computed || ast.property.constant); - ast.toWatch = [ast]; - break; - case AST.CallExpression: - allConstants = ast.filter ? isStateless($filter, ast.callee.name) : false; - argsToWatch = []; - forEach(ast.arguments, function(expr) { - findConstantAndWatchExpressions(expr, $filter); - allConstants = allConstants && expr.constant; - if (!expr.constant) { - argsToWatch.push.apply(argsToWatch, expr.toWatch); - } - }); - ast.constant = allConstants; - ast.toWatch = ast.filter && isStateless($filter, ast.callee.name) ? argsToWatch : [ast]; - break; - case AST.AssignmentExpression: - findConstantAndWatchExpressions(ast.left, $filter); - findConstantAndWatchExpressions(ast.right, $filter); - ast.constant = ast.left.constant && ast.right.constant; - ast.toWatch = [ast]; - break; - case AST.ArrayExpression: - allConstants = true; - argsToWatch = []; - forEach(ast.elements, function(expr) { - findConstantAndWatchExpressions(expr, $filter); - allConstants = allConstants && expr.constant; - if (!expr.constant) { - argsToWatch.push.apply(argsToWatch, expr.toWatch); - } - }); - ast.constant = allConstants; - ast.toWatch = argsToWatch; - break; - case AST.ObjectExpression: - allConstants = true; - argsToWatch = []; - forEach(ast.properties, function(property) { - findConstantAndWatchExpressions(property.value, $filter); - allConstants = allConstants && property.value.constant; - if (!property.value.constant) { - argsToWatch.push.apply(argsToWatch, property.value.toWatch); - } - }); - ast.constant = allConstants; - ast.toWatch = argsToWatch; - break; - case AST.ThisExpression: - ast.constant = false; - ast.toWatch = []; - break; - case AST.LocalsExpression: - ast.constant = false; - ast.toWatch = []; - break; - } -} - -function getInputs(body) { - if (body.length != 1) return; - var lastExpression = body[0].expression; - var candidate = lastExpression.toWatch; - if (candidate.length !== 1) return candidate; - return candidate[0] !== lastExpression ? candidate : undefined; -} - -function isAssignable(ast) { - return ast.type === AST.Identifier || ast.type === AST.MemberExpression; -} - -function assignableAST(ast) { - if (ast.body.length === 1 && isAssignable(ast.body[0].expression)) { - return {type: AST.AssignmentExpression, left: ast.body[0].expression, right: {type: AST.NGValueParameter}, operator: '='}; - } -} - -function isLiteral(ast) { - return ast.body.length === 0 || - ast.body.length === 1 && ( - ast.body[0].expression.type === AST.Literal || - ast.body[0].expression.type === AST.ArrayExpression || - ast.body[0].expression.type === AST.ObjectExpression); -} - -function isConstant(ast) { - return ast.constant; -} - -function ASTCompiler(astBuilder, $filter) { - this.astBuilder = astBuilder; - this.$filter = $filter; -} - -ASTCompiler.prototype = { - compile: function(expression, expensiveChecks) { - var self = this; - var ast = this.astBuilder.ast(expression); - this.state = { - nextId: 0, - filters: {}, - expensiveChecks: expensiveChecks, - fn: {vars: [], body: [], own: {}}, - assign: {vars: [], body: [], own: {}}, - inputs: [] - }; - findConstantAndWatchExpressions(ast, self.$filter); - var extra = ''; - var assignable; - this.stage = 'assign'; - if ((assignable = assignableAST(ast))) { - this.state.computing = 'assign'; - var result = this.nextId(); - this.recurse(assignable, result); - this.return_(result); - extra = 'fn.assign=' + this.generateFunction('assign', 's,v,l'); - } - var toWatch = getInputs(ast.body); - self.stage = 'inputs'; - forEach(toWatch, function(watch, key) { - var fnKey = 'fn' + key; - self.state[fnKey] = {vars: [], body: [], own: {}}; - self.state.computing = fnKey; - var intoId = self.nextId(); - self.recurse(watch, intoId); - self.return_(intoId); - self.state.inputs.push(fnKey); - watch.watchId = key; - }); - this.state.computing = 'fn'; - this.stage = 'main'; - this.recurse(ast); - var fnString = - // The build and minification steps remove the string "use strict" from the code, but this is done using a regex. - // This is a workaround for this until we do a better job at only removing the prefix only when we should. - '"' + this.USE + ' ' + this.STRICT + '";\n' + - this.filterPrefix() + - 'var fn=' + this.generateFunction('fn', 's,l,a,i') + - extra + - this.watchFns() + - 'return fn;'; - - /* jshint -W054 */ - var fn = (new Function('$filter', - 'ensureSafeMemberName', - 'ensureSafeObject', - 'ensureSafeFunction', - 'getStringValue', - 'ensureSafeAssignContext', - 'ifDefined', - 'plus', - 'text', - fnString))( - this.$filter, - ensureSafeMemberName, - ensureSafeObject, - ensureSafeFunction, - getStringValue, - ensureSafeAssignContext, - ifDefined, - plusFn, - expression); - /* jshint +W054 */ - this.state = this.stage = undefined; - fn.literal = isLiteral(ast); - fn.constant = isConstant(ast); - return fn; - }, - - USE: 'use', - - STRICT: 'strict', - - watchFns: function() { - var result = []; - var fns = this.state.inputs; - var self = this; - forEach(fns, function(name) { - result.push('var ' + name + '=' + self.generateFunction(name, 's')); - }); - if (fns.length) { - result.push('fn.inputs=[' + fns.join(',') + '];'); - } - return result.join(''); - }, - - generateFunction: function(name, params) { - return 'function(' + params + '){' + - this.varsPrefix(name) + - this.body(name) + - '};'; - }, - - filterPrefix: function() { - var parts = []; - var self = this; - forEach(this.state.filters, function(id, filter) { - parts.push(id + '=$filter(' + self.escape(filter) + ')'); - }); - if (parts.length) return 'var ' + parts.join(',') + ';'; - return ''; - }, - - varsPrefix: function(section) { - return this.state[section].vars.length ? 'var ' + this.state[section].vars.join(',') + ';' : ''; - }, - - body: function(section) { - return this.state[section].body.join(''); - }, - - recurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) { - var left, right, self = this, args, expression; - recursionFn = recursionFn || noop; - if (!skipWatchIdCheck && isDefined(ast.watchId)) { - intoId = intoId || this.nextId(); - this.if_('i', - this.lazyAssign(intoId, this.computedMember('i', ast.watchId)), - this.lazyRecurse(ast, intoId, nameId, recursionFn, create, true) - ); - return; - } - switch (ast.type) { - case AST.Program: - forEach(ast.body, function(expression, pos) { - self.recurse(expression.expression, undefined, undefined, function(expr) { right = expr; }); - if (pos !== ast.body.length - 1) { - self.current().body.push(right, ';'); - } else { - self.return_(right); - } - }); - break; - case AST.Literal: - expression = this.escape(ast.value); - this.assign(intoId, expression); - recursionFn(expression); - break; - case AST.UnaryExpression: - this.recurse(ast.argument, undefined, undefined, function(expr) { right = expr; }); - expression = ast.operator + '(' + this.ifDefined(right, 0) + ')'; - this.assign(intoId, expression); - recursionFn(expression); - break; - case AST.BinaryExpression: - this.recurse(ast.left, undefined, undefined, function(expr) { left = expr; }); - this.recurse(ast.right, undefined, undefined, function(expr) { right = expr; }); - if (ast.operator === '+') { - expression = this.plus(left, right); - } else if (ast.operator === '-') { - expression = this.ifDefined(left, 0) + ast.operator + this.ifDefined(right, 0); - } else { - expression = '(' + left + ')' + ast.operator + '(' + right + ')'; - } - this.assign(intoId, expression); - recursionFn(expression); - break; - case AST.LogicalExpression: - intoId = intoId || this.nextId(); - self.recurse(ast.left, intoId); - self.if_(ast.operator === '&&' ? intoId : self.not(intoId), self.lazyRecurse(ast.right, intoId)); - recursionFn(intoId); - break; - case AST.ConditionalExpression: - intoId = intoId || this.nextId(); - self.recurse(ast.test, intoId); - self.if_(intoId, self.lazyRecurse(ast.alternate, intoId), self.lazyRecurse(ast.consequent, intoId)); - recursionFn(intoId); - break; - case AST.Identifier: - intoId = intoId || this.nextId(); - if (nameId) { - nameId.context = self.stage === 'inputs' ? 's' : this.assign(this.nextId(), this.getHasOwnProperty('l', ast.name) + '?l:s'); - nameId.computed = false; - nameId.name = ast.name; - } - ensureSafeMemberName(ast.name); - self.if_(self.stage === 'inputs' || self.not(self.getHasOwnProperty('l', ast.name)), - function() { - self.if_(self.stage === 'inputs' || 's', function() { - if (create && create !== 1) { - self.if_( - self.not(self.nonComputedMember('s', ast.name)), - self.lazyAssign(self.nonComputedMember('s', ast.name), '{}')); - } - self.assign(intoId, self.nonComputedMember('s', ast.name)); - }); - }, intoId && self.lazyAssign(intoId, self.nonComputedMember('l', ast.name)) - ); - if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.name)) { - self.addEnsureSafeObject(intoId); - } - recursionFn(intoId); - break; - case AST.MemberExpression: - left = nameId && (nameId.context = this.nextId()) || this.nextId(); - intoId = intoId || this.nextId(); - self.recurse(ast.object, left, undefined, function() { - self.if_(self.notNull(left), function() { - if (create && create !== 1) { - self.addEnsureSafeAssignContext(left); - } - if (ast.computed) { - right = self.nextId(); - self.recurse(ast.property, right); - self.getStringValue(right); - self.addEnsureSafeMemberName(right); - if (create && create !== 1) { - self.if_(self.not(self.computedMember(left, right)), self.lazyAssign(self.computedMember(left, right), '{}')); - } - expression = self.ensureSafeObject(self.computedMember(left, right)); - self.assign(intoId, expression); - if (nameId) { - nameId.computed = true; - nameId.name = right; - } - } else { - ensureSafeMemberName(ast.property.name); - if (create && create !== 1) { - self.if_(self.not(self.nonComputedMember(left, ast.property.name)), self.lazyAssign(self.nonComputedMember(left, ast.property.name), '{}')); - } - expression = self.nonComputedMember(left, ast.property.name); - if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.property.name)) { - expression = self.ensureSafeObject(expression); - } - self.assign(intoId, expression); - if (nameId) { - nameId.computed = false; - nameId.name = ast.property.name; - } - } - }, function() { - self.assign(intoId, 'undefined'); - }); - recursionFn(intoId); - }, !!create); - break; - case AST.CallExpression: - intoId = intoId || this.nextId(); - if (ast.filter) { - right = self.filter(ast.callee.name); - args = []; - forEach(ast.arguments, function(expr) { - var argument = self.nextId(); - self.recurse(expr, argument); - args.push(argument); - }); - expression = right + '(' + args.join(',') + ')'; - self.assign(intoId, expression); - recursionFn(intoId); - } else { - right = self.nextId(); - left = {}; - args = []; - self.recurse(ast.callee, right, left, function() { - self.if_(self.notNull(right), function() { - self.addEnsureSafeFunction(right); - forEach(ast.arguments, function(expr) { - self.recurse(expr, self.nextId(), undefined, function(argument) { - args.push(self.ensureSafeObject(argument)); - }); - }); - if (left.name) { - if (!self.state.expensiveChecks) { - self.addEnsureSafeObject(left.context); - } - expression = self.member(left.context, left.name, left.computed) + '(' + args.join(',') + ')'; - } else { - expression = right + '(' + args.join(',') + ')'; - } - expression = self.ensureSafeObject(expression); - self.assign(intoId, expression); - }, function() { - self.assign(intoId, 'undefined'); - }); - recursionFn(intoId); - }); - } - break; - case AST.AssignmentExpression: - right = this.nextId(); - left = {}; - if (!isAssignable(ast.left)) { - throw $parseMinErr('lval', 'Trying to assign a value to a non l-value'); - } - this.recurse(ast.left, undefined, left, function() { - self.if_(self.notNull(left.context), function() { - self.recurse(ast.right, right); - self.addEnsureSafeObject(self.member(left.context, left.name, left.computed)); - self.addEnsureSafeAssignContext(left.context); - expression = self.member(left.context, left.name, left.computed) + ast.operator + right; - self.assign(intoId, expression); - recursionFn(intoId || expression); - }); - }, 1); - break; - case AST.ArrayExpression: - args = []; - forEach(ast.elements, function(expr) { - self.recurse(expr, self.nextId(), undefined, function(argument) { - args.push(argument); - }); - }); - expression = '[' + args.join(',') + ']'; - this.assign(intoId, expression); - recursionFn(expression); - break; - case AST.ObjectExpression: - args = []; - forEach(ast.properties, function(property) { - self.recurse(property.value, self.nextId(), undefined, function(expr) { - args.push(self.escape( - property.key.type === AST.Identifier ? property.key.name : - ('' + property.key.value)) + - ':' + expr); - }); - }); - expression = '{' + args.join(',') + '}'; - this.assign(intoId, expression); - recursionFn(expression); - break; - case AST.ThisExpression: - this.assign(intoId, 's'); - recursionFn('s'); - break; - case AST.LocalsExpression: - this.assign(intoId, 'l'); - recursionFn('l'); - break; - case AST.NGValueParameter: - this.assign(intoId, 'v'); - recursionFn('v'); - break; - } - }, - - getHasOwnProperty: function(element, property) { - var key = element + '.' + property; - var own = this.current().own; - if (!own.hasOwnProperty(key)) { - own[key] = this.nextId(false, element + '&&(' + this.escape(property) + ' in ' + element + ')'); - } - return own[key]; - }, - - assign: function(id, value) { - if (!id) return; - this.current().body.push(id, '=', value, ';'); - return id; - }, - - filter: function(filterName) { - if (!this.state.filters.hasOwnProperty(filterName)) { - this.state.filters[filterName] = this.nextId(true); - } - return this.state.filters[filterName]; - }, - - ifDefined: function(id, defaultValue) { - return 'ifDefined(' + id + ',' + this.escape(defaultValue) + ')'; - }, - - plus: function(left, right) { - return 'plus(' + left + ',' + right + ')'; - }, - - return_: function(id) { - this.current().body.push('return ', id, ';'); - }, - - if_: function(test, alternate, consequent) { - if (test === true) { - alternate(); - } else { - var body = this.current().body; - body.push('if(', test, '){'); - alternate(); - body.push('}'); - if (consequent) { - body.push('else{'); - consequent(); - body.push('}'); - } - } - }, - - not: function(expression) { - return '!(' + expression + ')'; - }, - - notNull: function(expression) { - return expression + '!=null'; - }, - - nonComputedMember: function(left, right) { - return left + '.' + right; - }, - - computedMember: function(left, right) { - return left + '[' + right + ']'; - }, - - member: function(left, right, computed) { - if (computed) return this.computedMember(left, right); - return this.nonComputedMember(left, right); - }, - - addEnsureSafeObject: function(item) { - this.current().body.push(this.ensureSafeObject(item), ';'); - }, - - addEnsureSafeMemberName: function(item) { - this.current().body.push(this.ensureSafeMemberName(item), ';'); - }, - - addEnsureSafeFunction: function(item) { - this.current().body.push(this.ensureSafeFunction(item), ';'); - }, - - addEnsureSafeAssignContext: function(item) { - this.current().body.push(this.ensureSafeAssignContext(item), ';'); - }, - - ensureSafeObject: function(item) { - return 'ensureSafeObject(' + item + ',text)'; - }, - - ensureSafeMemberName: function(item) { - return 'ensureSafeMemberName(' + item + ',text)'; - }, - - ensureSafeFunction: function(item) { - return 'ensureSafeFunction(' + item + ',text)'; - }, - - getStringValue: function(item) { - this.assign(item, 'getStringValue(' + item + ')'); - }, - - ensureSafeAssignContext: function(item) { - return 'ensureSafeAssignContext(' + item + ',text)'; - }, - - lazyRecurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) { - var self = this; - return function() { - self.recurse(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck); - }; - }, - - lazyAssign: function(id, value) { - var self = this; - return function() { - self.assign(id, value); - }; - }, - - stringEscapeRegex: /[^ a-zA-Z0-9]/g, - - stringEscapeFn: function(c) { - return '\\u' + ('0000' + c.charCodeAt(0).toString(16)).slice(-4); - }, - - escape: function(value) { - if (isString(value)) return "'" + value.replace(this.stringEscapeRegex, this.stringEscapeFn) + "'"; - if (isNumber(value)) return value.toString(); - if (value === true) return 'true'; - if (value === false) return 'false'; - if (value === null) return 'null'; - if (typeof value === 'undefined') return 'undefined'; - - throw $parseMinErr('esc', 'IMPOSSIBLE'); - }, - - nextId: function(skip, init) { - var id = 'v' + (this.state.nextId++); - if (!skip) { - this.current().vars.push(id + (init ? '=' + init : '')); - } - return id; - }, - - current: function() { - return this.state[this.state.computing]; - } -}; - - -function ASTInterpreter(astBuilder, $filter) { - this.astBuilder = astBuilder; - this.$filter = $filter; -} - -ASTInterpreter.prototype = { - compile: function(expression, expensiveChecks) { - var self = this; - var ast = this.astBuilder.ast(expression); - this.expression = expression; - this.expensiveChecks = expensiveChecks; - findConstantAndWatchExpressions(ast, self.$filter); - var assignable; - var assign; - if ((assignable = assignableAST(ast))) { - assign = this.recurse(assignable); - } - var toWatch = getInputs(ast.body); - var inputs; - if (toWatch) { - inputs = []; - forEach(toWatch, function(watch, key) { - var input = self.recurse(watch); - watch.input = input; - inputs.push(input); - watch.watchId = key; - }); - } - var expressions = []; - forEach(ast.body, function(expression) { - expressions.push(self.recurse(expression.expression)); - }); - var fn = ast.body.length === 0 ? noop : - ast.body.length === 1 ? expressions[0] : - function(scope, locals) { - var lastValue; - forEach(expressions, function(exp) { - lastValue = exp(scope, locals); - }); - return lastValue; - }; - if (assign) { - fn.assign = function(scope, value, locals) { - return assign(scope, locals, value); - }; - } - if (inputs) { - fn.inputs = inputs; - } - fn.literal = isLiteral(ast); - fn.constant = isConstant(ast); - return fn; - }, - - recurse: function(ast, context, create) { - var left, right, self = this, args, expression; - if (ast.input) { - return this.inputs(ast.input, ast.watchId); - } - switch (ast.type) { - case AST.Literal: - return this.value(ast.value, context); - case AST.UnaryExpression: - right = this.recurse(ast.argument); - return this['unary' + ast.operator](right, context); - case AST.BinaryExpression: - left = this.recurse(ast.left); - right = this.recurse(ast.right); - return this['binary' + ast.operator](left, right, context); - case AST.LogicalExpression: - left = this.recurse(ast.left); - right = this.recurse(ast.right); - return this['binary' + ast.operator](left, right, context); - case AST.ConditionalExpression: - return this['ternary?:']( - this.recurse(ast.test), - this.recurse(ast.alternate), - this.recurse(ast.consequent), - context - ); - case AST.Identifier: - ensureSafeMemberName(ast.name, self.expression); - return self.identifier(ast.name, - self.expensiveChecks || isPossiblyDangerousMemberName(ast.name), - context, create, self.expression); - case AST.MemberExpression: - left = this.recurse(ast.object, false, !!create); - if (!ast.computed) { - ensureSafeMemberName(ast.property.name, self.expression); - right = ast.property.name; - } - if (ast.computed) right = this.recurse(ast.property); - return ast.computed ? - this.computedMember(left, right, context, create, self.expression) : - this.nonComputedMember(left, right, self.expensiveChecks, context, create, self.expression); - case AST.CallExpression: - args = []; - forEach(ast.arguments, function(expr) { - args.push(self.recurse(expr)); - }); - if (ast.filter) right = this.$filter(ast.callee.name); - if (!ast.filter) right = this.recurse(ast.callee, true); - return ast.filter ? - function(scope, locals, assign, inputs) { - var values = []; - for (var i = 0; i < args.length; ++i) { - values.push(args[i](scope, locals, assign, inputs)); - } - var value = right.apply(undefined, values, inputs); - return context ? {context: undefined, name: undefined, value: value} : value; - } : - function(scope, locals, assign, inputs) { - var rhs = right(scope, locals, assign, inputs); - var value; - if (rhs.value != null) { - ensureSafeObject(rhs.context, self.expression); - ensureSafeFunction(rhs.value, self.expression); - var values = []; - for (var i = 0; i < args.length; ++i) { - values.push(ensureSafeObject(args[i](scope, locals, assign, inputs), self.expression)); - } - value = ensureSafeObject(rhs.value.apply(rhs.context, values), self.expression); - } - return context ? {value: value} : value; - }; - case AST.AssignmentExpression: - left = this.recurse(ast.left, true, 1); - right = this.recurse(ast.right); - return function(scope, locals, assign, inputs) { - var lhs = left(scope, locals, assign, inputs); - var rhs = right(scope, locals, assign, inputs); - ensureSafeObject(lhs.value, self.expression); - ensureSafeAssignContext(lhs.context); - lhs.context[lhs.name] = rhs; - return context ? {value: rhs} : rhs; - }; - case AST.ArrayExpression: - args = []; - forEach(ast.elements, function(expr) { - args.push(self.recurse(expr)); - }); - return function(scope, locals, assign, inputs) { - var value = []; - for (var i = 0; i < args.length; ++i) { - value.push(args[i](scope, locals, assign, inputs)); - } - return context ? {value: value} : value; - }; - case AST.ObjectExpression: - args = []; - forEach(ast.properties, function(property) { - args.push({key: property.key.type === AST.Identifier ? - property.key.name : - ('' + property.key.value), - value: self.recurse(property.value) - }); - }); - return function(scope, locals, assign, inputs) { - var value = {}; - for (var i = 0; i < args.length; ++i) { - value[args[i].key] = args[i].value(scope, locals, assign, inputs); - } - return context ? {value: value} : value; - }; - case AST.ThisExpression: - return function(scope) { - return context ? {value: scope} : scope; - }; - case AST.LocalsExpression: - return function(scope, locals) { - return context ? {value: locals} : locals; - }; - case AST.NGValueParameter: - return function(scope, locals, assign) { - return context ? {value: assign} : assign; - }; - } - }, - - 'unary+': function(argument, context) { - return function(scope, locals, assign, inputs) { - var arg = argument(scope, locals, assign, inputs); - if (isDefined(arg)) { - arg = +arg; - } else { - arg = 0; - } - return context ? {value: arg} : arg; - }; - }, - 'unary-': function(argument, context) { - return function(scope, locals, assign, inputs) { - var arg = argument(scope, locals, assign, inputs); - if (isDefined(arg)) { - arg = -arg; - } else { - arg = 0; - } - return context ? {value: arg} : arg; - }; - }, - 'unary!': function(argument, context) { - return function(scope, locals, assign, inputs) { - var arg = !argument(scope, locals, assign, inputs); - return context ? {value: arg} : arg; - }; - }, - 'binary+': function(left, right, context) { - return function(scope, locals, assign, inputs) { - var lhs = left(scope, locals, assign, inputs); - var rhs = right(scope, locals, assign, inputs); - var arg = plusFn(lhs, rhs); - return context ? {value: arg} : arg; - }; - }, - 'binary-': function(left, right, context) { - return function(scope, locals, assign, inputs) { - var lhs = left(scope, locals, assign, inputs); - var rhs = right(scope, locals, assign, inputs); - var arg = (isDefined(lhs) ? lhs : 0) - (isDefined(rhs) ? rhs : 0); - return context ? {value: arg} : arg; - }; - }, - 'binary*': function(left, right, context) { - return function(scope, locals, assign, inputs) { - var arg = left(scope, locals, assign, inputs) * right(scope, locals, assign, inputs); - return context ? {value: arg} : arg; - }; - }, - 'binary/': function(left, right, context) { - return function(scope, locals, assign, inputs) { - var arg = left(scope, locals, assign, inputs) / right(scope, locals, assign, inputs); - return context ? {value: arg} : arg; - }; - }, - 'binary%': function(left, right, context) { - return function(scope, locals, assign, inputs) { - var arg = left(scope, locals, assign, inputs) % right(scope, locals, assign, inputs); - return context ? {value: arg} : arg; - }; - }, - 'binary===': function(left, right, context) { - return function(scope, locals, assign, inputs) { - var arg = left(scope, locals, assign, inputs) === right(scope, locals, assign, inputs); - return context ? {value: arg} : arg; - }; - }, - 'binary!==': function(left, right, context) { - return function(scope, locals, assign, inputs) { - var arg = left(scope, locals, assign, inputs) !== right(scope, locals, assign, inputs); - return context ? {value: arg} : arg; - }; - }, - 'binary==': function(left, right, context) { - return function(scope, locals, assign, inputs) { - var arg = left(scope, locals, assign, inputs) == right(scope, locals, assign, inputs); - return context ? {value: arg} : arg; - }; - }, - 'binary!=': function(left, right, context) { - return function(scope, locals, assign, inputs) { - var arg = left(scope, locals, assign, inputs) != right(scope, locals, assign, inputs); - return context ? {value: arg} : arg; - }; - }, - 'binary<': function(left, right, context) { - return function(scope, locals, assign, inputs) { - var arg = left(scope, locals, assign, inputs) < right(scope, locals, assign, inputs); - return context ? {value: arg} : arg; - }; - }, - 'binary>': function(left, right, context) { - return function(scope, locals, assign, inputs) { - var arg = left(scope, locals, assign, inputs) > right(scope, locals, assign, inputs); - return context ? {value: arg} : arg; - }; - }, - 'binary<=': function(left, right, context) { - return function(scope, locals, assign, inputs) { - var arg = left(scope, locals, assign, inputs) <= right(scope, locals, assign, inputs); - return context ? {value: arg} : arg; - }; - }, - 'binary>=': function(left, right, context) { - return function(scope, locals, assign, inputs) { - var arg = left(scope, locals, assign, inputs) >= right(scope, locals, assign, inputs); - return context ? {value: arg} : arg; - }; - }, - 'binary&&': function(left, right, context) { - return function(scope, locals, assign, inputs) { - var arg = left(scope, locals, assign, inputs) && right(scope, locals, assign, inputs); - return context ? {value: arg} : arg; - }; - }, - 'binary||': function(left, right, context) { - return function(scope, locals, assign, inputs) { - var arg = left(scope, locals, assign, inputs) || right(scope, locals, assign, inputs); - return context ? {value: arg} : arg; - }; - }, - 'ternary?:': function(test, alternate, consequent, context) { - return function(scope, locals, assign, inputs) { - var arg = test(scope, locals, assign, inputs) ? alternate(scope, locals, assign, inputs) : consequent(scope, locals, assign, inputs); - return context ? {value: arg} : arg; - }; - }, - value: function(value, context) { - return function() { return context ? {context: undefined, name: undefined, value: value} : value; }; - }, - identifier: function(name, expensiveChecks, context, create, expression) { - return function(scope, locals, assign, inputs) { - var base = locals && (name in locals) ? locals : scope; - if (create && create !== 1 && base && !(base[name])) { - base[name] = {}; - } - var value = base ? base[name] : undefined; - if (expensiveChecks) { - ensureSafeObject(value, expression); - } - if (context) { - return {context: base, name: name, value: value}; - } else { - return value; - } - }; - }, - computedMember: function(left, right, context, create, expression) { - return function(scope, locals, assign, inputs) { - var lhs = left(scope, locals, assign, inputs); - var rhs; - var value; - if (lhs != null) { - rhs = right(scope, locals, assign, inputs); - rhs = getStringValue(rhs); - ensureSafeMemberName(rhs, expression); - if (create && create !== 1) { - ensureSafeAssignContext(lhs); - if (lhs && !(lhs[rhs])) { - lhs[rhs] = {}; - } - } - value = lhs[rhs]; - ensureSafeObject(value, expression); - } - if (context) { - return {context: lhs, name: rhs, value: value}; - } else { - return value; - } - }; - }, - nonComputedMember: function(left, right, expensiveChecks, context, create, expression) { - return function(scope, locals, assign, inputs) { - var lhs = left(scope, locals, assign, inputs); - if (create && create !== 1) { - ensureSafeAssignContext(lhs); - if (lhs && !(lhs[right])) { - lhs[right] = {}; - } - } - var value = lhs != null ? lhs[right] : undefined; - if (expensiveChecks || isPossiblyDangerousMemberName(right)) { - ensureSafeObject(value, expression); - } - if (context) { - return {context: lhs, name: right, value: value}; - } else { - return value; - } - }; - }, - inputs: function(input, watchId) { - return function(scope, value, locals, inputs) { - if (inputs) return inputs[watchId]; - return input(scope, value, locals); - }; - } -}; - -/** - * @constructor - */ -var Parser = function(lexer, $filter, options) { - this.lexer = lexer; - this.$filter = $filter; - this.options = options; - this.ast = new AST(lexer, options); - this.astCompiler = options.csp ? new ASTInterpreter(this.ast, $filter) : - new ASTCompiler(this.ast, $filter); -}; - -Parser.prototype = { - constructor: Parser, - - parse: function(text) { - return this.astCompiler.compile(text, this.options.expensiveChecks); - } -}; - -function isPossiblyDangerousMemberName(name) { - return name == 'constructor'; -} - -var objectValueOf = Object.prototype.valueOf; - -function getValueOf(value) { - return isFunction(value.valueOf) ? value.valueOf() : objectValueOf.call(value); -} - -/////////////////////////////////// - -/** - * @ngdoc service - * @name $parse - * @kind function - * - * @description - * - * Converts Angular {@link guide/expression expression} into a function. - * - * ```js - * var getter = $parse('user.name'); - * var setter = getter.assign; - * var context = {user:{name:'angular'}}; - * var locals = {user:{name:'local'}}; - * - * expect(getter(context)).toEqual('angular'); - * setter(context, 'newValue'); - * expect(context.user.name).toEqual('newValue'); - * expect(getter(context, locals)).toEqual('local'); - * ``` - * - * - * @param {string} expression String expression to compile. - * @returns {function(context, locals)} a function which represents the compiled expression: - * - * * `context` – `{object}` – an object against which any expressions embedded in the strings - * are evaluated against (typically a scope object). - * * `locals` – `{object=}` – local variables context object, useful for overriding values in - * `context`. - * - * The returned function also has the following properties: - * * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript - * literal. - * * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript - * constant literals. - * * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be - * set to a function to change its value on the given context. - * - */ - - -/** - * @ngdoc provider - * @name $parseProvider - * - * @description - * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse} - * service. - */ -function $ParseProvider() { - var cacheDefault = createMap(); - var cacheExpensive = createMap(); - var literals = { - 'true': true, - 'false': false, - 'null': null, - 'undefined': undefined - }; - - /** - * @ngdoc method - * @name $parseProvider#addLiteral - * @description - * - * Configure $parse service to add literal values that will be present as literal at expressions. - * - * @param {string} literalName Token for the literal value. The literal name value must be a valid literal name. - * @param {*} literalValue Value for this literal. All literal values must be primitives or `undefined`. - * - **/ - this.addLiteral = function(literalName, literalValue) { - literals[literalName] = literalValue; - }; - - this.$get = ['$filter', function($filter) { - var noUnsafeEval = csp().noUnsafeEval; - var $parseOptions = { - csp: noUnsafeEval, - expensiveChecks: false, - literals: copy(literals) - }, - $parseOptionsExpensive = { - csp: noUnsafeEval, - expensiveChecks: true, - literals: copy(literals) - }; - var runningChecksEnabled = false; - - $parse.$$runningExpensiveChecks = function() { - return runningChecksEnabled; - }; - - return $parse; - - function $parse(exp, interceptorFn, expensiveChecks) { - var parsedExpression, oneTime, cacheKey; - - expensiveChecks = expensiveChecks || runningChecksEnabled; - - switch (typeof exp) { - case 'string': - exp = exp.trim(); - cacheKey = exp; - - var cache = (expensiveChecks ? cacheExpensive : cacheDefault); - parsedExpression = cache[cacheKey]; - - if (!parsedExpression) { - if (exp.charAt(0) === ':' && exp.charAt(1) === ':') { - oneTime = true; - exp = exp.substring(2); - } - var parseOptions = expensiveChecks ? $parseOptionsExpensive : $parseOptions; - var lexer = new Lexer(parseOptions); - var parser = new Parser(lexer, $filter, parseOptions); - parsedExpression = parser.parse(exp); - if (parsedExpression.constant) { - parsedExpression.$$watchDelegate = constantWatchDelegate; - } else if (oneTime) { - parsedExpression.$$watchDelegate = parsedExpression.literal ? - oneTimeLiteralWatchDelegate : oneTimeWatchDelegate; - } else if (parsedExpression.inputs) { - parsedExpression.$$watchDelegate = inputsWatchDelegate; - } - if (expensiveChecks) { - parsedExpression = expensiveChecksInterceptor(parsedExpression); - } - cache[cacheKey] = parsedExpression; - } - return addInterceptor(parsedExpression, interceptorFn); - - case 'function': - return addInterceptor(exp, interceptorFn); - - default: - return addInterceptor(noop, interceptorFn); - } - } - - function expensiveChecksInterceptor(fn) { - if (!fn) return fn; - expensiveCheckFn.$$watchDelegate = fn.$$watchDelegate; - expensiveCheckFn.assign = expensiveChecksInterceptor(fn.assign); - expensiveCheckFn.constant = fn.constant; - expensiveCheckFn.literal = fn.literal; - for (var i = 0; fn.inputs && i < fn.inputs.length; ++i) { - fn.inputs[i] = expensiveChecksInterceptor(fn.inputs[i]); - } - expensiveCheckFn.inputs = fn.inputs; - - return expensiveCheckFn; - - function expensiveCheckFn(scope, locals, assign, inputs) { - var expensiveCheckOldValue = runningChecksEnabled; - runningChecksEnabled = true; - try { - return fn(scope, locals, assign, inputs); - } finally { - runningChecksEnabled = expensiveCheckOldValue; - } - } - } - - function expressionInputDirtyCheck(newValue, oldValueOfValue) { - - if (newValue == null || oldValueOfValue == null) { // null/undefined - return newValue === oldValueOfValue; - } - - if (typeof newValue === 'object') { - - // attempt to convert the value to a primitive type - // TODO(docs): add a note to docs that by implementing valueOf even objects and arrays can - // be cheaply dirty-checked - newValue = getValueOf(newValue); - - if (typeof newValue === 'object') { - // objects/arrays are not supported - deep-watching them would be too expensive - return false; - } - - // fall-through to the primitive equality check - } - - //Primitive or NaN - return newValue === oldValueOfValue || (newValue !== newValue && oldValueOfValue !== oldValueOfValue); - } - - function inputsWatchDelegate(scope, listener, objectEquality, parsedExpression, prettyPrintExpression) { - var inputExpressions = parsedExpression.inputs; - var lastResult; - - if (inputExpressions.length === 1) { - var oldInputValueOf = expressionInputDirtyCheck; // init to something unique so that equals check fails - inputExpressions = inputExpressions[0]; - return scope.$watch(function expressionInputWatch(scope) { - var newInputValue = inputExpressions(scope); - if (!expressionInputDirtyCheck(newInputValue, oldInputValueOf)) { - lastResult = parsedExpression(scope, undefined, undefined, [newInputValue]); - oldInputValueOf = newInputValue && getValueOf(newInputValue); - } - return lastResult; - }, listener, objectEquality, prettyPrintExpression); - } - - var oldInputValueOfValues = []; - var oldInputValues = []; - for (var i = 0, ii = inputExpressions.length; i < ii; i++) { - oldInputValueOfValues[i] = expressionInputDirtyCheck; // init to something unique so that equals check fails - oldInputValues[i] = null; - } - - return scope.$watch(function expressionInputsWatch(scope) { - var changed = false; - - for (var i = 0, ii = inputExpressions.length; i < ii; i++) { - var newInputValue = inputExpressions[i](scope); - if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i]))) { - oldInputValues[i] = newInputValue; - oldInputValueOfValues[i] = newInputValue && getValueOf(newInputValue); - } - } - - if (changed) { - lastResult = parsedExpression(scope, undefined, undefined, oldInputValues); - } - - return lastResult; - }, listener, objectEquality, prettyPrintExpression); - } - - function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression) { - var unwatch, lastValue; - return unwatch = scope.$watch(function oneTimeWatch(scope) { - return parsedExpression(scope); - }, function oneTimeListener(value, old, scope) { - lastValue = value; - if (isFunction(listener)) { - listener.apply(this, arguments); - } - if (isDefined(value)) { - scope.$$postDigest(function() { - if (isDefined(lastValue)) { - unwatch(); - } - }); - } - }, objectEquality); - } - - function oneTimeLiteralWatchDelegate(scope, listener, objectEquality, parsedExpression) { - var unwatch, lastValue; - return unwatch = scope.$watch(function oneTimeWatch(scope) { - return parsedExpression(scope); - }, function oneTimeListener(value, old, scope) { - lastValue = value; - if (isFunction(listener)) { - listener.call(this, value, old, scope); - } - if (isAllDefined(value)) { - scope.$$postDigest(function() { - if (isAllDefined(lastValue)) unwatch(); - }); - } - }, objectEquality); - - function isAllDefined(value) { - var allDefined = true; - forEach(value, function(val) { - if (!isDefined(val)) allDefined = false; - }); - return allDefined; - } - } - - function constantWatchDelegate(scope, listener, objectEquality, parsedExpression) { - var unwatch; - return unwatch = scope.$watch(function constantWatch(scope) { - unwatch(); - return parsedExpression(scope); - }, listener, objectEquality); - } - - function addInterceptor(parsedExpression, interceptorFn) { - if (!interceptorFn) return parsedExpression; - var watchDelegate = parsedExpression.$$watchDelegate; - var useInputs = false; - - var regularWatch = - watchDelegate !== oneTimeLiteralWatchDelegate && - watchDelegate !== oneTimeWatchDelegate; - - var fn = regularWatch ? function regularInterceptedExpression(scope, locals, assign, inputs) { - var value = useInputs && inputs ? inputs[0] : parsedExpression(scope, locals, assign, inputs); - return interceptorFn(value, scope, locals); - } : function oneTimeInterceptedExpression(scope, locals, assign, inputs) { - var value = parsedExpression(scope, locals, assign, inputs); - var result = interceptorFn(value, scope, locals); - // we only return the interceptor's result if the - // initial value is defined (for bind-once) - return isDefined(value) ? result : value; - }; - - // Propagate $$watchDelegates other then inputsWatchDelegate - if (parsedExpression.$$watchDelegate && - parsedExpression.$$watchDelegate !== inputsWatchDelegate) { - fn.$$watchDelegate = parsedExpression.$$watchDelegate; - } else if (!interceptorFn.$stateful) { - // If there is an interceptor, but no watchDelegate then treat the interceptor like - // we treat filters - it is assumed to be a pure function unless flagged with $stateful - fn.$$watchDelegate = inputsWatchDelegate; - useInputs = !parsedExpression.inputs; - fn.inputs = parsedExpression.inputs ? parsedExpression.inputs : [parsedExpression]; - } - - return fn; - } - }]; -} - -/** - * @ngdoc service - * @name $q - * @requires $rootScope - * - * @description - * A service that helps you run functions asynchronously, and use their return values (or exceptions) - * when they are done processing. - * - * This is an implementation of promises/deferred objects inspired by - * [Kris Kowal's Q](https://github.com/kriskowal/q). - * - * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred - * implementations, and the other which resembles ES6 promises to some degree. - * - * # $q constructor - * - * The streamlined ES6 style promise is essentially just using $q as a constructor which takes a `resolver` - * function as the first argument. This is similar to the native Promise implementation from ES6 Harmony, - * see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). - * - * While the constructor-style use is supported, not all of the supporting methods from ES6 Harmony promises are - * available yet. - * - * It can be used like so: - * - * ```js - * // for the purpose of this example let's assume that variables `$q` and `okToGreet` - * // are available in the current lexical scope (they could have been injected or passed in). - * - * function asyncGreet(name) { - * // perform some asynchronous operation, resolve or reject the promise when appropriate. - * return $q(function(resolve, reject) { - * setTimeout(function() { - * if (okToGreet(name)) { - * resolve('Hello, ' + name + '!'); - * } else { - * reject('Greeting ' + name + ' is not allowed.'); - * } - * }, 1000); - * }); - * } - * - * var promise = asyncGreet('Robin Hood'); - * promise.then(function(greeting) { - * alert('Success: ' + greeting); - * }, function(reason) { - * alert('Failed: ' + reason); - * }); - * ``` - * - * Note: progress/notify callbacks are not currently supported via the ES6-style interface. - * - * Note: unlike ES6 behavior, an exception thrown in the constructor function will NOT implicitly reject the promise. - * - * However, the more traditional CommonJS-style usage is still available, and documented below. - * - * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an - * interface for interacting with an object that represents the result of an action that is - * performed asynchronously, and may or may not be finished at any given point in time. - * - * From the perspective of dealing with error handling, deferred and promise APIs are to - * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming. - * - * ```js - * // for the purpose of this example let's assume that variables `$q` and `okToGreet` - * // are available in the current lexical scope (they could have been injected or passed in). - * - * function asyncGreet(name) { - * var deferred = $q.defer(); - * - * setTimeout(function() { - * deferred.notify('About to greet ' + name + '.'); - * - * if (okToGreet(name)) { - * deferred.resolve('Hello, ' + name + '!'); - * } else { - * deferred.reject('Greeting ' + name + ' is not allowed.'); - * } - * }, 1000); - * - * return deferred.promise; - * } - * - * var promise = asyncGreet('Robin Hood'); - * promise.then(function(greeting) { - * alert('Success: ' + greeting); - * }, function(reason) { - * alert('Failed: ' + reason); - * }, function(update) { - * alert('Got notification: ' + update); - * }); - * ``` - * - * At first it might not be obvious why this extra complexity is worth the trouble. The payoff - * comes in the way of guarantees that promise and deferred APIs make, see - * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md. - * - * Additionally the promise api allows for composition that is very hard to do with the - * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach. - * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the - * section on serial or parallel joining of promises. - * - * # The Deferred API - * - * A new instance of deferred is constructed by calling `$q.defer()`. - * - * The purpose of the deferred object is to expose the associated Promise instance as well as APIs - * that can be used for signaling the successful or unsuccessful completion, as well as the status - * of the task. - * - * **Methods** - * - * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection - * constructed via `$q.reject`, the promise will be rejected instead. - * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to - * resolving it with a rejection constructed via `$q.reject`. - * - `notify(value)` - provides updates on the status of the promise's execution. This may be called - * multiple times before the promise is either resolved or rejected. - * - * **Properties** - * - * - promise – `{Promise}` – promise object associated with this deferred. - * - * - * # The Promise API - * - * A new promise instance is created when a deferred instance is created and can be retrieved by - * calling `deferred.promise`. - * - * The purpose of the promise object is to allow for interested parties to get access to the result - * of the deferred task when it completes. - * - * **Methods** - * - * - `then(successCallback, errorCallback, notifyCallback)` – regardless of when the promise was or - * will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously - * as soon as the result is available. The callbacks are called with a single argument: the result - * or rejection reason. Additionally, the notify callback may be called zero or more times to - * provide a progress indication, before the promise is resolved or rejected. - * - * This method *returns a new promise* which is resolved or rejected via the return value of the - * `successCallback`, `errorCallback` (unless that value is a promise, in which case it is resolved - * with the value which is resolved in that promise using - * [promise chaining](http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promises-queues)). - * It also notifies via the return value of the `notifyCallback` method. The promise cannot be - * resolved or rejected from the notifyCallback method. - * - * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)` - * - * - `finally(callback, notifyCallback)` – allows you to observe either the fulfillment or rejection of a promise, - * but to do so without modifying the final value. This is useful to release resources or do some - * clean-up that needs to be done whether the promise was rejected or resolved. See the [full - * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for - * more information. - * - * # Chaining promises - * - * Because calling the `then` method of a promise returns a new derived promise, it is easily - * possible to create a chain of promises: - * - * ```js - * promiseB = promiseA.then(function(result) { - * return result + 1; - * }); - * - * // promiseB will be resolved immediately after promiseA is resolved and its value - * // will be the result of promiseA incremented by 1 - * ``` - * - * It is possible to create chains of any length and since a promise can be resolved with another - * promise (which will defer its resolution further), it is possible to pause/defer resolution of - * the promises at any point in the chain. This makes it possible to implement powerful APIs like - * $http's response interceptors. - * - * - * # Differences between Kris Kowal's Q and $q - * - * There are two main differences: - * - * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation - * mechanism in angular, which means faster propagation of resolution or rejection into your - * models and avoiding unnecessary browser repaints, which would result in flickering UI. - * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains - * all the important functionality needed for common async tasks. - * - * # Testing - * - * ```js - * it('should simulate promise', inject(function($q, $rootScope) { - * var deferred = $q.defer(); - * var promise = deferred.promise; - * var resolvedValue; - * - * promise.then(function(value) { resolvedValue = value; }); - * expect(resolvedValue).toBeUndefined(); - * - * // Simulate resolving of promise - * deferred.resolve(123); - * // Note that the 'then' function does not get called synchronously. - * // This is because we want the promise API to always be async, whether or not - * // it got called synchronously or asynchronously. - * expect(resolvedValue).toBeUndefined(); - * - * // Propagate promise resolution to 'then' functions using $apply(). - * $rootScope.$apply(); - * expect(resolvedValue).toEqual(123); - * })); - * ``` - * - * @param {function(function, function)} resolver Function which is responsible for resolving or - * rejecting the newly created promise. The first parameter is a function which resolves the - * promise, the second parameter is a function which rejects the promise. - * - * @returns {Promise} The newly created promise. - */ -function $QProvider() { - - this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) { - return qFactory(function(callback) { - $rootScope.$evalAsync(callback); - }, $exceptionHandler); - }]; -} - -function $$QProvider() { - this.$get = ['$browser', '$exceptionHandler', function($browser, $exceptionHandler) { - return qFactory(function(callback) { - $browser.defer(callback); - }, $exceptionHandler); - }]; -} - -/** - * Constructs a promise manager. - * - * @param {function(function)} nextTick Function for executing functions in the next turn. - * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for - * debugging purposes. - * @returns {object} Promise manager. - */ -function qFactory(nextTick, exceptionHandler) { - var $qMinErr = minErr('$q', TypeError); - - /** - * @ngdoc method - * @name ng.$q#defer - * @kind function - * - * @description - * Creates a `Deferred` object which represents a task which will finish in the future. - * - * @returns {Deferred} Returns a new instance of deferred. - */ - var defer = function() { - var d = new Deferred(); - //Necessary to support unbound execution :/ - d.resolve = simpleBind(d, d.resolve); - d.reject = simpleBind(d, d.reject); - d.notify = simpleBind(d, d.notify); - return d; - }; - - function Promise() { - this.$$state = { status: 0 }; - } - - extend(Promise.prototype, { - then: function(onFulfilled, onRejected, progressBack) { - if (isUndefined(onFulfilled) && isUndefined(onRejected) && isUndefined(progressBack)) { - return this; - } - var result = new Deferred(); - - this.$$state.pending = this.$$state.pending || []; - this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]); - if (this.$$state.status > 0) scheduleProcessQueue(this.$$state); - - return result.promise; - }, - - "catch": function(callback) { - return this.then(null, callback); - }, - - "finally": function(callback, progressBack) { - return this.then(function(value) { - return handleCallback(value, true, callback); - }, function(error) { - return handleCallback(error, false, callback); - }, progressBack); - } - }); - - //Faster, more basic than angular.bind http://jsperf.com/angular-bind-vs-custom-vs-native - function simpleBind(context, fn) { - return function(value) { - fn.call(context, value); - }; - } - - function processQueue(state) { - var fn, deferred, pending; - - pending = state.pending; - state.processScheduled = false; - state.pending = undefined; - for (var i = 0, ii = pending.length; i < ii; ++i) { - deferred = pending[i][0]; - fn = pending[i][state.status]; - try { - if (isFunction(fn)) { - deferred.resolve(fn(state.value)); - } else if (state.status === 1) { - deferred.resolve(state.value); - } else { - deferred.reject(state.value); - } - } catch (e) { - deferred.reject(e); - exceptionHandler(e); - } - } - } - - function scheduleProcessQueue(state) { - if (state.processScheduled || !state.pending) return; - state.processScheduled = true; - nextTick(function() { processQueue(state); }); - } - - function Deferred() { - this.promise = new Promise(); - } - - extend(Deferred.prototype, { - resolve: function(val) { - if (this.promise.$$state.status) return; - if (val === this.promise) { - this.$$reject($qMinErr( - 'qcycle', - "Expected promise to be resolved with value other than itself '{0}'", - val)); - } else { - this.$$resolve(val); - } - - }, - - $$resolve: function(val) { - var then; - var that = this; - var done = false; - try { - if ((isObject(val) || isFunction(val))) then = val && val.then; - if (isFunction(then)) { - this.promise.$$state.status = -1; - then.call(val, resolvePromise, rejectPromise, simpleBind(this, this.notify)); - } else { - this.promise.$$state.value = val; - this.promise.$$state.status = 1; - scheduleProcessQueue(this.promise.$$state); - } - } catch (e) { - rejectPromise(e); - exceptionHandler(e); - } - - function resolvePromise(val) { - if (done) return; - done = true; - that.$$resolve(val); - } - function rejectPromise(val) { - if (done) return; - done = true; - that.$$reject(val); - } - }, - - reject: function(reason) { - if (this.promise.$$state.status) return; - this.$$reject(reason); - }, - - $$reject: function(reason) { - this.promise.$$state.value = reason; - this.promise.$$state.status = 2; - scheduleProcessQueue(this.promise.$$state); - }, - - notify: function(progress) { - var callbacks = this.promise.$$state.pending; - - if ((this.promise.$$state.status <= 0) && callbacks && callbacks.length) { - nextTick(function() { - var callback, result; - for (var i = 0, ii = callbacks.length; i < ii; i++) { - result = callbacks[i][0]; - callback = callbacks[i][3]; - try { - result.notify(isFunction(callback) ? callback(progress) : progress); - } catch (e) { - exceptionHandler(e); - } - } - }); - } - } - }); - - /** - * @ngdoc method - * @name $q#reject - * @kind function - * - * @description - * Creates a promise that is resolved as rejected with the specified `reason`. This api should be - * used to forward rejection in a chain of promises. If you are dealing with the last promise in - * a promise chain, you don't need to worry about it. - * - * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of - * `reject` as the `throw` keyword in JavaScript. This also means that if you "catch" an error via - * a promise error callback and you want to forward the error to the promise derived from the - * current promise, you have to "rethrow" the error by returning a rejection constructed via - * `reject`. - * - * ```js - * promiseB = promiseA.then(function(result) { - * // success: do something and resolve promiseB - * // with the old or a new result - * return result; - * }, function(reason) { - * // error: handle the error if possible and - * // resolve promiseB with newPromiseOrValue, - * // otherwise forward the rejection to promiseB - * if (canHandle(reason)) { - * // handle the error and recover - * return newPromiseOrValue; - * } - * return $q.reject(reason); - * }); - * ``` - * - * @param {*} reason Constant, message, exception or an object representing the rejection reason. - * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`. - */ - var reject = function(reason) { - var result = new Deferred(); - result.reject(reason); - return result.promise; - }; - - var makePromise = function makePromise(value, resolved) { - var result = new Deferred(); - if (resolved) { - result.resolve(value); - } else { - result.reject(value); - } - return result.promise; - }; - - var handleCallback = function handleCallback(value, isResolved, callback) { - var callbackOutput = null; - try { - if (isFunction(callback)) callbackOutput = callback(); - } catch (e) { - return makePromise(e, false); - } - if (isPromiseLike(callbackOutput)) { - return callbackOutput.then(function() { - return makePromise(value, isResolved); - }, function(error) { - return makePromise(error, false); - }); - } else { - return makePromise(value, isResolved); - } - }; - - /** - * @ngdoc method - * @name $q#when - * @kind function - * - * @description - * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. - * This is useful when you are dealing with an object that might or might not be a promise, or if - * the promise comes from a source that can't be trusted. - * - * @param {*} value Value or a promise - * @param {Function=} successCallback - * @param {Function=} errorCallback - * @param {Function=} progressCallback - * @returns {Promise} Returns a promise of the passed value or promise - */ - - - var when = function(value, callback, errback, progressBack) { - var result = new Deferred(); - result.resolve(value); - return result.promise.then(callback, errback, progressBack); - }; - - /** - * @ngdoc method - * @name $q#resolve - * @kind function - * - * @description - * Alias of {@link ng.$q#when when} to maintain naming consistency with ES6. - * - * @param {*} value Value or a promise - * @param {Function=} successCallback - * @param {Function=} errorCallback - * @param {Function=} progressCallback - * @returns {Promise} Returns a promise of the passed value or promise - */ - var resolve = when; - - /** - * @ngdoc method - * @name $q#all - * @kind function - * - * @description - * Combines multiple promises into a single promise that is resolved when all of the input - * promises are resolved. - * - * @param {Array.|Object.} promises An array or hash of promises. - * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values, - * each value corresponding to the promise at the same index/key in the `promises` array/hash. - * If any of the promises is resolved with a rejection, this resulting promise will be rejected - * with the same rejection value. - */ - - function all(promises) { - var deferred = new Deferred(), - counter = 0, - results = isArray(promises) ? [] : {}; - - forEach(promises, function(promise, key) { - counter++; - when(promise).then(function(value) { - if (results.hasOwnProperty(key)) return; - results[key] = value; - if (!(--counter)) deferred.resolve(results); - }, function(reason) { - if (results.hasOwnProperty(key)) return; - deferred.reject(reason); - }); - }); - - if (counter === 0) { - deferred.resolve(results); - } - - return deferred.promise; - } - - var $Q = function Q(resolver) { - if (!isFunction(resolver)) { - throw $qMinErr('norslvr', "Expected resolverFn, got '{0}'", resolver); - } - - var deferred = new Deferred(); - - function resolveFn(value) { - deferred.resolve(value); - } - - function rejectFn(reason) { - deferred.reject(reason); - } - - resolver(resolveFn, rejectFn); - - return deferred.promise; - }; - - // Let's make the instanceof operator work for promises, so that - // `new $q(fn) instanceof $q` would evaluate to true. - $Q.prototype = Promise.prototype; - - $Q.defer = defer; - $Q.reject = reject; - $Q.when = when; - $Q.resolve = resolve; - $Q.all = all; - - return $Q; -} - -function $$RAFProvider() { //rAF - this.$get = ['$window', '$timeout', function($window, $timeout) { - var requestAnimationFrame = $window.requestAnimationFrame || - $window.webkitRequestAnimationFrame; - - var cancelAnimationFrame = $window.cancelAnimationFrame || - $window.webkitCancelAnimationFrame || - $window.webkitCancelRequestAnimationFrame; - - var rafSupported = !!requestAnimationFrame; - var raf = rafSupported - ? function(fn) { - var id = requestAnimationFrame(fn); - return function() { - cancelAnimationFrame(id); - }; - } - : function(fn) { - var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666 - return function() { - $timeout.cancel(timer); - }; - }; - - raf.supported = rafSupported; - - return raf; - }]; -} - -/** - * DESIGN NOTES - * - * The design decisions behind the scope are heavily favored for speed and memory consumption. - * - * The typical use of scope is to watch the expressions, which most of the time return the same - * value as last time so we optimize the operation. - * - * Closures construction is expensive in terms of speed as well as memory: - * - No closures, instead use prototypical inheritance for API - * - Internal state needs to be stored on scope directly, which means that private state is - * exposed as $$____ properties - * - * Loop operations are optimized by using while(count--) { ... } - * - This means that in order to keep the same order of execution as addition we have to add - * items to the array at the beginning (unshift) instead of at the end (push) - * - * Child scopes are created and removed often - * - Using an array would be slow since inserts in the middle are expensive; so we use linked lists - * - * There are fewer watches than observers. This is why you don't want the observer to be implemented - * in the same way as watch. Watch requires return of the initialization function which is expensive - * to construct. - */ - - -/** - * @ngdoc provider - * @name $rootScopeProvider - * @description - * - * Provider for the $rootScope service. - */ - -/** - * @ngdoc method - * @name $rootScopeProvider#digestTtl - * @description - * - * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and - * assuming that the model is unstable. - * - * The current default is 10 iterations. - * - * In complex applications it's possible that the dependencies between `$watch`s will result in - * several digest iterations. However if an application needs more than the default 10 digest - * iterations for its model to stabilize then you should investigate what is causing the model to - * continuously change during the digest. - * - * Increasing the TTL could have performance implications, so you should not change it without - * proper justification. - * - * @param {number} limit The number of digest iterations. - */ - - -/** - * @ngdoc service - * @name $rootScope - * @description - * - * Every application has a single root {@link ng.$rootScope.Scope scope}. - * All other scopes are descendant scopes of the root scope. Scopes provide separation - * between the model and the view, via a mechanism for watching the model for changes. - * They also provide event emission/broadcast and subscription facility. See the - * {@link guide/scope developer guide on scopes}. - */ -function $RootScopeProvider() { - var TTL = 10; - var $rootScopeMinErr = minErr('$rootScope'); - var lastDirtyWatch = null; - var applyAsyncId = null; - - this.digestTtl = function(value) { - if (arguments.length) { - TTL = value; - } - return TTL; - }; - - function createChildScopeClass(parent) { - function ChildScope() { - this.$$watchers = this.$$nextSibling = - this.$$childHead = this.$$childTail = null; - this.$$listeners = {}; - this.$$listenerCount = {}; - this.$$watchersCount = 0; - this.$id = nextUid(); - this.$$ChildScope = null; - } - ChildScope.prototype = parent; - return ChildScope; - } - - this.$get = ['$exceptionHandler', '$parse', '$browser', - function($exceptionHandler, $parse, $browser) { - - function destroyChildScope($event) { - $event.currentScope.$$destroyed = true; - } - - function cleanUpScope($scope) { - - if (msie === 9) { - // There is a memory leak in IE9 if all child scopes are not disconnected - // completely when a scope is destroyed. So this code will recurse up through - // all this scopes children - // - // See issue https://github.com/angular/angular.js/issues/10706 - $scope.$$childHead && cleanUpScope($scope.$$childHead); - $scope.$$nextSibling && cleanUpScope($scope.$$nextSibling); - } - - // The code below works around IE9 and V8's memory leaks - // - // See: - // - https://code.google.com/p/v8/issues/detail?id=2073#c26 - // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909 - // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451 - - $scope.$parent = $scope.$$nextSibling = $scope.$$prevSibling = $scope.$$childHead = - $scope.$$childTail = $scope.$root = $scope.$$watchers = null; - } - - /** - * @ngdoc type - * @name $rootScope.Scope - * - * @description - * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the - * {@link auto.$injector $injector}. Child scopes are created using the - * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when - * compiled HTML template is executed.) See also the {@link guide/scope Scopes guide} for - * an in-depth introduction and usage examples. - * - * - * # Inheritance - * A scope can inherit from a parent scope, as in this example: - * ```js - var parent = $rootScope; - var child = parent.$new(); - - parent.salutation = "Hello"; - expect(child.salutation).toEqual('Hello'); - - child.salutation = "Welcome"; - expect(child.salutation).toEqual('Welcome'); - expect(parent.salutation).toEqual('Hello'); - * ``` - * - * When interacting with `Scope` in tests, additional helper methods are available on the - * instances of `Scope` type. See {@link ngMock.$rootScope.Scope ngMock Scope} for additional - * details. - * - * - * @param {Object.=} providers Map of service factory which need to be - * provided for the current scope. Defaults to {@link ng}. - * @param {Object.=} instanceCache Provides pre-instantiated services which should - * append/override services provided by `providers`. This is handy - * when unit-testing and having the need to override a default - * service. - * @returns {Object} Newly created scope. - * - */ - function Scope() { - this.$id = nextUid(); - this.$$phase = this.$parent = this.$$watchers = - this.$$nextSibling = this.$$prevSibling = - this.$$childHead = this.$$childTail = null; - this.$root = this; - this.$$destroyed = false; - this.$$listeners = {}; - this.$$listenerCount = {}; - this.$$watchersCount = 0; - this.$$isolateBindings = null; - } - - /** - * @ngdoc property - * @name $rootScope.Scope#$id - * - * @description - * Unique scope ID (monotonically increasing) useful for debugging. - */ - - /** - * @ngdoc property - * @name $rootScope.Scope#$parent - * - * @description - * Reference to the parent scope. - */ - - /** - * @ngdoc property - * @name $rootScope.Scope#$root - * - * @description - * Reference to the root scope. - */ - - Scope.prototype = { - constructor: Scope, - /** - * @ngdoc method - * @name $rootScope.Scope#$new - * @kind function - * - * @description - * Creates a new child {@link ng.$rootScope.Scope scope}. - * - * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} event. - * The scope can be removed from the scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}. - * - * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is - * desired for the scope and its child scopes to be permanently detached from the parent and - * thus stop participating in model change detection and listener notification by invoking. - * - * @param {boolean} isolate If true, then the scope does not prototypically inherit from the - * parent scope. The scope is isolated, as it can not see parent scope properties. - * When creating widgets, it is useful for the widget to not accidentally read parent - * state. - * - * @param {Scope} [parent=this] The {@link ng.$rootScope.Scope `Scope`} that will be the `$parent` - * of the newly created scope. Defaults to `this` scope if not provided. - * This is used when creating a transclude scope to correctly place it - * in the scope hierarchy while maintaining the correct prototypical - * inheritance. - * - * @returns {Object} The newly created child scope. - * - */ - $new: function(isolate, parent) { - var child; - - parent = parent || this; - - if (isolate) { - child = new Scope(); - child.$root = this.$root; - } else { - // Only create a child scope class if somebody asks for one, - // but cache it to allow the VM to optimize lookups. - if (!this.$$ChildScope) { - this.$$ChildScope = createChildScopeClass(this); - } - child = new this.$$ChildScope(); - } - child.$parent = parent; - child.$$prevSibling = parent.$$childTail; - if (parent.$$childHead) { - parent.$$childTail.$$nextSibling = child; - parent.$$childTail = child; - } else { - parent.$$childHead = parent.$$childTail = child; - } - - // When the new scope is not isolated or we inherit from `this`, and - // the parent scope is destroyed, the property `$$destroyed` is inherited - // prototypically. In all other cases, this property needs to be set - // when the parent scope is destroyed. - // The listener needs to be added after the parent is set - if (isolate || parent != this) child.$on('$destroy', destroyChildScope); - - return child; - }, - - /** - * @ngdoc method - * @name $rootScope.Scope#$watch - * @kind function - * - * @description - * Registers a `listener` callback to be executed whenever the `watchExpression` changes. - * - * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest - * $digest()} and should return the value that will be watched. (`watchExpression` should not change - * its value when executed multiple times with the same input because it may be executed multiple - * times by {@link ng.$rootScope.Scope#$digest $digest()}. That is, `watchExpression` should be - * [idempotent](http://en.wikipedia.org/wiki/Idempotence). - * - The `listener` is called only when the value from the current `watchExpression` and the - * previous call to `watchExpression` are not equal (with the exception of the initial run, - * see below). Inequality is determined according to reference inequality, - * [strict comparison](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators) - * via the `!==` Javascript operator, unless `objectEquality == true` - * (see next point) - * - When `objectEquality == true`, inequality of the `watchExpression` is determined - * according to the {@link angular.equals} function. To save the value of the object for - * later comparison, the {@link angular.copy} function is used. This therefore means that - * watching complex objects will have adverse memory and performance implications. - * - The watch `listener` may change the model, which may trigger other `listener`s to fire. - * This is achieved by rerunning the watchers until no changes are detected. The rerun - * iteration limit is 10 to prevent an infinite loop deadlock. - * - * - * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called, - * you can register a `watchExpression` function with no `listener`. (Be prepared for - * multiple calls to your `watchExpression` because it will execute multiple times in a - * single {@link ng.$rootScope.Scope#$digest $digest} cycle if a change is detected.) - * - * After a watcher is registered with the scope, the `listener` fn is called asynchronously - * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the - * watcher. In rare cases, this is undesirable because the listener is called when the result - * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you - * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the - * listener was called due to initialization. - * - * - * - * # Example - * ```js - // let's assume that scope was dependency injected as the $rootScope - var scope = $rootScope; - scope.name = 'misko'; - scope.counter = 0; - - expect(scope.counter).toEqual(0); - scope.$watch('name', function(newValue, oldValue) { - scope.counter = scope.counter + 1; - }); - expect(scope.counter).toEqual(0); - - scope.$digest(); - // the listener is always called during the first $digest loop after it was registered - expect(scope.counter).toEqual(1); - - scope.$digest(); - // but now it will not be called unless the value changes - expect(scope.counter).toEqual(1); - - scope.name = 'adam'; - scope.$digest(); - expect(scope.counter).toEqual(2); - - - - // Using a function as a watchExpression - var food; - scope.foodCounter = 0; - expect(scope.foodCounter).toEqual(0); - scope.$watch( - // This function returns the value being watched. It is called for each turn of the $digest loop - function() { return food; }, - // This is the change listener, called when the value returned from the above function changes - function(newValue, oldValue) { - if ( newValue !== oldValue ) { - // Only increment the counter if the value changed - scope.foodCounter = scope.foodCounter + 1; - } - } - ); - // No digest has been run so the counter will be zero - expect(scope.foodCounter).toEqual(0); - - // Run the digest but since food has not changed count will still be zero - scope.$digest(); - expect(scope.foodCounter).toEqual(0); - - // Update food and run digest. Now the counter will increment - food = 'cheeseburger'; - scope.$digest(); - expect(scope.foodCounter).toEqual(1); - - * ``` - * - * - * - * @param {(function()|string)} watchExpression Expression that is evaluated on each - * {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers - * a call to the `listener`. - * - * - `string`: Evaluated as {@link guide/expression expression} - * - `function(scope)`: called with current `scope` as a parameter. - * @param {function(newVal, oldVal, scope)} listener Callback called whenever the value - * of `watchExpression` changes. - * - * - `newVal` contains the current value of the `watchExpression` - * - `oldVal` contains the previous value of the `watchExpression` - * - `scope` refers to the current scope - * @param {boolean=} [objectEquality=false] Compare for object equality using {@link angular.equals} instead of - * comparing for reference equality. - * @returns {function()} Returns a deregistration function for this listener. - */ - $watch: function(watchExp, listener, objectEquality, prettyPrintExpression) { - var get = $parse(watchExp); - - if (get.$$watchDelegate) { - return get.$$watchDelegate(this, listener, objectEquality, get, watchExp); - } - var scope = this, - array = scope.$$watchers, - watcher = { - fn: listener, - last: initWatchVal, - get: get, - exp: prettyPrintExpression || watchExp, - eq: !!objectEquality - }; - - lastDirtyWatch = null; - - if (!isFunction(listener)) { - watcher.fn = noop; - } - - if (!array) { - array = scope.$$watchers = []; - } - // we use unshift since we use a while loop in $digest for speed. - // the while loop reads in reverse order. - array.unshift(watcher); - incrementWatchersCount(this, 1); - - return function deregisterWatch() { - if (arrayRemove(array, watcher) >= 0) { - incrementWatchersCount(scope, -1); - } - lastDirtyWatch = null; - }; - }, - - /** - * @ngdoc method - * @name $rootScope.Scope#$watchGroup - * @kind function - * - * @description - * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`. - * If any one expression in the collection changes the `listener` is executed. - * - * - The items in the `watchExpressions` array are observed via standard $watch operation and are examined on every - * call to $digest() to see if any items changes. - * - The `listener` is called whenever any expression in the `watchExpressions` array changes. - * - * @param {Array.} watchExpressions Array of expressions that will be individually - * watched using {@link ng.$rootScope.Scope#$watch $watch()} - * - * @param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any - * expression in `watchExpressions` changes - * The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching - * those of `watchExpression` - * and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching - * those of `watchExpression` - * The `scope` refers to the current scope. - * @returns {function()} Returns a de-registration function for all listeners. - */ - $watchGroup: function(watchExpressions, listener) { - var oldValues = new Array(watchExpressions.length); - var newValues = new Array(watchExpressions.length); - var deregisterFns = []; - var self = this; - var changeReactionScheduled = false; - var firstRun = true; - - if (!watchExpressions.length) { - // No expressions means we call the listener ASAP - var shouldCall = true; - self.$evalAsync(function() { - if (shouldCall) listener(newValues, newValues, self); - }); - return function deregisterWatchGroup() { - shouldCall = false; - }; - } - - if (watchExpressions.length === 1) { - // Special case size of one - return this.$watch(watchExpressions[0], function watchGroupAction(value, oldValue, scope) { - newValues[0] = value; - oldValues[0] = oldValue; - listener(newValues, (value === oldValue) ? newValues : oldValues, scope); - }); - } - - forEach(watchExpressions, function(expr, i) { - var unwatchFn = self.$watch(expr, function watchGroupSubAction(value, oldValue) { - newValues[i] = value; - oldValues[i] = oldValue; - if (!changeReactionScheduled) { - changeReactionScheduled = true; - self.$evalAsync(watchGroupAction); - } - }); - deregisterFns.push(unwatchFn); - }); - - function watchGroupAction() { - changeReactionScheduled = false; - - if (firstRun) { - firstRun = false; - listener(newValues, newValues, self); - } else { - listener(newValues, oldValues, self); - } - } - - return function deregisterWatchGroup() { - while (deregisterFns.length) { - deregisterFns.shift()(); - } - }; - }, - - - /** - * @ngdoc method - * @name $rootScope.Scope#$watchCollection - * @kind function - * - * @description - * Shallow watches the properties of an object and fires whenever any of the properties change - * (for arrays, this implies watching the array items; for object maps, this implies watching - * the properties). If a change is detected, the `listener` callback is fired. - * - * - The `obj` collection is observed via standard $watch operation and is examined on every - * call to $digest() to see if any items have been added, removed, or moved. - * - The `listener` is called whenever anything within the `obj` has changed. Examples include - * adding, removing, and moving items belonging to an object or array. - * - * - * # Example - * ```js - $scope.names = ['igor', 'matias', 'misko', 'james']; - $scope.dataCount = 4; - - $scope.$watchCollection('names', function(newNames, oldNames) { - $scope.dataCount = newNames.length; - }); - - expect($scope.dataCount).toEqual(4); - $scope.$digest(); - - //still at 4 ... no changes - expect($scope.dataCount).toEqual(4); - - $scope.names.pop(); - $scope.$digest(); - - //now there's been a change - expect($scope.dataCount).toEqual(3); - * ``` - * - * - * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The - * expression value should evaluate to an object or an array which is observed on each - * {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the - * collection will trigger a call to the `listener`. - * - * @param {function(newCollection, oldCollection, scope)} listener a callback function called - * when a change is detected. - * - The `newCollection` object is the newly modified data obtained from the `obj` expression - * - The `oldCollection` object is a copy of the former collection data. - * Due to performance considerations, the`oldCollection` value is computed only if the - * `listener` function declares two or more arguments. - * - The `scope` argument refers to the current scope. - * - * @returns {function()} Returns a de-registration function for this listener. When the - * de-registration function is executed, the internal watch operation is terminated. - */ - $watchCollection: function(obj, listener) { - $watchCollectionInterceptor.$stateful = true; - - var self = this; - // the current value, updated on each dirty-check run - var newValue; - // a shallow copy of the newValue from the last dirty-check run, - // updated to match newValue during dirty-check run - var oldValue; - // a shallow copy of the newValue from when the last change happened - var veryOldValue; - // only track veryOldValue if the listener is asking for it - var trackVeryOldValue = (listener.length > 1); - var changeDetected = 0; - var changeDetector = $parse(obj, $watchCollectionInterceptor); - var internalArray = []; - var internalObject = {}; - var initRun = true; - var oldLength = 0; - - function $watchCollectionInterceptor(_value) { - newValue = _value; - var newLength, key, bothNaN, newItem, oldItem; - - // If the new value is undefined, then return undefined as the watch may be a one-time watch - if (isUndefined(newValue)) return; - - if (!isObject(newValue)) { // if primitive - if (oldValue !== newValue) { - oldValue = newValue; - changeDetected++; - } - } else if (isArrayLike(newValue)) { - if (oldValue !== internalArray) { - // we are transitioning from something which was not an array into array. - oldValue = internalArray; - oldLength = oldValue.length = 0; - changeDetected++; - } - - newLength = newValue.length; - - if (oldLength !== newLength) { - // if lengths do not match we need to trigger change notification - changeDetected++; - oldValue.length = oldLength = newLength; - } - // copy the items to oldValue and look for changes. - for (var i = 0; i < newLength; i++) { - oldItem = oldValue[i]; - newItem = newValue[i]; - - bothNaN = (oldItem !== oldItem) && (newItem !== newItem); - if (!bothNaN && (oldItem !== newItem)) { - changeDetected++; - oldValue[i] = newItem; - } - } - } else { - if (oldValue !== internalObject) { - // we are transitioning from something which was not an object into object. - oldValue = internalObject = {}; - oldLength = 0; - changeDetected++; - } - // copy the items to oldValue and look for changes. - newLength = 0; - for (key in newValue) { - if (hasOwnProperty.call(newValue, key)) { - newLength++; - newItem = newValue[key]; - oldItem = oldValue[key]; - - if (key in oldValue) { - bothNaN = (oldItem !== oldItem) && (newItem !== newItem); - if (!bothNaN && (oldItem !== newItem)) { - changeDetected++; - oldValue[key] = newItem; - } - } else { - oldLength++; - oldValue[key] = newItem; - changeDetected++; - } - } - } - if (oldLength > newLength) { - // we used to have more keys, need to find them and destroy them. - changeDetected++; - for (key in oldValue) { - if (!hasOwnProperty.call(newValue, key)) { - oldLength--; - delete oldValue[key]; - } - } - } - } - return changeDetected; - } - - function $watchCollectionAction() { - if (initRun) { - initRun = false; - listener(newValue, newValue, self); - } else { - listener(newValue, veryOldValue, self); - } - - // make a copy for the next time a collection is changed - if (trackVeryOldValue) { - if (!isObject(newValue)) { - //primitive - veryOldValue = newValue; - } else if (isArrayLike(newValue)) { - veryOldValue = new Array(newValue.length); - for (var i = 0; i < newValue.length; i++) { - veryOldValue[i] = newValue[i]; - } - } else { // if object - veryOldValue = {}; - for (var key in newValue) { - if (hasOwnProperty.call(newValue, key)) { - veryOldValue[key] = newValue[key]; - } - } - } - } - } - - return this.$watch(changeDetector, $watchCollectionAction); - }, - - /** - * @ngdoc method - * @name $rootScope.Scope#$digest - * @kind function - * - * @description - * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and - * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change - * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers} - * until no more listeners are firing. This means that it is possible to get into an infinite - * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of - * iterations exceeds 10. - * - * Usually, you don't call `$digest()` directly in - * {@link ng.directive:ngController controllers} or in - * {@link ng.$compileProvider#directive directives}. - * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within - * a {@link ng.$compileProvider#directive directive}), which will force a `$digest()`. - * - * If you want to be notified whenever `$digest()` is called, - * you can register a `watchExpression` function with - * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`. - * - * In unit tests, you may need to call `$digest()` to simulate the scope life cycle. - * - * # Example - * ```js - var scope = ...; - scope.name = 'misko'; - scope.counter = 0; - - expect(scope.counter).toEqual(0); - scope.$watch('name', function(newValue, oldValue) { - scope.counter = scope.counter + 1; - }); - expect(scope.counter).toEqual(0); - - scope.$digest(); - // the listener is always called during the first $digest loop after it was registered - expect(scope.counter).toEqual(1); - - scope.$digest(); - // but now it will not be called unless the value changes - expect(scope.counter).toEqual(1); - - scope.name = 'adam'; - scope.$digest(); - expect(scope.counter).toEqual(2); - * ``` - * - */ - $digest: function() { - var watch, value, last, fn, get, - watchers, - length, - dirty, ttl = TTL, - next, current, target = this, - watchLog = [], - logIdx, asyncTask; - - beginPhase('$digest'); - // Check for changes to browser url that happened in sync before the call to $digest - $browser.$$checkUrlChange(); - - if (this === $rootScope && applyAsyncId !== null) { - // If this is the root scope, and $applyAsync has scheduled a deferred $apply(), then - // cancel the scheduled $apply and flush the queue of expressions to be evaluated. - $browser.defer.cancel(applyAsyncId); - flushApplyAsync(); - } - - lastDirtyWatch = null; - - do { // "while dirty" loop - dirty = false; - current = target; - - while (asyncQueue.length) { - try { - asyncTask = asyncQueue.shift(); - asyncTask.scope.$eval(asyncTask.expression, asyncTask.locals); - } catch (e) { - $exceptionHandler(e); - } - lastDirtyWatch = null; - } - - traverseScopesLoop: - do { // "traverse the scopes" loop - if ((watchers = current.$$watchers)) { - // process our watches - length = watchers.length; - while (length--) { - try { - watch = watchers[length]; - // Most common watches are on primitives, in which case we can short - // circuit it with === operator, only when === fails do we use .equals - if (watch) { - get = watch.get; - if ((value = get(current)) !== (last = watch.last) && - !(watch.eq - ? equals(value, last) - : (typeof value === 'number' && typeof last === 'number' - && isNaN(value) && isNaN(last)))) { - dirty = true; - lastDirtyWatch = watch; - watch.last = watch.eq ? copy(value, null) : value; - fn = watch.fn; - fn(value, ((last === initWatchVal) ? value : last), current); - if (ttl < 5) { - logIdx = 4 - ttl; - if (!watchLog[logIdx]) watchLog[logIdx] = []; - watchLog[logIdx].push({ - msg: isFunction(watch.exp) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp, - newVal: value, - oldVal: last - }); - } - } else if (watch === lastDirtyWatch) { - // If the most recently dirty watcher is now clean, short circuit since the remaining watchers - // have already been tested. - dirty = false; - break traverseScopesLoop; - } - } - } catch (e) { - $exceptionHandler(e); - } - } - } - - // Insanity Warning: scope depth-first traversal - // yes, this code is a bit crazy, but it works and we have tests to prove it! - // this piece should be kept in sync with the traversal in $broadcast - if (!(next = ((current.$$watchersCount && current.$$childHead) || - (current !== target && current.$$nextSibling)))) { - while (current !== target && !(next = current.$$nextSibling)) { - current = current.$parent; - } - } - } while ((current = next)); - - // `break traverseScopesLoop;` takes us to here - - if ((dirty || asyncQueue.length) && !(ttl--)) { - clearPhase(); - throw $rootScopeMinErr('infdig', - '{0} $digest() iterations reached. Aborting!\n' + - 'Watchers fired in the last 5 iterations: {1}', - TTL, watchLog); - } - - } while (dirty || asyncQueue.length); - - clearPhase(); - - while (postDigestQueue.length) { - try { - postDigestQueue.shift()(); - } catch (e) { - $exceptionHandler(e); - } - } - }, - - - /** - * @ngdoc event - * @name $rootScope.Scope#$destroy - * @eventType broadcast on scope being destroyed - * - * @description - * Broadcasted when a scope and its children are being destroyed. - * - * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to - * clean up DOM bindings before an element is removed from the DOM. - */ - - /** - * @ngdoc method - * @name $rootScope.Scope#$destroy - * @kind function - * - * @description - * Removes the current scope (and all of its children) from the parent scope. Removal implies - * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer - * propagate to the current scope and its children. Removal also implies that the current - * scope is eligible for garbage collection. - * - * The `$destroy()` is usually used by directives such as - * {@link ng.directive:ngRepeat ngRepeat} for managing the - * unrolling of the loop. - * - * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope. - * Application code can register a `$destroy` event handler that will give it a chance to - * perform any necessary cleanup. - * - * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to - * clean up DOM bindings before an element is removed from the DOM. - */ - $destroy: function() { - // We can't destroy a scope that has been already destroyed. - if (this.$$destroyed) return; - var parent = this.$parent; - - this.$broadcast('$destroy'); - this.$$destroyed = true; - - if (this === $rootScope) { - //Remove handlers attached to window when $rootScope is removed - $browser.$$applicationDestroyed(); - } - - incrementWatchersCount(this, -this.$$watchersCount); - for (var eventName in this.$$listenerCount) { - decrementListenerCount(this, this.$$listenerCount[eventName], eventName); - } - - // sever all the references to parent scopes (after this cleanup, the current scope should - // not be retained by any of our references and should be eligible for garbage collection) - if (parent && parent.$$childHead == this) parent.$$childHead = this.$$nextSibling; - if (parent && parent.$$childTail == this) parent.$$childTail = this.$$prevSibling; - if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling; - if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling; - - // Disable listeners, watchers and apply/digest methods - this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop; - this.$on = this.$watch = this.$watchGroup = function() { return noop; }; - this.$$listeners = {}; - - // Disconnect the next sibling to prevent `cleanUpScope` destroying those too - this.$$nextSibling = null; - cleanUpScope(this); - }, - - /** - * @ngdoc method - * @name $rootScope.Scope#$eval - * @kind function - * - * @description - * Executes the `expression` on the current scope and returns the result. Any exceptions in - * the expression are propagated (uncaught). This is useful when evaluating Angular - * expressions. - * - * # Example - * ```js - var scope = ng.$rootScope.Scope(); - scope.a = 1; - scope.b = 2; - - expect(scope.$eval('a+b')).toEqual(3); - expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3); - * ``` - * - * @param {(string|function())=} expression An angular expression to be executed. - * - * - `string`: execute using the rules as defined in {@link guide/expression expression}. - * - `function(scope)`: execute the function with the current `scope` parameter. - * - * @param {(object)=} locals Local variables object, useful for overriding values in scope. - * @returns {*} The result of evaluating the expression. - */ - $eval: function(expr, locals) { - return $parse(expr)(this, locals); - }, - - /** - * @ngdoc method - * @name $rootScope.Scope#$evalAsync - * @kind function - * - * @description - * Executes the expression on the current scope at a later point in time. - * - * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only - * that: - * - * - it will execute after the function that scheduled the evaluation (preferably before DOM - * rendering). - * - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after - * `expression` execution. - * - * Any exceptions from the execution of the expression are forwarded to the - * {@link ng.$exceptionHandler $exceptionHandler} service. - * - * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle - * will be scheduled. However, it is encouraged to always call code that changes the model - * from within an `$apply` call. That includes code evaluated via `$evalAsync`. - * - * @param {(string|function())=} expression An angular expression to be executed. - * - * - `string`: execute using the rules as defined in {@link guide/expression expression}. - * - `function(scope)`: execute the function with the current `scope` parameter. - * - * @param {(object)=} locals Local variables object, useful for overriding values in scope. - */ - $evalAsync: function(expr, locals) { - // if we are outside of an $digest loop and this is the first time we are scheduling async - // task also schedule async auto-flush - if (!$rootScope.$$phase && !asyncQueue.length) { - $browser.defer(function() { - if (asyncQueue.length) { - $rootScope.$digest(); - } - }); - } - - asyncQueue.push({scope: this, expression: $parse(expr), locals: locals}); - }, - - $$postDigest: function(fn) { - postDigestQueue.push(fn); - }, - - /** - * @ngdoc method - * @name $rootScope.Scope#$apply - * @kind function - * - * @description - * `$apply()` is used to execute an expression in angular from outside of the angular - * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries). - * Because we are calling into the angular framework we need to perform proper scope life - * cycle of {@link ng.$exceptionHandler exception handling}, - * {@link ng.$rootScope.Scope#$digest executing watches}. - * - * ## Life cycle - * - * # Pseudo-Code of `$apply()` - * ```js - function $apply(expr) { - try { - return $eval(expr); - } catch (e) { - $exceptionHandler(e); - } finally { - $root.$digest(); - } - } - * ``` - * - * - * Scope's `$apply()` method transitions through the following stages: - * - * 1. The {@link guide/expression expression} is executed using the - * {@link ng.$rootScope.Scope#$eval $eval()} method. - * 2. Any exceptions from the execution of the expression are forwarded to the - * {@link ng.$exceptionHandler $exceptionHandler} service. - * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the - * expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method. - * - * - * @param {(string|function())=} exp An angular expression to be executed. - * - * - `string`: execute using the rules as defined in {@link guide/expression expression}. - * - `function(scope)`: execute the function with current `scope` parameter. - * - * @returns {*} The result of evaluating the expression. - */ - $apply: function(expr) { - try { - beginPhase('$apply'); - try { - return this.$eval(expr); - } finally { - clearPhase(); - } - } catch (e) { - $exceptionHandler(e); - } finally { - try { - $rootScope.$digest(); - } catch (e) { - $exceptionHandler(e); - throw e; - } - } - }, - - /** - * @ngdoc method - * @name $rootScope.Scope#$applyAsync - * @kind function - * - * @description - * Schedule the invocation of $apply to occur at a later time. The actual time difference - * varies across browsers, but is typically around ~10 milliseconds. - * - * This can be used to queue up multiple expressions which need to be evaluated in the same - * digest. - * - * @param {(string|function())=} exp An angular expression to be executed. - * - * - `string`: execute using the rules as defined in {@link guide/expression expression}. - * - `function(scope)`: execute the function with current `scope` parameter. - */ - $applyAsync: function(expr) { - var scope = this; - expr && applyAsyncQueue.push($applyAsyncExpression); - expr = $parse(expr); - scheduleApplyAsync(); - - function $applyAsyncExpression() { - scope.$eval(expr); - } - }, - - /** - * @ngdoc method - * @name $rootScope.Scope#$on - * @kind function - * - * @description - * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for - * discussion of event life cycle. - * - * The event listener function format is: `function(event, args...)`. The `event` object - * passed into the listener has the following attributes: - * - * - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or - * `$broadcast`-ed. - * - `currentScope` - `{Scope}`: the scope that is currently handling the event. Once the - * event propagates through the scope hierarchy, this property is set to null. - * - `name` - `{string}`: name of the event. - * - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel - * further event propagation (available only for events that were `$emit`-ed). - * - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag - * to true. - * - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called. - * - * @param {string} name Event name to listen on. - * @param {function(event, ...args)} listener Function to call when the event is emitted. - * @returns {function()} Returns a deregistration function for this listener. - */ - $on: function(name, listener) { - var namedListeners = this.$$listeners[name]; - if (!namedListeners) { - this.$$listeners[name] = namedListeners = []; - } - namedListeners.push(listener); - - var current = this; - do { - if (!current.$$listenerCount[name]) { - current.$$listenerCount[name] = 0; - } - current.$$listenerCount[name]++; - } while ((current = current.$parent)); - - var self = this; - return function() { - var indexOfListener = namedListeners.indexOf(listener); - if (indexOfListener !== -1) { - namedListeners[indexOfListener] = null; - decrementListenerCount(self, 1, name); - } - }; - }, - - - /** - * @ngdoc method - * @name $rootScope.Scope#$emit - * @kind function - * - * @description - * Dispatches an event `name` upwards through the scope hierarchy notifying the - * registered {@link ng.$rootScope.Scope#$on} listeners. - * - * The event life cycle starts at the scope on which `$emit` was called. All - * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get - * notified. Afterwards, the event traverses upwards toward the root scope and calls all - * registered listeners along the way. The event will stop propagating if one of the listeners - * cancels it. - * - * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed - * onto the {@link ng.$exceptionHandler $exceptionHandler} service. - * - * @param {string} name Event name to emit. - * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. - * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}). - */ - $emit: function(name, args) { - var empty = [], - namedListeners, - scope = this, - stopPropagation = false, - event = { - name: name, - targetScope: scope, - stopPropagation: function() {stopPropagation = true;}, - preventDefault: function() { - event.defaultPrevented = true; - }, - defaultPrevented: false - }, - listenerArgs = concat([event], arguments, 1), - i, length; - - do { - namedListeners = scope.$$listeners[name] || empty; - event.currentScope = scope; - for (i = 0, length = namedListeners.length; i < length; i++) { - - // if listeners were deregistered, defragment the array - if (!namedListeners[i]) { - namedListeners.splice(i, 1); - i--; - length--; - continue; - } - try { - //allow all listeners attached to the current scope to run - namedListeners[i].apply(null, listenerArgs); - } catch (e) { - $exceptionHandler(e); - } - } - //if any listener on the current scope stops propagation, prevent bubbling - if (stopPropagation) { - event.currentScope = null; - return event; - } - //traverse upwards - scope = scope.$parent; - } while (scope); - - event.currentScope = null; - - return event; - }, - - - /** - * @ngdoc method - * @name $rootScope.Scope#$broadcast - * @kind function - * - * @description - * Dispatches an event `name` downwards to all child scopes (and their children) notifying the - * registered {@link ng.$rootScope.Scope#$on} listeners. - * - * The event life cycle starts at the scope on which `$broadcast` was called. All - * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get - * notified. Afterwards, the event propagates to all direct and indirect scopes of the current - * scope and calls all registered listeners along the way. The event cannot be canceled. - * - * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed - * onto the {@link ng.$exceptionHandler $exceptionHandler} service. - * - * @param {string} name Event name to broadcast. - * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. - * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on} - */ - $broadcast: function(name, args) { - var target = this, - current = target, - next = target, - event = { - name: name, - targetScope: target, - preventDefault: function() { - event.defaultPrevented = true; - }, - defaultPrevented: false - }; - - if (!target.$$listenerCount[name]) return event; - - var listenerArgs = concat([event], arguments, 1), - listeners, i, length; - - //down while you can, then up and next sibling or up and next sibling until back at root - while ((current = next)) { - event.currentScope = current; - listeners = current.$$listeners[name] || []; - for (i = 0, length = listeners.length; i < length; i++) { - // if listeners were deregistered, defragment the array - if (!listeners[i]) { - listeners.splice(i, 1); - i--; - length--; - continue; - } - - try { - listeners[i].apply(null, listenerArgs); - } catch (e) { - $exceptionHandler(e); - } - } - - // Insanity Warning: scope depth-first traversal - // yes, this code is a bit crazy, but it works and we have tests to prove it! - // this piece should be kept in sync with the traversal in $digest - // (though it differs due to having the extra check for $$listenerCount) - if (!(next = ((current.$$listenerCount[name] && current.$$childHead) || - (current !== target && current.$$nextSibling)))) { - while (current !== target && !(next = current.$$nextSibling)) { - current = current.$parent; - } - } - } - - event.currentScope = null; - return event; - } - }; - - var $rootScope = new Scope(); - - //The internal queues. Expose them on the $rootScope for debugging/testing purposes. - var asyncQueue = $rootScope.$$asyncQueue = []; - var postDigestQueue = $rootScope.$$postDigestQueue = []; - var applyAsyncQueue = $rootScope.$$applyAsyncQueue = []; - - return $rootScope; - - - function beginPhase(phase) { - if ($rootScope.$$phase) { - throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase); - } - - $rootScope.$$phase = phase; - } - - function clearPhase() { - $rootScope.$$phase = null; - } - - function incrementWatchersCount(current, count) { - do { - current.$$watchersCount += count; - } while ((current = current.$parent)); - } - - function decrementListenerCount(current, count, name) { - do { - current.$$listenerCount[name] -= count; - - if (current.$$listenerCount[name] === 0) { - delete current.$$listenerCount[name]; - } - } while ((current = current.$parent)); - } - - /** - * function used as an initial value for watchers. - * because it's unique we can easily tell it apart from other values - */ - function initWatchVal() {} - - function flushApplyAsync() { - while (applyAsyncQueue.length) { - try { - applyAsyncQueue.shift()(); - } catch (e) { - $exceptionHandler(e); - } - } - applyAsyncId = null; - } - - function scheduleApplyAsync() { - if (applyAsyncId === null) { - applyAsyncId = $browser.defer(function() { - $rootScope.$apply(flushApplyAsync); - }); - } - } - }]; -} - -/** - * @ngdoc service - * @name $rootElement - * - * @description - * The root element of Angular application. This is either the element where {@link - * ng.directive:ngApp ngApp} was declared or the element passed into - * {@link angular.bootstrap}. The element represents the root element of application. It is also the - * location where the application's {@link auto.$injector $injector} service gets - * published, and can be retrieved using `$rootElement.injector()`. - */ - - -// the implementation is in angular.bootstrap - -/** - * @description - * Private service to sanitize uris for links and images. Used by $compile and $sanitize. - */ -function $$SanitizeUriProvider() { - var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/, - imgSrcSanitizationWhitelist = /^\s*((https?|ftp|file|blob):|data:image\/)/; - - /** - * @description - * Retrieves or overrides the default regular expression that is used for whitelisting of safe - * urls during a[href] sanitization. - * - * The sanitization is a security measure aimed at prevent XSS attacks via html links. - * - * Any url about to be assigned to a[href] via data-binding is first normalized and turned into - * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` - * regular expression. If a match is found, the original url is written into the dom. Otherwise, - * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. - * - * @param {RegExp=} regexp New regexp to whitelist urls with. - * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for - * chaining otherwise. - */ - this.aHrefSanitizationWhitelist = function(regexp) { - if (isDefined(regexp)) { - aHrefSanitizationWhitelist = regexp; - return this; - } - return aHrefSanitizationWhitelist; - }; - - - /** - * @description - * Retrieves or overrides the default regular expression that is used for whitelisting of safe - * urls during img[src] sanitization. - * - * The sanitization is a security measure aimed at prevent XSS attacks via html links. - * - * Any url about to be assigned to img[src] via data-binding is first normalized and turned into - * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` - * regular expression. If a match is found, the original url is written into the dom. Otherwise, - * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. - * - * @param {RegExp=} regexp New regexp to whitelist urls with. - * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for - * chaining otherwise. - */ - this.imgSrcSanitizationWhitelist = function(regexp) { - if (isDefined(regexp)) { - imgSrcSanitizationWhitelist = regexp; - return this; - } - return imgSrcSanitizationWhitelist; - }; - - this.$get = function() { - return function sanitizeUri(uri, isImage) { - var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist; - var normalizedVal; - normalizedVal = urlResolve(uri).href; - if (normalizedVal !== '' && !normalizedVal.match(regex)) { - return 'unsafe:' + normalizedVal; - } - return uri; - }; - }; -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Any commits to this file should be reviewed with security in mind. * - * Changes to this file can potentially create security vulnerabilities. * - * An approval from 2 Core members with history of modifying * - * this file is required. * - * * - * Does the change somehow allow for arbitrary javascript to be executed? * - * Or allows for someone to change the prototype of built-in objects? * - * Or gives undesired access to variables likes document or window? * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -var $sceMinErr = minErr('$sce'); - -var SCE_CONTEXTS = { - HTML: 'html', - CSS: 'css', - URL: 'url', - // RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a - // url. (e.g. ng-include, script src, templateUrl) - RESOURCE_URL: 'resourceUrl', - JS: 'js' -}; - -// Helper functions follow. - -function adjustMatcher(matcher) { - if (matcher === 'self') { - return matcher; - } else if (isString(matcher)) { - // Strings match exactly except for 2 wildcards - '*' and '**'. - // '*' matches any character except those from the set ':/.?&'. - // '**' matches any character (like .* in a RegExp). - // More than 2 *'s raises an error as it's ill defined. - if (matcher.indexOf('***') > -1) { - throw $sceMinErr('iwcard', - 'Illegal sequence *** in string matcher. String: {0}', matcher); - } - matcher = escapeForRegexp(matcher). - replace('\\*\\*', '.*'). - replace('\\*', '[^:/.?&;]*'); - return new RegExp('^' + matcher + '$'); - } else if (isRegExp(matcher)) { - // The only other type of matcher allowed is a Regexp. - // Match entire URL / disallow partial matches. - // Flags are reset (i.e. no global, ignoreCase or multiline) - return new RegExp('^' + matcher.source + '$'); - } else { - throw $sceMinErr('imatcher', - 'Matchers may only be "self", string patterns or RegExp objects'); - } -} - - -function adjustMatchers(matchers) { - var adjustedMatchers = []; - if (isDefined(matchers)) { - forEach(matchers, function(matcher) { - adjustedMatchers.push(adjustMatcher(matcher)); - }); - } - return adjustedMatchers; -} - - -/** - * @ngdoc service - * @name $sceDelegate - * @kind function - * - * @description - * - * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict - * Contextual Escaping (SCE)} services to AngularJS. - * - * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of - * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS. This is - * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to - * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things - * work because `$sce` delegates to `$sceDelegate` for these operations. - * - * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service. - * - * The default instance of `$sceDelegate` should work out of the box with little pain. While you - * can override it completely to change the behavior of `$sce`, the common case would - * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting - * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as - * templates. Refer {@link ng.$sceDelegateProvider#resourceUrlWhitelist - * $sceDelegateProvider.resourceUrlWhitelist} and {@link - * ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} - */ - -/** - * @ngdoc provider - * @name $sceDelegateProvider - * @description - * - * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate - * $sceDelegate} service. This allows one to get/set the whitelists and blacklists used to ensure - * that the URLs used for sourcing Angular templates are safe. Refer {@link - * ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and - * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} - * - * For the general details about this service in Angular, read the main page for {@link ng.$sce - * Strict Contextual Escaping (SCE)}. - * - * **Example**: Consider the following case. - * - * - your app is hosted at url `http://myapp.example.com/` - * - but some of your templates are hosted on other domains you control such as - * `http://srv01.assets.example.com/`,  `http://srv02.assets.example.com/`, etc. - * - and you have an open redirect at `http://myapp.example.com/clickThru?...`. - * - * Here is what a secure configuration for this scenario might look like: - * - * ``` - * angular.module('myApp', []).config(function($sceDelegateProvider) { - * $sceDelegateProvider.resourceUrlWhitelist([ - * // Allow same origin resource loads. - * 'self', - * // Allow loading from our assets domain. Notice the difference between * and **. - * 'http://srv*.assets.example.com/**' - * ]); - * - * // The blacklist overrides the whitelist so the open redirect here is blocked. - * $sceDelegateProvider.resourceUrlBlacklist([ - * 'http://myapp.example.com/clickThru**' - * ]); - * }); - * ``` - */ - -function $SceDelegateProvider() { - this.SCE_CONTEXTS = SCE_CONTEXTS; - - // Resource URLs can also be trusted by policy. - var resourceUrlWhitelist = ['self'], - resourceUrlBlacklist = []; - - /** - * @ngdoc method - * @name $sceDelegateProvider#resourceUrlWhitelist - * @kind function - * - * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value - * provided. This must be an array or null. A snapshot of this array is used so further - * changes to the array are ignored. - * - * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items - * allowed in this array. - * - *
                                        - * **Note:** an empty whitelist array will block all URLs! - *
                                        - * - * @return {Array} the currently set whitelist array. - * - * The **default value** when no whitelist has been explicitly set is `['self']` allowing only - * same origin resource requests. - * - * @description - * Sets/Gets the whitelist of trusted resource URLs. - */ - this.resourceUrlWhitelist = function(value) { - if (arguments.length) { - resourceUrlWhitelist = adjustMatchers(value); - } - return resourceUrlWhitelist; - }; - - /** - * @ngdoc method - * @name $sceDelegateProvider#resourceUrlBlacklist - * @kind function - * - * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value - * provided. This must be an array or null. A snapshot of this array is used so further - * changes to the array are ignored. - * - * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items - * allowed in this array. - * - * The typical usage for the blacklist is to **block - * [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as - * these would otherwise be trusted but actually return content from the redirected domain. - * - * Finally, **the blacklist overrides the whitelist** and has the final say. - * - * @return {Array} the currently set blacklist array. - * - * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there - * is no blacklist.) - * - * @description - * Sets/Gets the blacklist of trusted resource URLs. - */ - - this.resourceUrlBlacklist = function(value) { - if (arguments.length) { - resourceUrlBlacklist = adjustMatchers(value); - } - return resourceUrlBlacklist; - }; - - this.$get = ['$injector', function($injector) { - - var htmlSanitizer = function htmlSanitizer(html) { - throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); - }; - - if ($injector.has('$sanitize')) { - htmlSanitizer = $injector.get('$sanitize'); - } - - - function matchUrl(matcher, parsedUrl) { - if (matcher === 'self') { - return urlIsSameOrigin(parsedUrl); - } else { - // definitely a regex. See adjustMatchers() - return !!matcher.exec(parsedUrl.href); - } - } - - function isResourceUrlAllowedByPolicy(url) { - var parsedUrl = urlResolve(url.toString()); - var i, n, allowed = false; - // Ensure that at least one item from the whitelist allows this url. - for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) { - if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) { - allowed = true; - break; - } - } - if (allowed) { - // Ensure that no item from the blacklist blocked this url. - for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) { - if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) { - allowed = false; - break; - } - } - } - return allowed; - } - - function generateHolderType(Base) { - var holderType = function TrustedValueHolderType(trustedValue) { - this.$$unwrapTrustedValue = function() { - return trustedValue; - }; - }; - if (Base) { - holderType.prototype = new Base(); - } - holderType.prototype.valueOf = function sceValueOf() { - return this.$$unwrapTrustedValue(); - }; - holderType.prototype.toString = function sceToString() { - return this.$$unwrapTrustedValue().toString(); - }; - return holderType; - } - - var trustedValueHolderBase = generateHolderType(), - byType = {}; - - byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase); - byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase); - byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase); - byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase); - byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]); - - /** - * @ngdoc method - * @name $sceDelegate#trustAs - * - * @description - * Returns an object that is trusted by angular for use in specified strict - * contextual escaping contexts (such as ng-bind-html, ng-include, any src - * attribute interpolation, any dom event binding attribute interpolation - * such as for onclick, etc.) that uses the provided value. - * See {@link ng.$sce $sce} for enabling strict contextual escaping. - * - * @param {string} type The kind of context in which this value is safe for use. e.g. url, - * resourceUrl, html, js and css. - * @param {*} value The value that that should be considered trusted/safe. - * @returns {*} A value that can be used to stand in for the provided `value` in places - * where Angular expects a $sce.trustAs() return value. - */ - function trustAs(type, trustedValue) { - var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null); - if (!Constructor) { - throw $sceMinErr('icontext', - 'Attempted to trust a value in invalid context. Context: {0}; Value: {1}', - type, trustedValue); - } - if (trustedValue === null || isUndefined(trustedValue) || trustedValue === '') { - return trustedValue; - } - // All the current contexts in SCE_CONTEXTS happen to be strings. In order to avoid trusting - // mutable objects, we ensure here that the value passed in is actually a string. - if (typeof trustedValue !== 'string') { - throw $sceMinErr('itype', - 'Attempted to trust a non-string value in a content requiring a string: Context: {0}', - type); - } - return new Constructor(trustedValue); - } - - /** - * @ngdoc method - * @name $sceDelegate#valueOf - * - * @description - * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#trustAs - * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link - * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. - * - * If the passed parameter is not a value that had been returned by {@link - * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, returns it as-is. - * - * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} - * call or anything else. - * @returns {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs - * `$sceDelegate.trustAs`} if `value` is the result of such a call. Otherwise, returns - * `value` unchanged. - */ - function valueOf(maybeTrusted) { - if (maybeTrusted instanceof trustedValueHolderBase) { - return maybeTrusted.$$unwrapTrustedValue(); - } else { - return maybeTrusted; - } - } - - /** - * @ngdoc method - * @name $sceDelegate#getTrusted - * - * @description - * Takes the result of a {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} call and - * returns the originally supplied value if the queried context type is a supertype of the - * created type. If this condition isn't satisfied, throws an exception. - * - *
                                        - * Disabling auto-escaping is extremely dangerous, it usually creates a Cross Site Scripting - * (XSS) vulnerability in your application. - *
                                        - * - * @param {string} type The kind of context in which this value is to be used. - * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs - * `$sceDelegate.trustAs`} call. - * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#trustAs - * `$sceDelegate.trustAs`} if valid in this context. Otherwise, throws an exception. - */ - function getTrusted(type, maybeTrusted) { - if (maybeTrusted === null || isUndefined(maybeTrusted) || maybeTrusted === '') { - return maybeTrusted; - } - var constructor = (byType.hasOwnProperty(type) ? byType[type] : null); - if (constructor && maybeTrusted instanceof constructor) { - return maybeTrusted.$$unwrapTrustedValue(); - } - // If we get here, then we may only take one of two actions. - // 1. sanitize the value for the requested type, or - // 2. throw an exception. - if (type === SCE_CONTEXTS.RESOURCE_URL) { - if (isResourceUrlAllowedByPolicy(maybeTrusted)) { - return maybeTrusted; - } else { - throw $sceMinErr('insecurl', - 'Blocked loading resource from url not allowed by $sceDelegate policy. URL: {0}', - maybeTrusted.toString()); - } - } else if (type === SCE_CONTEXTS.HTML) { - return htmlSanitizer(maybeTrusted); - } - throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); - } - - return { trustAs: trustAs, - getTrusted: getTrusted, - valueOf: valueOf }; - }]; -} - - -/** - * @ngdoc provider - * @name $sceProvider - * @description - * - * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service. - * - enable/disable Strict Contextual Escaping (SCE) in a module - * - override the default implementation with a custom delegate - * - * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}. - */ - -/* jshint maxlen: false*/ - -/** - * @ngdoc service - * @name $sce - * @kind function - * - * @description - * - * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS. - * - * # Strict Contextual Escaping - * - * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain - * contexts to result in a value that is marked as safe to use for that context. One example of - * such a context is binding arbitrary html controlled by the user via `ng-bind-html`. We refer - * to these contexts as privileged or SCE contexts. - * - * As of version 1.2, Angular ships with SCE enabled by default. - * - * Note: When enabled (the default), IE<11 in quirks mode is not supported. In this mode, IE<11 allow - * one to execute arbitrary javascript by the use of the expression() syntax. Refer - * to learn more about them. - * You can ensure your document is in standards mode and not quirks mode by adding `` - * to the top of your HTML document. - * - * SCE assists in writing code in way that (a) is secure by default and (b) makes auditing for - * security vulnerabilities such as XSS, clickjacking, etc. a lot easier. - * - * Here's an example of a binding in a privileged context: - * - * ``` - * - *
                                        - * ``` - * - * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user. With SCE - * disabled, this application allows the user to render arbitrary HTML into the DIV. - * In a more realistic example, one may be rendering user comments, blog articles, etc. via - * bindings. (HTML is just one example of a context where rendering user controlled input creates - * security vulnerabilities.) - * - * For the case of HTML, you might use a library, either on the client side, or on the server side, - * to sanitize unsafe HTML before binding to the value and rendering it in the document. - * - * How would you ensure that every place that used these types of bindings was bound to a value that - * was sanitized by your library (or returned as safe for rendering by your server?) How can you - * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some - * properties/fields and forgot to update the binding to the sanitized value? - * - * To be secure by default, you want to ensure that any such bindings are disallowed unless you can - * determine that something explicitly says it's safe to use a value for binding in that - * context. You can then audit your code (a simple grep would do) to ensure that this is only done - * for those values that you can easily tell are safe - because they were received from your server, - * sanitized by your library, etc. You can organize your codebase to help with this - perhaps - * allowing only the files in a specific directory to do this. Ensuring that the internal API - * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task. - * - * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs} - * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to - * obtain values that will be accepted by SCE / privileged contexts. - * - * - * ## How does it work? - * - * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted - * $sce.getTrusted(context, value)} rather than to the value directly. Directives use {@link - * ng.$sce#parseAs $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the - * {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals. - * - * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link - * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}. Here's the actual code (slightly - * simplified): - * - * ``` - * var ngBindHtmlDirective = ['$sce', function($sce) { - * return function(scope, element, attr) { - * scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) { - * element.html(value || ''); - * }); - * }; - * }]; - * ``` - * - * ## Impact on loading templates - * - * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as - * `templateUrl`'s specified by {@link guide/directive directives}. - * - * By default, Angular only loads templates from the same domain and protocol as the application - * document. This is done by calling {@link ng.$sce#getTrustedResourceUrl - * $sce.getTrustedResourceUrl} on the template URL. To load templates from other domains and/or - * protocols, you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist - * them} or {@link ng.$sce#trustAsResourceUrl wrap it} into a trusted value. - * - * *Please note*: - * The browser's - * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest) - * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/) - * policy apply in addition to this and may further restrict whether the template is successfully - * loaded. This means that without the right CORS policy, loading templates from a different domain - * won't work on all browsers. Also, loading templates from `file://` URL does not work on some - * browsers. - * - * ## This feels like too much overhead - * - * It's important to remember that SCE only applies to interpolation expressions. - * - * If your expressions are constant literals, they're automatically trusted and you don't need to - * call `$sce.trustAs` on them (remember to include the `ngSanitize` module) (e.g. - * `
                                        `) just works. - * - * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them - * through {@link ng.$sce#getTrusted $sce.getTrusted}. SCE doesn't play a role here. - * - * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load - * templates in `ng-include` from your application's domain without having to even know about SCE. - * It blocks loading templates from other domains or loading templates over http from an https - * served document. You can change these by setting your own custom {@link - * ng.$sceDelegateProvider#resourceUrlWhitelist whitelists} and {@link - * ng.$sceDelegateProvider#resourceUrlBlacklist blacklists} for matching such URLs. - * - * This significantly reduces the overhead. It is far easier to pay the small overhead and have an - * application that's secure and can be audited to verify that with much more ease than bolting - * security onto an application later. - * - * - * ## What trusted context types are supported? - * - * | Context | Notes | - * |---------------------|----------------| - * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. | - * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. | - * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`
                                        Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | - * | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. | - * - * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist}
                                        - * - * Each element in these arrays must be one of the following: - * - * - **'self'** - * - The special **string**, `'self'`, can be used to match against all URLs of the **same - * domain** as the application document using the **same protocol**. - * - **String** (except the special value `'self'`) - * - The string is matched against the full *normalized / absolute URL* of the resource - * being tested (substring matches are not good enough.) - * - There are exactly **two wildcard sequences** - `*` and `**`. All other characters - * match themselves. - * - `*`: matches zero or more occurrences of any character other than one of the following 6 - * characters: '`:`', '`/`', '`.`', '`?`', '`&`' and '`;`'. It's a useful wildcard for use - * in a whitelist. - * - `**`: matches zero or more occurrences of *any* character. As such, it's not - * appropriate for use in a scheme, domain, etc. as it would match too much. (e.g. - * http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might - * not have been the intention.) Its usage at the very end of the path is ok. (e.g. - * http://foo.example.com/templates/**). - * - **RegExp** (*see caveat below*) - * - *Caveat*: While regular expressions are powerful and offer great flexibility, their syntax - * (and all the inevitable escaping) makes them *harder to maintain*. It's easy to - * accidentally introduce a bug when one updates a complex expression (imho, all regexes should - * have good test coverage). For instance, the use of `.` in the regex is correct only in a - * small number of cases. A `.` character in the regex used when matching the scheme or a - * subdomain could be matched against a `:` or literal `.` that was likely not intended. It - * is highly recommended to use the string patterns and only fall back to regular expressions - * as a last resort. - * - The regular expression must be an instance of RegExp (i.e. not a string.) It is - * matched against the **entire** *normalized / absolute URL* of the resource being tested - * (even when the RegExp did not have the `^` and `$` codes.) In addition, any flags - * present on the RegExp (such as multiline, global, ignoreCase) are ignored. - * - If you are generating your JavaScript from some other templating engine (not - * recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)), - * remember to escape your regular expression (and be aware that you might need more than - * one level of escaping depending on your templating engine and the way you interpolated - * the value.) Do make use of your platform's escaping mechanism as it might be good - * enough before coding your own. E.g. Ruby has - * [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape) - * and Python has [re.escape](http://docs.python.org/library/re.html#re.escape). - * Javascript lacks a similar built in function for escaping. Take a look at Google - * Closure library's [goog.string.regExpEscape(s)]( - * http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962). - * - * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example. - * - * ## Show me an example using SCE. - * - * - * - *
                                        - *

                                        - * User comments
                                        - * By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when - * $sanitize is available. If $sanitize isn't available, this results in an error instead of an - * exploit. - *
                                        - *
                                        - * {{userComment.name}}: - * - *
                                        - *
                                        - *
                                        - *
                                        - *
                                        - * - * - * angular.module('mySceApp', ['ngSanitize']) - * .controller('AppController', ['$http', '$templateCache', '$sce', - * function($http, $templateCache, $sce) { - * var self = this; - * $http.get("test_data.json", {cache: $templateCache}).success(function(userComments) { - * self.userComments = userComments; - * }); - * self.explicitlyTrustedHtml = $sce.trustAsHtml( - * 'Hover over this text.'); - * }]); - * - * - * - * [ - * { "name": "Alice", - * "htmlComment": - * "Is anyone reading this?" - * }, - * { "name": "Bob", - * "htmlComment": "Yes! Am I the only other one?" - * } - * ] - * - * - * - * describe('SCE doc demo', function() { - * it('should sanitize untrusted values', function() { - * expect(element.all(by.css('.htmlComment')).first().getInnerHtml()) - * .toBe('Is anyone reading this?'); - * }); - * - * it('should NOT sanitize explicitly trusted values', function() { - * expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe( - * 'Hover over this text.'); - * }); - * }); - * - *
                                        - * - * - * - * ## Can I disable SCE completely? - * - * Yes, you can. However, this is strongly discouraged. SCE gives you a lot of security benefits - * for little coding overhead. It will be much harder to take an SCE disabled application and - * either secure it on your own or enable SCE at a later stage. It might make sense to disable SCE - * for cases where you have a lot of existing code that was written before SCE was introduced and - * you're migrating them a module at a time. - * - * That said, here's how you can completely disable SCE: - * - * ``` - * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) { - * // Completely disable SCE. For demonstration purposes only! - * // Do not use in new projects. - * $sceProvider.enabled(false); - * }); - * ``` - * - */ -/* jshint maxlen: 100 */ - -function $SceProvider() { - var enabled = true; - - /** - * @ngdoc method - * @name $sceProvider#enabled - * @kind function - * - * @param {boolean=} value If provided, then enables/disables SCE. - * @return {boolean} true if SCE is enabled, false otherwise. - * - * @description - * Enables/disables SCE and returns the current value. - */ - this.enabled = function(value) { - if (arguments.length) { - enabled = !!value; - } - return enabled; - }; - - - /* Design notes on the default implementation for SCE. - * - * The API contract for the SCE delegate - * ------------------------------------- - * The SCE delegate object must provide the following 3 methods: - * - * - trustAs(contextEnum, value) - * This method is used to tell the SCE service that the provided value is OK to use in the - * contexts specified by contextEnum. It must return an object that will be accepted by - * getTrusted() for a compatible contextEnum and return this value. - * - * - valueOf(value) - * For values that were not produced by trustAs(), return them as is. For values that were - * produced by trustAs(), return the corresponding input value to trustAs. Basically, if - * trustAs is wrapping the given values into some type, this operation unwraps it when given - * such a value. - * - * - getTrusted(contextEnum, value) - * This function should return the a value that is safe to use in the context specified by - * contextEnum or throw and exception otherwise. - * - * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be - * opaque or wrapped in some holder object. That happens to be an implementation detail. For - * instance, an implementation could maintain a registry of all trusted objects by context. In - * such a case, trustAs() would return the same object that was passed in. getTrusted() would - * return the same object passed in if it was found in the registry under a compatible context or - * throw an exception otherwise. An implementation might only wrap values some of the time based - * on some criteria. getTrusted() might return a value and not throw an exception for special - * constants or objects even if not wrapped. All such implementations fulfill this contract. - * - * - * A note on the inheritance model for SCE contexts - * ------------------------------------------------ - * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types. This - * is purely an implementation details. - * - * The contract is simply this: - * - * getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value) - * will also succeed. - * - * Inheritance happens to capture this in a natural way. In some future, we - * may not use inheritance anymore. That is OK because no code outside of - * sce.js and sceSpecs.js would need to be aware of this detail. - */ - - this.$get = ['$parse', '$sceDelegate', function( - $parse, $sceDelegate) { - // Prereq: Ensure that we're not running in IE<11 quirks mode. In that mode, IE < 11 allow - // the "expression(javascript expression)" syntax which is insecure. - if (enabled && msie < 8) { - throw $sceMinErr('iequirks', - 'Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks ' + - 'mode. You can fix this by adding the text to the top of your HTML ' + - 'document. See http://docs.angularjs.org/api/ng.$sce for more information.'); - } - - var sce = shallowCopy(SCE_CONTEXTS); - - /** - * @ngdoc method - * @name $sce#isEnabled - * @kind function - * - * @return {Boolean} true if SCE is enabled, false otherwise. If you want to set the value, you - * have to do it at module config time on {@link ng.$sceProvider $sceProvider}. - * - * @description - * Returns a boolean indicating if SCE is enabled. - */ - sce.isEnabled = function() { - return enabled; - }; - sce.trustAs = $sceDelegate.trustAs; - sce.getTrusted = $sceDelegate.getTrusted; - sce.valueOf = $sceDelegate.valueOf; - - if (!enabled) { - sce.trustAs = sce.getTrusted = function(type, value) { return value; }; - sce.valueOf = identity; - } - - /** - * @ngdoc method - * @name $sce#parseAs - * - * @description - * Converts Angular {@link guide/expression expression} into a function. This is like {@link - * ng.$parse $parse} and is identical when the expression is a literal constant. Otherwise, it - * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*, - * *result*)} - * - * @param {string} type The kind of SCE context in which this result will be used. - * @param {string} expression String expression to compile. - * @returns {function(context, locals)} a function which represents the compiled expression: - * - * * `context` – `{object}` – an object against which any expressions embedded in the strings - * are evaluated against (typically a scope object). - * * `locals` – `{object=}` – local variables context object, useful for overriding values in - * `context`. - */ - sce.parseAs = function sceParseAs(type, expr) { - var parsed = $parse(expr); - if (parsed.literal && parsed.constant) { - return parsed; - } else { - return $parse(expr, function(value) { - return sce.getTrusted(type, value); - }); - } - }; - - /** - * @ngdoc method - * @name $sce#trustAs - * - * @description - * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. As such, - * returns an object that is trusted by angular for use in specified strict contextual - * escaping contexts (such as ng-bind-html, ng-include, any src attribute - * interpolation, any dom event binding attribute interpolation such as for onclick, etc.) - * that uses the provided value. See * {@link ng.$sce $sce} for enabling strict contextual - * escaping. - * - * @param {string} type The kind of context in which this value is safe for use. e.g. url, - * resourceUrl, html, js and css. - * @param {*} value The value that that should be considered trusted/safe. - * @returns {*} A value that can be used to stand in for the provided `value` in places - * where Angular expects a $sce.trustAs() return value. - */ - - /** - * @ngdoc method - * @name $sce#trustAsHtml - * - * @description - * Shorthand method. `$sce.trustAsHtml(value)` → - * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`} - * - * @param {*} value The value to trustAs. - * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedHtml - * $sce.getTrustedHtml(value)} to obtain the original value. (privileged directives - * only accept expressions that are either literal constants or are the - * return value of {@link ng.$sce#trustAs $sce.trustAs}.) - */ - - /** - * @ngdoc method - * @name $sce#trustAsUrl - * - * @description - * Shorthand method. `$sce.trustAsUrl(value)` → - * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`} - * - * @param {*} value The value to trustAs. - * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedUrl - * $sce.getTrustedUrl(value)} to obtain the original value. (privileged directives - * only accept expressions that are either literal constants or are the - * return value of {@link ng.$sce#trustAs $sce.trustAs}.) - */ - - /** - * @ngdoc method - * @name $sce#trustAsResourceUrl - * - * @description - * Shorthand method. `$sce.trustAsResourceUrl(value)` → - * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`} - * - * @param {*} value The value to trustAs. - * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedResourceUrl - * $sce.getTrustedResourceUrl(value)} to obtain the original value. (privileged directives - * only accept expressions that are either literal constants or are the return - * value of {@link ng.$sce#trustAs $sce.trustAs}.) - */ - - /** - * @ngdoc method - * @name $sce#trustAsJs - * - * @description - * Shorthand method. `$sce.trustAsJs(value)` → - * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`} - * - * @param {*} value The value to trustAs. - * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedJs - * $sce.getTrustedJs(value)} to obtain the original value. (privileged directives - * only accept expressions that are either literal constants or are the - * return value of {@link ng.$sce#trustAs $sce.trustAs}.) - */ - - /** - * @ngdoc method - * @name $sce#getTrusted - * - * @description - * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}. As such, - * takes the result of a {@link ng.$sce#trustAs `$sce.trustAs`}() call and returns the - * originally supplied value if the queried context type is a supertype of the created type. - * If this condition isn't satisfied, throws an exception. - * - * @param {string} type The kind of context in which this value is to be used. - * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs `$sce.trustAs`} - * call. - * @returns {*} The value the was originally provided to - * {@link ng.$sce#trustAs `$sce.trustAs`} if valid in this context. - * Otherwise, throws an exception. - */ - - /** - * @ngdoc method - * @name $sce#getTrustedHtml - * - * @description - * Shorthand method. `$sce.getTrustedHtml(value)` → - * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`} - * - * @param {*} value The value to pass to `$sce.getTrusted`. - * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)` - */ - - /** - * @ngdoc method - * @name $sce#getTrustedCss - * - * @description - * Shorthand method. `$sce.getTrustedCss(value)` → - * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`} - * - * @param {*} value The value to pass to `$sce.getTrusted`. - * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)` - */ - - /** - * @ngdoc method - * @name $sce#getTrustedUrl - * - * @description - * Shorthand method. `$sce.getTrustedUrl(value)` → - * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`} - * - * @param {*} value The value to pass to `$sce.getTrusted`. - * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)` - */ - - /** - * @ngdoc method - * @name $sce#getTrustedResourceUrl - * - * @description - * Shorthand method. `$sce.getTrustedResourceUrl(value)` → - * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`} - * - * @param {*} value The value to pass to `$sceDelegate.getTrusted`. - * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)` - */ - - /** - * @ngdoc method - * @name $sce#getTrustedJs - * - * @description - * Shorthand method. `$sce.getTrustedJs(value)` → - * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`} - * - * @param {*} value The value to pass to `$sce.getTrusted`. - * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)` - */ - - /** - * @ngdoc method - * @name $sce#parseAsHtml - * - * @description - * Shorthand method. `$sce.parseAsHtml(expression string)` → - * {@link ng.$sce#parseAs `$sce.parseAs($sce.HTML, value)`} - * - * @param {string} expression String expression to compile. - * @returns {function(context, locals)} a function which represents the compiled expression: - * - * * `context` – `{object}` – an object against which any expressions embedded in the strings - * are evaluated against (typically a scope object). - * * `locals` – `{object=}` – local variables context object, useful for overriding values in - * `context`. - */ - - /** - * @ngdoc method - * @name $sce#parseAsCss - * - * @description - * Shorthand method. `$sce.parseAsCss(value)` → - * {@link ng.$sce#parseAs `$sce.parseAs($sce.CSS, value)`} - * - * @param {string} expression String expression to compile. - * @returns {function(context, locals)} a function which represents the compiled expression: - * - * * `context` – `{object}` – an object against which any expressions embedded in the strings - * are evaluated against (typically a scope object). - * * `locals` – `{object=}` – local variables context object, useful for overriding values in - * `context`. - */ - - /** - * @ngdoc method - * @name $sce#parseAsUrl - * - * @description - * Shorthand method. `$sce.parseAsUrl(value)` → - * {@link ng.$sce#parseAs `$sce.parseAs($sce.URL, value)`} - * - * @param {string} expression String expression to compile. - * @returns {function(context, locals)} a function which represents the compiled expression: - * - * * `context` – `{object}` – an object against which any expressions embedded in the strings - * are evaluated against (typically a scope object). - * * `locals` – `{object=}` – local variables context object, useful for overriding values in - * `context`. - */ - - /** - * @ngdoc method - * @name $sce#parseAsResourceUrl - * - * @description - * Shorthand method. `$sce.parseAsResourceUrl(value)` → - * {@link ng.$sce#parseAs `$sce.parseAs($sce.RESOURCE_URL, value)`} - * - * @param {string} expression String expression to compile. - * @returns {function(context, locals)} a function which represents the compiled expression: - * - * * `context` – `{object}` – an object against which any expressions embedded in the strings - * are evaluated against (typically a scope object). - * * `locals` – `{object=}` – local variables context object, useful for overriding values in - * `context`. - */ - - /** - * @ngdoc method - * @name $sce#parseAsJs - * - * @description - * Shorthand method. `$sce.parseAsJs(value)` → - * {@link ng.$sce#parseAs `$sce.parseAs($sce.JS, value)`} - * - * @param {string} expression String expression to compile. - * @returns {function(context, locals)} a function which represents the compiled expression: - * - * * `context` – `{object}` – an object against which any expressions embedded in the strings - * are evaluated against (typically a scope object). - * * `locals` – `{object=}` – local variables context object, useful for overriding values in - * `context`. - */ - - // Shorthand delegations. - var parse = sce.parseAs, - getTrusted = sce.getTrusted, - trustAs = sce.trustAs; - - forEach(SCE_CONTEXTS, function(enumValue, name) { - var lName = lowercase(name); - sce[camelCase("parse_as_" + lName)] = function(expr) { - return parse(enumValue, expr); - }; - sce[camelCase("get_trusted_" + lName)] = function(value) { - return getTrusted(enumValue, value); - }; - sce[camelCase("trust_as_" + lName)] = function(value) { - return trustAs(enumValue, value); - }; - }); - - return sce; - }]; -} - -/** - * !!! This is an undocumented "private" service !!! - * - * @name $sniffer - * @requires $window - * @requires $document - * - * @property {boolean} history Does the browser support html5 history api ? - * @property {boolean} transitions Does the browser support CSS transition events ? - * @property {boolean} animations Does the browser support CSS animation events ? - * - * @description - * This is very simple implementation of testing browser's features. - */ -function $SnifferProvider() { - this.$get = ['$window', '$document', function($window, $document) { - var eventSupport = {}, - android = - toInt((/android (\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]), - boxee = /Boxee/i.test(($window.navigator || {}).userAgent), - document = $document[0] || {}, - vendorPrefix, - vendorRegex = /^(Moz|webkit|ms)(?=[A-Z])/, - bodyStyle = document.body && document.body.style, - transitions = false, - animations = false, - match; - - if (bodyStyle) { - for (var prop in bodyStyle) { - if (match = vendorRegex.exec(prop)) { - vendorPrefix = match[0]; - vendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1); - break; - } - } - - if (!vendorPrefix) { - vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit'; - } - - transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle)); - animations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle)); - - if (android && (!transitions || !animations)) { - transitions = isString(bodyStyle.webkitTransition); - animations = isString(bodyStyle.webkitAnimation); - } - } - - - return { - // Android has history.pushState, but it does not update location correctly - // so let's not use the history API at all. - // http://code.google.com/p/android/issues/detail?id=17471 - // https://github.com/angular/angular.js/issues/904 - - // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has - // so let's not use the history API also - // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined - // jshint -W018 - history: !!($window.history && $window.history.pushState && !(android < 4) && !boxee), - // jshint +W018 - hasEvent: function(event) { - // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have - // it. In particular the event is not fired when backspace or delete key are pressed or - // when cut operation is performed. - // IE10+ implements 'input' event but it erroneously fires under various situations, - // e.g. when placeholder changes, or a form is focused. - if (event === 'input' && msie <= 11) return false; - - if (isUndefined(eventSupport[event])) { - var divElm = document.createElement('div'); - eventSupport[event] = 'on' + event in divElm; - } - - return eventSupport[event]; - }, - csp: csp(), - vendorPrefix: vendorPrefix, - transitions: transitions, - animations: animations, - android: android - }; - }]; -} - -var $templateRequestMinErr = minErr('$compile'); - -/** - * @ngdoc provider - * @name $templateRequestProvider - * @description - * Used to configure the options passed to the {@link $http} service when making a template request. - * - * For example, it can be used for specifying the "Accept" header that is sent to the server, when - * requesting a template. - */ -function $TemplateRequestProvider() { - - var httpOptions; - - /** - * @ngdoc method - * @name $templateRequestProvider#httpOptions - * @description - * The options to be passed to the {@link $http} service when making the request. - * You can use this to override options such as the "Accept" header for template requests. - * - * The {@link $templateRequest} will set the `cache` and the `transformResponse` properties of the - * options if not overridden here. - * - * @param {string=} value new value for the {@link $http} options. - * @returns {string|self} Returns the {@link $http} options when used as getter and self if used as setter. - */ - this.httpOptions = function(val) { - if (val) { - httpOptions = val; - return this; - } - return httpOptions; - }; - - /** - * @ngdoc service - * @name $templateRequest - * - * @description - * The `$templateRequest` service runs security checks then downloads the provided template using - * `$http` and, upon success, stores the contents inside of `$templateCache`. If the HTTP request - * fails or the response data of the HTTP request is empty, a `$compile` error will be thrown (the - * exception can be thwarted by setting the 2nd parameter of the function to true). Note that the - * contents of `$templateCache` are trusted, so the call to `$sce.getTrustedUrl(tpl)` is omitted - * when `tpl` is of type string and `$templateCache` has the matching entry. - * - * If you want to pass custom options to the `$http` service, such as setting the Accept header you - * can configure this via {@link $templateRequestProvider#httpOptions}. - * - * @param {string|TrustedResourceUrl} tpl The HTTP request template URL - * @param {boolean=} ignoreRequestError Whether or not to ignore the exception when the request fails or the template is empty - * - * @return {Promise} a promise for the HTTP response data of the given URL. - * - * @property {number} totalPendingRequests total amount of pending template requests being downloaded. - */ - this.$get = ['$templateCache', '$http', '$q', '$sce', function($templateCache, $http, $q, $sce) { - - function handleRequestFn(tpl, ignoreRequestError) { - handleRequestFn.totalPendingRequests++; - - // We consider the template cache holds only trusted templates, so - // there's no need to go through whitelisting again for keys that already - // are included in there. This also makes Angular accept any script - // directive, no matter its name. However, we still need to unwrap trusted - // types. - if (!isString(tpl) || !$templateCache.get(tpl)) { - tpl = $sce.getTrustedResourceUrl(tpl); - } - - var transformResponse = $http.defaults && $http.defaults.transformResponse; - - if (isArray(transformResponse)) { - transformResponse = transformResponse.filter(function(transformer) { - return transformer !== defaultHttpResponseTransform; - }); - } else if (transformResponse === defaultHttpResponseTransform) { - transformResponse = null; - } - - return $http.get(tpl, extend({ - cache: $templateCache, - transformResponse: transformResponse - }, httpOptions)) - ['finally'](function() { - handleRequestFn.totalPendingRequests--; - }) - .then(function(response) { - $templateCache.put(tpl, response.data); - return response.data; - }, handleError); - - function handleError(resp) { - if (!ignoreRequestError) { - throw $templateRequestMinErr('tpload', 'Failed to load template: {0} (HTTP status: {1} {2})', - tpl, resp.status, resp.statusText); - } - return $q.reject(resp); - } - } - - handleRequestFn.totalPendingRequests = 0; - - return handleRequestFn; - }]; -} - -function $$TestabilityProvider() { - this.$get = ['$rootScope', '$browser', '$location', - function($rootScope, $browser, $location) { - - /** - * @name $testability - * - * @description - * The private $$testability service provides a collection of methods for use when debugging - * or by automated test and debugging tools. - */ - var testability = {}; - - /** - * @name $$testability#findBindings - * - * @description - * Returns an array of elements that are bound (via ng-bind or {{}}) - * to expressions matching the input. - * - * @param {Element} element The element root to search from. - * @param {string} expression The binding expression to match. - * @param {boolean} opt_exactMatch If true, only returns exact matches - * for the expression. Filters and whitespace are ignored. - */ - testability.findBindings = function(element, expression, opt_exactMatch) { - var bindings = element.getElementsByClassName('ng-binding'); - var matches = []; - forEach(bindings, function(binding) { - var dataBinding = angular.element(binding).data('$binding'); - if (dataBinding) { - forEach(dataBinding, function(bindingName) { - if (opt_exactMatch) { - var matcher = new RegExp('(^|\\s)' + escapeForRegexp(expression) + '(\\s|\\||$)'); - if (matcher.test(bindingName)) { - matches.push(binding); - } - } else { - if (bindingName.indexOf(expression) != -1) { - matches.push(binding); - } - } - }); - } - }); - return matches; - }; - - /** - * @name $$testability#findModels - * - * @description - * Returns an array of elements that are two-way found via ng-model to - * expressions matching the input. - * - * @param {Element} element The element root to search from. - * @param {string} expression The model expression to match. - * @param {boolean} opt_exactMatch If true, only returns exact matches - * for the expression. - */ - testability.findModels = function(element, expression, opt_exactMatch) { - var prefixes = ['ng-', 'data-ng-', 'ng\\:']; - for (var p = 0; p < prefixes.length; ++p) { - var attributeEquals = opt_exactMatch ? '=' : '*='; - var selector = '[' + prefixes[p] + 'model' + attributeEquals + '"' + expression + '"]'; - var elements = element.querySelectorAll(selector); - if (elements.length) { - return elements; - } - } - }; - - /** - * @name $$testability#getLocation - * - * @description - * Shortcut for getting the location in a browser agnostic way. Returns - * the path, search, and hash. (e.g. /path?a=b#hash) - */ - testability.getLocation = function() { - return $location.url(); - }; - - /** - * @name $$testability#setLocation - * - * @description - * Shortcut for navigating to a location without doing a full page reload. - * - * @param {string} url The location url (path, search and hash, - * e.g. /path?a=b#hash) to go to. - */ - testability.setLocation = function(url) { - if (url !== $location.url()) { - $location.url(url); - $rootScope.$digest(); - } - }; - - /** - * @name $$testability#whenStable - * - * @description - * Calls the callback when $timeout and $http requests are completed. - * - * @param {function} callback - */ - testability.whenStable = function(callback) { - $browser.notifyWhenNoOutstandingRequests(callback); - }; - - return testability; - }]; -} - -function $TimeoutProvider() { - this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler', - function($rootScope, $browser, $q, $$q, $exceptionHandler) { - - var deferreds = {}; - - - /** - * @ngdoc service - * @name $timeout - * - * @description - * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch - * block and delegates any exceptions to - * {@link ng.$exceptionHandler $exceptionHandler} service. - * - * The return value of calling `$timeout` is a promise, which will be resolved when - * the delay has passed and the timeout function, if provided, is executed. - * - * To cancel a timeout request, call `$timeout.cancel(promise)`. - * - * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to - * synchronously flush the queue of deferred functions. - * - * If you only want a promise that will be resolved after some specified delay - * then you can call `$timeout` without the `fn` function. - * - * @param {function()=} fn A function, whose execution should be delayed. - * @param {number=} [delay=0] Delay in milliseconds. - * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise - * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. - * @param {...*=} Pass additional parameters to the executed function. - * @returns {Promise} Promise that will be resolved when the timeout is reached. The promise - * will be resolved with the return value of the `fn` function. - * - */ - function timeout(fn, delay, invokeApply) { - if (!isFunction(fn)) { - invokeApply = delay; - delay = fn; - fn = noop; - } - - var args = sliceArgs(arguments, 3), - skipApply = (isDefined(invokeApply) && !invokeApply), - deferred = (skipApply ? $$q : $q).defer(), - promise = deferred.promise, - timeoutId; - - timeoutId = $browser.defer(function() { - try { - deferred.resolve(fn.apply(null, args)); - } catch (e) { - deferred.reject(e); - $exceptionHandler(e); - } - finally { - delete deferreds[promise.$$timeoutId]; - } - - if (!skipApply) $rootScope.$apply(); - }, delay); - - promise.$$timeoutId = timeoutId; - deferreds[timeoutId] = deferred; - - return promise; - } - - - /** - * @ngdoc method - * @name $timeout#cancel - * - * @description - * Cancels a task associated with the `promise`. As a result of this, the promise will be - * resolved with a rejection. - * - * @param {Promise=} promise Promise returned by the `$timeout` function. - * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully - * canceled. - */ - timeout.cancel = function(promise) { - if (promise && promise.$$timeoutId in deferreds) { - deferreds[promise.$$timeoutId].reject('canceled'); - delete deferreds[promise.$$timeoutId]; - return $browser.defer.cancel(promise.$$timeoutId); - } - return false; - }; - - return timeout; - }]; -} - -// NOTE: The usage of window and document instead of $window and $document here is -// deliberate. This service depends on the specific behavior of anchor nodes created by the -// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and -// cause us to break tests. In addition, when the browser resolves a URL for XHR, it -// doesn't know about mocked locations and resolves URLs to the real document - which is -// exactly the behavior needed here. There is little value is mocking these out for this -// service. -var urlParsingNode = document.createElement("a"); -var originUrl = urlResolve(window.location.href); - - -/** - * - * Implementation Notes for non-IE browsers - * ---------------------------------------- - * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM, - * results both in the normalizing and parsing of the URL. Normalizing means that a relative - * URL will be resolved into an absolute URL in the context of the application document. - * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related - * properties are all populated to reflect the normalized URL. This approach has wide - * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc. See - * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html - * - * Implementation Notes for IE - * --------------------------- - * IE <= 10 normalizes the URL when assigned to the anchor node similar to the other - * browsers. However, the parsed components will not be set if the URL assigned did not specify - * them. (e.g. if you assign a.href = "foo", then a.protocol, a.host, etc. will be empty.) We - * work around that by performing the parsing in a 2nd step by taking a previously normalized - * URL (e.g. by assigning to a.href) and assigning it a.href again. This correctly populates the - * properties such as protocol, hostname, port, etc. - * - * References: - * http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement - * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html - * http://url.spec.whatwg.org/#urlutils - * https://github.com/angular/angular.js/pull/2902 - * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/ - * - * @kind function - * @param {string} url The URL to be parsed. - * @description Normalizes and parses a URL. - * @returns {object} Returns the normalized URL as a dictionary. - * - * | member name | Description | - * |---------------|----------------| - * | href | A normalized version of the provided URL if it was not an absolute URL | - * | protocol | The protocol including the trailing colon | - * | host | The host and port (if the port is non-default) of the normalizedUrl | - * | search | The search params, minus the question mark | - * | hash | The hash string, minus the hash symbol - * | hostname | The hostname - * | port | The port, without ":" - * | pathname | The pathname, beginning with "/" - * - */ -function urlResolve(url) { - var href = url; - - if (msie) { - // Normalize before parse. Refer Implementation Notes on why this is - // done in two steps on IE. - urlParsingNode.setAttribute("href", href); - href = urlParsingNode.href; - } - - urlParsingNode.setAttribute('href', href); - - // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils - return { - href: urlParsingNode.href, - protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', - host: urlParsingNode.host, - search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', - hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', - hostname: urlParsingNode.hostname, - port: urlParsingNode.port, - pathname: (urlParsingNode.pathname.charAt(0) === '/') - ? urlParsingNode.pathname - : '/' + urlParsingNode.pathname - }; -} - -/** - * Parse a request URL and determine whether this is a same-origin request as the application document. - * - * @param {string|object} requestUrl The url of the request as a string that will be resolved - * or a parsed URL object. - * @returns {boolean} Whether the request is for the same origin as the application document. - */ -function urlIsSameOrigin(requestUrl) { - var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl; - return (parsed.protocol === originUrl.protocol && - parsed.host === originUrl.host); -} - -/** - * @ngdoc service - * @name $window - * - * @description - * A reference to the browser's `window` object. While `window` - * is globally available in JavaScript, it causes testability problems, because - * it is a global variable. In angular we always refer to it through the - * `$window` service, so it may be overridden, removed or mocked for testing. - * - * Expressions, like the one defined for the `ngClick` directive in the example - * below, are evaluated with respect to the current scope. Therefore, there is - * no risk of inadvertently coding in a dependency on a global value in such an - * expression. - * - * @example - - - -
                                        - - -
                                        -
                                        - - it('should display the greeting in the input box', function() { - element(by.model('greeting')).sendKeys('Hello, E2E Tests'); - // If we click the button it will block the test runner - // element(':button').click(); - }); - -
                                        - */ -function $WindowProvider() { - this.$get = valueFn(window); -} - -/** - * @name $$cookieReader - * @requires $document - * - * @description - * This is a private service for reading cookies used by $http and ngCookies - * - * @return {Object} a key/value map of the current cookies - */ -function $$CookieReader($document) { - var rawDocument = $document[0] || {}; - var lastCookies = {}; - var lastCookieString = ''; - - function safeDecodeURIComponent(str) { - try { - return decodeURIComponent(str); - } catch (e) { - return str; - } - } - - return function() { - var cookieArray, cookie, i, index, name; - var currentCookieString = rawDocument.cookie || ''; - - if (currentCookieString !== lastCookieString) { - lastCookieString = currentCookieString; - cookieArray = lastCookieString.split('; '); - lastCookies = {}; - - for (i = 0; i < cookieArray.length; i++) { - cookie = cookieArray[i]; - index = cookie.indexOf('='); - if (index > 0) { //ignore nameless cookies - name = safeDecodeURIComponent(cookie.substring(0, index)); - // the first value that is seen for a cookie is the most - // specific one. values for the same cookie name that - // follow are for less specific paths. - if (isUndefined(lastCookies[name])) { - lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1)); - } - } - } - } - return lastCookies; - }; -} - -$$CookieReader.$inject = ['$document']; - -function $$CookieReaderProvider() { - this.$get = $$CookieReader; -} - -/* global currencyFilter: true, - dateFilter: true, - filterFilter: true, - jsonFilter: true, - limitToFilter: true, - lowercaseFilter: true, - numberFilter: true, - orderByFilter: true, - uppercaseFilter: true, - */ - -/** - * @ngdoc provider - * @name $filterProvider - * @description - * - * Filters are just functions which transform input to an output. However filters need to be - * Dependency Injected. To achieve this a filter definition consists of a factory function which is - * annotated with dependencies and is responsible for creating a filter function. - * - *
                                        - * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. - * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace - * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores - * (`myapp_subsection_filterx`). - *
                                        - * - * ```js - * // Filter registration - * function MyModule($provide, $filterProvider) { - * // create a service to demonstrate injection (not always needed) - * $provide.value('greet', function(name){ - * return 'Hello ' + name + '!'; - * }); - * - * // register a filter factory which uses the - * // greet service to demonstrate DI. - * $filterProvider.register('greet', function(greet){ - * // return the filter function which uses the greet service - * // to generate salutation - * return function(text) { - * // filters need to be forgiving so check input validity - * return text && greet(text) || text; - * }; - * }); - * } - * ``` - * - * The filter function is registered with the `$injector` under the filter name suffix with - * `Filter`. - * - * ```js - * it('should be the same instance', inject( - * function($filterProvider) { - * $filterProvider.register('reverse', function(){ - * return ...; - * }); - * }, - * function($filter, reverseFilter) { - * expect($filter('reverse')).toBe(reverseFilter); - * }); - * ``` - * - * - * For more information about how angular filters work, and how to create your own filters, see - * {@link guide/filter Filters} in the Angular Developer Guide. - */ - -/** - * @ngdoc service - * @name $filter - * @kind function - * @description - * Filters are used for formatting data displayed to the user. - * - * The general syntax in templates is as follows: - * - * {{ expression [| filter_name[:parameter_value] ... ] }} - * - * @param {String} name Name of the filter function to retrieve - * @return {Function} the filter function - * @example - - -
                                        -

                                        {{ originalText }}

                                        -

                                        {{ filteredText }}

                                        -
                                        -
                                        - - - angular.module('filterExample', []) - .controller('MainCtrl', function($scope, $filter) { - $scope.originalText = 'hello'; - $scope.filteredText = $filter('uppercase')($scope.originalText); - }); - -
                                        - */ -$FilterProvider.$inject = ['$provide']; -function $FilterProvider($provide) { - var suffix = 'Filter'; - - /** - * @ngdoc method - * @name $filterProvider#register - * @param {string|Object} name Name of the filter function, or an object map of filters where - * the keys are the filter names and the values are the filter factories. - * - *
                                        - * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. - * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace - * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores - * (`myapp_subsection_filterx`). - *
                                        - * @param {Function} factory If the first argument was a string, a factory function for the filter to be registered. - * @returns {Object} Registered filter instance, or if a map of filters was provided then a map - * of the registered filter instances. - */ - function register(name, factory) { - if (isObject(name)) { - var filters = {}; - forEach(name, function(filter, key) { - filters[key] = register(key, filter); - }); - return filters; - } else { - return $provide.factory(name + suffix, factory); - } - } - this.register = register; - - this.$get = ['$injector', function($injector) { - return function(name) { - return $injector.get(name + suffix); - }; - }]; - - //////////////////////////////////////// - - /* global - currencyFilter: false, - dateFilter: false, - filterFilter: false, - jsonFilter: false, - limitToFilter: false, - lowercaseFilter: false, - numberFilter: false, - orderByFilter: false, - uppercaseFilter: false, - */ - - register('currency', currencyFilter); - register('date', dateFilter); - register('filter', filterFilter); - register('json', jsonFilter); - register('limitTo', limitToFilter); - register('lowercase', lowercaseFilter); - register('number', numberFilter); - register('orderBy', orderByFilter); - register('uppercase', uppercaseFilter); -} - -/** - * @ngdoc filter - * @name filter - * @kind function - * - * @description - * Selects a subset of items from `array` and returns it as a new array. - * - * @param {Array} array The source array. - * @param {string|Object|function()} expression The predicate to be used for selecting items from - * `array`. - * - * Can be one of: - * - * - `string`: The string is used for matching against the contents of the `array`. All strings or - * objects with string properties in `array` that match this string will be returned. This also - * applies to nested object properties. - * The predicate can be negated by prefixing the string with `!`. - * - * - `Object`: A pattern object can be used to filter specific properties on objects contained - * by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items - * which have property `name` containing "M" and property `phone` containing "1". A special - * property name `$` can be used (as in `{$:"text"}`) to accept a match against any - * property of the object or its nested object properties. That's equivalent to the simple - * substring match with a `string` as described above. The predicate can be negated by prefixing - * the string with `!`. - * For example `{name: "!M"}` predicate will return an array of items which have property `name` - * not containing "M". - * - * Note that a named property will match properties on the same level only, while the special - * `$` property will match properties on the same level or deeper. E.g. an array item like - * `{name: {first: 'John', last: 'Doe'}}` will **not** be matched by `{name: 'John'}`, but - * **will** be matched by `{$: 'John'}`. - * - * - `function(value, index, array)`: A predicate function can be used to write arbitrary filters. - * The function is called for each element of the array, with the element, its index, and - * the entire array itself as arguments. - * - * The final result is an array of those elements that the predicate returned true for. - * - * @param {function(actual, expected)|true|undefined} comparator Comparator which is used in - * determining if the expected value (from the filter expression) and actual value (from - * the object in the array) should be considered a match. - * - * Can be one of: - * - * - `function(actual, expected)`: - * The function will be given the object value and the predicate value to compare and - * should return true if both values should be considered equal. - * - * - `true`: A shorthand for `function(actual, expected) { return angular.equals(actual, expected)}`. - * This is essentially strict comparison of expected and actual. - * - * - `false|undefined`: A short hand for a function which will look for a substring match in case - * insensitive way. - * - * Primitive values are converted to strings. Objects are not compared against primitives, - * unless they have a custom `toString` method (e.g. `Date` objects). - * - * @example - - -
                                        - - - - - - - - -
                                        NamePhone
                                        {{friend.name}}{{friend.phone}}
                                        -
                                        -
                                        -
                                        -
                                        -
                                        - - - - - - -
                                        NamePhone
                                        {{friendObj.name}}{{friendObj.phone}}
                                        -
                                        - - var expectFriendNames = function(expectedNames, key) { - element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) { - arr.forEach(function(wd, i) { - expect(wd.getText()).toMatch(expectedNames[i]); - }); - }); - }; - - it('should search across all fields when filtering with a string', function() { - var searchText = element(by.model('searchText')); - searchText.clear(); - searchText.sendKeys('m'); - expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend'); - - searchText.clear(); - searchText.sendKeys('76'); - expectFriendNames(['John', 'Julie'], 'friend'); - }); - - it('should search in specific fields when filtering with a predicate object', function() { - var searchAny = element(by.model('search.$')); - searchAny.clear(); - searchAny.sendKeys('i'); - expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj'); - }); - it('should use a equal comparison when comparator is true', function() { - var searchName = element(by.model('search.name')); - var strict = element(by.model('strict')); - searchName.clear(); - searchName.sendKeys('Julie'); - strict.click(); - expectFriendNames(['Julie'], 'friendObj'); - }); - -
                                        - */ -function filterFilter() { - return function(array, expression, comparator) { - if (!isArrayLike(array)) { - if (array == null) { - return array; - } else { - throw minErr('filter')('notarray', 'Expected array but received: {0}', array); - } - } - - var expressionType = getTypeForFilter(expression); - var predicateFn; - var matchAgainstAnyProp; - - switch (expressionType) { - case 'function': - predicateFn = expression; - break; - case 'boolean': - case 'null': - case 'number': - case 'string': - matchAgainstAnyProp = true; - //jshint -W086 - case 'object': - //jshint +W086 - predicateFn = createPredicateFn(expression, comparator, matchAgainstAnyProp); - break; - default: - return array; - } - - return Array.prototype.filter.call(array, predicateFn); - }; -} - -// Helper functions for `filterFilter` -function createPredicateFn(expression, comparator, matchAgainstAnyProp) { - var shouldMatchPrimitives = isObject(expression) && ('$' in expression); - var predicateFn; - - if (comparator === true) { - comparator = equals; - } else if (!isFunction(comparator)) { - comparator = function(actual, expected) { - if (isUndefined(actual)) { - // No substring matching against `undefined` - return false; - } - if ((actual === null) || (expected === null)) { - // No substring matching against `null`; only match against `null` - return actual === expected; - } - if (isObject(expected) || (isObject(actual) && !hasCustomToString(actual))) { - // Should not compare primitives against objects, unless they have custom `toString` method - return false; - } - - actual = lowercase('' + actual); - expected = lowercase('' + expected); - return actual.indexOf(expected) !== -1; - }; - } - - predicateFn = function(item) { - if (shouldMatchPrimitives && !isObject(item)) { - return deepCompare(item, expression.$, comparator, false); - } - return deepCompare(item, expression, comparator, matchAgainstAnyProp); - }; - - return predicateFn; -} - -function deepCompare(actual, expected, comparator, matchAgainstAnyProp, dontMatchWholeObject) { - var actualType = getTypeForFilter(actual); - var expectedType = getTypeForFilter(expected); - - if ((expectedType === 'string') && (expected.charAt(0) === '!')) { - return !deepCompare(actual, expected.substring(1), comparator, matchAgainstAnyProp); - } else if (isArray(actual)) { - // In case `actual` is an array, consider it a match - // if ANY of it's items matches `expected` - return actual.some(function(item) { - return deepCompare(item, expected, comparator, matchAgainstAnyProp); - }); - } - - switch (actualType) { - case 'object': - var key; - if (matchAgainstAnyProp) { - for (key in actual) { - if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator, true)) { - return true; - } - } - return dontMatchWholeObject ? false : deepCompare(actual, expected, comparator, false); - } else if (expectedType === 'object') { - for (key in expected) { - var expectedVal = expected[key]; - if (isFunction(expectedVal) || isUndefined(expectedVal)) { - continue; - } - - var matchAnyProperty = key === '$'; - var actualVal = matchAnyProperty ? actual : actual[key]; - if (!deepCompare(actualVal, expectedVal, comparator, matchAnyProperty, matchAnyProperty)) { - return false; - } - } - return true; - } else { - return comparator(actual, expected); - } - break; - case 'function': - return false; - default: - return comparator(actual, expected); - } -} - -// Used for easily differentiating between `null` and actual `object` -function getTypeForFilter(val) { - return (val === null) ? 'null' : typeof val; -} - -var MAX_DIGITS = 22; -var DECIMAL_SEP = '.'; -var ZERO_CHAR = '0'; - -/** - * @ngdoc filter - * @name currency - * @kind function - * - * @description - * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default - * symbol for current locale is used. - * - * @param {number} amount Input to filter. - * @param {string=} symbol Currency symbol or identifier to be displayed. - * @param {number=} fractionSize Number of decimal places to round the amount to, defaults to default max fraction size for current locale - * @returns {string} Formatted number. - * - * - * @example - - - -
                                        -
                                        - default currency symbol ($): {{amount | currency}}
                                        - custom currency identifier (USD$): {{amount | currency:"USD$"}} - no fractions (0): {{amount | currency:"USD$":0}} -
                                        -
                                        - - it('should init with 1234.56', function() { - expect(element(by.id('currency-default')).getText()).toBe('$1,234.56'); - expect(element(by.id('currency-custom')).getText()).toBe('USD$1,234.56'); - expect(element(by.id('currency-no-fractions')).getText()).toBe('USD$1,235'); - }); - it('should update', function() { - if (browser.params.browser == 'safari') { - // Safari does not understand the minus key. See - // https://github.com/angular/protractor/issues/481 - return; - } - element(by.model('amount')).clear(); - element(by.model('amount')).sendKeys('-1234'); - expect(element(by.id('currency-default')).getText()).toBe('-$1,234.00'); - expect(element(by.id('currency-custom')).getText()).toBe('-USD$1,234.00'); - expect(element(by.id('currency-no-fractions')).getText()).toBe('-USD$1,234'); - }); - -
                                        - */ -currencyFilter.$inject = ['$locale']; -function currencyFilter($locale) { - var formats = $locale.NUMBER_FORMATS; - return function(amount, currencySymbol, fractionSize) { - if (isUndefined(currencySymbol)) { - currencySymbol = formats.CURRENCY_SYM; - } - - if (isUndefined(fractionSize)) { - fractionSize = formats.PATTERNS[1].maxFrac; - } - - // if null or undefined pass it through - return (amount == null) - ? amount - : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize). - replace(/\u00A4/g, currencySymbol); - }; -} - -/** - * @ngdoc filter - * @name number - * @kind function - * - * @description - * Formats a number as text. - * - * If the input is null or undefined, it will just be returned. - * If the input is infinite (Infinity or -Infinity), the Infinity symbol '∞' or '-∞' is returned, respectively. - * If the input is not a number an empty string is returned. - * - * - * @param {number|string} number Number to format. - * @param {(number|string)=} fractionSize Number of decimal places to round the number to. - * If this is not provided then the fraction size is computed from the current locale's number - * formatting pattern. In the case of the default locale, it will be 3. - * @returns {string} Number rounded to fractionSize and places a “,” after each third digit. - * - * @example - - - -
                                        -
                                        - Default formatting: {{val | number}}
                                        - No fractions: {{val | number:0}}
                                        - Negative number: {{-val | number:4}} -
                                        -
                                        - - it('should format numbers', function() { - expect(element(by.id('number-default')).getText()).toBe('1,234.568'); - expect(element(by.binding('val | number:0')).getText()).toBe('1,235'); - expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679'); - }); - - it('should update', function() { - element(by.model('val')).clear(); - element(by.model('val')).sendKeys('3374.333'); - expect(element(by.id('number-default')).getText()).toBe('3,374.333'); - expect(element(by.binding('val | number:0')).getText()).toBe('3,374'); - expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330'); - }); - -
                                        - */ -numberFilter.$inject = ['$locale']; -function numberFilter($locale) { - var formats = $locale.NUMBER_FORMATS; - return function(number, fractionSize) { - - // if null or undefined pass it through - return (number == null) - ? number - : formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP, - fractionSize); - }; -} - -/** - * Parse a number (as a string) into three components that can be used - * for formatting the number. - * - * (Significant bits of this parse algorithm came from https://github.com/MikeMcl/big.js/) - * - * @param {string} numStr The number to parse - * @return {object} An object describing this number, containing the following keys: - * - d : an array of digits containing leading zeros as necessary - * - i : the number of the digits in `d` that are to the left of the decimal point - * - e : the exponent for numbers that would need more than `MAX_DIGITS` digits in `d` - * - */ -function parse(numStr) { - var exponent = 0, digits, numberOfIntegerDigits; - var i, j, zeros; - - // Decimal point? - if ((numberOfIntegerDigits = numStr.indexOf(DECIMAL_SEP)) > -1) { - numStr = numStr.replace(DECIMAL_SEP, ''); - } - - // Exponential form? - if ((i = numStr.search(/e/i)) > 0) { - // Work out the exponent. - if (numberOfIntegerDigits < 0) numberOfIntegerDigits = i; - numberOfIntegerDigits += +numStr.slice(i + 1); - numStr = numStr.substring(0, i); - } else if (numberOfIntegerDigits < 0) { - // There was no decimal point or exponent so it is an integer. - numberOfIntegerDigits = numStr.length; - } - - // Count the number of leading zeros. - for (i = 0; numStr.charAt(i) == ZERO_CHAR; i++) {/* jshint noempty: false */} - - if (i == (zeros = numStr.length)) { - // The digits are all zero. - digits = [0]; - numberOfIntegerDigits = 1; - } else { - // Count the number of trailing zeros - zeros--; - while (numStr.charAt(zeros) == ZERO_CHAR) zeros--; - - // Trailing zeros are insignificant so ignore them - numberOfIntegerDigits -= i; - digits = []; - // Convert string to array of digits without leading/trailing zeros. - for (j = 0; i <= zeros; i++, j++) { - digits[j] = +numStr.charAt(i); - } - } - - // If the number overflows the maximum allowed digits then use an exponent. - if (numberOfIntegerDigits > MAX_DIGITS) { - digits = digits.splice(0, MAX_DIGITS - 1); - exponent = numberOfIntegerDigits - 1; - numberOfIntegerDigits = 1; - } - - return { d: digits, e: exponent, i: numberOfIntegerDigits }; -} - -/** - * Round the parsed number to the specified number of decimal places - * This function changed the parsedNumber in-place - */ -function roundNumber(parsedNumber, fractionSize, minFrac, maxFrac) { - var digits = parsedNumber.d; - var fractionLen = digits.length - parsedNumber.i; - - // determine fractionSize if it is not specified; `+fractionSize` converts it to a number - fractionSize = (isUndefined(fractionSize)) ? Math.min(Math.max(minFrac, fractionLen), maxFrac) : +fractionSize; - - // The index of the digit to where rounding is to occur - var roundAt = fractionSize + parsedNumber.i; - var digit = digits[roundAt]; - - if (roundAt > 0) { - // Drop fractional digits beyond `roundAt` - digits.splice(Math.max(parsedNumber.i, roundAt)); - - // Set non-fractional digits beyond `roundAt` to 0 - for (var j = roundAt; j < digits.length; j++) { - digits[j] = 0; - } - } else { - // We rounded to zero so reset the parsedNumber - fractionLen = Math.max(0, fractionLen); - parsedNumber.i = 1; - digits.length = Math.max(1, roundAt = fractionSize + 1); - digits[0] = 0; - for (var i = 1; i < roundAt; i++) digits[i] = 0; - } - - if (digit >= 5) { - if (roundAt - 1 < 0) { - for (var k = 0; k > roundAt; k--) { - digits.unshift(0); - parsedNumber.i++; - } - digits.unshift(1); - parsedNumber.i++; - } else { - digits[roundAt - 1]++; - } - } - - // Pad out with zeros to get the required fraction length - for (; fractionLen < Math.max(0, fractionSize); fractionLen++) digits.push(0); - - - // Do any carrying, e.g. a digit was rounded up to 10 - var carry = digits.reduceRight(function(carry, d, i, digits) { - d = d + carry; - digits[i] = d % 10; - return Math.floor(d / 10); - }, 0); - if (carry) { - digits.unshift(carry); - parsedNumber.i++; - } -} - -/** - * Format a number into a string - * @param {number} number The number to format - * @param {{ - * minFrac, // the minimum number of digits required in the fraction part of the number - * maxFrac, // the maximum number of digits required in the fraction part of the number - * gSize, // number of digits in each group of separated digits - * lgSize, // number of digits in the last group of digits before the decimal separator - * negPre, // the string to go in front of a negative number (e.g. `-` or `(`)) - * posPre, // the string to go in front of a positive number - * negSuf, // the string to go after a negative number (e.g. `)`) - * posSuf // the string to go after a positive number - * }} pattern - * @param {string} groupSep The string to separate groups of number (e.g. `,`) - * @param {string} decimalSep The string to act as the decimal separator (e.g. `.`) - * @param {[type]} fractionSize The size of the fractional part of the number - * @return {string} The number formatted as a string - */ -function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { - - if (!(isString(number) || isNumber(number)) || isNaN(number)) return ''; - - var isInfinity = !isFinite(number); - var isZero = false; - var numStr = Math.abs(number) + '', - formattedText = '', - parsedNumber; - - if (isInfinity) { - formattedText = '\u221e'; - } else { - parsedNumber = parse(numStr); - - roundNumber(parsedNumber, fractionSize, pattern.minFrac, pattern.maxFrac); - - var digits = parsedNumber.d; - var integerLen = parsedNumber.i; - var exponent = parsedNumber.e; - var decimals = []; - isZero = digits.reduce(function(isZero, d) { return isZero && !d; }, true); - - // pad zeros for small numbers - while (integerLen < 0) { - digits.unshift(0); - integerLen++; - } - - // extract decimals digits - if (integerLen > 0) { - decimals = digits.splice(integerLen); - } else { - decimals = digits; - digits = [0]; - } - - // format the integer digits with grouping separators - var groups = []; - if (digits.length > pattern.lgSize) { - groups.unshift(digits.splice(-pattern.lgSize).join('')); - } - while (digits.length > pattern.gSize) { - groups.unshift(digits.splice(-pattern.gSize).join('')); - } - if (digits.length) { - groups.unshift(digits.join('')); - } - formattedText = groups.join(groupSep); - - // append the decimal digits - if (decimals.length) { - formattedText += decimalSep + decimals.join(''); - } - - if (exponent) { - formattedText += 'e+' + exponent; - } - } - if (number < 0 && !isZero) { - return pattern.negPre + formattedText + pattern.negSuf; - } else { - return pattern.posPre + formattedText + pattern.posSuf; - } -} - -function padNumber(num, digits, trim, negWrap) { - var neg = ''; - if (num < 0 || (negWrap && num <= 0)) { - if (negWrap) { - num = -num + 1; - } else { - num = -num; - neg = '-'; - } - } - num = '' + num; - while (num.length < digits) num = ZERO_CHAR + num; - if (trim) { - num = num.substr(num.length - digits); - } - return neg + num; -} - - -function dateGetter(name, size, offset, trim, negWrap) { - offset = offset || 0; - return function(date) { - var value = date['get' + name](); - if (offset > 0 || value > -offset) { - value += offset; - } - if (value === 0 && offset == -12) value = 12; - return padNumber(value, size, trim, negWrap); - }; -} - -function dateStrGetter(name, shortForm, standAlone) { - return function(date, formats) { - var value = date['get' + name](); - var propPrefix = (standAlone ? 'STANDALONE' : '') + (shortForm ? 'SHORT' : ''); - var get = uppercase(propPrefix + name); - - return formats[get][value]; - }; -} - -function timeZoneGetter(date, formats, offset) { - var zone = -1 * offset; - var paddedZone = (zone >= 0) ? "+" : ""; - - paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) + - padNumber(Math.abs(zone % 60), 2); - - return paddedZone; -} - -function getFirstThursdayOfYear(year) { - // 0 = index of January - var dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay(); - // 4 = index of Thursday (+1 to account for 1st = 5) - // 11 = index of *next* Thursday (+1 account for 1st = 12) - return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst); -} - -function getThursdayThisWeek(datetime) { - return new Date(datetime.getFullYear(), datetime.getMonth(), - // 4 = index of Thursday - datetime.getDate() + (4 - datetime.getDay())); -} - -function weekGetter(size) { - return function(date) { - var firstThurs = getFirstThursdayOfYear(date.getFullYear()), - thisThurs = getThursdayThisWeek(date); - - var diff = +thisThurs - +firstThurs, - result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week - - return padNumber(result, size); - }; -} - -function ampmGetter(date, formats) { - return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1]; -} - -function eraGetter(date, formats) { - return date.getFullYear() <= 0 ? formats.ERAS[0] : formats.ERAS[1]; -} - -function longEraGetter(date, formats) { - return date.getFullYear() <= 0 ? formats.ERANAMES[0] : formats.ERANAMES[1]; -} - -var DATE_FORMATS = { - yyyy: dateGetter('FullYear', 4, 0, false, true), - yy: dateGetter('FullYear', 2, 0, true, true), - y: dateGetter('FullYear', 1, 0, false, true), - MMMM: dateStrGetter('Month'), - MMM: dateStrGetter('Month', true), - MM: dateGetter('Month', 2, 1), - M: dateGetter('Month', 1, 1), - LLLL: dateStrGetter('Month', false, true), - dd: dateGetter('Date', 2), - d: dateGetter('Date', 1), - HH: dateGetter('Hours', 2), - H: dateGetter('Hours', 1), - hh: dateGetter('Hours', 2, -12), - h: dateGetter('Hours', 1, -12), - mm: dateGetter('Minutes', 2), - m: dateGetter('Minutes', 1), - ss: dateGetter('Seconds', 2), - s: dateGetter('Seconds', 1), - // while ISO 8601 requires fractions to be prefixed with `.` or `,` - // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions - sss: dateGetter('Milliseconds', 3), - EEEE: dateStrGetter('Day'), - EEE: dateStrGetter('Day', true), - a: ampmGetter, - Z: timeZoneGetter, - ww: weekGetter(2), - w: weekGetter(1), - G: eraGetter, - GG: eraGetter, - GGG: eraGetter, - GGGG: longEraGetter -}; - -var DATE_FORMATS_SPLIT = /((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/, - NUMBER_STRING = /^\-?\d+$/; - -/** - * @ngdoc filter - * @name date - * @kind function - * - * @description - * Formats `date` to a string based on the requested `format`. - * - * `format` string can be composed of the following elements: - * - * * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010) - * * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10) - * * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199) - * * `'MMMM'`: Month in year (January-December) - * * `'MMM'`: Month in year (Jan-Dec) - * * `'MM'`: Month in year, padded (01-12) - * * `'M'`: Month in year (1-12) - * * `'LLLL'`: Stand-alone month in year (January-December) - * * `'dd'`: Day in month, padded (01-31) - * * `'d'`: Day in month (1-31) - * * `'EEEE'`: Day in Week,(Sunday-Saturday) - * * `'EEE'`: Day in Week, (Sun-Sat) - * * `'HH'`: Hour in day, padded (00-23) - * * `'H'`: Hour in day (0-23) - * * `'hh'`: Hour in AM/PM, padded (01-12) - * * `'h'`: Hour in AM/PM, (1-12) - * * `'mm'`: Minute in hour, padded (00-59) - * * `'m'`: Minute in hour (0-59) - * * `'ss'`: Second in minute, padded (00-59) - * * `'s'`: Second in minute (0-59) - * * `'sss'`: Millisecond in second, padded (000-999) - * * `'a'`: AM/PM marker - * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200) - * * `'ww'`: Week of year, padded (00-53). Week 01 is the week with the first Thursday of the year - * * `'w'`: Week of year (0-53). Week 1 is the week with the first Thursday of the year - * * `'G'`, `'GG'`, `'GGG'`: The abbreviated form of the era string (e.g. 'AD') - * * `'GGGG'`: The long form of the era string (e.g. 'Anno Domini') - * - * `format` string can also be one of the following predefined - * {@link guide/i18n localizable formats}: - * - * * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale - * (e.g. Sep 3, 2010 12:05:08 PM) - * * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US locale (e.g. 9/3/10 12:05 PM) - * * `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` for en_US locale - * (e.g. Friday, September 3, 2010) - * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010) - * * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US locale (e.g. Sep 3, 2010) - * * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10) - * * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 PM) - * * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 PM) - * - * `format` string can contain literal values. These need to be escaped by surrounding with single quotes (e.g. - * `"h 'in the morning'"`). In order to output a single quote, escape it - i.e., two single quotes in a sequence - * (e.g. `"h 'o''clock'"`). - * - * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or - * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its - * shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is - * specified in the string input, the time is considered to be in the local timezone. - * @param {string=} format Formatting rules (see Description). If not specified, - * `mediumDate` is used. - * @param {string=} timezone Timezone to be used for formatting. It understands UTC/GMT and the - * continental US time zone abbreviations, but for general use, use a time zone offset, for - * example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian) - * If not specified, the timezone of the browser will be used. - * @returns {string} Formatted string or the input if input is not recognized as date/millis. - * - * @example - - - {{1288323623006 | date:'medium'}}: - {{1288323623006 | date:'medium'}}
                                        - {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}: - {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}
                                        - {{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}: - {{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}
                                        - {{1288323623006 | date:"MM/dd/yyyy 'at' h:mma"}}: - {{'1288323623006' | date:"MM/dd/yyyy 'at' h:mma"}}
                                        -
                                        - - it('should format date', function() { - expect(element(by.binding("1288323623006 | date:'medium'")).getText()). - toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/); - expect(element(by.binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")).getText()). - toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/); - expect(element(by.binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")).getText()). - toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/); - expect(element(by.binding("'1288323623006' | date:\"MM/dd/yyyy 'at' h:mma\"")).getText()). - toMatch(/10\/2\d\/2010 at \d{1,2}:\d{2}(AM|PM)/); - }); - -
                                        - */ -dateFilter.$inject = ['$locale']; -function dateFilter($locale) { - - - var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; - // 1 2 3 4 5 6 7 8 9 10 11 - function jsonStringToDate(string) { - var match; - if (match = string.match(R_ISO8601_STR)) { - var date = new Date(0), - tzHour = 0, - tzMin = 0, - dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear, - timeSetter = match[8] ? date.setUTCHours : date.setHours; - - if (match[9]) { - tzHour = toInt(match[9] + match[10]); - tzMin = toInt(match[9] + match[11]); - } - dateSetter.call(date, toInt(match[1]), toInt(match[2]) - 1, toInt(match[3])); - var h = toInt(match[4] || 0) - tzHour; - var m = toInt(match[5] || 0) - tzMin; - var s = toInt(match[6] || 0); - var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000); - timeSetter.call(date, h, m, s, ms); - return date; - } - return string; - } - - - return function(date, format, timezone) { - var text = '', - parts = [], - fn, match; - - format = format || 'mediumDate'; - format = $locale.DATETIME_FORMATS[format] || format; - if (isString(date)) { - date = NUMBER_STRING.test(date) ? toInt(date) : jsonStringToDate(date); - } - - if (isNumber(date)) { - date = new Date(date); - } - - if (!isDate(date) || !isFinite(date.getTime())) { - return date; - } - - while (format) { - match = DATE_FORMATS_SPLIT.exec(format); - if (match) { - parts = concat(parts, match, 1); - format = parts.pop(); - } else { - parts.push(format); - format = null; - } - } - - var dateTimezoneOffset = date.getTimezoneOffset(); - if (timezone) { - dateTimezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset); - date = convertTimezoneToLocal(date, timezone, true); - } - forEach(parts, function(value) { - fn = DATE_FORMATS[value]; - text += fn ? fn(date, $locale.DATETIME_FORMATS, dateTimezoneOffset) - : value === "''" ? "'" : value.replace(/(^'|'$)/g, '').replace(/''/g, "'"); - }); - - return text; - }; -} - - -/** - * @ngdoc filter - * @name json - * @kind function - * - * @description - * Allows you to convert a JavaScript object into JSON string. - * - * This filter is mostly useful for debugging. When using the double curly {{value}} notation - * the binding is automatically converted to JSON. - * - * @param {*} object Any JavaScript object (including arrays and primitive types) to filter. - * @param {number=} spacing The number of spaces to use per indentation, defaults to 2. - * @returns {string} JSON string. - * - * - * @example - - -
                                        {{ {'name':'value'} | json }}
                                        -
                                        {{ {'name':'value'} | json:4 }}
                                        -
                                        - - it('should jsonify filtered objects', function() { - expect(element(by.id('default-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); - expect(element(by.id('custom-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); - }); - -
                                        - * - */ -function jsonFilter() { - return function(object, spacing) { - if (isUndefined(spacing)) { - spacing = 2; - } - return toJson(object, spacing); - }; -} - - -/** - * @ngdoc filter - * @name lowercase - * @kind function - * @description - * Converts string to lowercase. - * @see angular.lowercase - */ -var lowercaseFilter = valueFn(lowercase); - - -/** - * @ngdoc filter - * @name uppercase - * @kind function - * @description - * Converts string to uppercase. - * @see angular.uppercase - */ -var uppercaseFilter = valueFn(uppercase); - -/** - * @ngdoc filter - * @name limitTo - * @kind function - * - * @description - * Creates a new array or string containing only a specified number of elements. The elements - * are taken from either the beginning or the end of the source array, string or number, as specified by - * the value and sign (positive or negative) of `limit`. If a number is used as input, it is - * converted to a string. - * - * @param {Array|string|number} input Source array, string or number to be limited. - * @param {string|number} limit The length of the returned array or string. If the `limit` number - * is positive, `limit` number of items from the beginning of the source array/string are copied. - * If the number is negative, `limit` number of items from the end of the source array/string - * are copied. The `limit` will be trimmed if it exceeds `array.length`. If `limit` is undefined, - * the input will be returned unchanged. - * @param {(string|number)=} begin Index at which to begin limitation. As a negative index, `begin` - * indicates an offset from the end of `input`. Defaults to `0`. - * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array - * had less than `limit` elements. - * - * @example - - - -
                                        - -

                                        Output numbers: {{ numbers | limitTo:numLimit }}

                                        - -

                                        Output letters: {{ letters | limitTo:letterLimit }}

                                        - -

                                        Output long number: {{ longNumber | limitTo:longNumberLimit }}

                                        -
                                        -
                                        - - var numLimitInput = element(by.model('numLimit')); - var letterLimitInput = element(by.model('letterLimit')); - var longNumberLimitInput = element(by.model('longNumberLimit')); - var limitedNumbers = element(by.binding('numbers | limitTo:numLimit')); - var limitedLetters = element(by.binding('letters | limitTo:letterLimit')); - var limitedLongNumber = element(by.binding('longNumber | limitTo:longNumberLimit')); - - it('should limit the number array to first three items', function() { - expect(numLimitInput.getAttribute('value')).toBe('3'); - expect(letterLimitInput.getAttribute('value')).toBe('3'); - expect(longNumberLimitInput.getAttribute('value')).toBe('3'); - expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]'); - expect(limitedLetters.getText()).toEqual('Output letters: abc'); - expect(limitedLongNumber.getText()).toEqual('Output long number: 234'); - }); - - // There is a bug in safari and protractor that doesn't like the minus key - // it('should update the output when -3 is entered', function() { - // numLimitInput.clear(); - // numLimitInput.sendKeys('-3'); - // letterLimitInput.clear(); - // letterLimitInput.sendKeys('-3'); - // longNumberLimitInput.clear(); - // longNumberLimitInput.sendKeys('-3'); - // expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]'); - // expect(limitedLetters.getText()).toEqual('Output letters: ghi'); - // expect(limitedLongNumber.getText()).toEqual('Output long number: 342'); - // }); - - it('should not exceed the maximum size of input array', function() { - numLimitInput.clear(); - numLimitInput.sendKeys('100'); - letterLimitInput.clear(); - letterLimitInput.sendKeys('100'); - longNumberLimitInput.clear(); - longNumberLimitInput.sendKeys('100'); - expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]'); - expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi'); - expect(limitedLongNumber.getText()).toEqual('Output long number: 2345432342'); - }); - -
                                        -*/ -function limitToFilter() { - return function(input, limit, begin) { - if (Math.abs(Number(limit)) === Infinity) { - limit = Number(limit); - } else { - limit = toInt(limit); - } - if (isNaN(limit)) return input; - - if (isNumber(input)) input = input.toString(); - if (!isArray(input) && !isString(input)) return input; - - begin = (!begin || isNaN(begin)) ? 0 : toInt(begin); - begin = (begin < 0) ? Math.max(0, input.length + begin) : begin; - - if (limit >= 0) { - return input.slice(begin, begin + limit); - } else { - if (begin === 0) { - return input.slice(limit, input.length); - } else { - return input.slice(Math.max(0, begin + limit), begin); - } - } - }; -} - -/** - * @ngdoc filter - * @name orderBy - * @kind function - * - * @description - * Orders a specified `array` by the `expression` predicate. It is ordered alphabetically - * for strings and numerically for numbers. Note: if you notice numbers are not being sorted - * as expected, make sure they are actually being saved as numbers and not strings. - * Array-like values (e.g. NodeLists, jQuery objects, TypedArrays, Strings, etc) are also supported. - * - * @param {Array} array The array (or array-like object) to sort. - * @param {function(*)|string|Array.<(function(*)|string)>=} expression A predicate to be - * used by the comparator to determine the order of elements. - * - * Can be one of: - * - * - `function`: Getter function. The result of this function will be sorted using the - * `<`, `===`, `>` operator. - * - `string`: An Angular expression. The result of this expression is used to compare elements - * (for example `name` to sort by a property called `name` or `name.substr(0, 3)` to sort by - * 3 first characters of a property called `name`). The result of a constant expression - * is interpreted as a property name to be used in comparisons (for example `"special name"` - * to sort object by the value of their `special name` property). An expression can be - * optionally prefixed with `+` or `-` to control ascending or descending sort order - * (for example, `+name` or `-name`). If no property is provided, (e.g. `'+'`) then the array - * element itself is used to compare where sorting. - * - `Array`: An array of function or string predicates. The first predicate in the array - * is used for sorting, but when two items are equivalent, the next predicate is used. - * - * If the predicate is missing or empty then it defaults to `'+'`. - * - * @param {boolean=} reverse Reverse the order of the array. - * @returns {Array} Sorted copy of the source array. - * - * - * @example - * The example below demonstrates a simple ngRepeat, where the data is sorted - * by age in descending order (predicate is set to `'-age'`). - * `reverse` is not set, which means it defaults to `false`. - - -
                                        - - - - - - - - - - - -
                                        NamePhone NumberAge
                                        {{friend.name}}{{friend.phone}}{{friend.age}}
                                        -
                                        -
                                        - - angular.module('orderByExample', []) - .controller('ExampleController', ['$scope', function($scope) { - $scope.friends = - [{name:'John', phone:'555-1212', age:10}, - {name:'Mary', phone:'555-9876', age:19}, - {name:'Mike', phone:'555-4321', age:21}, - {name:'Adam', phone:'555-5678', age:35}, - {name:'Julie', phone:'555-8765', age:29}]; - }]); - -
                                        - * - * The predicate and reverse parameters can be controlled dynamically through scope properties, - * as shown in the next example. - * @example - - -
                                        -
                                        Sorting predicate = {{predicate}}; reverse = {{reverse}}
                                        -
                                        - - - - - - - - - - - - -
                                        - - - - - - - - -
                                        {{friend.name}}{{friend.phone}}{{friend.age}}
                                        -
                                        -
                                        - - angular.module('orderByExample', []) - .controller('ExampleController', ['$scope', function($scope) { - $scope.friends = - [{name:'John', phone:'555-1212', age:10}, - {name:'Mary', phone:'555-9876', age:19}, - {name:'Mike', phone:'555-4321', age:21}, - {name:'Adam', phone:'555-5678', age:35}, - {name:'Julie', phone:'555-8765', age:29}]; - $scope.predicate = 'age'; - $scope.reverse = true; - $scope.order = function(predicate) { - $scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false; - $scope.predicate = predicate; - }; - }]); - - - .sortorder:after { - content: '\25b2'; - } - .sortorder.reverse:after { - content: '\25bc'; - } - -
                                        - * - * It's also possible to call the orderBy filter manually, by injecting `$filter`, retrieving the - * filter routine with `$filter('orderBy')`, and calling the returned filter routine with the - * desired parameters. - * - * Example: - * - * @example - - -
                                        -
                                        Sorting predicate = {{predicate}}; reverse = {{reverse}}
                                        - - - - - - - - - - - -
                                        - - - - - - - - -
                                        {{friend.name}}{{friend.phone}}{{friend.age}}
                                        -
                                        -
                                        - - - angular.module('orderByExample', []) - .controller('ExampleController', ['$scope', '$filter', function($scope, $filter) { - var orderBy = $filter('orderBy'); - $scope.friends = [ - { name: 'John', phone: '555-1212', age: 10 }, - { name: 'Mary', phone: '555-9876', age: 19 }, - { name: 'Mike', phone: '555-4321', age: 21 }, - { name: 'Adam', phone: '555-5678', age: 35 }, - { name: 'Julie', phone: '555-8765', age: 29 } - ]; - $scope.order = function(predicate) { - $scope.predicate = predicate; - $scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false; - $scope.friends = orderBy($scope.friends, predicate, $scope.reverse); - }; - $scope.order('age', true); - }]); - - - - .sortorder:after { - content: '\25b2'; - } - .sortorder.reverse:after { - content: '\25bc'; - } - -
                                        - */ -orderByFilter.$inject = ['$parse']; -function orderByFilter($parse) { - return function(array, sortPredicate, reverseOrder) { - - if (array == null) return array; - if (!isArrayLike(array)) { - throw minErr('orderBy')('notarray', 'Expected array but received: {0}', array); - } - - if (!isArray(sortPredicate)) { sortPredicate = [sortPredicate]; } - if (sortPredicate.length === 0) { sortPredicate = ['+']; } - - var predicates = processPredicates(sortPredicate, reverseOrder); - // Add a predicate at the end that evaluates to the element index. This makes the - // sort stable as it works as a tie-breaker when all the input predicates cannot - // distinguish between two elements. - predicates.push({ get: function() { return {}; }, descending: reverseOrder ? -1 : 1}); - - // The next three lines are a version of a Swartzian Transform idiom from Perl - // (sometimes called the Decorate-Sort-Undecorate idiom) - // See https://en.wikipedia.org/wiki/Schwartzian_transform - var compareValues = Array.prototype.map.call(array, getComparisonObject); - compareValues.sort(doComparison); - array = compareValues.map(function(item) { return item.value; }); - - return array; - - function getComparisonObject(value, index) { - return { - value: value, - predicateValues: predicates.map(function(predicate) { - return getPredicateValue(predicate.get(value), index); - }) - }; - } - - function doComparison(v1, v2) { - var result = 0; - for (var index=0, length = predicates.length; index < length; ++index) { - result = compare(v1.predicateValues[index], v2.predicateValues[index]) * predicates[index].descending; - if (result) break; - } - return result; - } - }; - - function processPredicates(sortPredicate, reverseOrder) { - reverseOrder = reverseOrder ? -1 : 1; - return sortPredicate.map(function(predicate) { - var descending = 1, get = identity; - - if (isFunction(predicate)) { - get = predicate; - } else if (isString(predicate)) { - if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) { - descending = predicate.charAt(0) == '-' ? -1 : 1; - predicate = predicate.substring(1); - } - if (predicate !== '') { - get = $parse(predicate); - if (get.constant) { - var key = get(); - get = function(value) { return value[key]; }; - } - } - } - return { get: get, descending: descending * reverseOrder }; - }); - } - - function isPrimitive(value) { - switch (typeof value) { - case 'number': /* falls through */ - case 'boolean': /* falls through */ - case 'string': - return true; - default: - return false; - } - } - - function objectValue(value, index) { - // If `valueOf` is a valid function use that - if (typeof value.valueOf === 'function') { - value = value.valueOf(); - if (isPrimitive(value)) return value; - } - // If `toString` is a valid function and not the one from `Object.prototype` use that - if (hasCustomToString(value)) { - value = value.toString(); - if (isPrimitive(value)) return value; - } - // We have a basic object so we use the position of the object in the collection - return index; - } - - function getPredicateValue(value, index) { - var type = typeof value; - if (value === null) { - type = 'string'; - value = 'null'; - } else if (type === 'string') { - value = value.toLowerCase(); - } else if (type === 'object') { - value = objectValue(value, index); - } - return { value: value, type: type }; - } - - function compare(v1, v2) { - var result = 0; - if (v1.type === v2.type) { - if (v1.value !== v2.value) { - result = v1.value < v2.value ? -1 : 1; - } - } else { - result = v1.type < v2.type ? -1 : 1; - } - return result; - } -} - -function ngDirective(directive) { - if (isFunction(directive)) { - directive = { - link: directive - }; - } - directive.restrict = directive.restrict || 'AC'; - return valueFn(directive); -} - -/** - * @ngdoc directive - * @name a - * @restrict E - * - * @description - * Modifies the default behavior of the html A tag so that the default action is prevented when - * the href attribute is empty. - * - * This change permits the easy creation of action links with the `ngClick` directive - * without changing the location or causing page reloads, e.g.: - * `Add Item` - */ -var htmlAnchorDirective = valueFn({ - restrict: 'E', - compile: function(element, attr) { - if (!attr.href && !attr.xlinkHref) { - return function(scope, element) { - // If the linked element is not an anchor tag anymore, do nothing - if (element[0].nodeName.toLowerCase() !== 'a') return; - - // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute. - var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ? - 'xlink:href' : 'href'; - element.on('click', function(event) { - // if we have no href url, then don't navigate anywhere. - if (!element.attr(href)) { - event.preventDefault(); - } - }); - }; - } - } -}); - -/** - * @ngdoc directive - * @name ngHref - * @restrict A - * @priority 99 - * - * @description - * Using Angular markup like `{{hash}}` in an href attribute will - * make the link go to the wrong URL if the user clicks it before - * Angular has a chance to replace the `{{hash}}` markup with its - * value. Until Angular replaces the markup the link will be broken - * and will most likely return a 404 error. The `ngHref` directive - * solves this problem. - * - * The wrong way to write it: - * ```html - * link1 - * ``` - * - * The correct way to write it: - * ```html - * link1 - * ``` - * - * @element A - * @param {template} ngHref any string which can contain `{{}}` markup. - * - * @example - * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes - * in links and their different behaviors: - - -
                                        - link 1 (link, don't reload)
                                        - link 2 (link, don't reload)
                                        - link 3 (link, reload!)
                                        - anchor (link, don't reload)
                                        - anchor (no link)
                                        - link (link, change location) -
                                        - - it('should execute ng-click but not reload when href without value', function() { - element(by.id('link-1')).click(); - expect(element(by.model('value')).getAttribute('value')).toEqual('1'); - expect(element(by.id('link-1')).getAttribute('href')).toBe(''); - }); - - it('should execute ng-click but not reload when href empty string', function() { - element(by.id('link-2')).click(); - expect(element(by.model('value')).getAttribute('value')).toEqual('2'); - expect(element(by.id('link-2')).getAttribute('href')).toBe(''); - }); - - it('should execute ng-click and change url when ng-href specified', function() { - expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\/123$/); - - element(by.id('link-3')).click(); - - // At this point, we navigate away from an Angular page, so we need - // to use browser.driver to get the base webdriver. - - browser.wait(function() { - return browser.driver.getCurrentUrl().then(function(url) { - return url.match(/\/123$/); - }); - }, 5000, 'page should navigate to /123'); - }); - - it('should execute ng-click but not reload when href empty string and name specified', function() { - element(by.id('link-4')).click(); - expect(element(by.model('value')).getAttribute('value')).toEqual('4'); - expect(element(by.id('link-4')).getAttribute('href')).toBe(''); - }); - - it('should execute ng-click but not reload when no href but name specified', function() { - element(by.id('link-5')).click(); - expect(element(by.model('value')).getAttribute('value')).toEqual('5'); - expect(element(by.id('link-5')).getAttribute('href')).toBe(null); - }); - - it('should only change url when only ng-href', function() { - element(by.model('value')).clear(); - element(by.model('value')).sendKeys('6'); - expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\/6$/); - - element(by.id('link-6')).click(); - - // At this point, we navigate away from an Angular page, so we need - // to use browser.driver to get the base webdriver. - browser.wait(function() { - return browser.driver.getCurrentUrl().then(function(url) { - return url.match(/\/6$/); - }); - }, 5000, 'page should navigate to /6'); - }); - -
                                        - */ - -/** - * @ngdoc directive - * @name ngSrc - * @restrict A - * @priority 99 - * - * @description - * Using Angular markup like `{{hash}}` in a `src` attribute doesn't - * work right: The browser will fetch from the URL with the literal - * text `{{hash}}` until Angular replaces the expression inside - * `{{hash}}`. The `ngSrc` directive solves this problem. - * - * The buggy way to write it: - * ```html - * Description - * ``` - * - * The correct way to write it: - * ```html - * Description - * ``` - * - * @element IMG - * @param {template} ngSrc any string which can contain `{{}}` markup. - */ - -/** - * @ngdoc directive - * @name ngSrcset - * @restrict A - * @priority 99 - * - * @description - * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't - * work right: The browser will fetch from the URL with the literal - * text `{{hash}}` until Angular replaces the expression inside - * `{{hash}}`. The `ngSrcset` directive solves this problem. - * - * The buggy way to write it: - * ```html - * Description - * ``` - * - * The correct way to write it: - * ```html - * Description - * ``` - * - * @element IMG - * @param {template} ngSrcset any string which can contain `{{}}` markup. - */ - -/** - * @ngdoc directive - * @name ngDisabled - * @restrict A - * @priority 100 - * - * @description - * - * This directive sets the `disabled` attribute on the element if the - * {@link guide/expression expression} inside `ngDisabled` evaluates to truthy. - * - * A special directive is necessary because we cannot use interpolation inside the `disabled` - * attribute. See the {@link guide/interpolation interpolation guide} for more info. - * - * @example - - -
                                        - -
                                        - - it('should toggle button', function() { - expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy(); - element(by.model('checked')).click(); - expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy(); - }); - -
                                        - * - * @element INPUT - * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy, - * then the `disabled` attribute will be set on the element - */ - - -/** - * @ngdoc directive - * @name ngChecked - * @restrict A - * @priority 100 - * - * @description - * Sets the `checked` attribute on the element, if the expression inside `ngChecked` is truthy. - * - * Note that this directive should not be used together with {@link ngModel `ngModel`}, - * as this can lead to unexpected behavior. - * - * A special directive is necessary because we cannot use interpolation inside the `checked` - * attribute. See the {@link guide/interpolation interpolation guide} for more info. - * - * @example - - -
                                        - -
                                        - - it('should check both checkBoxes', function() { - expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy(); - element(by.model('master')).click(); - expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy(); - }); - -
                                        - * - * @element INPUT - * @param {expression} ngChecked If the {@link guide/expression expression} is truthy, - * then the `checked` attribute will be set on the element - */ - - -/** - * @ngdoc directive - * @name ngReadonly - * @restrict A - * @priority 100 - * - * @description - * - * Sets the `readOnly` attribute on the element, if the expression inside `ngReadonly` is truthy. - * - * A special directive is necessary because we cannot use interpolation inside the `readOnly` - * attribute. See the {@link guide/interpolation interpolation guide} for more info. - * - * @example - - -
                                        - -
                                        - - it('should toggle readonly attr', function() { - expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeFalsy(); - element(by.model('checked')).click(); - expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeTruthy(); - }); - -
                                        - * - * @element INPUT - * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy, - * then special attribute "readonly" will be set on the element - */ - - -/** - * @ngdoc directive - * @name ngSelected - * @restrict A - * @priority 100 - * - * @description - * - * Sets the `selected` attribute on the element, if the expression inside `ngSelected` is truthy. - * - * A special directive is necessary because we cannot use interpolation inside the `selected` - * attribute. See the {@link guide/interpolation interpolation guide} for more info. - * - * @example - - -
                                        - -
                                        - - it('should select Greetings!', function() { - expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy(); - element(by.model('selected')).click(); - expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy(); - }); - -
                                        - * - * @element OPTION - * @param {expression} ngSelected If the {@link guide/expression expression} is truthy, - * then special attribute "selected" will be set on the element - */ - -/** - * @ngdoc directive - * @name ngOpen - * @restrict A - * @priority 100 - * - * @description - * - * Sets the `open` attribute on the element, if the expression inside `ngOpen` is truthy. - * - * A special directive is necessary because we cannot use interpolation inside the `open` - * attribute. See the {@link guide/interpolation interpolation guide} for more info. - * - * @example - - -
                                        -
                                        - Show/Hide me -
                                        -
                                        - - it('should toggle open', function() { - expect(element(by.id('details')).getAttribute('open')).toBeFalsy(); - element(by.model('open')).click(); - expect(element(by.id('details')).getAttribute('open')).toBeTruthy(); - }); - -
                                        - * - * @element DETAILS - * @param {expression} ngOpen If the {@link guide/expression expression} is truthy, - * then special attribute "open" will be set on the element - */ - -var ngAttributeAliasDirectives = {}; - -// boolean attrs are evaluated -forEach(BOOLEAN_ATTR, function(propName, attrName) { - // binding to multiple is not supported - if (propName == "multiple") return; - - function defaultLinkFn(scope, element, attr) { - scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) { - attr.$set(attrName, !!value); - }); - } - - var normalized = directiveNormalize('ng-' + attrName); - var linkFn = defaultLinkFn; - - if (propName === 'checked') { - linkFn = function(scope, element, attr) { - // ensuring ngChecked doesn't interfere with ngModel when both are set on the same input - if (attr.ngModel !== attr[normalized]) { - defaultLinkFn(scope, element, attr); - } - }; - } - - ngAttributeAliasDirectives[normalized] = function() { - return { - restrict: 'A', - priority: 100, - link: linkFn - }; - }; -}); - -// aliased input attrs are evaluated -forEach(ALIASED_ATTR, function(htmlAttr, ngAttr) { - ngAttributeAliasDirectives[ngAttr] = function() { - return { - priority: 100, - link: function(scope, element, attr) { - //special case ngPattern when a literal regular expression value - //is used as the expression (this way we don't have to watch anything). - if (ngAttr === "ngPattern" && attr.ngPattern.charAt(0) == "/") { - var match = attr.ngPattern.match(REGEX_STRING_REGEXP); - if (match) { - attr.$set("ngPattern", new RegExp(match[1], match[2])); - return; - } - } - - scope.$watch(attr[ngAttr], function ngAttrAliasWatchAction(value) { - attr.$set(ngAttr, value); - }); - } - }; - }; -}); - -// ng-src, ng-srcset, ng-href are interpolated -forEach(['src', 'srcset', 'href'], function(attrName) { - var normalized = directiveNormalize('ng-' + attrName); - ngAttributeAliasDirectives[normalized] = function() { - return { - priority: 99, // it needs to run after the attributes are interpolated - link: function(scope, element, attr) { - var propName = attrName, - name = attrName; - - if (attrName === 'href' && - toString.call(element.prop('href')) === '[object SVGAnimatedString]') { - name = 'xlinkHref'; - attr.$attr[name] = 'xlink:href'; - propName = null; - } - - attr.$observe(normalized, function(value) { - if (!value) { - if (attrName === 'href') { - attr.$set(name, null); - } - return; - } - - attr.$set(name, value); - - // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist - // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need - // to set the property as well to achieve the desired effect. - // we use attr[attrName] value since $set can sanitize the url. - if (msie && propName) element.prop(propName, attr[name]); - }); - } - }; - }; -}); - -/* global -nullFormCtrl, -SUBMITTED_CLASS, addSetValidityMethod: true - */ -var nullFormCtrl = { - $addControl: noop, - $$renameControl: nullFormRenameControl, - $removeControl: noop, - $setValidity: noop, - $setDirty: noop, - $setPristine: noop, - $setSubmitted: noop -}, -SUBMITTED_CLASS = 'ng-submitted'; - -function nullFormRenameControl(control, name) { - control.$name = name; -} - -/** - * @ngdoc type - * @name form.FormController - * - * @property {boolean} $pristine True if user has not interacted with the form yet. - * @property {boolean} $dirty True if user has already interacted with the form. - * @property {boolean} $valid True if all of the containing forms and controls are valid. - * @property {boolean} $invalid True if at least one containing control or form is invalid. - * @property {boolean} $pending True if at least one containing control or form is pending. - * @property {boolean} $submitted True if user has submitted the form even if its invalid. - * - * @property {Object} $error Is an object hash, containing references to controls or - * forms with failing validators, where: - * - * - keys are validation tokens (error names), - * - values are arrays of controls or forms that have a failing validator for given error name. - * - * Built-in validation tokens: - * - * - `email` - * - `max` - * - `maxlength` - * - `min` - * - `minlength` - * - `number` - * - `pattern` - * - `required` - * - `url` - * - `date` - * - `datetimelocal` - * - `time` - * - `week` - * - `month` - * - * @description - * `FormController` keeps track of all its controls and nested forms as well as the state of them, - * such as being valid/invalid or dirty/pristine. - * - * Each {@link ng.directive:form form} directive creates an instance - * of `FormController`. - * - */ -//asks for $scope to fool the BC controller module -FormController.$inject = ['$element', '$attrs', '$scope', '$animate', '$interpolate']; -function FormController(element, attrs, $scope, $animate, $interpolate) { - var form = this, - controls = []; - - // init state - form.$error = {}; - form.$$success = {}; - form.$pending = undefined; - form.$name = $interpolate(attrs.name || attrs.ngForm || '')($scope); - form.$dirty = false; - form.$pristine = true; - form.$valid = true; - form.$invalid = false; - form.$submitted = false; - form.$$parentForm = nullFormCtrl; - - /** - * @ngdoc method - * @name form.FormController#$rollbackViewValue - * - * @description - * Rollback all form controls pending updates to the `$modelValue`. - * - * Updates may be pending by a debounced event or because the input is waiting for a some future - * event defined in `ng-model-options`. This method is typically needed by the reset button of - * a form that uses `ng-model-options` to pend updates. - */ - form.$rollbackViewValue = function() { - forEach(controls, function(control) { - control.$rollbackViewValue(); - }); - }; - - /** - * @ngdoc method - * @name form.FormController#$commitViewValue - * - * @description - * Commit all form controls pending updates to the `$modelValue`. - * - * Updates may be pending by a debounced event or because the input is waiting for a some future - * event defined in `ng-model-options`. This method is rarely needed as `NgModelController` - * usually handles calling this in response to input events. - */ - form.$commitViewValue = function() { - forEach(controls, function(control) { - control.$commitViewValue(); - }); - }; - - /** - * @ngdoc method - * @name form.FormController#$addControl - * @param {object} control control object, either a {@link form.FormController} or an - * {@link ngModel.NgModelController} - * - * @description - * Register a control with the form. Input elements using ngModelController do this automatically - * when they are linked. - * - * Note that the current state of the control will not be reflected on the new parent form. This - * is not an issue with normal use, as freshly compiled and linked controls are in a `$pristine` - * state. - * - * However, if the method is used programmatically, for example by adding dynamically created controls, - * or controls that have been previously removed without destroying their corresponding DOM element, - * it's the developers responsibility to make sure the current state propagates to the parent form. - * - * For example, if an input control is added that is already `$dirty` and has `$error` properties, - * calling `$setDirty()` and `$validate()` afterwards will propagate the state to the parent form. - */ - form.$addControl = function(control) { - // Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored - // and not added to the scope. Now we throw an error. - assertNotHasOwnProperty(control.$name, 'input'); - controls.push(control); - - if (control.$name) { - form[control.$name] = control; - } - - control.$$parentForm = form; - }; - - // Private API: rename a form control - form.$$renameControl = function(control, newName) { - var oldName = control.$name; - - if (form[oldName] === control) { - delete form[oldName]; - } - form[newName] = control; - control.$name = newName; - }; - - /** - * @ngdoc method - * @name form.FormController#$removeControl - * @param {object} control control object, either a {@link form.FormController} or an - * {@link ngModel.NgModelController} - * - * @description - * Deregister a control from the form. - * - * Input elements using ngModelController do this automatically when they are destroyed. - * - * Note that only the removed control's validation state (`$errors`etc.) will be removed from the - * form. `$dirty`, `$submitted` states will not be changed, because the expected behavior can be - * different from case to case. For example, removing the only `$dirty` control from a form may or - * may not mean that the form is still `$dirty`. - */ - form.$removeControl = function(control) { - if (control.$name && form[control.$name] === control) { - delete form[control.$name]; - } - forEach(form.$pending, function(value, name) { - form.$setValidity(name, null, control); - }); - forEach(form.$error, function(value, name) { - form.$setValidity(name, null, control); - }); - forEach(form.$$success, function(value, name) { - form.$setValidity(name, null, control); - }); - - arrayRemove(controls, control); - control.$$parentForm = nullFormCtrl; - }; - - - /** - * @ngdoc method - * @name form.FormController#$setValidity - * - * @description - * Sets the validity of a form control. - * - * This method will also propagate to parent forms. - */ - addSetValidityMethod({ - ctrl: this, - $element: element, - set: function(object, property, controller) { - var list = object[property]; - if (!list) { - object[property] = [controller]; - } else { - var index = list.indexOf(controller); - if (index === -1) { - list.push(controller); - } - } - }, - unset: function(object, property, controller) { - var list = object[property]; - if (!list) { - return; - } - arrayRemove(list, controller); - if (list.length === 0) { - delete object[property]; - } - }, - $animate: $animate - }); - - /** - * @ngdoc method - * @name form.FormController#$setDirty - * - * @description - * Sets the form to a dirty state. - * - * This method can be called to add the 'ng-dirty' class and set the form to a dirty - * state (ng-dirty class). This method will also propagate to parent forms. - */ - form.$setDirty = function() { - $animate.removeClass(element, PRISTINE_CLASS); - $animate.addClass(element, DIRTY_CLASS); - form.$dirty = true; - form.$pristine = false; - form.$$parentForm.$setDirty(); - }; - - /** - * @ngdoc method - * @name form.FormController#$setPristine - * - * @description - * Sets the form to its pristine state. - * - * This method can be called to remove the 'ng-dirty' class and set the form to its pristine - * state (ng-pristine class). This method will also propagate to all the controls contained - * in this form. - * - * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after - * saving or resetting it. - */ - form.$setPristine = function() { - $animate.setClass(element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS); - form.$dirty = false; - form.$pristine = true; - form.$submitted = false; - forEach(controls, function(control) { - control.$setPristine(); - }); - }; - - /** - * @ngdoc method - * @name form.FormController#$setUntouched - * - * @description - * Sets the form to its untouched state. - * - * This method can be called to remove the 'ng-touched' class and set the form controls to their - * untouched state (ng-untouched class). - * - * Setting a form controls back to their untouched state is often useful when setting the form - * back to its pristine state. - */ - form.$setUntouched = function() { - forEach(controls, function(control) { - control.$setUntouched(); - }); - }; - - /** - * @ngdoc method - * @name form.FormController#$setSubmitted - * - * @description - * Sets the form to its submitted state. - */ - form.$setSubmitted = function() { - $animate.addClass(element, SUBMITTED_CLASS); - form.$submitted = true; - form.$$parentForm.$setSubmitted(); - }; -} - -/** - * @ngdoc directive - * @name ngForm - * @restrict EAC - * - * @description - * Nestable alias of {@link ng.directive:form `form`} directive. HTML - * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a - * sub-group of controls needs to be determined. - * - * Note: the purpose of `ngForm` is to group controls, - * but not to be a replacement for the `
                                        ` tag with all of its capabilities - * (e.g. posting to the server, ...). - * - * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into - * related scope, under this name. - * - */ - - /** - * @ngdoc directive - * @name form - * @restrict E - * - * @description - * Directive that instantiates - * {@link form.FormController FormController}. - * - * If the `name` attribute is specified, the form controller is published onto the current scope under - * this name. - * - * # Alias: {@link ng.directive:ngForm `ngForm`} - * - * In Angular, forms can be nested. This means that the outer form is valid when all of the child - * forms are valid as well. However, browsers do not allow nesting of `` elements, so - * Angular provides the {@link ng.directive:ngForm `ngForm`} directive, which behaves identically to - * `form` but can be nested. Nested forms can be useful, for example, if the validity of a sub-group - * of controls needs to be determined. - * - * # CSS classes - * - `ng-valid` is set if the form is valid. - * - `ng-invalid` is set if the form is invalid. - * - `ng-pending` is set if the form is pending. - * - `ng-pristine` is set if the form is pristine. - * - `ng-dirty` is set if the form is dirty. - * - `ng-submitted` is set if the form was submitted. - * - * Keep in mind that ngAnimate can detect each of these classes when added and removed. - * - * - * # Submitting a form and preventing the default action - * - * Since the role of forms in client-side Angular applications is different than in classical - * roundtrip apps, it is desirable for the browser not to translate the form submission into a full - * page reload that sends the data to the server. Instead some javascript logic should be triggered - * to handle the form submission in an application-specific way. - * - * For this reason, Angular prevents the default action (form submission to the server) unless the - * `` element has an `action` attribute specified. - * - * You can use one of the following two ways to specify what javascript method should be called when - * a form is submitted: - * - * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element - * - {@link ng.directive:ngClick ngClick} directive on the first - * button or input field of type submit (input[type=submit]) - * - * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit} - * or {@link ng.directive:ngClick ngClick} directives. - * This is because of the following form submission rules in the HTML specification: - * - * - If a form has only one input field then hitting enter in this field triggers form submit - * (`ngSubmit`) - * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter - * doesn't trigger submit - * - if a form has one or more input fields and one or more buttons or input[type=submit] then - * hitting enter in any of the input fields will trigger the click handler on the *first* button or - * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`) - * - * Any pending `ngModelOptions` changes will take place immediately when an enclosing form is - * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit` - * to have access to the updated model. - * - * ## Animation Hooks - * - * Animations in ngForm are triggered when any of the associated CSS classes are added and removed. - * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any - * other validations that are performed within the form. Animations in ngForm are similar to how - * they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well - * as JS animations. - * - * The following example shows a simple way to utilize CSS transitions to style a form element - * that has been rendered as invalid after it has been validated: - * - *
                                        - * //be sure to include ngAnimate as a module to hook into more
                                        - * //advanced animations
                                        - * .my-form {
                                        - *   transition:0.5s linear all;
                                        - *   background: white;
                                        - * }
                                        - * .my-form.ng-invalid {
                                        - *   background: red;
                                        - *   color:white;
                                        - * }
                                        - * 
                                        - * - * @example - - - - - - userType: - Required!
                                        - userType = {{userType}}
                                        - myForm.input.$valid = {{myForm.input.$valid}}
                                        - myForm.input.$error = {{myForm.input.$error}}
                                        - myForm.$valid = {{myForm.$valid}}
                                        - myForm.$error.required = {{!!myForm.$error.required}}
                                        - -
                                        - - it('should initialize to model', function() { - var userType = element(by.binding('userType')); - var valid = element(by.binding('myForm.input.$valid')); - - expect(userType.getText()).toContain('guest'); - expect(valid.getText()).toContain('true'); - }); - - it('should be invalid if empty', function() { - var userType = element(by.binding('userType')); - var valid = element(by.binding('myForm.input.$valid')); - var userInput = element(by.model('userType')); - - userInput.clear(); - userInput.sendKeys(''); - - expect(userType.getText()).toEqual('userType ='); - expect(valid.getText()).toContain('false'); - }); - -
                                        - * - * @param {string=} name Name of the form. If specified, the form controller will be published into - * related scope, under this name. - */ -var formDirectiveFactory = function(isNgForm) { - return ['$timeout', '$parse', function($timeout, $parse) { - var formDirective = { - name: 'form', - restrict: isNgForm ? 'EAC' : 'E', - require: ['form', '^^?form'], //first is the form's own ctrl, second is an optional parent form - controller: FormController, - compile: function ngFormCompile(formElement, attr) { - // Setup initial state of the control - formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS); - - var nameAttr = attr.name ? 'name' : (isNgForm && attr.ngForm ? 'ngForm' : false); - - return { - pre: function ngFormPreLink(scope, formElement, attr, ctrls) { - var controller = ctrls[0]; - - // if `action` attr is not present on the form, prevent the default action (submission) - if (!('action' in attr)) { - // we can't use jq events because if a form is destroyed during submission the default - // action is not prevented. see #1238 - // - // IE 9 is not affected because it doesn't fire a submit event and try to do a full - // page reload if the form was destroyed by submission of the form via a click handler - // on a button in the form. Looks like an IE9 specific bug. - var handleFormSubmission = function(event) { - scope.$apply(function() { - controller.$commitViewValue(); - controller.$setSubmitted(); - }); - - event.preventDefault(); - }; - - addEventListenerFn(formElement[0], 'submit', handleFormSubmission); - - // unregister the preventDefault listener so that we don't not leak memory but in a - // way that will achieve the prevention of the default action. - formElement.on('$destroy', function() { - $timeout(function() { - removeEventListenerFn(formElement[0], 'submit', handleFormSubmission); - }, 0, false); - }); - } - - var parentFormCtrl = ctrls[1] || controller.$$parentForm; - parentFormCtrl.$addControl(controller); - - var setter = nameAttr ? getSetter(controller.$name) : noop; - - if (nameAttr) { - setter(scope, controller); - attr.$observe(nameAttr, function(newValue) { - if (controller.$name === newValue) return; - setter(scope, undefined); - controller.$$parentForm.$$renameControl(controller, newValue); - setter = getSetter(controller.$name); - setter(scope, controller); - }); - } - formElement.on('$destroy', function() { - controller.$$parentForm.$removeControl(controller); - setter(scope, undefined); - extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards - }); - } - }; - } - }; - - return formDirective; - - function getSetter(expression) { - if (expression === '') { - //create an assignable expression, so forms with an empty name can be renamed later - return $parse('this[""]').assign; - } - return $parse(expression).assign || noop; - } - }]; -}; - -var formDirective = formDirectiveFactory(); -var ngFormDirective = formDirectiveFactory(true); - -/* global VALID_CLASS: false, - INVALID_CLASS: false, - PRISTINE_CLASS: false, - DIRTY_CLASS: false, - UNTOUCHED_CLASS: false, - TOUCHED_CLASS: false, - ngModelMinErr: false, -*/ - -// Regex code was initially obtained from SO prior to modification: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231 -var ISO_DATE_REGEXP = /^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/; -// See valid URLs in RFC3987 (http://tools.ietf.org/html/rfc3987) -// Note: We are being more lenient, because browsers are too. -// 1. Scheme -// 2. Slashes -// 3. Username -// 4. Password -// 5. Hostname -// 6. Port -// 7. Path -// 8. Query -// 9. Fragment -// 1111111111111111 222 333333 44444 555555555555555555555555 666 77777777 8888888 999 -var URL_REGEXP = /^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+\])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i; -var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i; -var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/; -var DATE_REGEXP = /^(\d{4,})-(\d{2})-(\d{2})$/; -var DATETIMELOCAL_REGEXP = /^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; -var WEEK_REGEXP = /^(\d{4,})-W(\d\d)$/; -var MONTH_REGEXP = /^(\d{4,})-(\d\d)$/; -var TIME_REGEXP = /^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; - -var PARTIAL_VALIDATION_EVENTS = 'keydown wheel mousedown'; -var PARTIAL_VALIDATION_TYPES = createMap(); -forEach('date,datetime-local,month,time,week'.split(','), function(type) { - PARTIAL_VALIDATION_TYPES[type] = true; -}); - -var inputType = { - - /** - * @ngdoc input - * @name input[text] - * - * @description - * Standard HTML text input with angular data binding, inherited by most of the `input` elements. - * - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} required Adds `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of - * any length. - * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string - * that contains the regular expression body that will be converted to a regular expression - * as in the ngPattern directive. - * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} - * does not match a RegExp found by evaluating the Angular expression given in the attribute value. - * If the expression evaluates to a RegExp object, then this is used directly. - * If the expression evaluates to a string, then it will be converted to a RegExp - * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to - * `new RegExp('^abc$')`.
                                        - * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to - * start at the index of the last search's match, thus not taking the whole input value into - * account. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. - * This parameter is ignored for input[type=password] controls, which will never trim the - * input. - * - * @example - - - -
                                        - -
                                        - - Required! - - Single word only! -
                                        - text = {{example.text}}
                                        - myForm.input.$valid = {{myForm.input.$valid}}
                                        - myForm.input.$error = {{myForm.input.$error}}
                                        - myForm.$valid = {{myForm.$valid}}
                                        - myForm.$error.required = {{!!myForm.$error.required}}
                                        -
                                        -
                                        - - var text = element(by.binding('example.text')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('example.text')); - - it('should initialize to model', function() { - expect(text.getText()).toContain('guest'); - expect(valid.getText()).toContain('true'); - }); - - it('should be invalid if empty', function() { - input.clear(); - input.sendKeys(''); - - expect(text.getText()).toEqual('text ='); - expect(valid.getText()).toContain('false'); - }); - - it('should be invalid if multi word', function() { - input.clear(); - input.sendKeys('hello world'); - - expect(valid.getText()).toContain('false'); - }); - -
                                        - */ - 'text': textInputType, - - /** - * @ngdoc input - * @name input[date] - * - * @description - * Input with date validation and transformation. In browsers that do not yet support - * the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601 - * date format (yyyy-MM-dd), for example: `2009-01-06`. Since many - * modern browsers do not yet support this input type, it is important to provide cues to users on the - * expected input format via a placeholder or label. - * - * The model must always be a Date object, otherwise Angular will throw an error. - * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. - * - * The timezone to be used to read/write the `Date` instance in the model can be defined using - * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a - * valid ISO date string (yyyy-MM-dd). You can also use interpolation inside this attribute - * (e.g. `min="{{minDate | date:'yyyy-MM-dd'}}"`). Note that `min` will also add native HTML5 - * constraint validation. - * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be - * a valid ISO date string (yyyy-MM-dd). You can also use interpolation inside this attribute - * (e.g. `max="{{maxDate | date:'yyyy-MM-dd'}}"`). Note that `max` will also add native HTML5 - * constraint validation. - * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO date string - * the `ngMin` expression evaluates to. Note that it does not set the `min` attribute. - * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO date string - * the `ngMax` expression evaluates to. Note that it does not set the `max` attribute. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
                                        - - -
                                        - - Required! - - Not a valid date! -
                                        - value = {{example.value | date: "yyyy-MM-dd"}}
                                        - myForm.input.$valid = {{myForm.input.$valid}}
                                        - myForm.input.$error = {{myForm.input.$error}}
                                        - myForm.$valid = {{myForm.$valid}}
                                        - myForm.$error.required = {{!!myForm.$error.required}}
                                        -
                                        -
                                        - - var value = element(by.binding('example.value | date: "yyyy-MM-dd"')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('example.value')); - - // currently protractor/webdriver does not support - // sending keys to all known HTML5 input controls - // for various browsers (see https://github.com/angular/protractor/issues/562). - function setInput(val) { - // set the value of the element and force validation. - var scr = "var ipt = document.getElementById('exampleInput'); " + - "ipt.value = '" + val + "';" + - "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; - browser.executeScript(scr); - } - - it('should initialize to model', function() { - expect(value.getText()).toContain('2013-10-22'); - expect(valid.getText()).toContain('myForm.input.$valid = true'); - }); - - it('should be invalid if empty', function() { - setInput(''); - expect(value.getText()).toEqual('value ='); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - - it('should be invalid if over max', function() { - setInput('2015-01-01'); - expect(value.getText()).toContain(''); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - -
                                        - */ - 'date': createDateInputType('date', DATE_REGEXP, - createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']), - 'yyyy-MM-dd'), - - /** - * @ngdoc input - * @name input[datetime-local] - * - * @description - * Input with datetime validation and transformation. In browsers that do not yet support - * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 - * local datetime format (yyyy-MM-ddTHH:mm:ss), for example: `2010-12-28T14:57:00`. - * - * The model must always be a Date object, otherwise Angular will throw an error. - * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. - * - * The timezone to be used to read/write the `Date` instance in the model can be defined using - * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. - * This must be a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). You can also use interpolation - * inside this attribute (e.g. `min="{{minDatetimeLocal | date:'yyyy-MM-ddTHH:mm:ss'}}"`). - * Note that `min` will also add native HTML5 constraint validation. - * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. - * This must be a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). You can also use interpolation - * inside this attribute (e.g. `max="{{maxDatetimeLocal | date:'yyyy-MM-ddTHH:mm:ss'}}"`). - * Note that `max` will also add native HTML5 constraint validation. - * @param {(date|string)=} ngMin Sets the `min` validation error key to the Date / ISO datetime string - * the `ngMin` expression evaluates to. Note that it does not set the `min` attribute. - * @param {(date|string)=} ngMax Sets the `max` validation error key to the Date / ISO datetime string - * the `ngMax` expression evaluates to. Note that it does not set the `max` attribute. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
                                        - - -
                                        - - Required! - - Not a valid date! -
                                        - value = {{example.value | date: "yyyy-MM-ddTHH:mm:ss"}}
                                        - myForm.input.$valid = {{myForm.input.$valid}}
                                        - myForm.input.$error = {{myForm.input.$error}}
                                        - myForm.$valid = {{myForm.$valid}}
                                        - myForm.$error.required = {{!!myForm.$error.required}}
                                        -
                                        -
                                        - - var value = element(by.binding('example.value | date: "yyyy-MM-ddTHH:mm:ss"')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('example.value')); - - // currently protractor/webdriver does not support - // sending keys to all known HTML5 input controls - // for various browsers (https://github.com/angular/protractor/issues/562). - function setInput(val) { - // set the value of the element and force validation. - var scr = "var ipt = document.getElementById('exampleInput'); " + - "ipt.value = '" + val + "';" + - "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; - browser.executeScript(scr); - } - - it('should initialize to model', function() { - expect(value.getText()).toContain('2010-12-28T14:57:00'); - expect(valid.getText()).toContain('myForm.input.$valid = true'); - }); - - it('should be invalid if empty', function() { - setInput(''); - expect(value.getText()).toEqual('value ='); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - - it('should be invalid if over max', function() { - setInput('2015-01-01T23:59:00'); - expect(value.getText()).toContain(''); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - -
                                        - */ - 'datetime-local': createDateInputType('datetimelocal', DATETIMELOCAL_REGEXP, - createDateParser(DATETIMELOCAL_REGEXP, ['yyyy', 'MM', 'dd', 'HH', 'mm', 'ss', 'sss']), - 'yyyy-MM-ddTHH:mm:ss.sss'), - - /** - * @ngdoc input - * @name input[time] - * - * @description - * Input with time validation and transformation. In browsers that do not yet support - * the HTML5 time input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 - * local time format (HH:mm:ss), for example: `14:57:00`. Model must be a Date object. This binding will always output a - * Date object to the model of January 1, 1970, or local date `new Date(1970, 0, 1, HH, mm, ss)`. - * - * The model must always be a Date object, otherwise Angular will throw an error. - * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. - * - * The timezone to be used to read/write the `Date` instance in the model can be defined using - * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. - * This must be a valid ISO time format (HH:mm:ss). You can also use interpolation inside this - * attribute (e.g. `min="{{minTime | date:'HH:mm:ss'}}"`). Note that `min` will also add - * native HTML5 constraint validation. - * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. - * This must be a valid ISO time format (HH:mm:ss). You can also use interpolation inside this - * attribute (e.g. `max="{{maxTime | date:'HH:mm:ss'}}"`). Note that `max` will also add - * native HTML5 constraint validation. - * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO time string the - * `ngMin` expression evaluates to. Note that it does not set the `min` attribute. - * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO time string the - * `ngMax` expression evaluates to. Note that it does not set the `max` attribute. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
                                        - - -
                                        - - Required! - - Not a valid date! -
                                        - value = {{example.value | date: "HH:mm:ss"}}
                                        - myForm.input.$valid = {{myForm.input.$valid}}
                                        - myForm.input.$error = {{myForm.input.$error}}
                                        - myForm.$valid = {{myForm.$valid}}
                                        - myForm.$error.required = {{!!myForm.$error.required}}
                                        -
                                        -
                                        - - var value = element(by.binding('example.value | date: "HH:mm:ss"')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('example.value')); - - // currently protractor/webdriver does not support - // sending keys to all known HTML5 input controls - // for various browsers (https://github.com/angular/protractor/issues/562). - function setInput(val) { - // set the value of the element and force validation. - var scr = "var ipt = document.getElementById('exampleInput'); " + - "ipt.value = '" + val + "';" + - "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; - browser.executeScript(scr); - } - - it('should initialize to model', function() { - expect(value.getText()).toContain('14:57:00'); - expect(valid.getText()).toContain('myForm.input.$valid = true'); - }); - - it('should be invalid if empty', function() { - setInput(''); - expect(value.getText()).toEqual('value ='); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - - it('should be invalid if over max', function() { - setInput('23:59:00'); - expect(value.getText()).toContain(''); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - -
                                        - */ - 'time': createDateInputType('time', TIME_REGEXP, - createDateParser(TIME_REGEXP, ['HH', 'mm', 'ss', 'sss']), - 'HH:mm:ss.sss'), - - /** - * @ngdoc input - * @name input[week] - * - * @description - * Input with week-of-the-year validation and transformation to Date. In browsers that do not yet support - * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 - * week format (yyyy-W##), for example: `2013-W02`. - * - * The model must always be a Date object, otherwise Angular will throw an error. - * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. - * - * The timezone to be used to read/write the `Date` instance in the model can be defined using - * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. - * This must be a valid ISO week format (yyyy-W##). You can also use interpolation inside this - * attribute (e.g. `min="{{minWeek | date:'yyyy-Www'}}"`). Note that `min` will also add - * native HTML5 constraint validation. - * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. - * This must be a valid ISO week format (yyyy-W##). You can also use interpolation inside this - * attribute (e.g. `max="{{maxWeek | date:'yyyy-Www'}}"`). Note that `max` will also add - * native HTML5 constraint validation. - * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO week string - * the `ngMin` expression evaluates to. Note that it does not set the `min` attribute. - * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO week string - * the `ngMax` expression evaluates to. Note that it does not set the `max` attribute. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
                                        - -
                                        - - Required! - - Not a valid date! -
                                        - value = {{example.value | date: "yyyy-Www"}}
                                        - myForm.input.$valid = {{myForm.input.$valid}}
                                        - myForm.input.$error = {{myForm.input.$error}}
                                        - myForm.$valid = {{myForm.$valid}}
                                        - myForm.$error.required = {{!!myForm.$error.required}}
                                        -
                                        -
                                        - - var value = element(by.binding('example.value | date: "yyyy-Www"')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('example.value')); - - // currently protractor/webdriver does not support - // sending keys to all known HTML5 input controls - // for various browsers (https://github.com/angular/protractor/issues/562). - function setInput(val) { - // set the value of the element and force validation. - var scr = "var ipt = document.getElementById('exampleInput'); " + - "ipt.value = '" + val + "';" + - "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; - browser.executeScript(scr); - } - - it('should initialize to model', function() { - expect(value.getText()).toContain('2013-W01'); - expect(valid.getText()).toContain('myForm.input.$valid = true'); - }); - - it('should be invalid if empty', function() { - setInput(''); - expect(value.getText()).toEqual('value ='); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - - it('should be invalid if over max', function() { - setInput('2015-W01'); - expect(value.getText()).toContain(''); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - -
                                        - */ - 'week': createDateInputType('week', WEEK_REGEXP, weekParser, 'yyyy-Www'), - - /** - * @ngdoc input - * @name input[month] - * - * @description - * Input with month validation and transformation. In browsers that do not yet support - * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 - * month format (yyyy-MM), for example: `2009-01`. - * - * The model must always be a Date object, otherwise Angular will throw an error. - * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. - * If the model is not set to the first of the month, the next view to model update will set it - * to the first of the month. - * - * The timezone to be used to read/write the `Date` instance in the model can be defined using - * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. - * This must be a valid ISO month format (yyyy-MM). You can also use interpolation inside this - * attribute (e.g. `min="{{minMonth | date:'yyyy-MM'}}"`). Note that `min` will also add - * native HTML5 constraint validation. - * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. - * This must be a valid ISO month format (yyyy-MM). You can also use interpolation inside this - * attribute (e.g. `max="{{maxMonth | date:'yyyy-MM'}}"`). Note that `max` will also add - * native HTML5 constraint validation. - * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO week string - * the `ngMin` expression evaluates to. Note that it does not set the `min` attribute. - * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO week string - * the `ngMax` expression evaluates to. Note that it does not set the `max` attribute. - - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
                                        - - -
                                        - - Required! - - Not a valid month! -
                                        - value = {{example.value | date: "yyyy-MM"}}
                                        - myForm.input.$valid = {{myForm.input.$valid}}
                                        - myForm.input.$error = {{myForm.input.$error}}
                                        - myForm.$valid = {{myForm.$valid}}
                                        - myForm.$error.required = {{!!myForm.$error.required}}
                                        -
                                        -
                                        - - var value = element(by.binding('example.value | date: "yyyy-MM"')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('example.value')); - - // currently protractor/webdriver does not support - // sending keys to all known HTML5 input controls - // for various browsers (https://github.com/angular/protractor/issues/562). - function setInput(val) { - // set the value of the element and force validation. - var scr = "var ipt = document.getElementById('exampleInput'); " + - "ipt.value = '" + val + "';" + - "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; - browser.executeScript(scr); - } - - it('should initialize to model', function() { - expect(value.getText()).toContain('2013-10'); - expect(valid.getText()).toContain('myForm.input.$valid = true'); - }); - - it('should be invalid if empty', function() { - setInput(''); - expect(value.getText()).toEqual('value ='); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - - it('should be invalid if over max', function() { - setInput('2015-01'); - expect(value.getText()).toContain(''); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - -
                                        - */ - 'month': createDateInputType('month', MONTH_REGEXP, - createDateParser(MONTH_REGEXP, ['yyyy', 'MM']), - 'yyyy-MM'), - - /** - * @ngdoc input - * @name input[number] - * - * @description - * Text input with number validation and transformation. Sets the `number` validation - * error if not a valid number. - * - *
                                        - * The model must always be of type `number` otherwise Angular will throw an error. - * Be aware that a string containing a number is not enough. See the {@link ngModel:numfmt} - * error docs for more information and an example of how to convert your model if necessary. - *
                                        - * - * ## Issues with HTML5 constraint validation - * - * In browsers that follow the - * [HTML5 specification](https://html.spec.whatwg.org/multipage/forms.html#number-state-%28type=number%29), - * `input[number]` does not work as expected with {@link ngModelOptions `ngModelOptions.allowInvalid`}. - * If a non-number is entered in the input, the browser will report the value as an empty string, - * which means the view / model values in `ngModel` and subsequently the scope value - * will also be an empty string. - * - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. - * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of - * any length. - * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string - * that contains the regular expression body that will be converted to a regular expression - * as in the ngPattern directive. - * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} - * does not match a RegExp found by evaluating the Angular expression given in the attribute value. - * If the expression evaluates to a RegExp object, then this is used directly. - * If the expression evaluates to a string, then it will be converted to a RegExp - * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to - * `new RegExp('^abc$')`.
                                        - * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to - * start at the index of the last search's match, thus not taking the whole input value into - * account. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
                                        - -
                                        - - Required! - - Not valid number! -
                                        - value = {{example.value}}
                                        - myForm.input.$valid = {{myForm.input.$valid}}
                                        - myForm.input.$error = {{myForm.input.$error}}
                                        - myForm.$valid = {{myForm.$valid}}
                                        - myForm.$error.required = {{!!myForm.$error.required}}
                                        -
                                        -
                                        - - var value = element(by.binding('example.value')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('example.value')); - - it('should initialize to model', function() { - expect(value.getText()).toContain('12'); - expect(valid.getText()).toContain('true'); - }); - - it('should be invalid if empty', function() { - input.clear(); - input.sendKeys(''); - expect(value.getText()).toEqual('value ='); - expect(valid.getText()).toContain('false'); - }); - - it('should be invalid if over max', function() { - input.clear(); - input.sendKeys('123'); - expect(value.getText()).toEqual('value ='); - expect(valid.getText()).toContain('false'); - }); - -
                                        - */ - 'number': numberInputType, - - - /** - * @ngdoc input - * @name input[url] - * - * @description - * Text input with URL validation. Sets the `url` validation error key if the content is not a - * valid URL. - * - *
                                        - * **Note:** `input[url]` uses a regex to validate urls that is derived from the regex - * used in Chromium. If you need stricter validation, you can use `ng-pattern` or modify - * the built-in validators (see the {@link guide/forms Forms guide}) - *
                                        - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of - * any length. - * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string - * that contains the regular expression body that will be converted to a regular expression - * as in the ngPattern directive. - * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} - * does not match a RegExp found by evaluating the Angular expression given in the attribute value. - * If the expression evaluates to a RegExp object, then this is used directly. - * If the expression evaluates to a string, then it will be converted to a RegExp - * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to - * `new RegExp('^abc$')`.
                                        - * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to - * start at the index of the last search's match, thus not taking the whole input value into - * account. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
                                        -
                                        - - var text = element(by.binding('url.text')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('url.text')); - - it('should initialize to model', function() { - expect(text.getText()).toContain('http://google.com'); - expect(valid.getText()).toContain('true'); - }); - - it('should be invalid if empty', function() { - input.clear(); - input.sendKeys(''); - - expect(text.getText()).toEqual('text ='); - expect(valid.getText()).toContain('false'); - }); - - it('should be invalid if not url', function() { - input.clear(); - input.sendKeys('box'); - - expect(valid.getText()).toContain('false'); - }); - -
                                        - */ - 'url': urlInputType, - - - /** - * @ngdoc input - * @name input[email] - * - * @description - * Text input with email validation. Sets the `email` validation error key if not a valid email - * address. - * - *
                                        - * **Note:** `input[email]` uses a regex to validate email addresses that is derived from the regex - * used in Chromium. If you need stricter validation (e.g. requiring a top-level domain), you can - * use `ng-pattern` or modify the built-in validators (see the {@link guide/forms Forms guide}) - *
                                        - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of - * any length. - * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string - * that contains the regular expression body that will be converted to a regular expression - * as in the ngPattern directive. - * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} - * does not match a RegExp found by evaluating the Angular expression given in the attribute value. - * If the expression evaluates to a RegExp object, then this is used directly. - * If the expression evaluates to a string, then it will be converted to a RegExp - * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to - * `new RegExp('^abc$')`.
                                        - * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to - * start at the index of the last search's match, thus not taking the whole input value into - * account. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
                                        - -
                                        - - Required! - - Not valid email! -
                                        - text = {{email.text}}
                                        - myForm.input.$valid = {{myForm.input.$valid}}
                                        - myForm.input.$error = {{myForm.input.$error}}
                                        - myForm.$valid = {{myForm.$valid}}
                                        - myForm.$error.required = {{!!myForm.$error.required}}
                                        - myForm.$error.email = {{!!myForm.$error.email}}
                                        -
                                        -
                                        - - var text = element(by.binding('email.text')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('email.text')); - - it('should initialize to model', function() { - expect(text.getText()).toContain('me@example.com'); - expect(valid.getText()).toContain('true'); - }); - - it('should be invalid if empty', function() { - input.clear(); - input.sendKeys(''); - expect(text.getText()).toEqual('text ='); - expect(valid.getText()).toContain('false'); - }); - - it('should be invalid if not email', function() { - input.clear(); - input.sendKeys('xxx'); - - expect(valid.getText()).toContain('false'); - }); - -
                                        - */ - 'email': emailInputType, - - - /** - * @ngdoc input - * @name input[radio] - * - * @description - * HTML radio button. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string} value The value to which the `ngModel` expression should be set when selected. - * Note that `value` only supports `string` values, i.e. the scope model needs to be a string, - * too. Use `ngValue` if you need complex models (`number`, `object`, ...). - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * @param {string} ngValue Angular expression to which `ngModel` will be be set when the radio - * is selected. Should be used instead of the `value` attribute if you need - * a non-string `ngModel` (`boolean`, `array`, ...). - * - * @example - - - -
                                        -
                                        -
                                        -
                                        - color = {{color.name | json}}
                                        -
                                        - Note that `ng-value="specialValue"` sets radio item's value to be the value of `$scope.specialValue`. -
                                        - - it('should change state', function() { - var color = element(by.binding('color.name')); - - expect(color.getText()).toContain('blue'); - - element.all(by.model('color.name')).get(0).click(); - - expect(color.getText()).toContain('red'); - }); - -
                                        - */ - 'radio': radioInputType, - - - /** - * @ngdoc input - * @name input[checkbox] - * - * @description - * HTML checkbox. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {expression=} ngTrueValue The value to which the expression should be set when selected. - * @param {expression=} ngFalseValue The value to which the expression should be set when not selected. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
                                        -
                                        -
                                        - value1 = {{checkboxModel.value1}}
                                        - value2 = {{checkboxModel.value2}}
                                        -
                                        -
                                        - - it('should change state', function() { - var value1 = element(by.binding('checkboxModel.value1')); - var value2 = element(by.binding('checkboxModel.value2')); - - expect(value1.getText()).toContain('true'); - expect(value2.getText()).toContain('YES'); - - element(by.model('checkboxModel.value1')).click(); - element(by.model('checkboxModel.value2')).click(); - - expect(value1.getText()).toContain('false'); - expect(value2.getText()).toContain('NO'); - }); - -
                                        - */ - 'checkbox': checkboxInputType, - - 'hidden': noop, - 'button': noop, - 'submit': noop, - 'reset': noop, - 'file': noop -}; - -function stringBasedInputType(ctrl) { - ctrl.$formatters.push(function(value) { - return ctrl.$isEmpty(value) ? value : value.toString(); - }); -} - -function textInputType(scope, element, attr, ctrl, $sniffer, $browser) { - baseInputType(scope, element, attr, ctrl, $sniffer, $browser); - stringBasedInputType(ctrl); -} - -function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) { - var type = lowercase(element[0].type); - - // In composition mode, users are still inputing intermediate text buffer, - // hold the listener until composition is done. - // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent - if (!$sniffer.android) { - var composing = false; - - element.on('compositionstart', function() { - composing = true; - }); - - element.on('compositionend', function() { - composing = false; - listener(); - }); - } - - var timeout; - - var listener = function(ev) { - if (timeout) { - $browser.defer.cancel(timeout); - timeout = null; - } - if (composing) return; - var value = element.val(), - event = ev && ev.type; - - // By default we will trim the value - // If the attribute ng-trim exists we will avoid trimming - // If input type is 'password', the value is never trimmed - if (type !== 'password' && (!attr.ngTrim || attr.ngTrim !== 'false')) { - value = trim(value); - } - - // If a control is suffering from bad input (due to native validators), browsers discard its - // value, so it may be necessary to revalidate (by calling $setViewValue again) even if the - // control's value is the same empty value twice in a row. - if (ctrl.$viewValue !== value || (value === '' && ctrl.$$hasNativeValidators)) { - ctrl.$setViewValue(value, event); - } - }; - - // if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the - // input event on backspace, delete or cut - if ($sniffer.hasEvent('input')) { - element.on('input', listener); - } else { - var deferListener = function(ev, input, origValue) { - if (!timeout) { - timeout = $browser.defer(function() { - timeout = null; - if (!input || input.value !== origValue) { - listener(ev); - } - }); - } - }; - - element.on('keydown', function(event) { - var key = event.keyCode; - - // ignore - // command modifiers arrows - if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return; - - deferListener(event, this, this.value); - }); - - // if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it - if ($sniffer.hasEvent('paste')) { - element.on('paste cut', deferListener); - } - } - - // if user paste into input using mouse on older browser - // or form autocomplete on newer browser, we need "change" event to catch it - element.on('change', listener); - - // Some native input types (date-family) have the ability to change validity without - // firing any input/change events. - // For these event types, when native validators are present and the browser supports the type, - // check for validity changes on various DOM events. - if (PARTIAL_VALIDATION_TYPES[type] && ctrl.$$hasNativeValidators && type === attr.type) { - element.on(PARTIAL_VALIDATION_EVENTS, function(ev) { - if (!timeout) { - var validity = this[VALIDITY_STATE_PROPERTY]; - var origBadInput = validity.badInput; - var origTypeMismatch = validity.typeMismatch; - timeout = $browser.defer(function() { - timeout = null; - if (validity.badInput !== origBadInput || validity.typeMismatch !== origTypeMismatch) { - listener(ev); - } - }); - } - }); - } - - ctrl.$render = function() { - // Workaround for Firefox validation #12102. - var value = ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue; - if (element.val() !== value) { - element.val(value); - } - }; -} - -function weekParser(isoWeek, existingDate) { - if (isDate(isoWeek)) { - return isoWeek; - } - - if (isString(isoWeek)) { - WEEK_REGEXP.lastIndex = 0; - var parts = WEEK_REGEXP.exec(isoWeek); - if (parts) { - var year = +parts[1], - week = +parts[2], - hours = 0, - minutes = 0, - seconds = 0, - milliseconds = 0, - firstThurs = getFirstThursdayOfYear(year), - addDays = (week - 1) * 7; - - if (existingDate) { - hours = existingDate.getHours(); - minutes = existingDate.getMinutes(); - seconds = existingDate.getSeconds(); - milliseconds = existingDate.getMilliseconds(); - } - - return new Date(year, 0, firstThurs.getDate() + addDays, hours, minutes, seconds, milliseconds); - } - } - - return NaN; -} - -function createDateParser(regexp, mapping) { - return function(iso, date) { - var parts, map; - - if (isDate(iso)) { - return iso; - } - - if (isString(iso)) { - // When a date is JSON'ified to wraps itself inside of an extra - // set of double quotes. This makes the date parsing code unable - // to match the date string and parse it as a date. - if (iso.charAt(0) == '"' && iso.charAt(iso.length - 1) == '"') { - iso = iso.substring(1, iso.length - 1); - } - if (ISO_DATE_REGEXP.test(iso)) { - return new Date(iso); - } - regexp.lastIndex = 0; - parts = regexp.exec(iso); - - if (parts) { - parts.shift(); - if (date) { - map = { - yyyy: date.getFullYear(), - MM: date.getMonth() + 1, - dd: date.getDate(), - HH: date.getHours(), - mm: date.getMinutes(), - ss: date.getSeconds(), - sss: date.getMilliseconds() / 1000 - }; - } else { - map = { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 }; - } - - forEach(parts, function(part, index) { - if (index < mapping.length) { - map[mapping[index]] = +part; - } - }); - return new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, map.sss * 1000 || 0); - } - } - - return NaN; - }; -} - -function createDateInputType(type, regexp, parseDate, format) { - return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) { - badInputChecker(scope, element, attr, ctrl); - baseInputType(scope, element, attr, ctrl, $sniffer, $browser); - var timezone = ctrl && ctrl.$options && ctrl.$options.timezone; - var previousDate; - - ctrl.$$parserName = type; - ctrl.$parsers.push(function(value) { - if (ctrl.$isEmpty(value)) return null; - if (regexp.test(value)) { - // Note: We cannot read ctrl.$modelValue, as there might be a different - // parser/formatter in the processing chain so that the model - // contains some different data format! - var parsedDate = parseDate(value, previousDate); - if (timezone) { - parsedDate = convertTimezoneToLocal(parsedDate, timezone); - } - return parsedDate; - } - return undefined; - }); - - ctrl.$formatters.push(function(value) { - if (value && !isDate(value)) { - throw ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value); - } - if (isValidDate(value)) { - previousDate = value; - if (previousDate && timezone) { - previousDate = convertTimezoneToLocal(previousDate, timezone, true); - } - return $filter('date')(value, format, timezone); - } else { - previousDate = null; - return ''; - } - }); - - if (isDefined(attr.min) || attr.ngMin) { - var minVal; - ctrl.$validators.min = function(value) { - return !isValidDate(value) || isUndefined(minVal) || parseDate(value) >= minVal; - }; - attr.$observe('min', function(val) { - minVal = parseObservedDateValue(val); - ctrl.$validate(); - }); - } - - if (isDefined(attr.max) || attr.ngMax) { - var maxVal; - ctrl.$validators.max = function(value) { - return !isValidDate(value) || isUndefined(maxVal) || parseDate(value) <= maxVal; - }; - attr.$observe('max', function(val) { - maxVal = parseObservedDateValue(val); - ctrl.$validate(); - }); - } - - function isValidDate(value) { - // Invalid Date: getTime() returns NaN - return value && !(value.getTime && value.getTime() !== value.getTime()); - } - - function parseObservedDateValue(val) { - return isDefined(val) && !isDate(val) ? parseDate(val) || undefined : val; - } - }; -} - -function badInputChecker(scope, element, attr, ctrl) { - var node = element[0]; - var nativeValidation = ctrl.$$hasNativeValidators = isObject(node.validity); - if (nativeValidation) { - ctrl.$parsers.push(function(value) { - var validity = element.prop(VALIDITY_STATE_PROPERTY) || {}; - return validity.badInput || validity.typeMismatch ? undefined : value; - }); - } -} - -function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { - badInputChecker(scope, element, attr, ctrl); - baseInputType(scope, element, attr, ctrl, $sniffer, $browser); - - ctrl.$$parserName = 'number'; - ctrl.$parsers.push(function(value) { - if (ctrl.$isEmpty(value)) return null; - if (NUMBER_REGEXP.test(value)) return parseFloat(value); - return undefined; - }); - - ctrl.$formatters.push(function(value) { - if (!ctrl.$isEmpty(value)) { - if (!isNumber(value)) { - throw ngModelMinErr('numfmt', 'Expected `{0}` to be a number', value); - } - value = value.toString(); - } - return value; - }); - - if (isDefined(attr.min) || attr.ngMin) { - var minVal; - ctrl.$validators.min = function(value) { - return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal; - }; - - attr.$observe('min', function(val) { - if (isDefined(val) && !isNumber(val)) { - val = parseFloat(val, 10); - } - minVal = isNumber(val) && !isNaN(val) ? val : undefined; - // TODO(matsko): implement validateLater to reduce number of validations - ctrl.$validate(); - }); - } - - if (isDefined(attr.max) || attr.ngMax) { - var maxVal; - ctrl.$validators.max = function(value) { - return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal; - }; - - attr.$observe('max', function(val) { - if (isDefined(val) && !isNumber(val)) { - val = parseFloat(val, 10); - } - maxVal = isNumber(val) && !isNaN(val) ? val : undefined; - // TODO(matsko): implement validateLater to reduce number of validations - ctrl.$validate(); - }); - } -} - -function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) { - // Note: no badInputChecker here by purpose as `url` is only a validation - // in browsers, i.e. we can always read out input.value even if it is not valid! - baseInputType(scope, element, attr, ctrl, $sniffer, $browser); - stringBasedInputType(ctrl); - - ctrl.$$parserName = 'url'; - ctrl.$validators.url = function(modelValue, viewValue) { - var value = modelValue || viewValue; - return ctrl.$isEmpty(value) || URL_REGEXP.test(value); - }; -} - -function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) { - // Note: no badInputChecker here by purpose as `url` is only a validation - // in browsers, i.e. we can always read out input.value even if it is not valid! - baseInputType(scope, element, attr, ctrl, $sniffer, $browser); - stringBasedInputType(ctrl); - - ctrl.$$parserName = 'email'; - ctrl.$validators.email = function(modelValue, viewValue) { - var value = modelValue || viewValue; - return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value); - }; -} - -function radioInputType(scope, element, attr, ctrl) { - // make the name unique, if not defined - if (isUndefined(attr.name)) { - element.attr('name', nextUid()); - } - - var listener = function(ev) { - if (element[0].checked) { - ctrl.$setViewValue(attr.value, ev && ev.type); - } - }; - - element.on('click', listener); - - ctrl.$render = function() { - var value = attr.value; - element[0].checked = (value == ctrl.$viewValue); - }; - - attr.$observe('value', ctrl.$render); -} - -function parseConstantExpr($parse, context, name, expression, fallback) { - var parseFn; - if (isDefined(expression)) { - parseFn = $parse(expression); - if (!parseFn.constant) { - throw ngModelMinErr('constexpr', 'Expected constant expression for `{0}`, but saw ' + - '`{1}`.', name, expression); - } - return parseFn(context); - } - return fallback; -} - -function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) { - var trueValue = parseConstantExpr($parse, scope, 'ngTrueValue', attr.ngTrueValue, true); - var falseValue = parseConstantExpr($parse, scope, 'ngFalseValue', attr.ngFalseValue, false); - - var listener = function(ev) { - ctrl.$setViewValue(element[0].checked, ev && ev.type); - }; - - element.on('click', listener); - - ctrl.$render = function() { - element[0].checked = ctrl.$viewValue; - }; - - // Override the standard `$isEmpty` because the $viewValue of an empty checkbox is always set to `false` - // This is because of the parser below, which compares the `$modelValue` with `trueValue` to convert - // it to a boolean. - ctrl.$isEmpty = function(value) { - return value === false; - }; - - ctrl.$formatters.push(function(value) { - return equals(value, trueValue); - }); - - ctrl.$parsers.push(function(value) { - return value ? trueValue : falseValue; - }); -} - - -/** - * @ngdoc directive - * @name textarea - * @restrict E - * - * @description - * HTML textarea element control with angular data-binding. The data-binding and validation - * properties of this element are exactly the same as those of the - * {@link ng.directive:input input element}. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any - * length. - * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} - * does not match a RegExp found by evaluating the Angular expression given in the attribute value. - * If the expression evaluates to a RegExp object, then this is used directly. - * If the expression evaluates to a string, then it will be converted to a RegExp - * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to - * `new RegExp('^abc$')`.
                                        - * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to - * start at the index of the last search's match, thus not taking the whole input value into - * account. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. - */ - - -/** - * @ngdoc directive - * @name input - * @restrict E - * - * @description - * HTML input element control. When used together with {@link ngModel `ngModel`}, it provides data-binding, - * input state control, and validation. - * Input control follows HTML5 input types and polyfills the HTML5 validation behavior for older browsers. - * - *
                                        - * **Note:** Not every feature offered is available for all input types. - * Specifically, data binding and event handling via `ng-model` is unsupported for `input[file]`. - *
                                        - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {boolean=} ngRequired Sets `required` attribute if set to true - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any - * length. - * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} - * value does not match a RegExp found by evaluating the Angular expression given in the attribute value. - * If the expression evaluates to a RegExp object, then this is used directly. - * If the expression evaluates to a string, then it will be converted to a RegExp - * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to - * `new RegExp('^abc$')`.
                                        - * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to - * start at the index of the last search's match, thus not taking the whole input value into - * account. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. - * This parameter is ignored for input[type=password] controls, which will never trim the - * input. - * - * @example - - - -
                                        -
                                        - -
                                        - - Required! -
                                        - -
                                        - - Too short! - - Too long! -
                                        -
                                        -
                                        - user = {{user}}
                                        - myForm.userName.$valid = {{myForm.userName.$valid}}
                                        - myForm.userName.$error = {{myForm.userName.$error}}
                                        - myForm.lastName.$valid = {{myForm.lastName.$valid}}
                                        - myForm.lastName.$error = {{myForm.lastName.$error}}
                                        - myForm.$valid = {{myForm.$valid}}
                                        - myForm.$error.required = {{!!myForm.$error.required}}
                                        - myForm.$error.minlength = {{!!myForm.$error.minlength}}
                                        - myForm.$error.maxlength = {{!!myForm.$error.maxlength}}
                                        -
                                        -
                                        - - var user = element(by.exactBinding('user')); - var userNameValid = element(by.binding('myForm.userName.$valid')); - var lastNameValid = element(by.binding('myForm.lastName.$valid')); - var lastNameError = element(by.binding('myForm.lastName.$error')); - var formValid = element(by.binding('myForm.$valid')); - var userNameInput = element(by.model('user.name')); - var userLastInput = element(by.model('user.last')); - - it('should initialize to model', function() { - expect(user.getText()).toContain('{"name":"guest","last":"visitor"}'); - expect(userNameValid.getText()).toContain('true'); - expect(formValid.getText()).toContain('true'); - }); - - it('should be invalid if empty when required', function() { - userNameInput.clear(); - userNameInput.sendKeys(''); - - expect(user.getText()).toContain('{"last":"visitor"}'); - expect(userNameValid.getText()).toContain('false'); - expect(formValid.getText()).toContain('false'); - }); - - it('should be valid if empty when min length is set', function() { - userLastInput.clear(); - userLastInput.sendKeys(''); - - expect(user.getText()).toContain('{"name":"guest","last":""}'); - expect(lastNameValid.getText()).toContain('true'); - expect(formValid.getText()).toContain('true'); - }); - - it('should be invalid if less than required min length', function() { - userLastInput.clear(); - userLastInput.sendKeys('xx'); - - expect(user.getText()).toContain('{"name":"guest"}'); - expect(lastNameValid.getText()).toContain('false'); - expect(lastNameError.getText()).toContain('minlength'); - expect(formValid.getText()).toContain('false'); - }); - - it('should be invalid if longer than max length', function() { - userLastInput.clear(); - userLastInput.sendKeys('some ridiculously long name'); - - expect(user.getText()).toContain('{"name":"guest"}'); - expect(lastNameValid.getText()).toContain('false'); - expect(lastNameError.getText()).toContain('maxlength'); - expect(formValid.getText()).toContain('false'); - }); - -
                                        - */ -var inputDirective = ['$browser', '$sniffer', '$filter', '$parse', - function($browser, $sniffer, $filter, $parse) { - return { - restrict: 'E', - require: ['?ngModel'], - link: { - pre: function(scope, element, attr, ctrls) { - if (ctrls[0]) { - (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer, - $browser, $filter, $parse); - } - } - } - }; -}]; - - - -var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/; -/** - * @ngdoc directive - * @name ngValue - * - * @description - * Binds the given expression to the value of `