diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 2470702c3e..159e670be3 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -864,59 +864,65 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return wrapper.Result; } - void AddContextCompletion (CompletionDataWrapper wrapper, CSharpResolver state, AstNode node) + void AddContextCompletion(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node) { if (state != null && !(node is AstType)) { foreach (var variable in state.LocalVariables) { - if (variable.Region.IsInside (location.Line, location.Column - 1)) + if (variable.Region.IsInside(location.Line, location.Column - 1)) { continue; - wrapper.AddVariable (variable); + } + wrapper.AddVariable(variable); } } if (currentMember is IUnresolvedParameterizedMember && !(node is AstType)) { - var param = (IParameterizedMember)currentMember.CreateResolved (ctx); + var param = (IParameterizedMember)currentMember.CreateResolved(ctx); foreach (var p in param.Parameters) { - wrapper.AddVariable (p); + wrapper.AddVariable(p); } } if (currentMember is IUnresolvedMethod) { var method = (IUnresolvedMethod)currentMember; foreach (var p in method.TypeParameters) { - wrapper.AddTypeParameter (p); + wrapper.AddTypeParameter(p); } } Predicate typePred = null; - if (IsAttributeContext (node)) { - var attribute = Compilation.FindType (KnownTypeCode.Attribute); + if (IsAttributeContext(node)) { + var attribute = Compilation.FindType(KnownTypeCode.Attribute); typePred = t => { - return t.GetAllBaseTypeDefinitions ().Any (bt => bt.Equals (attribute)); + return t.GetAllBaseTypeDefinitions().Any(bt => bt.Equals(attribute)); }; } - AddTypesAndNamespaces (wrapper, state, node, typePred); + AddTypesAndNamespaces(wrapper, state, node, typePred); - wrapper.Result.Add (factory.CreateLiteralCompletionData ("global")); + wrapper.Result.Add(factory.CreateLiteralCompletionData("global")); if (!(node is AstType)) { if (currentMember != null) { - AddKeywords (wrapper, statementStartKeywords); - AddKeywords (wrapper, expressionLevelKeywords); + AddKeywords(wrapper, statementStartKeywords); + AddKeywords(wrapper, expressionLevelKeywords); } else if (currentType != null) { - AddKeywords (wrapper, typeLevelKeywords); + AddKeywords(wrapper, typeLevelKeywords); } else { - AddKeywords (wrapper, globalLevelKeywords); + AddKeywords(wrapper, globalLevelKeywords); } var prop = currentMember as IUnresolvedProperty; - if (prop != null && prop.Setter != null && prop.Setter.Region.IsInside (location)) - wrapper.AddCustom ("value"); - if (currentMember is IUnresolvedEvent) - wrapper.AddCustom ("value"); + if (prop != null && prop.Setter != null && prop.Setter.Region.IsInside(location)) { + wrapper.AddCustom("value"); + } + if (currentMember is IUnresolvedEvent) { + wrapper.AddCustom("value"); + } - if (IsInSwitchContext (node)) { - wrapper.AddCustom ("case"); + if (IsInSwitchContext(node)) { + wrapper.AddCustom("case"); } + } else { + if (((AstType)node).Parent is ParameterDeclaration) + AddKeywords(wrapper, parameterTypePredecessorKeywords); } AddKeywords (wrapper, primitiveTypesKeywords); @@ -2522,6 +2528,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion "override", "readonly", "virtual", "volatile" }; static string[] linqKeywords = new string[] { "from", "where", "select", "group", "into", "orderby", "join", "let", "in", "on", "equals", "by", "ascending", "descending" }; + static string[] parameterTypePredecessorKeywords = new string[] { "out", "ref", "params" }; #endregion } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/KeywordTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/KeywordTests.cs index 981ea788e6..f71373e9a7 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/KeywordTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/KeywordTests.cs @@ -405,6 +405,45 @@ class Test }); } + [Test()] + public void RefOutParamsTest1 () + { + CodeCompletionBugTests.CombinedProviderTest ( +@"using System; +class Test +{ + $public void MyMethod (o$ +} +", (provider) => { + Console.WriteLine (provider.Count); + + Assert.IsNotNull (provider.Find ("ref"), "keyword 'ref' not found."); + Assert.IsNotNull (provider.Find ("out"), "keyword 'out' not found."); + Assert.IsNotNull (provider.Find ("params"), "keyword 'params' not found."); + }); + } + + [Test()] + public void RefOutParamsTest () + { + CodeCompletionBugTests.CombinedProviderTest ( +@"using System; +class Test +{ + public void MyMethod () + { + $Call(i$ + } +} +", (provider) => { + Console.WriteLine (provider.Count); + + Assert.IsNotNull (provider.Find ("ref"), "keyword 'ref' not found."); + Assert.IsNotNull (provider.Find ("out"), "keyword 'out' not found."); + Assert.IsNull (provider.Find ("params"), "keyword 'params' found."); + }); + } + [Test()] public void VariableDeclarationTestMethodDeclarationCase () {