Browse Source

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

newNRvisualizers
Mansheng Yang 14 years ago
parent
commit
8e02a17f9d
  1. 18
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  2. 2
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/CreateMethodDeclarationAction.cs
  3. 2
      ICSharpCode.NRefactory.CSharp/Resolver/CSharpAstResolver.cs
  4. 20
      ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs
  5. 3
      ICSharpCode.NRefactory.CSharp/Resolver/ResolveAtLocation.cs
  6. 19
      ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs
  7. 4
      ICSharpCode.NRefactory.ConsistencyCheck/ResolverTest.cs
  8. 3
      ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ExtractFieldTests.cs
  9. 4
      ICSharpCode.NRefactory.Tests/CSharp/CodeActions/IntroduceConstantTests.cs
  10. 20
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs
  11. 6
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/LinqTests.cs
  12. 18
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/ResolveAtLocationTests.cs
  13. 10
      ICSharpCode.NRefactory/Semantics/MemberResolveResult.cs
  14. 5
      ICSharpCode.NRefactory/Semantics/ResolveResult.cs
  15. 4
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultMemberReference.cs

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

@ -1249,13 +1249,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
AddKeywords(wrapper, parameterTypePredecessorKeywords); AddKeywords(wrapper, parameterTypePredecessorKeywords);
} }
} }
AddKeywords(wrapper, primitiveTypesKeywords); AddKeywords(wrapper, primitiveTypesKeywords);
if (currentMember != null) { if (currentMember != null && (node is IdentifierExpression || node is SimpleType) && (node.Parent is ExpressionStatement || node.Parent is ForeachStatement || node.Parent is UsingStatement)) {
wrapper.AddCustom("var"); wrapper.AddCustom("var");
wrapper.AddCustom("dynamic");
} }
wrapper.Result.AddRange(factory.CreateCodeTemplateCompletionData()); wrapper.Result.AddRange(factory.CreateCodeTemplateCompletionData());
if (node != null && node.Role == Roles.Argument) { if (node != null && node.Role == Roles.Argument) {
var resolved = ResolveExpression(node.Parent); var resolved = ResolveExpression(node.Parent);
var invokeResult = resolved != null ? resolved.Item1 as CSharpInvocationResolveResult : null; var invokeResult = resolved != null ? resolved.Item1 as CSharpInvocationResolveResult : null;
@ -2213,6 +2212,17 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
); );
} }
} }
foreach (var method in resolveResult.Methods) {
if (parameter < method.Parameters.Count && method.Parameters [parameter].Type.Kind == TypeKind.Delegate) {
AutoSelect = false;
AutoCompleteEmptyMatch = false;
}
foreach (var p in method.Parameters) {
result.AddNamedParameterVariable(p);
}
}
if (!controlSpace) { if (!controlSpace) {
if (addedEnums.Count + addedDelegates.Count == 0) { if (addedEnums.Count + addedDelegates.Count == 0) {
return Enumerable.Empty<ICompletionData>(); return Enumerable.Empty<ICompletionData>();
@ -3034,7 +3044,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
"true", "false", "typeof", "checked", "unchecked", "from", "break", "checked", "true", "false", "typeof", "checked", "unchecked", "from", "break", "checked",
"unchecked", "const", "continue", "do", "finally", "fixed", "for", "foreach", "unchecked", "const", "continue", "do", "finally", "fixed", "for", "foreach",
"goto", "if", "lock", "return", "stackalloc", "switch", "throw", "try", "unsafe", "goto", "if", "lock", "return", "stackalloc", "switch", "throw", "try", "unsafe",
"using", "while", "yield", "dynamic", "var", "dynamic", "using", "while", "yield",
"catch" "catch"
}; };
static string[] globalLevelKeywords = new string [] { static string[] globalLevelKeywords = new string [] {

2
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/CreateMethodDeclarationAction.cs

@ -106,6 +106,8 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
if (guessedType.Kind != TypeKind.Delegate) if (guessedType.Kind != TypeKind.Delegate)
yield break; yield break;
var invocationMethod = guessedType.GetDelegateInvokeMethod(); var invocationMethod = guessedType.GetDelegateInvokeMethod();
if (invocationMethod == null)
yield break;
var state = context.GetResolverStateBefore(identifier); var state = context.GetResolverStateBefore(identifier);
if (state.CurrentMember == null || state.CurrentTypeDefinition == null) if (state.CurrentMember == null || state.CurrentTypeDefinition == null)
yield break; yield break;

2
ICSharpCode.NRefactory.CSharp/Resolver/CSharpAstResolver.cs

@ -275,7 +275,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
} }
return true; return true;
} }
return (node.NodeType == NodeType.Whitespace || node is ArraySpecifier || node is NamedArgumentExpression || node is ArrayInitializerExpression); return (node.NodeType == NodeType.Whitespace || node is ArraySpecifier || node is NamedArgumentExpression);
} }
} }
} }

