Browse Source

Fixed code completion bug.

newNRvisualizers
Mike Krüger 14 years ago
parent
commit
5069b98f17
  1. 17
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  2. 17
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs
  3. 7
      ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs
  4. 48
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/KeywordTests.cs
  5. 24
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs
  6. 2
      ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj

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

@ -91,7 +91,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -91,7 +91,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
{
if (type is PrimitiveType) {
var pt = (PrimitiveType)type;
Console.WriteLine (pt.Keyword);
switch (pt.Keyword) {
case "object":
yield return "o";
@ -413,7 +412,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -413,7 +412,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
}
var contextList = new CompletionDataWrapper (this);
var identifierStart = GetExpressionAtCursor ();
if (identifierStart != null && identifierStart.Item2 is VariableInitializer && location <= ((VariableInitializer)identifierStart.Item2).NameToken.EndLocation) {
return controlSpace ? HandleAccessorContext () ?? DefaultControlSpaceItems () : null;
@ -421,8 +419,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -421,8 +419,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (!(char.IsLetter (completionChar) || completionChar == '_') && (!controlSpace || identifierStart == null || !(identifierStart.Item2 is ArrayInitializerExpression))) {
return controlSpace ? HandleAccessorContext () ?? DefaultControlSpaceItems () : null;
}
char prevCh = offset > 2 ? document.GetCharAt (offset - 2) : '\0';
char prevCh = offset > 2 ? document.GetCharAt (offset - 2) : ';';
char nextCh = offset < document.TextLength ? document.GetCharAt (offset) : ' ';
const string allowedChars = ";,[](){}+-*/%^?:&|~!<>=";
if (!Char.IsWhiteSpace (nextCh) && allowedChars.IndexOf (nextCh) < 0)
@ -435,7 +432,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -435,7 +432,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (identifierStart == null && !string.IsNullOrEmpty (token) && !(IsInsideComment (tokenIndex) || IsInsideString (tokenIndex))) {
char last = token [token.Length - 1];
if (char.IsLetterOrDigit (last) || last == '_' || token == ">") {
return null;
return controlSpace ? DefaultControlSpaceItems () : null;
}
}
if (identifierStart == null)
@ -607,7 +604,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -607,7 +604,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
IEnumerable<ICompletionData> DefaultControlSpaceItems ()
{
var wrapper = new CompletionDataWrapper (this);
while (offset > 0 && char.IsWhiteSpace (document.GetCharAt (offset))) {
while (offset > 1 && char.IsWhiteSpace (document.GetCharAt (offset))) {
offset--;
}
location = document.GetLocation (offset);
@ -630,10 +627,10 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -630,10 +627,10 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
void AddContextCompletion (CompletionDataWrapper wrapper, CSharpResolver state, AstNode node)
{
if (state == null)
return;
foreach (var variable in state.LocalVariables) {
wrapper.AddVariable (variable);
if (state != null) {
foreach (var variable in state.LocalVariables) {
wrapper.AddVariable (variable);
}
}
if (currentMember is IParameterizedMember) {

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

@ -293,7 +293,14 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -293,7 +293,14 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
bool wrapInClass = mt.Item2;
var wrapper = new StringBuilder ();
if (wrapInClass) {
/* foreach (var child in Unit.Children) {
if (child is UsingDeclaration) {
var offset = document.GetOffset (child.StartLocation);
wrapper.Append (document.GetText (offset, document.GetOffset (child.EndLocation) - offset));
}
}*/
wrapper.Append ("class Stub {");
wrapper.AppendLine ();
}
@ -313,7 +320,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -313,7 +320,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
} else {
memberLocation = new TextLocation (1, 1);
}
using (var stream = new System.IO.StringReader (wrapper.ToString ())) {
var parser = new CSharpParser ();
return parser.Parse (stream, wrapInClass ? memberLocation.Line - 2 : 0);
@ -337,6 +343,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -337,6 +343,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
} else {
startOffset = 0;
}
while (startOffset > 0) {
char ch = document.GetCharAt (startOffset - 1);
if (ch != ' ' && ch != '\t')
break;
--startOffset;
}
if (cachedText == null)
cachedText = document.GetText (startOffset, offset - startOffset);
@ -374,7 +386,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -374,7 +386,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
} else {
return null;
}
// Print (baseUnit);
/* var member = Unit.GetNodeAt<AttributedNode> (memberLocation);
var member2 = baseUnit.GetNodeAt<AttributedNode> (memberLocation);
member2.Remove ();
@ -450,7 +462,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -450,7 +462,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
var visitor = new ResolveVisitor (csResolver, file, navigator);
visitor.Scan (unit);
// Print (unit);
var state = visitor.GetResolverStateBefore (resolveNode);
var result = visitor.GetResolveResult (resolveNode);
if (ProjectContent is SimpleProjectContent)

7
ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs

@ -98,22 +98,21 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -98,22 +98,21 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return null;
return factory.CreateConstructorProvider (attribute.Item1.Type);
}
var invocationExpression = ResolveExpression (invoke.Item1, invoke.Item2, invoke.Item3);
if (invocationExpression == null || invocationExpression.Item1 == null || invocationExpression.Item1.IsError)
return null;
resolveResult = invocationExpression.Item1;
if (resolveResult is MethodGroupResolveResult)
return factory.CreateMethodDataProvider (resolveResult as MethodGroupResolveResult);
if (resolveResult is MemberResolveResult) {
if (resolveResult.Type.Kind == TypeKind.Delegate)
return factory.CreateDelegateDataProvider (resolveResult.Type);
var mr = resolveResult as MemberResolveResult;
if (mr.Member is IMethod)
return factory.CreateMethodDataProvider ((IMethod)mr.Member);
}
if (resolveResult.Type.Kind == TypeKind.Delegate)
return factory.CreateDelegateDataProvider (resolveResult.Type);
//
// if (result.ExpressionContext == ExpressionContext.BaseConstructorCall) {
// if (resolveResult is ThisResolveResult)

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

@ -168,6 +168,54 @@ class Test @@ -168,6 +168,54 @@ class Test
Assert.IsNotNull (provider.Find ("as"), "keyword 'as' not found.");
});
}
[Test()]
public void PublicClassContextTest ()
{
CodeCompletionBugTests.CombinedProviderTest (@"$c$",
provider => {
Assert.IsNotNull (provider.Find ("class"), "keyword 'class' not found.");
Assert.IsNotNull (provider.Find ("static"), "keyword 'static' not found.");
Assert.IsNotNull (provider.Find ("sealed"), "keyword 'sealed' not found.");
});
}
[Ignore()]
[Test()]
public void PublicClassContextTest2 ()
{
CodeCompletionBugTests.CombinedProviderTest (@"public $c$",
provider => {
Assert.IsNotNull (provider.Find ("class"), "keyword 'class' not found.");
Assert.IsNotNull (provider.Find ("static"), "keyword 'static' not found.");
Assert.IsNotNull (provider.Find ("sealed"), "keyword 'sealed' not found.");
});
}
[Ignore()]
[Test()]
public void PublicClassContextTestContinuation1 ()
{
CodeCompletionBugTests.CombinedProviderTest (@"public static $c$",
provider => {
Assert.IsNotNull (provider.Find ("class"), "keyword 'class' not found.");
});
}
[Ignore()]
[Test()]
public void PublicClassContextTestContinuation2 ()
{
CodeCompletionBugTests.CombinedProviderTest (@"public sealed $c$",
provider => {
Assert.IsNotNull (provider.Find ("class"), "keyword 'class' not found.");
});
}
}
}

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

@ -435,5 +435,27 @@ class TestClass @@ -435,5 +435,27 @@ class TestClass
}");
Assert.IsNotNull (provider, "provider was not created.");
Assert.AreEqual (1, provider.OverloadCount);
}}
}
/// Bug 599 - Regression: No intellisense over Func delegate
[Test()]
public void TestBug599 ()
{
var provider = CreateProvider (
@"using System;
using System.Core;
class TestClass
{
void A (Func<int, int> f)
{
$f ($
}
}");
Assert.IsNotNull (provider, "provider was not created.");
Assert.AreEqual (1, provider.OverloadCount);
}
}
}

2
ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj

@ -17,7 +17,7 @@ @@ -17,7 +17,7 @@
<RunCodeAnalysis>False</RunCodeAnalysis>
<CodeAnalysisRules>-Microsoft.Design#CA1026;-Microsoft.Security#CA2104</CodeAnalysisRules>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>snk</AssemblyOriginatorKeyFile>
<AssemblyOriginatorKeyFile>..\ICSharpCode.NRefactory.snk</AssemblyOriginatorKeyFile>
<DelaySign>False</DelaySign>
<AssemblyOriginatorKeyMode>File</AssemblyOriginatorKeyMode>
</PropertyGroup>

Loading…
Cancel
Save