Browse Source

Add ConversionResolveResult.CheckForOverflow

newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
5b933b8afb
  1. 27
      src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs
  2. 4
      src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/MethodGroupResolveResult.cs
  3. 11
      src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/OverloadResolution.cs
  4. 8
      src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs
  5. 11
      src/Libraries/NRefactory/ICSharpCode.NRefactory/Semantics/ConversionResolveResult.cs

27
src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs

@ -390,7 +390,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -390,7 +390,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
bool isNullable = NullableType.IsNullable(expression.Type);
// the operator is overloadable:
OverloadResolution userDefinedOperatorOR = new OverloadResolution(compilation, new[] { expression }, conversions: conversions);
OverloadResolution userDefinedOperatorOR = CreateOverloadResolution(new[] { expression });
foreach (var candidate in GetUserDefinedOperatorCandidates(type, overloadableOperatorName)) {
userDefinedOperatorOR.AddCandidate(candidate);
}
@ -439,7 +439,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -439,7 +439,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
default:
throw new InvalidOperationException();
}
OverloadResolution builtinOperatorOR = new OverloadResolution(compilation, new[] { expression }, conversions: conversions);
OverloadResolution builtinOperatorOR = CreateOverloadResolution(new[] { expression });
foreach (var candidate in methodGroup) {
builtinOperatorOR.AddCandidate(candidate);
}
@ -569,7 +569,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -569,7 +569,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
IType rhsType = NullableType.GetUnderlyingType(rhs.Type);
// the operator is overloadable:
OverloadResolution userDefinedOperatorOR = new OverloadResolution(compilation, new[] { lhs, rhs }, conversions: conversions);
OverloadResolution userDefinedOperatorOR = CreateOverloadResolution(new[] { lhs, rhs });
HashSet<IParameterizedMember> userOperatorCandidates = new HashSet<IParameterizedMember>();
userOperatorCandidates.UnionWith(GetUserDefinedOperatorCandidates(lhsType, overloadableOperatorName));
userOperatorCandidates.UnionWith(GetUserDefinedOperatorCandidates(rhsType, overloadableOperatorName));
@ -800,7 +800,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -800,7 +800,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
default:
throw new InvalidOperationException();
}
OverloadResolution builtinOperatorOR = new OverloadResolution(compilation, new[] { lhs, rhs }, conversions: conversions);
OverloadResolution builtinOperatorOR = CreateOverloadResolution(new[] { lhs, rhs });
foreach (var candidate in methodGroup) {
builtinOperatorOR.AddCandidate(candidate);
}
@ -1260,7 +1260,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -1260,7 +1260,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
else if (rr.IsCompileTimeConstant && c != Conversion.None)
return ResolveCast(targetType, rr);
else
return new ConversionResolveResult(targetType, rr, c);
return new ConversionResolveResult(targetType, rr, c, checkForOverflow);
}
public ResolveResult ResolveCast(IType targetType, ResolveResult expression)
@ -1291,7 +1291,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -1291,7 +1291,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
}
}
Conversion c = conversions.ExplicitConversion(expression, targetType);
return new ConversionResolveResult(targetType, expression, c);
return new ConversionResolveResult(targetType, expression, c, checkForOverflow);
}
internal object CSharpPrimitiveCast(TypeCode targetType, object input)
@ -1891,7 +1891,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -1891,7 +1891,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
MethodGroupResolveResult mgrr = target as MethodGroupResolveResult;
if (mgrr != null) {
OverloadResolution or = mgrr.PerformOverloadResolution(compilation, arguments, argumentNames, conversions: conversions);
OverloadResolution or = mgrr.PerformOverloadResolution(compilation, arguments, argumentNames, checkForOverflow: checkForOverflow, conversions: conversions);
if (or.BestCandidate != null) {
if (or.BestCandidate.IsStatic && !or.IsExtensionMethodInvocation && !(mgrr.TargetResult is TypeResolveResult))
return or.CreateResolveResult(new TypeResolveResult(mgrr.TargetResult.Type));
@ -1914,7 +1914,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -1914,7 +1914,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
}
IMethod invokeMethod = target.Type.GetDelegateInvokeMethod();
if (invokeMethod != null) {
OverloadResolution or = new OverloadResolution(compilation, arguments, argumentNames, conversions: conversions);
OverloadResolution or = CreateOverloadResolution(arguments, argumentNames);
or.AddCandidate(invokeMethod);
return new CSharpInvocationResolveResult(
target, invokeMethod, //invokeMethod.ReturnType.Resolve(context),
@ -2003,6 +2003,13 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -2003,6 +2003,13 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
variableName = variableName.Substring(1);
return char.ToLower(variableName[0]) + variableName.Substring(1);
}
OverloadResolution CreateOverloadResolution(ResolveResult[] arguments, string[] argumentNames = null, IType[] typeArguments = null)
{
var or = new OverloadResolution(compilation, arguments, argumentNames, typeArguments, conversions);
or.CheckForOverflow = checkForOverflow;
return or;
}
#endregion
#region ResolveIndexer
@ -2035,7 +2042,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -2035,7 +2042,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
}
// §7.6.6.2 Indexer access
OverloadResolution or = new OverloadResolution(compilation, arguments, argumentNames, conversions: conversions);
OverloadResolution or = CreateOverloadResolution(arguments, argumentNames);
MemberLookup lookup = CreateMemberLookup();
var indexers = lookup.LookupIndexers(target.Type);
or.AddMethodLists(indexers);
@ -2090,7 +2097,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -2090,7 +2097,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
if (type.Kind == TypeKind.Delegate && arguments.Length == 1) {
return Convert(arguments[0], type);
}
OverloadResolution or = new OverloadResolution(compilation, arguments, argumentNames, conversions: conversions);
OverloadResolution or = CreateOverloadResolution(arguments, argumentNames);
MemberLookup lookup = CreateMemberLookup();
foreach (IMethod ctor in type.GetConstructors()) {
if (lookup.IsAccessible(ctor, allowProtectedAccess))

4
src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/MethodGroupResolveResult.cs

@ -178,7 +178,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -178,7 +178,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
return string.Format("[{0} with {1} method(s)]", GetType().Name, this.Methods.Count());
}
public OverloadResolution PerformOverloadResolution(ICompilation compilation, ResolveResult[] arguments, string[] argumentNames = null, bool allowExtensionMethods = true, bool allowExpandingParams = true, CSharpConversions conversions = null)
public OverloadResolution PerformOverloadResolution(ICompilation compilation, ResolveResult[] arguments, string[] argumentNames = null, bool allowExtensionMethods = true, bool allowExpandingParams = true, bool checkForOverflow = false, CSharpConversions conversions = null)
{
Log.WriteLine("Performing overload resolution for " + this);
Log.WriteCollection(" Arguments: ", arguments);
@ -186,6 +186,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -186,6 +186,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
var typeArgumentArray = this.TypeArguments.ToArray();
OverloadResolution or = new OverloadResolution(compilation, arguments, argumentNames, typeArgumentArray, conversions);
or.AllowExpandingParams = allowExpandingParams;
or.CheckForOverflow = checkForOverflow;
or.AddMethodLists(methodLists);
@ -207,6 +208,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -207,6 +208,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
var extOr = new OverloadResolution(compilation, extArguments, extArgumentNames, typeArgumentArray, conversions);
extOr.AllowExpandingParams = allowExpandingParams;
extOr.IsExtensionMethodInvocation = true;
extOr.CheckForOverflow = checkForOverflow;
foreach (var g in extensionMethods) {
foreach (var method in g) {

11
src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/OverloadResolution.cs

@ -170,6 +170,13 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -170,6 +170,13 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
/// </summary>
public bool AllowExpandingParams { get; set; }
/// <summary>
/// Gets/Sets whether ConversionResolveResults created by this OverloadResolution
/// instance apply overflow checking.
/// The default value is false.
/// </summary>
public bool CheckForOverflow { get; set; }
/// <summary>
/// Gets the arguments for which this OverloadResolution instance was created.
/// </summary>
@ -801,9 +808,9 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -801,9 +808,9 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
parameterType = SpecialType.UnknownType;
}
if (arguments[i].IsCompileTimeConstant && conversions[i] != Conversion.None) {
args[i] = new CSharpResolver(compilation).ResolveCast(parameterType, argument);
args[i] = new CSharpResolver(compilation).WithCheckForOverflow(CheckForOverflow).ResolveCast(parameterType, argument);
} else {
args[i] = new ConversionResolveResult(parameterType, argument, conversions[i]);
args[i] = new ConversionResolveResult(parameterType, argument, conversions[i], CheckForOverflow);
}
}
}

8
src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs

@ -1236,7 +1236,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -1236,7 +1236,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
if (resolverEnabled) {
ResolveResult input = Resolve(asExpression.Expression);
var targetType = ResolveType(asExpression.Type);
return new ConversionResolveResult(targetType, input, Conversion.TryCast);
return new ConversionResolveResult(targetType, input, Conversion.TryCast, resolver.CheckForOverflow);
} else {
ScanChildren(asExpression);
return null;
@ -1498,7 +1498,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -1498,7 +1498,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
var addRR = memberLookup.Lookup(initializedObject, "Add", EmptyList<IType>.Instance, true);
var mgrr = addRR as MethodGroupResolveResult;
if (mgrr != null) {
OverloadResolution or = mgrr.PerformOverloadResolution(resolver.Compilation, addArguments, null, false, false, resolver.conversions);
OverloadResolution or = mgrr.PerformOverloadResolution(resolver.Compilation, addArguments, null, false, false, resolver.CheckForOverflow, resolver.conversions);
var invocationRR = or.CreateResolveResult(initializedObject);
StoreResult(aie, invocationRR);
ProcessConversionsInInvocation(null, aie.Elements, invocationRR);
@ -3415,7 +3415,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -3415,7 +3415,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
/// </summary>
ResolveResult WrapResult(ResolveResult result)
{
return new ConversionResolveResult(result.Type, result, Conversion.IdentityConversion);
return new ConversionResolveResult(result.Type, result, Conversion.IdentityConversion, resolver.CheckForOverflow);
}
ResolveResult IAstVisitor<ResolveResult>.VisitQueryContinuationClause(QueryContinuationClause queryContinuationClause)
@ -3603,7 +3603,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -3603,7 +3603,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
ProcessConversion(queryWhereClause.Condition, condition, conversionToBool, boolType);
if (currentQueryResult != null) {
if (conversionToBool != Conversion.IdentityConversion && conversionToBool != Conversion.None) {
condition = new ConversionResolveResult(boolType, condition, conversionToBool);
condition = new ConversionResolveResult(boolType, condition, conversionToBool, resolver.CheckForOverflow);
}
var methodGroup = resolver.ResolveMemberAccess(currentQueryResult, "Where", EmptyList<IType>.Instance);

11
src/Libraries/NRefactory/ICSharpCode.NRefactory/Semantics/ConversionResolveResult.cs

@ -27,6 +27,11 @@ namespace ICSharpCode.NRefactory.Semantics @@ -27,6 +27,11 @@ namespace ICSharpCode.NRefactory.Semantics
public readonly ResolveResult Input;
public readonly Conversion Conversion;
/// <summary>
/// For numeric conversions, specifies whether overflow checking is enabled.
/// </summary>
public readonly bool CheckForOverflow;
public ConversionResolveResult(IType targetType, ResolveResult input, Conversion conversion)
: base(targetType)
{
@ -38,6 +43,12 @@ namespace ICSharpCode.NRefactory.Semantics @@ -38,6 +43,12 @@ namespace ICSharpCode.NRefactory.Semantics
this.Conversion = conversion;
}
public ConversionResolveResult(IType targetType, ResolveResult input, Conversion conversion, bool checkForOverflow)
: this(targetType, input, conversion)
{
this.CheckForOverflow = checkForOverflow;
}
public override bool IsError {
get { return !Conversion.IsValid; }
}

Loading…
Cancel
Save