Browse Source

Fixed constraints parsing #2.

newNRvisualizers
Mike Krüger 14 years ago
parent
commit
77a75818d6
  1. 9
      ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/Constraint.cs
  2. 23
      ICSharpCode.NRefactory.CSharp/Ast/SimpleType.cs
  3. 51
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs
  4. 2
      ICSharpCode.NRefactory.CSharp/OutputVisitor/CSharpOutputVisitor.cs
  5. 2
      ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs
  6. 2
      ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs
  7. 2
      ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs
  8. 2
      ICSharpCode.NRefactory.CSharp/TypeSystem/TypeSystemConvertVisitor.cs
  9. 27
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs
  10. 2
      ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/DelegateDeclarationTests.cs
  11. 8
      ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/TypeDeclarationTests.cs
  12. 6
      ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeMembers/MethodDeclarationTests.cs
  13. 2
      ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs

9
ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/Constraint.cs

@ -38,6 +38,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -38,6 +38,7 @@ namespace ICSharpCode.NRefactory.CSharp
{
public readonly static Role<CSharpTokenNode> ColonRole = TypeDeclaration.ColonRole;
public readonly static Role<AstType> BaseTypeRole = TypeDeclaration.BaseTypeRole;
public readonly static Role<SimpleType> TypeParameterRole = new Role<SimpleType> ("TypeParameter", SimpleType.Null);
public override NodeType NodeType {
get {
@ -45,12 +46,12 @@ namespace ICSharpCode.NRefactory.CSharp @@ -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 @@ -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);
}
}
}

23
ICSharpCode.NRefactory.CSharp/Ast/SimpleType.cs

@ -33,6 +33,29 @@ namespace ICSharpCode.NRefactory.CSharp @@ -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<T, S> (IAstVisitor<T, S> 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()
{
}

51
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs

@ -402,60 +402,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -402,60 +402,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
} else {
return null;
}
// Print (baseUnit);
/* var member = Unit.GetNodeAt<AttributedNode> (memberLocation);
var member2 = baseUnit.GetNodeAt<AttributedNode> (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<Expression> (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<AttributedNode> (memberLocation);
var member2 = baseUnit.GetNodeAt<AttributedNode> (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<ResolveResult, CSharpResolver> ResolveExpression (CSharpParsedFile file, AstNode expr, CompilationUnit unit)

2
ICSharpCode.NRefactory.CSharp/OutputVisitor/CSharpOutputVisitor.cs

@ -2357,7 +2357,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -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 ();

2
ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs

@ -1269,7 +1269,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -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;

2
ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs

@ -2414,7 +2414,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -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);

2
ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs

@ -682,7 +682,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -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) {

2
ICSharpCode.NRefactory.CSharp/TypeSystem/TypeSystemConvertVisitor.cs

@ -468,7 +468,7 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem @@ -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) {

27
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs

@ -515,6 +515,33 @@ class A @@ -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);
}
}

2
ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/DelegateDeclarationTests.cs

@ -53,7 +53,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.GeneralScope @@ -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") }
}
}});

8
ICSharpCode.NRefactory.Tests/CSharp/Parser/GeneralScope/TypeDeclarationTests.cs

@ -109,7 +109,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.GeneralScope @@ -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 @@ -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 @@ -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 @@ -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",

6
ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeMembers/MethodDeclarationTests.cs

@ -149,7 +149,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser.TypeMembers @@ -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 @@ -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 @@ -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") }
}
}

2
ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs

@ -2062,7 +2062,7 @@ namespace ICSharpCode.NRefactory.VB.Visitors @@ -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);

Loading…
Cancel
Save