Browse Source

Fix #1785: Only use System.MathF, if it is available in the used framework.

pull/1866/head
Siegfried Pammer 6 years ago
parent
commit
aef5fc1bce
  1. 9
      ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs
  2. 26
      ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs

9
ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs

@ -1044,9 +1044,14 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax @@ -1044,9 +1044,14 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
if (isDouble)
mathType = compilation.FindType(typeof(Math));
else {
mathType = compilation.FindType(new TopLevelTypeName("System", "MathF")).GetDefinition();
if (mathType == null || !mathType.GetFields(f => f.Name == "PI" && f.IsConst).Any() || !mathType.GetFields(f => f.Name == "E" && f.IsConst).Any())
mathType = compilation.FindType(new TopLevelTypeName("System", "MathF"));
var typeDef = mathType.GetDefinition();
if (typeDef == null
|| !typeDef.IsDirectImportOf(compilation.MainModule)
|| !typeDef.GetFields(f => f.Name == "PI" && f.IsConst).Any() || !typeDef.GetFields(f => f.Name == "E" && f.IsConst).Any())
{
mathType = compilation.FindType(typeof(Math));
}
}
expr = TryExtractExpression(mathType, type, constantValue, "PI", isDouble)

26
ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs

@ -20,6 +20,7 @@ using System; @@ -20,6 +20,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.Decompiler.CSharp.Syntax;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.Semantics;
using ICSharpCode.Decompiler.TypeSystem.Implementation;
using ICSharpCode.Decompiler.Util;
@ -540,5 +541,30 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -540,5 +541,30 @@ namespace ICSharpCode.Decompiler.TypeSystem
{
return type.ChangeNullability(Nullability.Oblivious);
}
public static bool IsDirectImportOf(this ITypeDefinition type, IModule module)
{
var moduleReference = type.ParentModule;
foreach (var asmRef in module.PEFile.AssemblyReferences) {
if (asmRef.FullName == moduleReference.FullAssemblyName)
return true;
if (asmRef.Name == "netstandard" && asmRef.GetPublicKeyToken() != null) {
var referencedModule = module.Compilation.FindModuleByReference(asmRef);
if (referencedModule != null && !referencedModule.PEFile.GetTypeForwarder(type.FullTypeName).IsNil)
return true;
}
}
return false;
}
public static IModule FindModuleByReference(this ICompilation compilation, IAssemblyReference assemblyName)
{
foreach (var module in compilation.Modules) {
if (module.FullAssemblyName == assemblyName.FullName) {
return module;
}
}
return null;
}
}
}

Loading…
Cancel
Save