Browse Source

Add Language version dropdown

pull/1087/head
Siegfried Pammer 7 years ago
parent
commit
3f5b8602f8
  1. 2
      ILSpy/Commands/DecompileAllCommand.cs
  2. 2
      ILSpy/DebugSteps.xaml.cs
  3. 19
      ILSpy/DecompilationOptions.cs
  4. 32
      ILSpy/FilterSettings.cs
  5. 30
      ILSpy/Languages/CSharpLanguage.cs
  6. 37
      ILSpy/Languages/Language.cs
  7. 4
      ILSpy/MainWindow.xaml
  8. 15
      ILSpy/MainWindow.xaml.cs
  9. 8
      ILSpy/Options/DecompilerSettingsPanel.xaml
  10. 240
      ILSpy/Options/DecompilerSettingsPanel.xaml.cs
  11. 2
      ILSpy/TreeNodes/AssemblyTreeNode.cs

2
ILSpy/Commands/DecompileAllCommand.cs

@ -43,7 +43,7 @@ namespace ICSharpCode.ILSpy @@ -43,7 +43,7 @@ namespace ICSharpCode.ILSpy
Exception exception = null;
using (var writer = new System.IO.StreamWriter("c:\\temp\\decompiled\\" + asm.ShortName + ".cs")) {
try {
new CSharpLanguage().DecompileAssembly(asm, new Decompiler.PlainTextOutput(writer), new DecompilationOptions { FullDecompilation = true, CancellationToken = ct });
new CSharpLanguage().DecompileAssembly(asm, new Decompiler.PlainTextOutput(writer), new DecompilationOptions(MainWindow.Instance.CurrentLanguageVersion, Options.DecompilerSettingsPanel.CurrentDecompilerSettings) { FullDecompilation = true, CancellationToken = ct });
}
catch (Exception ex) {
writer.WriteLine(ex.ToString());

2
ILSpy/DebugSteps.xaml.cs

@ -127,7 +127,7 @@ namespace ICSharpCode.ILSpy @@ -127,7 +127,7 @@ namespace ICSharpCode.ILSpy
var window = MainWindow.Instance;
var state = window.TextView.GetState();
window.TextView.DecompileAsync(window.CurrentLanguage, window.SelectedNodes,
new DecompilationOptions() {
new DecompilationOptions(window.CurrentLanguageVersion, ILSpy.Options.DecompilerSettingsPanel.CurrentDecompilerSettings) {
StepLimit = step,
IsDebug = isDebug,
TextViewState = state

19
ILSpy/DecompilationOptions.cs

@ -16,6 +16,7 @@ @@ -16,6 +16,7 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using System.Threading;
using ICSharpCode.Decompiler;
using ICSharpCode.ILSpy.Options;
@ -50,7 +51,7 @@ namespace ICSharpCode.ILSpy @@ -50,7 +51,7 @@ namespace ICSharpCode.ILSpy
/// <summary>
/// Gets the settings for the decompiler.
/// </summary>
public DecompilerSettings DecompilerSettings { get; set; }
public Decompiler.DecompilerSettings DecompilerSettings { get; private set; }
/// <summary>
/// Gets/sets an optional state of a decompiler text view.
@ -66,9 +67,21 @@ namespace ICSharpCode.ILSpy @@ -66,9 +67,21 @@ namespace ICSharpCode.ILSpy
internal int StepLimit = int.MaxValue;
internal bool IsDebug = false;
public DecompilationOptions()
public DecompilationOptions(LanguageVersion version, Options.DecompilerSettings settings)
{
this.DecompilerSettings = DecompilerSettingsPanel.CurrentDecompilerSettings;
if (!Enum.TryParse(version.Version, out Decompiler.CSharp.LanguageVersion languageVersion))
languageVersion = Decompiler.CSharp.LanguageVersion.Latest;
this.DecompilerSettings = new Decompiler.DecompilerSettings(languageVersion) {
AlwaysUseBraces = settings.AlwaysUseBraces,
ExpandMemberDefinitions = settings.ExpandMemberDefinitions,
FoldBraces = settings.FoldBraces,
FullyQualifyAmbiguousTypeNames = settings.FullyQualifyAmbiguousTypeNames,
RemoveDeadCode = settings.RemoveDeadCode,
ShowDebugInfo = settings.ShowDebugInfo,
ShowXmlDocumentation = settings.ShowXmlDocumentation,
UseDebugSymbols = settings.UseDebugSymbols,
UsingDeclarations = settings.UsingDeclarations,
};
}
}
}

32
ILSpy/FilterSettings.cs

@ -18,6 +18,8 @@ @@ -18,6 +18,8 @@
using System;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Xml.Linq;
namespace ICSharpCode.ILSpy
@ -36,6 +38,7 @@ namespace ICSharpCode.ILSpy @@ -36,6 +38,7 @@ namespace ICSharpCode.ILSpy
{
this.ShowInternalApi = (bool?)element.Element("ShowInternalAPI") ?? true;
this.Language = Languages.GetLanguage((string)element.Element("Language"));
this.LanguageVersion = Language.LanguageVersions.FirstOrDefault(v => v.Version == (string)element.Element("LanguageVersion"));
}
public XElement SaveAsXml()
@ -43,7 +46,8 @@ namespace ICSharpCode.ILSpy @@ -43,7 +46,8 @@ namespace ICSharpCode.ILSpy
return new XElement(
"FilterSettings",
new XElement("ShowInternalAPI", this.ShowInternalApi),
new XElement("Language", this.Language.Name)
new XElement("Language", this.Language.Name),
new XElement("LanguageVersion", this.LanguageVersion.Version)
);
}
@ -102,14 +106,34 @@ namespace ICSharpCode.ILSpy @@ -102,14 +106,34 @@ namespace ICSharpCode.ILSpy
set {
if (language != value) {
language = value;
OnPropertyChanged("Language");
LanguageVersion = language.LanguageVersions.LastOrDefault();
OnPropertyChanged();
}
}
}
LanguageVersion languageVersion;
/// <summary>
/// Gets/Sets the current language version.
/// </summary>
/// <remarks>
/// While this isn't related to filtering, having it as part of the FilterSettings
/// makes it easy to pass it down into all tree nodes.
/// </remarks>
public LanguageVersion LanguageVersion {
get { return languageVersion; }
set {
if (languageVersion != value) {
languageVersion = value;
OnPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

30
ILSpy/Languages/CSharpLanguage.cs

@ -25,7 +25,6 @@ using System.Linq; @@ -25,7 +25,6 @@ using System.Linq;
using System.Resources;
using ICSharpCode.Decompiler;
using ICSharpCode.ILSpy.Options;
using Mono.Cecil;
using ICSharpCode.Decompiler.CSharp;
using ICSharpCode.Decompiler.CSharp.OutputVisitor;
@ -35,8 +34,6 @@ using System.Windows; @@ -35,8 +34,6 @@ using System.Windows;
using System.Windows.Controls;
using ICSharpCode.ILSpy.TreeNodes;
using ICSharpCode.Decompiler.CSharp.Transforms;
using ICSharpCode.AvalonEdit.Highlighting;
using System.Windows.Media;
namespace ICSharpCode.ILSpy
{
@ -86,6 +83,27 @@ namespace ICSharpCode.ILSpy @@ -86,6 +83,27 @@ namespace ICSharpCode.ILSpy
get { return ".csproj"; }
}
IReadOnlyList<LanguageVersion> versions;
public override IReadOnlyList<LanguageVersion> LanguageVersions {
get {
if (versions == null) {
versions = new List<LanguageVersion>() {
new LanguageVersion(Decompiler.CSharp.LanguageVersion.CSharp1.ToString(), "C# 1.0"),
new LanguageVersion(Decompiler.CSharp.LanguageVersion.CSharp2.ToString(), "C# 2.0"),
new LanguageVersion(Decompiler.CSharp.LanguageVersion.CSharp3.ToString(), "C# 3.0"),
new LanguageVersion(Decompiler.CSharp.LanguageVersion.CSharp4.ToString(), "C# 4.0"),
new LanguageVersion(Decompiler.CSharp.LanguageVersion.CSharp5.ToString(), "C# 5.0"),
new LanguageVersion(Decompiler.CSharp.LanguageVersion.CSharp6.ToString(), "C# 6.0"),
new LanguageVersion(Decompiler.CSharp.LanguageVersion.CSharp7.ToString(), "C# 7.0"),
new LanguageVersion(Decompiler.CSharp.LanguageVersion.CSharp7_1.ToString(), "C# 7.1"),
new LanguageVersion(Decompiler.CSharp.LanguageVersion.CSharp7_2.ToString(), "C# 7.2"),
};
}
return versions;
}
}
CSharpDecompiler CreateDecompiler(ModuleDefinition module, DecompilationOptions options)
{
CSharpDecompiler decompiler = new CSharpDecompiler(module, options.DecompilerSettings);
@ -478,14 +496,16 @@ namespace ICSharpCode.ILSpy @@ -478,14 +496,16 @@ namespace ICSharpCode.ILSpy
return TypeToString(ConvertTypeOptions.DoNotUsePrimitiveTypeNames | ConvertTypeOptions.IncludeTypeParameterDefinitions, type);
}
DecompilerSettings CurrentSettings => new DecompilationOptions(MainWindow.Instance.CurrentLanguageVersion, Options.DecompilerSettingsPanel.CurrentDecompilerSettings).DecompilerSettings;
public override bool ShowMember(MemberReference member)
{
return showAllMembers || !CSharpDecompiler.MemberIsHidden(member, new DecompilationOptions().DecompilerSettings);
return showAllMembers || !CSharpDecompiler.MemberIsHidden(member, CurrentSettings);
}
public override MemberReference GetOriginalCodeLocation(MemberReference member)
{
if (showAllMembers || !DecompilerSettingsPanel.CurrentDecompilerSettings.AnonymousMethods)
if (showAllMembers || !CurrentSettings.AnonymousMethods)
return member;
else
return TreeNodes.Analyzer.Helpers.GetOriginalCodeLocation(member);

37
ILSpy/Languages/Language.cs

@ -19,10 +19,41 @@ @@ -19,10 +19,41 @@
using System;
using System.Collections.Generic;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Util;
using Mono.Cecil;
namespace ICSharpCode.ILSpy
{
public struct LanguageVersion : IEquatable<LanguageVersion>
{
public string Version { get; }
public string DisplayName { get; }
public LanguageVersion(string version, string name = null)
{
this.Version = version ?? "";
this.DisplayName = name ?? version.ToString();
}
public bool Equals(LanguageVersion other)
{
return other.Version == this.Version && other.DisplayName == this.DisplayName;
}
public override bool Equals(object obj)
{
return obj is LanguageVersion version && Equals(version);
}
public override int GetHashCode()
{
return unchecked(982451629 * Version.GetHashCode() + 982451653 * DisplayName.GetHashCode());
}
public static bool operator ==(LanguageVersion lhs, LanguageVersion rhs) => lhs.Equals(rhs);
public static bool operator !=(LanguageVersion lhs, LanguageVersion rhs) => !lhs.Equals(rhs);
}
/// <summary>
/// Base class for language-specific decompiler implementations.
/// </summary>
@ -43,6 +74,12 @@ namespace ICSharpCode.ILSpy @@ -43,6 +74,12 @@ namespace ICSharpCode.ILSpy
get { return null; }
}
public virtual IReadOnlyList<LanguageVersion> LanguageVersions {
get { return EmptyList<LanguageVersion>.Instance; }
}
public bool HasLanguageVersions => LanguageVersions.Count > 0;
/// <summary>
/// Gets the syntax highlighting used for this language.
/// </summary>

4
ILSpy/MainWindow.xaml

@ -81,6 +81,10 @@ @@ -81,6 +81,10 @@
<ComboBox Name="languageComboBox" DisplayMemberPath="Name" Width="100" MaxDropDownHeight="Auto"
ItemsSource="{x:Static local:Languages.AllLanguages}"
SelectedItem="{Binding FilterSettings.Language}"/>
<ComboBox Name="languageVersionComboBox" DisplayMemberPath="DisplayName" Width="100" MaxDropDownHeight="Auto"
Visibility="{Binding SelectedItem.HasLanguageVersions, ElementName=languageComboBox, Converter={StaticResource BooleanToVisibilityConverter}}"
ItemsSource="{Binding SelectedItem.LanguageVersions, ElementName=languageComboBox, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding FilterSettings.LanguageVersion, UpdateSourceTrigger=PropertyChanged}"/>
</ToolBar>
<!-- Status bar -->
<StatusBar x:Name="statusBar" DockPanel.Dock="Bottom" Height="26" Visibility="Collapsed">

15
ILSpy/MainWindow.xaml.cs

@ -486,7 +486,7 @@ namespace ICSharpCode.ILSpy @@ -486,7 +486,7 @@ namespace ICSharpCode.ILSpy
void filterSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
RefreshTreeViewFilter();
if (e.PropertyName == "Language") {
if (e.PropertyName == "Language" || e.PropertyName == "LanguageVersion") {
DecompileSelectedNodes(recordHistory: false);
}
}
@ -762,7 +762,7 @@ namespace ICSharpCode.ILSpy @@ -762,7 +762,7 @@ namespace ICSharpCode.ILSpy
if (node != null && node.View(decompilerTextView))
return;
}
decompilationTask = decompilerTextView.DecompileAsync(this.CurrentLanguage, this.SelectedNodes, new DecompilationOptions { TextViewState = state });
decompilationTask = decompilerTextView.DecompileAsync(this.CurrentLanguage, this.SelectedNodes, new DecompilationOptions(CurrentLanguageVersion, Options.DecompilerSettingsPanel.CurrentDecompilerSettings) { TextViewState = state });
}
void SaveCommandExecuted(object sender, ExecutedRoutedEventArgs e)
@ -773,7 +773,7 @@ namespace ICSharpCode.ILSpy @@ -773,7 +773,7 @@ namespace ICSharpCode.ILSpy
}
this.TextView.SaveToDisk(this.CurrentLanguage,
this.SelectedNodes,
new DecompilationOptions { FullDecompilation = true });
new DecompilationOptions(CurrentLanguageVersion, Options.DecompilerSettingsPanel.CurrentDecompilerSettings) { FullDecompilation = true });
}
public void RefreshDecompiledView()
@ -784,12 +784,9 @@ namespace ICSharpCode.ILSpy @@ -784,12 +784,9 @@ namespace ICSharpCode.ILSpy
public DecompilerTextView TextView {
get { return decompilerTextView; }
}
public Language CurrentLanguage {
get {
return sessionSettings.FilterSettings.Language;
}
}
public Language CurrentLanguage => sessionSettings.FilterSettings.Language;
public LanguageVersion CurrentLanguageVersion => sessionSettings.FilterSettings.LanguageVersion;
public event SelectionChangedEventHandler SelectionChanged;

