// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team // // Permission is hereby granted, free of charge, to any person obtaining a copy of this // software and associated documentation files (the "Software"), to deal in the Software // without restriction, including without limitation the rights to use, copy, modify, merge, // publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons // to whom the Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all copies or // substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // 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; using ICSharpCode.ILSpyX; using DecompilerSettings = ICSharpCode.ILSpyX.Settings.DecompilerSettings; namespace ICSharpCode.ILSpy { /// /// Options passed to the decompiler. /// public class DecompilationOptions { /// /// Gets whether a full decompilation (all members recursively) is desired. /// If this option is false, language bindings are allowed to show the only headers of the decompiled element's children. /// public bool FullDecompilation { get; set; } /// /// Gets/Sets the directory into which the project is saved. /// public string SaveAsProjectDirectory { get; set; } /// /// Gets/sets whether invalid identifiers should be escaped (and therefore the code be made compilable). /// This setting is ignored in case is set. /// public bool EscapeInvalidIdentifiers { get; set; } /// /// Gets the cancellation token that is used to abort the decompiler. /// /// /// Decompilers should regularly call options.CancellationToken.ThrowIfCancellationRequested(); /// to allow for cooperative cancellation of the decompilation task. /// public CancellationToken CancellationToken { get; set; } /// /// Gets the progress reporter. /// /// /// If decompilers do not implement progress reporting, an indeterminate wait bar is displayed. /// public IProgress Progress { get; set; } /// /// Gets the settings for the decompiler. /// public DecompilerSettings DecompilerSettings { get; private set; } /// /// Gets/sets an optional state of a decompiler text view. /// /// /// This state is used to restore test view's state when decompilation is started by Go Back/Forward action. /// public TextView.DecompilerTextViewState TextViewState { get; set; } /// /// Used internally for debugging. /// internal int StepLimit = int.MaxValue; internal bool IsDebug = false; public DecompilationOptions(LanguageVersion version, DecompilerSettings settings, DisplaySettings displaySettings) { if (!Enum.TryParse(version?.Version, out Decompiler.CSharp.LanguageVersion languageVersion)) languageVersion = Decompiler.CSharp.LanguageVersion.Latest; var newSettings = this.DecompilerSettings = settings.Clone(); newSettings.SetLanguageVersion(languageVersion); newSettings.ExpandMemberDefinitions = displaySettings.ExpandMemberDefinitions; newSettings.ExpandUsingDeclarations = displaySettings.ExpandUsingDeclarations; newSettings.FoldBraces = displaySettings.FoldBraces; newSettings.ShowDebugInfo = displaySettings.ShowDebugInfo; newSettings.CSharpFormattingOptions.IndentationString = GetIndentationString(displaySettings); } private string GetIndentationString(DisplaySettings displaySettings) { if (displaySettings.IndentationUseTabs) { int numberOfTabs = displaySettings.IndentationSize / displaySettings.IndentationTabSize; int numberOfSpaces = displaySettings.IndentationSize % displaySettings.IndentationTabSize; return new string('\t', numberOfTabs) + new string(' ', numberOfSpaces); } return new string(' ', displaySettings.IndentationSize); } } }