diff options
author | Daniel Grunwald <daniel@danielgrunwald.de> | 2014-11-29 21:01:01 +0300 |
---|---|---|
committer | Daniel Grunwald <daniel@danielgrunwald.de> | 2014-11-29 21:02:12 +0300 |
commit | d06fd8c24552eb593cd5f602bc699b466e471838 (patch) | |
tree | edffedf688e51d110ca6d2d87e02e9da21409d88 /ICSharpCode.NRefactory.CSharp | |
parent | f337f4a0516ad2bdc5ea8796a8799462b7fd7ac5 (diff) |
Merge NRefactory changes from SharpDevelop to NRefactory repository.
* Fix NRE in TypeGuessing after `yield return new`
* Add message text to CS0618UsageOfObsoleteMemberIssue
* Fix IndexOutOfRangeException in AddOptionalParameterToInvocationAction
* Fix icsharpcode/SharpDevelop#580: EventHandler names suggested by code completion should include the variable name/expression.
* Fix icsharpcode/SharpDevelop#574: Wrong error highlighting with interface implementation
Diffstat (limited to 'ICSharpCode.NRefactory.CSharp')
3 files changed, 57 insertions, 7 deletions
diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index e016692d..28c9ea02 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -886,7 +886,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion string parameterDefinition = AddDelegateHandlers( wrapper, delegateType, - optDelegateName: GuessEventHandlerMethodName(curTokenIndex) + optDelegateName: GuessEventHandlerMethodName(curTokenIndex, (currentType == null) ? null : currentType.Name) ); } @@ -2589,10 +2589,49 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } } - public string GuessEventHandlerMethodName(int tokenIndex) + public string GuessEventHandlerMethodName(int tokenIndex, string surroundingTypeName) { + var names = new List<string>(); + + string eventName = GetPreviousToken(ref tokenIndex, false); string result = GetPreviousToken(ref tokenIndex, false); - return "Handle" + result; + if (result != ".") { + if (surroundingTypeName == null) { + eventName = "Handle" + eventName; + } else { + names.Add(surroundingTypeName); + } + } + while (result == ".") { + result = GetPreviousToken(ref tokenIndex, false); + if (result == "this") { + if (names.Count == 0) { + if (surroundingTypeName == null) { + eventName = "Handle" + eventName; + } else { + names.Add(surroundingTypeName); + } + } + } else if (result != null) { + string trimmedName = result.Trim(); + if (trimmedName.Length == 0) { + break; + } + names.Insert(0, trimmedName); + } + result = GetPreviousToken(ref tokenIndex, false); + } + if (!string.IsNullOrEmpty(eventName)) { + names.Add(eventName); + } + result = String.Join("_", names.ToArray()); + foreach (char ch in result) { + if (!char.IsLetterOrDigit(ch) && ch != '_') { + result = ""; + break; + } + } + return result; } bool MatchDelegate(IType delegateType, IMethod method) diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/Script.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/Script.cs index a82006a7..a69b5c92 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/Script.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/Script.cs @@ -624,7 +624,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring } } - static class ExtMethods + public static class ExtMethods { public static void ContinueScript (this Task task, Action act) { diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/TypeGuessing.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/TypeGuessing.cs index 3a7e886b..dd04185b 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/TypeGuessing.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/TypeGuessing.cs @@ -259,9 +259,20 @@ namespace ICSharpCode.NRefactory.CSharp } if (expr.Parent is YieldReturnStatement) { - var state = resolver.GetResolverStateBefore(expr); - if (state != null && (state.CurrentMember.ReturnType is ParameterizedType)) { - var pt = (ParameterizedType)state.CurrentMember.ReturnType; + ParameterizedType pt = null; + var parent = expr.Ancestors.FirstOrDefault(n => n is EntityDeclaration || n is AnonymousMethodExpression|| n is LambdaExpression); + if (parent != null) { + var rr = resolver.Resolve(parent); + if (!rr.IsError) + pt = rr.Type as ParameterizedType; + } + var e = parent as EntityDeclaration; + if (e != null) { + var rt = resolver.Resolve(e.ReturnType); + if (!rt.IsError) + pt = rt.Type as ParameterizedType; + } + if (pt != null) { if (pt.FullName == "System.Collections.Generic.IEnumerable") { return new [] { pt.TypeArguments.First() }; } |