Esempio n. 1
0
		protected override Task<DecompileAsyncResult> DecompileAsync(DecompileCodeState decompileCodeState) {
			var state = (EditMethodDecompileCodeState)decompileCodeState;
			state.CancellationToken.ThrowIfCancellationRequested();

			var type = methodToEdit.DeclaringType;
			while (type.DeclaringType != null)
				type = type.DeclaringType;

			DecompileTypeMethods options;

			state.DecompilationContext.CalculateBinSpans = true;
			options = new DecompileTypeMethods(state.MainOutput, state.DecompilationContext, type);
			options.Methods.Add(methodToEdit);
			options.DecompileHidden = false;
			options.MakeEverythingPublic = makeEverythingPublic;
			decompiler.Decompile(DecompilationType.TypeMethods, options);

			state.CancellationToken.ThrowIfCancellationRequested();

			state.DecompilationContext.CalculateBinSpans = false;
			options = new DecompileTypeMethods(state.HiddenOutput, state.DecompilationContext, type);
			options.Methods.Add(methodToEdit);
			options.DecompileHidden = true;
			options.MakeEverythingPublic = makeEverythingPublic;
			decompiler.Decompile(DecompilationType.TypeMethods, options);

			state.CancellationToken.ThrowIfCancellationRequested();

			var result = new DecompileAsyncResult();
			result.AddDocument(MAIN_CODE_NAME, state.MainOutput.ToString(), state.MainOutput.Span);
			result.AddDocument(MAIN_G_CODE_NAME, state.HiddenOutput.ToString(), null);
			return Task.FromResult(result);
		}
Esempio n. 2
0
        protected override Task <DecompileAsyncResult> DecompileAsync(DecompileCodeState decompileCodeState)
        {
            var result = new DecompileAsyncResult();

            result.AddDocument(MAIN_CODE_NAME, string.Empty, null);
            return(Task.FromResult(result));
        }
Esempio n. 3
0
        protected override Task <DecompileAsyncResult> DecompileAsync(DecompileCodeState decompileCodeState)
        {
            var state = (AddMembersDecompileCodeState)decompileCodeState;

            state.CancellationToken.ThrowIfCancellationRequested();

            DecompileTypeMethods options;

            options = new DecompileTypeMethods(state.MainOutput, state.DecompilationContext, nonNestedType);
            options.Types.Add(nonNestedType);
            options.Types.AddRange(nonNestedType.GetTypes());
            options.DecompileHidden = false;
            decompiler.Decompile(DecompilationType.TypeMethods, options);

            state.CancellationToken.ThrowIfCancellationRequested();

            options = new DecompileTypeMethods(state.HiddenOutput, state.DecompilationContext, nonNestedType);
            options.Types.Add(nonNestedType);
            options.Types.AddRange(nonNestedType.GetTypes());
            options.DecompileHidden = true;
            decompiler.Decompile(DecompilationType.TypeMethods, options);

            state.CancellationToken.ThrowIfCancellationRequested();

            var result = new DecompileAsyncResult();

            result.AddDocument(MainCodeName, state.MainOutput.ToString(), state.MainOutput.Span);
            result.AddDocument(MainGeneratedCodeName, state.HiddenOutput.ToString(), null);
            return(Task.FromResult(result));
        }
Esempio n. 4
0
        async Task StartDecompileAsync(MethodDef method)
        {
            bool   canCompile = false, canceled = false;
            var    assemblyReferences = Array.Empty <CompilerMetadataReference>();
            string mainCode, hiddenCode;

            try {
                assemblyReferences = await DecompileAndGetRefsAsync(method);

                mainCode   = decompileCodeState.MainOutput.ToString();
                hiddenCode = decompileCodeState.HiddenOutput.ToString();
                canCompile = true;
            }
            catch (OperationCanceledException) {
                canceled   = true;
                mainCode   = string.Empty;
                hiddenCode = string.Empty;
            }
            catch (Exception ex) {
                mainCode   = ex.ToString();
                hiddenCode = string.Empty;
            }

            const string MAIN_CODE_NAME = "main";
            var          codeDocs       = Array.Empty <ICodeDocument>();

            if (!canceled)
            {
                var docs = new List <IDecompiledDocument>();
                docs.Add(new DecompiledDocument(mainCode, MAIN_CODE_NAME));
                if (hiddenCode != string.Empty)
                {
                    docs.Add(new DecompiledDocument(hiddenCode, MAIN_CODE_NAME + ".g"));
                }
                codeDocs = languageCompiler.AddDecompiledCode(new DecompiledCodeResult(docs.ToArray(), assemblyReferences, assemblyReferenceResolver, PlatformHelper.GetPlatform(method.Module)));
            }

            decompileCodeState?.Dispose();
            decompileCodeState = null;

            Documents.AddRange(codeDocs);
            SelectedDocument = Documents.FirstOrDefault(a => a.NameNoExtension == MAIN_CODE_NAME) ?? Documents.FirstOrDefault();
            foreach (var doc in Documents)
            {
                doc.TextView.MoveCaretTo(0, 0);
                doc.TextView.Selection.Clear();
            }

            CanCompile    = canCompile;
            HasDecompiled = true;
            OnPropertyChanged(nameof(HasDecompiled));
        }
