Browse Source

Merge remote-tracking branch 'upstream/master' into mansheng

newNRvisualizers
Mansheng Yang 14 years ago
parent
commit
a362d45940
  1. 96
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  2. 21
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs
  3. 29
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs
  4. 25
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/DelegateContextTests.cs

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

@ -548,7 +548,10 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
} }
} }
if (token == "+=") { if (token == "+=") {
string parameterDefinition = AddDelegateHandlers(wrapper, delegateType); string parameterDefinition = AddDelegateHandlers(
wrapper,
delegateType
);
string varName = GetPreviousMemberReferenceExpression(tokenIndex); string varName = GetPreviousMemberReferenceExpression(tokenIndex);
wrapper.Result.Add( wrapper.Result.Add(
factory.CreateEventCreationCompletionData( factory.CreateEventCreationCompletionData(
@ -640,7 +643,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
// May happen in variable names // May happen in variable names
return controlSpace ? DefaultControlSpaceItems(identifierStart) : null; return controlSpace ? DefaultControlSpaceItems(identifierStart) : null;
} }
if (identifierStart.Node is VariableInitializer && location <= ((VariableInitializer)identifierStart.Node).NameToken.EndLocation) { if (identifierStart.Node is VariableInitializer && location <= ((VariableInitializer)identifierStart.Node).NameToken.EndLocation) {
return controlSpace ? HandleAccessorContext() ?? DefaultControlSpaceItems(identifierStart) : null; return controlSpace ? HandleAccessorContext() ?? DefaultControlSpaceItems(identifierStart) : null;
} }
@ -716,19 +718,19 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return null; return null;
} }
var astResolver = new CSharpAstResolver( // var astResolver = new CSharpAstResolver(
GetState(), // GetState(),
identifierStart.Unit, // identifierStart.Unit,
CSharpParsedFile // CSharpParsedFile
); // );
//
foreach (var type in CreateFieldAction.GetValidTypes(astResolver, (Expression)n)) { // foreach (var type in CreateFieldAction.GetValidTypes(astResolver, (Expression)n)) {
if (type.Kind == TypeKind.Delegate) { // if (type.Kind == TypeKind.Delegate) {
AddDelegateHandlers(contextList, type, false, false); // AddDelegateHandlers(contextList, type, false, false);
AutoSelect = false; // AutoSelect = false;
AutoCompleteEmptyMatch = false; // AutoCompleteEmptyMatch = false;
} // }
} // }
} }
// Handle object/enumerable initialzer expressions: "new O () { P$" // Handle object/enumerable initialzer expressions: "new O () { P$"
@ -1113,11 +1115,14 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
rr = ResolveExpression(node, xp.Unit); rr = ResolveExpression(node, xp.Unit);
unit = xp.Unit; unit = xp.Unit;
} else { } else {
unit = ParseStub("a", false); unit = ParseStub("foo", false);
node = unit.GetNodeAt(location); node = unit.GetNodeAt(
location.Line,
location.Column + 2,
n => n is Expression || n is AstType
);
rr = ResolveExpression(node, unit); rr = ResolveExpression(node, unit);
} }
if (node is Identifier && node.Parent is ForeachStatement) { if (node is Identifier && node.Parent is ForeachStatement) {
var foreachStmt = (ForeachStatement)node.Parent; var foreachStmt = (ForeachStatement)node.Parent;
foreach (var possibleName in GenerateNameProposals (foreachStmt.VariableType)) { foreach (var possibleName in GenerateNameProposals (foreachStmt.VariableType)) {
@ -1186,7 +1191,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
csResolver = GetState(); csResolver = GetState();
} }
} }
AddContextCompletion(wrapper, csResolver, node, unit); AddContextCompletion(wrapper, csResolver, node, unit);
return wrapper.Result; return wrapper.Result;
@ -1224,7 +1228,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return t.GetAllBaseTypeDefinitions().Any(bt => bt.Equals(attribute)) ? t : null; return t.GetAllBaseTypeDefinitions().Any(bt => bt.Equals(attribute)) ? t : null;
}; };
} }
AddTypesAndNamespaces(wrapper, state, node, typePred); AddTypesAndNamespaces(wrapper, state, node, typePred);
wrapper.Result.Add(factory.CreateLiteralCompletionData("global")); wrapper.Result.Add(factory.CreateLiteralCompletionData("global"));
@ -1281,6 +1284,24 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
} }
} }
if (node is Expression) {
var astResolver = new CSharpAstResolver(state, unit, CSharpParsedFile);
foreach (var type in CreateFieldAction.GetValidTypes(astResolver, (Expression)node)) {
if (type.Kind == TypeKind.Enum) {
AddEnumMembers(wrapper, type, state);
} else if (type.Kind == TypeKind.Delegate) {
AddDelegateHandlers(wrapper, type, true, true);
AutoSelect = false;
AutoCompleteEmptyMatch = false;
}
}
}
// Add 'this' keyword for first parameter (extension method case)
if (node != null && node.Parent is ParameterDeclaration &&
node.Parent.PrevSibling != null && node.Parent.PrevSibling.Role == Roles.LPar) {
wrapper.AddCustom("this");
}
} }
static bool IsInSwitchContext(AstNode node) static bool IsInSwitchContext(AstNode node)
@ -1300,6 +1321,10 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
void AddTypesAndNamespaces(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node, Func<IType, IType> typePred = null, Predicate<IMember> memberPred = null, Action<ICompletionData, IType> callback = null) void AddTypesAndNamespaces(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node, Func<IType, IType> typePred = null, Predicate<IMember> memberPred = null, Action<ICompletionData, IType> callback = null)
{ {
var lookup = new MemberLookup(
ctx.CurrentTypeDefinition,
Compilation.MainAssembly
);
if (currentType != null) { if (currentType != null) {
for (var ct = currentType; ct != null; ct = ct.DeclaringTypeDefinition) { for (var ct = currentType; ct != null; ct = ct.DeclaringTypeDefinition) {
foreach (var nestedType in ct.NestedTypes) { foreach (var nestedType in ct.NestedTypes) {
@ -1326,10 +1351,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (this.currentMember != null && !(node is AstType)) { if (this.currentMember != null && !(node is AstType)) {
var def = ctx.CurrentTypeDefinition ?? Compilation.MainAssembly.GetTypeDefinition(currentType); var def = ctx.CurrentTypeDefinition ?? Compilation.MainAssembly.GetTypeDefinition(currentType);
if (def != null) { if (def != null) {
var lookup = new MemberLookup(
ctx.CurrentTypeDefinition,
Compilation.MainAssembly
);
bool isProtectedAllowed = true; bool isProtectedAllowed = true;
foreach (var member in def.GetMembers ()) { foreach (var member in def.GetMembers ()) {
if (member is IMethod && ((IMethod)member).FullName == "System.Object.Finalize") { if (member is IMethod && ((IMethod)member).FullName == "System.Object.Finalize") {
@ -1372,6 +1393,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
} }
foreach (var u in n.Usings) { foreach (var u in n.Usings) {
foreach (var type in u.Types) { foreach (var type in u.Types) {
if (!lookup.IsAccessible(type, false))
continue;
IType addType = typePred != null ? typePred(type) : type; IType addType = typePred != null ? typePred(type) : type;
if (addType != null) { if (addType != null) {
string name = type.Name; string name = type.Name;
@ -1387,6 +1411,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
} }
foreach (var type in n.Namespace.Types) { foreach (var type in n.Namespace.Types) {
if (!lookup.IsAccessible(type, false))
continue;
IType addType = typePred != null ? typePred(type) : type; IType addType = typePred != null ? typePred(type) : type;
if (addType != null) { if (addType != null) {
var a2 = wrapper.AddType(addType, addType.Name); var a2 = wrapper.AddType(addType, addType.Name);
@ -1686,7 +1712,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
string GetLineIndent(int lineNr) string GetLineIndent(int lineNr)
{ {
var line = document.GetLineByNumber(lineNr); var line = document.GetLineByNumber(lineNr);
for (int j = offset; j < line.EndOffset; j++) { for (int j = line.Offset; j < line.EndOffset; j++) {
char ch = document.GetCharAt(j); char ch = document.GetCharAt(j);
if (!char.IsWhiteSpace(ch)) { if (!char.IsWhiteSpace(ch)) {
return document.GetText(line.Offset, j - line.Offset - 1); return document.GetText(line.Offset, j - line.Offset - 1);
@ -1744,7 +1770,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (!t.GetConstructors().Any(m => lookup.IsAccessible( if (!t.GetConstructors().Any(m => lookup.IsAccessible(
m, m,
isProtectedAllowed isProtectedAllowed
))) { )
)) {
return null; return null;
} }
} }
@ -1864,7 +1891,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
declarationBegin, declarationBegin,
method.DeclaringTypeDefinition, method.DeclaringTypeDefinition,
method method
)); )
);
} }
return wrapper.Result; return wrapper.Result;
@ -1912,7 +1940,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
bool foundMember = curType.GetMembers().Any(cm => SignatureComparer.Ordinal.Equals( bool foundMember = curType.GetMembers().Any(cm => SignatureComparer.Ordinal.Equals(
cm, cm,
m m
) && cm.DeclaringTypeDefinition == curType.GetDefinition()); ) && cm.DeclaringTypeDefinition == curType.GetDefinition()
);
if (foundMember) { if (foundMember) {
continue; continue;
} }
@ -1927,6 +1956,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
static void AddKeywords(CompletionDataWrapper wrapper, IEnumerable<string> keywords) static void AddKeywords(CompletionDataWrapper wrapper, IEnumerable<string> keywords)
{ {
foreach (string keyword in keywords) { foreach (string keyword in keywords) {
if (wrapper.Result.Any(data => data.DisplayText == keyword))
continue;
wrapper.AddCustom(keyword); wrapper.AddCustom(keyword);
} }
} }
@ -1985,6 +2016,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
string delegateEndString = EolMarker + thisLineIndent + "}" + (addSemicolon ? ";" : ""); string delegateEndString = EolMarker + thisLineIndent + "}" + (addSemicolon ? ";" : "");
//bool containsDelegateData = completionList.Result.Any(d => d.DisplayText.StartsWith("delegate(")); //bool containsDelegateData = completionList.Result.Any(d => d.DisplayText.StartsWith("delegate("));
if (addDefault) { if (addDefault) {
var oldDelegate = completionList.Result.FirstOrDefault(cd => cd.DisplayText == "delegate");
if (oldDelegate != null)
completionList.Result.Remove(oldDelegate);
completionList.AddCustom( completionList.AddCustom(
"delegate", "delegate",
"Creates anonymous delegate.", "Creates anonymous delegate.",
@ -2248,7 +2282,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
completionList.Result.Add(factory.CreateEntityCompletionData( completionList.Result.Add(factory.CreateEntityCompletionData(
field, field,
typeString + "." + field.Name typeString + "." + field.Name
)); )
);
} }
} }
DefaultCompletionString = typeString; DefaultCompletionString = typeString;
@ -2843,7 +2878,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
"seealso", "seealso",
"summary", "summary",
"value" "value"
}); }
);
IEnumerable<ICompletionData> GetXmlDocumentationCompletionData() IEnumerable<ICompletionData> GetXmlDocumentationCompletionData()
{ {

21
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionAccessibleTests.cs

@ -1178,6 +1178,27 @@ class TestClass
Assert.IsNotNull (provider.Find ("InnerEnumTest.TestEnum.C"), "enum 'InnerEnumTest.TestEnum.C' not found."); Assert.IsNotNull (provider.Find ("InnerEnumTest.TestEnum.C"), "enum 'InnerEnumTest.TestEnum.C' not found.");
} }
[Test()]
public void TestEnumInBinaryOperatorExpression ()
{
CodeCompletionBugTests.CombinedProviderTest (
@"
[Flags]
public enum TestEnum { A, B, C}
class TestClass
{
public void Foo ()
{
$TestEnum test = TestEnum.A | T$
}
}", provider => {
Assert.IsNotNull (provider.Find ("TestEnum"), "enum 'TestEnum' not found.");
Assert.IsNotNull (provider.Find ("TestEnum.A"), "enum 'TestEnum.A' not found.");
Assert.IsNotNull (provider.Find ("TestEnum.B"), "enum 'TestEnum.B' not found.");
Assert.IsNotNull (provider.Find ("TestEnum.C"), "enum 'TestEnum.C' not found.");
});
}
[Test()] [Test()]
public void TestPrimimitiveTypeCompletionString () public void TestPrimimitiveTypeCompletionString ()

29
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs

@ -5246,5 +5246,34 @@ namespace EnumerationProblem
}); });
} }
/// <summary>
/// Bug 5191 - Creating extension method problem when typing "this"
/// </summary>
[Test()]
public void TestBug5191()
{
CombinedProviderTest(
@"using System;
static class Ext
{
$public static void Foo(t$
}
", provider => {
Assert.IsNotNull(provider.Find("this"), "'this' not found.");
});
CombinedProviderTest(
@"using System;
static class Ext
{
$public static void Foo(int foo, t$
}
", provider => {
Assert.IsNull(provider.Find("this"), "'this' found.");
});
}
} }
} }

25
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/DelegateContextTests.cs

@ -72,6 +72,31 @@ public class Test
Assert.IsNotNull(provider.Find("delegate")); Assert.IsNotNull(provider.Find("delegate"));
}); });
} }
/// <summary>
/// Bug 5207 - [regression] delegate completion like event completion
/// </summary>
[Test()]
public void TestBug5207()
{
// note 'string bar = new Test ().ToString ()' would be valid.
CodeCompletionBugTests.CombinedProviderTest(
@"using System;
public class Test
{
Action<int,int> foo;
void TestFoo()
{
$foo = d$
}
}
", provider => {
Assert.IsFalse(provider.AutoSelect);
Assert.IsNotNull(provider.Find("(arg1, arg2)"));
});
}
} }
} }

Loading…
Cancel
Save