Browse Source

Add LangVersion support to WholeProjectDecompiler and add NonTrailingNamedArguments setting.

pull/1236/head
Siegfried Pammer 7 years ago
parent
commit
3377e93628
  1. 2
      ICSharpCode.Decompiler.Tests/RoundtripAssembly.cs
  2. 15
      ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs
  3. 39
      ICSharpCode.Decompiler/DecompilerSettings.cs

2
ICSharpCode.Decompiler.Tests/RoundtripAssembly.cs

@ -145,7 +145,7 @@ namespace ICSharpCode.Decompiler.Tests @@ -145,7 +145,7 @@ namespace ICSharpCode.Decompiler.Tests
Stopwatch w = Stopwatch.StartNew();
using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read)) {
PEFile module = new PEFile(file, fileStream, PEStreamOptions.PrefetchEntireImage);
UniversalAssemblyResolver resolver = new UniversalAssemblyResolver(file, false, module.Reader.DetectTargetFrameworkId(), PEStreamOptions.PrefetchMetadata);
var resolver = new UniversalAssemblyResolver(file, false, module.Reader.DetectTargetFrameworkId(), PEStreamOptions.PrefetchMetadata);
resolver.AddSearchDirectory(inputDir);
resolver.RemoveSearchDirectory(".");
var decompiler = new TestProjectDecompiler(inputDir);

15
ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs

@ -57,6 +57,19 @@ namespace ICSharpCode.Decompiler.CSharp @@ -57,6 +57,19 @@ namespace ICSharpCode.Decompiler.CSharp
}
}
LanguageVersion? languageVersion;
public LanguageVersion LanguageVersion {
get { return languageVersion ?? Settings.GetMinimumRequiredVersion(); }
set {
var minVersion = Settings.GetMinimumRequiredVersion();
if (value < minVersion)
throw new InvalidOperationException($"The chosen settings require at least {minVersion}." +
$" Please change the DecompilerSettings accordingly.");
languageVersion = value;
}
}
public IAssemblyResolver AssemblyResolver { get; set; }
/// <summary>
@ -148,6 +161,8 @@ namespace ICSharpCode.Decompiler.CSharp @@ -148,6 +161,8 @@ namespace ICSharpCode.Decompiler.CSharp
}
}
w.WriteElementString("LangVersion", LanguageVersion.ToString().Replace("CSharp", "").Replace('_', '.'));
w.WriteElementString("AssemblyName", module.Name);
bool useTargetFrameworkAttribute = false;
LanguageTargets languageTargets = LanguageTargets.None;

39
ICSharpCode.Decompiler/DecompilerSettings.cs

@ -84,6 +84,7 @@ namespace ICSharpCode.Decompiler @@ -84,6 +84,7 @@ namespace ICSharpCode.Decompiler
}
if (languageVersion < CSharp.LanguageVersion.CSharp7_2) {
introduceRefAndReadonlyModifiersOnStructs = false;
nonTrailingNamedArguments = false;
}
if (languageVersion < CSharp.LanguageVersion.CSharp7_3) {
//introduceUnmanagedTypeConstraint = false;
@ -91,6 +92,29 @@ namespace ICSharpCode.Decompiler @@ -91,6 +92,29 @@ namespace ICSharpCode.Decompiler
}
}
public CSharp.LanguageVersion GetMinimumRequiredVersion()
{
if (tupleComparisons)
return CSharp.LanguageVersion.CSharp7_3;
if (IntroduceRefAndReadonlyModifiersOnStructs || nonTrailingNamedArguments)
return CSharp.LanguageVersion.CSharp7_2;
// C# 7.1 missing
if (outVariables || tupleTypes || tupleConversions || discards)
return CSharp.LanguageVersion.CSharp7;
if (awaitInCatchFinally || useExpressionBodyForCalculatedGetterOnlyProperties || nullPropagation
|| stringInterpolation || dictionaryInitializers || extensionMethodsInCollectionInitializers)
return CSharp.LanguageVersion.CSharp6;
if (asyncAwait)
return CSharp.LanguageVersion.CSharp5;
if (dynamic || namedArguments || optionalArguments)
return CSharp.LanguageVersion.CSharp4;
if (anonymousTypes || objectCollectionInitializers || automaticProperties || queryExpressions || expressionTrees)
return CSharp.LanguageVersion.CSharp3;
if (anonymousMethods || liftNullables || yieldReturn || useImplicitMethodGroupConversion)
return CSharp.LanguageVersion.CSharp2;
return CSharp.LanguageVersion.CSharp1;
}
bool anonymousMethods = true;
/// <summary>
@ -688,6 +712,21 @@ namespace ICSharpCode.Decompiler @@ -688,6 +712,21 @@ namespace ICSharpCode.Decompiler
}
}
bool nonTrailingNamedArguments = true;
/// <summary>
/// Gets/Sets whether C# 7.2 non-trailing named arguments should be used.
/// </summary>
public bool NonTrailingNamedArguments {
get { return nonTrailingNamedArguments; }
set {
if (nonTrailingNamedArguments != value) {
nonTrailingNamedArguments = value;
OnPropertyChanged();
}
}
}
bool optionalArguments = true;
/// <summary>

Loading…
Cancel
Save