From b7fcc55308c1f332384790ed0a4c382add03f1ce Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Mon, 26 Sep 2011 14:27:30 +0200 Subject: [PATCH] Re-enable resolver unit tests that failed due to the parser returning incorrect positions. Fixed a bug that caused array initializers to fail to resolve when the parent variable initializer was not being resolved. --- ICSharpCode.NRefactory.CSharp/Ast/AstNode.cs | 4 ++-- .../Ast/GeneralScope/TypeParameterDeclaration.cs | 2 +- .../Resolver/ResolveVisitor.cs | 4 ++-- .../CSharp/Resolver/ArrayCreateTests.cs | 1 - .../CSharp/Resolver/LambdaTests.cs | 2 +- .../CSharp/Resolver/NameLookupTests.cs | 2 +- .../CSharp/Resolver/ObjectCreationTests.cs | 8 ++++---- .../CSharp/Resolver/ResolveAtLocationTests.cs | 4 ++-- ICSharpCode.NRefactory/PatternMatching/Pattern.cs | 11 +++++++++++ 9 files changed, 24 insertions(+), 14 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Ast/AstNode.cs b/ICSharpCode.NRefactory.CSharp/Ast/AstNode.cs index a09dc9f1c9..5135120bf9 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/AstNode.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/AstNode.cs @@ -444,9 +444,9 @@ namespace ICSharpCode.NRefactory.CSharp public abstract S AcceptVisitor (IAstVisitor visitor, T data = default(T)); #region Pattern Matching - protected static bool MatchString (string name1, string name2) + protected static bool MatchString (string pattern, string text) { - return string.IsNullOrEmpty (name1) || name1 == name2; + return PatternMatching.Pattern.MatchString(pattern, text); } protected internal abstract bool DoMatch (AstNode other, PatternMatching.Match match); diff --git a/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/TypeParameterDeclaration.cs b/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/TypeParameterDeclaration.cs index afa3122a57..d7a38e958c 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/TypeParameterDeclaration.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/TypeParameterDeclaration.cs @@ -31,7 +31,7 @@ namespace ICSharpCode.NRefactory.CSharp public class TypeParameterDeclaration : AstNode { public static readonly Role AttributeRole = AttributedNode.AttributeRole; - public static readonly Role VarianceRole = new Role("Variance"); + public static readonly Role VarianceRole = new Role("Variance", CSharpTokenNode.Null); public override NodeType NodeType { get { return NodeType.Unknown; } diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs b/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs index 39ca25c072..079a7a6af7 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs @@ -604,7 +604,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver ResolveResult IAstVisitor.VisitVariableInitializer(VariableInitializer variableInitializer, object data) { - if (resolverEnabled) { + ArrayInitializerExpression aie = variableInitializer.Initializer as ArrayInitializerExpression; + if (resolverEnabled || aie != null) { ResolveResult result = errorResult; if (variableInitializer.Parent is FieldDeclaration || variableInitializer.Parent is EventDeclaration) { if (resolver.CurrentMember != null) { @@ -620,7 +621,6 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver } } } - ArrayInitializerExpression aie = variableInitializer.Initializer as ArrayInitializerExpression; ArrayType arrayType = result.Type as ArrayType; if (aie != null && arrayType != null) { StoreState(aie, resolver.Clone()); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/ArrayCreateTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/ArrayCreateTests.cs index a3d45f6c08..8f0d437d5e 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/ArrayCreateTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/ArrayCreateTests.cs @@ -23,7 +23,6 @@ using NUnit.Framework; namespace ICSharpCode.NRefactory.CSharp.Resolver { [TestFixture] - [Ignore("Parser produces incorrect positions")] public class ArrayCreateTests : ResolverTestBase { [Test] diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/LambdaTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/LambdaTests.cs index c17e2cbdeb..94f9dfd2da 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/LambdaTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/LambdaTests.cs @@ -145,7 +145,7 @@ class TestClass { Assert.AreEqual("System.Int32", lrr.Type.ReflectionName); } - [Test, Ignore("Fails due to parser problem")] + [Test] public void LambdaInInferred2DArrayInitializer() { string program = @"using System; diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/NameLookupTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/NameLookupTests.cs index 6c477d8514..39c2c06012 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/NameLookupTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/NameLookupTests.cs @@ -848,7 +848,7 @@ class B Assert.AreEqual("B.x", mrr.Member.FullName); } - [Test, Ignore("Parser produces incorrect positions")] + [Test] public void SubstituteClassAndMethodTypeParametersAtOnce() { string program = @"class C { static void M(X a, T b) { $C.M$(b, a); } }"; diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/ObjectCreationTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/ObjectCreationTests.cs index 95186ca452..9669d5984f 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/ObjectCreationTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/ObjectCreationTests.cs @@ -111,7 +111,7 @@ class A { Assert.AreEqual(0, result.Member.Parameters.Count); } - [Test, Ignore("Parser returns incorrect positions")] + [Test] public void ChainedConstructorCall() { string program = @"using System; @@ -133,13 +133,13 @@ class C : B { {} } "; - InvocationResolveResult mrr = Resolve(program.Replace("base(b)", "$base(b)$")); + InvocationResolveResult mrr = Resolve(program.Replace("base(b)", "$base(b)$")); Assert.AreEqual("A..ctor", mrr.Member.FullName); - mrr = Resolve(program.Replace("base(c)", "$base(c)$")); + mrr = Resolve(program.Replace("base(c)", "$base(c)$")); Assert.AreEqual("B..ctor", mrr.Member.FullName); - mrr = Resolve(program.Replace("this(0)", "$this(0)$")); + mrr = Resolve(program.Replace("this(0)", "$this(0)$")); Assert.AreEqual("C..ctor", mrr.Member.FullName); } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/ResolveAtLocationTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/ResolveAtLocationTests.cs index b6d6bae85d..171cb3718f 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/ResolveAtLocationTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/ResolveAtLocationTests.cs @@ -68,10 +68,10 @@ class A { void M() { Assert.AreEqual("System.Int32", rr.Type.FullName); } - [Test, Ignore("Parser returns incorrect positions")] + [Test] public void BaseCtorCall() { - var rr = ResolveAtLocation(@"using System; + var rr = ResolveAtLocation(@"using System; class A { public A() : ba$se() {} }"); Assert.AreEqual("System.Object..ctor", rr.Member.FullName); } diff --git a/ICSharpCode.NRefactory/PatternMatching/Pattern.cs b/ICSharpCode.NRefactory/PatternMatching/Pattern.cs index d39b5713df..c3d22cce44 100644 --- a/ICSharpCode.NRefactory/PatternMatching/Pattern.cs +++ b/ICSharpCode.NRefactory/PatternMatching/Pattern.cs @@ -28,6 +28,17 @@ namespace ICSharpCode.NRefactory.PatternMatching /// public abstract class Pattern : INode { + /// + /// Gets the string that matches any string. + /// + public static readonly string AnyString = string.Empty; + // TODO: use something other than string.Empty so that 'no value' and 'any value' can be distinguished + + public static bool MatchString(string pattern, string text) + { + return string.IsNullOrEmpty(pattern) || pattern == text; + } + internal struct PossibleMatch { public readonly INode NextOther; // next node after the last matched node