Browse Source

Fixed some create class declaration issues.

pull/32/merge
Mike Krüger 13 years ago
parent
commit
97838157d7
  1. 8
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/CreateClassDeclarationAction.cs
  2. 22
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/CreateFieldAction.cs
  3. 61
      ICSharpCode.NRefactory.Tests/CSharp/CodeActions/CreateClassDeclarationTests.cs

8
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/CreateClassDeclarationAction.cs

@ -36,14 +36,14 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
{ {
public IEnumerable<CodeAction> GetActions(RefactoringContext context) public IEnumerable<CodeAction> GetActions(RefactoringContext context)
{ {
var createExpression = context.GetNode<ObjectCreateExpression>();
if (createExpression != null)
return GetActions(context, createExpression);
var simpleType = context.GetNode<SimpleType>(); var simpleType = context.GetNode<SimpleType>();
if (simpleType != null && !(simpleType.Parent is EventDeclaration || simpleType.Parent is CustomEventDeclaration)) if (simpleType != null && !(simpleType.Parent is EventDeclaration || simpleType.Parent is CustomEventDeclaration))
return GetActions(context, simpleType); return GetActions(context, simpleType);
var createExpression = context.GetNode<ObjectCreateExpression>();
if (createExpression != null)
return GetActions(context, createExpression);
var identifier = context.GetNode<IdentifierExpression>(); var identifier = context.GetNode<IdentifierExpression>();
if (identifier != null && (identifier.Parent is MemberReferenceExpression)) if (identifier != null && (identifier.Parent is MemberReferenceExpression))
return GetActions(context, identifier); return GetActions(context, identifier);

22
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/CreateFieldAction.cs

@ -292,13 +292,21 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
public static IType GuessType(RefactoringContext context, AstNode expr) public static IType GuessType(RefactoringContext context, AstNode expr)
{ {
if (expr is SimpleType && expr.Role == Roles.TypeArgument && (expr.Parent is MemberReferenceExpression || expr.Parent is IdentifierExpression)) { if (expr is SimpleType && expr.Role == Roles.TypeArgument) {
var rr = context.Resolve (expr.Parent); if (expr.Parent is MemberReferenceExpression || expr.Parent is IdentifierExpression) {
var argumentNumber = expr.Parent.GetChildrenByRole (Roles.TypeArgument).TakeWhile (c => c != expr).Count (); var rr = context.Resolve (expr.Parent);
var argumentNumber = expr.Parent.GetChildrenByRole (Roles.TypeArgument).TakeWhile (c => c != expr).Count ();
var mgrr = rr as MethodGroupResolveResult;
if (mgrr != null && mgrr.Methods.Any () && mgrr.Methods.First ().TypeArguments.Count > argumentNumber) { var mgrr = rr as MethodGroupResolveResult;
return mgrr.Methods.First ().TypeParameters[argumentNumber]; if (mgrr != null && mgrr.Methods.Any () && mgrr.Methods.First ().TypeArguments.Count > argumentNumber)
return mgrr.Methods.First ().TypeParameters[argumentNumber];
} else if (expr.Parent is MemberType || expr.Parent is SimpleType) {
var rr = context.Resolve (expr.Parent);
var argumentNumber = expr.Parent.GetChildrenByRole (Roles.TypeArgument).TakeWhile (c => c != expr).Count ();
var mgrr = rr as TypeResolveResult;
if (mgrr != null && mgrr.Type.TypeParameterCount > argumentNumber) {
return mgrr.Type.GetDefinition ().TypeParameters[argumentNumber];
}
} }
} }

61
ICSharpCode.NRefactory.Tests/CSharp/CodeActions/CreateClassDeclarationTests.cs

@ -485,5 +485,66 @@ public class Test
"); ");
} }
[Test]
public void TestClassTypeParameter ()
{
Test<CreateClassDeclarationAction> (
@"
public class Test
{
public class Generate<T> where T : struct {}
public void FooBar ()
{
Generate<$Data> foo;
}
}
", @"
public struct Data
{
}
public class Test
{
public class Generate<T> where T : struct {}
public void FooBar ()
{
Generate<Data> foo;
}
}
");
}
[Test]
public void TestClassTypeParameterCase2 ()
{
Test<CreateClassDeclarationAction> (
@"
public class Test
{
public class Generate<T> where T : struct {}
public void FooBar ()
{
new Generate<$Data> ();
}
}
", @"
public struct Data
{
}
public class Test
{
public class Generate<T> where T : struct {}
public void FooBar ()
{
new Generate<Data> ();
}
}
");
}
} }
} }

Loading…
Cancel
Save