From 77a75818d683c09a4a6fc32b7567c004084c518f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Wed, 7 Dec 2011 21:27:16 +0100 Subject: [PATCH] Fixed constraints parsing #2. --- .../Ast/GeneralScope/Constraint.cs | 9 ++-- .../Ast/SimpleType.cs | 23 +++++++++ .../Completion/CSharpCompletionEngineBase.cs | 51 +------------------ .../OutputVisitor/CSharpOutputVisitor.cs | 2 +- .../OutputVisitor/CodeDomConvertVisitor.cs | 2 +- .../Parser/CSharpParser.cs | 2 +- .../Refactoring/TypeSystemAstBuilder.cs | 2 +- .../TypeSystem/TypeSystemConvertVisitor.cs | 2 +- .../ParameterCompletionTests.cs | 27 ++++++++++ .../GeneralScope/DelegateDeclarationTests.cs | 2 +- .../GeneralScope/TypeDeclarationTests.cs | 8 +-- .../TypeMembers/MethodDeclarationTests.cs | 6 +-- .../Visitors/CSharpToVBConverterVisitor.cs | 2 +- 13 files changed, 71 insertions(+), 67 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/Constraint.cs b/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/Constraint.cs index 6d6dc45d0b..4994c215c8 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/Constraint.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/Constraint.cs @@ -38,6 +38,7 @@ namespace ICSharpCode.NRefactory.CSharp { public readonly static Role ColonRole = TypeDeclaration.ColonRole; public readonly static Role BaseTypeRole = TypeDeclaration.BaseTypeRole; + public readonly static Role TypeParameterRole = new Role ("TypeParameter", SimpleType.Null); public override NodeType NodeType { get { @@ -45,12 +46,12 @@ namespace ICSharpCode.NRefactory.CSharp } } - public string TypeParameter { + public SimpleType TypeParameter { get { - return GetChildByRole (Roles.Identifier).Name; + return GetChildByRole (TypeParameterRole); } set { - SetChildByRole(Roles.Identifier, Identifier.Create (value, TextLocation.Empty)); + SetChildByRole(TypeParameterRole, value); } } @@ -66,7 +67,7 @@ namespace ICSharpCode.NRefactory.CSharp protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) { Constraint o = other as Constraint; - return o != null && MatchString(this.TypeParameter, o.TypeParameter) && this.BaseTypes.DoMatch(o.BaseTypes, match); + return o != null && this.TypeParameter.DoMatch (o.TypeParameter, match) && this.BaseTypes.DoMatch(o.BaseTypes, match); } } } diff --git a/ICSharpCode.NRefactory.CSharp/Ast/SimpleType.cs b/ICSharpCode.NRefactory.CSharp/Ast/SimpleType.cs index b038a84802..76481cbb18 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/SimpleType.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/SimpleType.cs @@ -33,6 +33,29 @@ namespace ICSharpCode.NRefactory.CSharp { public class SimpleType : AstType { + #region Null + public new static readonly SimpleType Null = new NullSimpleType (); + + sealed class NullSimpleType : SimpleType + { + public override bool IsNull { + get { + return true; + } + } + + public override S AcceptVisitor (IAstVisitor visitor, T data = default(T)) + { + return default (S); + } + + protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) + { + return other == null || other.IsNull; + } + } + #endregion + public SimpleType() { } diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index 016baee18e..a45bd0ce24 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -402,60 +402,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } else { return null; } -// Print (baseUnit); - /* var member = Unit.GetNodeAt (memberLocation); - var member2 = baseUnit.GetNodeAt (memberLocation); - member2.Remove (); - member.ReplaceWith (member2); - var tsvisitor = new TypeSystemConvertVisitor (ProjectContent, CSharpParsedFile.FileName); - baseUnit.AcceptVisitor (tsvisitor, null);*/ - return Tuple.Create (CSharpParsedFile, (AstNode)expr, baseUnit); - - /* - - /////// - if (currentMember == null && currentType == null) - return null; - - CSharpParser parser = new CSharpParser (); - int startOffset; - if (currentMember != null) { - startOffset = document.Editor.LocationToOffset (currentMember.Region.BeginLine, currentMember.Region.BeginColumn); - } else { - startOffset = document.Editor.LocationToOffset (currentType.Region.BeginLine, currentType.Region.BeginColumn); - } - string memberText = Document.Editor.GetTextBetween (startOffset, Document.Editor.Caret.Offset - 1); - - var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; - StringBuilder wrapper = new StringBuilder (); - wrapper.Append ("class Stub {"); - wrapper.AppendLine (); - wrapper.Append (memberText); - - if (afterBracket) { - wrapper.Append ("();"); - } else { - wrapper.Append ("x);"); - } - - wrapper.Append (" SomeCall (); } } }"); - var stream = new System.IO.StringReader (wrapper.ToString ()); - var baseUnit = parser.Parse (stream, memberLocation.Line - 2); - stream.Close (); - var expr = baseUnit.GetNodeAt (document.Editor.Caret.Line, document.Editor.Caret.Column); - if (expr is InvocationExpression) { - expr = ((InvocationExpression)expr).Target; - } - if (expr == null) - return null; var member = Unit.GetNodeAt (memberLocation); var member2 = baseUnit.GetNodeAt (memberLocation); member2.Remove (); member.ReplaceWith (member2); - - var tsvisitor = new TypeSystemConvertVisitor (ProjectContext, Document.FileName); + var tsvisitor = new TypeSystemConvertVisitor (CSharpParsedFile.FileName); Unit.AcceptVisitor (tsvisitor, null); - return Tuple.Create (tsvisitor.ParsedFile, expr, Unit);*/ + return Tuple.Create (tsvisitor.ParsedFile, (AstNode)expr, Unit); } protected Tuple ResolveExpression (CSharpParsedFile file, AstNode expr, CompilationUnit unit) diff --git a/ICSharpCode.NRefactory.CSharp/OutputVisitor/CSharpOutputVisitor.cs b/ICSharpCode.NRefactory.CSharp/OutputVisitor/CSharpOutputVisitor.cs index 754787408f..b181523522 100644 --- a/ICSharpCode.NRefactory.CSharp/OutputVisitor/CSharpOutputVisitor.cs +++ b/ICSharpCode.NRefactory.CSharp/OutputVisitor/CSharpOutputVisitor.cs @@ -2357,7 +2357,7 @@ namespace ICSharpCode.NRefactory.CSharp StartNode (constraint); Space (); WriteKeyword ("where"); - WriteIdentifier (constraint.TypeParameter); + WriteIdentifier (constraint.TypeParameter.Identifier); Space (); WriteToken (":", Constraint.ColonRole); Space (); diff --git a/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs b/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs index 9ec18b260c..5811de77bb 100644 --- a/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs +++ b/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs @@ -1269,7 +1269,7 @@ namespace ICSharpCode.NRefactory.CSharp CodeTypeParameter tp = new CodeTypeParameter(tpDecl.Name); tp.CustomAttributes.AddRange(Convert(tpDecl.Attributes)); foreach (Constraint constraint in constraints) { - if (constraint.TypeParameter == tp.Name) { + if (constraint.TypeParameter.Identifier == tp.Name) { foreach (AstType baseType in constraint.BaseTypes) { if (baseType is PrimitiveType && ((PrimitiveType)baseType).Keyword == "new") { tp.HasConstructorConstraint = true; diff --git a/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs b/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs index 574ad66bdd..35ca607ef6 100644 --- a/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs +++ b/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs @@ -2414,7 +2414,7 @@ namespace ICSharpCode.NRefactory.CSharp var location = LocationsBag.GetLocations (c); var constraint = new Constraint (); constraint.AddChild (new CSharpTokenNode (Convert (c.Location), "where".Length), InvocationExpression.Roles.Keyword); - constraint.AddChild (new SimpleType (Identifier.Create (c.TypeParameter.Value, Convert (c.TypeParameter.Location))), Constraint.BaseTypeRole); + constraint.AddChild (new SimpleType (Identifier.Create (c.TypeParameter.Value, Convert (c.TypeParameter.Location))), Constraint.TypeParameterRole); if (location != null) constraint.AddChild (new CSharpTokenNode (Convert (location [0]), 1), Constraint.ColonRole); var commaLocs = LocationsBag.GetLocations (c.ConstraintExpressions); diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs index 23e74e0fe4..b1a6a368cb 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs @@ -682,7 +682,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring return null; } Constraint c = new Constraint(); - c.TypeParameter = tp.Name; + c.TypeParameter = new SimpleType (tp.Name); if (tp.HasReferenceTypeConstraint) { c.BaseTypes.Add(new PrimitiveType("class")); } else if (tp.HasValueTypeConstraint) { diff --git a/ICSharpCode.NRefactory.CSharp/TypeSystem/TypeSystemConvertVisitor.cs b/ICSharpCode.NRefactory.CSharp/TypeSystem/TypeSystemConvertVisitor.cs index 983a43c865..38f284b45c 100644 --- a/ICSharpCode.NRefactory.CSharp/TypeSystem/TypeSystemConvertVisitor.cs +++ b/ICSharpCode.NRefactory.CSharp/TypeSystem/TypeSystemConvertVisitor.cs @@ -468,7 +468,7 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem } foreach (Constraint c in constraints) { foreach (var tp in list) { - if (tp.Name == c.TypeParameter) { + if (tp.Name == c.TypeParameter.Identifier) { foreach (AstType type in c.BaseTypes) { PrimitiveType primType = type as PrimitiveType; if (primType != null) { diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs index 68f920d36b..308c2d1b8d 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs @@ -515,6 +515,33 @@ class A Assert.IsNotNull (provider, "provider was not created."); Assert.AreEqual (1, provider.OverloadCount); } + + + [Test()] + public void TestConstructorCase2 () + { + IParameterDataProvider provider = CreateProvider ( +@" +namespace Test +{ + struct TestMe + { + public TestMe (string a) + { + } + } + + class A + { + void Method () + { + $new TestMe ($ + } + } +}"); + Assert.IsNotNull (provider, "provider was not created."); + Assert.AreEqual (2, provider.OverloadCount); + } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/DelegateDeclarationTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/DelegateDeclarationTests.cs index df0e5135aa..92b663daee 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/DelegateDeclarationTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/DelegateDeclarationTests.cs @@ -53,7 +53,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.GeneralScope TypeParameters = { new TypeParameterDeclaration { Name = "T" } }, Constraints = { new Constraint { - TypeParameter = "T", + TypeParameter = new SimpleType ("T"), BaseTypes = { new SimpleType("ICloneable") } } }}); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/TypeDeclarationTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/TypeDeclarationTests.cs index 0aca3db0ee..44d5b34504 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/TypeDeclarationTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/TypeDeclarationTests.cs @@ -109,7 +109,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.GeneralScope TypeParameters = { new TypeParameterDeclaration { Name = "T" } }, Constraints = { new Constraint { - TypeParameter = "T", + TypeParameter = new SimpleType ("T"), BaseTypes = { new SimpleType("IMyInterface") } } }}); @@ -136,7 +136,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.GeneralScope }, Constraints = { new Constraint { - TypeParameter = "S", + TypeParameter = new SimpleType ("S"), BaseTypes = { new SimpleType { Identifier = "G", @@ -146,7 +146,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.GeneralScope } }, new Constraint { - TypeParameter = "T", + TypeParameter = new SimpleType ("T"), BaseTypes = { new MemberType { Target = new SimpleType("MyNamespace"), @@ -240,7 +240,7 @@ public abstract class MyClass : MyBase, Interface1, My.Test.Interface2 }, Constraints = { new Constraint { - TypeParameter = "where", + TypeParameter = new SimpleType ("where"), BaseTypes = { new SimpleType { Identifier = "partial", diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeMembers/MethodDeclarationTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeMembers/MethodDeclarationTests.cs index 463704d4ae..b4c36c12e1 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeMembers/MethodDeclarationTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeMembers/MethodDeclarationTests.cs @@ -149,7 +149,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers Parameters = { new ParameterDeclaration(new SimpleType("T"), "a") }, Constraints = { new Constraint { - TypeParameter = "T", + TypeParameter = new SimpleType ("T"), BaseTypes = { new SimpleType("ISomeInterface") } } }, @@ -176,7 +176,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers Parameters = { new ParameterDeclaration(new SimpleType("T"), "a") }, Constraints = { new Constraint { - TypeParameter = "T", + TypeParameter = new SimpleType ("T"), BaseTypes = { new SimpleType("ISomeInterface") } } } @@ -202,7 +202,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers Parameters = { new ParameterDeclaration(new SimpleType("T"), "a") }, Constraints = { new Constraint { - TypeParameter = "T", + TypeParameter = new SimpleType ("T"), BaseTypes = { new SimpleType("ISomeInterface") } } } diff --git a/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs b/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs index 885a6ac7b4..8ab5fa865a 100644 --- a/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs +++ b/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs @@ -2062,7 +2062,7 @@ namespace ICSharpCode.NRefactory.VB.Visitors var constraint = typeParameterDeclaration.Parent .GetChildrenByRole(CSharp.AstNode.Roles.Constraint) - .SingleOrDefault(c => c.TypeParameter == typeParameterDeclaration.Name); + .SingleOrDefault(c => c.TypeParameter.Identifier == typeParameterDeclaration.Name); if (constraint != null) ConvertNodes(constraint.BaseTypes, param.Constraints);