8
ILSpy/Options/DecompilerSettingsPanel.xaml

@ -8,13 +8,6 @@ @@ -8,13 +8,6 @@
<controls:BoolToVisibilityConverter x:Key="boolConv" />
</UserControl.Resources>
<StackPanel Margin="10">
<CheckBox IsChecked="{Binding AnonymousMethods}">Decompile anonymous methods/lambdas</CheckBox>
<CheckBox IsChecked="{Binding AnonymousTypes}">Decompile anonymous types</CheckBox>
<CheckBox IsChecked="{Binding YieldReturn}">Decompile enumerators (yield return)</CheckBox>
<CheckBox IsChecked="{Binding AsyncAwait}">Decompile async methods (async/await)</CheckBox>
<CheckBox IsChecked="{Binding QueryExpressions}" IsEnabled="{Binding AnonymousMethods}">Decompile query expressions</CheckBox>
<CheckBox IsChecked="{Binding ExpressionTrees}">Decompile expression trees</CheckBox>
<CheckBox IsChecked="{Binding AutomaticProperties}">Decompile automatic properties</CheckBox>
<CheckBox IsChecked="{Binding UseDebugSymbols}">Use variable names from debug symbols, if available</CheckBox>
<CheckBox IsChecked="{Binding ShowDebugInfo}">Show info from debug symbols, if available</CheckBox>
<CheckBox IsChecked="{Binding ShowXmlDocumentation}">Show XML documentation in decompiled code</CheckBox>
@ -24,6 +17,5 @@ @@ -24,6 +17,5 @@
<CheckBox IsChecked="{Binding FullyQualifyAmbiguousTypeNames}">Fully qualify ambiguous type names</CheckBox>
<CheckBox IsChecked="{Binding AlwaysUseBraces}">Always use braces</CheckBox>
<CheckBox IsChecked="{Binding ExpandMemberDefinitions}">Expand member definitions after decompilation</CheckBox>
<Button Content="Advanced" Click="AdvancedOptions_Click" Visibility="{Binding Source={x:Static options:DecompilerSettingsPanel.IsDebug}, Converter={StaticResource boolConv}, ConverterParameter={x:Static Visibility.Collapsed}}" />
</StackPanel>
</UserControl>

