Browse Source

Added switch context handling.

newNRvisualizers
Mike Krüger 14 years ago
parent
commit
b74cfbb11a
  1. 41
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  2. 2
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs
  3. 92
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/KeywordTests.cs
  4. 3
      ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj

41
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs

@ -422,7 +422,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -422,7 +422,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
var navigator = new NodeListResolveVisitorNavigator (nodes);
var visitor = new ResolveVisitor (csResolver, identifierStart.Item1, navigator);
visitor.Scan (identifierStart.Item3);
csResolver = visitor.GetResolverStateBefore (n);
try {
csResolver = visitor.GetResolverStateBefore (n);
} catch (Exception) {
csResolver = GetState ();
}
// add attribute properties.
if (n.Parent is ICSharpCode.NRefactory.CSharp.Attribute) {
var resolved = visitor.GetResolveResult (n.Parent);
@ -556,7 +560,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -556,7 +560,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
wrapper.AddTypeParameter (p);
}
}
Predicate<ITypeDefinition> typePred = null;
if (node is Attribute) {
var attribute = ctx.GetTypeDefinition ("System", "Attribute", 0, StringComparer.Ordinal);
@ -574,10 +577,29 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -574,10 +577,29 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
AddKeywords (wrapper, globalLevelKeywords);
}
if (IsInSwitchContext(node)) {
wrapper.AddCustom ("case");
wrapper.AddCustom ("default");
}
AddKeywords (wrapper, primitiveTypesKeywords);
wrapper.Result.AddRange (factory.CreateCodeTemplateCompletionData ());
}
static bool IsInSwitchContext(AstNode node)
{
var n = node;
while (n != null && !(n is MemberDeclaration)) {
Console.WriteLine (n.GetType ());
if (n is SwitchStatement)
return true;
if (n is BlockStatement)
return false;
n = n.Parent;
}
return false;
}
void AddTypesAndNamespaces (CompletionDataWrapper wrapper, CSharpResolver state, AstNode node, Predicate<ITypeDefinition> typePred = null, Predicate<IMember> memberPred = null)
{
var currentType = state.CurrentTypeDefinition ?? this.currentType;
@ -1531,6 +1553,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1531,6 +1553,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
}
var baseUnit = ParseStub ("");
var tmpUnit = baseUnit;
AstNode expr = baseUnit.GetNodeAt<IdentifierExpression> (location.Line, location.Column - 1);
if (expr == null)
expr = baseUnit.GetNodeAt<Attribute> (location.Line, location.Column - 1);
@ -1545,6 +1568,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1545,6 +1568,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
expr = baseUnit.GetNodeAt<ArrayInitializerExpression> (location.Line, location.Column - 1);
}
// try statement
if (expr == null) {
expr = tmpUnit.GetNodeAt<Statement> (location.Line, location.Column - 1);
}
if (expr == null)
return null;
var member = Unit.GetNodeAt<AttributedNode> (memberLocation);
@ -1740,7 +1768,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1740,7 +1768,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
var navigator = new NodeListResolveVisitorNavigator (new[] { node });
var visitor = new ResolveVisitor (state, CSharpParsedFile, navigator);
Unit.AcceptVisitor (visitor, null);
state = visitor.GetResolverStateBefore (node) ?? state;
try {
var newState = visitor.GetResolverStateBefore (node);
if (newState != null)
state = newState;
} catch (Exception) {
}
}
return state;

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

@ -180,8 +180,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -180,8 +180,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
bool didAppendCatch = false;
while (o >= "try".Length) {
char ch = memberText[o];
Console.WriteLine (ch);
if (!char.IsWhiteSpace (ch)) {
if (ch == 'y' && memberText[o - 1] == 'r' && memberText[o - 2] == 't') {
wrapper.Append ("} catch {}");

92
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/KeywordTests.cs

@ -0,0 +1,92 @@ @@ -0,0 +1,92 @@
//
// KeywordTests.cs
//
// Author:
// Mike Krüger <mkrueger@xamarin.com>
//
// Copyright (c) 2011 Xamarin Inc.
//
// 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;
namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
{
[TestFixture()]
public class KeywordTests : TestBase
{
[Test()]
public void CaseKeywordTest ()
{
var provider = CodeCompletionBugTests.CreateProvider (
@"
class Class
{
void Test (string t)
{
switch (t) {
$c$
}
}
}
");
Assert.IsNotNull (provider, "provider == null");
Assert.IsNotNull (provider.Find ("case"), "keyword 'case' not found.");
}
[Test()]
public void CaseKeywordTestCase2 ()
{
var provider = CodeCompletionBugTests.CreateProvider (
@"
class Class
{
void Test (string t)
{
$c$
}
}
");
}
[Test()]
public void CaseKeywordTestCase3 ()
{
var provider = CodeCompletionBugTests.CreateProvider (
@"
class Class
{
void Test (string t)
{
switch (t) {
case ""test"":
$c$
}
}
}
");
Assert.IsNotNull (provider, "provider == null");
Assert.IsNotNull (provider.Find ("case"), "keyword 'case' not found.");
}
}
}

3
ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj

@ -195,15 +195,18 @@ @@ -195,15 +195,18 @@
<Compile Include="CSharp\CodeCompletion\CompletionDataList.cs" />
<Compile Include="CSharp\CodeCompletion\ParameterCompletionTests.cs" />
<Compile Include="CSharp\CodeCompletion\TestBase.cs" />
<Compile Include="CSharp\CodeCompletion\KeywordTests.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ICSharpCode.NRefactory.CSharp\ICSharpCode.NRefactory.CSharp.csproj">
<Project>{53DCA265-3C3C-42F9-B647-F72BA678122B}</Project>
<Name>ICSharpCode.NRefactory.CSharp</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\ICSharpCode.NRefactory\ICSharpCode.NRefactory.csproj">
<Project>{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}</Project>
<Name>ICSharpCode.NRefactory</Name>
<Private>False</Private>
</ProjectReference>
</ItemGroup>
<ItemGroup>

Loading…
Cancel
Save