diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/CreateClassDeclarationAction.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/CreateClassDeclarationAction.cs index 8f98e54ee3..1e05760d40 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/CreateClassDeclarationAction.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/CreateClassDeclarationAction.cs @@ -36,14 +36,14 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring { public IEnumerable GetActions(RefactoringContext context) { - var createExpression = context.GetNode(); - if (createExpression != null) - return GetActions(context, createExpression); - var simpleType = context.GetNode(); if (simpleType != null && !(simpleType.Parent is EventDeclaration || simpleType.Parent is CustomEventDeclaration)) return GetActions(context, simpleType); + var createExpression = context.GetNode(); + if (createExpression != null) + return GetActions(context, createExpression); + var identifier = context.GetNode(); if (identifier != null && (identifier.Parent is MemberReferenceExpression)) return GetActions(context, identifier); diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/CreateFieldAction.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/CreateFieldAction.cs index 332cbc5b8d..292472e919 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/CreateFieldAction.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/CreateFieldAction.cs @@ -292,13 +292,21 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring public static IType GuessType(RefactoringContext context, AstNode expr) { - if (expr is SimpleType && expr.Role == Roles.TypeArgument && (expr.Parent is MemberReferenceExpression || expr.Parent is IdentifierExpression)) { - 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) { - return mgrr.Methods.First ().TypeParameters[argumentNumber]; + if (expr is SimpleType && expr.Role == Roles.TypeArgument) { + if (expr.Parent is MemberReferenceExpression || expr.Parent is IdentifierExpression) { + 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) + 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]; + } } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/CreateClassDeclarationTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/CreateClassDeclarationTests.cs index fe8db36855..b36b3772b9 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/CreateClassDeclarationTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/CreateClassDeclarationTests.cs @@ -485,5 +485,66 @@ public class Test "); } + [Test] + public void TestClassTypeParameter () + { + Test ( + @" +public class Test +{ + public class Generate where T : struct {} + + public void FooBar () + { + Generate<$Data> foo; + } +} +", @" +public struct Data +{ +} +public class Test +{ + public class Generate where T : struct {} + + public void FooBar () + { + Generate foo; + } +} +"); + } + [Test] + public void TestClassTypeParameterCase2 () + { + Test ( + @" +public class Test +{ + public class Generate where T : struct {} + + public void FooBar () + { + new Generate<$Data> (); + } +} +", @" +public struct Data +{ +} +public class Test +{ + public class Generate where T : struct {} + + public void FooBar () + { + new Generate (); + } +} +"); + } + + + } }