240
ILSpy/Options/DecompilerSettingsPanel.xaml.cs

@ -16,11 +16,10 @@ @@ -16,11 +16,10 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System.Windows;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Controls;
using System.Xml.Linq;
using ICSharpCode.Decompiler;
using WinForms = System.Windows.Forms;
namespace ICSharpCode.ILSpy.Options
{
@ -30,12 +29,6 @@ namespace ICSharpCode.ILSpy.Options @@ -30,12 +29,6 @@ namespace ICSharpCode.ILSpy.Options
[ExportOptionPage(Title = "Decompiler", Order = 0)]
partial class DecompilerSettingsPanel : UserControl, IOptionPage
{
#if DEBUG
public const bool IsDebug = true;
#else
public const bool IsDebug = false;
#endif
public DecompilerSettingsPanel()
{
InitializeComponent();
@ -58,14 +51,6 @@ namespace ICSharpCode.ILSpy.Options @@ -58,14 +51,6 @@ namespace ICSharpCode.ILSpy.Options
{
XElement e = settings["DecompilerSettings"];
DecompilerSettings s = new DecompilerSettings();
s.AnonymousMethods = (bool?)e.Attribute("anonymousMethods") ?? s.AnonymousMethods;
s.AnonymousTypes = (bool?)e.Attribute("anonymousTypes") ?? s.AnonymousTypes;
s.YieldReturn = (bool?)e.Attribute("yieldReturn") ?? s.YieldReturn;
s.AsyncAwait = (bool?)e.Attribute("asyncAwait") ?? s.AsyncAwait;
s.AutomaticProperties = (bool?) e.Attribute("automaticProperties") ?? s.AutomaticProperties;
s.QueryExpressions = (bool?)e.Attribute("queryExpressions") ?? s.QueryExpressions;
s.ExpressionTrees = (bool?)e.Attribute("expressionTrees") ?? s.ExpressionTrees;
s.UseDebugSymbols = (bool?)e.Attribute("useDebugSymbols") ?? s.UseDebugSymbols;
s.ShowDebugInfo = (bool?)e.Attribute("showDebugInfo") ?? s.ShowDebugInfo;
s.ShowXmlDocumentation = (bool?)e.Attribute("xmlDoc") ?? s.ShowXmlDocumentation;
s.FoldBraces = (bool?)e.Attribute("foldBraces") ?? s.FoldBraces;
@ -81,13 +66,6 @@ namespace ICSharpCode.ILSpy.Options @@ -81,13 +66,6 @@ namespace ICSharpCode.ILSpy.Options
{
DecompilerSettings s = (DecompilerSettings)this.DataContext;
XElement section = new XElement("DecompilerSettings");
section.SetAttributeValue("anonymousMethods", s.AnonymousMethods);
section.SetAttributeValue("anonymousTypes", s.AnonymousTypes);
section.SetAttributeValue("yieldReturn", s.YieldReturn);
section.SetAttributeValue("asyncAwait", s.AsyncAwait);
section.SetAttributeValue("automaticProperties", s.AutomaticProperties);
section.SetAttributeValue("queryExpressions", s.QueryExpressions);
section.SetAttributeValue("expressionTrees", s.ExpressionTrees);
section.SetAttributeValue("useDebugSymbols", s.UseDebugSymbols);
section.SetAttributeValue("showDebugInfo", s.ShowDebugInfo);
section.SetAttributeValue("xmlDoc", s.ShowXmlDocumentation);
@ -106,105 +84,149 @@ namespace ICSharpCode.ILSpy.Options @@ -106,105 +84,149 @@ namespace ICSharpCode.ILSpy.Options
currentDecompilerSettings = s; // update cached settings
}
void AdvancedOptions_Click(object sender, RoutedEventArgs e)
{
#if DEBUG
// I know this is crazy, but WindowsFormsHost is too buggy in this scenario...
using (var wnd = new PropertyGridHost(((DecompilerSettings)DataContext).Clone())) {
if (wnd.ShowDialog() == WinForms.DialogResult.OK) {
this.DataContext = wnd.Settings;
}
public class DecompilerSettings : INotifyPropertyChanged
{
bool showXmlDocumentation = true;
/// <summary>
/// Gets/Sets whether to include XML documentation comments in the decompiled code.
/// </summary>
public bool ShowXmlDocumentation {
get { return showXmlDocumentation; }
set {
if (showXmlDocumentation != value) {
showXmlDocumentation = value;
OnPropertyChanged();
}
}
#endif
}
#if DEBUG
class PropertyGridHost : WinForms.Form
{
private WinForms.PropertyGrid propertyGrid;
private WinForms.Button cancelButton;
private WinForms.Button okButton;
bool foldBraces = false;
public bool FoldBraces {
get { return foldBraces; }
set {
if (foldBraces != value) {
foldBraces = value;
OnPropertyChanged();
}
}
}
bool expandMemberDefinitions = false;
public bool ExpandMemberDefinitions {
get { return expandMemberDefinitions; }
set {
if (expandMemberDefinitions != value) {
expandMemberDefinitions = value;
OnPropertyChanged();
}
}
}
bool decompileMemberBodies = true;
/// <summary>
/// Gets/Sets whether member bodies should be decompiled.
/// </summary>
public bool DecompileMemberBodies {
get { return decompileMemberBodies; }
set {
if (decompileMemberBodies != value) {
decompileMemberBodies = value;
OnPropertyChanged();
}
}
}
public DecompilerSettings Settings { get; }
bool fullyQualifyAmbiguousTypeNames = true;
public PropertyGridHost(DecompilerSettings settings)
{
InitializeComponent();
this.propertyGrid.SelectedObject = Settings = settings;
public bool FullyQualifyAmbiguousTypeNames {
get { return fullyQualifyAmbiguousTypeNames; }
set {
if (fullyQualifyAmbiguousTypeNames != value) {
fullyQualifyAmbiguousTypeNames = value;
OnPropertyChanged();
}
}
}
bool useDebugSymbols = true;
/// <summary>
/// Gets/Sets whether to use variable names from debug symbols, if available.
/// </summary>
public bool UseDebugSymbols {
get { return useDebugSymbols; }
set {
if (useDebugSymbols != value) {
useDebugSymbols = value;
OnPropertyChanged();
}
}
}
bool usingDeclarations = true;
public bool UsingDeclarations {
get { return usingDeclarations; }
set {
if (usingDeclarations != value) {
usingDeclarations = value;
OnPropertyChanged();
}
}
}
private void InitializeComponent()
{
this.propertyGrid = new System.Windows.Forms.PropertyGrid();
this.cancelButton = new System.Windows.Forms.Button();
this.okButton = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// propertyGrid
//
this.propertyGrid.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom
| System.Windows.Forms.AnchorStyles.Left
| System.Windows.Forms.AnchorStyles.Right;
this.propertyGrid.Location = new System.Drawing.Point(0, 0);
this.propertyGrid.Name = "propertyGrid";
this.propertyGrid.Size = new System.Drawing.Size(468, 369);
this.propertyGrid.TabIndex = 0;
//
// cancelButton
//
this.cancelButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right;
this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.cancelButton.Location = new System.Drawing.Point(365, 375);
this.cancelButton.Name = "cancelButton";
this.cancelButton.Size = new System.Drawing.Size(91, 23);
this.cancelButton.TabIndex = 1;
this.cancelButton.Text = "Cancel";
this.cancelButton.UseVisualStyleBackColor = true;
this.cancelButton.Click += CancelButton_Click;
//
// okButton
//
this.okButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right;
this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
this.okButton.Location = new System.Drawing.Point(267, 375);
this.okButton.Name = "okButton";
this.okButton.Size = new System.Drawing.Size(92, 23);
this.okButton.TabIndex = 2;
this.okButton.Text = "OK";
this.okButton.UseVisualStyleBackColor = true;
this.okButton.Click += OkButton_Click;
//
// Form1
//
this.AcceptButton = this.okButton;
this.CancelButton = this.cancelButton;
this.ClientSize = new System.Drawing.Size(468, 410);
this.Controls.Add(this.okButton);
this.Controls.Add(this.cancelButton);
this.Controls.Add(this.propertyGrid);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "Form1";
this.Text = "Advanced Decompiler Options";
this.ShowIcon = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.ResumeLayout(false);
bool showDebugInfo;
public bool ShowDebugInfo {
get { return showDebugInfo; }
set {
if (showDebugInfo != value) {
showDebugInfo = value;
OnPropertyChanged();
}
}
}
bool removeDeadCode = false;
private void OkButton_Click(object sender, System.EventArgs e)
{
DialogResult = WinForms.DialogResult.OK;
Close();
public bool RemoveDeadCode {
get { return removeDeadCode; }
set {
if (removeDeadCode != value) {
removeDeadCode = value;
OnPropertyChanged();
}
}
}
private void CancelButton_Click(object sender, System.EventArgs e)
{
DialogResult = WinForms.DialogResult.Cancel;
Close();
bool alwaysUseBraces = true;
/// <summary>
/// Gets/Sets whether to use braces for single-statement-blocks.
/// </summary>
public bool AlwaysUseBraces {
get { return alwaysUseBraces; }
set {
if (alwaysUseBraces != value) {
alwaysUseBraces = value;
OnPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
#endif
}
}

2
ILSpy/TreeNodes/AssemblyTreeNode.cs

@ -291,7 +291,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -291,7 +291,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
dlg.FileName = DecompilerTextView.CleanUpName(assembly.ShortName) + language.ProjectFileExtension;
dlg.Filter = language.Name + " project|*" + language.ProjectFileExtension + "|" + language.Name + " single file|*" + language.FileExtension + "|All files|*.*";
if (dlg.ShowDialog() == true) {
DecompilationOptions options = new DecompilationOptions();
DecompilationOptions options = new DecompilationOptions(MainWindow.Instance.CurrentLanguageVersion, Options.DecompilerSettingsPanel.CurrentDecompilerSettings);
options.FullDecompilation = true;
if (dlg.FilterIndex == 1) {
options.SaveAsProjectDirectory = Path.GetDirectoryName(dlg.FileName);

Loading…
Cancel
Save