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>())); }
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 })); } }