20
ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs

@ -41,8 +41,6 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public class CSharpResolver public class CSharpResolver
{ {
static readonly ResolveResult ErrorResult = ErrorResolveResult.UnknownError; static readonly ResolveResult ErrorResult = ErrorResolveResult.UnknownError;
static readonly ResolveResult DynamicResult = new ResolveResult(SpecialType.Dynamic);
static readonly ResolveResult NullResult = new ResolveResult(SpecialType.NullType);
readonly ICompilation compilation; readonly ICompilation compilation;
internal readonly CSharpConversions conversions; internal readonly CSharpConversions conversions;
@ -1381,7 +1379,9 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
foundInCache = cache.TryGetValue(identifier, out r); foundInCache = cache.TryGetValue(identifier, out r);
} }
} }
if (!foundInCache) { if (foundInCache) {
r = (r != null ? r.ShallowClone() : null);
} else {
r = LookInCurrentType(identifier, typeArguments, lookupMode, parameterizeResultType); r = LookInCurrentType(identifier, typeArguments, lookupMode, parameterizeResultType);
if (cache != null) { if (cache != null) {
// also cache missing members (r==null) // also cache missing members (r==null)
@ -1398,9 +1398,11 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
r = LookInUsingScopeNamespace(null, compilation.RootNamespace, identifier, typeArguments, parameterizeResultType); r = LookInUsingScopeNamespace(null, compilation.RootNamespace, identifier, typeArguments, parameterizeResultType);
} else { } else {
if (k == 0 && lookupMode != NameLookupMode.TypeInUsingDeclaration) { if (k == 0 && lookupMode != NameLookupMode.TypeInUsingDeclaration) {
if (!context.CurrentUsingScope.ResolveCache.TryGetValue(identifier, out r)) { if (context.CurrentUsingScope.ResolveCache.TryGetValue(identifier, out r)) {
r = (r != null ? r.ShallowClone() : null);
} else {
r = LookInCurrentUsingScope(identifier, typeArguments, false, false); r = LookInCurrentUsingScope(identifier, typeArguments, false, false);
r = context.CurrentUsingScope.ResolveCache.GetOrAdd(identifier, r); context.CurrentUsingScope.ResolveCache.TryAdd(identifier, r);
} }
} else { } else {
r = LookInCurrentUsingScope(identifier, typeArguments, lookupMode == NameLookupMode.TypeInUsingDeclaration, parameterizeResultType); r = LookInCurrentUsingScope(identifier, typeArguments, lookupMode == NameLookupMode.TypeInUsingDeclaration, parameterizeResultType);
@ -1477,7 +1479,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
if (!(isInUsingDeclaration && u == currentUsingScope)) { if (!(isInUsingDeclaration && u == currentUsingScope)) {
foreach (var pair in u.UsingAliases) { foreach (var pair in u.UsingAliases) {
if (pair.Key == identifier) { if (pair.Key == identifier) {
return pair.Value; return pair.Value.ShallowClone();
} }
} }
} }
@ -1589,7 +1591,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
} }
if (target.Type.Kind == TypeKind.Dynamic) if (target.Type.Kind == TypeKind.Dynamic)
return DynamicResult; return new ResolveResult(SpecialType.Dynamic);
MemberLookup lookup = CreateMemberLookup(lookupMode); MemberLookup lookup = CreateMemberLookup(lookupMode);
ResolveResult result; ResolveResult result;
@ -1887,7 +1889,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
// C# 4.0 spec: §7.6.5 // C# 4.0 spec: §7.6.5
if (target.Type.Kind == TypeKind.Dynamic) if (target.Type.Kind == TypeKind.Dynamic)
return DynamicResult; return new ResolveResult(SpecialType.Dynamic);
MethodGroupResolveResult mgrr = target as MethodGroupResolveResult; MethodGroupResolveResult mgrr = target as MethodGroupResolveResult;
if (mgrr != null) { if (mgrr != null) {
@ -2297,7 +2299,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public ResolveResult ResolvePrimitive(object value) public ResolveResult ResolvePrimitive(object value)
{ {
if (value == null) { if (value == null) {
return NullResult; return new ResolveResult(SpecialType.NullType);
} else { } else {
TypeCode typeCode = Type.GetTypeCode(value.GetType()); TypeCode typeCode = Type.GetTypeCode(value.GetType());
IType type = compilation.FindType(typeCode); IType type = compilation.FindType(typeCode);

3
ICSharpCode.NRefactory.CSharp/Resolver/ResolveAtLocation.cs

@ -51,13 +51,14 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
CancellationToken cancellationToken = default(CancellationToken)) CancellationToken cancellationToken = default(CancellationToken))
{ {
node = cu.GetNodeAt(location); node = cu.GetNodeAt(location);
if (node == null) if (node == null || node is ArrayInitializerExpression)
return null; return null;
if (CSharpAstResolver.IsUnresolvableNode(node)) { if (CSharpAstResolver.IsUnresolvableNode(node)) {
if (node is Identifier) { if (node is Identifier) {
node = node.Parent; node = node.Parent;
} else if (node.NodeType == NodeType.Token) { } else if (node.NodeType == NodeType.Token) {
if (node.Parent is IndexerExpression || node.Parent is ConstructorInitializer) { if (node.Parent is IndexerExpression || node.Parent is ConstructorInitializer) {
Console.WriteLine (2);
// There's no other place where one could hover to see the indexer's tooltip, // There's no other place where one could hover to see the indexer's tooltip,
// so we need to resolve it when hovering over the '[' or ']'. // so we need to resolve it when hovering over the '[' or ']'.
// For constructor initializer, the same applies to the 'base'/'this' token. // For constructor initializer, the same applies to the 'base'/'this' token.

19
ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs

@ -59,7 +59,6 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
// The ResolveVisitor is also responsible for handling lambda expressions. // The ResolveVisitor is also responsible for handling lambda expressions.
static readonly ResolveResult errorResult = ErrorResolveResult.UnknownError; static readonly ResolveResult errorResult = ErrorResolveResult.UnknownError;
readonly ResolveResult voidResult;
CSharpResolver resolver; CSharpResolver resolver;
/// <summary>Resolve result of the current LINQ query.</summary> /// <summary>Resolve result of the current LINQ query.</summary>
@ -112,13 +111,18 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
this.resolver = resolver; this.resolver = resolver;
this.parsedFile = parsedFile; this.parsedFile = parsedFile;
this.navigator = skipAllNavigator; this.navigator = skipAllNavigator;
this.voidResult = new ResolveResult(resolver.Compilation.FindType(KnownTypeCode.Void));
} }
internal void SetNavigator(IResolveVisitorNavigator navigator) internal void SetNavigator(IResolveVisitorNavigator navigator)
{ {
this.navigator = navigator ?? skipAllNavigator; this.navigator = navigator ?? skipAllNavigator;
} }
ResolveResult voidResult {
get {
return new ResolveResult(resolver.Compilation.FindType(KnownTypeCode.Void));
}
}
#endregion #endregion
#region ResetContext #region ResetContext
@ -1594,7 +1598,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
ResolveResult IAstVisitor<ResolveResult>.VisitTypeReferenceExpression(TypeReferenceExpression typeReferenceExpression) ResolveResult IAstVisitor<ResolveResult>.VisitTypeReferenceExpression(TypeReferenceExpression typeReferenceExpression)
{ {
if (resolverEnabled) { if (resolverEnabled) {
return Resolve(typeReferenceExpression.Type); return Resolve(typeReferenceExpression.Type).ShallowClone();
} else { } else {
Scan(typeReferenceExpression.Type); Scan(typeReferenceExpression.Type);
return null; return null;
@ -2420,6 +2424,13 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
internal abstract AstNode BodyExpression { get; } internal abstract AstNode BodyExpression { get; }
internal abstract void EnforceMerge(ResolveVisitor parentVisitor); internal abstract void EnforceMerge(ResolveVisitor parentVisitor);
public override ResolveResult ShallowClone()
{
if (IsUndecided)
throw new NotSupportedException();
return base.ShallowClone();
}
} }
void MergeUndecidedLambdas() void MergeUndecidedLambdas()
@ -3261,7 +3272,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
foreach (var clause in queryExpression.Clauses) { foreach (var clause in queryExpression.Clauses) {
currentQueryResult = Resolve(clause); currentQueryResult = Resolve(clause);
} }
return currentQueryResult; return WrapResult(currentQueryResult);
} finally { } finally {
currentQueryResult = oldQueryResult; currentQueryResult = oldQueryResult;
cancellationToken = oldCancellationToken; cancellationToken = oldCancellationToken;

4
ICSharpCode.NRefactory.ConsistencyCheck/ResolverTest.cs

@ -55,6 +55,7 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
} }
Dictionary<AstNode, ResolveResult> resolvedNodes = new Dictionary<AstNode, ResolveResult>(); Dictionary<AstNode, ResolveResult> resolvedNodes = new Dictionary<AstNode, ResolveResult>();
HashSet<ResolveResult> resolveResults = new HashSet<ResolveResult>();
HashSet<AstNode> nodesWithConversions = new HashSet<AstNode>(); HashSet<AstNode> nodesWithConversions = new HashSet<AstNode>();
public ResolveVisitorNavigationMode Scan(AstNode node) public ResolveVisitorNavigationMode Scan(AstNode node)
@ -69,6 +70,9 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
resolvedNodes.Add(node, result); resolvedNodes.Add(node, result);
if (CSharpAstResolver.IsUnresolvableNode(node)) if (CSharpAstResolver.IsUnresolvableNode(node))
throw new InvalidOperationException("Resolved unresolvable node"); throw new InvalidOperationException("Resolved unresolvable node");
if (!ParenthesizedExpression.ActsAsParenthesizedExpression(node))
if (!resolveResults.Add(result))
throw new InvalidOperationException("Duplicate resolve result");
if (result.IsError && !allowErrors) { if (result.IsError && !allowErrors) {
Console.WriteLine("Compiler error at " + fileName + ":" + node.StartLocation + ": " + result); Console.WriteLine("Compiler error at " + fileName + ":" + node.StartLocation + ": " + result);

3
ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ExtractFieldTests.cs

@ -81,7 +81,6 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions
"class TestClass" + Environment.NewLine + "class TestClass" + Environment.NewLine +
"{" + Environment.NewLine + "{" + Environment.NewLine +
" int foo;" + Environment.NewLine + " int foo;" + Environment.NewLine +
"" + Environment.NewLine +
" void Test ()" + Environment.NewLine + " void Test ()" + Environment.NewLine +
" {" + Environment.NewLine + " {" + Environment.NewLine +
" foo = 5;" + Environment.NewLine + " foo = 5;" + Environment.NewLine +
@ -109,7 +108,6 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions
"class TestClass" + Environment.NewLine + "class TestClass" + Environment.NewLine +
"{" + Environment.NewLine + "{" + Environment.NewLine +
" int foo;" + Environment.NewLine + " int foo;" + Environment.NewLine +
"" + Environment.NewLine +
" void Test ()" + Environment.NewLine + " void Test ()" + Environment.NewLine +
" {" + Environment.NewLine + " {" + Environment.NewLine +
" }" + Environment.NewLine + " }" + Environment.NewLine +
@ -136,7 +134,6 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions
"class TestClass" + Environment.NewLine + "class TestClass" + Environment.NewLine +
"{" + Environment.NewLine + "{" + Environment.NewLine +
" int foo;" + Environment.NewLine + " int foo;" + Environment.NewLine +
"" + Environment.NewLine +
" TestClass (int foo)" + Environment.NewLine + " TestClass (int foo)" + Environment.NewLine +
" {" + Environment.NewLine + " {" + Environment.NewLine +
" this.foo = foo;" + Environment.NewLine + " this.foo = foo;" + Environment.NewLine +

4
ICSharpCode.NRefactory.Tests/CSharp/CodeActions/IntroduceConstantTests.cs

@ -82,10 +82,10 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions
} }
}", @"class TestClass }", @"class TestClass
{ {
const string HelloWorld = ""Hello World""; const string helloWorld = ""Hello World"";
public void Hello () public void Hello ()
{ {
System.Console.WriteLine (HelloWorld); System.Console.WriteLine (helloWorld);
} }
}", 1); }", 1);
} }

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

@ -4386,7 +4386,25 @@ namespace Test
Assert.IsNotNull (provider.Find ("foo:"), "'foo:' not found."); Assert.IsNotNull (provider.Find ("foo:"), "'foo:' not found.");
}); });
} }
[Test()]
public void TestNamedParameters2 ()
{
var provider = CreateCtrlSpaceProvider (
@"class MyClass {
string Bar { get; set; }
void MethodOne(string foo="""", string bar="""")
{
}
void MethodTwo() {
MethodOne($$);
}
}");
Assert.IsNotNull (provider.Find ("bar:"), "'bar:' not found.");
Assert.IsNotNull (provider.Find ("foo:"), "'foo:' not found.");
}
[Test()] [Test()]
public void TestNamedParametersConstructorCase () public void TestNamedParametersConstructorCase ()
{ {

6
ICSharpCode.NRefactory.Tests/CSharp/Resolver/LinqTests.cs

@ -103,8 +103,8 @@ class TestClass {
} }
} }
"; ";
var rr = Resolve<CSharpInvocationResolveResult>(program); var rr = Resolve<ConversionResolveResult>(program);
Assert.AreEqual("System.Linq.Enumerable.Select", rr.Member.FullName); Assert.IsTrue(rr.Conversion.IsIdentityConversion);
Assert.AreEqual("System.Collections.Generic.IEnumerable", rr.Type.FullName); Assert.AreEqual("System.Collections.Generic.IEnumerable", rr.Type.FullName);
Assert.AreEqual("System.Int32", ((ParameterizedType)rr.Type).TypeArguments[0].FullName); Assert.AreEqual("System.Int32", ((ParameterizedType)rr.Type).TypeArguments[0].FullName);
} }
@ -114,7 +114,7 @@ class TestClass {
{ {
string program = @"using System; string program = @"using System;
class TestClass { static void M() { class TestClass { static void M() {
$(from a in new XYZ() select a.ToUpper())$.ToString(); (from a in new XYZ() $select a.ToUpper()$).ToString();
}} }}
class XYZ { class XYZ {
public int Select<U>(Func<string, U> f) { return 42; } public int Select<U>(Func<string, U> f) { return 42; }

18
ICSharpCode.NRefactory.Tests/CSharp/Resolver/ResolveAtLocationTests.cs

@ -161,5 +161,23 @@ namespace Bug5114
"); ");
Assert.AreEqual("HandleLongPressGesture", rr.MethodName); Assert.AreEqual("HandleLongPressGesture", rr.MethodName);
} }
[Test]
public void ArrayInitializer()
{
Assert.IsNull(ResolveAtLocation(
@"using System.Collections.Generic;
class Foo {
void Bar()
{
var o = new Dictionary<int,int> () {
{1$, 2 },
{1, 2 },
{1, 2 },
{1, 2 }
};
}
}"));
}
} }
} }

10
ICSharpCode.NRefactory/Semantics/MemberResolveResult.cs

@ -75,6 +75,16 @@ namespace ICSharpCode.NRefactory.Semantics
this.constantValue = constantValue; this.constantValue = constantValue;
} }
public MemberResolveResult(ResolveResult targetResult, IMember member, IType returnType, bool isConstant, object constantValue, bool isVirtualCall)
: base(returnType)
{
this.targetResult = targetResult;
this.member = member;
this.isConstant = isConstant;
this.constantValue = constantValue;
this.isVirtualCall = isVirtualCall;
}
public ResolveResult TargetResult { public ResolveResult TargetResult {
get { return targetResult; } get { return targetResult; }
} }

5
ICSharpCode.NRefactory/Semantics/ResolveResult.cs

@ -70,5 +70,10 @@ namespace ICSharpCode.NRefactory.Semantics
{ {
return DomRegion.Empty; return DomRegion.Empty;
} }
public virtual ResolveResult ShallowClone()
{
return (ResolveResult)MemberwiseClone();
}
} }
} }

4
ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultMemberReference.cs

@ -63,7 +63,9 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
IType type = typeReference.Resolve(context); IType type = typeReference.Resolve(context);
IEnumerable<IMember> members; IEnumerable<IMember> members;
if (entityType == EntityType.Accessor) { if (entityType == EntityType.Accessor) {
members = type.GetAccessors(m => m.Name == name && !m.IsExplicitInterfaceImplementation); members = type.GetAccessors(
m => m.Name == name && !m.IsExplicitInterfaceImplementation,
GetMemberOptions.IgnoreInheritedMembers);
} else if (entityType == EntityType.Method) { } else if (entityType == EntityType.Method) {
members = type.GetMethods( members = type.GetMethods(
m => m.Name == name && m.EntityType == EntityType.Method m => m.Name == name && m.EntityType == EntityType.Method

Loading…
Cancel
Save