Esempio n. 5
0
		protected override Task<DecompileAsyncResult> DecompileAsync(DecompileCodeState decompileCodeState) {
			var state = (EditAssemblyDecompileCodeState)decompileCodeState;
			state.CancellationToken.ThrowIfCancellationRequested();

			var options = new DecompileAssemblyInfo(state.MainOutput, state.DecompilationContext, sourceModule);
			options.KeepAllAttributes = true;
			decompiler.Decompile(DecompilationType.AssemblyInfo, options);

			state.CancellationToken.ThrowIfCancellationRequested();

			var result = new DecompileAsyncResult();
			result.AddDocument(MAIN_CODE_NAME, state.MainOutput.ToString(), null);
			return Task.FromResult(result);
		}
Esempio n. 6
0
		protected override Task<DecompileAsyncResult> DecompileAsync(DecompileCodeState decompileCodeState) {
			var state = (EditMethodDecompileCodeState)decompileCodeState;
			state.CancellationToken.ThrowIfCancellationRequested();

			state.DecompilationContext.CalculateBinSpans = true;
			var options = new DecompileTypeMethods(state.MainOutput, state.DecompilationContext, nonNestedTypeToEdit);
			options.DecompileHidden = false;
			options.ShowAll = true;
			options.MakeEverythingPublic = makeEverythingPublic;
			decompiler.Decompile(DecompilationType.TypeMethods, options);

			state.CancellationToken.ThrowIfCancellationRequested();

			var result = new DecompileAsyncResult();
			result.AddDocument(MAIN_CODE_NAME, state.MainOutput.ToString(), state.MainOutput.Span);
			return Task.FromResult(result);
		}
Esempio n. 7
0
        protected override Task <DecompileAsyncResult> DecompileAsync(DecompileCodeState decompileCodeState)
        {
            var state = (EditAssemblyDecompileCodeState)decompileCodeState;

            state.CancellationToken.ThrowIfCancellationRequested();

            var options = new DecompileAssemblyInfo(state.MainOutput, state.DecompilationContext, sourceModule);

            options.KeepAllAttributes = true;
            decompiler.Decompile(DecompilationType.AssemblyInfo, options);

            state.CancellationToken.ThrowIfCancellationRequested();

            var result = new DecompileAsyncResult();

            result.AddDocument(MainCodeName, state.MainOutput.ToString(), null);
            return(Task.FromResult(result));
        }
Esempio n. 8
0
        protected override Task <DecompileAsyncResult> DecompileAsync(DecompileCodeState decompileCodeState)
        {
            var state = (EditClassDecompileCodeState)decompileCodeState;

            state.CancellationToken.ThrowIfCancellationRequested();

            state.DecompilationContext.CalculateILSpans = true;
            var options = new DecompileTypeMethods(state.MainOutput, state.DecompilationContext, nonNestedTypeToEdit);

            options.DecompileHidden = false;
            options.ShowAll         = true;
            decompiler.Decompile(DecompilationType.TypeMethods, options);

            state.CancellationToken.ThrowIfCancellationRequested();

            var result = new DecompileAsyncResult();

            result.AddDocument(MainCodeName, state.MainOutput.ToString(), state.MainOutput.Span);
            return(Task.FromResult(result));
        }
