Browse Source

Fixed bug in GetCurrentParameterIndex + added unit tests for this

function.
pull/32/merge
Mike Krüger 13 years ago
parent
commit
bce7b74426
  1. 12
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs
  2. 100
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/GetCurrentParameterIndexTests.cs
  3. 4
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs
  4. 1
      ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj

12
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs

@ -155,14 +155,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
public int GetCurrentParameterIndex (int triggerOffset, int endOffset, out List<string> usedNamedParameters) public int GetCurrentParameterIndex (int triggerOffset, int endOffset, out List<string> usedNamedParameters)
{ {
usedNamedParameters =new List<string> (); usedNamedParameters =new List<string> ();
char lastChar = document.GetCharAt (endOffset - 1);
if (lastChar == '(' || lastChar == '<') {
return 0;
}
var parameter = new Stack<int> (); var parameter = new Stack<int> ();
var bracketStack = new Stack<Stack<int>> (); var bracketStack = new Stack<Stack<int>> ();
bool inSingleComment = false, inString = false, inVerbatimString = false, inChar = false, inMultiLineComment = false; bool inSingleComment = false, inString = false, inVerbatimString = false, inChar = false, inMultiLineComment = false;
var word = new StringBuilder (); var word = new StringBuilder ();
bool foundCharAfterOpenBracket = false;
for (int i = triggerOffset; i < endOffset; i++) { for (int i = triggerOffset; i < endOffset; i++) {
char ch = document.GetCharAt (i); char ch = document.GetCharAt (i);
char nextCh = i + 1 < document.TextLength ? document.GetCharAt (i + 1) : '\0'; char nextCh = i + 1 < document.TextLength ? document.GetCharAt (i + 1) : '\0';
@ -176,6 +173,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
} else { } else {
word.Length = 0; word.Length = 0;
} }
if (!char.IsWhiteSpace(ch) && parameter.Count > 0)
foundCharAfterOpenBracket = true;
switch (ch) { switch (ch) {
case '{': case '{':
if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) { if (inString || inChar || inVerbatimString || inSingleComment || inMultiLineComment) {
@ -303,10 +302,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
break; break;
} }
} }
if (parameter.Count == 0 || bracketStack.Count > 0) { if (parameter.Count != 1 || bracketStack.Count > 0) {
return -1; return -1;
} }
if (!foundCharAfterOpenBracket)
return 0;
return parameter.Pop() + 1; return parameter.Pop() + 1;
} }

100
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/GetCurrentParameterIndexTests.cs

@ -0,0 +1,100 @@
//
// GetCurrentParameterIndexTests.cs
//
// Author:
// Mike Krüger <mkrueger@xamarin.com>
//
// 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);
}
}
}

4
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs

@ -42,7 +42,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
[TestFixture()] [TestFixture()]
public class ParameterCompletionTests : TestBase public class ParameterCompletionTests : TestBase
{ {
class TestFactory : IParameterCompletionDataFactory internal class TestFactory : IParameterCompletionDataFactory
{ {
IProjectContent ctx; IProjectContent ctx;
@ -295,7 +295,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
cursorPosition = endPos - 1; cursorPosition = endPos - 1;
} }
var doc = new ReadOnlyDocument(editorText); var doc = new ReadOnlyDocument(editorText);
IProjectContent pctx = new CSharpProjectContent(); IProjectContent pctx = new CSharpProjectContent();
pctx = pctx.AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore }); pctx = pctx.AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore });

1
ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj

@ -390,6 +390,7 @@
<Compile Include="IndentationTests\IndentationTests.cs" /> <Compile Include="IndentationTests\IndentationTests.cs" />
<Compile Include="CSharp\CodeCompletion\ImportCompletionTests.cs" /> <Compile Include="CSharp\CodeCompletion\ImportCompletionTests.cs" />
<Compile Include="CSharp\CodeActions\CreateEnumValueTests.cs" /> <Compile Include="CSharp\CodeActions\CreateEnumValueTests.cs" />
<Compile Include="CSharp\CodeCompletion\GetCurrentParameterIndexTests.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\cecil\Mono.Cecil.csproj"> <ProjectReference Include="..\..\cecil\Mono.Cecil.csproj">

Loading…
Cancel
Save