Пример #1
0
        private IDecompilationResults GetAssemblyAttributesDecompilationResults(string assemblyAttributesFilePath)
        {
            AvalonEditCodeFormatter formatter = new AvalonEditCodeFormatter(new StringWriter());

            IWriterSettings          settings             = new WriterSettings(writeExceptionsAsComments: true);
            IAssemblyAttributeWriter writer               = language.GetAssemblyAttributeWriter(formatter, this.exceptionFormater, settings);
            IWriterContextService    writerContextService = new TypeCollisionWriterContextService(new ProjectGenerationDecompilationCacheService(), decompilationPreferences.RenameInvalidMembers);

            string fileContent;

            try
            {
                writer.WriteAssemblyInfo(assembly, writerContextService, true,
                                         new string[1] {
                    "System.Runtime.Versioning.TargetFrameworkAttribute"
                }, new string[1] {
                    "System.Security.UnverifiableCodeAttribute"
                });

                fileContent = formatter.GetSourceCode().GetSourceCode();
            }
            catch (Exception e)
            {
                string[] exceptionMessageLines = exceptionFormater.Format(e, null, assemblyAttributesFilePath);
                fileContent = string.Join(Environment.NewLine, exceptionMessageLines);
            }

            using (StreamWriter outfile = new StreamWriter(assemblyAttributesFilePath))
            {
                outfile.Write(fileContent);
            }

            JustDecompile.EngineInfrastructure.ICodeViewerResults originalcodeViewerResults = formatter.GetSourceCode();

            if (!(originalcodeViewerResults is JustDecompile.EngineInfrastructure.DecompiledSourceCode))
            {
                throw new Exception("Unexpected code viewer results type.");
            }

            JustDecompile.EngineInfrastructure.DecompiledSourceCode decompiledSourceCode = originalcodeViewerResults as JustDecompile.EngineInfrastructure.DecompiledSourceCode;

            ICodeViewerResults codeViewerResults = new CodeViewerResults(decompiledSourceCode);

            return(new DecompilationResults(assemblyAttributesFilePath, codeViewerResults,
                                            new Dictionary <uint, IOffsetSpan>(), new Dictionary <uint, IOffsetSpan>(), new Dictionary <uint, IOffsetSpan>(), new Dictionary <uint, IOffsetSpan>(), new HashSet <uint>()));
        }
Пример #2
0
        public override Task <DecompileTypeResponse> DecompileType(DecompileTypeRequest request, ServerCallContext context)
        {
            if (!this.decompilationContext.DecompilationContext.FilePathToType.ContainsKey(request.FilePath))
            {
                throw new RpcException(new Status(StatusCode.NotFound, "No type to corresponding file path"));
            }

            TypeDefinition      type = this.decompilationContext.DecompilationContext.FilePathToType[request.FilePath];
            IExceptionFormatter exceptionFormatter = SimpleExceptionFormatter.Instance;
            ILanguage           language           = LanguageFactory.GetLanguage(CSharpVersion.V7);
            StringWriter        theWriter          = new StringWriter();
            CodeFormatter       formatter          = new CodeFormatter(theWriter);
            IWriterSettings     settings           = new WriterSettings(writeExceptionsAsComments: true,
                                                                        writeFullyQualifiedNames: false,
                                                                        writeDocumentation: true,
                                                                        showCompilerGeneratedMembers: false,
                                                                        writeLargeNumbersInHex: false);
            ILanguageWriter writer = language.GetWriter(formatter, exceptionFormatter, settings);

            IWriterContextService writerContextService = new TypeCollisionWriterContextService(new ProjectGenerationDecompilationCacheService(), true);

            try
            {
                List <WritingInfo> infos = (writer as INamespaceLanguageWriter).WriteTypeAndNamespaces(type, writerContextService);

                DecompiledTypeMetadata decompiledTypeMetadata = new DecompiledTypeMetadata();

                decompiledTypeMetadata.CodeSpanToMemberReference.AddRange(formatter.CodeSpanToMemberReference);

                foreach (WritingInfo info in infos)
                {
                    decompiledTypeMetadata.MemberDeclarationToCodeSpan.AddRange(info.MemberDeclarationToCodeSpan);

                    decompiledTypeMetadata.CodeMappingInfo.NodeToCodeMap.AddRange(info.CodeMappingInfo.NodeToCodeMap);
                    decompiledTypeMetadata.CodeMappingInfo.InstructionToCodeMap.AddRange(info.CodeMappingInfo.InstructionToCodeMap);
                    decompiledTypeMetadata.CodeMappingInfo.FieldConstantValueToCodeMap.AddRange(info.CodeMappingInfo.FieldConstantValueToCodeMap);
                    decompiledTypeMetadata.CodeMappingInfo.VariableToCodeMap.AddRange(info.CodeMappingInfo.VariableToCodeMap);
                    decompiledTypeMetadata.CodeMappingInfo.ParameterToCodeMap.AddRange(info.CodeMappingInfo.ParameterToCodeMap);

                    decompiledTypeMetadata.CodeMappingInfo.MethodDefinitionToMethodReturnTypeCodeMap.AddRange(info.CodeMappingInfo.MethodDefinitionToMethodReturnTypeCodeMap);
                    decompiledTypeMetadata.CodeMappingInfo.FieldDefinitionToFieldTypeCodeMap.AddRange(info.CodeMappingInfo.FieldDefinitionToFieldTypeCodeMap);
                    decompiledTypeMetadata.CodeMappingInfo.PropertyDefinitionToPropertyTypeCodeMap.AddRange(info.CodeMappingInfo.PropertyDefinitionToPropertyTypeCodeMap);
                    decompiledTypeMetadata.CodeMappingInfo.EventDefinitionToEventTypeCodeMap.AddRange(info.CodeMappingInfo.EventDefinitionToEventTypeCodeMap);
                    decompiledTypeMetadata.CodeMappingInfo.ParameterDefinitionToParameterTypeCodeMap.AddRange(info.CodeMappingInfo.ParameterDefinitionToParameterTypeCodeMap);
                    decompiledTypeMetadata.CodeMappingInfo.VariableDefinitionToVariableTypeCodeMap.AddRange(info.CodeMappingInfo.VariableDefinitionToVariableTypeCodeMap);
                }

                this.decompilationContext.AddTypeMetadataToCache(type, decompiledTypeMetadata);

                return(Task.FromResult(new DecompileTypeResponse()
                {
                    SourceCode = theWriter.ToString()
                }));
            }
            catch (Exception e)
            {
                string[] exceptionMessageLines     = exceptionFormatter.Format(e, type.FullName, null);
                string   exceptionMessage          = string.Join(Environment.NewLine, exceptionMessageLines);
                string   commentedExceptionMessage = language.CommentLines(exceptionMessage);

                return(Task.FromResult(new DecompileTypeResponse()
                {
                    SourceCode = commentedExceptionMessage
                }));
            }
        }