Browse Source

Fixed bug in CSharpAstResolver.GetExpectedType().

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
e80f142381
  1. 18
      ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs
  2. 32
      ICSharpCode.NRefactory.ConsistencyCheck/RandomizedOrderResolverTest.cs

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

@ -452,20 +452,6 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
return null; return null;
} }
/// <summary>
/// Gets the resolve result for the specified node.
/// If the node was not resolved by the navigator, this method will return null.
/// </summary>
public ResolveResult GetResolveResultIfResolved(AstNode node)
{
MergeUndecidedLambdas();
ResolveResult result;
if (resolveResultCache.TryGetValue(node, out result))
return result;
else
return null;
}
CSharpResolver GetPreviouslyScannedContext(AstNode node, out AstNode parent) CSharpResolver GetPreviouslyScannedContext(AstNode node, out AstNode parent)
{ {
parent = node; parent = node;
@ -530,7 +516,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
if (conversionDict.TryGetValue(expr, out result)) { if (conversionDict.TryGetValue(expr, out result)) {
return result; return result;
} else { } else {
ResolveResult rr = GetResolveResultIfResolved(expr); ResolveResult rr = GetResolveResult(expr);
return new ConversionWithTargetType(Conversion.IdentityConversion, rr != null ? rr.Type : SpecialType.UnknownType); return new ConversionWithTargetType(Conversion.IdentityConversion, rr != null ? rr.Type : SpecialType.UnknownType);
} }
} }
@ -2515,7 +2501,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
resolver = resolver.PushBlock(); resolver = resolver.PushBlock();
IVariable v; IVariable v;
if (IsVar(foreachStatement.VariableType)) { if (isImplicitlyTypedVariable) {
StoreCurrentState(foreachStatement.VariableType); StoreCurrentState(foreachStatement.VariableType);
StoreResult(foreachStatement.VariableType, new TypeResolveResult(elementType)); StoreResult(foreachStatement.VariableType, new TypeResolveResult(elementType));
v = MakeVariable(elementType, foreachStatement.VariableNameToken); v = MakeVariable(elementType, foreachStatement.VariableNameToken);

32
ICSharpCode.NRefactory.ConsistencyCheck/RandomizedOrderResolverTest.cs

@ -54,6 +54,8 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
bool checkResults = rnd.Next(0, 2) == 0; bool checkResults = rnd.Next(0, 2) == 0;
bool checkStateBefore = rnd.Next(0, 2) == 0; bool checkStateBefore = rnd.Next(0, 2) == 0;
bool checkStateAfter = rnd.Next(0, 2) == 0; bool checkStateAfter = rnd.Next(0, 2) == 0;
bool checkConversion = rnd.Next(0, 2) == 0;
bool checkExpectedType = rnd.Next(0, 2) == 0;
foreach (var _node in file.CompilationUnit.DescendantsAndSelf) { foreach (var _node in file.CompilationUnit.DescendantsAndSelf) {
var node = _node; var node = _node;
if (CSharpAstResolver.IsUnresolvableNode(node)) if (CSharpAstResolver.IsUnresolvableNode(node))
@ -66,8 +68,10 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
actions.Add(() => test.CheckStateAfter(node)); actions.Add(() => test.CheckStateAfter(node));
var expr = node as Expression; var expr = node as Expression;
if (expr != null) { if (expr != null) {
//actions.Add(() => test.CheckExpectedType(node)); if (checkConversion)
//actions.Add(() => test.CheckConversion(node)); actions.Add(() => test.CheckConversion(expr));
if (checkExpectedType)
actions.Add(() => test.CheckExpectedType(expr));
} }
} }
@ -119,6 +123,30 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
return false; return false;
} }
bool CheckConversion(Expression node)
{
Conversion expectedConversion = resolveAllResolver.GetConversion(node);
Conversion actualConversion = resolver.GetConversion(node);
if (Compare(expectedConversion, actualConversion, typeof(Conversion)))
return true;
Console.WriteLine("Different conversions for '{0}' at {1} in {2}:", node, node.StartLocation, node.GetRegion().FileName);
Console.WriteLine(" expected: " + expectedConversion);
Console.WriteLine(" actual: " + actualConversion);
return false;
}
bool CheckExpectedType(Expression node)
{
IType expectedExpectedType = resolveAllResolver.GetExpectedType(node);
IType actualExpectedType = resolver.GetExpectedType(node);
if (expectedExpectedType.Equals(actualExpectedType))
return true;
Console.WriteLine("Different expected types for '{0}' at {1} in {2}:", node, node.StartLocation, node.GetRegion().FileName);
Console.WriteLine(" expected: " + expectedExpectedType);
Console.WriteLine(" actual: " + actualExpectedType);
return false;
}
bool IsEqualResolveResult(ResolveResult rr1, ResolveResult rr2) bool IsEqualResolveResult(ResolveResult rr1, ResolveResult rr2)
{ {
if (rr1 == rr2) if (rr1 == rr2)

Loading…
Cancel
Save