diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index 1eef7176fe..6b5d0bbf37 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -155,14 +155,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion public int GetCurrentParameterIndex (int triggerOffset, int endOffset, out List usedNamedParameters) { usedNamedParameters =new List (); - char lastChar = document.GetCharAt (endOffset - 1); - if (lastChar == '(' || lastChar == '<') { - return 0; - } var parameter = new Stack (); var bracketStack = new Stack> (); bool inSingleComment = false, inString = false, inVerbatimString = false, inChar = false, inMultiLineComment = false; var word = new StringBuilder (); + bool foundCharAfterOpenBracket = false; for (int i = triggerOffset; i < endOffset; i++) { char ch = document.GetCharAt (i); char nextCh = i + 1 < document.TextLength ? document.GetCharAt (i + 1) : '\0'; @@ -176,6 +173,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } else { word.Length = 0; } + if (!char.IsWhiteSpace(ch) && parameter.Count > 0) + foundCharAfterOpenBracket = true; switch (ch) { case '{': if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { @@ -303,10 +302,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion break; } } - if (parameter.Count == 0 || bracketStack.Count > 0) { + if (parameter.Count != 1 || bracketStack.Count > 0) { return -1; } - + if (!foundCharAfterOpenBracket) + return 0; return parameter.Pop() + 1; } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/GetCurrentParameterIndexTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/GetCurrentParameterIndexTests.cs new file mode 100644 index 0000000000..3d9b660cd8 --- /dev/null +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/GetCurrentParameterIndexTests.cs @@ -0,0 +1,100 @@ +// +// GetCurrentParameterIndexTests.cs +// +// Author: +// Mike Krüger +// +// Copyright (c) 2013 Xamarin Inc. (http://xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; +using NUnit.Framework; +using ICSharpCode.NRefactory.CSharp.Completion; +using ICSharpCode.NRefactory.Editor; +using ICSharpCode.NRefactory.CSharp.TypeSystem; +using System.Text; + +namespace ICSharpCode.NRefactory.CSharp.CodeCompletion +{ + [TestFixture] + public class GetCurrentParameterIndexTests + { + static int GetIndex(string text) + { + var editorText = new StringBuilder(); + int trigger = 0, end = 0; + for (int i = 0; i < text.Length; i++) { + if (text[i] == '@') { + trigger = editorText.Length; + continue; + } + if (text[i] == '$') { + end = editorText.Length; + continue; + } + editorText.Append(text [i]); + } + + var doc = new ReadOnlyDocument(editorText.ToString ()); + var pctx = new CSharpProjectContent(); + var rctx = new CSharpTypeResolveContext(pctx.CreateCompilation().MainAssembly); + var ctxProvider = new DefaultCompletionContextProvider(doc, new CSharpUnresolvedFile("a.cs")); + var engine = new CSharpParameterCompletionEngine(doc, ctxProvider, new ParameterCompletionTests.TestFactory(pctx), pctx, rctx); + + return engine.GetCurrentParameterIndex(trigger, end); + } + + [Test] + public void TestFirstParameterStart () + { + var index = GetIndex("@Test($"); + Assert.AreEqual(0, index); + } + + [Test] + public void TestFirstParameter () + { + var index = GetIndex("@Test(foo$"); + Assert.AreEqual(1, index); + } + + [Test] + public void TestSecondParameter () + { + var index = GetIndex("@Test(foo, $"); + Assert.AreEqual(2, index); + } + + + [Test] + public void TestAfterMethod () + { + var index = GetIndex("@Test(foo) $"); + Assert.AreEqual(-1, index); + } + + [Test] + public void TestJaggedMethod () + { + var index = GetIndex("@Foo(Test($"); + Assert.AreEqual(-1, index); + } + } +} + diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs index 6c8ac7fd53..1b68fa356b 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs @@ -42,7 +42,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion [TestFixture()] public class ParameterCompletionTests : TestBase { - class TestFactory : IParameterCompletionDataFactory + internal class TestFactory : IParameterCompletionDataFactory { IProjectContent ctx; @@ -295,7 +295,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion cursorPosition = endPos - 1; } var doc = new ReadOnlyDocument(editorText); - + IProjectContent pctx = new CSharpProjectContent(); pctx = pctx.AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore }); diff --git a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj index 8185e9258e..4046a0b552 100644 --- a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj +++ b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj @@ -390,6 +390,7 @@ +