Esempio n. 9
0
        Task DecompileAsync(MethodDef method, MethodSourceStatement?methodSourceStatement)
        {
            Debug.Assert(decompileCodeState == null);
            if (decompileCodeState != null)
            {
                throw new InvalidOperationException();
            }
            var state = new DecompileCodeState(method, methodSourceStatement);

            decompileCodeState = state;

            return(Task.Run(() => {
                state.CancellationToken.ThrowIfCancellationRequested();

                var type = method.DeclaringType;
                while (type.DeclaringType != null)
                {
                    type = type.DeclaringType;
                }

                DecompileTypeMethods options;

                state.DecompilationContext.CalculateBinSpans = true;
                options = new DecompileTypeMethods(state.MainOutput, state.DecompilationContext, type);
                options.Methods.Add(method);
                options.DecompileHidden = false;
                options.MakeEverythingPublic = makeEverythingPublic;
                decompiler.Decompile(DecompilationType.TypeMethods, options);

                state.CancellationToken.ThrowIfCancellationRequested();

                state.DecompilationContext.CalculateBinSpans = false;
                options = new DecompileTypeMethods(state.HiddenOutput, state.DecompilationContext, type);
                options.Methods.Add(method);
                options.DecompileHidden = true;
                options.MakeEverythingPublic = makeEverythingPublic;
                decompiler.Decompile(DecompilationType.TypeMethods, options);
            }, state.CancellationToken));
        }
Esempio n. 10
0
        protected override Task <DecompileAsyncResult> DecompileAsync(DecompileCodeState decompileCodeState)
        {
            var state = (EditMethodDecompileCodeState)decompileCodeState;

            state.CancellationToken.ThrowIfCancellationRequested();

            var type = methodToEdit.DeclaringType;

            while (type.DeclaringType != null)
            {
                type = type.DeclaringType;
            }

            DecompileTypeMethods options;

            state.DecompilationContext.CalculateBinSpans = true;
            options = new DecompileTypeMethods(state.MainOutput, state.DecompilationContext, type);
            options.Methods.Add(methodToEdit);
            options.DecompileHidden      = false;
            options.MakeEverythingPublic = makeEverythingPublic;
            decompiler.Decompile(DecompilationType.TypeMethods, options);

            state.CancellationToken.ThrowIfCancellationRequested();

            state.DecompilationContext.CalculateBinSpans = false;
            options = new DecompileTypeMethods(state.HiddenOutput, state.DecompilationContext, type);
            options.Methods.Add(methodToEdit);
            options.DecompileHidden      = true;
            options.MakeEverythingPublic = makeEverythingPublic;
            decompiler.Decompile(DecompilationType.TypeMethods, options);

            state.CancellationToken.ThrowIfCancellationRequested();

            var result = new DecompileAsyncResult();

            result.AddDocument(MAIN_CODE_NAME, state.MainOutput.ToString(), state.MainOutput.Span);
            result.AddDocument(MAIN_G_CODE_NAME, state.HiddenOutput.ToString(), null);
            return(Task.FromResult(result));
        }
Esempio n. 11
0
        async Task StartDecompileAsync(MethodDef method, MethodSourceStatement?methodSourceStatement)
        {
            bool   canCompile = false, canceled = false;
            var    assemblyReferences = Array.Empty <CompilerMetadataReference>();
            string mainCode, hiddenCode;
            var    refSpan = new Span(0, 0);

            try {
                assemblyReferences = await DecompileAndGetRefsAsync(method, methodSourceStatement);

                mainCode   = decompileCodeState.MainOutput.ToString();
                hiddenCode = decompileCodeState.HiddenOutput.ToString();
                canCompile = true;
                var span = decompileCodeState.MainOutput.Span;
                if (span != null)
                {
                    refSpan = span.Value;
                }
            }
            catch (OperationCanceledException) {
                canceled   = true;
                mainCode   = string.Empty;
                hiddenCode = string.Empty;
            }
            catch (Exception ex) {
                mainCode   = ex.ToString();
                hiddenCode = string.Empty;
            }

            const string MAIN_CODE_NAME = "main";
            var          codeDocs       = Array.Empty <ICodeDocument>();

            if (!canceled)
            {
                // This helps a little to speed up the code
                ProfileOptimizationHelper.StartProfile("add-decompiled-code-" + decompiler.UniqueGuid.ToString());
                var docs = new List <IDecompiledDocument>();
                docs.Add(new DecompiledDocument(mainCode, MAIN_CODE_NAME));
                if (hiddenCode != string.Empty)
                {
                    docs.Add(new DecompiledDocument(hiddenCode, MAIN_CODE_NAME + ".g"));
                }
                codeDocs = languageCompiler.AddDecompiledCode(new DecompiledCodeResult(docs.ToArray(), assemblyReferences, assemblyReferenceResolver, PlatformHelper.GetPlatform(method.Module)));
            }

            decompileCodeState?.Dispose();
            decompileCodeState = null;

            foreach (var doc in codeDocs)
            {
                doc.TextView.Properties.AddProperty(editCodeTextViewKey, this);
            }
            Documents.AddRange(codeDocs.Select(a => new CodeDocument(a)));
            SelectedDocument = Documents.FirstOrDefault(a => a.NameNoExtension == MAIN_CODE_NAME) ?? Documents.FirstOrDefault();
            foreach (var doc in Documents)
            {
                if (doc.NameNoExtension == MAIN_CODE_NAME && refSpan.End <= doc.TextView.TextSnapshot.Length)
                {
                    doc.Initialize(new SnapshotPoint(doc.TextView.TextSnapshot, refSpan.Start));
                }
                else
                {
                    doc.Initialize(new SnapshotPoint(doc.TextView.TextSnapshot, 0));
                }
            }

            CanCompile    = canCompile;
            HasDecompiled = true;
            OnPropertyChanged(nameof(HasDecompiled));
        }
