|
|
|
@ -515,15 +515,16 @@ namespace ICSharpCode.Decompiler.IL.Transforms
@@ -515,15 +515,16 @@ namespace ICSharpCode.Decompiler.IL.Transforms
|
|
|
|
|
Arguments = { left(), right() } |
|
|
|
|
}, method.ReturnType); |
|
|
|
|
case 4: |
|
|
|
|
if (!invocation.Arguments[2].MatchLdcI4(out var isLifted)) |
|
|
|
|
if (!invocation.Arguments[2].MatchLdcI4(out var isLiftedToNull)) |
|
|
|
|
return (null, SpecialType.UnknownType); |
|
|
|
|
if (!MatchGetMethodFromHandle(invocation.Arguments[3], out method)) |
|
|
|
|
return (null, SpecialType.UnknownType); |
|
|
|
|
if (isLifted != 0) |
|
|
|
|
bool isLifted = NullableType.IsNullable(leftType); |
|
|
|
|
if (isLifted) |
|
|
|
|
method = CSharpOperators.LiftUserDefinedOperator((IMethod)method); |
|
|
|
|
return (() => new Call((IMethod)method) { |
|
|
|
|
Arguments = { left(), right() } |
|
|
|
|
}, method.ReturnType); |
|
|
|
|
}, isLiftedToNull != 0 ? NullableType.Create(method.Compilation, method.ReturnType) : method.ReturnType); |
|
|
|
|
default: |
|
|
|
|
return (null, SpecialType.UnknownType); |
|
|
|
|
} |
|
|
|
@ -729,13 +730,12 @@ namespace ICSharpCode.Decompiler.IL.Transforms
@@ -729,13 +730,12 @@ namespace ICSharpCode.Decompiler.IL.Transforms
|
|
|
|
|
var (right, rightType) = ConvertInstruction(invocation.Arguments[1]); |
|
|
|
|
if (right == null) |
|
|
|
|
return (null, SpecialType.UnknownType); |
|
|
|
|
if (invocation.Arguments.Count == 4 && invocation.Arguments[2].MatchLdcI4(out var isLifted) && MatchGetMethodFromHandle(invocation.Arguments[3], out var method)) |
|
|
|
|
if (invocation.Arguments.Count == 4 && invocation.Arguments[2].MatchLdcI4(out var isLiftedToNull) && MatchGetMethodFromHandle(invocation.Arguments[3], out var method)) |
|
|
|
|
{ |
|
|
|
|
if (isLifted != 0) |
|
|
|
|
{ |
|
|
|
|
bool isLifted = NullableType.IsNullable(leftType); |
|
|
|
|
if (isLifted) |
|
|
|
|
method = CSharpOperators.LiftUserDefinedOperator((IMethod)method); |
|
|
|
|
} |
|
|
|
|
return (() => new Call((IMethod)method) { Arguments = { left(), right() } }, method.ReturnType); |
|
|
|
|
return (() => new Call((IMethod)method) { Arguments = { left(), right() } }, isLiftedToNull != 0 ? NullableType.Create(method.Compilation, method.ReturnType) : method.ReturnType); |
|
|
|
|
} |
|
|
|
|
var rr = resolver.ResolveBinaryOperator(kind.ToBinaryOperatorType(), new ResolveResult(leftType), new ResolveResult(rightType)) as OperatorResolveResult; |
|
|
|
|
if (rr != null && !rr.IsError && rr.UserDefinedOperatorMethod != null) |
|
|
|
@ -979,15 +979,16 @@ namespace ICSharpCode.Decompiler.IL.Transforms
@@ -979,15 +979,16 @@ namespace ICSharpCode.Decompiler.IL.Transforms
|
|
|
|
|
Arguments = { left(), right() } |
|
|
|
|
}, method.ReturnType); |
|
|
|
|
case 4: |
|
|
|
|
if (!invocation.Arguments[2].MatchLdcI4(out var isLifted)) |
|
|
|
|
if (!invocation.Arguments[2].MatchLdcI4(out var isLiftedToNull)) |
|
|
|
|
return (null, SpecialType.UnknownType); |
|
|
|
|
if (!MatchGetMethodFromHandle(invocation.Arguments[3], out method)) |
|
|
|
|
return (null, SpecialType.UnknownType); |
|
|
|
|
if (isLifted != 0) |
|
|
|
|
bool isLifted = NullableType.IsNullable(leftType); |
|
|
|
|
if (isLifted) |
|
|
|
|
method = CSharpOperators.LiftUserDefinedOperator((IMethod)method); |
|
|
|
|
return (() => new Call((IMethod)method) { |
|
|
|
|
Arguments = { left(), right() } |
|
|
|
|
}, method.ReturnType); |
|
|
|
|
}, isLiftedToNull != 0 ? NullableType.Create(method.Compilation, method.ReturnType) : method.ReturnType); |
|
|
|
|
default: |
|
|
|
|
return (null, SpecialType.UnknownType); |
|
|
|
|
} |
|
|
|
|