From dac867d9ed43f9ddbd9274bb1d0d1afbda230ef1 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 5 Jan 2013 07:04:00 +0100 Subject: [PATCH] Fix pattern matching for ComposedType.BaseType. --- .../Ast/ComposedType.cs | 4 +- .../Ast/GeneralScope/AttributeSection.cs | 15 +---- .../PatternMatchingTest.cs | 66 +++++++++++++++++++ .../Expression/TypeOfExpressionTests.cs | 2 +- 4 files changed, 71 insertions(+), 16 deletions(-) create mode 100644 ICSharpCode.NRefactory.ConsistencyCheck/PatternMatchingTest.cs diff --git a/ICSharpCode.NRefactory.CSharp/Ast/ComposedType.cs b/ICSharpCode.NRefactory.CSharp/Ast/ComposedType.cs index 859b2cbb2d..2b274fa308 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/ComposedType.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/ComposedType.cs @@ -92,7 +92,9 @@ namespace ICSharpCode.NRefactory.CSharp protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) { ComposedType o = other as ComposedType; - return o != null && this.HasNullableSpecifier == o.HasNullableSpecifier && this.PointerRank == o.PointerRank && this.ArraySpecifiers.DoMatch(o.ArraySpecifiers, match); + return o != null && this.HasNullableSpecifier == o.HasNullableSpecifier && this.PointerRank == o.PointerRank + && this.BaseType.DoMatch(o.BaseType, match) + && this.ArraySpecifiers.DoMatch(o.ArraySpecifiers, match); } public override string ToString() diff --git a/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/AttributeSection.cs b/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/AttributeSection.cs index cd065b9c14..67b04412b1 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/AttributeSection.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/AttributeSection.cs @@ -135,7 +135,7 @@ namespace ICSharpCode.NRefactory.CSharp protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) { AttributeSection o = other as AttributeSection; - return o != null && this.AttributeTarget == o.AttributeTarget && this.Attributes.DoMatch(o.Attributes, match); + return o != null && MatchString(this.AttributeTarget, o.AttributeTarget) && this.Attributes.DoMatch(o.Attributes, match); } public AttributeSection() @@ -171,17 +171,4 @@ namespace ICSharpCode.NRefactory.CSharp // } // } } - - public enum AttributeTarget { - None, - Assembly, - Module, - - Type, - Param, - Field, - Return, - Method, - Unknown - } } diff --git a/ICSharpCode.NRefactory.ConsistencyCheck/PatternMatchingTest.cs b/ICSharpCode.NRefactory.ConsistencyCheck/PatternMatchingTest.cs new file mode 100644 index 0000000000..6c35b9f000 --- /dev/null +++ b/ICSharpCode.NRefactory.ConsistencyCheck/PatternMatchingTest.cs @@ -0,0 +1,66 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Linq; +using ICSharpCode.NRefactory.CSharp; +using ICSharpCode.NRefactory.PatternMatching; + +namespace ICSharpCode.NRefactory.ConsistencyCheck +{ + /// + /// Validates pattern matching: + /// Every compilation must match its clone; + /// and mutations to the cloned compilation must prevent the match. + /// + /// + /// This test is SLOW! (due to O(n^2) algorithm). + /// Expect it to take a whole hour! + /// + public class PatternMatchingTest + { + public static void RunTest(CSharpFile file) + { + AstNode copy = file.SyntaxTree.Clone(); + if (!copy.IsMatch(file.SyntaxTree)) + throw new InvalidOperationException("Clone must match the compilation itself; in " + file.FileName); + + // Mutate identifiers: + foreach (var id in copy.Descendants.OfType()) { + if (id.Parent is ConstructorDeclaration || id.Parent is DestructorDeclaration) + continue; // identifier in ctor/dtor isn't relevant for matches + string oldName = id.Name; + id.Name = "mutatedName"; + if (copy.IsMatch(file.SyntaxTree)) + throw new InvalidOperationException("Mutation in " + id.StartLocation + " did not prevent the match; in " + file.FileName); + id.Name = oldName; + //if (!copy.IsMatch(file.SyntaxTree)) + // throw new InvalidOperationException("Clone must match the compilation itself after resetting the mutation"); + } + // Mutate primitive values: + foreach (var pe in copy.Descendants.OfType()) { + object oldVal = pe.Value; + pe.Value = "Mutated " + "Value"; + if (copy.IsMatch(file.SyntaxTree)) + throw new InvalidOperationException("Mutation in " + pe.StartLocation + " did not prevent the match; in " + file.FileName); + pe.Value = oldVal; + } + Console.Write('.'); + } + } +} diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Parser/Expression/TypeOfExpressionTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Parser/Expression/TypeOfExpressionTests.cs index e966906370..581cfc2651 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Parser/Expression/TypeOfExpressionTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Parser/Expression/TypeOfExpressionTests.cs @@ -118,7 +118,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.Expression "typeof(MyStruct?)", new TypeOfExpression { Type = new ComposedType { - BaseType = new SimpleType("MyType"), + BaseType = new SimpleType("MyStruct"), HasNullableSpecifier = true }}); }