Esempio n. 12
0
 protected abstract Task <DecompileAsyncResult> DecompileAsync(DecompileCodeState decompileCodeState);
Esempio n. 13
0
 Task <DecompileAsyncResult> DecompileAsync()
 {
     decompileCodeState = CreateDecompileCodeState();
     return(Task.Run(() => DecompileAsync(decompileCodeState), decompileCodeState.CancellationToken));
 }
Esempio n. 14
0
        async Task StartDecompileAsync()
        {
            bool canCompile = false, canceled = false;
            var  assemblyReferences = Array.Empty <CompilerMetadataReference>();

            SimpleDocument[] simpleDocuments = Array.Empty <SimpleDocument>();
            try {
                var result = await DecompileAndGetRefsAsync();

                assemblyReferences = result.Value;
                simpleDocuments    = result.Key.Documents.ToArray();
                canCompile         = true;
            }
            catch (OperationCanceledException) {
                canceled = true;
            }
            catch (Exception ex) {
                simpleDocuments = new SimpleDocument[] {
                    new SimpleDocument(MAIN_CODE_NAME, ex.ToString(), null)
                };
            }

            var codeDocs = Array.Empty <ICodeDocument>();

            if (!canceled)
            {
                // This helps a little to speed up the code
                ProfileOptimizationHelper.StartProfile("add-decompiled-code-" + decompiler.UniqueGuid.ToString());
                var docs = new List <IDecompiledDocument>();
                foreach (var simpleDoc in simpleDocuments)
                {
                    docs.Add(new DecompiledDocument(simpleDoc.Text, simpleDoc.NameNoExtension));
                }
                codeDocs = languageCompiler.AddDecompiledCode(new DecompiledCodeResult(docs.ToArray(), assemblyReferences, assemblyReferenceResolver, PlatformHelper.GetPlatform(sourceModule)));
            }

            decompileCodeState?.Dispose();
            decompileCodeState = null;

            foreach (var doc in codeDocs)
            {
                doc.TextView.Properties.AddProperty(editCodeTextViewKey, this);
            }
            Documents.AddRange(codeDocs.Select(a => new CodeDocument(a)));
            SelectedDocument = Documents.FirstOrDefault(a => a.NameNoExtension == MAIN_CODE_NAME) ?? Documents.FirstOrDefault();
            Debug.Assert(Documents.Count == simpleDocuments.Length);
            for (int i = 0; i < Documents.Count; i++)
            {
                var doc       = Documents[i];
                var caretSpan = simpleDocuments[i].CaretSpan;
                if (caretSpan != null && caretSpan.Value.End <= doc.TextView.TextSnapshot.Length)
                {
                    doc.Initialize(new SnapshotPoint(doc.TextView.TextSnapshot, caretSpan.Value.Start));
                }
                else
                {
                    doc.Initialize(new SnapshotPoint(doc.TextView.TextSnapshot, 0));
                }
            }

            CanCompile    = canCompile;
            HasDecompiled = true;
            OnPropertyChanged(nameof(HasDecompiled));
        }
Esempio n. 15
0
		protected override Task<DecompileAsyncResult> DecompileAsync(DecompileCodeState decompileCodeState) {
			var result = new DecompileAsyncResult();
			result.AddDocument(MAIN_CODE_NAME, string.Empty, null);
			return Task.FromResult(result);
		}