Showing preview only (7,659K chars total). Download the full file or copy to clipboard to get everything.
Repository: Col-E/Recaf
Branch: master
Commit: a9d4b982d69d
Files: 1323
Total size: 7.0 MB
Directory structure:
gitextract_kfvnwn9t/
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── feature_request.md
│ │ └── other.md
│ └── workflows/
│ └── build.yml
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── PRIMER.md
├── PULL_REQUEST_TEMPLATE.md
├── README.md
├── build.gradle
├── codecov.yml
├── docs/
│ ├── README.md
│ └── index.html
├── gradle/
│ ├── libs.versions.toml
│ ├── tasks.gradle
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── jitpack.yml
├── libs/
│ ├── README.md
│ └── kotlin-metadata.jar
├── recaf-core/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── software/
│ │ │ └── coley/
│ │ │ └── recaf/
│ │ │ ├── Bootstrap.java
│ │ │ ├── ExitCodes.java
│ │ │ ├── ExitDebugLoggingHook.java
│ │ │ ├── Recaf.java
│ │ │ ├── RecafConstants.java
│ │ │ ├── analytics/
│ │ │ │ ├── SystemInformation.java
│ │ │ │ └── logging/
│ │ │ │ ├── DebuggingLogger.java
│ │ │ │ ├── InterceptingLogger.java
│ │ │ │ ├── LogConsumer.java
│ │ │ │ ├── Logging.java
│ │ │ │ └── RecafLoggingFilter.java
│ │ │ ├── behavior/
│ │ │ │ ├── Closing.java
│ │ │ │ ├── PriorityKeys.java
│ │ │ │ └── PrioritySortable.java
│ │ │ ├── cdi/
│ │ │ │ ├── EagerInitialization.java
│ │ │ │ ├── EagerInitializationExtension.java
│ │ │ │ ├── InitializationEvent.java
│ │ │ │ ├── InitializationStage.java
│ │ │ │ └── UiInitializationEvent.java
│ │ │ ├── config/
│ │ │ │ ├── BasicCollectionConfigValue.java
│ │ │ │ ├── BasicConfigContainer.java
│ │ │ │ ├── BasicConfigValue.java
│ │ │ │ ├── BasicMapConfigValue.java
│ │ │ │ ├── ConfigCollectionValue.java
│ │ │ │ ├── ConfigContainer.java
│ │ │ │ ├── ConfigGroups.java
│ │ │ │ ├── ConfigMapValue.java
│ │ │ │ ├── ConfigPersistence.java
│ │ │ │ ├── ConfigValue.java
│ │ │ │ └── RestoreAwareConfigContainer.java
│ │ │ ├── info/
│ │ │ │ ├── Accessed.java
│ │ │ │ ├── AndroidChunkFileInfo.java
│ │ │ │ ├── AndroidClassInfo.java
│ │ │ │ ├── ApkFileInfo.java
│ │ │ │ ├── ArscFileInfo.java
│ │ │ │ ├── AudioFileInfo.java
│ │ │ │ ├── BasicAndroidChunkFileInfo.java
│ │ │ │ ├── BasicAndroidClassInfo.java
│ │ │ │ ├── BasicApkFileInfo.java
│ │ │ │ ├── BasicArscFileInfo.java
│ │ │ │ ├── BasicAudioFileInfo.java
│ │ │ │ ├── BasicBinaryXmlFileInfo.java
│ │ │ │ ├── BasicClassInfo.java
│ │ │ │ ├── BasicDexFileInfo.java
│ │ │ │ ├── BasicFileInfo.java
│ │ │ │ ├── BasicImageFileInfo.java
│ │ │ │ ├── BasicInnerClassInfo.java
│ │ │ │ ├── BasicJModFileInfo.java
│ │ │ │ ├── BasicJarFileInfo.java
│ │ │ │ ├── BasicJvmClassInfo.java
│ │ │ │ ├── BasicModulesFileInfo.java
│ │ │ │ ├── BasicNativeLibraryFileInfo.java
│ │ │ │ ├── BasicTextFileInfo.java
│ │ │ │ ├── BasicVideoFileInfo.java
│ │ │ │ ├── BasicWarFileInfo.java
│ │ │ │ ├── BasicZipFileInfo.java
│ │ │ │ ├── BinaryXmlFileInfo.java
│ │ │ │ ├── ClassInfo.java
│ │ │ │ ├── DexFileInfo.java
│ │ │ │ ├── FileInfo.java
│ │ │ │ ├── ImageFileInfo.java
│ │ │ │ ├── Info.java
│ │ │ │ ├── InnerClassInfo.java
│ │ │ │ ├── JModFileInfo.java
│ │ │ │ ├── JarFileInfo.java
│ │ │ │ ├── JvmClassInfo.java
│ │ │ │ ├── ModulesFileInfo.java
│ │ │ │ ├── Named.java
│ │ │ │ ├── NativeLibraryFileInfo.java
│ │ │ │ ├── StubClassInfo.java
│ │ │ │ ├── StubFieldMember.java
│ │ │ │ ├── StubFileInfo.java
│ │ │ │ ├── StubMember.java
│ │ │ │ ├── StubMethodMember.java
│ │ │ │ ├── TextFileInfo.java
│ │ │ │ ├── VideoFileInfo.java
│ │ │ │ ├── WarFileInfo.java
│ │ │ │ ├── ZipFileInfo.java
│ │ │ │ ├── annotation/
│ │ │ │ │ ├── Annotated.java
│ │ │ │ │ ├── AnnotationArrayReference.java
│ │ │ │ │ ├── AnnotationElement.java
│ │ │ │ │ ├── AnnotationEnumReference.java
│ │ │ │ │ ├── AnnotationInfo.java
│ │ │ │ │ ├── BasicAnnotationArrayReference.java
│ │ │ │ │ ├── BasicAnnotationElement.java
│ │ │ │ │ ├── BasicAnnotationEnumReference.java
│ │ │ │ │ ├── BasicAnnotationInfo.java
│ │ │ │ │ ├── BasicTypeAnnotationInfo.java
│ │ │ │ │ └── TypeAnnotationInfo.java
│ │ │ │ ├── builder/
│ │ │ │ │ ├── AbstractClassInfoBuilder.java
│ │ │ │ │ ├── AndroidClassInfoBuilder.java
│ │ │ │ │ ├── ApkFileInfoBuilder.java
│ │ │ │ │ ├── ArscFileInfoBuilder.java
│ │ │ │ │ ├── AudioFileInfoBuilder.java
│ │ │ │ │ ├── BinaryXmlFileInfoBuilder.java
│ │ │ │ │ ├── ChunkFileInfoBuilder.java
│ │ │ │ │ ├── DexFileInfoBuilder.java
│ │ │ │ │ ├── FileInfoBuilder.java
│ │ │ │ │ ├── ImageFileInfoBuilder.java
│ │ │ │ │ ├── JModFileInfoBuilder.java
│ │ │ │ │ ├── JarFileInfoBuilder.java
│ │ │ │ │ ├── JvmClassInfoBuilder.java
│ │ │ │ │ ├── ModulesFileInfoBuilder.java
│ │ │ │ │ ├── NativeLibraryFileInfoBuilder.java
│ │ │ │ │ ├── TextFileInfoBuilder.java
│ │ │ │ │ ├── VideoFileInfoBuilder.java
│ │ │ │ │ ├── WarFileInfoBuilder.java
│ │ │ │ │ └── ZipFileInfoBuilder.java
│ │ │ │ ├── member/
│ │ │ │ │ ├── BasicFieldMember.java
│ │ │ │ │ ├── BasicLocalVariable.java
│ │ │ │ │ ├── BasicMember.java
│ │ │ │ │ ├── BasicMethodMember.java
│ │ │ │ │ ├── ClassMember.java
│ │ │ │ │ ├── FieldMember.java
│ │ │ │ │ ├── LocalVariable.java
│ │ │ │ │ └── MethodMember.java
│ │ │ │ └── properties/
│ │ │ │ ├── BasicProperty.java
│ │ │ │ ├── BasicPropertyContainer.java
│ │ │ │ ├── Property.java
│ │ │ │ ├── PropertyContainer.java
│ │ │ │ └── builtin/
│ │ │ │ ├── BinaryXmlDecodedProperty.java
│ │ │ │ ├── CachedDecompileProperty.java
│ │ │ │ ├── HasMappedReferenceProperty.java
│ │ │ │ ├── IllegalClassSuspectProperty.java
│ │ │ │ ├── InputFilePathProperty.java
│ │ │ │ ├── MemberIndexAcceleratorProperty.java
│ │ │ │ ├── OriginalClassNameProperty.java
│ │ │ │ ├── PathOriginalNameProperty.java
│ │ │ │ ├── PathPrefixProperty.java
│ │ │ │ ├── PathSuffixProperty.java
│ │ │ │ ├── ReferencedClassesProperty.java
│ │ │ │ ├── RemapOriginTaskProperty.java
│ │ │ │ ├── RemoteClassloaderProperty.java
│ │ │ │ ├── StringDefinitionsProperty.java
│ │ │ │ ├── ThrowableProperty.java
│ │ │ │ ├── UnknownAttributesProperty.java
│ │ │ │ ├── VersionedClassProperty.java
│ │ │ │ ├── ZipAccessTimeProperty.java
│ │ │ │ ├── ZipCommentProperty.java
│ │ │ │ ├── ZipCompressionProperty.java
│ │ │ │ ├── ZipCreationTimeProperty.java
│ │ │ │ ├── ZipEntryIndexProperty.java
│ │ │ │ ├── ZipMarkerProperty.java
│ │ │ │ ├── ZipModificationTimeProperty.java
│ │ │ │ └── ZipPrefixDataProperty.java
│ │ │ ├── launch/
│ │ │ │ ├── LaunchArguments.java
│ │ │ │ ├── LaunchCommand.java
│ │ │ │ └── LaunchHandler.java
│ │ │ ├── path/
│ │ │ │ ├── AbstractPathNode.java
│ │ │ │ ├── AnnotationPathNode.java
│ │ │ │ ├── BundlePathNode.java
│ │ │ │ ├── CatchPathNode.java
│ │ │ │ ├── ClassMemberPathNode.java
│ │ │ │ ├── ClassPathNode.java
│ │ │ │ ├── DirectoryPathNode.java
│ │ │ │ ├── EmbeddedResourceContainerPathNode.java
│ │ │ │ ├── FilePathNode.java
│ │ │ │ ├── IncompletePathException.java
│ │ │ │ ├── InnerClassPathNode.java
│ │ │ │ ├── InstructionPathNode.java
│ │ │ │ ├── LineNumberPathNode.java
│ │ │ │ ├── LocalVariablePathNode.java
│ │ │ │ ├── PathNode.java
│ │ │ │ ├── PathNodes.java
│ │ │ │ ├── ResourcePathNode.java
│ │ │ │ ├── ThrowsPathNode.java
│ │ │ │ └── WorkspacePathNode.java
│ │ │ ├── plugin/
│ │ │ │ ├── Plugin.java
│ │ │ │ └── PluginInformation.java
│ │ │ ├── services/
│ │ │ │ ├── Service.java
│ │ │ │ ├── ServiceConfig.java
│ │ │ │ ├── assembler/
│ │ │ │ │ ├── AbstractAssemblerPipeline.java
│ │ │ │ │ ├── AndroidAssemblerPipeline.java
│ │ │ │ │ ├── AndroidAssemblerPipelineConfig.java
│ │ │ │ │ ├── AssemblerPipeline.java
│ │ │ │ │ ├── AssemblerPipelineConfig.java
│ │ │ │ │ ├── AssemblerPipelineGeneralConfig.java
│ │ │ │ │ ├── AssemblerPipelineManager.java
│ │ │ │ │ ├── ExpressionCompileException.java
│ │ │ │ │ ├── ExpressionCompiler.java
│ │ │ │ │ ├── ExpressionResult.java
│ │ │ │ │ ├── JvmAssemblerPipeline.java
│ │ │ │ │ ├── JvmAssemblerPipelineConfig.java
│ │ │ │ │ ├── Snippet.java
│ │ │ │ │ ├── SnippetListener.java
│ │ │ │ │ ├── SnippetManager.java
│ │ │ │ │ ├── SnippetManagerConfig.java
│ │ │ │ │ └── WorkspaceFieldValueLookup.java
│ │ │ │ ├── attach/
│ │ │ │ │ ├── AttachManager.java
│ │ │ │ │ ├── AttachManagerConfig.java
│ │ │ │ │ ├── BasicAttachManager.java
│ │ │ │ │ ├── JmxBeanServerConnection.java
│ │ │ │ │ ├── NamedMBeanInfo.java
│ │ │ │ │ └── PostScanListener.java
│ │ │ │ ├── callgraph/
│ │ │ │ │ ├── CachedLinkResolver.java
│ │ │ │ │ ├── CallGraph.java
│ │ │ │ │ ├── CallGraphConfig.java
│ │ │ │ │ ├── CallGraphService.java
│ │ │ │ │ ├── ClassLookup.java
│ │ │ │ │ ├── ClassMethodsContainer.java
│ │ │ │ │ ├── LinkedClass.java
│ │ │ │ │ ├── MethodRef.java
│ │ │ │ │ └── MethodVertex.java
│ │ │ │ ├── comment/
│ │ │ │ │ ├── ClassComments.java
│ │ │ │ │ ├── CommentContainerListener.java
│ │ │ │ │ ├── CommentInsertingVisitor.java
│ │ │ │ │ ├── CommentKey.java
│ │ │ │ │ ├── CommentManager.java
│ │ │ │ │ ├── CommentManagerConfig.java
│ │ │ │ │ ├── CommentUpdateListener.java
│ │ │ │ │ ├── DelegatingClassComments.java
│ │ │ │ │ ├── DelegatingWorkspaceComments.java
│ │ │ │ │ ├── PersistClassComments.java
│ │ │ │ │ ├── PersistWorkspaceComments.java
│ │ │ │ │ └── WorkspaceComments.java
│ │ │ │ ├── compile/
│ │ │ │ │ ├── CompileMap.java
│ │ │ │ │ ├── CompilerDiagnostic.java
│ │ │ │ │ ├── CompilerResult.java
│ │ │ │ │ ├── ForwardingListener.java
│ │ │ │ │ ├── JavacArguments.java
│ │ │ │ │ ├── JavacArgumentsBuilder.java
│ │ │ │ │ ├── JavacCompiler.java
│ │ │ │ │ ├── JavacCompilerConfig.java
│ │ │ │ │ ├── JavacListener.java
│ │ │ │ │ ├── ResourceVirtualJavaFileObject.java
│ │ │ │ │ ├── VirtualFileManager.java
│ │ │ │ │ ├── VirtualJavaFileObject.java
│ │ │ │ │ ├── VirtualUnitMap.java
│ │ │ │ │ └── stub/
│ │ │ │ │ ├── ClassStubGenerator.java
│ │ │ │ │ ├── ExpressionHostingClassStubGenerator.java
│ │ │ │ │ └── InnerClassStubGenerator.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── ConfigManager.java
│ │ │ │ │ ├── ConfigManagerConfig.java
│ │ │ │ │ └── ManagedConfigListener.java
│ │ │ │ ├── decompile/
│ │ │ │ │ ├── AbstractAndroidDecompiler.java
│ │ │ │ │ ├── AbstractDecompiler.java
│ │ │ │ │ ├── AbstractJvmDecompiler.java
│ │ │ │ │ ├── AndroidDecompiler.java
│ │ │ │ │ ├── BaseDecompilerConfig.java
│ │ │ │ │ ├── DecompileResult.java
│ │ │ │ │ ├── Decompiler.java
│ │ │ │ │ ├── DecompilerConfig.java
│ │ │ │ │ ├── DecompilerManager.java
│ │ │ │ │ ├── DecompilerManagerConfig.java
│ │ │ │ │ ├── JvmDecompiler.java
│ │ │ │ │ ├── NoopAndroidDecompiler.java
│ │ │ │ │ ├── NoopDecompilerConfig.java
│ │ │ │ │ ├── NoopJvmDecompiler.java
│ │ │ │ │ ├── cfr/
│ │ │ │ │ │ ├── CfrConfig.java
│ │ │ │ │ │ ├── CfrDecompiler.java
│ │ │ │ │ │ ├── ClassSource.java
│ │ │ │ │ │ └── SinkFactoryImpl.java
│ │ │ │ │ ├── fallback/
│ │ │ │ │ │ ├── FallbackConfig.java
│ │ │ │ │ │ ├── FallbackDecompiler.java
│ │ │ │ │ │ └── print/
│ │ │ │ │ │ ├── ClassPrinter.java
│ │ │ │ │ │ ├── MethodPrinter.java
│ │ │ │ │ │ ├── PrintUtils.java
│ │ │ │ │ │ └── Printer.java
│ │ │ │ │ ├── filter/
│ │ │ │ │ │ ├── JvmBytecodeFilter.java
│ │ │ │ │ │ └── OutputTextFilter.java
│ │ │ │ │ ├── procyon/
│ │ │ │ │ │ ├── ProcyonConfig.java
│ │ │ │ │ │ ├── ProcyonDecompiler.java
│ │ │ │ │ │ └── WorkspaceTypeLoader.java
│ │ │ │ │ └── vineflower/
│ │ │ │ │ ├── BaseSource.java
│ │ │ │ │ ├── ClassSource.java
│ │ │ │ │ ├── DecompiledOutputSink.java
│ │ │ │ │ ├── DummyResultSaver.java
│ │ │ │ │ ├── LibrarySource.java
│ │ │ │ │ ├── VineflowerConfig.java
│ │ │ │ │ ├── VineflowerDecompiler.java
│ │ │ │ │ ├── VineflowerLogger.java
│ │ │ │ │ └── WorkspaceEntriesCache.java
│ │ │ │ ├── deobfuscation/
│ │ │ │ │ └── transform/
│ │ │ │ │ ├── generic/
│ │ │ │ │ │ ├── CallResultInliningTransformer.java
│ │ │ │ │ │ ├── CycleClassRemovingTransformer.java
│ │ │ │ │ │ ├── DeadCodeRemovingTransformer.java
│ │ │ │ │ │ ├── DuplicateAnnotationRemovingTransformer.java
│ │ │ │ │ │ ├── DuplicateCatchMergingTransformer.java
│ │ │ │ │ │ ├── EnumNameRestorationTransformer.java
│ │ │ │ │ │ ├── ExceptionCollectionTransformer.java
│ │ │ │ │ │ ├── FrameRemovingTransformer.java
│ │ │ │ │ │ ├── GotoInliningTransformer.java
│ │ │ │ │ │ ├── IllegalAnnotationRemovingTransformer.java
│ │ │ │ │ │ ├── IllegalNameMappingTransformer.java
│ │ │ │ │ │ ├── IllegalSignatureRemovingTransformer.java
│ │ │ │ │ │ ├── IllegalVarargsRemovingTransformer.java
│ │ │ │ │ │ ├── KotlinMetadataCollectionTransformer.java
│ │ │ │ │ │ ├── KotlinNameRestorationTransformer.java
│ │ │ │ │ │ ├── LongAnnotationRemovingTransformer.java
│ │ │ │ │ │ ├── LongExceptionRemovingTransformer.java
│ │ │ │ │ │ ├── OpaqueConstantFoldingTransformer.java
│ │ │ │ │ │ ├── OpaquePredicateFoldingTransformer.java
│ │ │ │ │ │ ├── RedundantTryCatchRemovingTransformer.java
│ │ │ │ │ │ ├── SourceNameRestorationTransformer.java
│ │ │ │ │ │ ├── StaticValueCollectionTransformer.java
│ │ │ │ │ │ ├── StaticValueInliningTransformer.java
│ │ │ │ │ │ ├── UnknownAttributeRemovingTransformer.java
│ │ │ │ │ │ ├── VariableFoldingTransformer.java
│ │ │ │ │ │ └── VariableTableNormalizingTransformer.java
│ │ │ │ │ └── specific/
│ │ │ │ │ └── DashOpaqueSeedFoldingTransformer.java
│ │ │ │ ├── file/
│ │ │ │ │ └── RecafDirectoriesConfig.java
│ │ │ │ ├── inheritance/
│ │ │ │ │ ├── ClassPathNodeProvider.java
│ │ │ │ │ ├── InheritanceGraph.java
│ │ │ │ │ ├── InheritanceGraphService.java
│ │ │ │ │ ├── InheritanceGraphServiceConfig.java
│ │ │ │ │ └── InheritanceVertex.java
│ │ │ │ ├── json/
│ │ │ │ │ ├── GsonProvider.java
│ │ │ │ │ └── GsonProviderConfig.java
│ │ │ │ ├── mapping/
│ │ │ │ │ ├── BasicMappingsRemapper.java
│ │ │ │ │ ├── IntermediateMappings.java
│ │ │ │ │ ├── MappingApplicationListener.java
│ │ │ │ │ ├── MappingApplier.java
│ │ │ │ │ ├── MappingApplierConfig.java
│ │ │ │ │ ├── MappingApplierService.java
│ │ │ │ │ ├── MappingListeners.java
│ │ │ │ │ ├── MappingListenersConfig.java
│ │ │ │ │ ├── MappingResults.java
│ │ │ │ │ ├── Mappings.java
│ │ │ │ │ ├── MappingsAdapter.java
│ │ │ │ │ ├── UniqueKeyMappings.java
│ │ │ │ │ ├── WorkspaceBackedRemapper.java
│ │ │ │ │ ├── WorkspaceClassRemapper.java
│ │ │ │ │ ├── aggregate/
│ │ │ │ │ │ ├── AggregateMappingManager.java
│ │ │ │ │ │ ├── AggregateMappingManagerConfig.java
│ │ │ │ │ │ ├── AggregatedMappings.java
│ │ │ │ │ │ └── AggregatedMappingsListener.java
│ │ │ │ │ ├── data/
│ │ │ │ │ │ ├── AbstractMappingKey.java
│ │ │ │ │ │ ├── ClassMapping.java
│ │ │ │ │ │ ├── ClassMappingKey.java
│ │ │ │ │ │ ├── FieldMapping.java
│ │ │ │ │ │ ├── FieldMappingKey.java
│ │ │ │ │ │ ├── MappingKey.java
│ │ │ │ │ │ ├── MemberMapping.java
│ │ │ │ │ │ ├── MethodMapping.java
│ │ │ │ │ │ ├── MethodMappingKey.java
│ │ │ │ │ │ ├── VariableMapping.java
│ │ │ │ │ │ └── VariableMappingKey.java
│ │ │ │ │ ├── format/
│ │ │ │ │ │ ├── AbstractMappingFileFormat.java
│ │ │ │ │ │ ├── EnigmaMappings.java
│ │ │ │ │ │ ├── InvalidMappingException.java
│ │ │ │ │ │ ├── JadxMappings.java
│ │ │ │ │ │ ├── MappingFileFormat.java
│ │ │ │ │ │ ├── MappingFormatManager.java
│ │ │ │ │ │ ├── MappingFormatManagerConfig.java
│ │ │ │ │ │ ├── MappingTreeReader.java
│ │ │ │ │ │ ├── ProguardMappings.java
│ │ │ │ │ │ ├── SimpleMappings.java
│ │ │ │ │ │ ├── SrgMappings.java
│ │ │ │ │ │ ├── TinyV1Mappings.java
│ │ │ │ │ │ └── TinyV2Mappings.java
│ │ │ │ │ └── gen/
│ │ │ │ │ ├── MappingGenerator.java
│ │ │ │ │ ├── MappingGeneratorConfig.java
│ │ │ │ │ ├── filter/
│ │ │ │ │ │ ├── ExcludeClassesFilter.java
│ │ │ │ │ │ ├── ExcludeEnumMethodsFilter.java
│ │ │ │ │ │ ├── ExcludeExistingMappedFilter.java
│ │ │ │ │ │ ├── ExcludeModifiersNameFilter.java
│ │ │ │ │ │ ├── ExcludeNameFilter.java
│ │ │ │ │ │ ├── IncludeClassesFilter.java
│ │ │ │ │ │ ├── IncludeKeywordNameFilter.java
│ │ │ │ │ │ ├── IncludeLongNameFilter.java
│ │ │ │ │ │ ├── IncludeModifiersNameFilter.java
│ │ │ │ │ │ ├── IncludeNameFilter.java
│ │ │ │ │ │ ├── IncludeNonAsciiNameFilter.java
│ │ │ │ │ │ ├── IncludeNonJavaIdentifierNameFilter.java
│ │ │ │ │ │ ├── IncludeWhitespaceNameFilter.java
│ │ │ │ │ │ └── NameGeneratorFilter.java
│ │ │ │ │ └── naming/
│ │ │ │ │ ├── AbstractNameGeneratorProvider.java
│ │ │ │ │ ├── AlphabetNameGenerator.java
│ │ │ │ │ ├── AlphabetNameGeneratorProvider.java
│ │ │ │ │ ├── DeconflictingNameGenerator.java
│ │ │ │ │ ├── IncrementingNameGenerator.java
│ │ │ │ │ ├── IncrementingNameGeneratorProvider.java
│ │ │ │ │ ├── NameGenerator.java
│ │ │ │ │ ├── NameGeneratorProvider.java
│ │ │ │ │ ├── NameGeneratorProviders.java
│ │ │ │ │ └── NameGeneratorProvidersConfig.java
│ │ │ │ ├── phantom/
│ │ │ │ │ ├── GeneratedPhantomWorkspaceResource.java
│ │ │ │ │ ├── JPhantomGenerator.java
│ │ │ │ │ ├── JPhantomGeneratorConfig.java
│ │ │ │ │ ├── PhantomGenerationException.java
│ │ │ │ │ └── PhantomGenerator.java
│ │ │ │ ├── plugin/
│ │ │ │ │ ├── AllocationException.java
│ │ │ │ │ ├── BasicPluginManager.java
│ │ │ │ │ ├── CdiClassAllocator.java
│ │ │ │ │ ├── ClassAllocator.java
│ │ │ │ │ ├── LoadedPlugin.java
│ │ │ │ │ ├── PluginClassLoader.java
│ │ │ │ │ ├── PluginClassLoaderImpl.java
│ │ │ │ │ ├── PluginContainer.java
│ │ │ │ │ ├── PluginContainerImpl.java
│ │ │ │ │ ├── PluginException.java
│ │ │ │ │ ├── PluginGraph.java
│ │ │ │ │ ├── PluginId.java
│ │ │ │ │ ├── PluginInfo.java
│ │ │ │ │ ├── PluginLoader.java
│ │ │ │ │ ├── PluginManager.java
│ │ │ │ │ ├── PluginManagerConfig.java
│ │ │ │ │ ├── PluginSource.java
│ │ │ │ │ ├── PluginUnloader.java
│ │ │ │ │ ├── PreparedPlugin.java
│ │ │ │ │ ├── discovery/
│ │ │ │ │ │ ├── DirectoryPluginDiscoverer.java
│ │ │ │ │ │ ├── DiscoveredPluginSource.java
│ │ │ │ │ │ ├── PathPluginDiscoverer.java
│ │ │ │ │ │ └── PluginDiscoverer.java
│ │ │ │ │ └── zip/
│ │ │ │ │ ├── ZipArchiveView.java
│ │ │ │ │ ├── ZipPluginLoader.java
│ │ │ │ │ ├── ZipPreparedPlugin.java
│ │ │ │ │ └── ZipSource.java
│ │ │ │ ├── script/
│ │ │ │ │ ├── GenerateResult.java
│ │ │ │ │ ├── JavacScriptEngine.java
│ │ │ │ │ ├── ScriptEngine.java
│ │ │ │ │ ├── ScriptEngineConfig.java
│ │ │ │ │ ├── ScriptFile.java
│ │ │ │ │ ├── ScriptManager.java
│ │ │ │ │ ├── ScriptManagerConfig.java
│ │ │ │ │ └── ScriptResult.java
│ │ │ │ ├── search/
│ │ │ │ │ ├── AndroidClassSearchVisitor.java
│ │ │ │ │ ├── CancellableSearchFeedback.java
│ │ │ │ │ ├── FileSearchVisitor.java
│ │ │ │ │ ├── JvmClassSearchVisitor.java
│ │ │ │ │ ├── ResultSink.java
│ │ │ │ │ ├── SearchFeedback.java
│ │ │ │ │ ├── SearchService.java
│ │ │ │ │ ├── SearchServiceConfig.java
│ │ │ │ │ ├── SearchVisitor.java
│ │ │ │ │ ├── match/
│ │ │ │ │ │ ├── BiNumberMatcher.java
│ │ │ │ │ │ ├── BiStringMatcher.java
│ │ │ │ │ │ ├── MultiNumberMatcher.java
│ │ │ │ │ │ ├── MultiStringMatcher.java
│ │ │ │ │ │ ├── NumberPredicate.java
│ │ │ │ │ │ ├── NumberPredicateProvider.java
│ │ │ │ │ │ ├── RangeNumberMatcher.java
│ │ │ │ │ │ ├── StringPredicate.java
│ │ │ │ │ │ └── StringPredicateProvider.java
│ │ │ │ │ ├── query/
│ │ │ │ │ │ ├── AbstractValueQuery.java
│ │ │ │ │ │ ├── AndroidClassQuery.java
│ │ │ │ │ │ ├── DeclarationQuery.java
│ │ │ │ │ │ ├── FileQuery.java
│ │ │ │ │ │ ├── InstructionQuery.java
│ │ │ │ │ │ ├── JvmClassQuery.java
│ │ │ │ │ │ ├── NumberQuery.java
│ │ │ │ │ │ ├── Query.java
│ │ │ │ │ │ ├── ReferenceQuery.java
│ │ │ │ │ │ └── StringQuery.java
│ │ │ │ │ └── result/
│ │ │ │ │ ├── ClassReference.java
│ │ │ │ │ ├── ClassReferenceResult.java
│ │ │ │ │ ├── MemberReference.java
│ │ │ │ │ ├── MemberReferenceResult.java
│ │ │ │ │ ├── NumberResult.java
│ │ │ │ │ ├── Result.java
│ │ │ │ │ ├── Results.java
│ │ │ │ │ └── StringResult.java
│ │ │ │ ├── source/
│ │ │ │ │ ├── AstMapper.java
│ │ │ │ │ ├── AstResolveResult.java
│ │ │ │ │ ├── AstService.java
│ │ │ │ │ ├── AstServiceConfig.java
│ │ │ │ │ └── ResolverAdapter.java
│ │ │ │ ├── text/
│ │ │ │ │ └── TextFormatConfig.java
│ │ │ │ ├── transform/
│ │ │ │ │ ├── CancellableTransformationFeedback.java
│ │ │ │ │ ├── ClassTransformer.java
│ │ │ │ │ ├── JvmClassTransformer.java
│ │ │ │ │ ├── JvmTransformResult.java
│ │ │ │ │ ├── JvmTransformerContext.java
│ │ │ │ │ ├── TransformResult.java
│ │ │ │ │ ├── TransformationApplier.java
│ │ │ │ │ ├── TransformationApplierConfig.java
│ │ │ │ │ ├── TransformationApplierService.java
│ │ │ │ │ ├── TransformationException.java
│ │ │ │ │ ├── TransformationFeedback.java
│ │ │ │ │ ├── TransformationManager.java
│ │ │ │ │ └── TransformationManagerConfig.java
│ │ │ │ ├── tutorial/
│ │ │ │ │ ├── TutorialConfig.java
│ │ │ │ │ ├── TutorialWorkspace.java
│ │ │ │ │ └── TutorialWorkspaceResource.java
│ │ │ │ └── workspace/
│ │ │ │ ├── BasicWorkspaceManager.java
│ │ │ │ ├── WorkspaceCloseCondition.java
│ │ │ │ ├── WorkspaceCloseListener.java
│ │ │ │ ├── WorkspaceManager.java
│ │ │ │ ├── WorkspaceManagerConfig.java
│ │ │ │ ├── WorkspaceOpenListener.java
│ │ │ │ ├── WorkspaceProcessingConfig.java
│ │ │ │ ├── WorkspaceProcessingService.java
│ │ │ │ ├── WorkspaceProcessor.java
│ │ │ │ ├── io/
│ │ │ │ │ ├── BasicClassPatcher.java
│ │ │ │ │ ├── BasicInfoImporter.java
│ │ │ │ │ ├── BasicResourceImporter.java
│ │ │ │ │ ├── ByteArrayWorkspaceExportConsumer.java
│ │ │ │ │ ├── ClassPatcher.java
│ │ │ │ │ ├── InfoImporter.java
│ │ │ │ │ ├── InfoImporterConfig.java
│ │ │ │ │ ├── PathWorkspaceExportConsumer.java
│ │ │ │ │ ├── ResourceImporter.java
│ │ │ │ │ ├── ResourceImporterConfig.java
│ │ │ │ │ ├── WorkspaceCompressType.java
│ │ │ │ │ ├── WorkspaceExportConsumer.java
│ │ │ │ │ ├── WorkspaceExportOptions.java
│ │ │ │ │ ├── WorkspaceExporter.java
│ │ │ │ │ └── WorkspaceOutputType.java
│ │ │ │ ├── patch/
│ │ │ │ │ ├── PatchApplier.java
│ │ │ │ │ ├── PatchFeedback.java
│ │ │ │ │ ├── PatchGenerationException.java
│ │ │ │ │ ├── PatchProvider.java
│ │ │ │ │ ├── PatchSerialization.java
│ │ │ │ │ ├── ResourcePatchApplierConfig.java
│ │ │ │ │ ├── ResourcePatchProviderConfig.java
│ │ │ │ │ └── model/
│ │ │ │ │ ├── JvmAssemblerPatch.java
│ │ │ │ │ ├── RemovePath.java
│ │ │ │ │ ├── TextFilePatch.java
│ │ │ │ │ └── WorkspacePatch.java
│ │ │ │ └── processors/
│ │ │ │ └── ThrowablePropertyAssigningProcessor.java
│ │ │ ├── util/
│ │ │ │ ├── AccessFlag.java
│ │ │ │ ├── AccessPatcher.java
│ │ │ │ ├── AsmInsnUtil.java
│ │ │ │ ├── BlwUtil.java
│ │ │ │ ├── ByteHeaderUtil.java
│ │ │ │ ├── CancelSignal.java
│ │ │ │ ├── ClassDefiner.java
│ │ │ │ ├── ClassLoaderInternals.java
│ │ │ │ ├── ClasspathUtil.java
│ │ │ │ ├── CollectionUtils.java
│ │ │ │ ├── DesktopUtil.java
│ │ │ │ ├── DevDetection.java
│ │ │ │ ├── EscapeUtil.java
│ │ │ │ ├── ExcludeFromJacocoGeneratedReport.java
│ │ │ │ ├── Handles.java
│ │ │ │ ├── IOUtil.java
│ │ │ │ ├── InternalPath.java
│ │ │ │ ├── JavaDowngraderUtil.java
│ │ │ │ ├── JavaVersion.java
│ │ │ │ ├── JdkValidation.java
│ │ │ │ ├── Keywords.java
│ │ │ │ ├── MemoizedFunctions.java
│ │ │ │ ├── ModulesIOUtil.java
│ │ │ │ ├── MultiMap.java
│ │ │ │ ├── MultiMapBuilder.java
│ │ │ │ ├── NumberUtil.java
│ │ │ │ ├── PlatformType.java
│ │ │ │ ├── ReflectUtil.java
│ │ │ │ ├── RegexUtil.java
│ │ │ │ ├── ResourceUtil.java
│ │ │ │ ├── SelfReferenceUtil.java
│ │ │ │ ├── ShortcutUtil.java
│ │ │ │ ├── Streams.java
│ │ │ │ ├── StringDecodingResult.java
│ │ │ │ ├── StringDiff.java
│ │ │ │ ├── StringUtil.java
│ │ │ │ ├── TestEnvironment.java
│ │ │ │ ├── Types.java
│ │ │ │ ├── UnsafeIO.java
│ │ │ │ ├── UnsafeUtil.java
│ │ │ │ ├── ZipCreationUtils.java
│ │ │ │ ├── analysis/
│ │ │ │ │ ├── Branching.java
│ │ │ │ │ ├── Nullness.java
│ │ │ │ │ ├── ReAnalyzer.java
│ │ │ │ │ ├── ReFrame.java
│ │ │ │ │ ├── ReInterpreter.java
│ │ │ │ │ ├── eval/
│ │ │ │ │ │ ├── EvaluationException.java
│ │ │ │ │ │ ├── EvaluationFailureResult.java
│ │ │ │ │ │ ├── EvaluationResult.java
│ │ │ │ │ │ ├── EvaluationThrowsResult.java
│ │ │ │ │ │ ├── EvaluationYieldResult.java
│ │ │ │ │ │ ├── Evaluator.java
│ │ │ │ │ │ ├── FieldCache.java
│ │ │ │ │ │ ├── FieldCacheManager.java
│ │ │ │ │ │ ├── InstanceFactory.java
│ │ │ │ │ │ ├── InstanceMapper.java
│ │ │ │ │ │ ├── InstancedObjectValue.java
│ │ │ │ │ │ └── MethodInvokeHandler.java
│ │ │ │ │ ├── gen/
│ │ │ │ │ │ ├── GenUtils.java
│ │ │ │ │ │ ├── InstanceMapperGenerator.java
│ │ │ │ │ │ ├── InstanceMethodInvokeHandlerGenerator.java
│ │ │ │ │ │ ├── InstanceStaticMapperGenerator.java
│ │ │ │ │ │ └── LookupGenerator.java
│ │ │ │ │ ├── lookup/
│ │ │ │ │ │ ├── BasicGetStaticLookup.java
│ │ │ │ │ │ ├── BasicInvokeStaticLookup.java
│ │ │ │ │ │ ├── BasicInvokeVirtualLookup.java
│ │ │ │ │ │ ├── BasicLookupUtils.java
│ │ │ │ │ │ ├── GetFieldLookup.java
│ │ │ │ │ │ ├── GetStaticLookup.java
│ │ │ │ │ │ ├── InvokeStaticLookup.java
│ │ │ │ │ │ └── InvokeVirtualLookup.java
│ │ │ │ │ └── value/
│ │ │ │ │ ├── ArrayValue.java
│ │ │ │ │ ├── DoubleValue.java
│ │ │ │ │ ├── FloatValue.java
│ │ │ │ │ ├── IllegalValueException.java
│ │ │ │ │ ├── IntValue.java
│ │ │ │ │ ├── LongValue.java
│ │ │ │ │ ├── ObjectValue.java
│ │ │ │ │ ├── ReValue.java
│ │ │ │ │ ├── StringValue.java
│ │ │ │ │ ├── UninitializedValue.java
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── ArrayValueImpl.java
│ │ │ │ │ ├── BoxedBooleanValueImpl.java
│ │ │ │ │ ├── BoxedByteValueImpl.java
│ │ │ │ │ ├── BoxedCharacterValueImpl.java
│ │ │ │ │ ├── BoxedDoubleValueImpl.java
│ │ │ │ │ ├── BoxedFloatValueImpl.java
│ │ │ │ │ ├── BoxedIntegerValueImpl.java
│ │ │ │ │ ├── BoxedLongValueImpl.java
│ │ │ │ │ ├── BoxedShortValueImpl.java
│ │ │ │ │ ├── DoubleValueImpl.java
│ │ │ │ │ ├── FloatValueImpl.java
│ │ │ │ │ ├── IntValueImpl.java
│ │ │ │ │ ├── LongValueImpl.java
│ │ │ │ │ ├── ObjectValueBoxImpl.java
│ │ │ │ │ ├── ObjectValueImpl.java
│ │ │ │ │ ├── StringValueImpl.java
│ │ │ │ │ └── UninitializedValueImpl.java
│ │ │ │ ├── android/
│ │ │ │ │ ├── AndroidRes.java
│ │ │ │ │ ├── AndroidXmlUtil.java
│ │ │ │ │ └── DexIOUtil.java
│ │ │ │ ├── io/
│ │ │ │ │ ├── ByteArraySource.java
│ │ │ │ │ ├── ByteBufferSource.java
│ │ │ │ │ ├── ByteSource.java
│ │ │ │ │ ├── ByteSourceConsumer.java
│ │ │ │ │ ├── ByteSourceElement.java
│ │ │ │ │ ├── ByteSources.java
│ │ │ │ │ ├── LocalFileHeaderSource.java
│ │ │ │ │ ├── MemorySegmentDataSource.java
│ │ │ │ │ └── PathByteSource.java
│ │ │ │ ├── kotlin/
│ │ │ │ │ ├── KotlinMetadata.java
│ │ │ │ │ └── model/
│ │ │ │ │ ├── KtClass.java
│ │ │ │ │ ├── KtClassKind.java
│ │ │ │ │ ├── KtConstructor.java
│ │ │ │ │ ├── KtElement.java
│ │ │ │ │ ├── KtFunction.java
│ │ │ │ │ ├── KtNullability.java
│ │ │ │ │ ├── KtParameter.java
│ │ │ │ │ ├── KtProperty.java
│ │ │ │ │ ├── KtType.java
│ │ │ │ │ └── KtVariable.java
│ │ │ │ ├── threading/
│ │ │ │ │ ├── Batch.java
│ │ │ │ │ ├── CountDown.java
│ │ │ │ │ ├── DirectBatch.java
│ │ │ │ │ ├── ExecutorServiceDelegate.java
│ │ │ │ │ ├── PhasingExecutorService.java
│ │ │ │ │ ├── ScheduledExecutorServiceDelegate.java
│ │ │ │ │ ├── ThreadPoolFactory.java
│ │ │ │ │ └── ThreadUtil.java
│ │ │ │ └── visitors/
│ │ │ │ ├── AnnotationArrayVisitor.java
│ │ │ │ ├── BogusNameRemovingVisitor.java
│ │ │ │ ├── ClassAnnotationInsertingVisitor.java
│ │ │ │ ├── ClassAnnotationRemovingVisitor.java
│ │ │ │ ├── ClassHollowingVisitor.java
│ │ │ │ ├── DuplicateAnnotationRemovingVisitor.java
│ │ │ │ ├── FieldAnnotationInsertingVisitor.java
│ │ │ │ ├── FieldAnnotationRemovingVisitor.java
│ │ │ │ ├── FieldInsertingVisitor.java
│ │ │ │ ├── FieldPredicate.java
│ │ │ │ ├── FieldReplacingVisitor.java
│ │ │ │ ├── FrameSkippingVisitor.java
│ │ │ │ ├── IllegalAnnotationRemovingVisitor.java
│ │ │ │ ├── IllegalSignatureRemovingVisitor.java
│ │ │ │ ├── IllegalVarargsRemovingVisitor.java
│ │ │ │ ├── IndexCountingMethodVisitor.java
│ │ │ │ ├── KotlinMetadataVisitor.java
│ │ │ │ ├── LongAnnotationRemovingVisitor.java
│ │ │ │ ├── LongExceptionRemovingVisitor.java
│ │ │ │ ├── MemberCopyingVisitor.java
│ │ │ │ ├── MemberFilteringVisitor.java
│ │ │ │ ├── MemberPredicate.java
│ │ │ │ ├── MemberRemovingVisitor.java
│ │ │ │ ├── MemberStubAddingVisitor.java
│ │ │ │ ├── MethodAnnotationInsertingVisitor.java
│ │ │ │ ├── MethodAnnotationRemovingVisitor.java
│ │ │ │ ├── MethodInsertingVisitor.java
│ │ │ │ ├── MethodNoopingVisitor.java
│ │ │ │ ├── MethodPredicate.java
│ │ │ │ ├── MethodReplacingVisitor.java
│ │ │ │ ├── MethodVariableRemovingVisitor.java
│ │ │ │ ├── SignatureRemovingVisitor.java
│ │ │ │ ├── SkippingAnnotationVisitor.java
│ │ │ │ ├── SkippingClassVisitor.java
│ │ │ │ ├── SkippingFieldVisitor.java
│ │ │ │ ├── SkippingMethodVisitor.java
│ │ │ │ ├── SyntheticRemovingVisitor.java
│ │ │ │ ├── TypeVisitor.java
│ │ │ │ ├── UnknownAttributeRemovingVisitor.java
│ │ │ │ ├── VariableRemovingClassVisitor.java
│ │ │ │ ├── VariableRemovingMethodVisitor.java
│ │ │ │ └── WorkspaceClassWriter.java
│ │ │ └── workspace/
│ │ │ └── model/
│ │ │ ├── BasicWorkspace.java
│ │ │ ├── EmptyWorkspace.java
│ │ │ ├── Workspace.java
│ │ │ ├── WorkspaceModificationListener.java
│ │ │ ├── bundle/
│ │ │ │ ├── AndroidClassBundle.java
│ │ │ │ ├── BasicAndroidClassBundle.java
│ │ │ │ ├── BasicBundle.java
│ │ │ │ ├── BasicFileBundle.java
│ │ │ │ ├── BasicJvmClassBundle.java
│ │ │ │ ├── BasicVersionedJvmClassBundle.java
│ │ │ │ ├── Bundle.java
│ │ │ │ ├── BundleListener.java
│ │ │ │ ├── ClassBundle.java
│ │ │ │ ├── FileBundle.java
│ │ │ │ ├── JvmClassBundle.java
│ │ │ │ └── VersionedJvmClassBundle.java
│ │ │ └── resource/
│ │ │ ├── AgentServerRemoteVmResource.java
│ │ │ ├── AndroidApiResource.java
│ │ │ ├── BasicWorkspaceDirectoryResource.java
│ │ │ ├── BasicWorkspaceFileResource.java
│ │ │ ├── BasicWorkspaceResource.java
│ │ │ ├── ResourceAndroidClassListener.java
│ │ │ ├── ResourceFileListener.java
│ │ │ ├── ResourceJvmClassListener.java
│ │ │ ├── RuntimeWorkspaceResource.java
│ │ │ ├── WorkspaceDirectoryResource.java
│ │ │ ├── WorkspaceDirectoryResourceBuilder.java
│ │ │ ├── WorkspaceFileResource.java
│ │ │ ├── WorkspaceFileResourceBuilder.java
│ │ │ ├── WorkspaceRemoteVmResource.java
│ │ │ ├── WorkspaceResource.java
│ │ │ └── WorkspaceResourceBuilder.java
│ │ └── resources/
│ │ ├── android/
│ │ │ ├── api-outline-30.jar
│ │ │ ├── attrs.json
│ │ │ └── res-map.txt
│ │ └── logback.xml
│ ├── test/
│ │ ├── java/
│ │ │ └── software/
│ │ │ └── coley/
│ │ │ └── recaf/
│ │ │ ├── BootstrapTest.java
│ │ │ ├── info/
│ │ │ │ ├── ClassInfoTest.java
│ │ │ │ ├── JvmClassInfoTest.java
│ │ │ │ ├── annotation/
│ │ │ │ │ ├── AnnotatedTest.java
│ │ │ │ │ ├── AnnotationInfoTest.java
│ │ │ │ │ └── TypeAnnotationInfoTest.java
│ │ │ │ └── member/
│ │ │ │ ├── FieldMemberTest.java
│ │ │ │ └── MethodMemberTest.java
│ │ │ ├── path/
│ │ │ │ └── PathNodeTest.java
│ │ │ ├── services/
│ │ │ │ ├── assembler/
│ │ │ │ │ └── ExpressionCompilerTest.java
│ │ │ │ ├── callgraph/
│ │ │ │ │ └── CallGraphTest.java
│ │ │ │ ├── comment/
│ │ │ │ │ └── CommentManagerTest.java
│ │ │ │ ├── compile/
│ │ │ │ │ └── JavacCompilerTest.java
│ │ │ │ ├── decompile/
│ │ │ │ │ ├── DecompileManagerTest.java
│ │ │ │ │ └── FallbackDecompilerTest.java
│ │ │ │ ├── deobfuscation/
│ │ │ │ │ ├── BaseDeobfuscationTest.java
│ │ │ │ │ ├── CycleRemovingTest.java
│ │ │ │ │ ├── EvaluatorTest.java
│ │ │ │ │ ├── FoldingDeobfuscationTest.java
│ │ │ │ │ ├── IllegalAttributeDeobfuscationTest.java
│ │ │ │ │ ├── MiscDeobfuscationTest.java
│ │ │ │ │ ├── RegressionDeobfuscationTest.java
│ │ │ │ │ ├── StaticValueInliningTest.java
│ │ │ │ │ └── TryCatchDeobfuscationTest.java
│ │ │ │ ├── inheritance/
│ │ │ │ │ ├── InheritanceAndRenamingTest.java
│ │ │ │ │ └── InheritanceGraphTest.java
│ │ │ │ ├── json/
│ │ │ │ │ └── GsonProviderTest.java
│ │ │ │ ├── mapping/
│ │ │ │ │ ├── MappingApplierTest.java
│ │ │ │ │ ├── aggregate/
│ │ │ │ │ │ ├── AggregateMappingManagerTest.java
│ │ │ │ │ │ └── AggregateMappingsTest.java
│ │ │ │ │ ├── format/
│ │ │ │ │ │ ├── MappingImplementationTest.java
│ │ │ │ │ │ └── MappingIntermediateTest.java
│ │ │ │ │ └── gen/
│ │ │ │ │ └── MappingGeneratorTest.java
│ │ │ │ ├── phantom/
│ │ │ │ │ └── PhantomGeneratorTest.java
│ │ │ │ ├── plugin/
│ │ │ │ │ └── PluginManagerTest.java
│ │ │ │ ├── script/
│ │ │ │ │ └── JavacScriptEngineTest.java
│ │ │ │ ├── search/
│ │ │ │ │ └── SearchServiceTest.java
│ │ │ │ ├── source/
│ │ │ │ │ └── AstServiceTest.java
│ │ │ │ ├── transform/
│ │ │ │ │ ├── TransformationApplierTest.java
│ │ │ │ │ └── TransformationManagerTest.java
│ │ │ │ └── workspace/
│ │ │ │ ├── io/
│ │ │ │ │ ├── InfoImporterTest.java
│ │ │ │ │ ├── ResourceImporterTest.java
│ │ │ │ │ └── WorkspaceExporterTest.java
│ │ │ │ └── patch/
│ │ │ │ └── PatchingTest.java
│ │ │ ├── util/
│ │ │ │ ├── AccessFlagTest.java
│ │ │ │ ├── AsmInsnUtilTest.java
│ │ │ │ ├── EscapeUtilTest.java
│ │ │ │ ├── NumberUtilTest.java
│ │ │ │ ├── StringDiffTest.java
│ │ │ │ ├── StringUtilTest.java
│ │ │ │ ├── TypesTest.java
│ │ │ │ └── android/
│ │ │ │ └── AndroidResConversion.java
│ │ │ └── workspace/
│ │ │ └── model/
│ │ │ └── WorkspaceModelTest.java
│ │ └── resources/
│ │ └── android/
│ │ ├── attrs.xml
│ │ └── attrs_manifest.xml
│ └── testFixtures/
│ ├── java/
│ │ └── software/
│ │ └── coley/
│ │ └── recaf/
│ │ └── test/
│ │ ├── TestBase.java
│ │ ├── TestClassUtils.java
│ │ ├── TestConfigSetup.java
│ │ └── dummy/
│ │ ├── AccessibleFields.java
│ │ ├── AccessibleMethods.java
│ │ ├── AccessibleMethodsChild.java
│ │ ├── AnnotationImpl.java
│ │ ├── AnonymousLambda.java
│ │ ├── ArrayTypeAnno.java
│ │ ├── ClassWithAnnotation.java
│ │ ├── ClassWithAnonymousInner.java
│ │ ├── ClassWithConstructor.java
│ │ ├── ClassWithEmbeddedInners.java
│ │ ├── ClassWithExceptions.java
│ │ ├── ClassWithFieldsAndMethods.java
│ │ ├── ClassWithInner.java
│ │ ├── ClassWithInnerAndMembers.java
│ │ ├── ClassWithInvisAnnotation.java
│ │ ├── ClassWithLambda.java
│ │ ├── ClassWithMethodReference.java
│ │ ├── ClassWithMultipleMethods.java
│ │ ├── ClassWithRequiredConstructor.java
│ │ ├── ClassWithStaticInit.java
│ │ ├── ClassWithToString.java
│ │ ├── DiamondA.java
│ │ ├── DiamondB.java
│ │ ├── DiamondC.java
│ │ ├── DummyEmptyMap.java
│ │ ├── DummyEnum.java
│ │ ├── DummyEnumPrinter.java
│ │ ├── DummyRecord.java
│ │ ├── HelloWorld.java
│ │ ├── Inheritance.java
│ │ ├── InvisAnnotationImpl.java
│ │ ├── MethodWithTypeAnno.java
│ │ ├── MultipleInterfacesClass.java
│ │ ├── OverlapCaller.java
│ │ ├── OverlapClassAB.java
│ │ ├── OverlapInterfaceA.java
│ │ ├── OverlapInterfaceB.java
│ │ ├── SealedCircle.java
│ │ ├── SealedOtherShape.java
│ │ ├── SealedShape.java
│ │ ├── SealedSquare.java
│ │ ├── StringConsumer.java
│ │ ├── StringConsumerUser.java
│ │ ├── StringList.java
│ │ ├── StringListUser.java
│ │ ├── StringSupplier.java
│ │ ├── TypeAnnotationImpl.java
│ │ ├── VariedModifierFields.java
│ │ └── VariedModifierMethods.java
│ └── resources/
│ ├── lorem-long-ascii.txt
│ ├── lorem-long-cn.txt
│ ├── lorem-long-ru.txt
│ ├── lorem-short-ascii.txt
│ ├── lorem-short-cn.txt
│ ├── lorem-short-ru.txt
│ └── name-prefix-suffix.jar
├── recaf-ui/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── software/
│ │ │ └── coley/
│ │ │ └── recaf/
│ │ │ ├── Main.java
│ │ │ ├── RecafApplication.java
│ │ │ ├── path/
│ │ │ │ ├── AssemblerPathData.java
│ │ │ │ └── AssemblerPathNode.java
│ │ │ ├── services/
│ │ │ │ ├── cell/
│ │ │ │ │ ├── CellConfigurationService.java
│ │ │ │ │ ├── CellConfigurationServiceConfig.java
│ │ │ │ │ ├── context/
│ │ │ │ │ │ ├── AbstractContextMenuProviderFactory.java
│ │ │ │ │ │ ├── AnnotationContextMenuAdapter.java
│ │ │ │ │ │ ├── AnnotationContextMenuProviderFactory.java
│ │ │ │ │ │ ├── AssemblerContextMenuAdapter.java
│ │ │ │ │ │ ├── AssemblerContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicAnnotationContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicAssemblerContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicBlacklistingContextSource.java
│ │ │ │ │ │ ├── BasicBundleContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicClassContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicContextSource.java
│ │ │ │ │ │ ├── BasicDirectoryContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicFieldContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicFileContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicInnerClassContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicMethodContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicPackageContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicResourceContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicWhitelistingContextSource.java
│ │ │ │ │ │ ├── BundleContextMenuAdapter.java
│ │ │ │ │ │ ├── BundleContextMenuProviderFactory.java
│ │ │ │ │ │ ├── ClassContextMenuAdapter.java
│ │ │ │ │ │ ├── ClassContextMenuProviderFactory.java
│ │ │ │ │ │ ├── ContextMenuAdapter.java
│ │ │ │ │ │ ├── ContextMenuProvider.java
│ │ │ │ │ │ ├── ContextMenuProviderFactory.java
│ │ │ │ │ │ ├── ContextMenuProviderService.java
│ │ │ │ │ │ ├── ContextMenuProviderServiceConfig.java
│ │ │ │ │ │ ├── ContextSource.java
│ │ │ │ │ │ ├── DirectoryContextMenuAdapter.java
│ │ │ │ │ │ ├── DirectoryContextMenuProviderFactory.java
│ │ │ │ │ │ ├── FieldContextMenuAdapter.java
│ │ │ │ │ │ ├── FieldContextMenuProviderFactory.java
│ │ │ │ │ │ ├── FileContextMenuAdapter.java
│ │ │ │ │ │ ├── FileContextMenuProviderFactory.java
│ │ │ │ │ │ ├── InnerClassContextMenuAdapter.java
│ │ │ │ │ │ ├── InnerClassContextMenuProviderFactory.java
│ │ │ │ │ │ ├── MethodContextMenuAdapter.java
│ │ │ │ │ │ ├── MethodContextMenuProviderFactory.java
│ │ │ │ │ │ ├── PackageContextMenuAdapter.java
│ │ │ │ │ │ ├── PackageContextMenuProviderFactory.java
│ │ │ │ │ │ ├── ResourceContextMenuAdapter.java
│ │ │ │ │ │ └── ResourceContextMenuProviderFactory.java
│ │ │ │ │ ├── icon/
│ │ │ │ │ │ ├── AnnotationIconProviderFactory.java
│ │ │ │ │ │ ├── BasicAnnotationIconProviderFactory.java
│ │ │ │ │ │ ├── BasicBundleIconProviderFactory.java
│ │ │ │ │ │ ├── BasicCatchIconProviderFactory.java
│ │ │ │ │ │ ├── BasicClassIconProviderFactory.java
│ │ │ │ │ │ ├── BasicDirectoryIconProviderFactory.java
│ │ │ │ │ │ ├── BasicFieldIconProviderFactory.java
│ │ │ │ │ │ ├── BasicFileIconProviderFactory.java
│ │ │ │ │ │ ├── BasicInnerClassIconProviderFactory.java
│ │ │ │ │ │ ├── BasicInstructionIconProviderFactory.java
│ │ │ │ │ │ ├── BasicMethodIconProviderFactory.java
│ │ │ │ │ │ ├── BasicPackageIconProviderFactory.java
│ │ │ │ │ │ ├── BasicResourceIconProviderFactory.java
│ │ │ │ │ │ ├── BasicThrowsProviderFactory.java
│ │ │ │ │ │ ├── BasicVariableIconProviderFactory.java
│ │ │ │ │ │ ├── BundleIconProviderFactory.java
│ │ │ │ │ │ ├── CatchIconProviderFactory.java
│ │ │ │ │ │ ├── ClassIconProviderFactory.java
│ │ │ │ │ │ ├── DirectoryIconProviderFactory.java
│ │ │ │ │ │ ├── FieldIconProviderFactory.java
│ │ │ │ │ │ ├── FileIconProviderFactory.java
│ │ │ │ │ │ ├── IconProvider.java
│ │ │ │ │ │ ├── IconProviderFactory.java
│ │ │ │ │ │ ├── IconProviderService.java
│ │ │ │ │ │ ├── IconProviderServiceConfig.java
│ │ │ │ │ │ ├── InnerClassIconProviderFactory.java
│ │ │ │ │ │ ├── InstructionIconProviderFactory.java
│ │ │ │ │ │ ├── MethodIconProviderFactory.java
│ │ │ │ │ │ ├── PackageIconProviderFactory.java
│ │ │ │ │ │ ├── ResourceIconProviderFactory.java
│ │ │ │ │ │ ├── ThrowsIconProviderFactory.java
│ │ │ │ │ │ └── VariableIconProviderFactory.java
│ │ │ │ │ └── text/
│ │ │ │ │ ├── TextProvider.java
│ │ │ │ │ ├── TextProviderFactory.java
│ │ │ │ │ ├── TextProviderService.java
│ │ │ │ │ └── TextProviderServiceConfig.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── ConfigComponentFactory.java
│ │ │ │ │ ├── ConfigComponentManager.java
│ │ │ │ │ ├── ConfigComponentManagerConfig.java
│ │ │ │ │ ├── ConfigIconManager.java
│ │ │ │ │ ├── ConfigIconManagerConfig.java
│ │ │ │ │ ├── KeyedConfigComponentFactory.java
│ │ │ │ │ ├── TypedConfigComponentFactory.java
│ │ │ │ │ └── factories/
│ │ │ │ │ ├── AndroidDecompilerComponentFactory.java
│ │ │ │ │ ├── BooleanComponentFactory.java
│ │ │ │ │ ├── EnumComponentFactory.java
│ │ │ │ │ ├── IntegerComponentFactory.java
│ │ │ │ │ ├── JvmDecompilerComponentFactory.java
│ │ │ │ │ ├── ProcyonLanguageComponentFactory.java
│ │ │ │ │ └── StringComponentFactory.java
│ │ │ │ ├── info/
│ │ │ │ │ ├── association/
│ │ │ │ │ │ ├── FileTypeSyntaxAssociationService.java
│ │ │ │ │ │ └── FileTypeSyntaxAssociationServiceConfig.java
│ │ │ │ │ └── summary/
│ │ │ │ │ ├── ResourceSummarizer.java
│ │ │ │ │ ├── ResourceSummaryService.java
│ │ │ │ │ ├── ResourceSummaryServiceConfig.java
│ │ │ │ │ ├── SummaryConsumer.java
│ │ │ │ │ └── builtin/
│ │ │ │ │ ├── AntiDecompilationSummarizer.java
│ │ │ │ │ ├── EntryPointSummarizer.java
│ │ │ │ │ ├── HashSummarizer.java
│ │ │ │ │ └── JarSigningSummarizer.java
│ │ │ │ ├── mapping/
│ │ │ │ │ └── MappingHelper.java
│ │ │ │ ├── navigation/
│ │ │ │ │ ├── Actions.java
│ │ │ │ │ ├── ActionsConfig.java
│ │ │ │ │ ├── ClassNavigable.java
│ │ │ │ │ ├── FileNavigable.java
│ │ │ │ │ ├── Navigable.java
│ │ │ │ │ ├── NavigableAddListener.java
│ │ │ │ │ ├── NavigableRemoveListener.java
│ │ │ │ │ ├── NavigationManager.java
│ │ │ │ │ ├── NavigationManagerConfig.java
│ │ │ │ │ ├── UnsupportedContentException.java
│ │ │ │ │ └── UpdatableNavigable.java
│ │ │ │ ├── translation/
│ │ │ │ │ └── LangConfig.java
│ │ │ │ ├── tutorial/
│ │ │ │ │ ├── TutorialWorkspaceBuilder.java
│ │ │ │ │ └── content/
│ │ │ │ │ ├── Chapter1.java
│ │ │ │ │ ├── Chapter2.java
│ │ │ │ │ ├── Chapter3.java
│ │ │ │ │ ├── Chapter4.java
│ │ │ │ │ ├── Chapter5.java
│ │ │ │ │ ├── Chapter6.java
│ │ │ │ │ └── Chapter7.java
│ │ │ │ └── window/
│ │ │ │ ├── WindowFactory.java
│ │ │ │ ├── WindowFactoryConfig.java
│ │ │ │ ├── WindowManager.java
│ │ │ │ ├── WindowManagerConfig.java
│ │ │ │ ├── WindowStyling.java
│ │ │ │ └── WindowStylingConfig.java
│ │ │ ├── ui/
│ │ │ │ ├── LanguageStylesheets.java
│ │ │ │ ├── RecafTheme.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── Binding.java
│ │ │ │ │ ├── BindingCreator.java
│ │ │ │ │ ├── ClassEditingConfig.java
│ │ │ │ │ ├── ExportConfig.java
│ │ │ │ │ ├── KeybindingConfig.java
│ │ │ │ │ ├── MemberDisplayFormatConfig.java
│ │ │ │ │ ├── RecentFilesConfig.java
│ │ │ │ │ ├── WindowScaleConfig.java
│ │ │ │ │ └── WorkspaceExplorerConfig.java
│ │ │ │ ├── contextmenu/
│ │ │ │ │ ├── AnnotationMenuBuilder.java
│ │ │ │ │ ├── BundleMenuBuilder.java
│ │ │ │ │ ├── ContextMenuBuilder.java
│ │ │ │ │ ├── DirectoryMenuBuilder.java
│ │ │ │ │ ├── InfoMenuBuilder.java
│ │ │ │ │ ├── ItemSink.java
│ │ │ │ │ ├── MemberMenuBuilder.java
│ │ │ │ │ ├── MenuBuilder.java
│ │ │ │ │ ├── MenuHandler.java
│ │ │ │ │ ├── ResourceMenuBuilder.java
│ │ │ │ │ ├── WorkspaceMenuBuilder.java
│ │ │ │ │ └── actions/
│ │ │ │ │ ├── AnnotationAction.java
│ │ │ │ │ ├── BundleAction.java
│ │ │ │ │ ├── DirectoryAction.java
│ │ │ │ │ ├── InfoAction.java
│ │ │ │ │ ├── MemberAction.java
│ │ │ │ │ ├── ResourceAction.java
│ │ │ │ │ └── WorkspaceAction.java
│ │ │ │ ├── control/
│ │ │ │ │ ├── AbstractSearchBar.java
│ │ │ │ │ ├── ActionButton.java
│ │ │ │ │ ├── ActionMenu.java
│ │ │ │ │ ├── ActionMenuItem.java
│ │ │ │ │ ├── AutoScrollPane.java
│ │ │ │ │ ├── BoundBiDiComboBox.java
│ │ │ │ │ ├── BoundCheckBox.java
│ │ │ │ │ ├── BoundComboBox.java
│ │ │ │ │ ├── BoundHyperlink.java
│ │ │ │ │ ├── BoundIntSpinner.java
│ │ │ │ │ ├── BoundLabel.java
│ │ │ │ │ ├── BoundMultiToggleIcon.java
│ │ │ │ │ ├── BoundTab.java
│ │ │ │ │ ├── BoundTextField.java
│ │ │ │ │ ├── BoundToggleIcon.java
│ │ │ │ │ ├── ClosableActionMenuItem.java
│ │ │ │ │ ├── DynamicNumericTextField.java
│ │ │ │ │ ├── FontIconView.java
│ │ │ │ │ ├── GraphicActionButton.java
│ │ │ │ │ ├── IconView.java
│ │ │ │ │ ├── ImageCanvas.java
│ │ │ │ │ ├── ModalPaneComponent.java
│ │ │ │ │ ├── ObservableCheckBox.java
│ │ │ │ │ ├── ObservableComboBox.java
│ │ │ │ │ ├── ObservableSpinner.java
│ │ │ │ │ ├── PannableView.java
│ │ │ │ │ ├── PathNodeTree.java
│ │ │ │ │ ├── ReorderableListCell.java
│ │ │ │ │ ├── ResizableCanvas.java
│ │ │ │ │ ├── SubLabeled.java
│ │ │ │ │ ├── Tooltipable.java
│ │ │ │ │ ├── VirtualizedScrollPaneWrapper.java
│ │ │ │ │ ├── graph/
│ │ │ │ │ │ ├── MethodCallGraphPane.java
│ │ │ │ │ │ └── MethodCallGraphsPane.java
│ │ │ │ │ ├── popup/
│ │ │ │ │ │ ├── AddMemberPopup.java
│ │ │ │ │ │ ├── ChangeClassVersionPopup.java
│ │ │ │ │ │ ├── ClassSelectionPopup.java
│ │ │ │ │ │ ├── DecompileAllPopup.java
│ │ │ │ │ │ ├── ItemListSelectionPopup.java
│ │ │ │ │ │ ├── ItemTreeSelectionPopup.java
│ │ │ │ │ │ ├── NamePopup.java
│ │ │ │ │ │ ├── OpenUrlPopup.java
│ │ │ │ │ │ ├── OverrideMethodPopup.java
│ │ │ │ │ │ └── SelectionPopup.java
│ │ │ │ │ ├── richtext/
│ │ │ │ │ │ ├── AbstractLineItemTracking.java
│ │ │ │ │ │ ├── Editor.java
│ │ │ │ │ │ ├── EditorComponent.java
│ │ │ │ │ │ ├── SafeCodeArea.java
│ │ │ │ │ │ ├── ScrollbarPaddingUtil.java
│ │ │ │ │ │ ├── bracket/
│ │ │ │ │ │ │ ├── BracketMatchGraphicFactory.java
│ │ │ │ │ │ │ └── SelectedBracketTracking.java
│ │ │ │ │ │ ├── inheritance/
│ │ │ │ │ │ │ ├── Inheritance.java
│ │ │ │ │ │ │ ├── InheritanceGutterGraphicFactory.java
│ │ │ │ │ │ │ ├── InheritanceInvalidationListener.java
│ │ │ │ │ │ │ └── InheritanceTracking.java
│ │ │ │ │ │ ├── linegraphics/
│ │ │ │ │ │ │ ├── AbstractLineGraphicFactory.java
│ │ │ │ │ │ │ ├── AbstractTextBoundLineGraphicFactory.java
│ │ │ │ │ │ │ ├── LineContainer.java
│ │ │ │ │ │ │ ├── LineGraphicFactory.java
│ │ │ │ │ │ │ ├── LineNumberFactory.java
│ │ │ │ │ │ │ └── RootLineGraphicFactory.java
│ │ │ │ │ │ ├── problem/
│ │ │ │ │ │ │ ├── Problem.java
│ │ │ │ │ │ │ ├── ProblemGutterGraphicFactory.java
│ │ │ │ │ │ │ ├── ProblemInvalidationListener.java
│ │ │ │ │ │ │ ├── ProblemLevel.java
│ │ │ │ │ │ │ ├── ProblemPhase.java
│ │ │ │ │ │ │ ├── ProblemSquiggleGraphicFactory.java
│ │ │ │ │ │ │ └── ProblemTracking.java
│ │ │ │ │ │ ├── search/
│ │ │ │ │ │ │ └── SearchBar.java
│ │ │ │ │ │ ├── source/
│ │ │ │ │ │ │ ├── JavaContextActionManager.java
│ │ │ │ │ │ │ └── JavaContextActionSupport.java
│ │ │ │ │ │ ├── suggest/
│ │ │ │ │ │ │ ├── AssemblerTabCompleter.java
│ │ │ │ │ │ │ ├── CompletionPopup.java
│ │ │ │ │ │ │ ├── CompletionPopupFocuser.java
│ │ │ │ │ │ │ ├── CompletionPopupUpdater.java
│ │ │ │ │ │ │ ├── CompletionValueGraphicMapper.java
│ │ │ │ │ │ │ ├── CompletionValueTextifier.java
│ │ │ │ │ │ │ ├── ExistingWordTabCompleter.java
│ │ │ │ │ │ │ ├── TabCompleter.java
│ │ │ │ │ │ │ └── TabCompletionConfig.java
│ │ │ │ │ │ └── syntax/
│ │ │ │ │ │ ├── AbstractSyntaxHighlighter.java
│ │ │ │ │ │ ├── RegexLanguages.java
│ │ │ │ │ │ ├── RegexRule.java
│ │ │ │ │ │ ├── RegexSyntaxHighlighter.java
│ │ │ │ │ │ ├── StyleResult.java
│ │ │ │ │ │ ├── SyntaxHighlighter.java
│ │ │ │ │ │ └── SyntaxUtil.java
│ │ │ │ │ └── tree/
│ │ │ │ │ ├── FilterableTreeItem.java
│ │ │ │ │ ├── TreeFiltering.java
│ │ │ │ │ ├── TreeItems.java
│ │ │ │ │ ├── WorkspaceRootTreeNode.java
│ │ │ │ │ ├── WorkspaceTree.java
│ │ │ │ │ ├── WorkspaceTreeCell.java
│ │ │ │ │ ├── WorkspaceTreeFilterPane.java
│ │ │ │ │ └── WorkspaceTreeNode.java
│ │ │ │ ├── dnd/
│ │ │ │ │ ├── DragAndDrop.java
│ │ │ │ │ ├── FileDropListener.java
│ │ │ │ │ └── WorkspaceLoadingDropListener.java
│ │ │ │ ├── docking/
│ │ │ │ │ ├── DockingManager.java
│ │ │ │ │ └── EmbeddedBento.java
│ │ │ │ ├── media/
│ │ │ │ │ ├── CombinedPlayer.java
│ │ │ │ │ ├── FxPlayer.java
│ │ │ │ │ ├── MediaHacker.java
│ │ │ │ │ ├── Player.java
│ │ │ │ │ ├── SpectrumEvent.java
│ │ │ │ │ └── SpectrumListener.java
│ │ │ │ ├── menubar/
│ │ │ │ │ ├── AnalysisMenu.java
│ │ │ │ │ ├── ConfigMenu.java
│ │ │ │ │ ├── FileMenu.java
│ │ │ │ │ ├── HelpMenu.java
│ │ │ │ │ ├── MainMenu.java
│ │ │ │ │ ├── MainMenuProvider.java
│ │ │ │ │ ├── MappingMenu.java
│ │ │ │ │ ├── ScriptMenu.java
│ │ │ │ │ ├── SearchMenu.java
│ │ │ │ │ └── WorkspaceAwareMenu.java
│ │ │ │ ├── pane/
│ │ │ │ │ ├── CommentEditPane.java
│ │ │ │ │ ├── CommentListPane.java
│ │ │ │ │ ├── ConfigPane.java
│ │ │ │ │ ├── DocumentationPane.java
│ │ │ │ │ ├── LoggingPane.java
│ │ │ │ │ ├── MappingApplicationPane.java
│ │ │ │ │ ├── MappingGeneratorPane.java
│ │ │ │ │ ├── MappingProgressPane.java
│ │ │ │ │ ├── RemoteVirtualMachinesPane.java
│ │ │ │ │ ├── ScriptManagerPane.java
│ │ │ │ │ ├── SystemInformationPane.java
│ │ │ │ │ ├── WelcomePane.java
│ │ │ │ │ ├── WorkspaceBuilderPane.java
│ │ │ │ │ ├── WorkspaceExplorerPane.java
│ │ │ │ │ ├── WorkspaceInformationPane.java
│ │ │ │ │ ├── editing/
│ │ │ │ │ │ ├── AbstractClassInfoProvider.java
│ │ │ │ │ │ ├── AbstractContentPane.java
│ │ │ │ │ │ ├── AbstractDecompilePane.java
│ │ │ │ │ │ ├── AbstractDecompilerPaneConfigurator.java
│ │ │ │ │ │ ├── ClassPane.java
│ │ │ │ │ │ ├── DecompileFailureButton.java
│ │ │ │ │ │ ├── FileDisplayMode.java
│ │ │ │ │ │ ├── FilePane.java
│ │ │ │ │ │ ├── ProblemOverlay.java
│ │ │ │ │ │ ├── SideTabsInjector.java
│ │ │ │ │ │ ├── ToolsContainerComponent.java
│ │ │ │ │ │ ├── android/
│ │ │ │ │ │ │ ├── AndroidClassEditorType.java
│ │ │ │ │ │ │ ├── AndroidClassInfoProvider.java
│ │ │ │ │ │ │ ├── AndroidClassPane.java
│ │ │ │ │ │ │ ├── AndroidDecompilerPane.java
│ │ │ │ │ │ │ └── AndroidDecompilerPaneConfigurator.java
│ │ │ │ │ │ ├── assembler/
│ │ │ │ │ │ │ ├── AssemblerAstConsumer.java
│ │ │ │ │ │ │ ├── AssemblerBuildConsumer.java
│ │ │ │ │ │ │ ├── AssemblerContextActionSupport.java
│ │ │ │ │ │ │ ├── AssemblerPane.java
│ │ │ │ │ │ │ ├── AssemblerToolTabs.java
│ │ │ │ │ │ │ ├── AstBuildConsumerComponent.java
│ │ │ │ │ │ │ ├── AstPhase.java
│ │ │ │ │ │ │ ├── AstUsages.java
│ │ │ │ │ │ │ ├── ContextualAssemblerComponent.java
│ │ │ │ │ │ │ ├── ControlFlowLines.java
│ │ │ │ │ │ │ ├── ControlFlowLinesConfig.java
│ │ │ │ │ │ │ ├── JvmAssemblerBuildConsumer.java
│ │ │ │ │ │ │ ├── JvmExpressionCompilerPane.java
│ │ │ │ │ │ │ ├── JvmStackAnalysisPane.java
│ │ │ │ │ │ │ ├── JvmVariablesPane.java
│ │ │ │ │ │ │ ├── LabelData.java
│ │ │ │ │ │ │ ├── SnippetsPane.java
│ │ │ │ │ │ │ ├── TypeTableCell.java
│ │ │ │ │ │ │ ├── ValueTableCell.java
│ │ │ │ │ │ │ ├── VariableData.java
│ │ │ │ │ │ │ └── resolve/
│ │ │ │ │ │ │ ├── AssemblyResolution.java
│ │ │ │ │ │ │ ├── AssemblyResolver.java
│ │ │ │ │ │ │ ├── ClassAnnotationResolution.java
│ │ │ │ │ │ │ ├── ClassExtends.java
│ │ │ │ │ │ │ ├── ClassImplements.java
│ │ │ │ │ │ │ ├── EmptyResolution.java
│ │ │ │ │ │ │ ├── FieldAnnotationResolution.java
│ │ │ │ │ │ │ ├── FieldResolution.java
│ │ │ │ │ │ │ ├── IndependentAnnotationResolution.java
│ │ │ │ │ │ │ ├── InnerClassResolution.java
│ │ │ │ │ │ │ ├── InstructionResolution.java
│ │ │ │ │ │ │ ├── LabelDeclarationResolution.java
│ │ │ │ │ │ │ ├── LabelReferenceResolution.java
│ │ │ │ │ │ │ ├── MethodAnnotationResolution.java
│ │ │ │ │ │ │ ├── MethodResolution.java
│ │ │ │ │ │ │ ├── TypeReferenceResolution.java
│ │ │ │ │ │ │ └── VariableDeclarationResolution.java
│ │ │ │ │ │ ├── binary/
│ │ │ │ │ │ │ ├── DecodingXmlPane.java
│ │ │ │ │ │ │ ├── ElfPane.java
│ │ │ │ │ │ │ ├── PePane.java
│ │ │ │ │ │ │ └── hex/
│ │ │ │ │ │ │ ├── HexAdapter.java
│ │ │ │ │ │ │ ├── HexConfig.java
│ │ │ │ │ │ │ ├── HexEditor.java
│ │ │ │ │ │ │ ├── HexUtil.java
│ │ │ │ │ │ │ ├── cell/
│ │ │ │ │ │ │ │ ├── EditableAsciiCell.java
│ │ │ │ │ │ │ │ ├── EditableHexCell.java
│ │ │ │ │ │ │ │ ├── HexCell.java
│ │ │ │ │ │ │ │ ├── HexCellBase.java
│ │ │ │ │ │ │ │ ├── HexRow.java
│ │ │ │ │ │ │ │ └── HexRowHeader.java
│ │ │ │ │ │ │ └── ops/
│ │ │ │ │ │ │ ├── HexAccess.java
│ │ │ │ │ │ │ ├── HexNavigation.java
│ │ │ │ │ │ │ └── HexOperations.java
│ │ │ │ │ │ ├── jvm/
│ │ │ │ │ │ │ ├── DecompilerPaneConfig.java
│ │ │ │ │ │ │ ├── JvmClassEditorType.java
│ │ │ │ │ │ │ ├── JvmClassInfoProvider.java
│ │ │ │ │ │ │ ├── JvmClassPane.java
│ │ │ │ │ │ │ ├── JvmDecompilerPane.java
│ │ │ │ │ │ │ ├── JvmDecompilerPaneConfigurator.java
│ │ │ │ │ │ │ └── lowlevel/
│ │ │ │ │ │ │ ├── ClassElement.java
│ │ │ │ │ │ │ ├── ClassItem.java
│ │ │ │ │ │ │ ├── JvmLowLevelPane.java
│ │ │ │ │ │ │ └── LazyClassElement.java
│ │ │ │ │ │ ├── media/
│ │ │ │ │ │ │ ├── AudioPane.java
│ │ │ │ │ │ │ ├── ImagePane.java
│ │ │ │ │ │ │ ├── MediaPane.java
│ │ │ │ │ │ │ └── VideoPane.java
│ │ │ │ │ │ ├── tabs/
│ │ │ │ │ │ │ ├── FieldsAndMethodsPane.java
│ │ │ │ │ │ │ ├── InheritancePane.java
│ │ │ │ │ │ │ └── KotlinMetadataPane.java
│ │ │ │ │ │ └── text/
│ │ │ │ │ │ └── TextPane.java
│ │ │ │ │ └── search/
│ │ │ │ │ ├── AbstractMemberSearchPane.java
│ │ │ │ │ ├── AbstractSearchPane.java
│ │ │ │ │ ├── ClassReferenceSearchPane.java
│ │ │ │ │ ├── InstructionSearchPane.java
│ │ │ │ │ ├── MemberDeclarationSearchPane.java
│ │ │ │ │ ├── MemberReferenceSearchPane.java
│ │ │ │ │ ├── NumberSearchPane.java
│ │ │ │ │ ├── SearchContextSource.java
│ │ │ │ │ └── StringSearchPane.java
│ │ │ │ ├── window/
│ │ │ │ │ ├── AbstractIdentifiableStage.java
│ │ │ │ │ ├── ConfigWindow.java
│ │ │ │ │ ├── DeobfuscationWindow.java
│ │ │ │ │ ├── IdentifiableStage.java
│ │ │ │ │ ├── MappingApplicationWindow.java
│ │ │ │ │ ├── MappingGeneratorWindow.java
│ │ │ │ │ ├── MappingProgressWindow.java
│ │ │ │ │ ├── QuickNavWindow.java
│ │ │ │ │ ├── RecafScene.java
│ │ │ │ │ ├── RecafStage.java
│ │ │ │ │ ├── RemoteVirtualMachinesWindow.java
│ │ │ │ │ ├── ScriptManagerWindow.java
│ │ │ │ │ └── SystemInformationWindow.java
│ │ │ │ └── wizard/
│ │ │ │ ├── Wizard.java
│ │ │ │ └── WizardStage.java
│ │ │ ├── util/
│ │ │ │ ├── Animations.java
│ │ │ │ ├── ClipboardUtil.java
│ │ │ │ ├── Colors.java
│ │ │ │ ├── DirectoryChooserBuilder.java
│ │ │ │ ├── Effects.java
│ │ │ │ ├── ErrorDialogs.java
│ │ │ │ ├── FileChooserBuilder.java
│ │ │ │ ├── FileChooserBundle.java
│ │ │ │ ├── FxThreadUtil.java
│ │ │ │ ├── Icons.java
│ │ │ │ ├── IntRange.java
│ │ │ │ ├── JFXValidation.java
│ │ │ │ ├── Lang.java
│ │ │ │ ├── Menus.java
│ │ │ │ ├── NodeEvents.java
│ │ │ │ ├── RecafURLStreamHandlerProvider.java
│ │ │ │ ├── SVG.java
│ │ │ │ ├── SceneUtils.java
│ │ │ │ ├── SynchronizedSimpleStringProperty.java
│ │ │ │ ├── SynchronizedStringBinding.java
│ │ │ │ ├── TextDisplayUtil.java
│ │ │ │ ├── ToStringConverter.java
│ │ │ │ └── Translatable.java
│ │ │ └── workspace/
│ │ │ ├── PathExportingManager.java
│ │ │ ├── PathLoadingManager.java
│ │ │ └── WorkspacePreLoadListener.java
│ │ └── resources/
│ │ ├── icons/
│ │ │ └── Jetbrains-LICENSE.txt
│ │ ├── style/
│ │ │ ├── code-editor.css
│ │ │ ├── docking.css
│ │ │ ├── hex.css
│ │ │ ├── recaf.css
│ │ │ └── tweaks.css
│ │ ├── syntax/
│ │ │ ├── enigma.css
│ │ │ ├── enigma.json
│ │ │ ├── jasm.css
│ │ │ ├── jasm.json
│ │ │ ├── java.css
│ │ │ ├── java.json
│ │ │ ├── json.css
│ │ │ ├── json.json
│ │ │ ├── xml.css
│ │ │ └── xml.json
│ │ └── translations/
│ │ ├── cs_CZ.lang
│ │ ├── de_DE.lang
│ │ ├── en_US.lang
│ │ ├── ja_JP.lang
│ │ ├── pl_PL.lang
│ │ ├── ru_RU.lang
│ │ ├── sv_SE.lang
│ │ └── zh_CN.lang
│ └── test/
│ └── java/
│ └── software/
│ └── coley/
│ └── recaf/
│ ├── services/
│ │ └── script/
│ │ └── ScriptManagerTest.java
│ └── ui/
│ ├── BaseFxTest.java
│ └── control/
│ ├── richtext/
│ │ ├── bracket/
│ │ │ └── SelectedBracketTrackingTest.java
│ │ ├── problem/
│ │ │ └── ProblemTrackingTest.java
│ │ └── syntax/
│ │ └── RegexSyntaxHighlighterTest.java
│ └── tree/
│ └── WorkspaceTreeNodeTest.java
├── settings.gradle
└── setup/
├── code-style-eclipsej.xml
└── code-style-intellij.xml
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
# Auto detect text files and perform LF normalization
* text=auto
# Java sources
*.java text diff=java eol=lf
*.gradle text diff=java eol=lf
# These files are text and should be normalized (Convert crlf => lf)
*.css text diff=css eol=lf
*.html text diff=html eol=lf
*.md text diff=markdown eol=lf
*.js text eol=lf
*.csv text eol=lf
*.json text eol=lf
*.properties text eol=lf
*.svg text eol=lf
*.xml text eol=lf
*.yaml text eol=lf
*.yml text eol=lf
*.toml text eol=lf
*.lang text eol=lf
# These files are binary and should be left untouched
*.png binary
*.gif binary
*.jpg binary
*.jpeg binary
# Common build-tool wrapper scripts
mvnw text eol=lf
gradlew text eol=lf
*.sh text eol=lf
*.bat text eol=crlf
*.cmd text eol=crlf
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to notify developers of unintended behavior
---
**Describe the bug**
> A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Open sample '...' _(provide sample download if possible)_
2. Navigate to '....'
3. Do something '....'
4. See error
**Exception**
If applicable, add the exception/stacktrace.
```
stacktrace goes here
```
**Screenshots**
If applicable, add screenshots to help explain your problem.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest a feature to improve Recaf
---
## Feature_Name
Description of the feature
================================================
FILE: .github/ISSUE_TEMPLATE/other.md
================================================
---
name: Other
about: If it isn't a bug or a feature request, choose this
---
================================================
FILE: .github/workflows/build.yml
================================================
name: CI/CD
on:
push:
branches:
- master
pull_request:
branches:
- master
workflow_dispatch:
inputs:
is-a-release:
description: Publish release? (Only works on master, and for untagged versions)
type: boolean
permissions:
contents: write
jobs:
test:
name: Run test suite
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest ]
java-version: [ 22 ]
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup JDK
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 22
check-latest: true
# The project version extract NEEDS to have the gradle wrapper already downloaded.
# So we have a dummy step here just to initialize it.
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
# Run the tests and upload results/coverage
- name: Run tests
run: ./gradlew test
- name: Upload test coverage to CodeCov.io
uses: codecov/codecov-action@v3
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
- name: Upload test artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: test-artifacts
retention-days: 21
path: |
**/TEST-*
**/hs_err_pid*
# Build the distribution jar and upload it, without bundling JavaFX in the jar
- name: Create distribution jar
run: ./gradlew assemble -x compileTestJava -Dskip_jfx_bundle=true
- name: Upload distribution jar
if: always()
uses: actions/upload-artifact@v4
with:
name: snapshot-build
retention-days: 30
path: |
recaf-ui/build/libs/recaf-ui-*-all.jar
# Publishes the test results from prior task work
publish-test-results:
name: Publish tests results
needs: test
if: always()
runs-on: ubuntu-latest
permissions:
checks: write
pull-requests: write
steps:
- name: Download artifacts
uses: actions/download-artifact@v4
with:
name: test-artifacts
- name: Publish test results
uses: EnricoMi/publish-unit-test-result-action@v2
with:
check_name: Unit test results
files: |
**/*.xml
# Builds the projects and attempts to publish a release if the current project version
# does not match any existing tags in the repository.
build-and-release:
name: Publish release
needs: test
if: inputs.is-a-release && github.repository == 'Col-E/Recaf' && github.ref == 'refs/heads/master'
strategy:
fail-fast: false
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0 # Required depth for JReleaser
- name: Setup Java JDK
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 22
# The project version extract NEEDS to have the gradle wrapper already downloaded.
# So we have a dummy step here just to initialize it.
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
# Set environment variable for the project version: "var_to_set=$(command_to_run)" >> sink
# - For maven: echo "PROJECT_VERSION=$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV
# - For gradle: echo "PROJECT_VERSION=$(./gradlew properties | grep -Po '(?<=version: ).*')" >> $GITHUB_ENV
- name: Extract project version to environment variable
run: echo "PROJECT_VERSION=$(./gradlew properties | grep -Po '(?<=version\W ).*')" >> $GITHUB_ENV
# Check if a tag exists that matches the current project version.
# Write the existence state to the step output 'tagExists'.
- name: Check the package version has corresponding Git tag
id: tagged
shell: bash
run: |
git show-ref --tags --verify --quiet -- "refs/tags/${{ env.PROJECT_VERSION }}" && echo "tagExists=1" >> $GITHUB_OUTPUT || echo "tagExists=0" >> $GITHUB_OUTPUT
git show-ref --tags --verify --quiet -- "refs/tags/${{ env.PROJECT_VERSION }}" && echo "Tag for current version exists" || echo "Tag for current version does not exist"
# If the tag could not be fetched, show a message and abort the job.
# The wonky if logic is a workaround for: https://github.com/actions/runner/issues/1173
- name: Abort if tag exists, or existence check fails
if: ${{ false && steps.tagged.outputs.tagExists }}
run: |
echo "Output of 'tagged' step: ${{ steps.tagged.outputs.tagExists }}"
echo "Failed to check if tag exists."
echo "PROJECT_VERSION: ${{ env.PROJECT_VERSION }}"
echo "Tags $(git tag | wc -l):"
git tag
git show-ref --tags --verify -- "refs/tags/${{ env.PROJECT_VERSION }}"
exit 1
# Run build to generate the release artifacts.
# Tag does not exist AND trigger was manual. Deploy release artifacts!
- name: Build release artifacts
run: ./gradlew publish # TODO: Publish all modules' artifacts into a single directory
# Make release with JReleaser, only running when the project version does not exist as a tag on the repository.
- name: Publish release
uses: jreleaser/release-action@v2
with:
arguments: full-release
env:
JRELEASER_PROJECT_VERSION: ${{ env.PROJECT_VERSION }}
JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
JRELEASER_GPG_PASSPHRASE: ${{ secrets.JRELEASER_GPG_PASSPHRASE }}
JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.JRELEASER_GPG_PUBLIC_KEY }}
JRELEASER_GPG_SECRET_KEY: ${{ secrets.JRELEASER_GPG_SECRET_KEY }}
JRELEASER_MAVENCENTRAL_USERNAME: ${{ secrets.JRELEASER_MAVENCENTRAL_USERNAME }}
JRELEASER_MAVENCENTRAL_TOKEN: ${{ secrets.JRELEASER_MAVENCENTRAL_TOKEN }}
# Upload JRelease debug log
- name: JReleaser output
uses: actions/upload-artifact@v4
if: always()
with:
name: jreleaser-release
path: |
out/jreleaser/trace.log
out/jreleaser/output.properties
================================================
FILE: .gitignore
================================================
# IntelliJ
out/
.idea/
.idea_modules/
*.iws
*.iml
# Eclipse
.settings/
.classpath
.checkstyle
.project
# Gradle
target/
build/
generated/
gradle-app.setting
.gradle
.gradletasknamecache
!gradle-wrapper.jar
**/build/
# Misc
hs_err_pid*
*.log
*.ctxt
temp/
# IntelliJ
lib/
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Recaf
The following is a series of guidelines for contributing to Recaf. They're not _"rules"_ per say, rather they're more like goals to strive towards. Regardless of how closely you adhere to the following guidelines I really appreciate you taking the time to contribute, it means a lot :+1:
**Table of Contents**
- [What if I am not a programmer?](#what-if-i-am-not-a-programmer)
- [What should I know before I get started?](#what-should-i-know-before-getting-started)
- [Is there a todo list?](#is-there-a-to-do-list)
- [Reporting Bugs](#reporting-bugs)
- [Suggesting Features](#suggesting-features)
- [Coding Guidelines](#coding-guidelines)
- [Pull Requests](#pull-requests)
**TLDR?**
- Follow the code style.
- Document and comment your code.
- Make sure the tests pass after making changes.
- Translations and feature ideas are appreciated too.
**Questions?**
You can DM `invokecoley` on discord, or join the [Recaf discord](https://discord.gg/Bya5HaA).
## What if I am not a programmer?
[There is plenty to contribute that isn't based in code.](https://www.youtube.com/watch?v=GAqfMNB-YBU&t=603)
For example, you can contribute ideas, add translations, or write documentation:
- [Documentation source](https://github.com/Col-E/recaf-site)
- [Documentation site](https://recaf.coley.software/)
## What should I know before getting started?
It depends on what changes you are making. For instance, changing the user-interface requires very minimal or no reverse-engineering prior knowledge. If you do need JVM reversal knowledge to work on a feature you can check the [primer guide](PRIMER.md) which points to several good resources and outlines key details. For a general understanding of how Recaf works and how to begin creating contributions you can read our [getting started](https://recaf.coley.software/dev/getting-started.html) page as well.
## Is there a to-do list?
Unfortunately the to-do list is scattered around a few places. We're working on eventually consolidating everything into one place.
## Reporting Bugs
When creating an issue select the `Bug report` button.
This will provide a template that you can fill in the details for your bug.
Please include as much information as possible.
This can include:
- Clear and descriptive title
- Log files
- Steps to reproduce the bug
- An explanation of what you _\*expected\*_ to happen
- The file being analyzed _(Do not share anything you do not own the rights to)_
## Suggesting Features
When creating an issue select the `Feature request` button.
This will provide a template that you can fill in the details for your feature idea.
Be as descriptive as possible with your idea.
**Note**: Not all ideas may be within Recaf's scope. In these cases the feature should be implemented as a script or plugin.
## Coding Guidelines
**Style**: IDE code formatting rules can be found in the [`/setup` directory](setup/).
**Commits**: Try and keep commits small and focused on one thing at a time.
## Pull Requests
When creating a pull request please consider the following when filling in the template:
- Clear and descriptive title
- A clear description of what changes are included in the pull
Github's PR system will validate that your changes compile and pass the unit tests as well.
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2017-2025 Matthew Coley
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.
================================================
FILE: PRIMER.md
================================================
# What should I know before getting started?
## JVM / Class file format
### General concepts
A basic understanding of the JVM / class file format is _highly_ reccomended before contributing.
Here are some articles that should bring you up to speed:
- [JVM Architecture 101: Get to Know Your Virtual Machine](https://blog.overops.com/jvm-architecture-101-get-to-know-your-virtual-machine/)
- [JVM Internals](https://blog.jamesdbloom.com/JVMInternals.html)
- [Java Code To Byte Code](https://blog.jamesdbloom.com/JavaCodeToByteCode_PartOne.html)
### Terminology
**Qualified name**: Package separators using the `.` character.
These are names used by runtime functions like `Class.forName(name)`.
For example:
- `java.lang.String`
- `com.example.MyClass.InnerClass`
**Internal name**: Package separators using the `/` character.
Inner classes specified with the `$` character.
These are names how classes are specified internally in the class file.
For example:
- `java/lang/String`
- `com/example/MyClass$InnerClass`
Primitives *(Not the boxed types)* use single characters:
| Primitive | Internal |
|-----------|----------|
| `long` | `J` |
| `int` | `I` |
| `short` | `S` |
| `byte` | `B` |
| `boolean` | `Z` |
| `float` | `F` |
| `double` | `D` |
| `void` | `V` |
**Descriptor**: Used to describe field and method types.
These are essentially the same as internal names, but class names are wrapped in a prefix (`L`) and suffix character (`;`).
For example:
* `Ljava/lang/String;`
* `I` _(primitives stay the same)_
Method descriptors are formatted like so:
* `double method(int i, String s)` = `(ILjava/lang/String;)D`
* `void method()` = `()V`
Arrays are prefixed with a `[` for each level of the array.
* `int[]` = `[I`
* `String[][]` = `[[Ljava/lang/String;`
### Quirks
**Wide types**: `double` and `long` typed variables take up two slots _(On the stack and in the local variable table)_.
For example, declaring two doubles in a static method will use slots 0, then 2.
Slots 0-3 are all in-use.
**Lambdas**: The content of a lambda is defined in compiler-generated hidden methods and are invoked with `INVOKEDYNAMIC`.
Decompilers will in-line the code so that it looks more similar to the source representation.
================================================
FILE: PULL_REQUEST_TEMPLATE.md
================================================
## What's new
* Summary of additions
## What's fixed
* Summary of bugs fixed
================================================
FILE: README.md
================================================
# Recaf [](https://discord.gg/Bya5HaA) [](https://codecov.io/gh/Col-E/Recaf)  [](CONTRIBUTING.md)

An easy to use modern Java bytecode editor that abstracts away the complexities of Java programs.
## Download
- [Launcher](https://github.com/Col-E/Recaf-Launcher)
- Usage & instructions found on the launcher repo
- [Snapshot releases](https://github.com/Col-E/Recaf-Launcher/blob/master/MANUAL.md)
- See [CI actions](https://github.com/Col-E/Recaf/actions/workflows/build.yml) for release artifacts
- [Independent releases](https://github.com/Col-E/Recaf/releases) _(None for 4X currently)_
## Features
- Edit Java bytecode with ease from a high or low level _(minus the annoying parts)_
- Editor features within Recaf abstract away complex details of compiled Java applications like:
- The constant pool
- Stack frame calculation
- Using wide instructions when needed
- And more!
- Easy to use navigable interface with context-sensitive actions
- Support for standard Java _and_ Android applications
- Multiple decompilers to switch between, with all of their parameters made fully configurable
- Built in compiler to allow recompiling decompiled classes, even if some referenced classes are missing *(When supported, support may vary depending on code complexity and obfuscation)*
- A bytecode assembler with a simple syntax, and supporting tooling
- See the state of local variables and stack values at any point in methods
- Access variables by names instead of indices for clearer disassembled code
- Convert snippets of Java source code to bytecode sequences automatically
- Searching for a variety of different content: Strings/numeric constants, classes and member references, instruction patterns
- Tools for deobfuscating obfuscated code
- Specially crafted class files with the intent of crashing reverse engineering tools are automatically patched when opened in Recaf
- Specially crafted jar/zip files are read as the JVM does, bypassing sneaky tricks that can trick reverse engineering tools into showing the wrong data
- Support for automatically renaming obfuscated classes and their members
- Support for manually renaming classes and their members *_(And exporting these mappings to a variety of mapping formats for use in other tools)_*
- Bytecode transformers for simplifying common obfuscation strategies
- Attach to running Java process with instrumentation capabilities
- And much more
A complete list of features can be found in the [user documentation](https://recaf.coley.software/user/index.html).
## Scripting & Plugins
Recaf exposes almost all of its functionality through modular API's. Automating behaviors can be done easily with scripts, or with plugins for more complex situations. Additional features can also be added via plugins, which can register hooks in API's that offer them.
To create your own script or plugin, see the [developer documentation](https://recaf.coley.software/dev/index.html), specifically the _"plugins & scripts"_ section.
## Command Line
Recaf can run as a command line application, which can be especially useful when paired with scripts provided at startup. You can see all the current launch arguments by passing `--help` as an application argument.
## Development Setup
Clone the repository via `git clone https://github.com/Col-E/Recaf.git`
Open the project in an IDE or generate the build with gradle.
**IDE**:
1. Import the project from the `build.gradle` file
2. Create a run configuration with the main class `software.coley.recaf.Main`
**Without IDE**:
1. Run `gradlew build`
- Output will be located at: `recaf-ui/build/libs/recaf-ui-{VERSION}-all.jar`
================================================
FILE: build.gradle
================================================
plugins {
alias(libs.plugins.benmanes.versions) apply false
alias(libs.plugins.coverage.report.aggregator)
alias(libs.plugins.checker.processor) apply false
}
allprojects {
group = 'software.coley'
version = '4.0.0-SNAPSHOT'
}
subprojects {
apply plugin: 'java'
apply plugin: 'jacoco'
apply plugin: 'maven-publish'
apply plugin: 'com.github.ben-manes.versions'
repositories {
mavenLocal()
mavenCentral()
google()
maven {
url = 'https://jitpack.io'
name = 'JitPack'
}
}
// ======================= DEPENDENCIES ========================
dependencies {
// Enforce jakarta annotations everywhere as the standard for Nullable/Nonnull
implementation(libs.jakarta.annotation)
// Local libraries for internal use only
// (none of the types from these libraries should be part of a public API)
implementation fileTree(dir: "$rootProject.projectDir/libs", include: ['*.jar'])
}
configurations.configureEach {
// Annoying annotations that replace desired tab completions.
exclude group: 'org.checkerframework'
// Other annotations we don't use which are transitive deps of deps
exclude group: 'com.google.code.findbugs'
exclude group: 'com.google.errorprone'
exclude group: 'com.google.j2objc'
exclude group: 'org.jetbrains', module: 'annotations'
// Used by ANTLR runtime, has a lot of IL8N related files which we don't use.
// Removing this dependency doesn't inhibit the behavior of libraries using the
// runtime in practice though.
exclude group: 'com.ibm.icu'
}
// ========================== COMPILE ==========================
// https://docs.gradle.org/current/userguide/toolchains.html
// gradlew -q javaToolchains - see the list of detected toolchains.
java {
toolchain {
languageVersion = JavaLanguageVersion.of(System.getenv('TARGET_VERSION') ?: '22')
}
}
// Append options for unchecked/deprecation
tasks.withType(JavaCompile).configureEach {
options.compilerArgs << '-Xlint:unchecked' << '-Xlint:deprecation' << '-g' << '-parameters'
options.encoding = 'UTF-8'
options.incremental = true
}
// Enable automatic generation of null checks on annotated methods
afterEvaluate { Project p ->
p.plugins.apply('gov.tak.gradle.plugins.checker-processor')
}
// ========================== TESTING ==========================
// All modules should have the same test framework setup.
test {
useJUnitPlatform()
// Required for Mockito in newer JDK's which disable useful features by default for 'integrity' reasons.
jvmArgs '-XX:+EnableDynamicAgentLoading'
systemProperty 'junit.jupiter.execution.parallel.enabled', true
systemProperty 'junit.jupiter.execution.parallel.mode.default', 'concurrent'
testLogging {
showStandardStreams = true
events "passed", "skipped", "failed"
}
}
// All modules with Java components should share the same test dependencies.
plugins.withType(JavaPlugin).configureEach {
dependencies {
testImplementation(libs.junit.api)
testImplementation(libs.junit.params)
testImplementation(libs.mockito)
testImplementation(libs.assertj)
testRuntimeOnly(libs.junit.engine)
testRuntimeOnly(libs.junit.launcher)
}
}
// Need to tell any test-fixture-plugin to include dependencies
// in its own configuration. Otherwise it can get confused.
plugins.withType(JavaTestFixturesPlugin).configureEach {
dependencies {
testFixturesApi(libs.junit.api)
testFixturesApi(libs.junit.params)
testFixturesApi(libs.mockito)
}
}
// Configure report outputs, and jacoco packages to target.
tasks.withType(Test).configureEach {
reports.html.required = false
reports.junitXml.required = true
// We want to cover all recaf classes, but not the test classes themselves (or auto-gen classes).
// The exclusion list is applied after the inclusion list, so this ends up working out.
jacoco {
includes = ['software/coley/recaf/**']
excludes = ['software/coley/recaf/**Test**', 'software/coley/recaf/test/**', '**/**WeldClientProxy']
}
}
// Setup artifact publishing to maven local
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
repositories {
mavenLocal()
}
}
}
// Always emit HTML & XML aggregate reports
jacocoAggregation {
outputHtml = true
outputXml = true
}
// Build aggregate report for test coverage when subproject 'test' tasks complete.
// But only do so when the 'test' tasks have executed.
// You can skip tests by specifying '-x test' in your gradle task arguments.
tasks.register('test') {
dependsOn(subprojects.test)
doLast {
if (subprojects.test.stream().anyMatch(Task::getDidWork))
buildJacocoAggregate.execute()
}
}
tasks.register('build') {
// Build will run tests, unless skipped by '-x test'.
// Even if skipped, this will still lead to the subproject build tasks being executed, such as:
// - recaf-ui:shadowJar
dependsOn(tasks.named('test'))
}
================================================
FILE: codecov.yml
================================================
coverage:
precision: 2
round: down
status:
project:
default:
informational: true
patch:
default:
informational: true
ignore:
- "**/src/test/"
- "**/src/testFixtures"
================================================
FILE: docs/README.md
================================================
# Github pages directory
Github pages requires this directory be named `docs`.
If you were looking for documentation go here:
- [User documentation](https://recaf.coley.software/user/index.html)
- [Developer documentation](https://recaf.coley.software/dev/index.html)
================================================
FILE: docs/index.html
================================================
<html lang="en">
<head>
<title>Recaf - The modern bytecode editor</title>
<meta charset="UTF-8">
<meta name="description" content="Recaf - The modern bytecode editor">
<meta name="keywords" content="Recaf, Java, Bytecode, Modern, Editor, Decompiler, Decompilation, Compiler, Deobfuscation, Deobfuscator">
<meta http-equiv="Refresh" content="0; url='https://recaf.coley.software/'"/>
<style>
html {
background: rgb(33, 33, 34);
color: rgb(210, 212, 214);
font-family: Arial, Helvetica, sans-serif;
}
.block {
margin: auto;
width: 270;
background: rgb(40, 40, 42);
padding: 30px;
}
</style>
<script type="text/javascript">
window.location.href = "https://recaf.coley.software/"
</script>
</head>
<body>
<div class="block">
<h1>Redirecting to <code>recaf.coley.software</code></h1>
</div>
</body>
</html>
================================================
FILE: gradle/libs.versions.toml
================================================
[versions]
acc-agent = "1.0.4"
assertj = "3.27.3"
asm = "9.9"
atlantafx = "2.1.0"
binary-resources = "31.3.0-alpha01.8"
cafedude = "2.6.5"
cdi-api = "4.1.0"
cdi-impl = "6.0.2.Final"
cfr = "0.152"
dex-translator = "1.1.1"
diffutils = "4.16"
docking = "0.15.1"
downgrader = "1.3.3"
extra-collections = "1.7.0"
extra-observables = "1.3.0"
gson = "2.13.1"
ikonli = "12.4.0"
image-io-ext = { strictly = "3.0.2" } # newer release breaks ico plugin
image-io-ext-ico = "3.0.2"
instrument-server = "1.5.0"
jackson = "2.18.2"
jakarta-annotation = "3.0.0"
jasm = "aacebfa8b0"
jelf = "0.10.0"
jlinker = "1.0.7" # We could update, but I don't feel like rewriting the callgraph
jphantom = "1.4.4"
junit = "5.13.4"
junit-launch = "1.13.4"
jsvg = "2.0.0"
lljzip = "2.8.1"
logback-classic = { strictly = "1.4.11" } # newer releases break in jar releases
mapping-io = "0.7.0"
mockito = "5.19.0"
natural-order = "1.1"
picocli = "4.7.7"
pe = "2.2.3"
procyon = "0.6.0"
reactfx = { strictly = "2.0-M5" } # won't get updates, dead
regex = "0.1.19"
# richtextfx = "0.11.3"
richtextfx = "cbdcbd1440"
treemapfx = "1.1.0"
vineflower = "1.11.2"
sourcesolver = "1.1.9"
# Plugins
benmanes-versions = "0.52.0"
coverage-report-aggregator = "1.3.2"
checker-processor = "2.0.4"
javafx-plugin = "0.1.0"
shadow = "9.1.0"
peterabeles-gversion = "1.10.3"
[libraries]
acc-agent = { module = "software.coley:javafx-access-agent", version.ref = "acc-agent" }
assertj = { module = "org.assertj:assertj-core", version.ref = "assertj" }
asm-core = { module = "org.ow2.asm:asm", version.ref = "asm" }
asm-analysis = { module = "org.ow2.asm:asm-analysis", version.ref = "asm" }
asm-commons = { module = "org.ow2.asm:asm-commons", version.ref = "asm" }
asm-tree = { module = "org.ow2.asm:asm-tree", version.ref = "asm" }
asm-util = { module = "org.ow2.asm:asm-util", version.ref = "asm" }
atlantafx = { module = "io.github.mkpaz:atlantafx-base", version.ref = "atlantafx" }
# Use our fork of Android's release with fixes and less transitive dependencies
binary-resources = { module = "com.github.Col-E:binary-resources", version.ref = "binary-resources" }
cafedude = { module = "software.coley:cafedude-core", version.ref = "cafedude" }
cdi-api = { module = "jakarta.enterprise:jakarta.enterprise.cdi-api", version.ref = "cdi-api" }
cdi-impl = { module = "org.jboss.weld.se:weld-se-core", version.ref = "cdi-impl" }
cfr = { module = "org.benf:cfr", version.ref = "cfr" }
dex-translator = { module = "software.coley:dex-translator", version.ref = "dex-translator" }
diffutils = { module = "io.github.java-diff-utils:java-diff-utils", version.ref = "diffutils" }
docking = { module = "software.coley:bento-fx", version.ref = "docking" }
downgrader-core = { module = "xyz.wagyourtail.jvmdowngrader:jvmdowngrader", version.ref = "downgrader" }
downgrader-impls = { module = "xyz.wagyourtail.jvmdowngrader:jvmdowngrader-java-api", version.ref = "downgrader" }
extra-collections = { module = "software.coley:extra-collections", version.ref = "extra-collections" }
extra-observables = { module = "software.coley:extra-observables", version.ref = "extra-observables" }
gson = { module = "com.google.code.gson:gson", version.ref = "gson" }
ikonli-javafx = { module = "org.kordamp.ikonli:ikonli-javafx", version.ref = "ikonli" }
ikonli-pack = { module = "org.kordamp.ikonli:ikonli-carbonicons-pack", version.ref = "ikonli" }
image-io-ext = { module = "com.twelvemonkeys.imageio:imageio-core", version.ref = "image-io-ext" }
image-io-ext-ico = { module = "com.twelvemonkeys.imageio:imageio-ico", version.ref = "image-io-ext-ico" }
instrument-server = { module = "software.coley:instrumentation-server", version.ref = "instrument-server" }
jackson = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-xml", version.ref = "jackson" }
jakarta-annotation = { module = "jakarta.annotation:jakarta.annotation-api", version.ref = "jakarta-annotation" }
jasm-composistion-jvm = { module = "com.github.jumanji144.Jasm:jasm-composition-jvm", version.ref = "jasm" }
jasm-core = { module = "com.github.jumanji144.Jasm:jasm-core", version.ref = "jasm" }
jelf = { module = "net.fornwall:jelf", version.ref = "jelf" }
jlinker = { module = "com.github.xxDark:jlinker", version.ref = "jlinker" }
jphantom = { module = "com.github.Col-E:jphantom", version.ref = "jphantom" }
junit-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junit" }
junit-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit" }
junit-params = { module = "org.junit.jupiter:junit-jupiter-params", version.ref = "junit" }
junit-launcher = { module = "org.junit.platform:junit-platform-launcher", version.ref = "junit-launch" }
jsvg = { module = "com.github.weisj:jsvg", version.ref = "jsvg" }
lljzip = { module = "software.coley:lljzip", version.ref = "lljzip" }
logback-classic = { module = "ch.qos.logback:logback-classic", version.ref = "logback-classic" }
mapping-io = { module = "net.fabricmc:mapping-io", version.ref = "mapping-io" }
mockito = { module = "org.mockito:mockito-core", version.ref = "mockito" }
natural-order = { module = "net.grey-panther:natural-comparator", version.ref = "natural-order" }
picocli = { module = "info.picocli:picocli", version.ref = "picocli" }
pe = { module = "com.github.cademtz:JavaPeParser", version.ref = "pe" }
procyon = { module = "org.bitbucket.mstrobel:procyon-compilertools", version.ref = "procyon" }
reactfx = { module = "org.reactfx:reactfx", version.ref = "reactfx" }
regex = { module = "com.github.tommyettinger:regexodus", version.ref = "regex" }
# richtextfx = { module = "org.fxmisc.richtext:richtextfx", version.ref = "richtextfx" }
richtextfx = { module = "com.github.Col-E:RichTextFX", version.ref = "richtextfx" }
treemapfx = { module = "software.coley:treemap-fx", version.ref = "treemapfx" }
vineflower = { module = "org.vineflower:vineflower", version.ref = "vineflower" }
sourcesolver = { module = "software.coley:source-solver", version.ref = "sourcesolver" }
[bundles]
asm = [
"asm-core",
"asm-analysis",
"asm-commons",
"asm-tree",
"asm-util",
]
jasm = [
"jasm-core",
"jasm-composistion-jvm",
]
downgrader = [
"downgrader-core",
"downgrader-impls"
]
cdi = [
"cdi-api",
"cdi-impl",
]
logging = [
"logback-classic"
]
ikonli = [
"ikonli-javafx",
"ikonli-pack"
]
image-io = [
"image-io-ext",
"image-io-ext-ico"
]
[plugins]
benmanes-versions = { id = "com.github.ben-manes.versions", version.ref = "benmanes-versions" }
coverage-report-aggregator = { id = "gov.tak.gradle.plugins.coverage-report-aggregator", version.ref = "coverage-report-aggregator" }
checker-processor = { id = "gov.tak.gradle.plugins.checker-processor", version.ref = "checker-processor" }
javafx = { id = "org.openjfx.javafxplugin", version.ref = "javafx-plugin" }
shadow = { id = "com.gradleup.shadow", version.ref = "shadow" }
peterabeles-gversion = { id = "com.peterabeles.gversion", version.ref = "peterabeles-gversion" }
================================================
FILE: gradle/tasks.gradle
================================================
import java.nio.file.Files
import java.nio.file.StandardCopyOption
// Copies all project dependencies (including transitive) to the local Maven repository.
// This is useful for offline development, or when IntelliJ fails to resolve sources automatically.
// Yes, this is AI slop, but it works. Good lord, I could not bring myself to write this by hand.
tasks.register('cacheToMavenLocal') {
description = 'Copies all project dependencies (including transitive) to the local Maven repository'
group = 'dependencies'
doLast {
def processedComponents = new HashSet()
def allComponentIds = new HashSet()
def allComponents = []
def componentRepositories = [:] // Map component to repository URL
// Build a list of repository URLs from the project's configured repositories
def repositoryUrls = []
project.repositories.each { repo ->
if (repo.hasProperty('url') && repo.name != 'MavenLocal') {
def repoUrl = repo.url.toString()
if (!repoUrl.endsWith('/')) {
repoUrl += '/'
}
repositoryUrls.add([name: repo.name, url: repoUrl])
println "Found repository: ${repo.name} -> ${repoUrl}"
}
}
// First pass: collect all component IDs and determine their origin repositories
configurations.each { configuration ->
if (configuration.canBeResolved) {
try {
configuration.incoming.resolutionResult.allComponents.each { component ->
if (component.moduleVersion) {
allComponentIds.add(component.id)
allComponents.add(component)
def moduleVersion = component.moduleVersion
def componentKey = "${moduleVersion.group}:${moduleVersion.name}:${moduleVersion.version}".toString()
// Try to determine repository by checking which one has the artifact
if (!componentRepositories.containsKey(componentKey)) {
def group = moduleVersion.group
def name = moduleVersion.name
def version = moduleVersion.version
def groupPath = group.replace('.', '/')
def pomFileName = "${name}-${version}.pom"
// First check local Maven repository - if it's there, we can skip remote checks
def localMavenRepo = new File(System.getProperty('user.home'), '.m2/repository')
def localArtifactDir = new File(localMavenRepo, "${groupPath}/${name}/${version}")
def localPomFile = new File(localArtifactDir, pomFileName)
if (localPomFile.exists()) {
processedComponents.add(componentKey)
componentRepositories.put(componentKey, [name: 'MavenLocal', url: null])
println "Detected ${componentKey} from MavenLocal (will skip)"
return
} else {
localArtifactDir.mkdirs()
}
// Check each repository to see which one has this artifact
for (repo in repositoryUrls) {
def repoUrl = repo.url
def pomUrl = "${repoUrl}${groupPath}/${name}/${version}/${pomFileName}"
try {
def url = new URL(pomUrl)
def connection = (HttpURLConnection) url.openConnection()
connection.setRequestMethod("GET")
connection.setConnectTimeout(2000)
connection.setReadTimeout(2000)
connection.setInstanceFollowRedirects(true)
def responseCode = connection.getResponseCode()
if (responseCode == 200 || responseCode == 301 || responseCode == 302) {
componentRepositories.put(componentKey, repo)
println "Detected ${componentKey} from repository: ${repoUrl}"
// Save the pom file
if (!localPomFile.exists() || localPomFile.length() != connection.getContentLengthLong()) {
println "Copying POM for ${componentKey} to local Maven repository"
localPomFile.withOutputStream { out ->
out << connection.getInputStream()
}
} else {
println "Skipping POM for ${componentKey} - already exists"
}
break
}
} catch (Exception ignored) {
// This repository doesn't have it, try next one
}
}
// If we couldn't determine the repo, default to the first one (usually Maven Central)
if (!componentRepositories.containsKey(componentKey) && !repositoryUrls.isEmpty()) {
println "Could not detect repository for ${componentKey}"
}
} else {
println "Already detected repository for ${componentKey}, skipping detection"
}
}
}
} catch (Exception e) {
println "Could not resolve configuration ${configuration.name}: ${e.message}"
}
}
}
println "Found ${allComponentIds.size()} unique components to process"
// Second pass: process all artifacts
configurations.each { configuration ->
if (configuration.canBeResolved) {
try {
// Use resolvedConfiguration to get all dependencies including transitive ones
configuration.resolvedConfiguration.resolvedArtifacts.each { artifact ->
def id = artifact.moduleVersion.id
def componentKey = "${id.group}:${id.name}:${id.version}".toString()
// Skip if we've already processed this component
if (!processedComponents.add(componentKey))
return
def group = id.group
def name = id.name
def version = id.version
// Define the local Maven repository path
def localMavenRepo = new File(System.getProperty('user.home'), '.m2/repository')
def groupPath = group.replace('.', '/')
def artifactDir = new File(localMavenRepo, "${groupPath}/${name}/${version}")
// Create directory structure
artifactDir.mkdirs()
// Copy the main artifact
def artifactFile = artifact.file
def fileName = artifactFile.name
def targetFile = new File(artifactDir, fileName)
if (!targetFile.exists() || targetFile.length() != artifactFile.length()) {
println "Copying ${group}:${name}:${version} (${fileName}) to local Maven repository"
Files.copy(
artifactFile.toPath(),
targetFile.toPath(),
StandardCopyOption.REPLACE_EXISTING
)
} else {
println "Skipping ${group}:${name}:${version} (${fileName}) - already exists"
}
}
} catch (Exception e) {
println "Could not resolve configuration ${configuration.name}: ${e.message}"
}
}
}
// Third pass: batch download sources and javadoc for all components
println "\nResolving sources and javadoc..."
def resolvedSources = new HashSet()
try {
def sourcesQuery = dependencies.createArtifactResolutionQuery()
.forComponents(allComponentIds)
.withArtifacts(JvmLibrary, SourcesArtifact)
.execute()
sourcesQuery.resolvedComponents.each { componentResult ->
def id = componentResult.id
// Extract module info - handle different ComponentIdentifier types
def moduleId = null
if (id.hasProperty('moduleIdentifier')) {
moduleId = id.moduleIdentifier
} else if (id.hasProperty('module')) {
moduleId = id.module
}
if (moduleId) {
def group = moduleId.group
def name = moduleId.name
def version = id.hasProperty('version') ? id.version : ''
def localMavenRepo = new File(System.getProperty('user.home'), '.m2/repository')
def groupPath = group.replace('.', '/')
def artifactDir = new File(localMavenRepo, "${groupPath}/${name}/${version}")
artifactDir.mkdirs()
def sourceArtifacts = componentResult.getArtifacts(SourcesArtifact)
sourceArtifacts.each { artifactResult ->
if (artifactResult instanceof ResolvedArtifactResult) {
def componentKey = "${group}:${name}:${version}".toString()
resolvedSources.add(componentKey)
def sourceFile = artifactResult.file
def sourceFileName = "${name}-${version}-sources.jar"
def targetFile = new File(artifactDir, sourceFileName)
if (!targetFile.exists() || targetFile.length() != sourceFile.length()) {
println "Copying ${group}:${name}:${version} sources to local Maven repository"
Files.copy(
sourceFile.toPath(),
targetFile.toPath(),
StandardCopyOption.REPLACE_EXISTING
)
} else {
println "Skipping ${group}:${name}:${version} sources - already exists"
}
}
}
}
}
} catch (Exception ex) {
println "Exception while resolving sources: ${ex.message}"
}
// Fallback: Try to download sources from the detected repository for components that weren't resolved
println "\nAttempting direct download for unresolved sources..."
allComponents.each { component ->
def moduleVersion = component.moduleVersion
if (moduleVersion) {
def group = moduleVersion.group
def name = moduleVersion.name
def version = moduleVersion.version
def componentKey = "${group}:${name}:${version}".toString()
if (!resolvedSources.contains(componentKey)) {
def localMavenRepo = new File(System.getProperty('user.home'), '.m2/repository')
def groupPath = group.replace('.', '/')
def artifactDir = new File(localMavenRepo, "${groupPath}/${name}/${version}")
artifactDir.mkdirs()
def sourceFileName = "${name}-${version}-sources.jar"
def targetFile = new File(artifactDir, sourceFileName)
if (!targetFile.exists()) {
// Get the repository this component came from
def repo = componentRepositories.get(componentKey)
if (repo) {
def repoUrl = repo.url
def artifactUrl = "${repoUrl}${groupPath}/${name}/${version}/${sourceFileName}"
try {
println "Attempting to download ${componentKey} sources from ${repoUrl}..."
def url = new URL(artifactUrl)
def connection = (HttpURLConnection) url.openConnection()
connection.setRequestMethod("GET")
connection.setConnectTimeout(5000)
connection.setReadTimeout(30000)
connection.setInstanceFollowRedirects(true)
def responseCode = connection.getResponseCode()
if (responseCode == 200) {
targetFile.withOutputStream { out ->
out << connection.getInputStream()
}
println "Downloaded ${componentKey} sources from ${repoUrl}"
resolvedSources.add(componentKey)
} else if (responseCode == 301 || responseCode == 302) {
// Handle redirects
def newUrl = connection.getHeaderField("Location")
println "Redirected to ${newUrl}"
def redirectConnection = (HttpURLConnection) new URL(newUrl).openConnection()
redirectConnection.setRequestMethod("GET")
redirectConnection.setConnectTimeout(5000)
redirectConnection.setReadTimeout(30000)
if (redirectConnection.getResponseCode() == 200) {
targetFile.withOutputStream { out ->
out << redirectConnection.getInputStream()
}
println "Downloaded ${componentKey} sources from ${repo.name} (after redirect)"
resolvedSources.add(componentKey)
} else {
println "Sources not available for ${componentKey} at ${repo.name} (HTTP ${redirectConnection.getResponseCode()})"
}
} else {
println "Sources not available for ${componentKey} at ${repo.name} (HTTP ${responseCode})"
}
} catch (Exception e) {
println "Could not download sources for ${componentKey} from ${repo.name}: ${e.message}"
}
} else {
println "Could not determine repository for ${componentKey}, skipping sources download"
}
} else {
println "Skipping ${componentKey} sources - already exists"
resolvedSources.add(componentKey)
}
}
}
}
def resolvedJavadoc = new HashSet()
try {
def javadocQuery = dependencies.createArtifactResolutionQuery()
.forComponents(allComponentIds)
.withArtifacts(JvmLibrary, JavadocArtifact)
.execute()
javadocQuery.resolvedComponents.each { componentResult ->
def id = componentResult.id
// Extract module info - handle different ComponentIdentifier types
def moduleId = null
if (id.hasProperty('moduleIdentifier')) {
moduleId = id.moduleIdentifier
} else if (id.hasProperty('module')) {
moduleId = id.module
}
if (moduleId) {
def group = moduleId.group
def name = moduleId.name
def version = id.hasProperty('version') ? id.version : ''
def localMavenRepo = new File(System.getProperty('user.home'), '.m2/repository')
def groupPath = group.replace('.', '/')
def artifactDir = new File(localMavenRepo, "${groupPath}/${name}/${version}")
artifactDir.mkdirs()
def javadocArtifacts = componentResult.getArtifacts(JavadocArtifact)
javadocArtifacts.each { artifactResult ->
if (artifactResult instanceof ResolvedArtifactResult) {
def componentKey = "${group}:${name}:${version}".toString()
resolvedJavadoc.add(componentKey)
def javadocFile = artifactResult.file
def javadocFileName = "${name}-${version}-javadoc.jar"
def targetFile = new File(artifactDir, javadocFileName)
if (!targetFile.exists() || targetFile.length() != javadocFile.length()) {
println "Copying ${group}:${name}:${version} javadoc to local Maven repository"
Files.copy(
javadocFile.toPath(),
targetFile.toPath(),
StandardCopyOption.REPLACE_EXISTING
)
} else {
println "Skipping ${group}:${name}:${version} javadoc - already exists"
}
}
}
}
}
} catch (Exception ex) {
println "Exception while resolving javadoc: ${ex.message}"
}
// Fallback: Try to download javadoc from the detected repository for components that weren't resolved
println "\nAttempting direct download for unresolved javadoc..."
allComponents.each { component ->
def moduleVersion = component.moduleVersion
if (moduleVersion) {
def group = moduleVersion.group
def name = moduleVersion.name
def version = moduleVersion.version
def componentKey = "${group}:${name}:${version}".toString()
if (!resolvedJavadoc.contains(componentKey)) {
def localMavenRepo = new File(System.getProperty('user.home'), '.m2/repository')
def groupPath = group.replace('.', '/')
def artifactDir = new File(localMavenRepo, "${groupPath}/${name}/${version}")
artifactDir.mkdirs()
def javadocFileName = "${name}-${version}-javadoc.jar"
def targetFile = new File(artifactDir, javadocFileName)
if (!targetFile.exists()) {
// Get the repository this component came from
def repo = componentRepositories.get(componentKey)
if (repo) {
def repoUrl = repo.url
def artifactUrl = "${repoUrl}${groupPath}/${name}/${version}/${javadocFileName}"
try {
println "Attempting to download ${componentKey} javadoc from ${repo.name}..."
def url = new URL(artifactUrl)
def connection = (HttpURLConnection) url.openConnection()
connection.setRequestMethod("GET")
connection.setConnectTimeout(5000)
connection.setReadTimeout(30000)
connection.setInstanceFollowRedirects(true)
def responseCode = connection.getResponseCode()
if (responseCode == 200) {
targetFile.withOutputStream { out ->
out << connection.getInputStream()
}
println "Downloaded ${componentKey} javadoc from ${repo.name}"
resolvedJavadoc.add(componentKey)
} else if (responseCode == 301 || responseCode == 302) {
// Handle redirects
def newUrl = connection.getHeaderField("Location")
println "Redirected to ${newUrl}"
def redirectConnection = (HttpURLConnection) new URL(newUrl).openConnection()
redirectConnection.setRequestMethod("GET")
redirectConnection.setConnectTimeout(5000)
redirectConnection.setReadTimeout(30000)
if (redirectConnection.getResponseCode() == 200) {
targetFile.withOutputStream { out ->
out << redirectConnection.getInputStream()
}
println "Downloaded ${componentKey} javadoc from ${repo.name} (after redirect)"
resolvedJavadoc.add(componentKey)
} else {
println "Javadoc not available for ${componentKey} at ${repo.name} (HTTP ${redirectConnection.getResponseCode()})"
}
} else {
println "Javadoc not available for ${componentKey} at ${repo.name} (HTTP ${responseCode})"
}
} catch (Exception e) {
println "Could not download javadoc for ${componentKey} from ${repo.name}: ${e.message}"
}
} else {
println "Could not determine repository for ${componentKey}, skipping javadoc download"
}
} else {
println "Skipping ${componentKey} javadoc - already exists"
resolvedJavadoc.add(componentKey)
}
}
}
}
println "\nAll dependencies (including transitive) and sources have been copied to the local Maven repository"
println "Total unique components processed: ${processedComponents.size()}"
println "Sources resolved: ${resolvedSources.size()}"
println "Javadoc resolved: ${resolvedJavadoc.size()}"
}
}
================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
================================================
FILE: gradle.properties
================================================
org.gradle.caching=true
================================================
FILE: gradlew
================================================
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"
================================================
FILE: gradlew.bat
================================================
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
================================================
FILE: jitpack.yml
================================================
jdk:
- openjdk22
before_install:
- sdk install java 22.0.1-zulu
- sdk use java 22.0.1-zulu
================================================
FILE: libs/README.md
================================================
# Provided libraries
In some circumstances, libraries are not hosted on standard Maven hosts.
## Kotlin Metadata
Generally provided in a much larger dependency, this is just the portion pertaining to reading Kotlin Metadata.
This minified dependency was provided by `SuperCoder79`
================================================
FILE: recaf-core/build.gradle
================================================
import java.nio.file.Files
plugins {
alias(libs.plugins.peterabeles.gversion)
}
apply plugin: 'java-library'
apply plugin: 'java-test-fixtures'
dependencies {
api(libs.bundles.asm)
api(libs.binary.resources)
api(libs.cafedude)
api(libs.bundles.cdi)
api(libs.cfr)
api(libs.dex.translator) {
exclude group: 'com.android.tools'
}
api(libs.diffutils)
api(libs.bundles.downgrader) {
exclude group: 'org.ow2.asm'
}
api(libs.extra.collections)
api(libs.extra.observables)
api(libs.gson) // required by R8 (from dex-translator)
api(libs.instrument.server)
api(libs.jelf)
api(libs.jphantom)
api(libs.lljzip)
api(libs.bundles.logging)
api(libs.mapping.io)
api(libs.natural.order)
api(libs.pe)
api(libs.picocli)
api(libs.procyon)
api(libs.jlinker)
api(libs.regex)
api(libs.bundles.jasm)
api(libs.vineflower)
api(libs.sourcesolver)
// We use Jackson as a test dependency so that we can convert Android API XML models into JSON.
// This way, we only need to include GSON in the final Recaf build.
testImplementation(libs.jackson)
}
// Force generation of gversion data class when the version information is not up-to-date
tasks.register('conditionalBuildConfigUpdate') {
if (!isBuildConfigUpToDate()) {
finalizedBy createVersionFile
}
}
project.compileJava.dependsOn('conditionalBuildConfigUpdate')
gversion {
srcDir = "src/generated/java/"
classPackage = "software.coley.recaf"
className = "RecafBuildConfig"
dateFormat = "yyyy MM/dd HH:mm"
debug = true
language = "java"
explicitType = false
annotate = false
}
sourceSets {
// Need to add the generated class to the source set
main {
java {
srcDirs 'src/generated/java', 'src/main/java'
}
}
}
clean {
// Delete the generated gversion class when cleaning
delete 'src/generated'
}
private boolean isBuildConfigUpToDate() {
File buildConfigPath = project.file(gversion.srcDir +
gversion.classPackage.replace('.', '/') + '/' +
gversion.className + ".java")
if (buildConfigPath.exists()) {
String text = Files.readString(buildConfigPath.toPath())
if (text.contains('VERSION = "' + project.version + '"'))
return true
}
return false
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/Bootstrap.java
================================================
package software.coley.recaf;
import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import jakarta.enterprise.inject.se.SeContainer;
import org.jboss.weld.environment.se.Weld;
import org.slf4j.Logger;
import software.coley.recaf.analytics.logging.Logging;
import software.coley.recaf.cdi.EagerInitializationExtension;
import java.util.function.Consumer;
import static software.coley.recaf.RecafBuildConfig.*;
/**
* Handles creation of Recaf instance.
*
* @author Matt Coley
*/
public class Bootstrap {
private static final Logger logger = Logging.get(Bootstrap.class);
private static Recaf instance;
private static Consumer<Weld> weldConsumer;
/**
* @return Recaf instance.
*/
@Nonnull
public static Recaf get() {
if (instance == null) {
String fmt = """
Initializing Recaf {}
- Build rev: {}
- Build date: {}
- Build hash: {}""";
logger.info(fmt, VERSION, GIT_REVISION, GIT_DATE, GIT_SHA);
long then = System.currentTimeMillis();
// Create the Recaf container
try {
SeContainer container = createContainer();
instance = new Recaf(container);
logger.info("Recaf CDI container created in {}ms", System.currentTimeMillis() - then);
} catch (Throwable t) {
logger.error("Failed to create Recaf CDI container", t);
ExitDebugLoggingHook.exit(ExitCodes.ERR_CDI_INIT_FAILURE);
}
}
return instance;
}
/**
* Must be called before invoking {@link #get()}.
*
* @param consumer
* Consumer to operate on the CDI container producing {@link Weld} instance.
*/
public static void setWeldConsumer(@Nullable Consumer<Weld> consumer) {
weldConsumer = consumer;
}
@Nonnull
private static SeContainer createContainer() {
logger.info("Creating Recaf CDI container...");
Weld weld = new Weld("recaf");
weld.setClassLoader(Bootstrap.class.getClassLoader());
// Setup custom interceptors & extensions
logger.info("CDI: Adding interceptors & extensions");
weld.addExtension(EagerInitializationExtension.getInstance());
// Setup bean discovery
logger.info("CDI: Registering bean packages");
weld.addPackage(true, Recaf.class);
// Handle user-defined action
if (weldConsumer != null) {
logger.info("CDI: Running user-defined Consumer<Weld>");
weldConsumer.accept(weld);
weldConsumer = null;
}
logger.info("CDI: Initializing...");
return weld.initialize();
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/ExitCodes.java
================================================
package software.coley.recaf;
/**
* Exit codes for Recaf calling {@link System#exit(int)}.
*
* @author Matt Coley
*/
public class ExitCodes {
public static final int SUCCESS = 0;
public static final int ERR_FX_UNKNOWN = 100;
public static final int ERR_FX_CLASS_NOT_FOUND = 101;
public static final int ERR_FX_NO_SUCH_METHOD = 102;
public static final int ERR_FX_INVOKE_TARGET = 103;
public static final int ERR_FX_ACCESS_TARGET = 104;
public static final int ERR_FX_OLD_VERSION = 105;
public static final int ERR_FX_UNKNOWN_VERSION = 106;
public static final int INTELLIJ_TERMINATION = 130;
public static final int ERR_CDI_INIT_FAILURE = 150;
public static final int ERR_NOT_A_JDK = 160;
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/ExitDebugLoggingHook.java
================================================
package software.coley.recaf;
import com.google.common.hash.Hasher;
import com.google.common.hash.Hashing;
import jakarta.annotation.Nonnull;
import org.slf4j.Logger;
import software.coley.recaf.analytics.logging.Logging;
import software.coley.recaf.services.file.RecafDirectoriesConfig;
import software.coley.recaf.util.JavaVersion;
import software.coley.recaf.util.ReflectUtil;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.module.ModuleReference;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* A hook registered to {@code java.lang.Shutdown} and not {@link Runtime#addShutdownHook(Thread)}.
* This allows us to use the {@link StackWalker} API to detect the exit code from {@link System#exit(int)}
*
* @author Matt Coley
*/
public class ExitDebugLoggingHook {
private static final int UNKNOWN_CODE = -1337420;
private static final Logger logger = Logging.get(ExitDebugLoggingHook.class);
private static int exitCode = UNKNOWN_CODE;
private static boolean printConfigs;
private static Thread mainThread;
private static MethodHandles.Lookup lookup;
/**
* Register the shutdown hook.
*/
public static void register() {
lookup = ReflectUtil.lookup();
try {
// We use this instead of the Runtime shutdown hook thread because this will run on the same thread
// as the call to System.exit(int)
Class<?> shutdown = lookup.findClass("java.lang.Shutdown");
MethodHandle add = lookup.findStatic(shutdown, "add", MethodType.methodType(void.class, int.class, boolean.class, Runnable.class));
add.invoke(9, false, (Runnable) ExitDebugLoggingHook::run);
} catch (Throwable t) {
logger.error("Failed to add exit-hooking debug dumping shutdown hook", t);
// Use fallback shutdown hook which checks for manual exit codes being set.
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
if (exitCode != UNKNOWN_CODE)
handle(exitCode);
}));
}
}
private static void run() {
// If we've set the exit code manually, use that.
if (exitCode != UNKNOWN_CODE) {
handle(exitCode);
return;
}
// We didn't do the exit, so lets try and see if we can figure out who did it.
try {
AtomicBoolean visited = new AtomicBoolean();
Class<?> shutdown = lookup.findClass("java.lang.Shutdown");
Class<?> stackFrameClass = Class.forName("java.lang.LiveStackFrame");
MethodHandle getLocals = lookup.findVirtual(stackFrameClass, "getLocals", MethodType.methodType(Object[].class))
.asType(MethodType.methodType(Object[].class, Object.class));
Method getStackWalker = stackFrameClass.getDeclaredMethod("getStackWalker", Set.class);
getStackWalker.setAccessible(true);
StackWalker stackWalker = (StackWalker) getStackWalker.invoke(null, Set.of(StackWalker.Option.RETAIN_CLASS_REFERENCE, StackWalker.Option.SHOW_HIDDEN_FRAMES));
stackWalker.forEach(frame -> {
try {
if (!visited.get() && frame.getDeclaringClass() == shutdown && frame.getMethodName().equals("exit")) {
Object[] locals = (Object[]) getLocals.invoke(frame);
String local0 = locals[0].toString().replaceAll("\\D+", "");
int exit = (int) Long.parseLong(local0); // Need to parse as long, cast to int
handle(exit);
visited.set(true);
}
} catch (Throwable t) {
throw new IllegalStateException(t);
}
});
} catch (Throwable t) {
// If this cursed abomination breaks, we want to know about it
logger.error("""
Failed to detect application exit code.
Please report that the exit debugger has failed.
https://github.com/Col-E/Recaf/issues/new?labels=bug&title=Error%20Debugger%20Hook%20fails%20on%20Java%20{V}
""".replace("{V}", String.valueOf(JavaVersion.get())), t);
}
}
private static void handle(int code) {
// Skip on successful closure
if (code == ExitCodes.SUCCESS || code == ExitCodes.INTELLIJ_TERMINATION)
return;
if (code == UNKNOWN_CODE)
System.out.println("Exit code: <error>");
else
System.out.println("Exit code: " + code);
System.out.println("Java");
System.out.println(" - Version (Runtime): " + System.getProperty("java.runtime.version", "<unknown>"));
System.out.println(" - Version (Raw): " + JavaVersion.get());
System.out.println(" - Vendor: " + System.getProperty("java.vm.vendor", "<unknown>"));
System.out.println(" - Home: " + System.getProperty("java.home", "<unknown>"));
System.out.println("JavaFX");
System.out.println(" - Version (Runtime): " + System.getProperty("javafx.runtime.version", "<uninitialized>"));
System.out.println(" - Version (Raw): " + System.getProperty("javafx.version", "<uninitialized>"));
{
ClassLoader loader = ExitDebugLoggingHook.class.getClassLoader();
String javafxClass = "javafx/beans/Observable.class";
try {
Iterator<URL> iterator = loader.getResources(javafxClass).asIterator();
if (!iterator.hasNext()) {
System.out.println(" - Location: not found");
} else {
URL url = iterator.next();
if (!iterator.hasNext()) {
System.out.println(" - Location: " + url);
} else {
System.out.println(" - Location (likely): " + url);
do {
System.out.println(" - Location (seen): " + url);
} while (iterator.hasNext());
}
}
} catch (Exception ex) {
System.out.println(" - Location: <error>");
}
}
System.out.println("Operating System");
System.out.println(" - Name: " + System.getProperty("os.name"));
System.out.println(" - Version: " + System.getProperty("os.version"));
System.out.println(" - Architecture: " + System.getProperty("os.arch"));
System.out.println(" - Processors: " + Runtime.getRuntime().availableProcessors());
System.out.println(" - Path Separator: " + File.pathSeparator);
System.out.println("Recaf");
System.out.println(" - Version: " + RecafBuildConfig.VERSION);
System.out.println(" - Build hash: " + RecafBuildConfig.GIT_SHA);
System.out.println(" - Build date: " + RecafBuildConfig.GIT_DATE);
String command = System.getProperty("sun.java.command", "");
if (command != null) {
System.out.println("Launch");
System.out.println(" - Args: " + command);
}
String[] classPath = System.getProperty("java.class.path").split(File.pathSeparator);
System.out.println("Classpath:");
for (String pathEntry : classPath) {
File file = new File(pathEntry);
if (file.isFile()) {
System.out.println(" - File: " + pathEntry);
try {
System.out.println(" - SHA1: " + createSha1(file));
} catch (Exception ex) {
System.out.println(" - SHA1: <error>");
}
} else if (file.isDirectory()) {
System.out.println(" - Directory: " + pathEntry);
}
}
System.out.println("Boot class loader:");
dumpBootstrapClassLoader();
System.out.println("Platform class loader:");
dumpBuiltinClassLoader(ClassLoader.getPlatformClassLoader());
Path root = RecafDirectoriesConfig.createBaseDirectory().resolve("config");
if (printConfigs && Files.isDirectory(root)) {
System.out.println("Configs");
try (Stream<Path> stream = Files.walk(root)) {
stream.filter(path -> path.getFileName().toString().endsWith("-config.json")).forEach(path -> {
String configName = path.getFileName().toString();
// Skip certain configs
if (configName.contains("service.ui.bind-"))
return;
if (configName.contains("service.ui.snippets-config"))
return;
if (configName.contains("service.io.recent-workspaces-config"))
return;
if (configName.contains("service.decompile.impl.decompiler-"))
return;
System.out.println(" - " + configName + ":");
try {
String indent = " ";
String configJson = Files.readString(path);
String indented = indent + Arrays.stream(configJson.split("\n"))
.collect(Collectors.joining("\n" + indent));
System.out.println(indented);
} catch (Throwable t) {
System.out.println(" - <error>");
}
});
} catch (Exception ex) {
System.out.println(" - <error>");
}
}
System.out.println("Threads");
Thread.getAllStackTraces().forEach((thread, trace) -> {
System.out.println(" - " + thread.getName() + " [" + thread.getState().name() + "]");
for (StackTraceElement element : trace) {
System.out.println(" - " + element);
}
});
}
@SuppressWarnings("unchecked")
private static void dumpBuiltinClassLoader(ClassLoader loader) {
try {
Class<?> c = Class.forName("jdk.internal.loader.BuiltinClassLoader");
Field nameToModuleField = c.getDeclaredField("nameToModule");
nameToModuleField.setAccessible(true);
Map<String, ModuleReference> mdouleMap = (Map<String, ModuleReference>) nameToModuleField.get(loader);
for (Map.Entry<String, ModuleReference> e : mdouleMap.entrySet()) {
ModuleReference moduleReference = e.getValue();
System.out.printf("%s located at %s%n", moduleReference.descriptor().toNameAndVersion(), moduleReference.location()
.map(URI::toString)
.orElse("Unknown"));
}
} catch (Exception ex) {
System.out.printf("dumpBuiltinClassLoader(%s) - <error>%n", loader);
}
}
private static void dumpBootstrapClassLoader() {
try {
Class<?> c = Class.forName("jdk.internal.loader.ClassLoaders");
Method bootLoaderMethod = c.getDeclaredMethod("bootLoader");
bootLoaderMethod.setAccessible(true);
dumpBuiltinClassLoader((ClassLoader) bootLoaderMethod.invoke(null));
} catch (Exception ex) {
System.out.println("dumpBootstrapClassLoader - <error>");
}
}
@Nonnull
@SuppressWarnings("all")
private static String createSha1(@Nonnull File file) throws Exception {
long length = file.length();
if (length > Integer.MAX_VALUE)
throw new IOException("File too large to hash");
Hasher hasher = Hashing.sha1().newHasher((int) length);
try (InputStream fis = new FileInputStream(file)) {
int n = 0;
byte[] buffer = new byte[8192];
while (n != -1) {
n = fis.read(buffer);
if (n > 0)
hasher.putBytes(buffer, 0, n);
}
return hasher.hash().toString();
}
}
public static void exit(int exitCode) {
ExitDebugLoggingHook.exitCode = exitCode;
System.exit(exitCode);
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/Recaf.java
================================================
package software.coley.recaf;
import jakarta.annotation.Nonnull;
import jakarta.enterprise.inject.Instance;
import jakarta.enterprise.inject.se.SeContainer;
import java.lang.annotation.Annotation;
import java.util.Locale;
/**
* Recaf application instance.
*
* @author Matt Coley
*/
public class Recaf {
private static final Annotation[] NO_QUALIFIERS = new Annotation[0];
private final SeContainer container;
/**
* @param container
* Container instance for bean management.
*/
public Recaf(@Nonnull SeContainer container) {
this.container = container;
}
/**
* @return The CDI container.
*/
public SeContainer getContainer() {
return container;
}
/**
* @param type
* Type to get an {@link Instance} of.
* @param <T>
* Instance type.
*
* @return Instance accessor for bean of the given type.
*/
@Nonnull
public <T> Instance<T> instance(@Nonnull Class<T> type) {
return instance(type, NO_QUALIFIERS);
}
/**
* @param type
* Type to get an {@link Instance} of.
* @param qualifiers
* Qualifiers to narrow down an option if multiple candidate instances exist for the type.
* @param <T>
* Instance type.
*
* @return Instance accessor for bean of the given type.
*/
@Nonnull
public <T> Instance<T> instance(@Nonnull Class<T> type, Annotation... qualifiers) {
return container.select(type, qualifiers);
}
/**
* @param type
* Type to get instance of.
* @param <T>
* Instance type.
*
* @return Instance of type <i>(Wrapped in a proxy)</i>.
*/
@Nonnull
public <T> T get(@Nonnull Class<T> type) {
return get(type, NO_QUALIFIERS);
}
/**
* @param type
* Type to get instance of.
* @param qualifiers
* Qualifiers to narrow down an option if multiple candidate instances exist for the type.
* @param <T>
* Instance type.
*
* @return Instance of type <i>(Wrapped in a proxy)</i>.
*/
@Nonnull
public <T> T get(@Nonnull Class<T> type, Annotation... qualifiers) {
return instance(type, qualifiers).get();
}
static {
// Enforce US locale just in case we have some string formatting susceptible to this "feature":
// https://mattryall.net/blog/the-infamous-turkish-locale-bug
Locale.setDefault(Locale.US);
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/RecafConstants.java
================================================
package software.coley.recaf;
import org.objectweb.asm.Opcodes;
/**
* Common constants.
*
* @author Matt Coley
*/
public final class RecafConstants {
private RecafConstants() {
}
/**
* @return Current ASM version.
*/
public static int getAsmVersion() {
return Opcodes.ASM9;
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/SystemInformation.java
================================================
package software.coley.recaf.analytics;
import jakarta.annotation.Nullable;
import org.slf4j.Logger;
import java.io.StringWriter;
import java.util.Map;
import java.util.TreeMap;
/**
* Common properties pulled at runtime from {@link System#getProperty(String)}
* that are useful for tracking and logging.
*
* @author Matt Coley
*/
public class SystemInformation {
private static final String KEY_OS_NAME = "os.name";
private static final String KEY_OS_ARCH = "os.arch";
private static final String KEY_OS_VERSION = "os.version";
private static final String KEY_OS_ARCH_BITS = "os.bitness";
private static final String KEY_OS_PROCESSORS = "os.processors";
private static final String KEY_JAVA_VERSION = "java.version";
private static final String KEY_JAVA_VM_NAME = "java.vm.version";
private static final String KEY_JAVA_VM_VENDOR = "java.vm.vendor";
private static final String KEY_JAVA_HOME = "java.home";
public static final String OS_NAME = System.getProperty(KEY_OS_NAME);
public static final String OS_ARCH = System.getProperty(KEY_OS_ARCH);
public static final int OS_ARCH_BITS = determineBitness();
public static final String OS_VERSION = System.getProperty(KEY_OS_VERSION);
public static final String JAVA_VERSION = System.getProperty(KEY_JAVA_VERSION);
public static final String JAVA_VM_NAME = System.getProperty(KEY_JAVA_VM_NAME);
public static final String JAVA_VM_VENDOR = System.getProperty(KEY_JAVA_VM_VENDOR);
public static final String JAVA_HOME = System.getProperty(KEY_JAVA_HOME);
private static final Map<String, String> ALL_PROPERTIES = new TreeMap<>() {
{
put(KEY_OS_NAME, OS_NAME);
put(KEY_OS_ARCH, OS_ARCH);
put(KEY_OS_ARCH_BITS, String.valueOf(OS_ARCH_BITS));
put(KEY_OS_PROCESSORS, String.valueOf(Runtime.getRuntime().availableProcessors()));
put(KEY_OS_VERSION, OS_VERSION);
put(KEY_JAVA_VERSION, JAVA_VERSION);
put(KEY_JAVA_VM_NAME, JAVA_VM_NAME);
put(KEY_JAVA_VM_VENDOR, JAVA_VM_VENDOR);
put(KEY_JAVA_HOME, JAVA_HOME);
}
};
/**
* @return {@code 64} or {@code 32} dependent on the {@link #OS_ARCH}.
*/
private static int determineBitness() {
// Parse from specification value, which is commonly defined.
String bitness = System.getProperty("sun.arch.data.model", "");
if (bitness.matches("[0-9]{2}"))
return Integer.parseInt(bitness, 10);
// Parse from IBM value, used on IBM releases.
bitness = System.getProperty("com.ibm.vm.bitmode", "");
if (bitness.matches("[0-9]{2}"))
return Integer.parseInt(bitness, 10);
return OS_ARCH.contains("64") ? 64 : 32;
}
/**
* Dump all properties into the given logger.
*
* @param logger
* Logger to dump into.
*/
public static void dump(@Nullable Logger logger) {
if (logger != null)
ALL_PROPERTIES.forEach((key, value) ->
logger.debug("{} = {}", key, value));
}
/**
* Dump all properties into the given writer.
*
* @param writer
* Writer to dump into.
*/
public static void dump(@Nullable StringWriter writer) {
if (writer != null)
ALL_PROPERTIES.forEach((key, value) ->
writer.append(String.format("%s = %s\n", key, value)));
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/DebuggingLogger.java
================================================
package software.coley.recaf.analytics.logging;
import jakarta.annotation.Nonnull;
import org.slf4j.Logger;
import software.coley.recaf.util.ExcludeFromJacocoGeneratedReport;
import java.util.function.Consumer;
/**
* Used for verbose logging that we normally would not want to capture due to excessiveness.
* But in the case where we want to enable it for local testing, its available.
*
* @author Matt Coley
*/
@ExcludeFromJacocoGeneratedReport(justification = "Logging not relevant for test coverage")
public interface DebuggingLogger extends Logger {
boolean DEBUG = System.getenv("RECAF_DEBUG") != null;
/**
* Only do the given action when manual debugging is enabled.
*
* @param action
* Call onto self.
*/
default void debugging(@Nonnull Consumer<DebuggingLogger> action) {
if (DEBUG)
action.accept(this);
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/InterceptingLogger.java
================================================
package software.coley.recaf.analytics.logging;
import jakarta.annotation.Nonnull;
import org.slf4j.Logger;
import org.slf4j.Marker;
import org.slf4j.event.Level;
import software.coley.recaf.util.ExcludeFromJacocoGeneratedReport;
import java.util.regex.Matcher;
/**
* A forwarding logger that lets us intercept compiled messages.
*
* @author Matt Coley
*/
@ExcludeFromJacocoGeneratedReport(justification = "Logging not relevant for test coverage")
public abstract class InterceptingLogger implements DebuggingLogger {
private final Logger backing;
/**
* @param backing
* Backing logger to send info to.
*/
protected InterceptingLogger(@Nonnull Logger backing) {
this.backing = backing;
}
/**
* Intercept logging.
*
* @param level
* Level logged.
* @param message
* Message logged.
*/
public abstract void intercept(Level level, String message);
/**
* Intercept throwable logging.
*
* @param level
* Level logged.
* @param message
* Message logged.
* @param t
* Item thrown.
*/
public abstract void intercept(Level level, String message, Throwable t);
@Override
public String getName() {
return backing.getName();
}
@Override
public boolean isTraceEnabled() {
return backing.isTraceEnabled();
}
@Override
public boolean isTraceEnabled(Marker marker) {
return backing.isTraceEnabled(marker);
}
@Override
public void trace(String msg) {
backing.trace(msg);
if (isTraceEnabled()) intercept(Level.TRACE, msg);
}
@Override
public void trace(String format, Object arg) {
trace(format, new Object[]{arg});
}
@Override
public void trace(String format, Object arg1, Object arg2) {
trace(format, new Object[]{arg1, arg2});
}
@Override
public void trace(String format, Object... arguments) {
backing.trace(format, arguments);
if (isTraceEnabled()) intercept(Level.TRACE, compile(format, arguments));
}
@Override
public void trace(String msg, Throwable t) {
backing.trace(msg, t);
if (isTraceEnabled()) intercept(Level.TRACE, msg, t);
}
@Override
public void trace(Marker marker, String msg) {
backing.trace(marker, msg);
if (isTraceEnabled()) intercept(Level.TRACE, msg);
}
@Override
public void trace(Marker marker, String format, Object arg) {
trace(marker, format, new Object[]{arg});
}
@Override
public void trace(Marker marker, String format, Object arg1, Object arg2) {
trace(marker, format, new Object[]{arg1, arg2});
}
@Override
public void trace(Marker marker, String format, Object... arguments) {
backing.trace(marker, format, arguments);
if (isTraceEnabled()) intercept(Level.TRACE, compile(format, arguments));
}
@Override
public void trace(Marker marker, String msg, Throwable t) {
backing.trace(marker, msg, t);
if (isTraceEnabled()) intercept(Level.TRACE, msg, t);
}
@Override
public boolean isDebugEnabled() {
return backing.isDebugEnabled();
}
@Override
public boolean isDebugEnabled(Marker marker) {
return backing.isDebugEnabled(marker);
}
@Override
public void debug(String msg) {
backing.debug(msg);
if (isDebugEnabled()) intercept(Level.DEBUG, msg);
}
@Override
public void debug(String format, Object arg) {
debug(format, new Object[]{arg});
}
@Override
public void debug(String format, Object arg1, Object arg2) {
debug(format, new Object[]{arg1, arg2});
}
@Override
public void debug(String format, Object... arguments) {
backing.debug(format, arguments);
if (isDebugEnabled()) intercept(Level.DEBUG, compile(format, arguments));
}
@Override
public void debug(String msg, Throwable t) {
backing.debug(msg, t);
if (isDebugEnabled()) intercept(Level.DEBUG, msg, t);
}
@Override
public void debug(Marker marker, String msg) {
backing.debug(marker, msg);
if (isDebugEnabled()) intercept(Level.DEBUG, msg);
}
@Override
public void debug(Marker marker, String format, Object arg) {
debug(marker, format, new Object[]{arg});
}
@Override
public void debug(Marker marker, String format, Object arg1, Object arg2) {
debug(marker, format, new Object[]{arg1, arg2});
}
@Override
public void debug(Marker marker, String format, Object... arguments) {
backing.debug(marker, format, arguments);
if (isDebugEnabled()) intercept(Level.DEBUG, compile(format, arguments));
}
@Override
public void debug(Marker marker, String msg, Throwable t) {
backing.debug(marker, msg, t);
if (isDebugEnabled()) intercept(Level.DEBUG, msg, t);
}
@Override
public boolean isInfoEnabled() {
return backing.isInfoEnabled();
}
@Override
public boolean isInfoEnabled(Marker marker) {
return backing.isInfoEnabled(marker);
}
@Override
public void info(String msg) {
backing.info(msg);
if (isInfoEnabled()) intercept(Level.INFO, msg);
}
@Override
public void info(String format, Object arg) {
info(format, new Object[]{arg});
}
@Override
public void info(String format, Object arg1, Object arg2) {
info(format, new Object[]{arg1, arg2});
}
@Override
public void info(String format, Object... arguments) {
backing.info(format, arguments);
if (isInfoEnabled()) intercept(Level.INFO, compile(format, arguments));
}
@Override
public void info(String msg, Throwable t) {
backing.info(msg, t);
if (isInfoEnabled()) intercept(Level.INFO, msg, t);
}
@Override
public void info(Marker marker, String msg) {
backing.info(marker, msg);
if (isInfoEnabled()) intercept(Level.INFO, msg);
}
@Override
public void info(Marker marker, String format, Object arg) {
info(marker, format, new Object[]{arg});
}
@Override
public void info(Marker marker, String format, Object arg1, Object arg2) {
info(marker, format, new Object[]{arg1, arg2});
}
@Override
public void info(Marker marker, String format, Object... arguments) {
backing.info(marker, format, arguments);
if (isInfoEnabled()) intercept(Level.INFO, compile(format, arguments));
}
@Override
public void info(Marker marker, String msg, Throwable t) {
backing.info(marker, msg, t);
if (isInfoEnabled()) intercept(Level.INFO, msg, t);
}
@Override
public boolean isWarnEnabled() {
return backing.isWarnEnabled();
}
@Override
public boolean isWarnEnabled(Marker marker) {
return backing.isWarnEnabled(marker);
}
@Override
public void warn(String msg) {
backing.warn(msg);
if (isWarnEnabled()) intercept(Level.WARN, msg);
}
@Override
public void warn(String format, Object arg) {
warn(format, new Object[]{arg});
}
@Override
public void warn(String format, Object arg1, Object arg2) {
warn(format, new Object[]{arg1, arg2});
}
@Override
public void warn(String format, Object... arguments) {
backing.warn(format, arguments);
if (isWarnEnabled()) intercept(Level.WARN, compile(format, arguments));
}
@Override
public void warn(String msg, Throwable t) {
backing.warn(msg, t);
if (isWarnEnabled()) intercept(Level.WARN, msg, t);
}
@Override
public void warn(Marker marker, String msg) {
backing.warn(marker, msg);
if (isWarnEnabled()) intercept(Level.WARN, msg);
}
@Override
public void warn(Marker marker, String format, Object arg) {
warn(marker, format, new Object[]{arg});
}
@Override
public void warn(Marker marker, String format, Object arg1, Object arg2) {
warn(marker, format, new Object[]{arg1, arg2});
}
@Override
public void warn(Marker marker, String format, Object... arguments) {
backing.warn(marker, format, arguments);
if (isWarnEnabled()) intercept(Level.WARN, compile(format, arguments));
}
@Override
public void warn(Marker marker, String msg, Throwable t) {
backing.warn(marker, msg, t);
if (isWarnEnabled()) intercept(Level.WARN, msg, t);
}
@Override
public boolean isErrorEnabled() {
return backing.isErrorEnabled();
}
@Override
public boolean isErrorEnabled(Marker marker) {
return backing.isErrorEnabled(marker);
}
@Override
public void error(String msg) {
backing.error(msg);
if (isErrorEnabled()) intercept(Level.ERROR, msg);
}
@Override
public void error(String format, Object arg) {
error(format, new Object[]{arg});
}
@Override
public void error(String format, Object arg1, Object arg2) {
error(format, new Object[]{arg1, arg2});
}
@Override
public void error(String format, Object... arguments) {
backing.error(format, arguments);
if (isErrorEnabled()) intercept(Level.ERROR, compile(format, arguments));
}
@Override
public void error(String msg, Throwable t) {
backing.error(msg, t);
if (isErrorEnabled()) intercept(Level.ERROR, msg, t);
}
@Override
public void error(Marker marker, String msg) {
backing.error(marker, msg);
if (isErrorEnabled()) intercept(Level.ERROR, msg);
}
@Override
public void error(Marker marker, String format, Object arg) {
error(marker, format, new Object[]{arg});
}
@Override
public void error(Marker marker, String format, Object arg1, Object arg2) {
error(marker, format, new Object[]{arg1, arg2});
}
@Override
public void error(Marker marker, String format, Object... arguments) {
backing.error(marker, format, arguments);
if (isErrorEnabled()) intercept(Level.ERROR, compile(format, arguments));
}
@Override
public void error(Marker marker, String msg, Throwable t) {
backing.error(marker, msg, t);
if (isErrorEnabled()) intercept(Level.ERROR, msg, t);
}
private static String compile(String message, Object[] arguments) {
int i = 0;
while (message.contains("{}")) {
// Failsafe, shouldn't occur if logging is written correctly
if (i == arguments.length)
return message;
// Replace arg in pattern
Object arg = arguments[i];
String argStr = arg == null ? "null" : arg.toString();
message = message.replaceFirst("\\{}", Matcher.quoteReplacement(argStr));
i++;
}
return message;
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/LogConsumer.java
================================================
package software.coley.recaf.analytics.logging;
import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import org.slf4j.event.Level;
/**
* Triple-argument consumer for taking in log messages.
*
* @param <T>
* Log content.
*
* @author Matt Coley
*/
public interface LogConsumer<T> {
/**
* @param loggerName
* Name of logger message applies to.
* @param level
* Log level of message.
* @param messageContent
* Content of message.
*/
void accept(@Nonnull String loggerName, @Nonnull Level level, @Nullable T messageContent);
/**
* @param loggerName
* Name of logger message applies to.
* @param level
* Log level of message.
* @param messageContent
* Content of message.
* @param throwable
* Associated thrown exception.
*/
void accept(@Nonnull String loggerName, @Nonnull Level level, @Nullable T messageContent, @Nullable Throwable throwable);
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/Logging.java
================================================
package software.coley.recaf.analytics.logging;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.core.FileAppender;
import jakarta.annotation.Nonnull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.event.Level;
import software.coley.recaf.util.ExcludeFromJacocoGeneratedReport;
import java.nio.file.Path;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.NavigableSet;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import static org.slf4j.LoggerFactory.getLogger;
/**
* {@link LoggerFactory} wrapper that lets us intercept all logged messages.
*
* @author Matt Coley
*/
@ExcludeFromJacocoGeneratedReport(justification = "Logging not relevant for test coverage")
public class Logging {
private static final Map<String, DebuggingLogger> loggers = new ConcurrentHashMap<>();
private static final NavigableSet<String> loggerKeys = Collections.synchronizedNavigableSet(new TreeSet<>());
private static final List<LogConsumer<String>> logConsumers = new CopyOnWriteArrayList<>();
private static Level interceptLevel = Level.INFO;
/**
* @return Set of the current logger keys.
*/
@Nonnull
public static NavigableSet<String> loggerKeys() {
// We track the keys in this separate set so that we can retrieve them
// in sorted order without needing to wrap in 'new TreeSet' every time.
return Collections.unmodifiableNavigableSet(loggerKeys);
}
/**
* @param name
* Logger name.
*
* @return Logger associated with name.
*/
@Nonnull
public static DebuggingLogger get(@Nonnull String name) {
return loggers.computeIfAbsent(name, k -> intercept(k, getLogger(k)));
}
/**
* @param cls
* Logger class key.
*
* @return Logger associated with class.
*/
@Nonnull
public static DebuggingLogger get(@Nonnull Class<?> cls) {
return loggers.computeIfAbsent(cls.getName(), k -> intercept(k, getLogger(k)));
}
/**
* @param consumer
* New log message consumer.
*/
public static void addLogConsumer(@Nonnull LogConsumer<String> consumer) {
logConsumers.add(consumer);
}
/**
* @param consumer
* Log message consumer to remove.
*/
public static void removeLogConsumer(@Nonnull LogConsumer<String> consumer) {
logConsumers.remove(consumer);
}
/**
* Sets the target level for log interception. This affects what messages {@link LogConsumer}s receive.
*
* @param level
* New target level.
*/
public static void setInterceptLevel(@Nonnull Level level) {
interceptLevel = level;
}
/**
* Registers a file appender for all log calls.
*
* @param path
* Path to file to append to.
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public static void addFileAppender(@Nonnull Path path) {
// We do it this way so the file path can be set at runtime.
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
FileAppender fileAppender = new FileAppender<>();
fileAppender.addFilter(new RecafLoggingFilter(ch.qos.logback.classic.Level.ALL));
fileAppender.setFile(path.toString());
fileAppender.setContext(loggerContext);
fileAppender.setPrudent(true);
fileAppender.setAppend(true);
fileAppender.setImmediateFlush(true);
// Pattern
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(loggerContext);
encoder.setPattern("%d{HH:mm:ss.SSS} [%logger{0}/%thread] %-5level: %msg%n");
encoder.start();
fileAppender.setEncoder(encoder);
// Start file appender
fileAppender.start();
// Create logger
ch.qos.logback.classic.Logger logbackLogger = (ch.qos.logback.classic.Logger)
LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME);
logbackLogger.addAppender(fileAppender);
logbackLogger.setAdditive(false);
}
@Nonnull
private static DebuggingLogger intercept(@Nonnull String name, @Nonnull Logger logger) {
loggerKeys.add(name);
return new InterceptingLogger(logger) {
@Override
public void intercept(@Nonnull Level level, String message) {
if (interceptLevel.toInt() <= level.toInt())
logConsumers.forEach(consumer -> consumer.accept(name, level, message));
}
@Override
public void intercept(@Nonnull Level level, String message, Throwable t) {
if (interceptLevel.toInt() <= level.toInt())
logConsumers.forEach(consumer -> consumer.accept(name, level, message, t));
}
};
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/RecafLoggingFilter.java
================================================
package software.coley.recaf.analytics.logging;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import software.coley.recaf.util.ExcludeFromJacocoGeneratedReport;
import java.util.Objects;
import java.util.function.Supplier;
/**
* Logging filter impl that only allows Recaf logger calls.
*
* @author Matt Coley
*/
@ExcludeFromJacocoGeneratedReport(justification = "Logging not relevant for test coverage")
public class RecafLoggingFilter extends Filter<ILoggingEvent> {
/** Shared default level - used by auto-created instances of this filter. */
public static Level defaultLevel = Level.TRACE;
/** Instance supplier of the logging level for this filter. */
private final Supplier<Level> instanceLevel;
/**
* No-args constructor for auto-created instances.
* Will delegate the level to {@link #defaultLevel}.
*/
public RecafLoggingFilter() {
instanceLevel = () -> defaultLevel;
}
/**
* Constructor for intentionally made use cases which
* want to control the logging level of output.
*
* @param level
* Level for this filter instance.
*/
public RecafLoggingFilter(@Nullable Level level) {
instanceLevel = () -> Objects.requireNonNullElse(level, Level.TRACE);
}
@Override
public FilterReply decide(@Nonnull ILoggingEvent event) {
Level level = event.getLevel();
if (instanceLevel.get().isGreaterOrEqual(level))
return FilterReply.DENY;
String loggerName = event.getLoggerName();
if (loggerName.startsWith("software.coley.") || Logging.loggerKeys().contains(loggerName))
return FilterReply.ACCEPT;
return FilterReply.DENY;
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/behavior/Closing.java
================================================
package software.coley.recaf.behavior;
/**
* Type is closable.
*
* @author Matt Coley
*/
public interface Closing {
/**
* Called to close the item.
*/
void close();
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/behavior/PriorityKeys.java
================================================
package software.coley.recaf.behavior;
/**
* Default keys for {@link PrioritySortable} implementations.
* <p>
* Searching for usages of these keys will show what listeners/classes fire in which order.
*
* @author Matt Coley
*/
public final class PriorityKeys {
public static final int EARLIEST = -1000;
public static final int EARLIER = -100;
public static final int EARLY = -10;
public static final int DEFAULT = 0;
public static final int LATE = 10;
public static final int LATER = 100;
public static final int LATEST = 1000;
private PriorityKeys() {}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/behavior/PrioritySortable.java
================================================
package software.coley.recaf.behavior;
import jakarta.annotation.Nonnull;
import software.coley.collections.Lists;
import java.util.List;
/**
* Priority sortable item.
*
* @author Matt Coley
*/
public interface PrioritySortable extends Comparable<PrioritySortable> {
/**
* @return This item's priority value.
* Negative values have higher priority.
* Positive values have lower priority.
*
* @see PriorityKeys
*/
default int getPriority() {
// Everything will default to '0' and the order of items is not guaranteed.
//
// The idea is that most things do not need a guaranteed run order, but for the few edge cases that do
// those specific cases will use higher/lower values to be moved to the front/end of the sorted list.
return PriorityKeys.DEFAULT;
}
@Override
default int compareTo(@Nonnull PrioritySortable o) {
return Integer.compare(getPriority(), o.getPriority());
}
/**
* Add a sortable item to a sortable list.
*
* @param items
* List to add to.
* @param item
* Item to add.
* @param <T>
* Child priority-sortable type.
*
* @return {@code true} on add. {@code false} on failure <i>(Insertion index cannot be computed)</i>,
*/
static <T extends PrioritySortable> boolean add(@Nonnull List<T> items, @Nonnull T item) {
return Lists.sortedInsert(PrioritySortable::compareTo, items, item);
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/cdi/EagerInitialization.java
================================================
package software.coley.recaf.cdi;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Applied to beans to enable eager initialization, which is to say they and their dependencies get created as soon as
* possible depending on the {@link #value() value of the intended} {@link InitializationStage}. This will result in
* the bean's {@code @Inject} annotated constructor being called.
* <p>
* Alternatively, you could also observe the events {@link InitializationEvent} or {@link UiInitializationEvent}
* in a method with {@link Observes}. This would allow you to separate the initialization logic from the constructor
* and have it reside in a separate method.
* <p>
* <b>NOTE:</b> Beans are not eagerly initialized while in a test environment.
*
* @author Matt Coley
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface EagerInitialization {
/**
* Determines when to run early initialization.
* <br>
* Changing this value is mostly applicable to {@link ApplicationScoped} beans.
* Having the value set to {@link InitializationStage#IMMEDIATE} will result in the bean and <i>all</i> of
* its dependencies being created as soon as the application begins. For beans dealing with UI capabilities this
* will likely lead to problems. For those situations, use {@link InitializationStage#AFTER_UI_INIT} to delay
* initialization until after the UI has been populated.
*
* @return When the initialization should occur.
*/
InitializationStage value() default InitializationStage.IMMEDIATE;
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/cdi/EagerInitializationExtension.java
================================================
package software.coley.recaf.cdi;
import jakarta.annotation.Nonnull;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
import jakarta.enterprise.inject.spi.Annotated;
import jakarta.enterprise.inject.spi.Bean;
import jakarta.enterprise.inject.spi.BeanManager;
import jakarta.enterprise.inject.spi.Extension;
import jakarta.enterprise.inject.spi.ProcessBean;
import jakarta.inject.Inject;
import java.util.ArrayList;
import java.util.List;
/**
* Extension to force creation of {@link EagerInitialization} annotated beans without the need to
* {@link Inject} and reference them externally.
*
* @author Matt Coley
*/
public class EagerInitializationExtension implements Extension {
private static final EagerInitializationExtension INSTANCE = new EagerInitializationExtension();
private static final List<Bean<?>> applicationScopedEagerBeans = new ArrayList<>();
private static final List<Bean<?>> applicationScopedEagerBeansForUi = new ArrayList<>();
private static BeanManager beanManager;
private EagerInitializationExtension() {
}
/**
* @return Extension singleton.
*/
@Nonnull
public static EagerInitializationExtension getInstance() {
return INSTANCE;
}
/**
* @return Application scoped {@link EagerInitialization} beans.
*/
@Nonnull
public static List<Bean<?>> getApplicationScopedEagerBeans() {
return applicationScopedEagerBeans;
}
/**
* @return Application scoped {@link EagerInitialization} beans which will wait for the UI to be initialized before being initialized.
*/
@Nonnull
public static List<Bean<?>> getApplicationScopedEagerBeansForUi() {
return applicationScopedEagerBeansForUi;
}
/**
* Called when a bean is discovered and processed.
* We will record eager beans here so that we can initialize them later.
*
* @param event
* CDI bean process event.
*/
public void onProcessBean(@Observes ProcessBean<?> event) {
Annotated annotated = event.getAnnotated();
EagerInitialization eager = annotated.getAnnotation(EagerInitialization.class);
if (eager != null && annotated.isAnnotationPresent(ApplicationScoped.class)) {
if (eager.value() == InitializationStage.IMMEDIATE)
applicationScopedEagerBeans.add(event.getBean());
else if (eager.value() == InitializationStage.AFTER_UI_INIT)
applicationScopedEagerBeansForUi.add(event.getBean());
}
}
/**
* Called when Recaf initializes the CDI container, and after plugins are loaded.
*
* @param event
* Recaf initialization event.
* @param beanManager
* CDI bean manager.
*/
public void onInitialize(@Observes InitializationEvent event, @Nonnull BeanManager beanManager) {
EagerInitializationExtension.beanManager = beanManager;
for (Bean<?> bean : applicationScopedEagerBeans)
create(bean);
}
/**
* Called when the UI is populated.
* This obviously means that this only gets called when running from the UI module.
*
* @param event
* UI initialization event.
* @param beanManager
* CDI bean manager.
*/
public void onUiInitialize(@Observes UiInitializationEvent event, @Nonnull BeanManager beanManager) {
EagerInitializationExtension.beanManager = beanManager;
for (Bean<?> bean : applicationScopedEagerBeansForUi)
create(bean);
}
static void create(@Nonnull Bean<?> bean) {
// NOTE: Calling toString() triggers the bean's proxy to the real implementation to initialize it.
// We have a null check here because under some test environments this may trigger without being set (see above)
if (beanManager != null)
beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean)).toString();
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/cdi/InitializationEvent.java
================================================
package software.coley.recaf.cdi;
/**
* Empty type, used to notify CDI consumers observing this type that the application has been launched.
*
* @author Matt Coley
* @see UiInitializationEvent Alternative which waits for the UI to initialize.
*/
public class InitializationEvent {
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/cdi/InitializationStage.java
================================================
package software.coley.recaf.cdi;
/**
* Initialization stage for {@link EagerInitialization#value()}.
*
* @author Matt Coley
* @see EagerInitialization
*/
public enum InitializationStage {
/**
* Occurs as soon as possible.
*/
IMMEDIATE,
/**
* Occurs after the UI is initialized.
*/
AFTER_UI_INIT
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/cdi/UiInitializationEvent.java
================================================
package software.coley.recaf.cdi;
/**
* Empty type, used to notify CDI consumers observing this type that the UI has been populated.
*
* @author Matt Coley
* @see InitializationEvent Alternative which runs before the UI is initialized.
*/
public class UiInitializationEvent {
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/BasicCollectionConfigValue.java
================================================
package software.coley.recaf.config;
import jakarta.annotation.Nonnull;
import software.coley.observables.ObservableCollection;
import java.util.Collection;
/**
* Basic implementation of {@link ConfigCollectionValue}.
*
* @param <T>
* Value type.
* @param <C>
* Collection type.
*
* @author Matt Coley
*/
public class BasicCollectionConfigValue<T, C extends Collection<T>> implements ConfigCollectionValue<T, C> {
private final String key;
private final Class<C> collectionType;
private final Class<T> itemType;
private final ObservableCollection<T, C> observable;
private final boolean hidden;
/**
* @param key
* Value key.
* @param type
* Value type class.
* @param observable
* Observable of value.
*/
@SuppressWarnings("rawtypes")
public BasicCollectionConfigValue(@Nonnull String key,
@Nonnull Class<? extends Collection> type,
@Nonnull Class<T> itemType,
@Nonnull ObservableCollection<T, C> observable) {
this(key, type, itemType, observable, false);
}
/**
* @param key
* Value key.
* @param type
* Value type class.
* @param observable
* Observable of value.
* @param hidden
* Hidden flag.
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public BasicCollectionConfigValue(@Nonnull String key,
@Nonnull Class<? extends Collection> type,
@Nonnull Class<T> itemType,
@Nonnull ObservableCollection<T, C> observable,
boolean hidden) {
this.key = key;
this.collectionType = (Class<C>) type;
this.itemType = itemType;
this.observable = observable;
this.hidden = hidden;
}
@Nonnull
@Override
public String getId() {
return key;
}
@Nonnull
@Override
public Class<C> getType() {
return collectionType;
}
@Override
public Class<T> getItemType() {
return itemType;
}
@Nonnull
@Override
public ObservableCollection<T, C> getObservable() {
return observable;
}
@Override
public boolean isHidden() {
return hidden;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BasicCollectionConfigValue<?, ?> other = (BasicCollectionConfigValue<?, ?>) o;
if (!key.equals(other.key)) return false;
if (!collectionType.equals(other.collectionType)) return false;
if (!itemType.equals(other.itemType)) return false;
return observable.equals(other.observable);
}
@Override
public int hashCode() {
int result = key.hashCode();
result = 31 * result + collectionType.hashCode();
result = 31 * result + itemType.hashCode();
result = 31 * result + observable.hashCode();
return result;
}
@Override
public String toString() {
return "BasicCollectionConfigValue{" +
"key='" + key + '\'' +
", collectionType=" + collectionType +
", itemType=" + itemType +
'}';
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/BasicConfigContainer.java
================================================
package software.coley.recaf.config;
import jakarta.annotation.Nonnull;
import java.util.Map;
import java.util.TreeMap;
/**
* Basic implementation of {@link ConfigContainer}
*
* @author Matt Coley
*/
public class BasicConfigContainer implements ConfigContainer {
private final Map<String, ConfigValue<?>> configMap = new TreeMap<>();
private final String group;
private final String id;
/**
* @param group
* Container group.
* @param id
* Container ID.
*/
public BasicConfigContainer(@Nonnull String group, @Nonnull String id) {
this.group = group;
this.id = id;
}
/**
* @param value
* Value to add.
*/
protected void addValue(@Nonnull ConfigValue<?> value) {
configMap.put(value.getId(), value);
}
@Nonnull
@Override
public String getGroup() {
return group;
}
@Nonnull
@Override
public String getId() {
return id;
}
@Nonnull
@Override
public Map<String, ConfigValue<?>> getValues() {
return configMap;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BasicConfigContainer that = (BasicConfigContainer) o;
if (!configMap.equals(that.configMap)) return false;
return id.equals(that.id);
}
@Override
public int hashCode() {
int result = configMap.hashCode();
result = 31 * result + id.hashCode();
return result;
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/BasicConfigValue.java
================================================
package software.coley.recaf.config;
import jakarta.annotation.Nonnull;
import software.coley.observables.Observable;
/**
* Basic implementation of {@link ConfigValue}.
*
* @param <T>
* Value type.
*
* @author Matt Coley
*/
public class BasicConfigValue<T> implements ConfigValue<T> {
private final String key;
private final Class<T> type;
private final Observable<T> observable;
private final boolean hidden;
/**
* @param key
* Value key.
* @param type
* Value type class.
* @param observable
* Observable of value.
*/
public BasicConfigValue(String key, Class<T> type, Observable<T> observable) {
this(key, type, observable, false);
}
/**
* @param key
* Value key.
* @param type
* Value type class.
* @param observable
* Observable of value.
* @param hidden
* Hidden flag.
*/
public BasicConfigValue(String key, Class<T> type, Observable<T> observable, boolean hidden) {
this.key = key;
this.type = type;
this.observable = observable;
this.hidden = hidden;
}
@Nonnull
@Override
public String getId() {
return key;
}
@Nonnull
@Override
public Class<T> getType() {
return type;
}
@Nonnull
@Override
public Observable<T> getObservable() {
return observable;
}
@Override
public boolean isHidden() {
return hidden;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BasicConfigValue<?> other = (BasicConfigValue<?>) o;
if (!key.equals(other.key)) return false;
return type.equals(other.type);
}
@Override
public int hashCode() {
int result = key.hashCode();
result = 31 * result + type.hashCode();
return result;
}
@Override
public String toString() {
return "BasicConfigValue{" +
"key='" + key + '\'' +
", type=" + type +
'}';
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/BasicMapConfigValue.java
================================================
package software.coley.recaf.config;
import jakarta.annotation.Nonnull;
import software.coley.observables.ObservableMap;
import java.util.Map;
/**
* Basic implementation of {@link ConfigMapValue}.
*
* @param <K>
* Map key type.
* @param <V>
* Map value type.
* @param <M>
* Map type.
*
* @author Matt Coley
*/
public class BasicMapConfigValue<K, V, M extends Map<K, V>> implements ConfigMapValue<K, V, M> {
private final String key;
private final Class<K> keyType;
private final Class<V> valueType;
private final Class<M> mapType;
private final ObservableMap<K, V, M> observable;
private final boolean hidden;
/**
* @param key
* Value key.
* @param type
* Value type class.
* @param observable
* Observable of value.
*/
@SuppressWarnings("rawtypes")
public BasicMapConfigValue(String key,
Class<? extends Map> type,
Class<K> keyType,
Class<V> valueType,
ObservableMap<K, V, M> observable) {
this(key, type, keyType, valueType, observable, false);
}
/**
* @param key
* Value key.
* @param type
* Value type class.
* @param observable
* Observable of value.
* @param hidden
* Hidden flag.
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public BasicMapConfigValue(String key,
Class<? extends Map> type,
Class<K> keyType,
Class<V> valueType,
ObservableMap<K, V, M> observable,
boolean hidden) {
this.key = key;
this.mapType = (Class<M>) type;
this.keyType = keyType;
this.valueType = valueType;
this.observable = observable;
this.hidden = hidden;
}
@Nonnull
@Override
public String getId() {
return key;
}
@Nonnull
@Override
public Class<M> getType() {
return mapType;
}
@Override
public Class<K> getKeyType() {
return keyType;
}
@Override
public Class<V> getValueType() {
return valueType;
}
@Nonnull
@Override
public ObservableMap<K, V, M> getObservable() {
return observable;
}
@Override
public boolean isHidden() {
return hidden;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BasicMapConfigValue<?, ?, ?> that = (BasicMapConfigValue<?, ?, ?>) o;
if (hidden != that.hidden) return false;
if (!key.equals(that.key)) return false;
if (!keyType.equals(that.keyType)) return false;
if (!valueType.equals(that.valueType)) return false;
if (!mapType.equals(that.mapType)) return false;
return observable.equals(that.observable);
}
@Override
public int hashCode() {
int result = key.hashCode();
result = 31 * result + keyType.hashCode();
result = 31 * result + valueType.hashCode();
result = 31 * result + mapType.hashCode();
result = 31 * result + observable.hashCode();
result = 31 * result + (hidden ? 1 : 0);
return result;
}
@Override
public String toString() {
return "BasicMapConfigValue{" +
"key='" + key + '\'' +
", keyType=" + keyType +
", valueType=" + valueType +
", mapType=" + mapType +
", observable=" + observable +
", hidden=" + hidden +
'}';
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigCollectionValue.java
================================================
package software.coley.recaf.config;
import java.util.Collection;
/**
* An option stored in a {@link ConfigContainer} object representing a collection.
*
* @param <T>
* Collection value type.
* @param <C>
* Collection type.
*
* @author Matt Coley
*/
public interface ConfigCollectionValue<T, C extends Collection<T>> extends ConfigValue<C> {
/**
* @return Collection type.
*/
Class<T> getItemType();
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigContainer.java
================================================
package software.coley.recaf.config;
import jakarta.annotation.Nonnull;
import jakarta.enterprise.context.ApplicationScoped;
import java.util.Map;
import static software.coley.recaf.config.ConfigGroups.PACKAGE_SPLIT;
/**
* Configurable object. Implementations will almost always want to use {@link ApplicationScoped} for their scope.
* This is so that the config container is shared between <i>all</i> instances of the item it is a config for.
*
* @author Matt Coley.
* @see ConfigValue Values within this container.
* @see ConfigGroups Values for {@link #getGroup()}.
*/
public interface ConfigContainer {
String CONFIG_SUFFIX = "-config";
/**
* @return Group ID the container belongs to.
*
* @see ConfigGroups For constant values.
*/
@Nonnull
String getGroup();
/**
* The unique ID of this container should be <i>globally</i> unique.
* The {@link #getGroup() group} does not act as an identifier prefix.
*
* @return Unique ID of this container.
*/
@Nonnull
String getId();
/**
* @return Combined {@link #getGroup()} and {@link #getId()}.
*/
@Nonnull
default String getGroupAndId() {
return getGroup() + PACKAGE_SPLIT + getId();
}
/**
* @return Values in the container.
*/
@Nonnull
Map<String, ConfigValue<?>> getValues();
/**
* @param value
* Value to get path of.
*
* @return Full path, scoped to this container.
*/
@Nonnull
default String getScopedId(ConfigValue<?> value) {
return getGroupAndId() + PACKAGE_SPLIT + value.getId();
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigGroups.java
================================================
package software.coley.recaf.config;
import software.coley.recaf.services.Service;
/**
* Constants for {@link ConfigContainer#getGroup()}.
*
* @author Matt Coley
*/
public final class ConfigGroups {
/**
* Used to split group into sections.
*/
public static final String PACKAGE_SPLIT = ".";
/**
* Group base for {@link Service} classes.
*/
public static final String SERVICE = "service";
/**
* Group for analyzing components.
*/
public static final String SERVICE_ANALYSIS = SERVICE + PACKAGE_SPLIT + "analysis";
/**
* Group for assembler components.
*/
public static final String SERVICE_ASSEMBLER = SERVICE + PACKAGE_SPLIT + "assembler";
/**
* Group for compiler components.
*/
public static final String SERVICE_COMPILE = SERVICE + PACKAGE_SPLIT + "compile";
/**
* Group for debug/attach components.
*/
public static final String SERVICE_DEBUG = SERVICE + PACKAGE_SPLIT + "debug";
/**
* Group for decompilation components.
*/
public static final String SERVICE_DECOMPILE = SERVICE + PACKAGE_SPLIT + "decompile";
/**
* Group for specific decompiler components.
*/
public static final String SERVICE_DECOMPILE_IMPL = SERVICE_DECOMPILE + PACKAGE_SPLIT + "impl";
/**
* Group for IO components.
*/
public static final String SERVICE_IO = SERVICE + PACKAGE_SPLIT + "io";
/**
* Group for mapping components.
*/
public static final String SERVICE_MAPPING = SERVICE + PACKAGE_SPLIT + "mapping";
/**
* Group for plugin components.
*/
public static final String SERVICE_PLUGIN = SERVICE + PACKAGE_SPLIT + "plugin";
/**
* Group for transformation components.
*/
public static final String SERVICE_TRANSFORM = SERVICE + PACKAGE_SPLIT + "transform";
/**
* Group base for UI classes.
*/
public static final String SERVICE_UI = SERVICE + PACKAGE_SPLIT + "ui";
/**
* Group for 3rd party.
* <br>
* Plugin registering new {@link ConfigContainer} instances should use this as the {@link ConfigContainer#getGroup()}.
* This group is given special treatment in the UI.
*/
public static final String EXTERNAL = "external";
private ConfigGroups() {
}
/**
* @param container
* Container to get packages from.
*
* @return Group packages.
*/
public static String[] getGroupPackages(ConfigContainer container) {
return container.getGroup().split('\\' + PACKAGE_SPLIT);
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigMapValue.java
================================================
package software.coley.recaf.config;
import java.util.Map;
/**
* An option stored in a {@link ConfigContainer} object representing a map.
*
* @param <K>
* Map key type.
* @param <V>
* Map value type.
* @param <M>
* Map type.
*
* @author Matt Coley
*/
public interface ConfigMapValue<K, V, M extends Map<K, V>> extends ConfigValue<M> {
/**
* @return Map key type.
*/
Class<K> getKeyType();
/**
* @return Map value type.
*/
Class<V> getValueType();
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigPersistence.java
================================================
package software.coley.recaf.config;
import jakarta.annotation.Nonnull;
/**
* Outline of persistence for {@link ConfigContainer}
*
* @author Matt Coley
*/
public interface ConfigPersistence {
/**
* @param container
* Container with values to save to persistent medium.
*/
void save(@Nonnull ConfigContainer container);
/**
* @param container
* Container with values to load from persistent medium.
*/
void load(@Nonnull ConfigContainer container);
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigValue.java
================================================
package software.coley.recaf.config;
import jakarta.annotation.Nonnull;
import software.coley.observables.Observable;
/**
* An option stored in a {@link ConfigContainer} object.
*
* @param <T>
* Value type.
*
* @author Matt Coley
*/
public interface ConfigValue<T> {
/**
* @return Unique ID of this value.
*/
@Nonnull
String getId();
/**
* @return Value type class.
*/
@Nonnull
Class<T> getType();
/**
* @return Observable of value.
*/
@Nonnull
Observable<T> getObservable();
/**
* @param value
* Value to set.
*/
default void setValue(@Nonnull T value) {
getObservable().setValue(value);
}
/**
* @return Current value.
*/
@Nonnull
default T getValue() {
return getObservable().getValue();
}
/**
* @return {@code true} for hidden values not to be shown to users <i>(Strictly in the UI)</i>.
*/
default boolean isHidden() {
return false;
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/config/RestoreAwareConfigContainer.java
================================================
package software.coley.recaf.config;
import software.coley.recaf.services.config.ConfigManager;
/**
* Outline of a config container that is aware of when its contents are restored.
*
* @author Matt Coley
*/
public interface RestoreAwareConfigContainer extends ConfigContainer {
/**
* Called when this container has its contents restored via {@link ConfigManager}.
*/
default void onRestore() {}
/**
* Called when this container was checked for contents via {@link ConfigManager} for restoration,
* but no local files were found and thus there was nothing to restore.
*/
default void onNoRestore() {}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/Accessed.java
================================================
package software.coley.recaf.info;
import software.coley.recaf.info.member.ClassMember;
import static java.lang.reflect.Modifier.*;
/**
* Outline of a class or member with access modifiers.
*
* @author Matt Coley
* @see ClassMember
* @see ClassInfo
*/
public interface Accessed {
/**
* @return Access modifiers.
*/
int getAccess();
/**
* @return {@code true} when this item's access modifiers contains {@code public}.
*/
default boolean hasPublicModifier() {
return hasModifierMask(PUBLIC);
}
/**
* @return {@code true} when this item's access modifiers contains {@code protected}.
*/
default boolean hasProtectedModifier() {
return hasModifierMask(PROTECTED);
}
/**
* @return {@code true} when this item's access modifiers contains {@code private}.
*/
default boolean hasPrivateModifier() {
return hasModifierMask(PRIVATE);
}
/**
* @return {@code true} when this item's access modifiers contains none of:
* {@code public}, {@code protected}, or {@code private}.
*/
default boolean hasPackagePrivateModifier() {
return hasNoneOfMask(PRIVATE | PROTECTED | PUBLIC);
}
/**
* @return {@code true} when this item's access modifiers contains {@code static}.
*/
default boolean hasStaticModifier() {
return hasModifierMask(STATIC);
}
/**
* @return {@code true} when this item's access modifiers contains {@code final}.
*/
default boolean hasFinalModifier() {
return hasModifierMask(FINAL);
}
/**
* @return {@code true} when this item's access modifiers contains {@code synchronized}.
*/
default boolean hasSynchronizedModifier() {
return hasModifierMask(SYNCHRONIZED);
}
/**
* @return {@code true} when this item's access modifiers contains {@code volatile}.
*/
default boolean hasVolatileModifier() {
return hasModifierMask(VOLATILE);
}
/**
* @return {@code true} when this item's access modifiers contains {@code transient}.
*/
default boolean hasTransientModifier() {
return hasModifierMask(TRANSIENT);
}
/**
* @return {@code true} when this item's access modifiers contains {@code native}.
*/
default boolean hasNativeModifier() {
return hasModifierMask(NATIVE);
}
/**
* @return {@code true} when this item's access modifiers contains {@code enum}.
*/
default boolean hasEnumModifier() {
return hasModifierMask(0x00004000);
}
/**
* @return {@code true} when this item's access modifiers contains {@code annotation}.
*/
default boolean hasAnnotationModifier() {
return hasModifierMask(0x00002000);
}
/**
* @return {@code true} when this item's access modifiers contains {@code interface}.
*/
default boolean hasInterfaceModifier() {
return hasModifierMask(INTERFACE);
}
/**
* @return {@code true} when this item's access modifiers contains {@code module}.
*/
default boolean hasModuleModifier() {
return hasModifierMask(0x8000);
}
/**
* @return {@code true} when this item's access modifiers contains {@code abstract}.
*/
default boolean hasAbstractModifier() {
return hasModifierMask(ABSTRACT);
}
/**
* @return {@code true} when this item's access modifiers contains {@code strictfp}.
*/
default boolean hasStrictFpModifier() {
return hasModifierMask(STRICT);
}
/**
* @return {@code true} when this item's access modifiers contains {@code varargs}.
*/
default boolean hasVarargsModifier() {
return hasModifierMask(0x00000080);
}
/**
* @return {@code true} when this item's access modifiers contains {@code bridge}.
*/
default boolean hasBridgeModifier() {
return hasModifierMask(0x00000040);
}
/**
* @return {@code true} when this item's access modifiers contains {@code synthetic}.
*/
default boolean hasSyntheticModifier() {
return hasModifierMask(0x00001000);
}
/**
* @return {@code true} when {@link #hasSyntheticModifier()} or {@link #hasBridgeModifier()} are {@code true}.
*/
default boolean isCompilerGenerated() {
return hasBridgeModifier() || hasSyntheticModifier();
}
/**
* @param mask
* Mask to check.
*
* @return {@code true} if the access modifiers of this item match the given mask.
*/
default boolean hasModifierMask(int mask) {
return (getAccess() & mask) == mask;
}
/**
* @param modifiers
* Modifiers to check.
*
* @return {@code true} if the access modifiers of this item contain all the given modifiers.
*/
default boolean hasAllModifiers(int... modifiers) {
for (int modifier : modifiers)
if (!hasModifierMask(modifier))
return false;
return true;
}
/**
* @param modifiers
* Modifiers to check.
*
* @return {@code true} if the access modifiers of this item contain any the given modifiers.
*/
default boolean hasAnyModifiers(int... modifiers) {
for (int modifier : modifiers)
if (hasModifierMask(modifier))
return true;
return false;
}
/**
* @param mask
* Mask to check.
*
* @return {@code true} if the access modifiers of this item do not match the mask.
*/
default boolean hasNoneOfMask(int mask) {
return (getAccess() & mask) == 0;
}
/**
* @param modifiers
* Modifiers to check.
*
* @return {@code true} if the access modifiers of this item contain none the given modifiers.
*/
default boolean hasNoneOfModifiers(int... modifiers) {
for (int modifier : modifiers)
if (!hasNoneOfMask(modifier))
return false;
return true;
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/AndroidChunkFileInfo.java
================================================
package software.coley.recaf.info;
import com.google.devrel.gmscore.tools.apk.arsc.BinaryResourceFile;
import jakarta.annotation.Nonnull;
/**
* Outline of files that utilize the Android chunk format.
*
* @author Matt Coley
* @see BinaryXmlFileInfo For {@code AndroidManifest.xml} contents.
* @see ArscFileInfo For {@code resources.arsc} contents.
*/
public interface AndroidChunkFileInfo extends FileInfo {
/**
* @return Model representation of the chunk file.
*/
@Nonnull
BinaryResourceFile getChunkModel();
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/AndroidClassInfo.java
================================================
package software.coley.recaf.info;
import jakarta.annotation.Nonnull;
import software.coley.recaf.info.builder.AndroidClassInfoBuilder;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* Outline of an Android class.
*
* @author Matt Coley
*/
public interface AndroidClassInfo extends ClassInfo {
/**
* @return {@code true} when {@link #asJvmClass()} can act as a mapping operation.
* {@code false} when mapping to JVM classes is unsupported.
*/
default boolean canMapToJvmClass() {
return false;
}
/**
* @return New builder wrapping this class information.
*/
@Nonnull
default AndroidClassInfoBuilder toAndroidBuilder() {
return new AndroidClassInfoBuilder(this);
}
@Override
default void acceptIfJvmClass(@Nonnull Consumer<JvmClassInfo> action) {
// no-op
}
@Override
default void acceptIfAndroidClass(@Nonnull Consumer<AndroidClassInfo> action) {
action.accept(this);
}
@Override
default boolean testIfJvmClass(@Nonnull Predicate<JvmClassInfo> predicate) {
return false;
}
@Override
default boolean testIfAndroidClass(@Nonnull Predicate<AndroidClassInfo> predicate) {
return predicate.test(this);
}
@Nonnull
@Override
default JvmClassInfo asJvmClass() {
throw new IllegalStateException("Android class cannot be cast to JVM class");
}
@Nonnull
@Override
default AndroidClassInfo asAndroidClass() {
return this;
}
@Override
default boolean isJvmClass() {
return false;
}
@Override
default boolean isAndroidClass() {
return true;
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/ApkFileInfo.java
================================================
package software.coley.recaf.info;
/**
* Outline of an APK Android file container.
*
* @author Matt Coley
*/
public interface ApkFileInfo extends ZipFileInfo {
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/ArscFileInfo.java
================================================
package software.coley.recaf.info;
import jakarta.annotation.Nonnull;
import software.coley.android.xml.AndroidResourceProvider;
/**
* Outline of a ARSC file, used by Android APK's.
*
* @author Matt Coley
*/
public interface ArscFileInfo extends AndroidChunkFileInfo {
/**
* Standard name of ARSC resource file in APK files.
*/
String NAME = "resources.arsc";
/**
* @return Resource information extracted from the ARSC file contents.
*/
@Nonnull
AndroidResourceProvider getResourceInfo();
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/AudioFileInfo.java
================================================
package software.coley.recaf.info;
import jakarta.annotation.Nonnull;
/**
* Outline of an audio file.
*
* @author Matt Coley
*/
public interface AudioFileInfo extends FileInfo {
@Nonnull
@Override
default AudioFileInfo asAudioFile() {
return this;
}
@Override
default boolean isAudioFile() {
return true;
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicAndroidChunkFileInfo.java
================================================
package software.coley.recaf.info;
import com.google.devrel.gmscore.tools.apk.arsc.BinaryResourceFile;
import jakarta.annotation.Nonnull;
import software.coley.recaf.info.builder.ChunkFileInfoBuilder;
/**
* Common implementation for {@link BasicBinaryXmlFileInfo} and {@link BasicArscFileInfo}.
*
* @author Matt Coley
*/
public class BasicAndroidChunkFileInfo extends BasicFileInfo implements AndroidChunkFileInfo {
private BinaryResourceFile resourceFile;
/**
* @param builder
* Builder to pull information from.
*/
public BasicAndroidChunkFileInfo(ChunkFileInfoBuilder<?> builder) {
super(builder);
}
@Nonnull
@Override
public BinaryResourceFile getChunkModel() {
if (resourceFile == null)
resourceFile = new BinaryResourceFile(getRawContent());
return resourceFile;
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicAndroidClassInfo.java
================================================
package software.coley.recaf.info;
import com.android.tools.r8.graph.DexProgramClass;
import jakarta.annotation.Nonnull;
import org.objectweb.asm.ClassReader;
import software.coley.dextranslator.Options;
import software.coley.dextranslator.ir.ConversionException;
import software.coley.dextranslator.model.ApplicationData;
import software.coley.recaf.info.builder.AndroidClassInfoBuilder;
import software.coley.recaf.info.builder.JvmClassInfoBuilder;
import java.io.IOException;
import java.util.Collections;
/**
* Basic Android class info implementation.
*
* @author Matt Coley
*/
public class BasicAndroidClassInfo extends BasicClassInfo implements AndroidClassInfo {
private final DexProgramClass dexClass;
private JvmClassInfo converted;
/**
* @param builder
* Builder to pull info from.
*/
public BasicAndroidClassInfo(@Nonnull AndroidClassInfoBuilder builder) {
super(builder);
dexClass = builder.getDexClass();
}
@Override
public boolean canMapToJvmClass() {
// See below
return true;
}
/**
* @return Translation into JVM class.
*/
@Nonnull
@Override
public JvmClassInfo asJvmClass() {
if (converted == null) {
// This is an expensive operation, so it's best to make other thread access wait until it is done and
// then use the singular return value.
synchronized (this) {
// If there are 2+ requests here, and we let one through to completion, when the others are let in
// this value should be computed then.
if (converted != null)
return converted;
try {
String name = getName();
ApplicationData data = ApplicationData.fromProgramClasses(Collections.singleton(dexClass));
data.setOperationOptionsProvider(() -> new Options()
.enableLoadStoreOptimization()
.setLenient(true)
.setReplaceInvalidMethodBodies(true));
byte[] convertedBytecode = data.exportToJvmClass(name);
if (convertedBytecode == null)
throw new IllegalStateException("Failed to convert Dalvik model of " + name + " to JVM bytecode, " +
"conversion results did not include type name.");
ClassReader reader = new ClassReader(convertedBytecode);
converted = new JvmClassInfoBuilder(reader).build();
} catch (ConversionException | IOException ex) {
throw new IllegalStateException(ex);
}
}
}
return converted;
}
/**
* @return Backing program class node.
*/
@Nonnull
public DexProgramClass getDexClass() {
return dexClass;
}
@Override
public String toString() {
return "Android class: " + getName();
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicApkFileInfo.java
================================================
package software.coley.recaf.info;
import software.coley.recaf.info.builder.ZipFileInfoBuilder;
/**
* Basic implementation of an Android APK file info.
*
* @author Matt Coley
*/
public class BasicApkFileInfo extends BasicZipFileInfo implements ApkFileInfo {
/**
* @param builder
* Builder to pull information from.
*/
public BasicApkFileInfo(ZipFileInfoBuilder builder) {
super(builder);
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicArscFileInfo.java
================================================
package software.coley.recaf.info;
import jakarta.annotation.Nonnull;
import org.slf4j.Logger;
import software.coley.android.xml.AndroidResourceProvider;
import software.coley.android.xml.NoopAndroidResourceProvider;
import software.coley.recaf.analytics.logging.Logging;
import software.coley.recaf.info.builder.ArscFileInfoBuilder;
import software.coley.recaf.util.android.AndroidRes;
/**
* Basic implementation of ARSC file info.
*
* @author Matt Coley
*/
public class BasicArscFileInfo extends BasicAndroidChunkFileInfo implements ArscFileInfo {
private static final Logger logger = Logging.get(BasicArscFileInfo.class);
private AndroidResourceProvider res;
/**
* @param builder
* Builder to pull information from.
*/
public BasicArscFileInfo(ArscFileInfoBuilder builder) {
super(builder);
}
@Nonnull
@Override
public AndroidResourceProvider getResourceInfo() {
if (res == null)
try {
res = AndroidRes.fromArsc(getChunkModel());
} catch (Throwable t) {
logger.error("Failed to decode '{}', will use an empty model instead", getName(), t);
res = NoopAndroidResourceProvider.INSTANCE;
}
return res;
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicAudioFileInfo.java
================================================
package software.coley.recaf.info;
import software.coley.recaf.info.builder.AudioFileInfoBuilder;
/**
* Basic implementation of an audio file info.
*
* @author Matt Coley
*/
public class BasicAudioFileInfo extends BasicFileInfo implements AudioFileInfo {
/**
* @param builder
* Builder to pull information from.
*/
public BasicAudioFileInfo(AudioFileInfoBuilder builder) {
super(builder);
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicBinaryXmlFileInfo.java
================================================
package software.coley.recaf.info;
import software.coley.recaf.info.builder.BinaryXmlFileInfoBuilder;
/**
* Basic implementation of binary XML file info.
*
* @author Matt Coley
*/
public class BasicBinaryXmlFileInfo extends BasicAndroidChunkFileInfo implements BinaryXmlFileInfo {
/**
* @param builder
* Builder to pull information from.
*/
public BasicBinaryXmlFileInfo(BinaryXmlFileInfoBuilder builder) {
super(builder);
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicClassInfo.java
================================================
package software.coley.recaf.info;
import jakarta.annotation.Nonnull;
import software.coley.recaf.info.annotation.AnnotationInfo;
import software.coley.recaf.info.annotation.TypeAnnotationInfo;
import software.coley.recaf.info.builder.AbstractClassInfoBuilder;
import software.coley.recaf.info.member.BasicMember;
import software.coley.recaf.info.member.FieldMember;
import software.coley.recaf.info.member.LocalVariable;
import software.coley.recaf.info.member.MethodMember;
import software.coley.recaf.info.properties.Property;
import software.coley.recaf.info.properties.PropertyContainer;
import software.coley.recaf.util.Types;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Stream;
/**
* Basic implementation of class info.
*
* @author Matt Coley
* @see BasicJvmClassInfo
* @see BasicAndroidClassInfo
*/
public abstract class BasicClassInfo implements ClassInfo {
private static final int SIGS_VALID = 1;
private static final int SIGS_INVALID = 0;
private static final int SIGS_UNKNOWN = -1;
private final PropertyContainer properties;
private final String name;
private final String superName;
private final List<String> interfaces;
private final int access;
private final String signature;
private final String sourceFileName;
private final List<AnnotationInfo> annotations;
private final List<TypeAnnotationInfo> typeAnnotations;
private final String outerClassName;
private final String outerMethodName;
private final String outerMethodDescriptor;
private final List<InnerClassInfo> innerClasses;
private final List<FieldMember> fields;
private final List<MethodMember> methods;
private List<String> breadcrumbs;
private int sigCheck = SIGS_UNKNOWN;
protected BasicClassInfo(@Nonnull AbstractClassInfoBuilder<?> builder) {
this(builder.getName(),
builder.getSuperName(),
builder.getInterfaces(),
builder.getAccess(),
builder.getSignature(),
builder.getSourceFileName(),
builder.getAnnotations(),
builder.getTypeAnnotations(),
builder.getOuterClassName(),
builder.getOuterMethodName(),
builder.getOuterMethodDescriptor(),
builder.getInnerClasses(),
builder.getFields(),
builder.getMethods(),
builder.getPropertyContainer());
}
protected BasicClassInfo(@Nonnull String name, String superName, @Nonnull List<String> interfaces, int access,
String signature, String sourceFileName,
@Nonnull List<AnnotationInfo> annotations,
@Nonnull List<TypeAnnotationInfo> typeAnnotations,
String outerClassName, String outerMethodName,
String outerMethodDescriptor,
@Nonnull List<InnerClassInfo> innerClasses,
@Nonnull List<FieldMember> fields, @Nonnull List<MethodMember> methods,
@Nonnull PropertyContainer properties) {
this.name = name;
this.superName = superName;
this.interfaces = interfaces;
this.access = access;
this.signature = signature;
this.sourceFileName = sourceFileName;
this.annotations = annotations;
this.typeAnnotations = typeAnnotations;
this.outerClassName = outerClassName;
this.outerMethodName = outerMethodName;
this.outerMethodDescriptor = outerMethodDescriptor;
this.innerClasses = innerClasses;
this.fields = fields;
this.methods = methods;
this.properties = properties;
// Link fields/methods to self
Stream.concat(fields.stream(), methods.stream())
.filter(member -> member instanceof BasicMember)
.map(member -> (BasicMember) member)
.forEach(member -> member.setDeclaringClass(this));
}
@Nonnull
@Override
public String getName() {
return name;
}
@Override
public String getSuperName() {
return superName;
}
@Nonnull
@Override
public List<String> getInterfaces() {
return interfaces;
}
@Override
public int getAccess() {
return access;
}
@Override
public String getSignature() {
return signature;
}
@Override
public String getSourceFileName() {
return sourceFileName;
}
@Nonnull
@Override
public List<AnnotationInfo> getAnnotations() {
return annotations;
}
@Nonnull
@Override
public List<TypeAnnotationInfo> getTypeAnnotations() {
return typeAnnotations;
}
@Override
public String getOuterClassName() {
return outerClassName;
}
@Override
public String getOuterMethodName() {
return outerMethodName;
}
@Override
public String getOuterMethodDescriptor() {
return outerMethodDescriptor;
}
@Nonnull
@Override
public List<String> getOuterClassBreadcrumbs() {
if (breadcrumbs == null) {
String currentOuter = getOuterClassName();
if (currentOuter == null)
return breadcrumbs = Collections.emptyList();
int maxOuterDepth = 10;
List<String> list = new ArrayList<>();
int counter = 0;
while (currentOuter != null) {
if (++counter > maxOuterDepth) {
list.clear(); // assuming some obfuscator is at work, so breadcrumbs might be invalid.
break;
}
list.addFirst(currentOuter);
String targetOuter = currentOuter;
currentOuter = innerClasses.stream()
.filter(i -> i.getInnerClassName().equals(targetOuter) && i.getOuterClassName() != null)
.map(InnerClassInfo::getOuterClassName)
.findFirst().orElse(null);
}
breadcrumbs = Collections.unmodifiableList(list);
}
return breadcrumbs;
}
@Nonnull
@Override
public List<InnerClassInfo> getInnerClasses() {
return innerClasses;
}
@Nonnull
@Override
public List<FieldMember> getFields() {
return fields;
}
@Nonnull
@Override
public List<MethodMember> getMethods() {
return methods;
}
@Override
public <V> void setProperty(Property<V> property) {
properties.setProperty(property);
}
@Override
public void removeProperty(String key) {
properties.removeProperty(key);
}
@Nonnull
@Override
public Map<String, Property<?>> getProperties() {
return properties.getProperties();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null) return false;
if (o instanceof ClassInfo other) {
// NOTE: Do NOT consider the properties since contents of the map can point back to this instance
// or our containing resource, causing a cycle.
if (access != other.getAccess()) return false;
if (!name.equals(other.getName())) return false;
if (!Objects.equals(superName, other.getSuperName())) return false;
if (!interfaces.equals(other.getInterfaces())) return false;
if (!Objects.equals(signature, other.getSignature())) return false;
if (!Objects.equals(sourceFileName, other.getSourceFileName())) return false;
if (!annotations.equals(other.getAnnotations())) return false;
if (!typeAnnotations.equals(other.getTypeAnnotations())) return false;
if (!Objects.equals(outerClassName, other.getOuterClassName())) return false;
if (!Objects.equals(outerMethodName, other.getOuterMethodName())) return false;
if (!Objects.equals(outerMethodDescriptor, other.getOuterMethodDescriptor())) return false;
if (!innerClasses.equals(other.getInnerClasses())) return false;
if (!fields.equals(other.getFields())) return false;
return methods.equals(other.getMethods());
}
return false;
}
@Override
public int hashCode() {
// NOTE: Do NOT consider the properties since contents of the map can point back to this instance
// or our containing resource, causing a cycle.
int result = name.hashCode();
result = 31 * result + (superName != null ? superName.hashCode() : 0);
result = 31 * result + interfaces.hashCode();
result = 31 * result + access;
result = 31 * result + (signature != null ? signature.hashCode() : 0);
result = 31 * result + (sourceFileName != null ? sourceFileName.hashCode() : 0);
result = 31 * result + annotations.hashCode();
result = 31 * result + typeAnnotations.hashCode();
result = 31 * result + (outerClassName != null ? outerClassName.hashCode() : 0);
result = 31 * result + (outerMethodName != null ? outerMethodName.hashCode() : 0);
result = 31 * result + (outerMethodDescriptor != null ? outerMethodDescriptor.hashCode() : 0);
result = 31 * result + innerClasses.hashCode();
result = 31 * result + fields.hashCode();
result = 31 * result + methods.hashCode();
return result;
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicDexFileInfo.java
================================================
package software.coley.recaf.info;
import software.coley.recaf.info.builder.DexFileInfoBuilder;
/**
* Basic implementation of an Android DEX file info.
*
* @author Matt Coley
*/
public class BasicDexFileInfo extends BasicFileInfo implements DexFileInfo {
/**
* @param builder
* Builder to pull information from.
*/
public BasicDexFileInfo(DexFileInfoBuilder builder) {
super(builder);
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicFileInfo.java
================================================
package software.coley.recaf.info;
import jakarta.annotation.Nonnull;
import software.coley.recaf.info.builder.FileInfoBuilder;
import software.coley.recaf.info.properties.Property;
import software.coley.recaf.info.properties.PropertyContainer;
import java.util.Arrays;
import java.util.Map;
/**
* Basic implementation of file info.
*
* @author Matt Coley
*/
public class BasicFileInfo implements FileInfo {
private final PropertyContainer properties;
private final String name;
private final byte[] rawContent;
public BasicFileInfo(@Nonnull FileInfoBuilder<?> builder) {
this(builder.getName(),
builder.getRawContent(),
builder.getProperties());
}
/**
* @param name
* File name/path.
* @param rawContent
* Raw contents of file.
* @param properties
* Assorted properties.
*/
public BasicFileInfo(@Nonnull String name, @Nonnull byte[] rawContent, @Nonnull PropertyContainer properties) {
this.name = name;
this.rawContent = rawContent;
this.properties = properties;
}
@Nonnull
@Override
public byte[] getRawContent() {
return rawContent;
}
@Nonnull
@Override
public String getName() {
return name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null) return false;
if (o instanceof FileInfo other) {
if (!name.equals(other.getName())) return false;
return Arrays.equals(rawContent, other.getRawContent());
}
return false;
}
@Override
public int hashCode() {
int result = name.hashCode();
result = 31 * result + Arrays.hashCode(rawContent);
return result;
}
@Override
public <V> void setProperty(Property<V> property) {
properties.setProperty(property);
}
@Override
public void removeProperty(String key) {
properties.removeProperty(key);
}
@Nonnull
@Override
public Map<String, Property<?>> getProperties() {
return properties.getProperties();
}
@Override
public String toString() {
return name;
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicImageFileInfo.java
================================================
package software.coley.recaf.info;
import software.coley.recaf.info.builder.ImageFileInfoBuilder;
/**
* Basic implementation of an image file info.
*
* @author Matt Coley
*/
public class BasicImageFileInfo extends BasicFileInfo implements ImageFileInfo {
/**
* @param builder
* Builder to pull information from.
*/
public BasicImageFileInfo(ImageFileInfoBuilder builder) {
super(builder);
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicInnerClassInfo.java
================================================
package software.coley.recaf.info;
import jakarta.annotation.Nonnull;
import java.util.Objects;
/**
* Basic implementation of inner class info.
*
* @author Matt Coley
*/
public class BasicInnerClassInfo implements InnerClassInfo {
private final String outerDeclaringClassName; // Recaf specific, not modeling class spec
private final String innerClassName;
private final String outerClassName;
private final String innerName;
private final int access;
private String simpleName;
/**
* @param outerDeclaringClassName
* Declaring class name,
* @param innerClassName
* Inner name.
* @param outerClassName
* Outer name.
* @param innerName
* Local inner name.
* @param access
* Inner class flags originally declared.
*/
public BasicInnerClassInfo(String outerDeclaringClassName, String innerClassName,
String outerClassName, String innerName, int access) {
this.outerDeclaringClassName = outerDeclaringClassName;
this.innerClassName = innerClassName;
this.outerClassName = outerClassName;
this.innerName = innerName;
this.access = access;
}
@Override
public int getAccess() {
return access;
}
@Nonnull
@Override
public String getOuterDeclaringClassName() {
return outerDeclaringClassName;
}
@Nonnull
@Override
public String getInnerClassName() {
return innerClassName;
}
@Override
public String getOuterClassName() {
return outerClassName;
}
@Override
public String getInnerName() {
return innerName;
}
@Nonnull
@Override
public String getSimpleName() {
// Cache simple name computation
if (simpleName == null) simpleName = InnerClassInfo.super.getSimpleName();
return simpleName;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null) return false;
if (o instanceof InnerClassInfo inner) {
if (access != inner.getAccess()) return false;
if (!innerClassName.equals(inner.getInnerClassName())) return false;
if (!Objects.equals(outerClassName, inner.getOuterClassName())) return false;
return Objects.equals(innerName, inner.getInnerName());
}
return false;
}
@Override
public int hashCode() {
int result = innerClassName.hashCode();
result = 31 * result + (outerClassName != null ? outerClassName.hashCode() : 0);
result = 31 * result + (innerName != null ? innerName.hashCode() : 0);
result = 31 * result + access;
return result;
}
@Override
public String toString() {
return "Inner class: " + getSimpleName();
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicJModFileInfo.java
================================================
package software.coley.recaf.info;
import software.coley.recaf.info.builder.JModFileInfoBuilder;
/**
* Basic implementation of JMod file info.
*
* @author Matt Coley
*/
public class BasicJModFileInfo extends BasicZipFileInfo implements JModFileInfo {
/**
* @param builder
* Builder to pull information from.
*/
public BasicJModFileInfo(JModFileInfoBuilder builder) {
super(builder);
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicJarFileInfo.java
================================================
package software.coley.recaf.info;
import software.coley.recaf.info.builder.JarFileInfoBuilder;
/**
* Basic implementation of JAR file info.
*
* @author Matt Coley
*/
public class BasicJarFileInfo extends BasicZipFileInfo implements JarFileInfo {
/**
* @param builder
* Builder to pull information from.
*/
public BasicJarFileInfo(JarFileInfoBuilder builder) {
super(builder);
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicJvmClassInfo.java
================================================
package software.coley.recaf.info;
import jakarta.annotation.Nonnull;
import org.objectweb.asm.ClassReader;
import software.coley.recaf.info.builder.JvmClassInfoBuilder;
import java.util.Arrays;
/**
* Basic JVM class info implementation.
*
* @author Matt Coley
*/
public class BasicJvmClassInfo extends BasicClassInfo implements JvmClassInfo {
private final byte[] bytecode;
private final int version;
private ClassReader reader;
/**
* @param builder
* Builder to pull info from.
*/
public BasicJvmClassInfo(@Nonnull JvmClassInfoBuilder builder) {
super(builder);
this.bytecode = builder.getBytecode();
this.version = builder.getVersion();
}
@Nonnull
@Override
public byte[] getBytecode() {
return bytecode;
}
@Nonnull
@Override
public ClassReader getClassReader() {
if (reader == null)
reader = new ClassReader(bytecode);
return reader;
}
@Override
public int getVersion() {
return version;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null) return false;
if (o instanceof JvmClassInfo other) {
if (version != other.getVersion()) return false;
return Arrays.equals(bytecode, other.getBytecode());
} else if (!super.equals(o)) {
return false;
}
return false;
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + Arrays.hashCode(bytecode);
result = 31 * result + version;
return result;
}
@Override
public String toString() {
return "JVM class: " + getName();
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicModulesFileInfo.java
================================================
package software.coley.recaf.info;
import software.coley.recaf.info.builder.ModulesFileInfoBuilder;
/**
* Basic implementation of Modules file info.
*
* @author Matt Coley
*/
public class BasicModulesFileInfo extends BasicFileInfo implements ModulesFileInfo {
/**
* @param builder
* Builder to pull information from.
*/
public BasicModulesFileInfo(ModulesFileInfoBuilder builder) {
super(builder);
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicNativeLibraryFileInfo.java
================================================
package software.coley.recaf.info;
import software.coley.recaf.info.builder.NativeLibraryFileInfoBuilder;
/**
* Basic implementation of a native-library file info.
*
* @author Matt Coley
*/
public class BasicNativeLibraryFileInfo extends BasicFileInfo implements NativeLibraryFileInfo {
/**
* @param builder
* Builder to pull information from.
*/
public BasicNativeLibraryFileInfo(NativeLibraryFileInfoBuilder builder) {
super(builder);
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicTextFileInfo.java
================================================
package software.coley.recaf.info;
import jakarta.annotation.Nonnull;
import software.coley.recaf.info.builder.TextFileInfoBuilder;
import java.nio.charset.Charset;
/**
* Basic implementation of text file info.
*
* @author Matt Coley
*/
public class BasicTextFileInfo extends BasicFileInfo implements TextFileInfo {
private final Charset charset;
private final String text;
private String[] lines;
/**
* @param builder
* Builder to pull information from.
*/
public BasicTextFileInfo(@Nonnull TextFileInfoBuilder builder) {
super(builder);
text = builder.getText();
charset = builder.getCharset();
}
@Nonnull
@Override
public String getText() {
return text;
}
@Nonnull
@Override
public String[] getTextLines() {
if (lines == null)
lines = getText().lines().toArray(String[]::new);
return lines;
}
@Nonnull
@Override
public Charset getCharset() {
return charset;
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicVideoFileInfo.java
================================================
package software.coley.recaf.info;
import software.coley.recaf.info.builder.VideoFileInfoBuilder;
/**
* Basic implementation of a video file info.
*
* @author Matt Coley
*/
public class BasicVideoFileInfo extends BasicFileInfo implements VideoFileInfo {
/**
* @param builder
* Builder to pull information from.
*/
public BasicVideoFileInfo(VideoFileInfoBuilder builder) {
super(builder);
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicWarFileInfo.java
================================================
package software.coley.recaf.info;
import software.coley.recaf.info.builder.WarFileInfoBuilder;
/**
* Basic implementation of WAR file info.
*
* @author Matt Coley
*/
public class BasicWarFileInfo extends BasicZipFileInfo implements WarFileInfo {
/**
* @param builder
* Builder to pull information from.
*/
public BasicWarFileInfo(WarFileInfoBuilder builder) {
super(builder);
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicZipFileInfo.java
================================================
package software.coley.recaf.info;
import software.coley.recaf.info.builder.ZipFileInfoBuilder;
/**
* Basic implementation of ZIP file info.
*
* @author Matt Coley
*/
public class BasicZipFileInfo extends BasicFileInfo implements ZipFileInfo {
/**
* @param builder
* Builder to pull information from.
*/
public BasicZipFileInfo(ZipFileInfoBuilder builder) {
super(builder);
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/BinaryXmlFileInfo.java
================================================
package software.coley.recaf.info;
/**
* Outline of a binary XML file, used by Android APK's.
*
* @author Matt Coley
*/
public interface BinaryXmlFileInfo extends AndroidChunkFileInfo {
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/ClassInfo.java
================================================
package software.coley.recaf.info;
import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import software.coley.recaf.info.annotation.Annotated;
import software.coley.recaf.info.member.ClassMember;
import software.coley.recaf.info.member.FieldMember;
import software.coley.recaf.info.member.MethodMember;
import software.coley.recaf.util.Types;
import software.coley.recaf.util.visitors.IllegalSignatureRemovingVisitor;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;
/**
* Outline of a class.
*
* @author Matt Coley
* @see JvmClassInfo For JVM classes.
* @see AndroidClassInfo For Android classes.
*/
public interface ClassInfo extends Info, Annotated, Accessed {
/**
* @return Name of the source file the class was compiled from.
* May be {@code null} when there is no debug data attached to the class.
*/
@Nullable
String getSourceFileName();
/**
* @return List of implemented interfaces.
*/
@Nonnull
List<String> getInterfaces();
/**
* @return Super-name of the class.
* May be {@code null} for {@link java.lang.annotation.Annotation} and {@code module-info} classes.
*/
@Nullable
String getSuperName();
/**
* @return Package the class resides in.
* May be {@code null} for classes in the default package.
*/
@Nullable
default String getPackageName() {
String className = getName();
int packageIndex = className.lastIndexOf('/');
if (packageIndex <= 0) return null;
return className.substring(0, packageIndex);
}
/**
* @return {@code true} when the class name has no package.
*/
default boolean isInDefaultPackage() {
return getPackageName() == null;
}
/**
* @return Stream of all parent types, where the {@link #getSuperName()} is first if present,
* followed by any {@link #getInterfaces()}.
*/
@Nonnull
default Stream<String> parentTypesStream() {
return Stream.concat(
Stream.ofNullable(getSuperName()),
getInterfaces().stream()
);
}
/**
* @return Signature containing generic information. May be {@code null}.
*/
@Nullable
String getSignature();
/**
* @return Name of outer class that this is declared in, if this is an inner class.
* {@code null} when this class is not an inner class.
*/
@Nullable
String getOuterClassName();
/**
* @return Name of the outer method that this is declared in, as an anonymous inner class.
* {@code null} when this class is not an inner anonymous class.
*
* @see #getOuterMethodDescriptor() Descriptor of outer method
*/
@Nullable
String getOuterMethodName();
/**
* @return Descriptor of the outer method that this is declared in, as an anonymous inner class.
* {@code null} when this class is not an inner anonymous class.
*
* @see #getOuterMethodName() Name of outer method.
*/
@Nullable
String getOuterMethodDescriptor();
/**
* Breadcrumbs of the outer class.
* This List <strong>MUST</strong> be sorted in order of the outermost first.
* The last element is the outer of the class itself.
* <br>
* For an example, if our class is 'C' then this list will be {@code [foo/A, foo/A$B]}:
* <pre>{@code
* package foo;
*
* class A {
* class B {
* class C {} // This class
* }
* }
* }</pre>
*
* @return Breadcrumbs of the outer class.
*/
@Nonnull
List<String> getOuterClassBreadcrumbs();
/**
* @return List of declared inner classes.
*/
@Nonnull
List<InnerClassInfo> getInnerClasses();
/**
* Gets a named inner class by the local name.
* Given the following example, you would pass {@code "Bar"} or even {@code "FizzBuzz"}:
* <pre>{@code
* class Foo {
* class Bar {
* class FizzBuzz {}
* }
* }
* }</pre>
* Because anonymous inner classes do not have a name declared, they cannot be yielded here.
*
* @param innerName
* Local name of inner class.
*
* @return Inner class of the matching name, or {@code null} if no such inner exists.
*/
@Nullable
default InnerClassInfo getInnerClassByInnerName(@Nonnull String innerName) {
for (InnerClassInfo innerClass : getInnerClasses())
if (innerName.equals(innerClass.getInnerName()))
return innerClass;
return null;
}
/**
* @return {@code true} when this class is an inner class of another class.
*/
default boolean isInnerClass() {
return getOuterClassName() != null || getOuterMethodName() != null;
}
/**
* @param className
* Name of a supposed outer class.
*
* @return {@code true} if this class is an inner class of the given outer class.
*/
default boolean isInnerClassOf(@Nonnull String className) {
// If we don't start with that class name, we can't possibly be an inner class.
if (!getName().startsWith(className + "$"))
return false;
return getOuterClassBreadcrumbs().contains(className);
}
/**
* @return {@code true} when this class is an anonymous inner class of another class.
*/
default boolean isAnonymousInnerClass() {
// Check if the 'full' name of the inner 'InnerClassName' is the current class (entry representing ourselves)
// Then if the 'OuterClassName' is null, this means our class does not expose a name because it is anonymous.
return getInnerClasses().stream()
.anyMatch(inner -> inner.getInnerClassName().equals(getName()) && inner.getOuterClassName() == null);
}
/**
* @return List of declared fields.
*/
@Nonnull
List<FieldMember> getFields();
/**
* @return List of declared methods.
*/
@Nonnull
List<MethodMember> getMethods();
/**
* @return Stream of declared fields.
*/
@Nonnull
default Stream<FieldMember> fieldStream() {
return Stream.of(this).flatMap(self -> self.getFields().stream());
}
/**
* @return Stream of declared methods.
*/
@Nonnull
default Stream<MethodMember> methodStream() {
return Stream.of(this).flatMap(self -> self.getMethods().stream());
}
/**
* @return Stream of declared fields and methods.
*/
@Nonnull
default Stream<ClassMember> fieldAndMethodStream() {
return Stream.concat(fieldStream(), methodStream());
}
/**
* Do note that there can be multiple fields with one name if there are different descriptors for each.
* To differentiate properly, please use {@link #getDeclaredField(String, String)}.
*
* @param name
* Field name.
*
* @return First matching field definition, or {@code null} if none were found.
*/
@Nullable
default FieldMember getFirstDeclaredFieldByName(@Nonnull String name) {
return fieldStream()
.filter(f -> f.getName().equals(name))
.findFirst().orElse(null);
}
/**
* @param name
* Field name.
* @param descriptor
* Field descriptor.
*
* @return Field matching definition, or {@code null} if none were found.
*/
@Nullable
default FieldMember getDeclaredField(@Nonnull String name, @Nonnull String descriptor) {
return fieldStream()
.filter(f -> f.getName().equals(name) && f.getDescriptor().equals(descriptor))
.findFirst().orElse(null);
}
/**
* @param name
* Method name.
* @param descriptor
* Method descriptor.
*
* @return Method matching definition, or {@code null} if none were found.
*/
@Nullable
default MethodMember getDeclaredMethod(@Nonnull String name, @Nonnull String descriptor) {
return methodStream()
.filter(m -> m.getName().equals(name) && m.getDescriptor().equals(descriptor))
.findFirst().orElse(null);
}
/**
* Do note that there can be multiple methods with one name if there are different method descriptors for each.
* To differentiate properly, please use {@link #getDeclaredMethod(String, String)}.
*
* @param name
* Method name.
*
* @return First matching method definition, or {@code null} if none were found.
*/
@Nullable
default MethodMember getFirstDeclaredMethodByName(@Nonnull String name) {
return methodStream()
.filter(m -> m.getName().equals(name))
.findFirst().orElse(null);
}
/**
* @param action
* Action to run if this is a JVM class.
*/
void acceptIfJvmClass(@Nonnull Consumer<JvmClassInfo> action);
/**
* @param action
* Action to run if this is an Android class.
*/
void acceptIfAndroidClass(@Nonnull Consumer<AndroidClassInfo> action);
/**
* @param action
* Action to run.
*/
default void acceptClass(@Nonnull Consumer<ClassInfo> action) {
action.accept(this);
}
/**
* @param predicate
* Predicate to run if this is a JVM class.
*
* @return {@code true} when the predicate passes.
* {@code false} when it does not, or the class is not a JVM class.
*/
boolean testIfJvmClass(@Nonnull Predicate<JvmClassInfo> predicate);
/**
* @param predicate
* Predicate to run if this is an Android class.
*
* @return {@code true} when the predicate passes.
* {@code false} when it does not, or the class is not an Android class.
*/
boolean testIfAndroidClass(@Nonnull Predicate<AndroidClassInfo> predicate);
/**
* @param predicate
* Predicate to run.
*
* @return Predicate evaluation.
*/
default boolean testClass(@Nonnull Predicate<ClassInfo> predicate) {
return predicate.test(this);
}
/**
* @param function
* Mapping function.
* @param <R>
* Function return type.
*
* @return Mapped value.
*/
default <R> R mapClass(@Nonnull Function<ClassInfo, R> function) {
return function.apply(this);
}
@Nonnull
@Override
default ClassInfo asClass() {
return this;
}
@Nonnull
@Override
default FileInfo asFile() {
throw new IllegalStateException("Class cannot be cast to generic file");
}
/**
* @return Self cast to JVM class.
*/
@Nonnull
JvmClassInfo asJvmClass();
/**
* @return Self cast to Android class.
*/
@Nonnull
AndroidClassInfo asAndroidClass();
@Override
default boolean isClass() {
return true;
}
@Override
default boolean isFile() {
return false;
}
/**
* @return {@code true} if self is a JVM class.
*/
boolean isJvmClass();
/**
* @return {@code true} if self is an Android class.
*/
boolean isAndroidClass();
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/DexFileInfo.java
================================================
package software.coley.recaf.info;
/**
* Outline of an Android dex file.
*
* @author Matt Coley
*/
public interface DexFileInfo extends FileInfo {
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/FileInfo.java
================================================
package software.coley.recaf.info;
import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import software.coley.recaf.info.builder.FileInfoBuilder;
/**
* Outline of a file.
*
* @author Matt Coley
*/
public interface FileInfo extends Info {
/**
* @return New builder wrapping this file information.
*/
@Nonnull
default FileInfoBuilder<?> toFileBuilder() {
return FileInfoBuilder.forFile(this);
}
/**
* @return Raw bytes of file content.
*/
@Nonnull
byte[] getRawContent();
/**
* @return File extension of {@link #getName() the file name}, if any exists.
*/
@Nullable
default String getFileExtension() {
String fileName = getName();
int i = fileName.indexOf('.') + 1;
if (i > 0)
return fileName.toLowerCase().substring(i);
return null;
}
/**
* @return Directory the file resides in.
* May be {@code null} for files in the root directory.
*/
@Nullable
default String getDirectoryName() {
String fileName = getName();
int directoryIndex = fileName.lastIndexOf('/');
if (directoryIndex <= 0) return null;
return fileName.substring(0, directoryIndex);
}
@Nonnull
@Override
default ClassInfo asClass() {
throw new IllegalStateException("File cannot be cast to generic class");
}
@Nonnull
@Override
default FileInfo asFile() {
return this;
}
/**
* @return Self cast to text file.
*/
@Nonnull
default TextFileInfo asTextFile() {
throw new IllegalStateException("Non-text file cannot be cast to text file");
}
/**
* @return Self cast to image file.
*/
@Nonnull
default ImageFileInfo asImageFile() {
throw new IllegalStateException("Non-image file cannot be cast to image file");
}
/**
* @return Self cast to audio file.
*/
@Nonnull
default AudioFileInfo asAudioFile() {
throw new IllegalStateException("Non-audio file cannot be cast to audio file");
}
/**
* @return Self cast to video file.
*/
@Nonnull
default VideoFileInfo asVideoFile() {
throw new IllegalStateException("Non-video file cannot be cast to video file");
}
/**
* @return Self cast to video file.
*/
@Nonnull
default NativeLibraryFileInfo asNativeLibraryFile() {
throw new IllegalStateException("Non-native-library file cannot be cast to native-library file");
}
/**
* @return Self cast to zip file.
*/
@Nonnull
default ZipFileInfo asZipFile() {
throw new IllegalStateException("Non-zip file cannot be cast to zip file");
}
@Override
default boolean isClass() {
return false;
}
@Override
default boolean isFile() {
return true;
}
/**
* @return {@code true} if self is a text file.
*/
default boolean isTextFile() {
return false;
}
/**
* @return {@code true} if self is an image file.
*/
default boolean isImageFile() {
return false;
}
/**
* @return {@code true} if self is an audio file.
*/
default boolean isAudioFile() {
return false;
}
/**
* @return {@code true} if self is a video file.
*/
default boolean isVideoFile() {
return false;
}
/**
* @return {@code true} if self is a native-library file.
*/
default boolean isNativeLibraryFile() {
return false;
}
/**
* @return {@code true} if self is a zip file.
*/
default boolean isZipFile() {
return false;
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/ImageFileInfo.java
================================================
package software.coley.recaf.info;
import jakarta.annotation.Nonnull;
/**
* Outline of an image file.
*
* @author Matt Coley
*/
public interface ImageFileInfo extends FileInfo {
@Nonnull
@Override
default ImageFileInfo asImageFile() {
return this;
}
@Override
default boolean isImageFile() {
return true;
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/Info.java
================================================
package software.coley.recaf.info;
import jakarta.annotation.Nonnull;
import software.coley.recaf.info.properties.PropertyContainer;
/**
* Outline of all info types.
*
* @author Matt Coley
*/
public interface Info extends Named, PropertyContainer {
/**
* @return Self cast to general class.
*/
@Nonnull
ClassInfo asClass();
/**
* @return Self cast to general file.
*/
@Nonnull
FileInfo asFile();
/**
* @return {@code true} if self is a general class.
*/
boolean isClass();
/**
* @return {@code true} if self is a general file.
*/
boolean isFile();
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/InnerClassInfo.java
================================================
package software.coley.recaf.info;
import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
/**
* Outline of an inner class for a declaring {@link ClassInfo}.
* <br>
* <b>Important note:</b> Oracle's Java Virtual Machine implementation
* does not check the consistency of an InnerClasses attribute against a class
* file representing a class or interface referenced by the attribute.
*
* @author Matt Coley
* @author Amejonah
*/
public interface InnerClassInfo extends Accessed, Named {
@Nonnull
@Override
default String getName() {
return getInnerClassName();
}
/**
* @return The name of the outer declaring class for this inner class.
*/
@Nonnull
String getOuterDeclaringClassName();
/**
* Given the following example, the inner name is {@code Apple$Worm}.
* <pre>
* class Apple {
* class Worm {}
* }
* </pre>
*
* @return The internal name of an inner class.
*/
@Nonnull
String getInnerClassName();
/**
* Given the following example, the inner name is {@code Apple}.
* <pre>
* class Apple {
* class Worm {}
* }
* </pre>
*
* @return The internal name of the class to which the inner class belongs.
* May be {@code null} for anonymous classes.
*/
@Nullable
String getOuterClassName();
/**
* Given the following example, the inner name is {@code Worm}.
* <pre>
* class Apple {
* class Worm {}
* }
* </pre>
*
* @return The <i>(simple)</i> name of the inner class inside its enclosing class.
* May be {@code null} for anonymous inner classes.
*/
@Nullable
String getInnerName();
/**
* There are some wierd cases where there can be inner-class entries of classes defined by other classes.
* You can use this to filter those cases out.
*
* @return {@code true} when this inner-class entry denotes an inner-class
* reference to a class defined in another class.
*/
default boolean isExternalReference() {
return !getInnerClassName().startsWith(getOuterDeclaringClassName());
}
/**
* @return The access modifiers of the inner class as originally declared in the enclosing class.
*/
default int getInnerAccess() {
return getAccess();
}
/**
* @return Either {@link #getInnerName()} if not {@code null},
* otherwise the last "part" (after last $ or /) of {@link #getOuterClassName()}.
*/
@Nonnull
default String getSimpleName() {
// Check for inner name
String innerName = getInnerName();
if (innerName != null) return innerName;
// Substring from outer class prefix
String outerDeclaringClass = getOuterDeclaringClassName();
String outerName = getOuterClassName();
if (outerName != null) {
int outerDeclaringLength = outerDeclaringClass.length();
int lastIndex = 0;
int endIndex = Math.min(outerDeclaringLength, outerName.length());
for (; lastIndex < endIndex; lastIndex++) {
if (outerDeclaringClass.charAt(lastIndex) != outerName.charAt(lastIndex)) break;
}
// Edge case handling with outer name
if (lastIndex == 0)
return outerName;
else if (outerName.startsWith("$", lastIndex))
lastIndex++;
return outerName.substring(lastIndex);
}
// Class entry is for anonymous class.
String innerClassName = getInnerClassName();
return "Anonymous '" + innerClassName.substring(innerClassName.lastIndexOf('$') + 1) + "'";
}
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/JModFileInfo.java
================================================
package software.coley.recaf.info;
/**
* Outline of a JVM JMod file.
* These files are found at {@code %JAVA%/jmods/}.
*
* @author Matt Coley
*/
public interface JModFileInfo extends ZipFileInfo {
/**
* Classes in the JMod archive are prefixed with this path.
*/
String CLASSES_PREFIX = "classes/";
}
================================================
FILE: recaf-core/src/main/java/software/coley/recaf/info/JarFileInfo.java
================================================
package software.coley.recaf.info;
/**
* Outline of a JAR file container.
*
* @author Matt Coley
*/
public interface JarFileInfo extends ZipFileInfo {
/**
* Multi-release JARs prefix class names with this, plus the target version.
* For example: Multiple versions of {@code foo/Bar.class}
* <ul>
* <li>{@code foo/Bar.cl
gitextract_kfvnwn9t/
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── feature_request.md
│ │ └── other.md
│ └── workflows/
│ └── build.yml
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── PRIMER.md
├── PULL_REQUEST_TEMPLATE.md
├── README.md
├── build.gradle
├── codecov.yml
├── docs/
│ ├── README.md
│ └── index.html
├── gradle/
│ ├── libs.versions.toml
│ ├── tasks.gradle
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── jitpack.yml
├── libs/
│ ├── README.md
│ └── kotlin-metadata.jar
├── recaf-core/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── software/
│ │ │ └── coley/
│ │ │ └── recaf/
│ │ │ ├── Bootstrap.java
│ │ │ ├── ExitCodes.java
│ │ │ ├── ExitDebugLoggingHook.java
│ │ │ ├── Recaf.java
│ │ │ ├── RecafConstants.java
│ │ │ ├── analytics/
│ │ │ │ ├── SystemInformation.java
│ │ │ │ └── logging/
│ │ │ │ ├── DebuggingLogger.java
│ │ │ │ ├── InterceptingLogger.java
│ │ │ │ ├── LogConsumer.java
│ │ │ │ ├── Logging.java
│ │ │ │ └── RecafLoggingFilter.java
│ │ │ ├── behavior/
│ │ │ │ ├── Closing.java
│ │ │ │ ├── PriorityKeys.java
│ │ │ │ └── PrioritySortable.java
│ │ │ ├── cdi/
│ │ │ │ ├── EagerInitialization.java
│ │ │ │ ├── EagerInitializationExtension.java
│ │ │ │ ├── InitializationEvent.java
│ │ │ │ ├── InitializationStage.java
│ │ │ │ └── UiInitializationEvent.java
│ │ │ ├── config/
│ │ │ │ ├── BasicCollectionConfigValue.java
│ │ │ │ ├── BasicConfigContainer.java
│ │ │ │ ├── BasicConfigValue.java
│ │ │ │ ├── BasicMapConfigValue.java
│ │ │ │ ├── ConfigCollectionValue.java
│ │ │ │ ├── ConfigContainer.java
│ │ │ │ ├── ConfigGroups.java
│ │ │ │ ├── ConfigMapValue.java
│ │ │ │ ├── ConfigPersistence.java
│ │ │ │ ├── ConfigValue.java
│ │ │ │ └── RestoreAwareConfigContainer.java
│ │ │ ├── info/
│ │ │ │ ├── Accessed.java
│ │ │ │ ├── AndroidChunkFileInfo.java
│ │ │ │ ├── AndroidClassInfo.java
│ │ │ │ ├── ApkFileInfo.java
│ │ │ │ ├── ArscFileInfo.java
│ │ │ │ ├── AudioFileInfo.java
│ │ │ │ ├── BasicAndroidChunkFileInfo.java
│ │ │ │ ├── BasicAndroidClassInfo.java
│ │ │ │ ├── BasicApkFileInfo.java
│ │ │ │ ├── BasicArscFileInfo.java
│ │ │ │ ├── BasicAudioFileInfo.java
│ │ │ │ ├── BasicBinaryXmlFileInfo.java
│ │ │ │ ├── BasicClassInfo.java
│ │ │ │ ├── BasicDexFileInfo.java
│ │ │ │ ├── BasicFileInfo.java
│ │ │ │ ├── BasicImageFileInfo.java
│ │ │ │ ├── BasicInnerClassInfo.java
│ │ │ │ ├── BasicJModFileInfo.java
│ │ │ │ ├── BasicJarFileInfo.java
│ │ │ │ ├── BasicJvmClassInfo.java
│ │ │ │ ├── BasicModulesFileInfo.java
│ │ │ │ ├── BasicNativeLibraryFileInfo.java
│ │ │ │ ├── BasicTextFileInfo.java
│ │ │ │ ├── BasicVideoFileInfo.java
│ │ │ │ ├── BasicWarFileInfo.java
│ │ │ │ ├── BasicZipFileInfo.java
│ │ │ │ ├── BinaryXmlFileInfo.java
│ │ │ │ ├── ClassInfo.java
│ │ │ │ ├── DexFileInfo.java
│ │ │ │ ├── FileInfo.java
│ │ │ │ ├── ImageFileInfo.java
│ │ │ │ ├── Info.java
│ │ │ │ ├── InnerClassInfo.java
│ │ │ │ ├── JModFileInfo.java
│ │ │ │ ├── JarFileInfo.java
│ │ │ │ ├── JvmClassInfo.java
│ │ │ │ ├── ModulesFileInfo.java
│ │ │ │ ├── Named.java
│ │ │ │ ├── NativeLibraryFileInfo.java
│ │ │ │ ├── StubClassInfo.java
│ │ │ │ ├── StubFieldMember.java
│ │ │ │ ├── StubFileInfo.java
│ │ │ │ ├── StubMember.java
│ │ │ │ ├── StubMethodMember.java
│ │ │ │ ├── TextFileInfo.java
│ │ │ │ ├── VideoFileInfo.java
│ │ │ │ ├── WarFileInfo.java
│ │ │ │ ├── ZipFileInfo.java
│ │ │ │ ├── annotation/
│ │ │ │ │ ├── Annotated.java
│ │ │ │ │ ├── AnnotationArrayReference.java
│ │ │ │ │ ├── AnnotationElement.java
│ │ │ │ │ ├── AnnotationEnumReference.java
│ │ │ │ │ ├── AnnotationInfo.java
│ │ │ │ │ ├── BasicAnnotationArrayReference.java
│ │ │ │ │ ├── BasicAnnotationElement.java
│ │ │ │ │ ├── BasicAnnotationEnumReference.java
│ │ │ │ │ ├── BasicAnnotationInfo.java
│ │ │ │ │ ├── BasicTypeAnnotationInfo.java
│ │ │ │ │ └── TypeAnnotationInfo.java
│ │ │ │ ├── builder/
│ │ │ │ │ ├── AbstractClassInfoBuilder.java
│ │ │ │ │ ├── AndroidClassInfoBuilder.java
│ │ │ │ │ ├── ApkFileInfoBuilder.java
│ │ │ │ │ ├── ArscFileInfoBuilder.java
│ │ │ │ │ ├── AudioFileInfoBuilder.java
│ │ │ │ │ ├── BinaryXmlFileInfoBuilder.java
│ │ │ │ │ ├── ChunkFileInfoBuilder.java
│ │ │ │ │ ├── DexFileInfoBuilder.java
│ │ │ │ │ ├── FileInfoBuilder.java
│ │ │ │ │ ├── ImageFileInfoBuilder.java
│ │ │ │ │ ├── JModFileInfoBuilder.java
│ │ │ │ │ ├── JarFileInfoBuilder.java
│ │ │ │ │ ├── JvmClassInfoBuilder.java
│ │ │ │ │ ├── ModulesFileInfoBuilder.java
│ │ │ │ │ ├── NativeLibraryFileInfoBuilder.java
│ │ │ │ │ ├── TextFileInfoBuilder.java
│ │ │ │ │ ├── VideoFileInfoBuilder.java
│ │ │ │ │ ├── WarFileInfoBuilder.java
│ │ │ │ │ └── ZipFileInfoBuilder.java
│ │ │ │ ├── member/
│ │ │ │ │ ├── BasicFieldMember.java
│ │ │ │ │ ├── BasicLocalVariable.java
│ │ │ │ │ ├── BasicMember.java
│ │ │ │ │ ├── BasicMethodMember.java
│ │ │ │ │ ├── ClassMember.java
│ │ │ │ │ ├── FieldMember.java
│ │ │ │ │ ├── LocalVariable.java
│ │ │ │ │ └── MethodMember.java
│ │ │ │ └── properties/
│ │ │ │ ├── BasicProperty.java
│ │ │ │ ├── BasicPropertyContainer.java
│ │ │ │ ├── Property.java
│ │ │ │ ├── PropertyContainer.java
│ │ │ │ └── builtin/
│ │ │ │ ├── BinaryXmlDecodedProperty.java
│ │ │ │ ├── CachedDecompileProperty.java
│ │ │ │ ├── HasMappedReferenceProperty.java
│ │ │ │ ├── IllegalClassSuspectProperty.java
│ │ │ │ ├── InputFilePathProperty.java
│ │ │ │ ├── MemberIndexAcceleratorProperty.java
│ │ │ │ ├── OriginalClassNameProperty.java
│ │ │ │ ├── PathOriginalNameProperty.java
│ │ │ │ ├── PathPrefixProperty.java
│ │ │ │ ├── PathSuffixProperty.java
│ │ │ │ ├── ReferencedClassesProperty.java
│ │ │ │ ├── RemapOriginTaskProperty.java
│ │ │ │ ├── RemoteClassloaderProperty.java
│ │ │ │ ├── StringDefinitionsProperty.java
│ │ │ │ ├── ThrowableProperty.java
│ │ │ │ ├── UnknownAttributesProperty.java
│ │ │ │ ├── VersionedClassProperty.java
│ │ │ │ ├── ZipAccessTimeProperty.java
│ │ │ │ ├── ZipCommentProperty.java
│ │ │ │ ├── ZipCompressionProperty.java
│ │ │ │ ├── ZipCreationTimeProperty.java
│ │ │ │ ├── ZipEntryIndexProperty.java
│ │ │ │ ├── ZipMarkerProperty.java
│ │ │ │ ├── ZipModificationTimeProperty.java
│ │ │ │ └── ZipPrefixDataProperty.java
│ │ │ ├── launch/
│ │ │ │ ├── LaunchArguments.java
│ │ │ │ ├── LaunchCommand.java
│ │ │ │ └── LaunchHandler.java
│ │ │ ├── path/
│ │ │ │ ├── AbstractPathNode.java
│ │ │ │ ├── AnnotationPathNode.java
│ │ │ │ ├── BundlePathNode.java
│ │ │ │ ├── CatchPathNode.java
│ │ │ │ ├── ClassMemberPathNode.java
│ │ │ │ ├── ClassPathNode.java
│ │ │ │ ├── DirectoryPathNode.java
│ │ │ │ ├── EmbeddedResourceContainerPathNode.java
│ │ │ │ ├── FilePathNode.java
│ │ │ │ ├── IncompletePathException.java
│ │ │ │ ├── InnerClassPathNode.java
│ │ │ │ ├── InstructionPathNode.java
│ │ │ │ ├── LineNumberPathNode.java
│ │ │ │ ├── LocalVariablePathNode.java
│ │ │ │ ├── PathNode.java
│ │ │ │ ├── PathNodes.java
│ │ │ │ ├── ResourcePathNode.java
│ │ │ │ ├── ThrowsPathNode.java
│ │ │ │ └── WorkspacePathNode.java
│ │ │ ├── plugin/
│ │ │ │ ├── Plugin.java
│ │ │ │ └── PluginInformation.java
│ │ │ ├── services/
│ │ │ │ ├── Service.java
│ │ │ │ ├── ServiceConfig.java
│ │ │ │ ├── assembler/
│ │ │ │ │ ├── AbstractAssemblerPipeline.java
│ │ │ │ │ ├── AndroidAssemblerPipeline.java
│ │ │ │ │ ├── AndroidAssemblerPipelineConfig.java
│ │ │ │ │ ├── AssemblerPipeline.java
│ │ │ │ │ ├── AssemblerPipelineConfig.java
│ │ │ │ │ ├── AssemblerPipelineGeneralConfig.java
│ │ │ │ │ ├── AssemblerPipelineManager.java
│ │ │ │ │ ├── ExpressionCompileException.java
│ │ │ │ │ ├── ExpressionCompiler.java
│ │ │ │ │ ├── ExpressionResult.java
│ │ │ │ │ ├── JvmAssemblerPipeline.java
│ │ │ │ │ ├── JvmAssemblerPipelineConfig.java
│ │ │ │ │ ├── Snippet.java
│ │ │ │ │ ├── SnippetListener.java
│ │ │ │ │ ├── SnippetManager.java
│ │ │ │ │ ├── SnippetManagerConfig.java
│ │ │ │ │ └── WorkspaceFieldValueLookup.java
│ │ │ │ ├── attach/
│ │ │ │ │ ├── AttachManager.java
│ │ │ │ │ ├── AttachManagerConfig.java
│ │ │ │ │ ├── BasicAttachManager.java
│ │ │ │ │ ├── JmxBeanServerConnection.java
│ │ │ │ │ ├── NamedMBeanInfo.java
│ │ │ │ │ └── PostScanListener.java
│ │ │ │ ├── callgraph/
│ │ │ │ │ ├── CachedLinkResolver.java
│ │ │ │ │ ├── CallGraph.java
│ │ │ │ │ ├── CallGraphConfig.java
│ │ │ │ │ ├── CallGraphService.java
│ │ │ │ │ ├── ClassLookup.java
│ │ │ │ │ ├── ClassMethodsContainer.java
│ │ │ │ │ ├── LinkedClass.java
│ │ │ │ │ ├── MethodRef.java
│ │ │ │ │ └── MethodVertex.java
│ │ │ │ ├── comment/
│ │ │ │ │ ├── ClassComments.java
│ │ │ │ │ ├── CommentContainerListener.java
│ │ │ │ │ ├── CommentInsertingVisitor.java
│ │ │ │ │ ├── CommentKey.java
│ │ │ │ │ ├── CommentManager.java
│ │ │ │ │ ├── CommentManagerConfig.java
│ │ │ │ │ ├── CommentUpdateListener.java
│ │ │ │ │ ├── DelegatingClassComments.java
│ │ │ │ │ ├── DelegatingWorkspaceComments.java
│ │ │ │ │ ├── PersistClassComments.java
│ │ │ │ │ ├── PersistWorkspaceComments.java
│ │ │ │ │ └── WorkspaceComments.java
│ │ │ │ ├── compile/
│ │ │ │ │ ├── CompileMap.java
│ │ │ │ │ ├── CompilerDiagnostic.java
│ │ │ │ │ ├── CompilerResult.java
│ │ │ │ │ ├── ForwardingListener.java
│ │ │ │ │ ├── JavacArguments.java
│ │ │ │ │ ├── JavacArgumentsBuilder.java
│ │ │ │ │ ├── JavacCompiler.java
│ │ │ │ │ ├── JavacCompilerConfig.java
│ │ │ │ │ ├── JavacListener.java
│ │ │ │ │ ├── ResourceVirtualJavaFileObject.java
│ │ │ │ │ ├── VirtualFileManager.java
│ │ │ │ │ ├── VirtualJavaFileObject.java
│ │ │ │ │ ├── VirtualUnitMap.java
│ │ │ │ │ └── stub/
│ │ │ │ │ ├── ClassStubGenerator.java
│ │ │ │ │ ├── ExpressionHostingClassStubGenerator.java
│ │ │ │ │ └── InnerClassStubGenerator.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── ConfigManager.java
│ │ │ │ │ ├── ConfigManagerConfig.java
│ │ │ │ │ └── ManagedConfigListener.java
│ │ │ │ ├── decompile/
│ │ │ │ │ ├── AbstractAndroidDecompiler.java
│ │ │ │ │ ├── AbstractDecompiler.java
│ │ │ │ │ ├── AbstractJvmDecompiler.java
│ │ │ │ │ ├── AndroidDecompiler.java
│ │ │ │ │ ├── BaseDecompilerConfig.java
│ │ │ │ │ ├── DecompileResult.java
│ │ │ │ │ ├── Decompiler.java
│ │ │ │ │ ├── DecompilerConfig.java
│ │ │ │ │ ├── DecompilerManager.java
│ │ │ │ │ ├── DecompilerManagerConfig.java
│ │ │ │ │ ├── JvmDecompiler.java
│ │ │ │ │ ├── NoopAndroidDecompiler.java
│ │ │ │ │ ├── NoopDecompilerConfig.java
│ │ │ │ │ ├── NoopJvmDecompiler.java
│ │ │ │ │ ├── cfr/
│ │ │ │ │ │ ├── CfrConfig.java
│ │ │ │ │ │ ├── CfrDecompiler.java
│ │ │ │ │ │ ├── ClassSource.java
│ │ │ │ │ │ └── SinkFactoryImpl.java
│ │ │ │ │ ├── fallback/
│ │ │ │ │ │ ├── FallbackConfig.java
│ │ │ │ │ │ ├── FallbackDecompiler.java
│ │ │ │ │ │ └── print/
│ │ │ │ │ │ ├── ClassPrinter.java
│ │ │ │ │ │ ├── MethodPrinter.java
│ │ │ │ │ │ ├── PrintUtils.java
│ │ │ │ │ │ └── Printer.java
│ │ │ │ │ ├── filter/
│ │ │ │ │ │ ├── JvmBytecodeFilter.java
│ │ │ │ │ │ └── OutputTextFilter.java
│ │ │ │ │ ├── procyon/
│ │ │ │ │ │ ├── ProcyonConfig.java
│ │ │ │ │ │ ├── ProcyonDecompiler.java
│ │ │ │ │ │ └── WorkspaceTypeLoader.java
│ │ │ │ │ └── vineflower/
│ │ │ │ │ ├── BaseSource.java
│ │ │ │ │ ├── ClassSource.java
│ │ │ │ │ ├── DecompiledOutputSink.java
│ │ │ │ │ ├── DummyResultSaver.java
│ │ │ │ │ ├── LibrarySource.java
│ │ │ │ │ ├── VineflowerConfig.java
│ │ │ │ │ ├── VineflowerDecompiler.java
│ │ │ │ │ ├── VineflowerLogger.java
│ │ │ │ │ └── WorkspaceEntriesCache.java
│ │ │ │ ├── deobfuscation/
│ │ │ │ │ └── transform/
│ │ │ │ │ ├── generic/
│ │ │ │ │ │ ├── CallResultInliningTransformer.java
│ │ │ │ │ │ ├── CycleClassRemovingTransformer.java
│ │ │ │ │ │ ├── DeadCodeRemovingTransformer.java
│ │ │ │ │ │ ├── DuplicateAnnotationRemovingTransformer.java
│ │ │ │ │ │ ├── DuplicateCatchMergingTransformer.java
│ │ │ │ │ │ ├── EnumNameRestorationTransformer.java
│ │ │ │ │ │ ├── ExceptionCollectionTransformer.java
│ │ │ │ │ │ ├── FrameRemovingTransformer.java
│ │ │ │ │ │ ├── GotoInliningTransformer.java
│ │ │ │ │ │ ├── IllegalAnnotationRemovingTransformer.java
│ │ │ │ │ │ ├── IllegalNameMappingTransformer.java
│ │ │ │ │ │ ├── IllegalSignatureRemovingTransformer.java
│ │ │ │ │ │ ├── IllegalVarargsRemovingTransformer.java
│ │ │ │ │ │ ├── KotlinMetadataCollectionTransformer.java
│ │ │ │ │ │ ├── KotlinNameRestorationTransformer.java
│ │ │ │ │ │ ├── LongAnnotationRemovingTransformer.java
│ │ │ │ │ │ ├── LongExceptionRemovingTransformer.java
│ │ │ │ │ │ ├── OpaqueConstantFoldingTransformer.java
│ │ │ │ │ │ ├── OpaquePredicateFoldingTransformer.java
│ │ │ │ │ │ ├── RedundantTryCatchRemovingTransformer.java
│ │ │ │ │ │ ├── SourceNameRestorationTransformer.java
│ │ │ │ │ │ ├── StaticValueCollectionTransformer.java
│ │ │ │ │ │ ├── StaticValueInliningTransformer.java
│ │ │ │ │ │ ├── UnknownAttributeRemovingTransformer.java
│ │ │ │ │ │ ├── VariableFoldingTransformer.java
│ │ │ │ │ │ └── VariableTableNormalizingTransformer.java
│ │ │ │ │ └── specific/
│ │ │ │ │ └── DashOpaqueSeedFoldingTransformer.java
│ │ │ │ ├── file/
│ │ │ │ │ └── RecafDirectoriesConfig.java
│ │ │ │ ├── inheritance/
│ │ │ │ │ ├── ClassPathNodeProvider.java
│ │ │ │ │ ├── InheritanceGraph.java
│ │ │ │ │ ├── InheritanceGraphService.java
│ │ │ │ │ ├── InheritanceGraphServiceConfig.java
│ │ │ │ │ └── InheritanceVertex.java
│ │ │ │ ├── json/
│ │ │ │ │ ├── GsonProvider.java
│ │ │ │ │ └── GsonProviderConfig.java
│ │ │ │ ├── mapping/
│ │ │ │ │ ├── BasicMappingsRemapper.java
│ │ │ │ │ ├── IntermediateMappings.java
│ │ │ │ │ ├── MappingApplicationListener.java
│ │ │ │ │ ├── MappingApplier.java
│ │ │ │ │ ├── MappingApplierConfig.java
│ │ │ │ │ ├── MappingApplierService.java
│ │ │ │ │ ├── MappingListeners.java
│ │ │ │ │ ├── MappingListenersConfig.java
│ │ │ │ │ ├── MappingResults.java
│ │ │ │ │ ├── Mappings.java
│ │ │ │ │ ├── MappingsAdapter.java
│ │ │ │ │ ├── UniqueKeyMappings.java
│ │ │ │ │ ├── WorkspaceBackedRemapper.java
│ │ │ │ │ ├── WorkspaceClassRemapper.java
│ │ │ │ │ ├── aggregate/
│ │ │ │ │ │ ├── AggregateMappingManager.java
│ │ │ │ │ │ ├── AggregateMappingManagerConfig.java
│ │ │ │ │ │ ├── AggregatedMappings.java
│ │ │ │ │ │ └── AggregatedMappingsListener.java
│ │ │ │ │ ├── data/
│ │ │ │ │ │ ├── AbstractMappingKey.java
│ │ │ │ │ │ ├── ClassMapping.java
│ │ │ │ │ │ ├── ClassMappingKey.java
│ │ │ │ │ │ ├── FieldMapping.java
│ │ │ │ │ │ ├── FieldMappingKey.java
│ │ │ │ │ │ ├── MappingKey.java
│ │ │ │ │ │ ├── MemberMapping.java
│ │ │ │ │ │ ├── MethodMapping.java
│ │ │ │ │ │ ├── MethodMappingKey.java
│ │ │ │ │ │ ├── VariableMapping.java
│ │ │ │ │ │ └── VariableMappingKey.java
│ │ │ │ │ ├── format/
│ │ │ │ │ │ ├── AbstractMappingFileFormat.java
│ │ │ │ │ │ ├── EnigmaMappings.java
│ │ │ │ │ │ ├── InvalidMappingException.java
│ │ │ │ │ │ ├── JadxMappings.java
│ │ │ │ │ │ ├── MappingFileFormat.java
│ │ │ │ │ │ ├── MappingFormatManager.java
│ │ │ │ │ │ ├── MappingFormatManagerConfig.java
│ │ │ │ │ │ ├── MappingTreeReader.java
│ │ │ │ │ │ ├── ProguardMappings.java
│ │ │ │ │ │ ├── SimpleMappings.java
│ │ │ │ │ │ ├── SrgMappings.java
│ │ │ │ │ │ ├── TinyV1Mappings.java
│ │ │ │ │ │ └── TinyV2Mappings.java
│ │ │ │ │ └── gen/
│ │ │ │ │ ├── MappingGenerator.java
│ │ │ │ │ ├── MappingGeneratorConfig.java
│ │ │ │ │ ├── filter/
│ │ │ │ │ │ ├── ExcludeClassesFilter.java
│ │ │ │ │ │ ├── ExcludeEnumMethodsFilter.java
│ │ │ │ │ │ ├── ExcludeExistingMappedFilter.java
│ │ │ │ │ │ ├── ExcludeModifiersNameFilter.java
│ │ │ │ │ │ ├── ExcludeNameFilter.java
│ │ │ │ │ │ ├── IncludeClassesFilter.java
│ │ │ │ │ │ ├── IncludeKeywordNameFilter.java
│ │ │ │ │ │ ├── IncludeLongNameFilter.java
│ │ │ │ │ │ ├── IncludeModifiersNameFilter.java
│ │ │ │ │ │ ├── IncludeNameFilter.java
│ │ │ │ │ │ ├── IncludeNonAsciiNameFilter.java
│ │ │ │ │ │ ├── IncludeNonJavaIdentifierNameFilter.java
│ │ │ │ │ │ ├── IncludeWhitespaceNameFilter.java
│ │ │ │ │ │ └── NameGeneratorFilter.java
│ │ │ │ │ └── naming/
│ │ │ │ │ ├── AbstractNameGeneratorProvider.java
│ │ │ │ │ ├── AlphabetNameGenerator.java
│ │ │ │ │ ├── AlphabetNameGeneratorProvider.java
│ │ │ │ │ ├── DeconflictingNameGenerator.java
│ │ │ │ │ ├── IncrementingNameGenerator.java
│ │ │ │ │ ├── IncrementingNameGeneratorProvider.java
│ │ │ │ │ ├── NameGenerator.java
│ │ │ │ │ ├── NameGeneratorProvider.java
│ │ │ │ │ ├── NameGeneratorProviders.java
│ │ │ │ │ └── NameGeneratorProvidersConfig.java
│ │ │ │ ├── phantom/
│ │ │ │ │ ├── GeneratedPhantomWorkspaceResource.java
│ │ │ │ │ ├── JPhantomGenerator.java
│ │ │ │ │ ├── JPhantomGeneratorConfig.java
│ │ │ │ │ ├── PhantomGenerationException.java
│ │ │ │ │ └── PhantomGenerator.java
│ │ │ │ ├── plugin/
│ │ │ │ │ ├── AllocationException.java
│ │ │ │ │ ├── BasicPluginManager.java
│ │ │ │ │ ├── CdiClassAllocator.java
│ │ │ │ │ ├── ClassAllocator.java
│ │ │ │ │ ├── LoadedPlugin.java
│ │ │ │ │ ├── PluginClassLoader.java
│ │ │ │ │ ├── PluginClassLoaderImpl.java
│ │ │ │ │ ├── PluginContainer.java
│ │ │ │ │ ├── PluginContainerImpl.java
│ │ │ │ │ ├── PluginException.java
│ │ │ │ │ ├── PluginGraph.java
│ │ │ │ │ ├── PluginId.java
│ │ │ │ │ ├── PluginInfo.java
│ │ │ │ │ ├── PluginLoader.java
│ │ │ │ │ ├── PluginManager.java
│ │ │ │ │ ├── PluginManagerConfig.java
│ │ │ │ │ ├── PluginSource.java
│ │ │ │ │ ├── PluginUnloader.java
│ │ │ │ │ ├── PreparedPlugin.java
│ │ │ │ │ ├── discovery/
│ │ │ │ │ │ ├── DirectoryPluginDiscoverer.java
│ │ │ │ │ │ ├── DiscoveredPluginSource.java
│ │ │ │ │ │ ├── PathPluginDiscoverer.java
│ │ │ │ │ │ └── PluginDiscoverer.java
│ │ │ │ │ └── zip/
│ │ │ │ │ ├── ZipArchiveView.java
│ │ │ │ │ ├── ZipPluginLoader.java
│ │ │ │ │ ├── ZipPreparedPlugin.java
│ │ │ │ │ └── ZipSource.java
│ │ │ │ ├── script/
│ │ │ │ │ ├── GenerateResult.java
│ │ │ │ │ ├── JavacScriptEngine.java
│ │ │ │ │ ├── ScriptEngine.java
│ │ │ │ │ ├── ScriptEngineConfig.java
│ │ │ │ │ ├── ScriptFile.java
│ │ │ │ │ ├── ScriptManager.java
│ │ │ │ │ ├── ScriptManagerConfig.java
│ │ │ │ │ └── ScriptResult.java
│ │ │ │ ├── search/
│ │ │ │ │ ├── AndroidClassSearchVisitor.java
│ │ │ │ │ ├── CancellableSearchFeedback.java
│ │ │ │ │ ├── FileSearchVisitor.java
│ │ │ │ │ ├── JvmClassSearchVisitor.java
│ │ │ │ │ ├── ResultSink.java
│ │ │ │ │ ├── SearchFeedback.java
│ │ │ │ │ ├── SearchService.java
│ │ │ │ │ ├── SearchServiceConfig.java
│ │ │ │ │ ├── SearchVisitor.java
│ │ │ │ │ ├── match/
│ │ │ │ │ │ ├── BiNumberMatcher.java
│ │ │ │ │ │ ├── BiStringMatcher.java
│ │ │ │ │ │ ├── MultiNumberMatcher.java
│ │ │ │ │ │ ├── MultiStringMatcher.java
│ │ │ │ │ │ ├── NumberPredicate.java
│ │ │ │ │ │ ├── NumberPredicateProvider.java
│ │ │ │ │ │ ├── RangeNumberMatcher.java
│ │ │ │ │ │ ├── StringPredicate.java
│ │ │ │ │ │ └── StringPredicateProvider.java
│ │ │ │ │ ├── query/
│ │ │ │ │ │ ├── AbstractValueQuery.java
│ │ │ │ │ │ ├── AndroidClassQuery.java
│ │ │ │ │ │ ├── DeclarationQuery.java
│ │ │ │ │ │ ├── FileQuery.java
│ │ │ │ │ │ ├── InstructionQuery.java
│ │ │ │ │ │ ├── JvmClassQuery.java
│ │ │ │ │ │ ├── NumberQuery.java
│ │ │ │ │ │ ├── Query.java
│ │ │ │ │ │ ├── ReferenceQuery.java
│ │ │ │ │ │ └── StringQuery.java
│ │ │ │ │ └── result/
│ │ │ │ │ ├── ClassReference.java
│ │ │ │ │ ├── ClassReferenceResult.java
│ │ │ │ │ ├── MemberReference.java
│ │ │ │ │ ├── MemberReferenceResult.java
│ │ │ │ │ ├── NumberResult.java
│ │ │ │ │ ├── Result.java
│ │ │ │ │ ├── Results.java
│ │ │ │ │ └── StringResult.java
│ │ │ │ ├── source/
│ │ │ │ │ ├── AstMapper.java
│ │ │ │ │ ├── AstResolveResult.java
│ │ │ │ │ ├── AstService.java
│ │ │ │ │ ├── AstServiceConfig.java
│ │ │ │ │ └── ResolverAdapter.java
│ │ │ │ ├── text/
│ │ │ │ │ └── TextFormatConfig.java
│ │ │ │ ├── transform/
│ │ │ │ │ ├── CancellableTransformationFeedback.java
│ │ │ │ │ ├── ClassTransformer.java
│ │ │ │ │ ├── JvmClassTransformer.java
│ │ │ │ │ ├── JvmTransformResult.java
│ │ │ │ │ ├── JvmTransformerContext.java
│ │ │ │ │ ├── TransformResult.java
│ │ │ │ │ ├── TransformationApplier.java
│ │ │ │ │ ├── TransformationApplierConfig.java
│ │ │ │ │ ├── TransformationApplierService.java
│ │ │ │ │ ├── TransformationException.java
│ │ │ │ │ ├── TransformationFeedback.java
│ │ │ │ │ ├── TransformationManager.java
│ │ │ │ │ └── TransformationManagerConfig.java
│ │ │ │ ├── tutorial/
│ │ │ │ │ ├── TutorialConfig.java
│ │ │ │ │ ├── TutorialWorkspace.java
│ │ │ │ │ └── TutorialWorkspaceResource.java
│ │ │ │ └── workspace/
│ │ │ │ ├── BasicWorkspaceManager.java
│ │ │ │ ├── WorkspaceCloseCondition.java
│ │ │ │ ├── WorkspaceCloseListener.java
│ │ │ │ ├── WorkspaceManager.java
│ │ │ │ ├── WorkspaceManagerConfig.java
│ │ │ │ ├── WorkspaceOpenListener.java
│ │ │ │ ├── WorkspaceProcessingConfig.java
│ │ │ │ ├── WorkspaceProcessingService.java
│ │ │ │ ├── WorkspaceProcessor.java
│ │ │ │ ├── io/
│ │ │ │ │ ├── BasicClassPatcher.java
│ │ │ │ │ ├── BasicInfoImporter.java
│ │ │ │ │ ├── BasicResourceImporter.java
│ │ │ │ │ ├── ByteArrayWorkspaceExportConsumer.java
│ │ │ │ │ ├── ClassPatcher.java
│ │ │ │ │ ├── InfoImporter.java
│ │ │ │ │ ├── InfoImporterConfig.java
│ │ │ │ │ ├── PathWorkspaceExportConsumer.java
│ │ │ │ │ ├── ResourceImporter.java
│ │ │ │ │ ├── ResourceImporterConfig.java
│ │ │ │ │ ├── WorkspaceCompressType.java
│ │ │ │ │ ├── WorkspaceExportConsumer.java
│ │ │ │ │ ├── WorkspaceExportOptions.java
│ │ │ │ │ ├── WorkspaceExporter.java
│ │ │ │ │ └── WorkspaceOutputType.java
│ │ │ │ ├── patch/
│ │ │ │ │ ├── PatchApplier.java
│ │ │ │ │ ├── PatchFeedback.java
│ │ │ │ │ ├── PatchGenerationException.java
│ │ │ │ │ ├── PatchProvider.java
│ │ │ │ │ ├── PatchSerialization.java
│ │ │ │ │ ├── ResourcePatchApplierConfig.java
│ │ │ │ │ ├── ResourcePatchProviderConfig.java
│ │ │ │ │ └── model/
│ │ │ │ │ ├── JvmAssemblerPatch.java
│ │ │ │ │ ├── RemovePath.java
│ │ │ │ │ ├── TextFilePatch.java
│ │ │ │ │ └── WorkspacePatch.java
│ │ │ │ └── processors/
│ │ │ │ └── ThrowablePropertyAssigningProcessor.java
│ │ │ ├── util/
│ │ │ │ ├── AccessFlag.java
│ │ │ │ ├── AccessPatcher.java
│ │ │ │ ├── AsmInsnUtil.java
│ │ │ │ ├── BlwUtil.java
│ │ │ │ ├── ByteHeaderUtil.java
│ │ │ │ ├── CancelSignal.java
│ │ │ │ ├── ClassDefiner.java
│ │ │ │ ├── ClassLoaderInternals.java
│ │ │ │ ├── ClasspathUtil.java
│ │ │ │ ├── CollectionUtils.java
│ │ │ │ ├── DesktopUtil.java
│ │ │ │ ├── DevDetection.java
│ │ │ │ ├── EscapeUtil.java
│ │ │ │ ├── ExcludeFromJacocoGeneratedReport.java
│ │ │ │ ├── Handles.java
│ │ │ │ ├── IOUtil.java
│ │ │ │ ├── InternalPath.java
│ │ │ │ ├── JavaDowngraderUtil.java
│ │ │ │ ├── JavaVersion.java
│ │ │ │ ├── JdkValidation.java
│ │ │ │ ├── Keywords.java
│ │ │ │ ├── MemoizedFunctions.java
│ │ │ │ ├── ModulesIOUtil.java
│ │ │ │ ├── MultiMap.java
│ │ │ │ ├── MultiMapBuilder.java
│ │ │ │ ├── NumberUtil.java
│ │ │ │ ├── PlatformType.java
│ │ │ │ ├── ReflectUtil.java
│ │ │ │ ├── RegexUtil.java
│ │ │ │ ├── ResourceUtil.java
│ │ │ │ ├── SelfReferenceUtil.java
│ │ │ │ ├── ShortcutUtil.java
│ │ │ │ ├── Streams.java
│ │ │ │ ├── StringDecodingResult.java
│ │ │ │ ├── StringDiff.java
│ │ │ │ ├── StringUtil.java
│ │ │ │ ├── TestEnvironment.java
│ │ │ │ ├── Types.java
│ │ │ │ ├── UnsafeIO.java
│ │ │ │ ├── UnsafeUtil.java
│ │ │ │ ├── ZipCreationUtils.java
│ │ │ │ ├── analysis/
│ │ │ │ │ ├── Branching.java
│ │ │ │ │ ├── Nullness.java
│ │ │ │ │ ├── ReAnalyzer.java
│ │ │ │ │ ├── ReFrame.java
│ │ │ │ │ ├── ReInterpreter.java
│ │ │ │ │ ├── eval/
│ │ │ │ │ │ ├── EvaluationException.java
│ │ │ │ │ │ ├── EvaluationFailureResult.java
│ │ │ │ │ │ ├── EvaluationResult.java
│ │ │ │ │ │ ├── EvaluationThrowsResult.java
│ │ │ │ │ │ ├── EvaluationYieldResult.java
│ │ │ │ │ │ ├── Evaluator.java
│ │ │ │ │ │ ├── FieldCache.java
│ │ │ │ │ │ ├── FieldCacheManager.java
│ │ │ │ │ │ ├── InstanceFactory.java
│ │ │ │ │ │ ├── InstanceMapper.java
│ │ │ │ │ │ ├── InstancedObjectValue.java
│ │ │ │ │ │ └── MethodInvokeHandler.java
│ │ │ │ │ ├── gen/
│ │ │ │ │ │ ├── GenUtils.java
│ │ │ │ │ │ ├── InstanceMapperGenerator.java
│ │ │ │ │ │ ├── InstanceMethodInvokeHandlerGenerator.java
│ │ │ │ │ │ ├── InstanceStaticMapperGenerator.java
│ │ │ │ │ │ └── LookupGenerator.java
│ │ │ │ │ ├── lookup/
│ │ │ │ │ │ ├── BasicGetStaticLookup.java
│ │ │ │ │ │ ├── BasicInvokeStaticLookup.java
│ │ │ │ │ │ ├── BasicInvokeVirtualLookup.java
│ │ │ │ │ │ ├── BasicLookupUtils.java
│ │ │ │ │ │ ├── GetFieldLookup.java
│ │ │ │ │ │ ├── GetStaticLookup.java
│ │ │ │ │ │ ├── InvokeStaticLookup.java
│ │ │ │ │ │ └── InvokeVirtualLookup.java
│ │ │ │ │ └── value/
│ │ │ │ │ ├── ArrayValue.java
│ │ │ │ │ ├── DoubleValue.java
│ │ │ │ │ ├── FloatValue.java
│ │ │ │ │ ├── IllegalValueException.java
│ │ │ │ │ ├── IntValue.java
│ │ │ │ │ ├── LongValue.java
│ │ │ │ │ ├── ObjectValue.java
│ │ │ │ │ ├── ReValue.java
│ │ │ │ │ ├── StringValue.java
│ │ │ │ │ ├── UninitializedValue.java
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── ArrayValueImpl.java
│ │ │ │ │ ├── BoxedBooleanValueImpl.java
│ │ │ │ │ ├── BoxedByteValueImpl.java
│ │ │ │ │ ├── BoxedCharacterValueImpl.java
│ │ │ │ │ ├── BoxedDoubleValueImpl.java
│ │ │ │ │ ├── BoxedFloatValueImpl.java
│ │ │ │ │ ├── BoxedIntegerValueImpl.java
│ │ │ │ │ ├── BoxedLongValueImpl.java
│ │ │ │ │ ├── BoxedShortValueImpl.java
│ │ │ │ │ ├── DoubleValueImpl.java
│ │ │ │ │ ├── FloatValueImpl.java
│ │ │ │ │ ├── IntValueImpl.java
│ │ │ │ │ ├── LongValueImpl.java
│ │ │ │ │ ├── ObjectValueBoxImpl.java
│ │ │ │ │ ├── ObjectValueImpl.java
│ │ │ │ │ ├── StringValueImpl.java
│ │ │ │ │ └── UninitializedValueImpl.java
│ │ │ │ ├── android/
│ │ │ │ │ ├── AndroidRes.java
│ │ │ │ │ ├── AndroidXmlUtil.java
│ │ │ │ │ └── DexIOUtil.java
│ │ │ │ ├── io/
│ │ │ │ │ ├── ByteArraySource.java
│ │ │ │ │ ├── ByteBufferSource.java
│ │ │ │ │ ├── ByteSource.java
│ │ │ │ │ ├── ByteSourceConsumer.java
│ │ │ │ │ ├── ByteSourceElement.java
│ │ │ │ │ ├── ByteSources.java
│ │ │ │ │ ├── LocalFileHeaderSource.java
│ │ │ │ │ ├── MemorySegmentDataSource.java
│ │ │ │ │ └── PathByteSource.java
│ │ │ │ ├── kotlin/
│ │ │ │ │ ├── KotlinMetadata.java
│ │ │ │ │ └── model/
│ │ │ │ │ ├── KtClass.java
│ │ │ │ │ ├── KtClassKind.java
│ │ │ │ │ ├── KtConstructor.java
│ │ │ │ │ ├── KtElement.java
│ │ │ │ │ ├── KtFunction.java
│ │ │ │ │ ├── KtNullability.java
│ │ │ │ │ ├── KtParameter.java
│ │ │ │ │ ├── KtProperty.java
│ │ │ │ │ ├── KtType.java
│ │ │ │ │ └── KtVariable.java
│ │ │ │ ├── threading/
│ │ │ │ │ ├── Batch.java
│ │ │ │ │ ├── CountDown.java
│ │ │ │ │ ├── DirectBatch.java
│ │ │ │ │ ├── ExecutorServiceDelegate.java
│ │ │ │ │ ├── PhasingExecutorService.java
│ │ │ │ │ ├── ScheduledExecutorServiceDelegate.java
│ │ │ │ │ ├── ThreadPoolFactory.java
│ │ │ │ │ └── ThreadUtil.java
│ │ │ │ └── visitors/
│ │ │ │ ├── AnnotationArrayVisitor.java
│ │ │ │ ├── BogusNameRemovingVisitor.java
│ │ │ │ ├── ClassAnnotationInsertingVisitor.java
│ │ │ │ ├── ClassAnnotationRemovingVisitor.java
│ │ │ │ ├── ClassHollowingVisitor.java
│ │ │ │ ├── DuplicateAnnotationRemovingVisitor.java
│ │ │ │ ├── FieldAnnotationInsertingVisitor.java
│ │ │ │ ├── FieldAnnotationRemovingVisitor.java
│ │ │ │ ├── FieldInsertingVisitor.java
│ │ │ │ ├── FieldPredicate.java
│ │ │ │ ├── FieldReplacingVisitor.java
│ │ │ │ ├── FrameSkippingVisitor.java
│ │ │ │ ├── IllegalAnnotationRemovingVisitor.java
│ │ │ │ ├── IllegalSignatureRemovingVisitor.java
│ │ │ │ ├── IllegalVarargsRemovingVisitor.java
│ │ │ │ ├── IndexCountingMethodVisitor.java
│ │ │ │ ├── KotlinMetadataVisitor.java
│ │ │ │ ├── LongAnnotationRemovingVisitor.java
│ │ │ │ ├── LongExceptionRemovingVisitor.java
│ │ │ │ ├── MemberCopyingVisitor.java
│ │ │ │ ├── MemberFilteringVisitor.java
│ │ │ │ ├── MemberPredicate.java
│ │ │ │ ├── MemberRemovingVisitor.java
│ │ │ │ ├── MemberStubAddingVisitor.java
│ │ │ │ ├── MethodAnnotationInsertingVisitor.java
│ │ │ │ ├── MethodAnnotationRemovingVisitor.java
│ │ │ │ ├── MethodInsertingVisitor.java
│ │ │ │ ├── MethodNoopingVisitor.java
│ │ │ │ ├── MethodPredicate.java
│ │ │ │ ├── MethodReplacingVisitor.java
│ │ │ │ ├── MethodVariableRemovingVisitor.java
│ │ │ │ ├── SignatureRemovingVisitor.java
│ │ │ │ ├── SkippingAnnotationVisitor.java
│ │ │ │ ├── SkippingClassVisitor.java
│ │ │ │ ├── SkippingFieldVisitor.java
│ │ │ │ ├── SkippingMethodVisitor.java
│ │ │ │ ├── SyntheticRemovingVisitor.java
│ │ │ │ ├── TypeVisitor.java
│ │ │ │ ├── UnknownAttributeRemovingVisitor.java
│ │ │ │ ├── VariableRemovingClassVisitor.java
│ │ │ │ ├── VariableRemovingMethodVisitor.java
│ │ │ │ └── WorkspaceClassWriter.java
│ │ │ └── workspace/
│ │ │ └── model/
│ │ │ ├── BasicWorkspace.java
│ │ │ ├── EmptyWorkspace.java
│ │ │ ├── Workspace.java
│ │ │ ├── WorkspaceModificationListener.java
│ │ │ ├── bundle/
│ │ │ │ ├── AndroidClassBundle.java
│ │ │ │ ├── BasicAndroidClassBundle.java
│ │ │ │ ├── BasicBundle.java
│ │ │ │ ├── BasicFileBundle.java
│ │ │ │ ├── BasicJvmClassBundle.java
│ │ │ │ ├── BasicVersionedJvmClassBundle.java
│ │ │ │ ├── Bundle.java
│ │ │ │ ├── BundleListener.java
│ │ │ │ ├── ClassBundle.java
│ │ │ │ ├── FileBundle.java
│ │ │ │ ├── JvmClassBundle.java
│ │ │ │ └── VersionedJvmClassBundle.java
│ │ │ └── resource/
│ │ │ ├── AgentServerRemoteVmResource.java
│ │ │ ├── AndroidApiResource.java
│ │ │ ├── BasicWorkspaceDirectoryResource.java
│ │ │ ├── BasicWorkspaceFileResource.java
│ │ │ ├── BasicWorkspaceResource.java
│ │ │ ├── ResourceAndroidClassListener.java
│ │ │ ├── ResourceFileListener.java
│ │ │ ├── ResourceJvmClassListener.java
│ │ │ ├── RuntimeWorkspaceResource.java
│ │ │ ├── WorkspaceDirectoryResource.java
│ │ │ ├── WorkspaceDirectoryResourceBuilder.java
│ │ │ ├── WorkspaceFileResource.java
│ │ │ ├── WorkspaceFileResourceBuilder.java
│ │ │ ├── WorkspaceRemoteVmResource.java
│ │ │ ├── WorkspaceResource.java
│ │ │ └── WorkspaceResourceBuilder.java
│ │ └── resources/
│ │ ├── android/
│ │ │ ├── api-outline-30.jar
│ │ │ ├── attrs.json
│ │ │ └── res-map.txt
│ │ └── logback.xml
│ ├── test/
│ │ ├── java/
│ │ │ └── software/
│ │ │ └── coley/
│ │ │ └── recaf/
│ │ │ ├── BootstrapTest.java
│ │ │ ├── info/
│ │ │ │ ├── ClassInfoTest.java
│ │ │ │ ├── JvmClassInfoTest.java
│ │ │ │ ├── annotation/
│ │ │ │ │ ├── AnnotatedTest.java
│ │ │ │ │ ├── AnnotationInfoTest.java
│ │ │ │ │ └── TypeAnnotationInfoTest.java
│ │ │ │ └── member/
│ │ │ │ ├── FieldMemberTest.java
│ │ │ │ └── MethodMemberTest.java
│ │ │ ├── path/
│ │ │ │ └── PathNodeTest.java
│ │ │ ├── services/
│ │ │ │ ├── assembler/
│ │ │ │ │ └── ExpressionCompilerTest.java
│ │ │ │ ├── callgraph/
│ │ │ │ │ └── CallGraphTest.java
│ │ │ │ ├── comment/
│ │ │ │ │ └── CommentManagerTest.java
│ │ │ │ ├── compile/
│ │ │ │ │ └── JavacCompilerTest.java
│ │ │ │ ├── decompile/
│ │ │ │ │ ├── DecompileManagerTest.java
│ │ │ │ │ └── FallbackDecompilerTest.java
│ │ │ │ ├── deobfuscation/
│ │ │ │ │ ├── BaseDeobfuscationTest.java
│ │ │ │ │ ├── CycleRemovingTest.java
│ │ │ │ │ ├── EvaluatorTest.java
│ │ │ │ │ ├── FoldingDeobfuscationTest.java
│ │ │ │ │ ├── IllegalAttributeDeobfuscationTest.java
│ │ │ │ │ ├── MiscDeobfuscationTest.java
│ │ │ │ │ ├── RegressionDeobfuscationTest.java
│ │ │ │ │ ├── StaticValueInliningTest.java
│ │ │ │ │ └── TryCatchDeobfuscationTest.java
│ │ │ │ ├── inheritance/
│ │ │ │ │ ├── InheritanceAndRenamingTest.java
│ │ │ │ │ └── InheritanceGraphTest.java
│ │ │ │ ├── json/
│ │ │ │ │ └── GsonProviderTest.java
│ │ │ │ ├── mapping/
│ │ │ │ │ ├── MappingApplierTest.java
│ │ │ │ │ ├── aggregate/
│ │ │ │ │ │ ├── AggregateMappingManagerTest.java
│ │ │ │ │ │ └── AggregateMappingsTest.java
│ │ │ │ │ ├── format/
│ │ │ │ │ │ ├── MappingImplementationTest.java
│ │ │ │ │ │ └── MappingIntermediateTest.java
│ │ │ │ │ └── gen/
│ │ │ │ │ └── MappingGeneratorTest.java
│ │ │ │ ├── phantom/
│ │ │ │ │ └── PhantomGeneratorTest.java
│ │ │ │ ├── plugin/
│ │ │ │ │ └── PluginManagerTest.java
│ │ │ │ ├── script/
│ │ │ │ │ └── JavacScriptEngineTest.java
│ │ │ │ ├── search/
│ │ │ │ │ └── SearchServiceTest.java
│ │ │ │ ├── source/
│ │ │ │ │ └── AstServiceTest.java
│ │ │ │ ├── transform/
│ │ │ │ │ ├── TransformationApplierTest.java
│ │ │ │ │ └── TransformationManagerTest.java
│ │ │ │ └── workspace/
│ │ │ │ ├── io/
│ │ │ │ │ ├── InfoImporterTest.java
│ │ │ │ │ ├── ResourceImporterTest.java
│ │ │ │ │ └── WorkspaceExporterTest.java
│ │ │ │ └── patch/
│ │ │ │ └── PatchingTest.java
│ │ │ ├── util/
│ │ │ │ ├── AccessFlagTest.java
│ │ │ │ ├── AsmInsnUtilTest.java
│ │ │ │ ├── EscapeUtilTest.java
│ │ │ │ ├── NumberUtilTest.java
│ │ │ │ ├── StringDiffTest.java
│ │ │ │ ├── StringUtilTest.java
│ │ │ │ ├── TypesTest.java
│ │ │ │ └── android/
│ │ │ │ └── AndroidResConversion.java
│ │ │ └── workspace/
│ │ │ └── model/
│ │ │ └── WorkspaceModelTest.java
│ │ └── resources/
│ │ └── android/
│ │ ├── attrs.xml
│ │ └── attrs_manifest.xml
│ └── testFixtures/
│ ├── java/
│ │ └── software/
│ │ └── coley/
│ │ └── recaf/
│ │ └── test/
│ │ ├── TestBase.java
│ │ ├── TestClassUtils.java
│ │ ├── TestConfigSetup.java
│ │ └── dummy/
│ │ ├── AccessibleFields.java
│ │ ├── AccessibleMethods.java
│ │ ├── AccessibleMethodsChild.java
│ │ ├── AnnotationImpl.java
│ │ ├── AnonymousLambda.java
│ │ ├── ArrayTypeAnno.java
│ │ ├── ClassWithAnnotation.java
│ │ ├── ClassWithAnonymousInner.java
│ │ ├── ClassWithConstructor.java
│ │ ├── ClassWithEmbeddedInners.java
│ │ ├── ClassWithExceptions.java
│ │ ├── ClassWithFieldsAndMethods.java
│ │ ├── ClassWithInner.java
│ │ ├── ClassWithInnerAndMembers.java
│ │ ├── ClassWithInvisAnnotation.java
│ │ ├── ClassWithLambda.java
│ │ ├── ClassWithMethodReference.java
│ │ ├── ClassWithMultipleMethods.java
│ │ ├── ClassWithRequiredConstructor.java
│ │ ├── ClassWithStaticInit.java
│ │ ├── ClassWithToString.java
│ │ ├── DiamondA.java
│ │ ├── DiamondB.java
│ │ ├── DiamondC.java
│ │ ├── DummyEmptyMap.java
│ │ ├── DummyEnum.java
│ │ ├── DummyEnumPrinter.java
│ │ ├── DummyRecord.java
│ │ ├── HelloWorld.java
│ │ ├── Inheritance.java
│ │ ├── InvisAnnotationImpl.java
│ │ ├── MethodWithTypeAnno.java
│ │ ├── MultipleInterfacesClass.java
│ │ ├── OverlapCaller.java
│ │ ├── OverlapClassAB.java
│ │ ├── OverlapInterfaceA.java
│ │ ├── OverlapInterfaceB.java
│ │ ├── SealedCircle.java
│ │ ├── SealedOtherShape.java
│ │ ├── SealedShape.java
│ │ ├── SealedSquare.java
│ │ ├── StringConsumer.java
│ │ ├── StringConsumerUser.java
│ │ ├── StringList.java
│ │ ├── StringListUser.java
│ │ ├── StringSupplier.java
│ │ ├── TypeAnnotationImpl.java
│ │ ├── VariedModifierFields.java
│ │ └── VariedModifierMethods.java
│ └── resources/
│ ├── lorem-long-ascii.txt
│ ├── lorem-long-cn.txt
│ ├── lorem-long-ru.txt
│ ├── lorem-short-ascii.txt
│ ├── lorem-short-cn.txt
│ ├── lorem-short-ru.txt
│ └── name-prefix-suffix.jar
├── recaf-ui/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── software/
│ │ │ └── coley/
│ │ │ └── recaf/
│ │ │ ├── Main.java
│ │ │ ├── RecafApplication.java
│ │ │ ├── path/
│ │ │ │ ├── AssemblerPathData.java
│ │ │ │ └── AssemblerPathNode.java
│ │ │ ├── services/
│ │ │ │ ├── cell/
│ │ │ │ │ ├── CellConfigurationService.java
│ │ │ │ │ ├── CellConfigurationServiceConfig.java
│ │ │ │ │ ├── context/
│ │ │ │ │ │ ├── AbstractContextMenuProviderFactory.java
│ │ │ │ │ │ ├── AnnotationContextMenuAdapter.java
│ │ │ │ │ │ ├── AnnotationContextMenuProviderFactory.java
│ │ │ │ │ │ ├── AssemblerContextMenuAdapter.java
│ │ │ │ │ │ ├── AssemblerContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicAnnotationContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicAssemblerContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicBlacklistingContextSource.java
│ │ │ │ │ │ ├── BasicBundleContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicClassContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicContextSource.java
│ │ │ │ │ │ ├── BasicDirectoryContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicFieldContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicFileContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicInnerClassContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicMethodContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicPackageContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicResourceContextMenuProviderFactory.java
│ │ │ │ │ │ ├── BasicWhitelistingContextSource.java
│ │ │ │ │ │ ├── BundleContextMenuAdapter.java
│ │ │ │ │ │ ├── BundleContextMenuProviderFactory.java
│ │ │ │ │ │ ├── ClassContextMenuAdapter.java
│ │ │ │ │ │ ├── ClassContextMenuProviderFactory.java
│ │ │ │ │ │ ├── ContextMenuAdapter.java
│ │ │ │ │ │ ├── ContextMenuProvider.java
│ │ │ │ │ │ ├── ContextMenuProviderFactory.java
│ │ │ │ │ │ ├── ContextMenuProviderService.java
│ │ │ │ │ │ ├── ContextMenuProviderServiceConfig.java
│ │ │ │ │ │ ├── ContextSource.java
│ │ │ │ │ │ ├── DirectoryContextMenuAdapter.java
│ │ │ │ │ │ ├── DirectoryContextMenuProviderFactory.java
│ │ │ │ │ │ ├── FieldContextMenuAdapter.java
│ │ │ │ │ │ ├── FieldContextMenuProviderFactory.java
│ │ │ │ │ │ ├── FileContextMenuAdapter.java
│ │ │ │ │ │ ├── FileContextMenuProviderFactory.java
│ │ │ │ │ │ ├── InnerClassContextMenuAdapter.java
│ │ │ │ │ │ ├── InnerClassContextMenuProviderFactory.java
│ │ │ │ │ │ ├── MethodContextMenuAdapter.java
│ │ │ │ │ │ ├── MethodContextMenuProviderFactory.java
│ │ │ │ │ │ ├── PackageContextMenuAdapter.java
│ │ │ │ │ │ ├── PackageContextMenuProviderFactory.java
│ │ │ │ │ │ ├── ResourceContextMenuAdapter.java
│ │ │ │ │ │ └── ResourceContextMenuProviderFactory.java
│ │ │ │ │ ├── icon/
│ │ │ │ │ │ ├── AnnotationIconProviderFactory.java
│ │ │ │ │ │ ├── BasicAnnotationIconProviderFactory.java
│ │ │ │ │ │ ├── BasicBundleIconProviderFactory.java
│ │ │ │ │ │ ├── BasicCatchIconProviderFactory.java
│ │ │ │ │ │ ├── BasicClassIconProviderFactory.java
│ │ │ │ │ │ ├── BasicDirectoryIconProviderFactory.java
│ │ │ │ │ │ ├── BasicFieldIconProviderFactory.java
│ │ │ │ │ │ ├── BasicFileIconProviderFactory.java
│ │ │ │ │ │ ├── BasicInnerClassIconProviderFactory.java
│ │ │ │ │ │ ├── BasicInstructionIconProviderFactory.java
│ │ │ │ │ │ ├── BasicMethodIconProviderFactory.java
│ │ │ │ │ │ ├── BasicPackageIconProviderFactory.java
│ │ │ │ │ │ ├── BasicResourceIconProviderFactory.java
│ │ │ │ │ │ ├── BasicThrowsProviderFactory.java
│ │ │ │ │ │ ├── BasicVariableIconProviderFactory.java
│ │ │ │ │ │ ├── BundleIconProviderFactory.java
│ │ │ │ │ │ ├── CatchIconProviderFactory.java
│ │ │ │ │ │ ├── ClassIconProviderFactory.java
│ │ │ │ │ │ ├── DirectoryIconProviderFactory.java
│ │ │ │ │ │ ├── FieldIconProviderFactory.java
│ │ │ │ │ │ ├── FileIconProviderFactory.java
│ │ │ │ │ │ ├── IconProvider.java
│ │ │ │ │ │ ├── IconProviderFactory.java
│ │ │ │ │ │ ├── IconProviderService.java
│ │ │ │ │ │ ├── IconProviderServiceConfig.java
│ │ │ │ │ │ ├── InnerClassIconProviderFactory.java
│ │ │ │ │ │ ├── InstructionIconProviderFactory.java
│ │ │ │ │ │ ├── MethodIconProviderFactory.java
│ │ │ │ │ │ ├── PackageIconProviderFactory.java
│ │ │ │ │ │ ├── ResourceIconProviderFactory.java
│ │ │ │ │ │ ├── ThrowsIconProviderFactory.java
│ │ │ │ │ │ └── VariableIconProviderFactory.java
│ │ │ │ │ └── text/
│ │ │ │ │ ├── TextProvider.java
│ │ │ │ │ ├── TextProviderFactory.java
│ │ │ │ │ ├── TextProviderService.java
│ │ │ │ │ └── TextProviderServiceConfig.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── ConfigComponentFactory.java
│ │ │ │ │ ├── ConfigComponentManager.java
│ │ │ │ │ ├── ConfigComponentManagerConfig.java
│ │ │ │ │ ├── ConfigIconManager.java
│ │ │ │ │ ├── ConfigIconManagerConfig.java
│ │ │ │ │ ├── KeyedConfigComponentFactory.java
│ │ │ │ │ ├── TypedConfigComponentFactory.java
│ │ │ │ │ └── factories/
│ │ │ │ │ ├── AndroidDecompilerComponentFactory.java
│ │ │ │ │ ├── BooleanComponentFactory.java
│ │ │ │ │ ├── EnumComponentFactory.java
│ │ │ │ │ ├── IntegerComponentFactory.java
│ │ │ │ │ ├── JvmDecompilerComponentFactory.java
│ │ │ │ │ ├── ProcyonLanguageComponentFactory.java
│ │ │ │ │ └── StringComponentFactory.java
│ │ │ │ ├── info/
│ │ │ │ │ ├── association/
│ │ │ │ │ │ ├── FileTypeSyntaxAssociationService.java
│ │ │ │ │ │ └── FileTypeSyntaxAssociationServiceConfig.java
│ │ │ │ │ └── summary/
│ │ │ │ │ ├── ResourceSummarizer.java
│ │ │ │ │ ├── ResourceSummaryService.java
│ │ │ │ │ ├── ResourceSummaryServiceConfig.java
│ │ │ │ │ ├── SummaryConsumer.java
│ │ │ │ │ └── builtin/
│ │ │ │ │ ├── AntiDecompilationSummarizer.java
│ │ │ │ │ ├── EntryPointSummarizer.java
│ │ │ │ │ ├── HashSummarizer.java
│ │ │ │ │ └── JarSigningSummarizer.java
│ │ │ │ ├── mapping/
│ │ │ │ │ └── MappingHelper.java
│ │ │ │ ├── navigation/
│ │ │ │ │ ├── Actions.java
│ │ │ │ │ ├── ActionsConfig.java
│ │ │ │ │ ├── ClassNavigable.java
│ │ │ │ │ ├── FileNavigable.java
│ │ │ │ │ ├── Navigable.java
│ │ │ │ │ ├── NavigableAddListener.java
│ │ │ │ │ ├── NavigableRemoveListener.java
│ │ │ │ │ ├── NavigationManager.java
│ │ │ │ │ ├── NavigationManagerConfig.java
│ │ │ │ │ ├── UnsupportedContentException.java
│ │ │ │ │ └── UpdatableNavigable.java
│ │ │ │ ├── translation/
│ │ │ │ │ └── LangConfig.java
│ │ │ │ ├── tutorial/
│ │ │ │ │ ├── TutorialWorkspaceBuilder.java
│ │ │ │ │ └── content/
│ │ │ │ │ ├── Chapter1.java
│ │ │ │ │ ├── Chapter2.java
│ │ │ │ │ ├── Chapter3.java
│ │ │ │ │ ├── Chapter4.java
│ │ │ │ │ ├── Chapter5.java
│ │ │ │ │ ├── Chapter6.java
│ │ │ │ │ └── Chapter7.java
│ │ │ │ └── window/
│ │ │ │ ├── WindowFactory.java
│ │ │ │ ├── WindowFactoryConfig.java
│ │ │ │ ├── WindowManager.java
│ │ │ │ ├── WindowManagerConfig.java
│ │ │ │ ├── WindowStyling.java
│ │ │ │ └── WindowStylingConfig.java
│ │ │ ├── ui/
│ │ │ │ ├── LanguageStylesheets.java
│ │ │ │ ├── RecafTheme.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── Binding.java
│ │ │ │ │ ├── BindingCreator.java
│ │ │ │ │ ├── ClassEditingConfig.java
│ │ │ │ │ ├── ExportConfig.java
│ │ │ │ │ ├── KeybindingConfig.java
│ │ │ │ │ ├── MemberDisplayFormatConfig.java
│ │ │ │ │ ├── RecentFilesConfig.java
│ │ │ │ │ ├── WindowScaleConfig.java
│ │ │ │ │ └── WorkspaceExplorerConfig.java
│ │ │ │ ├── contextmenu/
│ │ │ │ │ ├── AnnotationMenuBuilder.java
│ │ │ │ │ ├── BundleMenuBuilder.java
│ │ │ │ │ ├── ContextMenuBuilder.java
│ │ │ │ │ ├── DirectoryMenuBuilder.java
│ │ │ │ │ ├── InfoMenuBuilder.java
│ │ │ │ │ ├── ItemSink.java
│ │ │ │ │ ├── MemberMenuBuilder.java
│ │ │ │ │ ├── MenuBuilder.java
│ │ │ │ │ ├── MenuHandler.java
│ │ │ │ │ ├── ResourceMenuBuilder.java
│ │ │ │ │ ├── WorkspaceMenuBuilder.java
│ │ │ │ │ └── actions/
│ │ │ │ │ ├── AnnotationAction.java
│ │ │ │ │ ├── BundleAction.java
│ │ │ │ │ ├── DirectoryAction.java
│ │ │ │ │ ├── InfoAction.java
│ │ │ │ │ ├── MemberAction.java
│ │ │ │ │ ├── ResourceAction.java
│ │ │ │ │ └── WorkspaceAction.java
│ │ │ │ ├── control/
│ │ │ │ │ ├── AbstractSearchBar.java
│ │ │ │ │ ├── ActionButton.java
│ │ │ │ │ ├── ActionMenu.java
│ │ │ │ │ ├── ActionMenuItem.java
│ │ │ │ │ ├── AutoScrollPane.java
│ │ │ │ │ ├── BoundBiDiComboBox.java
│ │ │ │ │ ├── BoundCheckBox.java
│ │ │ │ │ ├── BoundComboBox.java
│ │ │ │ │ ├── BoundHyperlink.java
│ │ │ │ │ ├── BoundIntSpinner.java
│ │ │ │ │ ├── BoundLabel.java
│ │ │ │ │ ├── BoundMultiToggleIcon.java
│ │ │ │ │ ├── BoundTab.java
│ │ │ │ │ ├── BoundTextField.java
│ │ │ │ │ ├── BoundToggleIcon.java
│ │ │ │ │ ├── ClosableActionMenuItem.java
│ │ │ │ │ ├── DynamicNumericTextField.java
│ │ │ │ │ ├── FontIconView.java
│ │ │ │ │ ├── GraphicActionButton.java
│ │ │ │ │ ├── IconView.java
│ │ │ │ │ ├── ImageCanvas.java
│ │ │ │ │ ├── ModalPaneComponent.java
│ │ │ │ │ ├── ObservableCheckBox.java
│ │ │ │ │ ├── ObservableComboBox.java
│ │ │ │ │ ├── ObservableSpinner.java
│ │ │ │ │ ├── PannableView.java
│ │ │ │ │ ├── PathNodeTree.java
│ │ │ │ │ ├── ReorderableListCell.java
│ │ │ │ │ ├── ResizableCanvas.java
│ │ │ │ │ ├── SubLabeled.java
│ │ │ │ │ ├── Tooltipable.java
│ │ │ │ │ ├── VirtualizedScrollPaneWrapper.java
│ │ │ │ │ ├── graph/
│ │ │ │ │ │ ├── MethodCallGraphPane.java
│ │ │ │ │ │ └── MethodCallGraphsPane.java
│ │ │ │ │ ├── popup/
│ │ │ │ │ │ ├── AddMemberPopup.java
│ │ │ │ │ │ ├── ChangeClassVersionPopup.java
│ │ │ │ │ │ ├── ClassSelectionPopup.java
│ │ │ │ │ │ ├── DecompileAllPopup.java
│ │ │ │ │ │ ├── ItemListSelectionPopup.java
│ │ │ │ │ │ ├── ItemTreeSelectionPopup.java
│ │ │ │ │ │ ├── NamePopup.java
│ │ │ │ │ │ ├── OpenUrlPopup.java
│ │ │ │ │ │ ├── OverrideMethodPopup.java
│ │ │ │ │ │ └── SelectionPopup.java
│ │ │ │ │ ├── richtext/
│ │ │ │ │ │ ├── AbstractLineItemTracking.java
│ │ │ │ │ │ ├── Editor.java
│ │ │ │ │ │ ├── EditorComponent.java
│ │ │ │ │ │ ├── SafeCodeArea.java
│ │ │ │ │ │ ├── ScrollbarPaddingUtil.java
│ │ │ │ │ │ ├── bracket/
│ │ │ │ │ │ │ ├── BracketMatchGraphicFactory.java
│ │ │ │ │ │ │ └── SelectedBracketTracking.java
│ │ │ │ │ │ ├── inheritance/
│ │ │ │ │ │ │ ├── Inheritance.java
│ │ │ │ │ │ │ ├── InheritanceGutterGraphicFactory.java
│ │ │ │ │ │ │ ├── InheritanceInvalidationListener.java
│ │ │ │ │ │ │ └── InheritanceTracking.java
│ │ │ │ │ │ ├── linegraphics/
│ │ │ │ │ │ │ ├── AbstractLineGraphicFactory.java
│ │ │ │ │ │ │ ├── AbstractTextBoundLineGraphicFactory.java
│ │ │ │ │ │ │ ├── LineContainer.java
│ │ │ │ │ │ │ ├── LineGraphicFactory.java
│ │ │ │ │ │ │ ├── LineNumberFactory.java
│ │ │ │ │ │ │ └── RootLineGraphicFactory.java
│ │ │ │ │ │ ├── problem/
│ │ │ │ │ │ │ ├── Problem.java
│ │ │ │ │ │ │ ├── ProblemGutterGraphicFactory.java
│ │ │ │ │ │ │ ├── ProblemInvalidationListener.java
│ │ │ │ │ │ │ ├── ProblemLevel.java
│ │ │ │ │ │ │ ├── ProblemPhase.java
│ │ │ │ │ │ │ ├── ProblemSquiggleGraphicFactory.java
│ │ │ │ │ │ │ └── ProblemTracking.java
│ │ │ │ │ │ ├── search/
│ │ │ │ │ │ │ └── SearchBar.java
│ │ │ │ │ │ ├── source/
│ │ │ │ │ │ │ ├── JavaContextActionManager.java
│ │ │ │ │ │ │ └── JavaContextActionSupport.java
│ │ │ │ │ │ ├── suggest/
│ │ │ │ │ │ │ ├── AssemblerTabCompleter.java
│ │ │ │ │ │ │ ├── CompletionPopup.java
│ │ │ │ │ │ │ ├── CompletionPopupFocuser.java
│ │ │ │ │ │ │ ├── CompletionPopupUpdater.java
│ │ │ │ │ │ │ ├── CompletionValueGraphicMapper.java
│ │ │ │ │ │ │ ├── CompletionValueTextifier.java
│ │ │ │ │ │ │ ├── ExistingWordTabCompleter.java
│ │ │ │ │ │ │ ├── TabCompleter.java
│ │ │ │ │ │ │ └── TabCompletionConfig.java
│ │ │ │ │ │ └── syntax/
│ │ │ │ │ │ ├── AbstractSyntaxHighlighter.java
│ │ │ │ │ │ ├── RegexLanguages.java
│ │ │ │ │ │ ├── RegexRule.java
│ │ │ │ │ │ ├── RegexSyntaxHighlighter.java
│ │ │ │ │ │ ├── StyleResult.java
│ │ │ │ │ │ ├── SyntaxHighlighter.java
│ │ │ │ │ │ └── SyntaxUtil.java
│ │ │ │ │ └── tree/
│ │ │ │ │ ├── FilterableTreeItem.java
│ │ │ │ │ ├── TreeFiltering.java
│ │ │ │ │ ├── TreeItems.java
│ │ │ │ │ ├── WorkspaceRootTreeNode.java
│ │ │ │ │ ├── WorkspaceTree.java
│ │ │ │ │ ├── WorkspaceTreeCell.java
│ │ │ │ │ ├── WorkspaceTreeFilterPane.java
│ │ │ │ │ └── WorkspaceTreeNode.java
│ │ │ │ ├── dnd/
│ │ │ │ │ ├── DragAndDrop.java
│ │ │ │ │ ├── FileDropListener.java
│ │ │ │ │ └── WorkspaceLoadingDropListener.java
│ │ │ │ ├── docking/
│ │ │ │ │ ├── DockingManager.java
│ │ │ │ │ └── EmbeddedBento.java
│ │ │ │ ├── media/
│ │ │ │ │ ├── CombinedPlayer.java
│ │ │ │ │ ├── FxPlayer.java
│ │ │ │ │ ├── MediaHacker.java
│ │ │ │ │ ├── Player.java
│ │ │ │ │ ├── SpectrumEvent.java
│ │ │ │ │ └── SpectrumListener.java
│ │ │ │ ├── menubar/
│ │ │ │ │ ├── AnalysisMenu.java
│ │ │ │ │ ├── ConfigMenu.java
│ │ │ │ │ ├── FileMenu.java
│ │ │ │ │ ├── HelpMenu.java
│ │ │ │ │ ├── MainMenu.java
│ │ │ │ │ ├── MainMenuProvider.java
│ │ │ │ │ ├── MappingMenu.java
│ │ │ │ │ ├── ScriptMenu.java
│ │ │ │ │ ├── SearchMenu.java
│ │ │ │ │ └── WorkspaceAwareMenu.java
│ │ │ │ ├── pane/
│ │ │ │ │ ├── CommentEditPane.java
│ │ │ │ │ ├── CommentListPane.java
│ │ │ │ │ ├── ConfigPane.java
│ │ │ │ │ ├── DocumentationPane.java
│ │ │ │ │ ├── LoggingPane.java
│ │ │ │ │ ├── MappingApplicationPane.java
│ │ │ │ │ ├── MappingGeneratorPane.java
│ │ │ │ │ ├── MappingProgressPane.java
│ │ │ │ │ ├── RemoteVirtualMachinesPane.java
│ │ │ │ │ ├── ScriptManagerPane.java
│ │ │ │ │ ├── SystemInformationPane.java
│ │ │ │ │ ├── WelcomePane.java
│ │ │ │ │ ├── WorkspaceBuilderPane.java
│ │ │ │ │ ├── WorkspaceExplorerPane.java
│ │ │ │ │ ├── WorkspaceInformationPane.java
│ │ │ │ │ ├── editing/
│ │ │ │ │ │ ├── AbstractClassInfoProvider.java
│ │ │ │ │ │ ├── AbstractContentPane.java
│ │ │ │ │ │ ├── AbstractDecompilePane.java
│ │ │ │ │ │ ├── AbstractDecompilerPaneConfigurator.java
│ │ │ │ │ │ ├── ClassPane.java
│ │ │ │ │ │ ├── DecompileFailureButton.java
│ │ │ │ │ │ ├── FileDisplayMode.java
│ │ │ │ │ │ ├── FilePane.java
│ │ │ │ │ │ ├── ProblemOverlay.java
│ │ │ │ │ │ ├── SideTabsInjector.java
│ │ │ │ │ │ ├── ToolsContainerComponent.java
│ │ │ │ │ │ ├── android/
│ │ │ │ │ │ │ ├── AndroidClassEditorType.java
│ │ │ │ │ │ │ ├── AndroidClassInfoProvider.java
│ │ │ │ │ │ │ ├── AndroidClassPane.java
│ │ │ │ │ │ │ ├── AndroidDecompilerPane.java
│ │ │ │ │ │ │ └── AndroidDecompilerPaneConfigurator.java
│ │ │ │ │ │ ├── assembler/
│ │ │ │ │ │ │ ├── AssemblerAstConsumer.java
│ │ │ │ │ │ │ ├── AssemblerBuildConsumer.java
│ │ │ │ │ │ │ ├── AssemblerContextActionSupport.java
│ │ │ │ │ │ │ ├── AssemblerPane.java
│ │ │ │ │ │ │ ├── AssemblerToolTabs.java
│ │ │ │ │ │ │ ├── AstBuildConsumerComponent.java
│ │ │ │ │ │ │ ├── AstPhase.java
│ │ │ │ │ │ │ ├── AstUsages.java
│ │ │ │ │ │ │ ├── ContextualAssemblerComponent.java
│ │ │ │ │ │ │ ├── ControlFlowLines.java
│ │ │ │ │ │ │ ├── ControlFlowLinesConfig.java
│ │ │ │ │ │ │ ├── JvmAssemblerBuildConsumer.java
│ │ │ │ │ │ │ ├── JvmExpressionCompilerPane.java
│ │ │ │ │ │ │ ├── JvmStackAnalysisPane.java
│ │ │ │ │ │ │ ├── JvmVariablesPane.java
│ │ │ │ │ │ │ ├── LabelData.java
│ │ │ │ │ │ │ ├── SnippetsPane.java
│ │ │ │ │ │ │ ├── TypeTableCell.java
│ │ │ │ │ │ │ ├── ValueTableCell.java
│ │ │ │ │ │ │ ├── VariableData.java
│ │ │ │ │ │ │ └── resolve/
│ │ │ │ │ │ │ ├── AssemblyResolution.java
│ │ │ │ │ │ │ ├── AssemblyResolver.java
│ │ │ │ │ │ │ ├── ClassAnnotationResolution.java
│ │ │ │ │ │ │ ├── ClassExtends.java
│ │ │ │ │ │ │ ├── ClassImplements.java
│ │ │ │ │ │ │ ├── EmptyResolution.java
│ │ │ │ │ │ │ ├── FieldAnnotationResolution.java
│ │ │ │ │ │ │ ├── FieldResolution.java
│ │ │ │ │ │ │ ├── IndependentAnnotationResolution.java
│ │ │ │ │ │ │ ├── InnerClassResolution.java
│ │ │ │ │ │ │ ├── InstructionResolution.java
│ │ │ │ │ │ │ ├── LabelDeclarationResolution.java
│ │ │ │ │ │ │ ├── LabelReferenceResolution.java
│ │ │ │ │ │ │ ├── MethodAnnotationResolution.java
│ │ │ │ │ │ │ ├── MethodResolution.java
│ │ │ │ │ │ │ ├── TypeReferenceResolution.java
│ │ │ │ │ │ │ └── VariableDeclarationResolution.java
│ │ │ │ │ │ ├── binary/
│ │ │ │ │ │ │ ├── DecodingXmlPane.java
│ │ │ │ │ │ │ ├── ElfPane.java
│ │ │ │ │ │ │ ├── PePane.java
│ │ │ │ │ │ │ └── hex/
│ │ │ │ │ │ │ ├── HexAdapter.java
│ │ │ │ │ │ │ ├── HexConfig.java
│ │ │ │ │ │ │ ├── HexEditor.java
│ │ │ │ │ │ │ ├── HexUtil.java
│ │ │ │ │ │ │ ├── cell/
│ │ │ │ │ │ │ │ ├── EditableAsciiCell.java
│ │ │ │ │ │ │ │ ├── EditableHexCell.java
│ │ │ │ │ │ │ │ ├── HexCell.java
│ │ │ │ │ │ │ │ ├── HexCellBase.java
│ │ │ │ │ │ │ │ ├── HexRow.java
│ │ │ │ │ │ │ │ └── HexRowHeader.java
│ │ │ │ │ │ │ └── ops/
│ │ │ │ │ │ │ ├── HexAccess.java
│ │ │ │ │ │ │ ├── HexNavigation.java
│ │ │ │ │ │ │ └── HexOperations.java
│ │ │ │ │ │ ├── jvm/
│ │ │ │ │ │ │ ├── DecompilerPaneConfig.java
│ │ │ │ │ │ │ ├── JvmClassEditorType.java
│ │ │ │ │ │ │ ├── JvmClassInfoProvider.java
│ │ │ │ │ │ │ ├── JvmClassPane.java
│ │ │ │ │ │ │ ├── JvmDecompilerPane.java
│ │ │ │ │ │ │ ├── JvmDecompilerPaneConfigurator.java
│ │ │ │ │ │ │ └── lowlevel/
│ │ │ │ │ │ │ ├── ClassElement.java
│ │ │ │ │ │ │ ├── ClassItem.java
│ │ │ │ │ │ │ ├── JvmLowLevelPane.java
│ │ │ │ │ │ │ └── LazyClassElement.java
│ │ │ │ │ │ ├── media/
│ │ │ │ │ │ │ ├── AudioPane.java
│ │ │ │ │ │ │ ├── ImagePane.java
│ │ │ │ │ │ │ ├── MediaPane.java
│ │ │ │ │ │ │ └── VideoPane.java
│ │ │ │ │ │ ├── tabs/
│ │ │ │ │ │ │ ├── FieldsAndMethodsPane.java
│ │ │ │ │ │ │ ├── InheritancePane.java
│ │ │ │ │ │ │ └── KotlinMetadataPane.java
│ │ │ │ │ │ └── text/
│ │ │ │ │ │ └── TextPane.java
│ │ │ │ │ └── search/
│ │ │ │ │ ├── AbstractMemberSearchPane.java
│ │ │ │ │ ├── AbstractSearchPane.java
│ │ │ │ │ ├── ClassReferenceSearchPane.java
│ │ │ │ │ ├── InstructionSearchPane.java
│ │ │ │ │ ├── MemberDeclarationSearchPane.java
│ │ │ │ │ ├── MemberReferenceSearchPane.java
│ │ │ │ │ ├── NumberSearchPane.java
│ │ │ │ │ ├── SearchContextSource.java
│ │ │ │ │ └── StringSearchPane.java
│ │ │ │ ├── window/
│ │ │ │ │ ├── AbstractIdentifiableStage.java
│ │ │ │ │ ├── ConfigWindow.java
│ │ │ │ │ ├── DeobfuscationWindow.java
│ │ │ │ │ ├── IdentifiableStage.java
│ │ │ │ │ ├── MappingApplicationWindow.java
│ │ │ │ │ ├── MappingGeneratorWindow.java
│ │ │ │ │ ├── MappingProgressWindow.java
│ │ │ │ │ ├── QuickNavWindow.java
│ │ │ │ │ ├── RecafScene.java
│ │ │ │ │ ├── RecafStage.java
│ │ │ │ │ ├── RemoteVirtualMachinesWindow.java
│ │ │ │ │ ├── ScriptManagerWindow.java
│ │ │ │ │ └── SystemInformationWindow.java
│ │ │ │ └── wizard/
│ │ │ │ ├── Wizard.java
│ │ │ │ └── WizardStage.java
│ │ │ ├── util/
│ │ │ │ ├── Animations.java
│ │ │ │ ├── ClipboardUtil.java
│ │ │ │ ├── Colors.java
│ │ │ │ ├── DirectoryChooserBuilder.java
│ │ │ │ ├── Effects.java
│ │ │ │ ├── ErrorDialogs.java
│ │ │ │ ├── FileChooserBuilder.java
│ │ │ │ ├── FileChooserBundle.java
│ │ │ │ ├── FxThreadUtil.java
│ │ │ │ ├── Icons.java
│ │ │ │ ├── IntRange.java
│ │ │ │ ├── JFXValidation.java
│ │ │ │ ├── Lang.java
│ │ │ │ ├── Menus.java
│ │ │ │ ├── NodeEvents.java
│ │ │ │ ├── RecafURLStreamHandlerProvider.java
│ │ │ │ ├── SVG.java
│ │ │ │ ├── SceneUtils.java
│ │ │ │ ├── SynchronizedSimpleStringProperty.java
│ │ │ │ ├── SynchronizedStringBinding.java
│ │ │ │ ├── TextDisplayUtil.java
│ │ │ │ ├── ToStringConverter.java
│ │ │ │ └── Translatable.java
│ │ │ └── workspace/
│ │ │ ├── PathExportingManager.java
│ │ │ ├── PathLoadingManager.java
│ │ │ └── WorkspacePreLoadListener.java
│ │ └── resources/
│ │ ├── icons/
│ │ │ └── Jetbrains-LICENSE.txt
│ │ ├── style/
│ │ │ ├── code-editor.css
│ │ │ ├── docking.css
│ │ │ ├── hex.css
│ │ │ ├── recaf.css
│ │ │ └── tweaks.css
│ │ ├── syntax/
│ │ │ ├── enigma.css
│ │ │ ├── enigma.json
│ │ │ ├── jasm.css
│ │ │ ├── jasm.json
│ │ │ ├── java.css
│ │ │ ├── java.json
│ │ │ ├── json.css
│ │ │ ├── json.json
│ │ │ ├── xml.css
│ │ │ └── xml.json
│ │ └── translations/
│ │ ├── cs_CZ.lang
│ │ ├── de_DE.lang
│ │ ├── en_US.lang
│ │ ├── ja_JP.lang
│ │ ├── pl_PL.lang
│ │ ├── ru_RU.lang
│ │ ├── sv_SE.lang
│ │ └── zh_CN.lang
│ └── test/
│ └── java/
│ └── software/
│ └── coley/
│ └── recaf/
│ ├── services/
│ │ └── script/
│ │ └── ScriptManagerTest.java
│ └── ui/
│ ├── BaseFxTest.java
│ └── control/
│ ├── richtext/
│ │ ├── bracket/
│ │ │ └── SelectedBracketTrackingTest.java
│ │ ├── problem/
│ │ │ └── ProblemTrackingTest.java
│ │ └── syntax/
│ │ └── RegexSyntaxHighlighterTest.java
│ └── tree/
│ └── WorkspaceTreeNodeTest.java
├── settings.gradle
└── setup/
├── code-style-eclipsej.xml
└── code-style-intellij.xml
Showing preview only (785K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (9970 symbols across 1224 files)
FILE: recaf-core/src/main/java/software/coley/recaf/Bootstrap.java
class Bootstrap (line 20) | public class Bootstrap {
method get (line 28) | @Nonnull
method setWeldConsumer (line 58) | public static void setWeldConsumer(@Nullable Consumer<Weld> consumer) {
method createContainer (line 62) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/ExitCodes.java
class ExitCodes (line 8) | public class ExitCodes {
FILE: recaf-core/src/main/java/software/coley/recaf/ExitDebugLoggingHook.java
class ExitDebugLoggingHook (line 40) | public class ExitDebugLoggingHook {
method register (line 51) | public static void register() {
method run (line 70) | private static void run() {
method handle (line 112) | private static void handle(int code) {
method dumpBuiltinClassLoader (line 234) | @SuppressWarnings("unchecked")
method dumpBootstrapClassLoader (line 252) | private static void dumpBootstrapClassLoader() {
method createSha1 (line 263) | @Nonnull
method exit (line 282) | public static void exit(int exitCode) {
FILE: recaf-core/src/main/java/software/coley/recaf/Recaf.java
class Recaf (line 15) | public class Recaf {
method Recaf (line 23) | public Recaf(@Nonnull SeContainer container) {
method getContainer (line 30) | public SeContainer getContainer() {
method instance (line 42) | @Nonnull
method instance (line 57) | @Nonnull
method get (line 70) | @Nonnull
method get (line 85) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/RecafConstants.java
class RecafConstants (line 10) | public final class RecafConstants {
method RecafConstants (line 11) | private RecafConstants() {
method getAsmVersion (line 17) | public static int getAsmVersion() {
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/SystemInformation.java
class SystemInformation (line 16) | public class SystemInformation {
method determineBitness (line 52) | private static int determineBitness() {
method dump (line 70) | public static void dump(@Nullable Logger logger) {
method dump (line 82) | public static void dump(@Nullable StringWriter writer) {
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/DebuggingLogger.java
type DebuggingLogger (line 15) | @ExcludeFromJacocoGeneratedReport(justification = "Logging not relevant ...
method debugging (line 25) | default void debugging(@Nonnull Consumer<DebuggingLogger> action) {
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/InterceptingLogger.java
class InterceptingLogger (line 16) | @ExcludeFromJacocoGeneratedReport(justification = "Logging not relevant ...
method InterceptingLogger (line 24) | protected InterceptingLogger(@Nonnull Logger backing) {
method intercept (line 36) | public abstract void intercept(Level level, String message);
method intercept (line 48) | public abstract void intercept(Level level, String message, Throwable t);
method getName (line 50) | @Override
method isTraceEnabled (line 55) | @Override
method isTraceEnabled (line 60) | @Override
method trace (line 65) | @Override
method trace (line 71) | @Override
method trace (line 76) | @Override
method trace (line 81) | @Override
method trace (line 87) | @Override
method trace (line 93) | @Override
method trace (line 99) | @Override
method trace (line 104) | @Override
method trace (line 109) | @Override
method trace (line 115) | @Override
method isDebugEnabled (line 121) | @Override
method isDebugEnabled (line 126) | @Override
method debug (line 131) | @Override
method debug (line 137) | @Override
method debug (line 142) | @Override
method debug (line 147) | @Override
method debug (line 153) | @Override
method debug (line 159) | @Override
method debug (line 165) | @Override
method debug (line 170) | @Override
method debug (line 175) | @Override
method debug (line 181) | @Override
method isInfoEnabled (line 187) | @Override
method isInfoEnabled (line 192) | @Override
method info (line 197) | @Override
method info (line 203) | @Override
method info (line 208) | @Override
method info (line 213) | @Override
method info (line 219) | @Override
method info (line 225) | @Override
method info (line 231) | @Override
method info (line 236) | @Override
method info (line 241) | @Override
method info (line 247) | @Override
method isWarnEnabled (line 253) | @Override
method isWarnEnabled (line 258) | @Override
method warn (line 263) | @Override
method warn (line 269) | @Override
method warn (line 274) | @Override
method warn (line 279) | @Override
method warn (line 285) | @Override
method warn (line 291) | @Override
method warn (line 297) | @Override
method warn (line 302) | @Override
method warn (line 307) | @Override
method warn (line 313) | @Override
method isErrorEnabled (line 319) | @Override
method isErrorEnabled (line 324) | @Override
method error (line 329) | @Override
method error (line 335) | @Override
method error (line 340) | @Override
method error (line 345) | @Override
method error (line 351) | @Override
method error (line 357) | @Override
method error (line 363) | @Override
method error (line 368) | @Override
method error (line 373) | @Override
method error (line 379) | @Override
method compile (line 385) | private static String compile(String message, Object[] arguments) {
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/LogConsumer.java
type LogConsumer (line 15) | public interface LogConsumer<T> {
method accept (line 24) | void accept(@Nonnull String loggerName, @Nonnull Level level, @Nullabl...
method accept (line 36) | void accept(@Nonnull String loggerName, @Nonnull Level level, @Nullabl...
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/Logging.java
class Logging (line 28) | @ExcludeFromJacocoGeneratedReport(justification = "Logging not relevant ...
method loggerKeys (line 38) | @Nonnull
method get (line 51) | @Nonnull
method get (line 62) | @Nonnull
method addLogConsumer (line 71) | public static void addLogConsumer(@Nonnull LogConsumer<String> consume...
method removeLogConsumer (line 79) | public static void removeLogConsumer(@Nonnull LogConsumer<String> cons...
method setInterceptLevel (line 89) | public static void setInterceptLevel(@Nonnull Level level) {
method addFileAppender (line 99) | @SuppressWarnings({"unchecked", "rawtypes"})
method intercept (line 128) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/analytics/logging/RecafLoggingFilter.java
class RecafLoggingFilter (line 19) | @ExcludeFromJacocoGeneratedReport(justification = "Logging not relevant ...
method RecafLoggingFilter (line 30) | public RecafLoggingFilter() {
method RecafLoggingFilter (line 41) | public RecafLoggingFilter(@Nullable Level level) {
method decide (line 45) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/behavior/Closing.java
type Closing (line 8) | public interface Closing {
method close (line 12) | void close();
FILE: recaf-core/src/main/java/software/coley/recaf/behavior/PriorityKeys.java
class PriorityKeys (line 10) | public final class PriorityKeys {
method PriorityKeys (line 19) | private PriorityKeys() {}
FILE: recaf-core/src/main/java/software/coley/recaf/behavior/PrioritySortable.java
type PrioritySortable (line 13) | public interface PrioritySortable extends Comparable<PrioritySortable> {
method getPriority (line 21) | default int getPriority() {
method compareTo (line 29) | @Override
method add (line 46) | static <T extends PrioritySortable> boolean add(@Nonnull List<T> items...
FILE: recaf-core/src/main/java/software/coley/recaf/cdi/EagerInitializationExtension.java
class EagerInitializationExtension (line 22) | public class EagerInitializationExtension implements Extension {
method EagerInitializationExtension (line 28) | private EagerInitializationExtension() {
method getInstance (line 34) | @Nonnull
method getApplicationScopedEagerBeans (line 42) | @Nonnull
method getApplicationScopedEagerBeansForUi (line 50) | @Nonnull
method onProcessBean (line 62) | public void onProcessBean(@Observes ProcessBean<?> event) {
method onInitialize (line 81) | public void onInitialize(@Observes InitializationEvent event, @Nonnull...
method onUiInitialize (line 96) | public void onUiInitialize(@Observes UiInitializationEvent event, @Non...
method create (line 102) | static void create(@Nonnull Bean<?> bean) {
FILE: recaf-core/src/main/java/software/coley/recaf/cdi/InitializationEvent.java
class InitializationEvent (line 9) | public class InitializationEvent {
FILE: recaf-core/src/main/java/software/coley/recaf/cdi/InitializationStage.java
type InitializationStage (line 9) | public enum InitializationStage {
FILE: recaf-core/src/main/java/software/coley/recaf/cdi/UiInitializationEvent.java
class UiInitializationEvent (line 9) | public class UiInitializationEvent {
FILE: recaf-core/src/main/java/software/coley/recaf/config/BasicCollectionConfigValue.java
class BasicCollectionConfigValue (line 18) | public class BasicCollectionConfigValue<T, C extends Collection<T>> impl...
method BasicCollectionConfigValue (line 33) | @SuppressWarnings("rawtypes")
method BasicCollectionConfigValue (line 51) | @SuppressWarnings({"rawtypes", "unchecked"})
method getId (line 64) | @Nonnull
method getType (line 70) | @Nonnull
method getItemType (line 76) | @Override
method getObservable (line 81) | @Nonnull
method isHidden (line 87) | @Override
method equals (line 92) | @Override
method hashCode (line 105) | @Override
method toString (line 114) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/config/BasicConfigContainer.java
class BasicConfigContainer (line 13) | public class BasicConfigContainer implements ConfigContainer {
method BasicConfigContainer (line 24) | public BasicConfigContainer(@Nonnull String group, @Nonnull String id) {
method addValue (line 33) | protected void addValue(@Nonnull ConfigValue<?> value) {
method getGroup (line 37) | @Nonnull
method getId (line 43) | @Nonnull
method getValues (line 49) | @Nonnull
method equals (line 55) | @Override
method hashCode (line 66) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/config/BasicConfigValue.java
class BasicConfigValue (line 14) | public class BasicConfigValue<T> implements ConfigValue<T> {
method BasicConfigValue (line 28) | public BasicConfigValue(String key, Class<T> type, Observable<T> obser...
method BasicConfigValue (line 42) | public BasicConfigValue(String key, Class<T> type, Observable<T> obser...
method getId (line 49) | @Nonnull
method getType (line 55) | @Nonnull
method getObservable (line 61) | @Nonnull
method isHidden (line 67) | @Override
method equals (line 72) | @Override
method hashCode (line 83) | @Override
method toString (line 90) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/config/BasicMapConfigValue.java
class BasicMapConfigValue (line 20) | public class BasicMapConfigValue<K, V, M extends Map<K, V>> implements C...
method BasicMapConfigValue (line 36) | @SuppressWarnings("rawtypes")
method BasicMapConfigValue (line 55) | @SuppressWarnings({"rawtypes", "unchecked"})
method getId (line 70) | @Nonnull
method getType (line 76) | @Nonnull
method getKeyType (line 82) | @Override
method getValueType (line 87) | @Override
method getObservable (line 92) | @Nonnull
method isHidden (line 98) | @Override
method equals (line 103) | @Override
method hashCode (line 118) | @Override
method toString (line 129) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigCollectionValue.java
type ConfigCollectionValue (line 15) | public interface ConfigCollectionValue<T, C extends Collection<T>> exten...
method getItemType (line 19) | Class<T> getItemType();
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigContainer.java
type ConfigContainer (line 18) | public interface ConfigContainer {
method getGroup (line 26) | @Nonnull
method getId (line 35) | @Nonnull
method getGroupAndId (line 41) | @Nonnull
method getValues (line 49) | @Nonnull
method getScopedId (line 58) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigGroups.java
class ConfigGroups (line 10) | public final class ConfigGroups {
method ConfigGroups (line 71) | private ConfigGroups() {
method getGroupPackages (line 80) | public static String[] getGroupPackages(ConfigContainer container) {
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigMapValue.java
type ConfigMapValue (line 17) | public interface ConfigMapValue<K, V, M extends Map<K, V>> extends Confi...
method getKeyType (line 21) | Class<K> getKeyType();
method getValueType (line 26) | Class<V> getValueType();
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigPersistence.java
type ConfigPersistence (line 10) | public interface ConfigPersistence {
method save (line 15) | void save(@Nonnull ConfigContainer container);
method load (line 21) | void load(@Nonnull ConfigContainer container);
FILE: recaf-core/src/main/java/software/coley/recaf/config/ConfigValue.java
type ConfigValue (line 14) | public interface ConfigValue<T> {
method getId (line 18) | @Nonnull
method getType (line 24) | @Nonnull
method getObservable (line 30) | @Nonnull
method setValue (line 37) | default void setValue(@Nonnull T value) {
method getValue (line 44) | @Nonnull
method isHidden (line 52) | default boolean isHidden() {
FILE: recaf-core/src/main/java/software/coley/recaf/config/RestoreAwareConfigContainer.java
type RestoreAwareConfigContainer (line 10) | public interface RestoreAwareConfigContainer extends ConfigContainer {
method onRestore (line 14) | default void onRestore() {}
method onNoRestore (line 20) | default void onNoRestore() {}
FILE: recaf-core/src/main/java/software/coley/recaf/info/Accessed.java
type Accessed (line 14) | public interface Accessed {
method getAccess (line 18) | int getAccess();
method hasPublicModifier (line 23) | default boolean hasPublicModifier() {
method hasProtectedModifier (line 30) | default boolean hasProtectedModifier() {
method hasPrivateModifier (line 37) | default boolean hasPrivateModifier() {
method hasPackagePrivateModifier (line 45) | default boolean hasPackagePrivateModifier() {
method hasStaticModifier (line 52) | default boolean hasStaticModifier() {
method hasFinalModifier (line 59) | default boolean hasFinalModifier() {
method hasSynchronizedModifier (line 66) | default boolean hasSynchronizedModifier() {
method hasVolatileModifier (line 73) | default boolean hasVolatileModifier() {
method hasTransientModifier (line 80) | default boolean hasTransientModifier() {
method hasNativeModifier (line 87) | default boolean hasNativeModifier() {
method hasEnumModifier (line 94) | default boolean hasEnumModifier() {
method hasAnnotationModifier (line 101) | default boolean hasAnnotationModifier() {
method hasInterfaceModifier (line 108) | default boolean hasInterfaceModifier() {
method hasModuleModifier (line 115) | default boolean hasModuleModifier() {
method hasAbstractModifier (line 122) | default boolean hasAbstractModifier() {
method hasStrictFpModifier (line 129) | default boolean hasStrictFpModifier() {
method hasVarargsModifier (line 136) | default boolean hasVarargsModifier() {
method hasBridgeModifier (line 143) | default boolean hasBridgeModifier() {
method hasSyntheticModifier (line 150) | default boolean hasSyntheticModifier() {
method isCompilerGenerated (line 157) | default boolean isCompilerGenerated() {
method hasModifierMask (line 167) | default boolean hasModifierMask(int mask) {
method hasAllModifiers (line 177) | default boolean hasAllModifiers(int... modifiers) {
method hasAnyModifiers (line 190) | default boolean hasAnyModifiers(int... modifiers) {
method hasNoneOfMask (line 203) | default boolean hasNoneOfMask(int mask) {
method hasNoneOfModifiers (line 213) | default boolean hasNoneOfModifiers(int... modifiers) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/AndroidChunkFileInfo.java
type AndroidChunkFileInfo (line 13) | public interface AndroidChunkFileInfo extends FileInfo {
method getChunkModel (line 17) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/AndroidClassInfo.java
type AndroidClassInfo (line 14) | public interface AndroidClassInfo extends ClassInfo {
method canMapToJvmClass (line 19) | default boolean canMapToJvmClass() {
method toAndroidBuilder (line 26) | @Nonnull
method acceptIfJvmClass (line 31) | @Override
method acceptIfAndroidClass (line 36) | @Override
method testIfJvmClass (line 41) | @Override
method testIfAndroidClass (line 46) | @Override
method asJvmClass (line 51) | @Nonnull
method asAndroidClass (line 57) | @Nonnull
method isJvmClass (line 63) | @Override
method isAndroidClass (line 68) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/ApkFileInfo.java
type ApkFileInfo (line 8) | public interface ApkFileInfo extends ZipFileInfo {
FILE: recaf-core/src/main/java/software/coley/recaf/info/ArscFileInfo.java
type ArscFileInfo (line 11) | public interface ArscFileInfo extends AndroidChunkFileInfo {
method getResourceInfo (line 20) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/AudioFileInfo.java
type AudioFileInfo (line 10) | public interface AudioFileInfo extends FileInfo {
method asAudioFile (line 11) | @Nonnull
method isAudioFile (line 17) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicAndroidChunkFileInfo.java
class BasicAndroidChunkFileInfo (line 12) | public class BasicAndroidChunkFileInfo extends BasicFileInfo implements ...
method BasicAndroidChunkFileInfo (line 19) | public BasicAndroidChunkFileInfo(ChunkFileInfoBuilder<?> builder) {
method getChunkModel (line 23) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicAndroidClassInfo.java
class BasicAndroidClassInfo (line 20) | public class BasicAndroidClassInfo extends BasicClassInfo implements And...
method BasicAndroidClassInfo (line 28) | public BasicAndroidClassInfo(@Nonnull AndroidClassInfoBuilder builder) {
method canMapToJvmClass (line 33) | @Override
method asJvmClass (line 42) | @Nonnull
method getDexClass (line 77) | @Nonnull
method toString (line 82) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicApkFileInfo.java
class BasicApkFileInfo (line 10) | public class BasicApkFileInfo extends BasicZipFileInfo implements ApkFil...
method BasicApkFileInfo (line 15) | public BasicApkFileInfo(ZipFileInfoBuilder builder) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicArscFileInfo.java
class BasicArscFileInfo (line 16) | public class BasicArscFileInfo extends BasicAndroidChunkFileInfo impleme...
method BasicArscFileInfo (line 24) | public BasicArscFileInfo(ArscFileInfoBuilder builder) {
method getResourceInfo (line 28) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicAudioFileInfo.java
class BasicAudioFileInfo (line 10) | public class BasicAudioFileInfo extends BasicFileInfo implements AudioFi...
method BasicAudioFileInfo (line 15) | public BasicAudioFileInfo(AudioFileInfoBuilder builder) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicBinaryXmlFileInfo.java
class BasicBinaryXmlFileInfo (line 10) | public class BasicBinaryXmlFileInfo extends BasicAndroidChunkFileInfo im...
method BasicBinaryXmlFileInfo (line 15) | public BasicBinaryXmlFileInfo(BinaryXmlFileInfoBuilder builder) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicClassInfo.java
class BasicClassInfo (line 29) | public abstract class BasicClassInfo implements ClassInfo {
method BasicClassInfo (line 51) | protected BasicClassInfo(@Nonnull AbstractClassInfoBuilder<?> builder) {
method BasicClassInfo (line 69) | protected BasicClassInfo(@Nonnull String name, String superName, @Nonn...
method getName (line 100) | @Nonnull
method getSuperName (line 106) | @Override
method getInterfaces (line 111) | @Nonnull
method getAccess (line 117) | @Override
method getSignature (line 122) | @Override
method getSourceFileName (line 127) | @Override
method getAnnotations (line 132) | @Nonnull
method getTypeAnnotations (line 138) | @Nonnull
method getOuterClassName (line 144) | @Override
method getOuterMethodName (line 149) | @Override
method getOuterMethodDescriptor (line 154) | @Override
method getOuterClassBreadcrumbs (line 159) | @Nonnull
method getInnerClasses (line 187) | @Nonnull
method getFields (line 193) | @Nonnull
method getMethods (line 199) | @Nonnull
method setProperty (line 205) | @Override
method removeProperty (line 210) | @Override
method getProperties (line 215) | @Nonnull
method equals (line 221) | @Override
method hashCode (line 247) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicDexFileInfo.java
class BasicDexFileInfo (line 10) | public class BasicDexFileInfo extends BasicFileInfo implements DexFileIn...
method BasicDexFileInfo (line 15) | public BasicDexFileInfo(DexFileInfoBuilder builder) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicFileInfo.java
class BasicFileInfo (line 16) | public class BasicFileInfo implements FileInfo {
method BasicFileInfo (line 21) | public BasicFileInfo(@Nonnull FileInfoBuilder<?> builder) {
method BasicFileInfo (line 35) | public BasicFileInfo(@Nonnull String name, @Nonnull byte[] rawContent,...
method getRawContent (line 41) | @Nonnull
method getName (line 47) | @Nonnull
method equals (line 53) | @Override
method hashCode (line 64) | @Override
method setProperty (line 71) | @Override
method removeProperty (line 76) | @Override
method getProperties (line 81) | @Nonnull
method toString (line 87) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicImageFileInfo.java
class BasicImageFileInfo (line 10) | public class BasicImageFileInfo extends BasicFileInfo implements ImageFi...
method BasicImageFileInfo (line 15) | public BasicImageFileInfo(ImageFileInfoBuilder builder) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicInnerClassInfo.java
class BasicInnerClassInfo (line 12) | public class BasicInnerClassInfo implements InnerClassInfo {
method BasicInnerClassInfo (line 32) | public BasicInnerClassInfo(String outerDeclaringClassName, String inne...
method getAccess (line 41) | @Override
method getOuterDeclaringClassName (line 46) | @Nonnull
method getInnerClassName (line 52) | @Nonnull
method getOuterClassName (line 58) | @Override
method getInnerName (line 63) | @Override
method getSimpleName (line 68) | @Nonnull
method equals (line 76) | @Override
method hashCode (line 90) | @Override
method toString (line 99) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicJModFileInfo.java
class BasicJModFileInfo (line 10) | public class BasicJModFileInfo extends BasicZipFileInfo implements JModF...
method BasicJModFileInfo (line 15) | public BasicJModFileInfo(JModFileInfoBuilder builder) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicJarFileInfo.java
class BasicJarFileInfo (line 10) | public class BasicJarFileInfo extends BasicZipFileInfo implements JarFil...
method BasicJarFileInfo (line 15) | public BasicJarFileInfo(JarFileInfoBuilder builder) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicJvmClassInfo.java
class BasicJvmClassInfo (line 14) | public class BasicJvmClassInfo extends BasicClassInfo implements JvmClas...
method BasicJvmClassInfo (line 23) | public BasicJvmClassInfo(@Nonnull JvmClassInfoBuilder builder) {
method getBytecode (line 29) | @Nonnull
method getClassReader (line 35) | @Nonnull
method getVersion (line 43) | @Override
method equals (line 48) | @Override
method hashCode (line 63) | @Override
method toString (line 71) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicModulesFileInfo.java
class BasicModulesFileInfo (line 10) | public class BasicModulesFileInfo extends BasicFileInfo implements Modul...
method BasicModulesFileInfo (line 15) | public BasicModulesFileInfo(ModulesFileInfoBuilder builder) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicNativeLibraryFileInfo.java
class BasicNativeLibraryFileInfo (line 10) | public class BasicNativeLibraryFileInfo extends BasicFileInfo implements...
method BasicNativeLibraryFileInfo (line 15) | public BasicNativeLibraryFileInfo(NativeLibraryFileInfoBuilder builder) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicTextFileInfo.java
class BasicTextFileInfo (line 13) | public class BasicTextFileInfo extends BasicFileInfo implements TextFile...
method BasicTextFileInfo (line 22) | public BasicTextFileInfo(@Nonnull TextFileInfoBuilder builder) {
method getText (line 28) | @Nonnull
method getTextLines (line 34) | @Nonnull
method getCharset (line 42) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicVideoFileInfo.java
class BasicVideoFileInfo (line 10) | public class BasicVideoFileInfo extends BasicFileInfo implements VideoFi...
method BasicVideoFileInfo (line 15) | public BasicVideoFileInfo(VideoFileInfoBuilder builder) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicWarFileInfo.java
class BasicWarFileInfo (line 10) | public class BasicWarFileInfo extends BasicZipFileInfo implements WarFil...
method BasicWarFileInfo (line 15) | public BasicWarFileInfo(WarFileInfoBuilder builder) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/BasicZipFileInfo.java
class BasicZipFileInfo (line 10) | public class BasicZipFileInfo extends BasicFileInfo implements ZipFileIn...
method BasicZipFileInfo (line 15) | public BasicZipFileInfo(ZipFileInfoBuilder builder) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/BinaryXmlFileInfo.java
type BinaryXmlFileInfo (line 8) | public interface BinaryXmlFileInfo extends AndroidChunkFileInfo {
FILE: recaf-core/src/main/java/software/coley/recaf/info/ClassInfo.java
type ClassInfo (line 25) | public interface ClassInfo extends Info, Annotated, Accessed {
method getSourceFileName (line 30) | @Nullable
method getInterfaces (line 36) | @Nonnull
method getSuperName (line 43) | @Nullable
method getPackageName (line 50) | @Nullable
method isInDefaultPackage (line 61) | default boolean isInDefaultPackage() {
method parentTypesStream (line 69) | @Nonnull
method getSignature (line 80) | @Nullable
method getOuterClassName (line 87) | @Nullable
method getOuterMethodName (line 96) | @Nullable
method getOuterMethodDescriptor (line 105) | @Nullable
method getOuterClassBreadcrumbs (line 126) | @Nonnull
method getInnerClasses (line 132) | @Nonnull
method getInnerClassByInnerName (line 152) | @Nullable
method isInnerClass (line 163) | default boolean isInnerClass() {
method isInnerClassOf (line 173) | default boolean isInnerClassOf(@Nonnull String className) {
method isAnonymousInnerClass (line 183) | default boolean isAnonymousInnerClass() {
method getFields (line 193) | @Nonnull
method getMethods (line 199) | @Nonnull
method fieldStream (line 205) | @Nonnull
method methodStream (line 213) | @Nonnull
method fieldAndMethodStream (line 221) | @Nonnull
method getFirstDeclaredFieldByName (line 235) | @Nullable
method getDeclaredField (line 250) | @Nullable
method getDeclaredMethod (line 265) | @Nullable
method getFirstDeclaredMethodByName (line 281) | @Nullable
method acceptIfJvmClass (line 292) | void acceptIfJvmClass(@Nonnull Consumer<JvmClassInfo> action);
method acceptIfAndroidClass (line 298) | void acceptIfAndroidClass(@Nonnull Consumer<AndroidClassInfo> action);
method acceptClass (line 304) | default void acceptClass(@Nonnull Consumer<ClassInfo> action) {
method testIfJvmClass (line 315) | boolean testIfJvmClass(@Nonnull Predicate<JvmClassInfo> predicate);
method testIfAndroidClass (line 324) | boolean testIfAndroidClass(@Nonnull Predicate<AndroidClassInfo> predic...
method testClass (line 332) | default boolean testClass(@Nonnull Predicate<ClassInfo> predicate) {
method mapClass (line 344) | default <R> R mapClass(@Nonnull Function<ClassInfo, R> function) {
method asClass (line 348) | @Nonnull
method asFile (line 354) | @Nonnull
method asJvmClass (line 363) | @Nonnull
method asAndroidClass (line 369) | @Nonnull
method isClass (line 372) | @Override
method isFile (line 377) | @Override
method isJvmClass (line 385) | boolean isJvmClass();
method isAndroidClass (line 390) | boolean isAndroidClass();
FILE: recaf-core/src/main/java/software/coley/recaf/info/DexFileInfo.java
type DexFileInfo (line 8) | public interface DexFileInfo extends FileInfo {
FILE: recaf-core/src/main/java/software/coley/recaf/info/FileInfo.java
type FileInfo (line 12) | public interface FileInfo extends Info {
method toFileBuilder (line 16) | @Nonnull
method getRawContent (line 24) | @Nonnull
method getFileExtension (line 30) | @Nullable
method getDirectoryName (line 43) | @Nullable
method asClass (line 51) | @Nonnull
method asFile (line 57) | @Nonnull
method asTextFile (line 66) | @Nonnull
method asImageFile (line 74) | @Nonnull
method asAudioFile (line 82) | @Nonnull
method asVideoFile (line 90) | @Nonnull
method asNativeLibraryFile (line 98) | @Nonnull
method asZipFile (line 106) | @Nonnull
method isClass (line 111) | @Override
method isFile (line 116) | @Override
method isTextFile (line 124) | default boolean isTextFile() {
method isImageFile (line 131) | default boolean isImageFile() {
method isAudioFile (line 138) | default boolean isAudioFile() {
method isVideoFile (line 145) | default boolean isVideoFile() {
method isNativeLibraryFile (line 152) | default boolean isNativeLibraryFile() {
method isZipFile (line 159) | default boolean isZipFile() {
FILE: recaf-core/src/main/java/software/coley/recaf/info/ImageFileInfo.java
type ImageFileInfo (line 10) | public interface ImageFileInfo extends FileInfo {
method asImageFile (line 11) | @Nonnull
method isImageFile (line 17) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/Info.java
type Info (line 11) | public interface Info extends Named, PropertyContainer {
method asClass (line 15) | @Nonnull
method asFile (line 21) | @Nonnull
method isClass (line 27) | boolean isClass();
method isFile (line 32) | boolean isFile();
FILE: recaf-core/src/main/java/software/coley/recaf/info/InnerClassInfo.java
type InnerClassInfo (line 16) | public interface InnerClassInfo extends Accessed, Named {
method getName (line 17) | @Nonnull
method getOuterDeclaringClassName (line 26) | @Nonnull
method getInnerClassName (line 39) | @Nonnull
method getOuterClassName (line 53) | @Nullable
method getInnerName (line 67) | @Nullable
method isExternalReference (line 77) | default boolean isExternalReference() {
method getInnerAccess (line 84) | default int getInnerAccess() {
method getSimpleName (line 92) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/JModFileInfo.java
type JModFileInfo (line 9) | public interface JModFileInfo extends ZipFileInfo {
FILE: recaf-core/src/main/java/software/coley/recaf/info/JarFileInfo.java
type JarFileInfo (line 8) | public interface JarFileInfo extends ZipFileInfo {
FILE: recaf-core/src/main/java/software/coley/recaf/info/JvmClassInfo.java
type JvmClassInfo (line 24) | public interface JvmClassInfo extends ClassInfo {
method toJvmClassBuilder (line 39) | @Nonnull
method getVersion (line 47) | int getVersion();
method getBytecode (line 52) | @Nonnull
method getClassReader (line 58) | @Nonnull
method getClassReaderFlags (line 64) | default int getClassReaderFlags() {
method getReferencedClasses (line 75) | @Nonnull
method addMethodType (line 133) | private static void addMethodType(@Nonnull Type methodType, @Nonnull S...
method addType (line 140) | private static void addType(@Nonnull Type type, @Nonnull Set<String> c...
method addName (line 147) | private static void addName(@Nonnull String className, @Nonnull Set<St...
method getStringConstants (line 161) | @Nonnull
method acceptIfJvmClass (line 185) | @Override
method acceptIfAndroidClass (line 190) | @Override
method testIfJvmClass (line 195) | @Override
method testIfAndroidClass (line 200) | @Override
method asJvmClass (line 205) | @Nonnull
method asAndroidClass (line 211) | @Nonnull
method isJvmClass (line 217) | @Override
method isAndroidClass (line 222) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/ModulesFileInfo.java
type ModulesFileInfo (line 9) | public interface ModulesFileInfo extends FileInfo {
FILE: recaf-core/src/main/java/software/coley/recaf/info/Named.java
type Named (line 15) | public interface Named {
method getName (line 98) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/NativeLibraryFileInfo.java
type NativeLibraryFileInfo (line 10) | public interface NativeLibraryFileInfo extends FileInfo {
method asNativeLibraryFile (line 11) | @Nonnull
method isNativeLibraryFile (line 17) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/StubClassInfo.java
class StubClassInfo (line 25) | @ExcludeFromJacocoGeneratedReport(justification = "Stub/placeholder type")
method StubClassInfo (line 35) | public StubClassInfo(@Nonnull String name) {
method StubClassInfo (line 47) | public StubClassInfo(@Nonnull String name,
method getAccess (line 55) | @Override
method getSourceFileName (line 60) | @Nullable
method getInterfaces (line 66) | @Nonnull
method getSuperName (line 72) | @Nullable
method getSignature (line 78) | @Nullable
method getOuterClassName (line 84) | @Nullable
method getOuterMethodName (line 90) | @Nullable
method getOuterMethodDescriptor (line 96) | @Nullable
method getOuterClassBreadcrumbs (line 102) | @Nonnull
method getInnerClasses (line 108) | @Nonnull
method getFields (line 114) | @Nonnull
method getMethods (line 120) | @Nonnull
method acceptIfJvmClass (line 126) | @Override
method acceptIfAndroidClass (line 131) | @Override
method testIfJvmClass (line 136) | @Override
method testIfAndroidClass (line 141) | @Override
method isJvmClass (line 146) | @Override
method isAndroidClass (line 151) | @Override
method getName (line 156) | @Nonnull
method getAnnotations (line 162) | @Nonnull
method getTypeAnnotations (line 168) | @Nonnull
method setProperty (line 174) | @Override
method removeProperty (line 179) | @Override
method getProperties (line 184) | @Nonnull
method asJvmClass (line 190) | @Nonnull
method asAndroidClass (line 196) | @Nonnull
method equals (line 202) | @Override
method hashCode (line 212) | @Override
method toString (line 217) | @Override
class Android (line 222) | private static class Android extends StubClassInfo implements AndroidC...
method Android (line 223) | public Android(@Nonnull String name) {
method asAndroidClass (line 227) | @Nonnull
class Jvm (line 234) | private static class Jvm extends StubClassInfo implements JvmClassInfo {
method Jvm (line 235) | public Jvm(@Nonnull String name) {
method asJvmClass (line 239) | @Nonnull
method getVersion (line 245) | @Override
method getBytecode (line 250) | @Nonnull
method getClassReader (line 256) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/StubFieldMember.java
class StubFieldMember (line 13) | @ExcludeFromJacocoGeneratedReport(justification = "Stub/placeholder type")
method StubFieldMember (line 23) | public StubFieldMember(@Nonnull String name, @Nonnull String desc, int...
method getDefaultValue (line 27) | @Nullable
method toString (line 33) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/StubFileInfo.java
class StubFileInfo (line 18) | @ExcludeFromJacocoGeneratedReport(justification = "Stub/placeholder type")
method StubFileInfo (line 26) | public StubFileInfo(@Nonnull String name) {
method withText (line 36) | @Nonnull
method withText (line 49) | @Nonnull
method getRawContent (line 54) | @Nonnull
method getName (line 60) | @Nonnull
method setProperty (line 66) | @Override
method removeProperty (line 71) | @Override
method getProperties (line 76) | @Nonnull
method equals (line 82) | @Override
method hashCode (line 92) | @Override
class StubTextFileInfo (line 97) | private static class StubTextFileInfo extends StubFileInfo implements ...
method StubTextFileInfo (line 109) | public StubTextFileInfo(@Nonnull String name, @Nonnull Charset chars...
method getText (line 116) | @Nonnull
method getTextLines (line 122) | @Nonnull
method getCharset (line 128) | @Nonnull
method equals (line 134) | @Override
method hashCode (line 145) | @Override
method toString (line 152) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/StubMember.java
class StubMember (line 20) | @ExcludeFromJacocoGeneratedReport(justification = "Stub/placeholder type")
method StubMember (line 31) | public StubMember(@Nonnull String name, @Nonnull String desc, int acce...
method getName (line 37) | @Nonnull
method getDescriptor (line 43) | @Nonnull
method getSignature (line 49) | @Nullable
method getAccess (line 55) | @Override
method getAnnotations (line 60) | @Nonnull
method getTypeAnnotations (line 66) | @Nonnull
method setProperty (line 72) | @Override
method removeProperty (line 75) | @Override
method getProperties (line 78) | @Nonnull
method equals (line 84) | @Override
method hashCode (line 93) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/StubMethodMember.java
class StubMethodMember (line 18) | @ExcludeFromJacocoGeneratedReport(justification = "Stub/placeholder type")
method StubMethodMember (line 28) | public StubMethodMember(@Nonnull String name, @Nonnull String desc, in...
method getThrownTypes (line 32) | @Nonnull
method getLocalVariables (line 38) | @Nonnull
method getAnnotationDefault (line 44) | @Nullable
method toString (line 50) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/TextFileInfo.java
type TextFileInfo (line 13) | public interface TextFileInfo extends FileInfo {
method toTextBuilder (line 17) | @Nonnull
method getText (line 25) | @Nonnull
method getTextLines (line 31) | @Nonnull
method getCharset (line 37) | @Nonnull
method asTextFile (line 40) | @Nonnull
method isTextFile (line 46) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/VideoFileInfo.java
type VideoFileInfo (line 10) | public interface VideoFileInfo extends FileInfo {
method asVideoFile (line 11) | @Nonnull
method isVideoFile (line 17) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/WarFileInfo.java
type WarFileInfo (line 8) | public interface WarFileInfo extends ZipFileInfo {
FILE: recaf-core/src/main/java/software/coley/recaf/info/ZipFileInfo.java
type ZipFileInfo (line 14) | public interface ZipFileInfo extends FileInfo {
method asZipFile (line 15) | @Nonnull
method isZipFile (line 21) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/Annotated.java
type Annotated (line 17) | public interface Annotated {
method getAnnotations (line 21) | @Nonnull
method getTypeAnnotations (line 27) | @Nonnull
method annotationStream (line 33) | @Nonnull
method typeAnnotationStream (line 41) | @Nonnull
method allAnnotationsStream (line 49) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/AnnotationArrayReference.java
type AnnotationArrayReference (line 12) | public interface AnnotationArrayReference {
method getValues (line 16) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/AnnotationElement.java
type AnnotationElement (line 13) | public interface AnnotationElement {
method getElementName (line 17) | @Nonnull
method getElementValue (line 24) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/AnnotationEnumReference.java
type AnnotationEnumReference (line 10) | public interface AnnotationEnumReference {
method getDescriptor (line 14) | @Nonnull
method getValue (line 20) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/AnnotationInfo.java
type AnnotationInfo (line 15) | public interface AnnotationInfo extends Annotated {
method withTypeInfo (line 24) | @Nonnull
method isVisible (line 30) | boolean isVisible();
method getDescriptor (line 35) | @Nonnull
method getElements (line 41) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicAnnotationArrayReference.java
class BasicAnnotationArrayReference (line 13) | public class BasicAnnotationArrayReference implements AnnotationArrayRef...
method BasicAnnotationArrayReference (line 20) | public BasicAnnotationArrayReference(List<Object> values) {
method getValues (line 24) | @Nonnull
method equals (line 29) | @Override
method hashCode (line 39) | @Override
method toString (line 44) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicAnnotationElement.java
class BasicAnnotationElement (line 12) | public class BasicAnnotationElement implements AnnotationElement {
method BasicAnnotationElement (line 22) | public BasicAnnotationElement(String name, Object value) {
method getElementName (line 27) | @Nonnull
method getElementValue (line 33) | @Nonnull
method equals (line 39) | @Override
method hashCode (line 50) | @Override
method toString (line 57) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicAnnotationEnumReference.java
class BasicAnnotationEnumReference (line 10) | public class BasicAnnotationEnumReference implements AnnotationEnumRefer...
method BasicAnnotationEnumReference (line 20) | public BasicAnnotationEnumReference(String descriptor, String value) {
method getDescriptor (line 25) | @Nonnull
method getValue (line 31) | @Nonnull
method equals (line 37) | @Override
method hashCode (line 48) | @Override
method toString (line 55) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicAnnotationInfo.java
class BasicAnnotationInfo (line 17) | public class BasicAnnotationInfo implements AnnotationInfo {
method BasicAnnotationInfo (line 30) | public BasicAnnotationInfo(boolean visible, @Nonnull String descriptor) {
method addElement (line 42) | public void addElement(@Nonnull AnnotationElement element) {
method addAnnotation (line 53) | public void addAnnotation(@Nonnull AnnotationInfo annotation) {
method addTypeAnnotation (line 64) | public void addTypeAnnotation(@Nonnull TypeAnnotationInfo typeAnnotati...
method withTypeInfo (line 68) | @Nonnull
method isVisible (line 74) | @Override
method getDescriptor (line 79) | @Nonnull
method getElements (line 85) | @Nonnull
method getAnnotations (line 91) | @Nonnull
method getTypeAnnotations (line 97) | @Nonnull
method equals (line 103) | @Override
method hashCode (line 115) | @Override
method toString (line 123) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicTypeAnnotationInfo.java
class BasicTypeAnnotationInfo (line 14) | public class BasicTypeAnnotationInfo extends BasicAnnotationInfo impleme...
method BasicTypeAnnotationInfo (line 29) | public BasicTypeAnnotationInfo(int typeRef, @Nullable TypePath typePath,
method getTypeRef (line 36) | @Override
method getTypePath (line 41) | @Nullable
method equals (line 47) | @Override
method hashCode (line 59) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/annotation/TypeAnnotationInfo.java
type TypeAnnotationInfo (line 12) | public interface TypeAnnotationInfo extends AnnotationInfo {
method getTypeRef (line 18) | int getTypeRef();
method getTypePath (line 23) | @Nullable
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/AbstractClassInfoBuilder.java
class AbstractClassInfoBuilder (line 27) | public abstract class AbstractClassInfoBuilder<B extends AbstractClassIn...
method AbstractClassInfoBuilder (line 44) | protected AbstractClassInfoBuilder() {
method AbstractClassInfoBuilder (line 48) | protected AbstractClassInfoBuilder(ClassInfo classInfo) {
method forClass (line 67) | @SuppressWarnings("unchecked")
method withName (line 77) | @SuppressWarnings("unchecked")
method withSuperName (line 83) | @SuppressWarnings("unchecked")
method withInterfaces (line 89) | @SuppressWarnings("unchecked")
method withAccess (line 98) | @SuppressWarnings("unchecked")
method withSignature (line 104) | @SuppressWarnings("unchecked")
method withSourceFileName (line 110) | @SuppressWarnings("unchecked")
method withAnnotations (line 116) | @SuppressWarnings("unchecked")
method withTypeAnnotations (line 125) | @SuppressWarnings("unchecked")
method withOuterClassName (line 131) | @SuppressWarnings("unchecked")
method withOuterMethodName (line 137) | @SuppressWarnings("unchecked")
method withOuterMethodDescriptor (line 143) | @SuppressWarnings("unchecked")
method withInnerClasses (line 149) | @SuppressWarnings("unchecked")
method withFields (line 158) | @SuppressWarnings("unchecked")
method withMethods (line 167) | @SuppressWarnings("unchecked")
method withPropertyContainer (line 176) | @SuppressWarnings("unchecked")
method getName (line 182) | public String getName() {
method getSuperName (line 186) | public String getSuperName() {
method getInterfaces (line 190) | public List<String> getInterfaces() {
method getAccess (line 194) | public int getAccess() {
method getSignature (line 198) | public String getSignature() {
method getSourceFileName (line 202) | public String getSourceFileName() {
method getAnnotations (line 206) | public List<AnnotationInfo> getAnnotations() {
method getTypeAnnotations (line 210) | public List<TypeAnnotationInfo> getTypeAnnotations() {
method getOuterClassName (line 214) | public String getOuterClassName() {
method getOuterMethodName (line 218) | public String getOuterMethodName() {
method getOuterMethodDescriptor (line 222) | public String getOuterMethodDescriptor() {
method getInnerClasses (line 226) | public List<InnerClassInfo> getInnerClasses() {
method getFields (line 230) | public List<FieldMember> getFields() {
method getMethods (line 234) | public List<MethodMember> getMethods() {
method getPropertyContainer (line 238) | public PropertyContainer getPropertyContainer() {
method build (line 242) | public abstract ClassInfo build();
method verify (line 244) | protected void verify() {
class AccessImpl (line 251) | static class AccessImpl implements Accessed {
method getAccess (line 254) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/AndroidClassInfoBuilder.java
class AndroidClassInfoBuilder (line 25) | public class AndroidClassInfoBuilder extends AbstractClassInfoBuilder<An...
method AndroidClassInfoBuilder (line 31) | public AndroidClassInfoBuilder() {
method AndroidClassInfoBuilder (line 41) | public AndroidClassInfoBuilder(AndroidClassInfo classInfo) {
method getDexClass (line 50) | public DexProgramClass getDexClass() {
method build (line 54) | @Override
method adaptFrom (line 68) | @Nonnull
method mapFields (line 98) | @Nonnull
method mapMethods (line 115) | @Nonnull
method mapAnnos (line 132) | @Nonnull
method mapAnno (line 140) | @Nonnull
method mapAnno (line 152) | @Nonnull
method unbox (line 164) | private static Object unbox(DexValue value) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/ApkFileInfoBuilder.java
class ApkFileInfoBuilder (line 11) | public class ApkFileInfoBuilder extends ZipFileInfoBuilder {
method ApkFileInfoBuilder (line 12) | public ApkFileInfoBuilder() {
method ApkFileInfoBuilder (line 16) | public ApkFileInfoBuilder(@Nonnull ApkFileInfo apkInfo) {
method ApkFileInfoBuilder (line 20) | public ApkFileInfoBuilder(@Nonnull ZipFileInfoBuilder other) {
method build (line 24) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/ArscFileInfoBuilder.java
class ArscFileInfoBuilder (line 13) | public class ArscFileInfoBuilder extends ChunkFileInfoBuilder<ArscFileIn...
method ArscFileInfoBuilder (line 14) | public ArscFileInfoBuilder() {
method ArscFileInfoBuilder (line 18) | public ArscFileInfoBuilder(ArscFileInfo arscInfo) {
method build (line 22) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/AudioFileInfoBuilder.java
class AudioFileInfoBuilder (line 12) | public class AudioFileInfoBuilder extends FileInfoBuilder<AudioFileInfoB...
method AudioFileInfoBuilder (line 13) | public AudioFileInfoBuilder() {
method AudioFileInfoBuilder (line 17) | public AudioFileInfoBuilder(AudioFileInfo audioFileInfo) {
method AudioFileInfoBuilder (line 21) | public AudioFileInfoBuilder(FileInfoBuilder<?> other) {
method build (line 25) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/BinaryXmlFileInfoBuilder.java
class BinaryXmlFileInfoBuilder (line 12) | public class BinaryXmlFileInfoBuilder extends ChunkFileInfoBuilder<Binar...
method BinaryXmlFileInfoBuilder (line 13) | public BinaryXmlFileInfoBuilder() {
method BinaryXmlFileInfoBuilder (line 17) | public BinaryXmlFileInfoBuilder(BinaryXmlFileInfo xmlInfo) {
method build (line 21) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/ChunkFileInfoBuilder.java
class ChunkFileInfoBuilder (line 13) | public abstract class ChunkFileInfoBuilder<B extends ChunkFileInfoBuilde...
method ChunkFileInfoBuilder (line 14) | public ChunkFileInfoBuilder() {
method ChunkFileInfoBuilder (line 18) | public ChunkFileInfoBuilder(AndroidChunkFileInfo chunkInfo) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/DexFileInfoBuilder.java
class DexFileInfoBuilder (line 12) | public class DexFileInfoBuilder extends FileInfoBuilder<DexFileInfoBuild...
method DexFileInfoBuilder (line 13) | public DexFileInfoBuilder() {
method DexFileInfoBuilder (line 17) | public DexFileInfoBuilder(DexFileInfo dexFileInfo) {
method DexFileInfoBuilder (line 21) | public DexFileInfoBuilder(FileInfoBuilder<?> other) {
method build (line 25) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/FileInfoBuilder.java
class FileInfoBuilder (line 19) | public class FileInfoBuilder<B extends FileInfoBuilder<?>> {
method FileInfoBuilder (line 25) | public FileInfoBuilder() {
method FileInfoBuilder (line 29) | protected FileInfoBuilder(@Nonnull FileInfo fileInfo) {
method FileInfoBuilder (line 36) | protected FileInfoBuilder(@Nonnull FileInfoBuilder<?> other) {
method forFile (line 42) | @Nonnull
method withProperties (line 73) | @SuppressWarnings("unchecked")
method withProperty (line 79) | @SuppressWarnings("unchecked")
method withName (line 85) | @SuppressWarnings("unchecked")
method withRawContent (line 91) | @SuppressWarnings("unchecked")
method getProperties (line 98) | public PropertyContainer getProperties() {
method getName (line 102) | public String getName() {
method getRawContent (line 106) | public byte[] getRawContent() {
method getDecodingResult (line 113) | @Nonnull
method build (line 120) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/ImageFileInfoBuilder.java
class ImageFileInfoBuilder (line 12) | public class ImageFileInfoBuilder extends FileInfoBuilder<ImageFileInfoB...
method ImageFileInfoBuilder (line 13) | public ImageFileInfoBuilder() {
method ImageFileInfoBuilder (line 17) | public ImageFileInfoBuilder(ImageFileInfo imageFileInfo) {
method ImageFileInfoBuilder (line 21) | public ImageFileInfoBuilder(FileInfoBuilder<?> other) {
method build (line 25) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/JModFileInfoBuilder.java
class JModFileInfoBuilder (line 11) | public class JModFileInfoBuilder extends ZipFileInfoBuilder {
method JModFileInfoBuilder (line 12) | public JModFileInfoBuilder() {
method JModFileInfoBuilder (line 16) | public JModFileInfoBuilder(@Nonnull JModFileInfo jmodInfo) {
method JModFileInfoBuilder (line 20) | public JModFileInfoBuilder(@Nonnull FileInfoBuilder<?> other) {
method build (line 24) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/JarFileInfoBuilder.java
class JarFileInfoBuilder (line 12) | public class JarFileInfoBuilder extends ZipFileInfoBuilder {
method JarFileInfoBuilder (line 13) | public JarFileInfoBuilder() {
method JarFileInfoBuilder (line 17) | public JarFileInfoBuilder(@Nonnull JarFileInfo jarInfo) {
method JarFileInfoBuilder (line 21) | public JarFileInfoBuilder(@Nonnull ZipFileInfoBuilder other) {
method build (line 25) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/JvmClassInfoBuilder.java
class JvmClassInfoBuilder (line 56) | public class JvmClassInfoBuilder extends AbstractClassInfoBuilder<JvmCla...
method JvmClassInfoBuilder (line 66) | public JvmClassInfoBuilder() {
method JvmClassInfoBuilder (line 76) | public JvmClassInfoBuilder(@Nonnull JvmClassInfo classInfo) {
method JvmClassInfoBuilder (line 88) | public JvmClassInfoBuilder(@Nonnull ClassReader reader) {
method JvmClassInfoBuilder (line 100) | public JvmClassInfoBuilder(@Nonnull ClassReader reader, int readerFlag...
method JvmClassInfoBuilder (line 110) | public JvmClassInfoBuilder(@Nonnull byte[] bytecode) {
method JvmClassInfoBuilder (line 122) | public JvmClassInfoBuilder(@Nonnull byte[] bytecode, int readerFlags) {
method adaptFrom (line 147) | @Nonnull
method adaptFrom (line 175) | @Nonnull
method adaptFrom (line 201) | @Nonnull
method adaptFrom (line 228) | @Nonnull
method withBytecode (line 247) | @Nonnull
method withVersion (line 253) | @Nonnull
method skipValidationChecks (line 268) | @Nonnull
method getBytecode (line 274) | public byte[] getBytecode() {
method getVersion (line 278) | public int getVersion() {
method build (line 282) | @Override
method verify (line 290) | @Override
class ClassBuilderAdapter (line 306) | private class ClassBuilderAdapter extends ClassVisitor {
method ClassBuilderAdapter (line 316) | protected ClassBuilderAdapter(@Nullable ClassVisitor cv) {
method visit (line 322) | @Override
method visitSource (line 338) | @Override
method visitOuterClass (line 344) | @Override
method visitAnnotation (line 352) | @Override
method visitTypeAnnotation (line 359) | @Override
method visitInnerClass (line 367) | @Override
method visitAttribute (line 393) | @Override
method validateAttribute (line 402) | private void validateAttribute(@Nonnull Attribute attribute, @Nonnul...
method visitField (line 412) | @Override
method visitMethod (line 434) | @Override
method visitRecordComponent (line 456) | @Override
method visitEnd (line 468) | @Override
method hasCustomAttributes (line 491) | public boolean hasCustomAttributes() {
method getCustomAttributeNames (line 500) | @Nonnull
class FieldBuilderAdapter (line 517) | private static class FieldBuilderAdapter extends FieldVisitor {
method FieldBuilderAdapter (line 520) | public FieldBuilderAdapter(FieldVisitor fv, int access, String name,...
method visitAnnotation (line 526) | @Override
method visitTypeAnnotation (line 531) | @Override
method getFieldMember (line 537) | @Nonnull
class MethodBuilderAdapter (line 543) | private static class MethodBuilderAdapter extends MethodVisitor {
method MethodBuilderAdapter (line 550) | public MethodBuilderAdapter(MethodVisitor mv, int access, String nam...
method visitAnnotation (line 559) | @Override
method visitTypeAnnotation (line 564) | @Override
method visitLocalVariable (line 570) | @Override
method visitParameter (line 577) | @Override
method visitAnnotationDefault (line 597) | @Override
method visitEnd (line 605) | @Override
method getMethodMember (line 619) | @Nonnull
class AnnotationBuilderAdapter (line 625) | private static class AnnotationBuilderAdapter extends AnnotationVisitor {
method AnnotationBuilderAdapter (line 633) | protected AnnotationBuilderAdapter(boolean visible, String descriptor,
method visit (line 641) | @Override
method visitEnum (line 653) | @Override
method visitAnnotation (line 664) | @Override
method visitArray (line 681) | @Override
method visitEnd (line 693) | @Override
method populate (line 699) | protected void populate(@Nonnull BasicAnnotationInfo anno) {
class DefaultAnnotationAdapter (line 706) | private static class DefaultAnnotationAdapter extends AnnotationBuilde...
method DefaultAnnotationAdapter (line 709) | protected DefaultAnnotationAdapter(Consumer<BasicAnnotationInfo> ann...
method visitEnum (line 713) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/ModulesFileInfoBuilder.java
class ModulesFileInfoBuilder (line 12) | public class ModulesFileInfoBuilder extends FileInfoBuilder<ModulesFileI...
method ModulesFileInfoBuilder (line 13) | public ModulesFileInfoBuilder() {
method ModulesFileInfoBuilder (line 17) | public ModulesFileInfoBuilder(ModulesFileInfo modulesFileInfo) {
method ModulesFileInfoBuilder (line 21) | public ModulesFileInfoBuilder(FileInfoBuilder<?> other) {
method build (line 25) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/NativeLibraryFileInfoBuilder.java
class NativeLibraryFileInfoBuilder (line 12) | public class NativeLibraryFileInfoBuilder extends FileInfoBuilder<Native...
method NativeLibraryFileInfoBuilder (line 13) | public NativeLibraryFileInfoBuilder() {
method NativeLibraryFileInfoBuilder (line 17) | public NativeLibraryFileInfoBuilder(NativeLibraryFileInfo libraryFileI...
method NativeLibraryFileInfoBuilder (line 21) | public NativeLibraryFileInfoBuilder(FileInfoBuilder<?> other) {
method build (line 25) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/TextFileInfoBuilder.java
class TextFileInfoBuilder (line 16) | public class TextFileInfoBuilder extends FileInfoBuilder<TextFileInfoBui...
method TextFileInfoBuilder (line 17) | public TextFileInfoBuilder() {
method TextFileInfoBuilder (line 21) | public TextFileInfoBuilder(@Nonnull TextFileInfo textInfo) {
method TextFileInfoBuilder (line 26) | public TextFileInfoBuilder(@Nonnull FileInfoBuilder<?> other, @Nonnull...
method withText (line 31) | @Nonnull
method getText (line 36) | @Nonnull
method getCharset (line 41) | @Nonnull
method build (line 46) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/VideoFileInfoBuilder.java
class VideoFileInfoBuilder (line 12) | public class VideoFileInfoBuilder extends FileInfoBuilder<VideoFileInfoB...
method VideoFileInfoBuilder (line 13) | public VideoFileInfoBuilder() {
method VideoFileInfoBuilder (line 17) | public VideoFileInfoBuilder(VideoFileInfo videoFileInfo) {
method VideoFileInfoBuilder (line 21) | public VideoFileInfoBuilder(FileInfoBuilder<?> other) {
method build (line 25) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/WarFileInfoBuilder.java
class WarFileInfoBuilder (line 11) | public class WarFileInfoBuilder extends ZipFileInfoBuilder {
method WarFileInfoBuilder (line 12) | public WarFileInfoBuilder() {
method WarFileInfoBuilder (line 16) | public WarFileInfoBuilder(@Nonnull WarFileInfo warInfo) {
method WarFileInfoBuilder (line 20) | public WarFileInfoBuilder(@Nonnull FileInfoBuilder<?> other) {
method build (line 24) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/builder/ZipFileInfoBuilder.java
class ZipFileInfoBuilder (line 16) | public class ZipFileInfoBuilder extends FileInfoBuilder<ZipFileInfoBuild...
method ZipFileInfoBuilder (line 17) | public ZipFileInfoBuilder() {
method ZipFileInfoBuilder (line 21) | public ZipFileInfoBuilder(@Nonnull ZipFileInfo zipInfo) {
method ZipFileInfoBuilder (line 25) | public ZipFileInfoBuilder(@Nonnull FileInfoBuilder<?> other) {
method asJar (line 29) | @Nonnull
method asApk (line 34) | @Nonnull
method asJMod (line 39) | @Nonnull
method asWar (line 44) | @Nonnull
method build (line 49) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/member/BasicFieldMember.java
class BasicFieldMember (line 10) | public class BasicFieldMember extends BasicMember implements FieldMember {
method BasicFieldMember (line 25) | public BasicFieldMember(String name, String desc, String signature, in...
method getDefaultValue (line 30) | @Override
method toString (line 35) | @Override
method equals (line 40) | @Override
method hashCode (line 53) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/member/BasicLocalVariable.java
class BasicLocalVariable (line 13) | public class BasicLocalVariable implements LocalVariable {
method BasicLocalVariable (line 29) | public BasicLocalVariable(int index, @Nonnull String name, @Nonnull St...
method getIndex (line 36) | @Override
method getName (line 41) | @Nonnull
method getDescriptor (line 47) | @Nonnull
method getSignature (line 53) | @Nullable
method equals (line 59) | @Override
method hashCode (line 72) | @Override
method toString (line 81) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/member/BasicMember.java
class BasicMember (line 22) | public abstract class BasicMember implements ClassMember {
method BasicMember (line 32) | protected BasicMember(@Nonnull String name, @Nonnull String desc, @Nul...
method addAnnotation (line 46) | public void addAnnotation(@Nonnull AnnotationInfo annotation) {
method addTypeAnnotation (line 59) | public void addTypeAnnotation(@Nonnull TypeAnnotationInfo typeAnnotati...
method setDeclaringClass (line 71) | public void setDeclaringClass(@Nonnull ClassInfo declaringClass) {
method getDeclaringClass (line 75) | @Override
method getAccess (line 80) | @Override
method getName (line 85) | @Nonnull
method getDescriptor (line 91) | @Nonnull
method getSignature (line 97) | @Override
method getAnnotations (line 102) | @Nonnull
method getTypeAnnotations (line 110) | @Nonnull
method setProperty (line 118) | @Override
method removeProperty (line 125) | @Override
method getProperties (line 131) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/member/BasicMethodMember.java
class BasicMethodMember (line 17) | public class BasicMethodMember extends BasicMember implements MethodMemb...
method BasicMethodMember (line 34) | public BasicMethodMember(@Nonnull String name, @Nonnull String desc, @...
method addLocalVariable (line 44) | public void addLocalVariable(@Nonnull LocalVariable variable) {
method setAnnotationDefault (line 54) | public void setAnnotationDefault(@Nonnull AnnotationElement annotation...
method getThrownTypes (line 58) | @Nonnull
method getLocalVariables (line 64) | @Nonnull
method getAnnotationDefault (line 72) | @Nullable
method toString (line 78) | @Override
method equals (line 83) | @Override
method hashCode (line 97) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/member/ClassMember.java
type ClassMember (line 16) | public interface ClassMember extends PropertyContainer, Annotated, Acces...
method getName (line 20) | @Nonnull
method getDescriptor (line 26) | @Nonnull
method getSignature (line 32) | @Nullable
method getDeclaringClass (line 39) | @Nullable
method isDeclarationAware (line 48) | default boolean isDeclarationAware() {
method isField (line 55) | boolean isField();
method isMethod (line 60) | boolean isMethod();
FILE: recaf-core/src/main/java/software/coley/recaf/info/member/FieldMember.java
type FieldMember (line 11) | public interface FieldMember extends ClassMember {
method getDefaultValue (line 19) | @Nullable
method isField (line 22) | @Override
method isMethod (line 27) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/member/LocalVariable.java
type LocalVariable (line 11) | public interface LocalVariable {
method getIndex (line 15) | int getIndex();
method getName (line 20) | @Nonnull
method getDescriptor (line 26) | @Nonnull
method getSignature (line 32) | @Nullable
FILE: recaf-core/src/main/java/software/coley/recaf/info/member/MethodMember.java
type MethodMember (line 15) | public interface MethodMember extends ClassMember {
method getThrownTypes (line 19) | @Nonnull
method getLocalVariables (line 25) | @Nonnull
method getAnnotationDefault (line 31) | @Nullable
method getLocalVariable (line 40) | @Nullable
method isField (line 47) | @Override
method isMethod (line 52) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/BasicProperty.java
class BasicProperty (line 15) | public class BasicProperty<V> implements Property<V> {
method BasicProperty (line 25) | public BasicProperty(String key, V value) {
method key (line 30) | @Nonnull
method value (line 36) | @Override
method equals (line 41) | @Override
method hashCode (line 52) | @Override
method toString (line 59) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/BasicPropertyContainer.java
class BasicPropertyContainer (line 16) | public class BasicPropertyContainer implements PropertyContainer {
method BasicPropertyContainer (line 22) | public BasicPropertyContainer() {
method BasicPropertyContainer (line 30) | public BasicPropertyContainer(@Nullable Map<String, Property<?>> prope...
method setProperty (line 34) | @Override
method removeProperty (line 41) | @Override
method getProperties (line 47) | @Nonnull
method equals (line 55) | @Override
method hashCode (line 65) | @Override
method toString (line 71) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/Property.java
type Property (line 14) | public interface Property<V> {
method key (line 18) | @Nonnull
method value (line 24) | @Nullable
method persistent (line 44) | default boolean persistent() {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/PropertyContainer.java
type PropertyContainer (line 15) | public interface PropertyContainer {
method setPropertyValue (line 24) | default <V> void setPropertyValue(String key, V value) {
method setProperty (line 34) | <V> void setProperty(Property<V> property);
method setPropertyIfMissing (line 44) | default <V> void setPropertyIfMissing(String key, Supplier<Property<V>...
method removeProperty (line 53) | void removeProperty(String key);
method getProperty (line 63) | @Nullable
method getPropertyValueOrNull (line 77) | @Nullable
method getProperties (line 88) | @Nonnull
method getPersistentProperties (line 94) | default Map<String, Property<?>> getPersistentProperties() {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/BinaryXmlDecodedProperty.java
class BinaryXmlDecodedProperty (line 14) | public class BinaryXmlDecodedProperty extends BasicProperty<String> {
method BinaryXmlDecodedProperty (line 21) | public BinaryXmlDecodedProperty(@Nonnull String value) {
method get (line 31) | @Nullable
method set (line 42) | public static void set(@Nonnull Info info, @Nonnull String xml) {
method remove (line 50) | public static void remove(@Nonnull Info info) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/CachedDecompileProperty.java
class CachedDecompileProperty (line 19) | public class CachedDecompileProperty extends BasicProperty<CachedDecompi...
method CachedDecompileProperty (line 25) | public CachedDecompileProperty() {
method set (line 37) | public static void set(@Nonnull ClassInfo classInfo, @Nonnull Decompil...
method get (line 57) | @Nullable
method remove (line 68) | public static void remove(@Nonnull ClassInfo info) {
method persistent (line 72) | @Override
class Cache (line 81) | public static class Cache {
method get (line 90) | public DecompileResult get(String decompilerId) {
method save (line 100) | public void save(String decompilerId, DecompileResult result) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/HasMappedReferenceProperty.java
class HasMappedReferenceProperty (line 13) | public class HasMappedReferenceProperty extends BasicProperty<Void> {
method HasMappedReferenceProperty (line 17) | private HasMappedReferenceProperty() {
method set (line 25) | public static void set(@Nonnull ClassInfo info) {
method remove (line 33) | public static void remove(@Nonnull ClassInfo info) {
method get (line 43) | public static boolean get(@Nonnull ClassInfo info) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/IllegalClassSuspectProperty.java
class IllegalClassSuspectProperty (line 14) | public class IllegalClassSuspectProperty extends BasicProperty<Boolean> {
method IllegalClassSuspectProperty (line 21) | private IllegalClassSuspectProperty() {
method persistent (line 25) | @Override
method get (line 36) | public static boolean get(@Nonnull FileInfo info) {
method set (line 51) | public static void set(@Nonnull FileInfo info) {
method remove (line 59) | public static void remove(@Nonnull FileInfo info) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/InputFilePathProperty.java
class InputFilePathProperty (line 15) | public class InputFilePathProperty extends BasicProperty<Path> {
method InputFilePathProperty (line 22) | public InputFilePathProperty(@Nonnull Path value) {
method get (line 32) | @Nullable
method set (line 43) | public static void set(@Nonnull Info info, @Nonnull Path inputPath) {
method remove (line 51) | public static void remove(@Nonnull Info info) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/MemberIndexAcceleratorProperty.java
class MemberIndexAcceleratorProperty (line 21) | public class MemberIndexAcceleratorProperty extends BasicProperty<Map<Cl...
method MemberIndexAcceleratorProperty (line 32) | public MemberIndexAcceleratorProperty(@Nonnull ClassInfo classInfo) {
method get (line 51) | @Nonnull
method indexOf (line 67) | public int indexOf(@Nonnull ClassMember member) {
method persistent (line 71) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/OriginalClassNameProperty.java
class OriginalClassNameProperty (line 16) | public class OriginalClassNameProperty extends BasicProperty<String> {
method OriginalClassNameProperty (line 23) | public OriginalClassNameProperty(@Nonnull String value) {
method map (line 33) | @Nonnull
method get (line 48) | @Nullable
method set (line 59) | public static void set(@Nonnull ClassInfo info, @Nonnull String origin...
method remove (line 67) | public static void remove(@Nonnull ClassInfo info) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/PathOriginalNameProperty.java
class PathOriginalNameProperty (line 16) | public class PathOriginalNameProperty extends BasicProperty<String> {
method PathOriginalNameProperty (line 23) | public PathOriginalNameProperty(@Nonnull String value) {
method map (line 33) | @Nonnull
method get (line 48) | @Nullable
method set (line 59) | public static void set(@Nonnull Info info, @Nonnull String original) {
method remove (line 67) | public static void remove(@Nonnull Info info) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/PathPrefixProperty.java
class PathPrefixProperty (line 21) | public class PathPrefixProperty extends BasicProperty<String> {
method PathPrefixProperty (line 28) | public PathPrefixProperty(@Nonnull String value) {
method map (line 38) | @Nonnull
method get (line 53) | @Nullable
method set (line 64) | public static void set(@Nonnull Info info, @Nonnull String prefix) {
method remove (line 72) | public static void remove(@Nonnull Info info) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/PathSuffixProperty.java
class PathSuffixProperty (line 17) | public class PathSuffixProperty extends BasicProperty<String> {
method PathSuffixProperty (line 24) | public PathSuffixProperty(@Nonnull String value) {
method map (line 34) | @Nonnull
method get (line 49) | @Nullable
method set (line 60) | public static void set(@Nonnull Info info, @Nonnull String suffix) {
method remove (line 68) | public static void remove(@Nonnull Info info) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ReferencedClassesProperty.java
class ReferencedClassesProperty (line 19) | public class ReferencedClassesProperty extends BasicProperty<NavigableSe...
method ReferencedClassesProperty (line 26) | public ReferencedClassesProperty(@Nonnull Collection<String> classes) {
method get (line 36) | @Nullable
method set (line 49) | @Nonnull
method remove (line 60) | public static void remove(@Nonnull ClassInfo info) {
method persistent (line 64) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/RemapOriginTaskProperty.java
class RemapOriginTaskProperty (line 19) | public class RemapOriginTaskProperty extends BasicProperty<MappingResult...
method RemapOriginTaskProperty (line 26) | public RemapOriginTaskProperty(@Nonnull MappingResults value) {
method persistent (line 30) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/RemoteClassloaderProperty.java
class RemoteClassloaderProperty (line 17) | public class RemoteClassloaderProperty extends BasicProperty<Integer> {
method RemoteClassloaderProperty (line 25) | private RemoteClassloaderProperty(int value) {
method get (line 37) | @Nullable
method set (line 49) | public static synchronized void set(@Nonnull JvmClassInfo classInfo, i...
method remove (line 59) | public static void remove(@Nonnull JvmClassInfo info) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/StringDefinitionsProperty.java
class StringDefinitionsProperty (line 17) | public class StringDefinitionsProperty extends BasicProperty<SortedSet<S...
method StringDefinitionsProperty (line 24) | public StringDefinitionsProperty(@Nonnull Collection<String> strings) {
method get (line 34) | @Nullable
method set (line 45) | public static void set(@Nonnull ClassInfo info, @Nonnull Collection<St...
method remove (line 53) | public static void remove(@Nonnull ClassInfo info) {
method persistent (line 57) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ThrowableProperty.java
class ThrowableProperty (line 14) | public class ThrowableProperty extends BasicProperty<Boolean> {
method ThrowableProperty (line 20) | public ThrowableProperty() {
method persistent (line 24) | @Override
method get (line 35) | public static boolean get(@Nonnull ClassInfo info) {
method set (line 50) | public static void set(@Nonnull ClassInfo info) {
method remove (line 58) | public static void remove(@Nonnull ClassInfo info) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/UnknownAttributesProperty.java
class UnknownAttributesProperty (line 17) | public class UnknownAttributesProperty extends BasicProperty<Collection<...
method UnknownAttributesProperty (line 24) | public UnknownAttributesProperty(@Nonnull Collection<String> unknownAt...
method remove (line 32) | public static void remove(@Nonnull ClassInfo info) {
method has (line 42) | public static boolean has(@Nonnull ClassInfo info) {
method get (line 52) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/VersionedClassProperty.java
class VersionedClassProperty (line 17) | public class VersionedClassProperty extends BasicProperty<Integer> {
method VersionedClassProperty (line 25) | private VersionedClassProperty(int value) {
method get (line 37) | @Nullable
method set (line 49) | public static void set(@Nonnull JvmClassInfo classInfo, int version) {
method remove (line 59) | public static void remove(@Nonnull JvmClassInfo classInfo) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipAccessTimeProperty.java
class ZipAccessTimeProperty (line 18) | public class ZipAccessTimeProperty extends BasicProperty<Long> {
method ZipAccessTimeProperty (line 25) | public ZipAccessTimeProperty(long value) {
method get (line 36) | @Nullable
method getOr (line 54) | public static long getOr(@Nonnull Info info, long fallback) {
method set (line 66) | public static void set(@Nonnull Info info, long value) {
method remove (line 74) | public static void remove(@Nonnull Info info) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipCommentProperty.java
class ZipCommentProperty (line 15) | public class ZipCommentProperty extends BasicProperty<String> {
method ZipCommentProperty (line 22) | public ZipCommentProperty(@Nullable String value) {
method get (line 33) | @Nullable
method getOr (line 51) | public static String getOr(@Nonnull Info info, String fallback) {
method set (line 63) | public static void set(@Nonnull Info info, @Nonnull String value) {
method remove (line 71) | public static void remove(@Nonnull Info info) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipCompressionProperty.java
class ZipCompressionProperty (line 16) | public class ZipCompressionProperty extends BasicProperty<Integer> {
method ZipCompressionProperty (line 23) | public ZipCompressionProperty(int value) {
method get (line 34) | @Nullable
method getOr (line 52) | public static int getOr(@Nonnull Info info, int fallback) {
method set (line 64) | public static void set(@Nonnull Info info, int value) {
method remove (line 72) | public static void remove(@Nonnull Info info) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipCreationTimeProperty.java
class ZipCreationTimeProperty (line 18) | public class ZipCreationTimeProperty extends BasicProperty<Long> {
method ZipCreationTimeProperty (line 25) | public ZipCreationTimeProperty(long value) {
method get (line 36) | @Nullable
method getOr (line 54) | public static long getOr(@Nonnull Info info, long fallback) {
method set (line 66) | public static void set(@Nonnull Info info, long value) {
method remove (line 74) | public static void remove(@Nonnull Info info) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipEntryIndexProperty.java
class ZipEntryIndexProperty (line 14) | public class ZipEntryIndexProperty extends BasicProperty<Integer> {
method ZipEntryIndexProperty (line 21) | public ZipEntryIndexProperty(int value) {
method persistent (line 26) | @Override
method get (line 38) | @Nullable
method getOr (line 56) | public static int getOr(@Nonnull Info info, int fallback) {
method set (line 68) | public static void set(@Nonnull Info info, int value) {
method remove (line 76) | public static void remove(@Nonnull Info info) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipMarkerProperty.java
class ZipMarkerProperty (line 13) | public class ZipMarkerProperty extends BasicProperty<Boolean> {
method ZipMarkerProperty (line 19) | public ZipMarkerProperty() {
method persistent (line 23) | @Override
method get (line 34) | public static boolean get(@Nonnull FileInfo info) {
method set (line 49) | public static void set(@Nonnull FileInfo info) {
method remove (line 57) | public static void remove(@Nonnull FileInfo info) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipModificationTimeProperty.java
class ZipModificationTimeProperty (line 15) | public class ZipModificationTimeProperty extends BasicProperty<Long> {
method ZipModificationTimeProperty (line 22) | public ZipModificationTimeProperty(long value) {
method get (line 33) | @Nullable
method getOr (line 51) | public static long getOr(@Nonnull Info info, long fallback) {
method set (line 63) | public static void set(@Nonnull Info info, long value) {
method remove (line 71) | public static void remove(@Nonnull Info info) {
FILE: recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipPrefixDataProperty.java
class ZipPrefixDataProperty (line 14) | public class ZipPrefixDataProperty extends BasicProperty<byte[]> {
method ZipPrefixDataProperty (line 21) | public ZipPrefixDataProperty(@Nullable byte[] data) {
method get (line 32) | @Nullable
method set (line 47) | public static void set(@Nonnull Info info, @Nonnull byte[] value) {
method remove (line 55) | public static void remove(@Nonnull Info info) {
FILE: recaf-core/src/main/java/software/coley/recaf/launch/LaunchArguments.java
class LaunchArguments (line 16) | @ApplicationScoped
method LaunchArguments (line 22) | @Inject
method setCommand (line 31) | public void setCommand(@Nonnull LaunchCommand command) {
method setRawArgs (line 41) | public void setRawArgs(@Nonnull String[] args) {
method getArgs (line 48) | @Nonnull
method getInput (line 56) | @Nullable
method getScript (line 68) | @Nullable
method getScriptInScriptsDirectory (line 80) | @Nullable
method isHeadless (line 90) | public boolean isHeadless() {
FILE: recaf-core/src/main/java/software/coley/recaf/launch/LaunchCommand.java
class LaunchCommand (line 28) | @Command(name = "recaf", mixinStandardHelpOptions = true, version = Reca...
method call (line 50) | @Override
method getInput (line 105) | @Nullable
method getScript (line 113) | @Nullable
method isHeadless (line 121) | public boolean isHeadless() {
FILE: recaf-core/src/main/java/software/coley/recaf/launch/LaunchHandler.java
class LaunchHandler (line 16) | @ApplicationScoped
method run (line 23) | @PostConstruct
FILE: recaf-core/src/main/java/software/coley/recaf/path/AbstractPathNode.java
class AbstractPathNode (line 19) | public abstract class AbstractPathNode<P, V> implements PathNode<V> {
method AbstractPathNode (line 33) | protected AbstractPathNode(@Nonnull String id, @Nullable PathNode<P> p...
method parentValue (line 45) | @Nullable
method cmpHierarchy (line 59) | protected int cmpHierarchy(@Nonnull PathNode<?> path) {
method cmpParent (line 84) | protected int cmpParent(@Nonnull PathNode<?> path) {
method getParent (line 90) | @Override
method typeId (line 95) | @Nonnull
method getValueType (line 101) | @Nonnull
method getValue (line 107) | @Nonnull
method compareTo (line 114) | @Override
method equals (line 123) | @Override
method hashCode (line 133) | @Override
method toString (line 141) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/path/AnnotationPathNode.java
class AnnotationPathNode (line 15) | public class AnnotationPathNode extends AbstractPathNode<Object, Annotat...
method AnnotationPathNode (line 27) | public AnnotationPathNode(@Nonnull AnnotationInfo annotation) {
method AnnotationPathNode (line 44) | @SuppressWarnings("unchecked")
method child (line 55) | @Nonnull
method directParentTypeIds (line 60) | @Nonnull
method localCompare (line 66) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/path/BundlePathNode.java
class BundlePathNode (line 20) | @SuppressWarnings("rawtypes")
method BundlePathNode (line 33) | public BundlePathNode(@Nonnull Bundle<?> bundle) {
method BundlePathNode (line 47) | public BundlePathNode(@Nullable ResourcePathNode parent, @Nonnull Bund...
method child (line 57) | @Nonnull
method isInJvmBundle (line 65) | public boolean isInJvmBundle() {
method isInAndroidBundle (line 73) | @SuppressWarnings("all")
method isInFileBundle (line 82) | public boolean isInFileBundle() {
method isInVersionedJvmBundle (line 90) | public boolean isInVersionedJvmBundle() {
method bundleMask (line 100) | private int bundleMask() {
method getParent (line 107) | @Override
method directParentTypeIds (line 112) | @Nonnull
method hasEqualOrChildValue (line 118) | @Override
method localCompare (line 129) | @Override
method equals (line 174) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/path/CatchPathNode.java
class CatchPathNode (line 15) | public class CatchPathNode extends AbstractPathNode<ClassMember, String> {
method CatchPathNode (line 27) | public CatchPathNode(@Nonnull String type) {
method CatchPathNode (line 41) | public CatchPathNode(@Nullable ClassMemberPathNode parent, @Nonnull St...
method getParent (line 45) | @Override
method directParentTypeIds (line 50) | @Nonnull
method localCompare (line 56) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/path/ClassMemberPathNode.java
class ClassMemberPathNode (line 22) | public class ClassMemberPathNode extends AbstractPathNode<ClassInfo, Cla...
method ClassMemberPathNode (line 34) | public ClassMemberPathNode(@Nonnull ClassMember member) {
method ClassMemberPathNode (line 48) | public ClassMemberPathNode(@Nullable ClassPathNode parent, @Nonnull Cl...
method isField (line 55) | public boolean isField() {
method isMethod (line 62) | public boolean isMethod() {
method childThrows (line 72) | @Nonnull
method childCatch (line 85) | @Nonnull
method childAnnotation (line 98) | @Nonnull
method childVariable (line 109) | @Nonnull
method childInsn (line 124) | @Nonnull
method hasEqualOrChildValue (line 131) | @Override
method getParent (line 148) | @Override
method directParentTypeIds (line 153) | @Nonnull
method localCompare (line 159) | @Override
method equals (line 210) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/path/ClassPathNode.java
class ClassPathNode (line 20) | public class ClassPathNode extends AbstractPathNode<String, ClassInfo> {
method ClassPathNode (line 32) | public ClassPathNode(@Nonnull ClassInfo info) {
method ClassPathNode (line 46) | public ClassPathNode(@Nullable DirectoryPathNode parent, @Nonnull Clas...
method child (line 59) | @Nullable
method child (line 79) | @Nonnull
method child (line 90) | @Nonnull
method child (line 101) | @Nonnull
method withCurrentWorkspaceContent (line 106) | @Nonnull
method hasEqualOrChildValue (line 118) | @Override
method getParent (line 134) | @Override
method directParentTypeIds (line 139) | @Nonnull
method localCompare (line 145) | @Override
method equals (line 157) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/path/DirectoryPathNode.java
class DirectoryPathNode (line 19) | @SuppressWarnings("rawtypes")
method DirectoryPathNode (line 32) | public DirectoryPathNode(@Nonnull String directory) {
method DirectoryPathNode (line 46) | public DirectoryPathNode(@Nullable BundlePathNode parent, @Nonnull Str...
method withDirectory (line 56) | @Nonnull
method child (line 67) | @Nonnull
method child (line 78) | @Nonnull
method getParent (line 83) | @Override
method directParentTypeIds (line 89) | @Nonnull
method hasEqualOrChildValue (line 95) | @Override
method isDescendantOf (line 113) | @Override
method localCompare (line 123) | @Override
method equals (line 135) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/path/EmbeddedResourceContainerPathNode.java
class EmbeddedResourceContainerPathNode (line 15) | public class EmbeddedResourceContainerPathNode extends AbstractPathNode<...
method EmbeddedResourceContainerPathNode (line 29) | public EmbeddedResourceContainerPathNode(@Nullable ResourcePathNode pa...
method child (line 40) | @Nonnull
method getParent (line 45) | @Override
method directParentTypeIds (line 50) | @Nonnull
method localCompare (line 56) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/path/FilePathNode.java
class FilePathNode (line 17) | public class FilePathNode extends AbstractPathNode<String, FileInfo> {
method FilePathNode (line 29) | public FilePathNode(@Nonnull FileInfo info) {
method FilePathNode (line 43) | public FilePathNode(@Nullable DirectoryPathNode parent, @Nonnull FileI...
method child (line 53) | @Nonnull
method withCurrentWorkspaceContent (line 58) | @Nonnull
method hasEqualOrChildValue (line 70) | @Override
method getParent (line 86) | @Override
method directParentTypeIds (line 91) | @Nonnull
method localCompare (line 97) | @Override
method equals (line 109) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/path/IncompletePathException.java
class IncompletePathException (line 11) | public class IncompletePathException extends Exception {
method IncompletePathException (line 18) | public IncompletePathException(@Nonnull Class<?> missingType) {
method IncompletePathException (line 28) | public IncompletePathException(@Nonnull Class<?> missingType, @Nullabl...
method getMissingType (line 36) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/path/InnerClassPathNode.java
class InnerClassPathNode (line 17) | public class InnerClassPathNode extends AbstractPathNode<ClassInfo, Inne...
method InnerClassPathNode (line 33) | public InnerClassPathNode(@Nullable ClassPathNode parent,
method child (line 44) | @Nonnull
method getParent (line 49) | @Override
method directParentTypeIds (line 54) | @Nonnull
method localCompare (line 60) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/path/InstructionPathNode.java
class InstructionPathNode (line 16) | public class InstructionPathNode extends AbstractPathNode<ClassMember, A...
method InstructionPathNode (line 31) | public InstructionPathNode(@Nonnull AbstractInsnNode insn, int index) {
method InstructionPathNode (line 47) | public InstructionPathNode(@Nullable ClassMemberPathNode parent, @Nonn...
method getInstructionIndex (line 55) | public int getInstructionIndex() {
method getParent (line 59) | @Override
method directParentTypeIds (line 64) | @Nonnull
method localCompare (line 70) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/path/LineNumberPathNode.java
class LineNumberPathNode (line 14) | public class LineNumberPathNode extends AbstractPathNode<FileInfo, Integ...
method LineNumberPathNode (line 26) | public LineNumberPathNode(int line) {
method LineNumberPathNode (line 40) | public LineNumberPathNode(@Nullable FilePathNode parent, int line) {
method getParent (line 44) | @Override
method directParentTypeIds (line 49) | @Nonnull
method localCompare (line 55) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/path/LocalVariablePathNode.java
class LocalVariablePathNode (line 16) | public class LocalVariablePathNode extends AbstractPathNode<ClassMember,...
method LocalVariablePathNode (line 28) | public LocalVariablePathNode(@Nonnull LocalVariable variable) {
method LocalVariablePathNode (line 42) | public LocalVariablePathNode(@Nullable ClassMemberPathNode parent, @No...
method getParent (line 46) | @Override
method directParentTypeIds (line 51) | @Nonnull
method localCompare (line 57) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/path/PathNode.java
type PathNode (line 26) | public interface PathNode<V> extends Comparable<PathNode<?>> {
method getParent (line 40) | @Nullable
method withCurrentWorkspaceContent (line 54) | @Nonnull
method getValue (line 63) | @Nonnull
method hasEqualOrChildValue (line 72) | default boolean hasEqualOrChildValue(@Nonnull PathNode<?> other) {
method typeId (line 83) | @Nonnull
method typeIdMatch (line 92) | default boolean typeIdMatch(@Nonnull PathNode<?> node) {
method directParentTypeIds (line 99) | @Nonnull
method getValueType (line 105) | @Nonnull
method getPathOfType (line 121) | @Nullable
method getValueOfType (line 144) | @Nullable
method onValue (line 168) | default <T> boolean onValue(@Nonnull Class<T> type, @Nonnull Consumer<...
method onPath (line 188) | @SuppressWarnings("unchecked")
method allParentsMatch (line 224) | default boolean allParentsMatch(@Nonnull PathNode<?> other) {
method isParentOf (line 252) | default boolean isParentOf(@Nonnull PathNode<?> other) {
method isDescendantOf (line 263) | default boolean isDescendantOf(@Nonnull PathNode<?> other) {
method localCompare (line 291) | int localCompare(PathNode<?> o);
FILE: recaf-core/src/main/java/software/coley/recaf/path/PathNodes.java
class PathNodes (line 34) | public class PathNodes {
method PathNodes (line 35) | private PathNodes() {
method workspacePath (line 44) | @Nonnull
method resourcePath (line 57) | @Nonnull
method bundlePath (line 73) | @Nonnull
method directoryPath (line 92) | @Nonnull
method classPath (line 112) | @Nonnull
method memberPath (line 134) | @Nonnull
method annotationPath (line 159) | @Nonnull
method variablePath (line 185) | @Nonnull
method instructionPath (line 213) | @Nonnull
method throwsPath (line 240) | @Nonnull
method catchPath (line 266) | @Nonnull
method innerClassPath (line 290) | @Nonnull
method annotationPath (line 313) | @Nonnull
method filePath (line 334) | @Nonnull
method unique (line 348) | @Nonnull
class ArbitraryStringPathNode (line 361) | private static class ArbitraryStringPathNode extends AbstractPathNode<...
method ArbitraryStringPathNode (line 366) | protected ArbitraryStringPathNode(@Nonnull String value) {
method directParentTypeIds (line 370) | @Nonnull
method localCompare (line 376) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/path/ResourcePathNode.java
class ResourcePathNode (line 24) | public class ResourcePathNode extends AbstractPathNode<Workspace, Worksp...
method ResourcePathNode (line 36) | public ResourcePathNode(@Nonnull WorkspaceResource resource) {
method ResourcePathNode (line 50) | public ResourcePathNode(@Nullable WorkspacePathNode parent, @Nonnull W...
method ResourcePathNode (line 64) | public ResourcePathNode(@Nullable EmbeddedResourceContainerPathNode pa...
method child (line 74) | @Nonnull
method embeddedChildContainer (line 82) | @Nonnull
method isPrimary (line 92) | public boolean isPrimary() {
method isPrimaryOrEmbeddedInPrimary (line 102) | public boolean isPrimaryOrEmbeddedInPrimary() {
method directParentTypeIds (line 117) | @Nonnull
method localCompare (line 123) | @Override
method equals (line 159) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/path/ThrowsPathNode.java
class ThrowsPathNode (line 15) | public class ThrowsPathNode extends AbstractPathNode<ClassMember, String> {
method ThrowsPathNode (line 27) | public ThrowsPathNode(@Nonnull String type) {
method ThrowsPathNode (line 41) | public ThrowsPathNode(@Nullable ClassMemberPathNode parent, @Nonnull S...
method getParent (line 45) | @Override
method directParentTypeIds (line 50) | @Nonnull
method localCompare (line 56) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/path/WorkspacePathNode.java
class WorkspacePathNode (line 15) | public class WorkspacePathNode extends AbstractPathNode<Object, Workspac...
method WorkspacePathNode (line 27) | public WorkspacePathNode(@Nonnull Workspace value) {
method child (line 38) | @Nonnull
method directParentTypeIds (line 55) | @Nonnull
method isDescendantOf (line 61) | @Override
method localCompare (line 72) | @Override
method equals (line 77) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/plugin/Plugin.java
type Plugin (line 9) | public interface Plugin {
method onEnable (line 13) | void onEnable();
method onDisable (line 18) | void onDisable();
FILE: recaf-core/src/main/java/software/coley/recaf/services/Service.java
type Service (line 10) | public interface Service {
method getServiceId (line 14) | @Nonnull
method getServiceConfig (line 20) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/ServiceConfig.java
type ServiceConfig (line 18) | public interface ServiceConfig extends ConfigContainer {
FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/AbstractAssemblerPipeline.java
class AbstractAssemblerPipeline (line 44) | public abstract class AbstractAssemblerPipeline<C extends ClassInfo, R e...
method AbstractAssemblerPipeline (line 50) | public AbstractAssemblerPipeline(@Nonnull AssemblerPipelineGeneralConf...
method refreshContext (line 58) | private void refreshContext() {
method classPrinter (line 70) | @Nonnull
method getCompilerOptions (line 73) | @Nonnull
method getCompiler (line 76) | @Nonnull
method getInheritanceChecker (line 79) | @Nonnull
method getClassVersion (line 82) | protected abstract int getClassVersion(@Nonnull C info);
method compile (line 84) | @Nonnull
method memberPrinter (line 142) | @Nonnull
method annotationPrinter (line 166) | @Nonnull
method print (line 199) | @Nonnull
method close (line 209) | public void close() {
method getConfig (line 213) | @Nonnull
class ListenerHost (line 219) | private class ListenerHost implements ChangeListener<String> {
method changed (line 220) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/AndroidAssemblerPipeline.java
class AndroidAssemblerPipeline (line 10) | public class AndroidAssemblerPipeline {
method AndroidAssemblerPipeline (line 13) | public AndroidAssemblerPipeline(@Nonnull AssemblerPipelineGeneralConfi...
FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/AndroidAssemblerPipelineConfig.java
class AndroidAssemblerPipelineConfig (line 16) | @ApplicationScoped
method AndroidAssemblerPipelineConfig (line 21) | @Inject
method isValueAnalysisEnabled (line 28) | @Override
method isSimulatingCommonJvmCalls (line 33) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/AssemblerPipeline.java
type AssemblerPipeline (line 34) | public interface AssemblerPipeline<C extends ClassInfo, R extends ClassR...
method tokenize (line 44) | @Nonnull
method roughParse (line 65) | @Nonnull
method concreteParse (line 79) | @Nonnull
method fullParse (line 92) | @Nonnull
method assemble (line 113) | @Nonnull
method assembleAndWrap (line 127) | @Nonnull
method disassemble (line 140) | @Nonnull
method disassemble (line 150) | @Nonnull
method disassemble (line 160) | @Nonnull
method disassemble (line 170) | @Nonnull
method getRepresentation (line 187) | @Nonnull
method getClassInfo (line 196) | @Nonnull
method getConfig (line 202) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/AssemblerPipelineConfig.java
type AssemblerPipelineConfig (line 12) | public interface AssemblerPipelineConfig extends ConfigContainer {
method isValueAnalysisEnabled (line 18) | boolean isValueAnalysisEnabled();
method isSimulatingCommonJvmCalls (line 27) | boolean isSimulatingCommonJvmCalls();
FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/AssemblerPipelineGeneralConfig.java
class AssemblerPipelineGeneralConfig (line 19) | @ApplicationScoped
method AssemblerPipelineGeneralConfig (line 25) | @Inject
method getDisassemblyIndent (line 37) | @Nonnull
method getDisassemblyAstParseDelay (line 45) | @Nonnull
method getUseWholeFloatingNumbers (line 53) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/AssemblerPipelineManager.java
class AssemblerPipelineManager (line 27) | @EagerInitialization
method AssemblerPipelineManager (line 38) | @Inject
method getPipeline (line 63) | @Nonnull
method newJvmAssemblerPipeline (line 83) | @Nonnull
method newAndroidAssemblerPipeline (line 98) | @Nonnull
method getServiceId (line 103) | @Nonnull
method getServiceConfig (line 109) | @Nonnull
class ListenerHost (line 115) | private class ListenerHost implements WorkspaceOpenListener, Workspace...
method onWorkspaceOpened (line 116) | @Override
method onWorkspaceClosed (line 121) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/ExpressionCompileException.java
class ExpressionCompileException (line 10) | public class ExpressionCompileException extends Exception {
method ExpressionCompileException (line 15) | public ExpressionCompileException(@Nonnull String message) {
method ExpressionCompileException (line 25) | public ExpressionCompileException(@Nonnull Throwable cause, @Nonnull S...
FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/ExpressionCompiler.java
class ExpressionCompiler (line 46) | @Dependent
method ExpressionCompiler (line 68) | @Inject
method clearContext (line 83) | public void clearContext() {
method setClassContext (line 105) | public void setClassContext(@Nonnull JvmClassInfo classInfo) {
method setMethodContext (line 135) | public void setMethodContext(@Nonnull MethodMember method) {
method setVersionTarget (line 151) | public void setVersionTarget(int versionTarget) {
method compile (line 166) | @Nonnull
method remap (line 219) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/ExpressionResult.java
class ExpressionResult (line 15) | public class ExpressionResult {
method ExpressionResult (line 24) | public ExpressionResult(@Nonnull String assembly) {
method ExpressionResult (line 34) | public ExpressionResult(@Nonnull List<CompilerDiagnostic> diagnostics) {
method ExpressionResult (line 44) | public ExpressionResult(@Nonnull ExpressionCompileException exception) {
method getAssembly (line 53) | @Nullable
method getException (line 61) | @Nullable
method getDiagnostics (line 69) | @Nonnull
method wasSuccess (line 77) | public boolean wasSuccess() {
FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/JvmAssemblerPipeline.java
class JvmAssemblerPipeline (line 41) | public class JvmAssemblerPipeline extends AbstractAssemblerPipeline<JvmC...
method JvmAssemblerPipeline (line 48) | public JvmAssemblerPipeline(@Nonnull Workspace workspace,
method concreteParse (line 57) | @Nonnull
method assemble (line 63) | @Nonnull
method disassemble (line 69) | @Nonnull
method disassemble (line 75) | @Nonnull
method disassemble (line 81) | @Nonnull
method getRepresentation (line 87) | @Nonnull
method getCompilerOptions (line 93) | @Nonnull
method getCompiler (line 109) | @Nonnull
method getInheritanceChecker (line 115) | @Nonnull
method getClassVersion (line 131) | @Override
method getClassInfo (line 136) | @Nonnull
method classPrinter (line 142) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/JvmAssemblerPipelineConfig.java
class JvmAssemblerPipelineConfig (line 16) | @ApplicationScoped
method JvmAssemblerPipelineConfig (line 23) | @Inject
method isValueAnalysisEnabled (line 31) | @Override
method isSimulatingCommonJvmCalls (line 36) | @Override
method emitTryRangeComments (line 44) | public boolean emitTryRangeComments() {
FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/Snippet.java
method withContent (line 32) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/SnippetListener.java
type SnippetListener (line 11) | public interface SnippetListener extends PrioritySortable {
method onSnippetAdded (line 16) | default void onSnippetAdded(@Nonnull Snippet snippet) {}
method onSnippetModified (line 24) | default void onSnippetModified(@Nonnull Snippet old, @Nonnull Snippet ...
method onSnippetRemoved (line 30) | default void onSnippetRemoved(@Nonnull Snippet snippet) {}
FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/SnippetManager.java
class SnippetManager (line 21) | @ApplicationScoped
method SnippetManager (line 29) | @Inject
method getSnippets (line 37) | @Nonnull
method getByName (line 50) | @Nullable
method putSnippet (line 62) | public void putSnippet(@Nonnull Snippet snippet) {
method removeSnippet (line 80) | public void removeSnippet(@Nonnull Snippet snippet) {
method removeSnippet (line 90) | public void removeSnippet(@Nonnull String name) {
method addSnippetListener (line 101) | public void addSnippetListener(@Nonnull SnippetListener listener) {
method removeSnippetListener (line 109) | public void removeSnippetListener(@Nonnull SnippetListener listener) {
method getServiceId (line 113) | @Nonnull
method getServiceConfig (line 119) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/SnippetManagerConfig.java
class SnippetManagerConfig (line 22) | @ApplicationScoped
method SnippetManagerConfig (line 26) | @Inject
method onNoRestore (line 32) | @Override
method getSnippets (line 121) | @Nonnull
class SnippetMap (line 129) | public static class SnippetMap extends ObservableMap<String, Snippet, ...
method SnippetMap (line 130) | public SnippetMap() {
FILE: recaf-core/src/main/java/software/coley/recaf/services/assembler/WorkspaceFieldValueLookup.java
class WorkspaceFieldValueLookup (line 21) | public class WorkspaceFieldValueLookup implements FieldValueLookup {
method WorkspaceFieldValueLookup (line 31) | public WorkspaceFieldValueLookup(@Nonnull Workspace workspace, @Nullab...
method accept (line 36) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/attach/AttachManager.java
type AttachManager (line 19) | public interface AttachManager extends Service {
method canAttach (line 26) | boolean canAttach();
method scan (line 31) | void scan();
method createRemoteResource (line 46) | @Nonnull
method getVirtualMachine (line 55) | @Nullable
method getVirtualMachineConnectionFailure (line 64) | @Nullable
method getVirtualMachinePid (line 73) | int getVirtualMachinePid(@Nonnull VirtualMachineDescriptor descriptor);
method getVirtualMachineProperties (line 81) | @Nullable
method getVirtualMachineMainClass (line 90) | @Nullable
method getJmxServerConnection (line 99) | @Nullable
method getVirtualMachineDescriptors (line 105) | @Nonnull
method addPostScanListener (line 112) | void addPostScanListener(@Nonnull PostScanListener listener);
method removePostScanListener (line 118) | void removePostScanListener(@Nonnull PostScanListener listener);
FILE: recaf-core/src/main/java/software/coley/recaf/services/attach/AttachManagerConfig.java
class AttachManagerConfig (line 21) | @ApplicationScoped
method AttachManagerConfig (line 27) | @Inject
method getAgentDirectory (line 40) | public Path getAgentDirectory() {
method getPassiveScanning (line 47) | public ObservableBoolean getPassiveScanning() {
method getAttachJmxAgent (line 55) | public ObservableBoolean getAttachJmxAgent() {
FILE: recaf-core/src/main/java/software/coley/recaf/services/attach/BasicAttachManager.java
class BasicAttachManager (line 46) | @ApplicationScoped
method BasicAttachManager (line 65) | @Inject
method extractAgent (line 74) | private void extractAgent() {
method onShutdown (line 100) | @PreDestroy
method passiveScanUpdate (line 108) | private void passiveScanUpdate() {
method mapToMainClass (line 123) | @Nonnull
method mapToPid (line 191) | private int mapToPid(@Nonnull VirtualMachineDescriptor descriptor) {
method isAgentReady (line 204) | public static boolean isAgentReady() {
method getAgentJarPath (line 211) | @Nonnull
method canAttach (line 217) | @Override
method scan (line 222) | @Override
method createRemoteResource (line 332) | @Nonnull
method getVirtualMachine (line 385) | @Override
method getVirtualMachineConnectionFailure (line 390) | @Override
method getVirtualMachinePid (line 395) | @Override
method getVirtualMachineProperties (line 400) | @Nullable
method getVirtualMachineMainClass (line 406) | @Nullable
method getJmxServerConnection (line 412) | @Nullable
method getVirtualMachineDescriptors (line 418) | @Nonnull
method addPostScanListener (line 424) | @Override
method removePostScanListener (line 429) | @Override
method getServiceId (line 434) | @Nonnull
method getServiceConfig (line 440) | @Nonnull
class DescriptorComparator (line 449) | class DescriptorComparator implements Comparator<VirtualMachineDescrip...
method compare (line 450) | @Override
type ExtractState (line 458) | enum ExtractState {
FILE: recaf-core/src/main/java/software/coley/recaf/services/attach/JmxBeanServerConnection.java
class JmxBeanServerConnection (line 15) | public class JmxBeanServerConnection {
method JmxBeanServerConnection (line 31) | public JmxBeanServerConnection(@Nonnull MBeanServerConnection connecti...
method getClassloadingBeanInfo (line 41) | @Nonnull
method getCompilationBeanInfo (line 52) | @Nonnull
method getOperatingSystemBeanInfo (line 63) | @Nonnull
method getRuntimeBeanInfo (line 74) | @Nonnull
method getThreadBeanInfo (line 85) | @Nonnull
method getConnection (line 93) | @Nonnull
method named (line 98) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/attach/NamedMBeanInfo.java
class NamedMBeanInfo (line 12) | public class NamedMBeanInfo extends MBeanInfo {
method NamedMBeanInfo (line 21) | public NamedMBeanInfo(@Nonnull ObjectName objectName, @Nonnull MBeanIn...
method NamedMBeanInfo (line 32) | private NamedMBeanInfo(@Nonnull ObjectName objectName,
method getObjectName (line 47) | @Nonnull
method getAttributeValue (line 63) | public Object getAttributeValue(@Nonnull JmxBeanServerConnection conne...
method getAttributeValue (line 79) | public Object getAttributeValue(@Nonnull JmxBeanServerConnection conne...
FILE: recaf-core/src/main/java/software/coley/recaf/services/attach/PostScanListener.java
type PostScanListener (line 14) | public interface PostScanListener extends PrioritySortable {
method onScanCompleted (line 23) | void onScanCompleted(@Nonnull Set<VirtualMachineDescriptor> added,
FILE: recaf-core/src/main/java/software/coley/recaf/services/callgraph/CachedLinkResolver.java
class CachedLinkResolver (line 21) | public class CachedLinkResolver implements LinkResolver<JvmClassInfo, Me...
method resolveStaticMethod (line 48) | @Override
method resolveSpecialMethod (line 54) | @Override
method resolveVirtualMethod (line 60) | @Override
method resolveInterfaceMethod (line 66) | @Override
method resolveStaticField (line 72) | @Override
method resolveVirtualField (line 78) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/callgraph/CallGraph.java
class CallGraph (line 49) | public class CallGraph implements WorkspaceModificationListener, Resourc...
method CallGraph (line 70) | public CallGraph(@Nonnull Workspace workspace) {
method isInitialized (line 79) | public boolean isInitialized() {
method isReady (line 86) | @Nonnull
method getClassMethodsContainer (line 97) | @Nonnull
method getVertex (line 109) | @Nullable
method linked (line 122) | @Nonnull
method initialize (line 130) | public void initialize() {
method visit (line 163) | private void visit(@Nonnull JvmClassInfo jvmClass) {
method linkedResolvedCalls (line 230) | private void linkedResolvedCalls(@Nonnull JvmClassInfo owner,
method normalizeCallingContexts (line 262) | private void normalizeCallingContexts(@Nonnull JvmClassInfo updated) {
method removeStaleCallingContextsForRemovedClass (line 297) | private void removeStaleCallingContextsForRemovedClass(@Nonnull JvmCla...
method onMethodCalled (line 346) | private void onMethodCalled(@Nonnull JvmClassInfo callingClass, @Nonnu...
method resolve (line 401) | @Nonnull
method onAddLibrary (line 439) | @Override
method onRemoveLibrary (line 448) | @Override
method onNewClass (line 457) | @Override
method onUpdateClass (line 462) | @Override
method onRemoveClass (line 469) | @Override
method getUnresolvedDeclarations (line 519) | @Nonnull
class MutableMethodVertex (line 543) | static class MutableMethodVertex implements MethodVertex {
method MutableMethodVertex (line 549) | MutableMethodVertex(@Nonnull MethodRef method, @Nonnull MethodMember...
method prune (line 557) | private void prune() {
method getMethod (line 573) | @Nonnull
method getResolvedMethod (line 579) | @Nullable
method getCallers (line 585) | @Nonnull
method getCalls (line 591) | @Nonnull
method toString (line 597) | @Override
method equals (line 602) | @Override
method hashCode (line 610) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/callgraph/CallGraphConfig.java
class CallGraphConfig (line 14) | @ApplicationScoped
method CallGraphConfig (line 17) | @Inject
FILE: recaf-core/src/main/java/software/coley/recaf/services/callgraph/CallGraphService.java
class CallGraphService (line 24) | @EagerInitialization
method CallGraphService (line 38) | @Inject
method newCallGraph (line 56) | @Nonnull
method getCurrentWorkspaceCallGraph (line 65) | @Nullable
method getServiceId (line 77) | @Nonnull
method getServiceConfig (line 83) | @Nonnull
class ListenerHost (line 89) | private class ListenerHost implements WorkspaceOpenListener, Workspace...
method onWorkspaceOpened (line 90) | @Override
method onWorkspaceClosed (line 95) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/callgraph/ClassLookup.java
class ClassLookup (line 15) | public class ClassLookup implements Function<String, JvmClassInfo> {
method ClassLookup (line 22) | public ClassLookup(@Nonnull Workspace workspace) {
method apply (line 26) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/callgraph/ClassMethodsContainer.java
class ClassMethodsContainer (line 20) | public class ClassMethodsContainer {
method ClassMethodsContainer (line 28) | public ClassMethodsContainer(@Nonnull JvmClassInfo jvmClass) {
method getJvmClass (line 35) | @Nonnull
method getVertices (line 43) | @Nonnull
method getVertex (line 57) | @Nullable
method getVertex (line 73) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/callgraph/LinkedClass.java
class LinkedClass (line 25) | public class LinkedClass implements ClassInfo<JvmClassInfo> {
method LinkedClass (line 33) | public LinkedClass(@Nonnull ClassLookup lookup, @Nonnull JvmClassInfo ...
method innerValue (line 109) | @Override
method accessFlags (line 114) | @Override
method superClass (line 119) | @Nullable
method interfaces (line 127) | @Nonnull
method getMethod (line 133) | @Override
method getField (line 138) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/callgraph/MethodVertex.java
type MethodVertex (line 14) | public interface MethodVertex {
method getMethod (line 18) | @Nonnull
method getResolvedMethod (line 24) | @Nullable
method getCallers (line 30) | @Nonnull
method getCalls (line 36) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/ClassComments.java
type ClassComments (line 15) | public interface ClassComments {
method getCreationTime (line 19) | @Nonnull
method getLastUpdatedTime (line 25) | @Nonnull
method hasComments (line 31) | boolean hasComments();
method getClassComment (line 36) | @Nullable
method setClassComment (line 43) | void setClassComment(@Nullable String comment);
method getFieldComment (line 51) | @Nullable
method getFieldComment (line 64) | @Nullable
method getMethodComment (line 73) | @Nullable
method getMethodComment (line 86) | @Nullable
method setFieldComment (line 95) | default void setFieldComment(@Nonnull FieldMember member, @Nullable St...
method setFieldComment (line 107) | void setFieldComment(@Nonnull String name, @Nonnull String descriptor,...
method setMethodComment (line 115) | default void setMethodComment(@Nonnull MethodMember member, @Nullable ...
method setMethodComment (line 127) | void setMethodComment(@Nonnull String name, @Nonnull String descriptor...
FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/CommentContainerListener.java
type CommentContainerListener (line 13) | public interface CommentContainerListener extends PrioritySortable {
method onClassContainerCreated (line 20) | default void onClassContainerCreated(@Nonnull ClassPathNode path, @Nul...
method onClassContainerRemoved (line 28) | default void onClassContainerRemoved(@Nonnull ClassPathNode path, @Nul...
FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/CommentInsertingVisitor.java
class CommentInsertingVisitor (line 20) | public class CommentInsertingVisitor extends ClassVisitor {
method CommentInsertingVisitor (line 33) | public CommentInsertingVisitor(@Nonnull ClassComments comments, @Nonnu...
method getInsertions (line 42) | public int getInsertions() {
method visit (line 46) | @Override
method visitField (line 59) | @Override
method visitMethod (line 77) | @Override
class CommentAppender (line 103) | private static class CommentAppender extends MethodVisitor {
method CommentAppender (line 106) | private CommentAppender(@Nullable MethodVisitor mv, @Nonnull Comment...
method visitEnd (line 111) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/CommentKey.java
method id (line 41) | @Nonnull
method hashWorkspace (line 54) | public static int hashWorkspace(@Nonnull Workspace workspace) {
method hashPath (line 65) | public static int hashPath(@Nonnull PathNode<?> path) {
method workspaceInput (line 97) | @Nonnull
method annotationDescriptor (line 133) | @Nonnull
method toString (line 140) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/CommentManager.java
class CommentManager (line 57) | @EagerInitialization // We need to eagerly init so that we can register ...
method CommentManager (line 73) | @Inject
method loadComments (line 317) | private void loadComments() {
method onShutdown (line 341) | @PreDestroy
method onClassCommentUpdated (line 382) | @Override
method onFieldCommentUpdated (line 388) | @Override
method onMethodCommentUpdated (line 394) | @Override
method onClassContainerCreated (line 400) | @Override
method onClassContainerRemoved (line 406) | @Override
method getOrCreateWorkspaceComments (line 418) | @Nonnull
method getWorkspaceComments (line 443) | @Nullable
method getCurrentWorkspaceComments (line 458) | @Nullable
method removeWorkspaceComments (line 472) | public boolean removeWorkspaceComments(@Nonnull Workspace workspace) {
method addCommentListener (line 481) | public void addCommentListener(@Nonnull CommentUpdateListener listener) {
method removeCommentListener (line 489) | public void removeCommentListener(@Nonnull CommentUpdateListener liste...
method addCommentContainerListener (line 497) | public void addCommentContainerListener(@Nonnull CommentContainerListe...
method removeCommentContainerListener (line 505) | public void removeCommentContainerListener(@Nonnull CommentContainerLi...
method getServiceId (line 509) | @Nonnull
method getServiceConfig (line 515) | @Nonnull
method getCommentsDirectory (line 521) | @Nonnull
method newDelegatingWorkspaceComments (line 526) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/CommentManagerConfig.java
class CommentManagerConfig (line 19) | @ApplicationScoped
method CommentManagerConfig (line 24) | @Inject
method getEnableCommentDisplay (line 35) | @Nonnull
method getWordWrappingLimit (line 43) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/CommentUpdateListener.java
type CommentUpdateListener (line 14) | public interface CommentUpdateListener extends PrioritySortable {
method onClassCommentUpdated (line 21) | default void onClassCommentUpdated(@Nonnull ClassPathNode path, @Nulla...
method onFieldCommentUpdated (line 29) | default void onFieldCommentUpdated(@Nonnull ClassMemberPathNode path, ...
method onMethodCommentUpdated (line 37) | default void onMethodCommentUpdated(@Nonnull ClassMemberPathNode path,...
FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/DelegatingClassComments.java
class DelegatingClassComments (line 16) | public class DelegatingClassComments implements ClassComments {
method DelegatingClassComments (line 32) | public DelegatingClassComments(@Nonnull ClassPathNode path, @Nonnull C...
method getPath (line 41) | @Nonnull
method getCreationTime (line 46) | @Nonnull
method getLastUpdatedTime (line 52) | @Nonnull
method hasComments (line 58) | @Override
method getClassComment (line 63) | @Nullable
method setClassComment (line 69) | @Override
method getFieldComment (line 76) | @Nullable
method getMethodComment (line 82) | @Nullable
method setFieldComment (line 88) | @Override
method setMethodComment (line 97) | @Override
method equals (line 106) | @Override
method hashCode (line 113) | @Override
method toString (line 118) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/DelegatingWorkspaceComments.java
class DelegatingWorkspaceComments (line 17) | public class DelegatingWorkspaceComments implements WorkspaceComments {
method DelegatingWorkspaceComments (line 31) | public DelegatingWorkspaceComments(@Nonnull CommentManager listenerCal...
method getOrCreateClassComments (line 36) | @Nonnull
method getClassComments (line 49) | @Nullable
method deleteClassComments (line 66) | @Nullable
method iterator (line 75) | @Nonnull
method equals (line 81) | @Override
method hashCode (line 88) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/PersistClassComments.java
class PersistClassComments (line 16) | public class PersistClassComments implements ClassComments {
method getCreationTime (line 23) | @Nonnull
method getLastUpdatedTime (line 29) | @Nonnull
method hasComments (line 35) | @Override
method getClassComment (line 42) | @Nullable
method setClassComment (line 48) | @Override
method getFieldComment (line 54) | @Nullable
method getMethodComment (line 60) | @Nullable
method setFieldComment (line 66) | @Override
method setMethodComment (line 76) | @Override
method equals (line 86) | @Override
method hashCode (line 97) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/PersistWorkspaceComments.java
class PersistWorkspaceComments (line 18) | public class PersistWorkspaceComments implements WorkspaceComments {
method classKeys (line 24) | @Nonnull
method getOrCreateClassComments (line 30) | @Nonnull
method getClassComments (line 36) | @Nullable
method deleteClassComments (line 42) | @Nullable
method iterator (line 48) | @Nonnull
method equals (line 54) | @Override
method hashCode (line 64) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/comment/WorkspaceComments.java
type WorkspaceComments (line 15) | public interface WorkspaceComments extends Iterable<ClassComments> {
method getOrCreateClassComments (line 22) | @Nonnull
method getClassComments (line 31) | @Nullable
method deleteClassComments (line 40) | @Nullable
method getComment (line 49) | @Nullable
method getClassComment (line 64) | @Nullable
method getMemberComment (line 78) | @Nullable
FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/CompileMap.java
class CompileMap (line 23) | public class CompileMap extends TreeMap<String, byte[]> {
method CompileMap (line 30) | public CompileMap(@Nonnull Map<String, byte[]> map) {
method hasMultipleClasses (line 37) | public boolean hasMultipleClasses() {
method hasInnerClasses (line 45) | public boolean hasInnerClasses() {
method downsample (line 63) | public void downsample(int targetJavaVersion) {
FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/CompilerDiagnostic.java
method withLine (line 28) | @Nonnull
method toString (line 33) | @Override
type Level (line 41) | public enum Level {
FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/CompilerResult.java
class CompilerResult (line 14) | public class CompilerResult {
method CompilerResult (line 23) | public CompilerResult(@Nonnull Throwable exception) {
method CompilerResult (line 33) | public CompilerResult(@Nonnull CompileMap compileMap, @Nonnull List<Co...
method CompilerResult (line 37) | private CompilerResult(@Nonnull CompileMap compilations,
method wasSuccess (line 48) | public boolean wasSuccess() {
method getCompilations (line 59) | @Nonnull
method getDiagnostics (line 68) | @Nonnull
method getException (line 77) | @Nullable
FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/ForwardingListener.java
class ForwardingListener (line 14) | public class ForwardingListener implements JavacListener {
method ForwardingListener (line 17) | ForwardingListener(@Nullable JavacListener delegate) {
method report (line 21) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/JavacArguments.java
class JavacArguments (line 15) | public class JavacArguments {
method JavacArguments (line 45) | public JavacArguments(@Nonnull String className, @Nonnull String class...
method createDebugValue (line 61) | @Nonnull
method getClassName (line 85) | @Nonnull
method getClassSource (line 93) | @Nonnull
method getClassPath (line 101) | @Nullable
method getVersionTarget (line 109) | public int getVersionTarget() {
method getDownsampleTarget (line 116) | public int getDownsampleTarget() {
method isDebugVariables (line 123) | public boolean isDebugVariables() {
method isDebugLineNumbers (line 130) | public boolean isDebugLineNumbers() {
method isDebugSourceName (line 137) | public boolean isDebugSourceName() {
method equals (line 141) | @Override
method hashCode (line 157) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/JavacArgumentsBuilder.java
class JavacArgumentsBuilder (line 12) | public final class JavacArgumentsBuilder {
method withClassName (line 28) | @Nonnull
method withClassSource (line 40) | @Nonnull
method withClassPath (line 52) | @Nonnull
method withDownsampleTarget (line 65) | @Nonnull
method withVersionTarget (line 77) | @Nonnull
method withDebugVariables (line 89) | @Nonnull
method withDebugLineNumbers (line 101) | @Nonnull
method withDebugSourceName (line 113) | @Nonnull
method build (line 122) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/JavacCompiler.java
class JavacCompiler (line 43) | @ApplicationScoped
method JavacCompiler (line 53) | @Inject
method compile (line 71) | @Nonnull
method compile (line 91) | @Nonnull
method isAvailable (line 183) | public static boolean isAvailable() {
method getMinTargetVersion (line 190) | public static int getMinTargetVersion() {
method createRecordingListener (line 202) | private JavacListener createRecordingListener(@Nullable JavacListener ...
method getServiceId (line 238) | @Nonnull
method getServiceConfig (line 244) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/JavacCompilerConfig.java
class JavacCompilerConfig (line 23) | @ApplicationScoped
method JavacCompilerConfig (line 30) | @Inject
method getGeneratePhantoms (line 46) | @Nonnull
method getDefaultEmitDebug (line 58) | @Nonnull
method getDefaultTargetVersion (line 70) | @Nonnull
method getDefaultDownsampleTargetVersion (line 82) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/JavacListener.java
type JavacListener (line 11) | public interface JavacListener extends DiagnosticListener<JavaFileObject...
FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/ResourceVirtualJavaFileObject.java
class ResourceVirtualJavaFileObject (line 15) | public class ResourceVirtualJavaFileObject extends SimpleJavaFileObject {
method ResourceVirtualJavaFileObject (line 27) | public ResourceVirtualJavaFileObject(String resourceName, byte[] conte...
method getResourceName (line 36) | @Nonnull
method openInputStream (line 41) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/VirtualFileManager.java
class VirtualFileManager (line 23) | public class VirtualFileManager extends ForwardingJavaFileManager<JavaFi...
method VirtualFileManager (line 35) | public VirtualFileManager(@Nonnull VirtualUnitMap unitMap, @Nonnull Li...
method list (line 41) | @Override
method inferBinaryName (line 64) | @Override
method getJavaFileForOutput (line 72) | @Override
class ClassPathIterator (line 88) | private static final class ClassPathIterator implements Iterator<JavaF...
method ClassPathIterator (line 91) | ClassPathIterator(@Nonnull Iterator<JavaFileObject> first, @Nonnull ...
method hasNext (line 96) | @Override
method next (line 101) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/VirtualJavaFileObject.java
class VirtualJavaFileObject (line 16) | public class VirtualJavaFileObject extends SimpleJavaFileObject {
method VirtualJavaFileObject (line 26) | public VirtualJavaFileObject(@Nonnull String className, @Nullable Stri...
method hasOutput (line 35) | public boolean hasOutput() {
method getBytecode (line 42) | @Nonnull
method getSource (line 50) | @Nonnull
method openOutputStream (line 55) | @Override
method getCharContent (line 60) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/VirtualUnitMap.java
class VirtualUnitMap (line 17) | public class VirtualUnitMap {
method addSource (line 28) | public void addSource(@Nonnull String className, @Nonnull String conte...
method addFile (line 40) | public void addFile(@Nonnull String className, @Nonnull VirtualJavaFil...
method getFile (line 50) | @Nullable
method getFiles (line 58) | @Nonnull
method getCompilations (line 67) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/stub/ClassStubGenerator.java
class ClassStubGenerator (line 40) | public abstract class ClassStubGenerator {
method ClassStubGenerator (line 71) | public ClassStubGenerator(@Nonnull Workspace workspace,
method generate (line 99) | public abstract String generate() throws ExpressionCompileException;
method appendPackage (line 107) | protected void appendPackage(@Nonnull StringBuilder code) {
method appendClassStructure (line 120) | protected void appendClassStructure(@Nonnull StringBuilder code) {
method appendEnumConsts (line 140) | protected void appendEnumConsts(@Nonnull StringBuilder code) {
method appendFields (line 165) | protected void appendFields(@Nonnull StringBuilder code) throws Expres...
method appendMethods (line 205) | protected void appendMethods(@Nonnull StringBuilder code) throws Expre...
method appendInnerClasses (line 352) | protected void appendInnerClasses(@Nonnull StringBuilder code) throws ...
method appendClassEnd (line 387) | protected void appendClassEnd(@Nonnull StringBuilder code) {
method doSkipMethod (line 402) | protected abstract boolean doSkipMethod(@Nonnull String name, @Nonnull...
method getLocalModifier (line 407) | @Nonnull
method getLocalName (line 415) | @Nonnull
method isEnumConst (line 426) | protected boolean isEnumConst(@Nonnull FieldMember field) {
method isSealedType (line 448) | private boolean isSealedType(@Nonnull InheritanceVertex vertex) {
method isMissingType (line 468) | protected boolean isMissingType(@Nonnull String descriptor) {
method isMissingType (line 479) | protected boolean isMissingType(@Nonnull Type type) {
method isSafeReferencableName (line 494) | private boolean isSafeReferencableName(@Nullable String name) {
method isSafeName (line 512) | protected static boolean isSafeName(@Nonnull String name) {
method isSafeInternalClassName (line 537) | protected static boolean isSafeInternalClassName(@Nonnull String inter...
method isSafeClassName (line 557) | protected static boolean isSafeClassName(@Nonnull String name) {
method getInfo (line 586) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/stub/ExpressionHostingClassStubGenerator.java
class ExpressionHostingClassStubGenerator (line 38) | public class ExpressionHostingClassStubGenerator extends ClassStubGenera...
method ExpressionHostingClassStubGenerator (line 77) | public ExpressionHostingClassStubGenerator(@Nonnull Workspace workspace,
method generate (line 111) | @Override
method doSkipMethod (line 129) | @Override
method getAdaptedMethodName (line 138) | @Nonnull
method appendExpressionImports (line 156) | @Nonnull
method appendExpressionMethod (line 181) | private void appendExpressionMethod(@Nonnull StringBuilder code, @Nonn...
method methodDescriptorWithVariables (line 290) | @Nonnull
method findVar (line 330) | @Nullable
method getParameterVariable (line 346) | @Nonnull
method isReservedEnumMethodName (line 364) | private static boolean isReservedEnumMethodName(@Nonnull String method...
FILE: recaf-core/src/main/java/software/coley/recaf/services/compile/stub/InnerClassStubGenerator.java
class InnerClassStubGenerator (line 21) | public class InnerClassStubGenerator extends ClassStubGenerator {
method InnerClassStubGenerator (line 42) | public InnerClassStubGenerator(@Nonnull Workspace workspace,
method getLocalName (line 54) | @Nonnull
method getLocalModifier (line 68) | @Nonnull
method generate (line 85) | @Override
method doSkipMethod (line 99) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/config/ConfigManager.java
class ConfigManager (line 47) | @ApplicationScoped
method ConfigManager (line 57) | @Inject
method init (line 67) | private void init(@Observes InitializationEvent event) {
method save (line 71) | @PreDestroy
method load (line 106) | @SuppressWarnings({"raw", "rawtypes"})
method loadValue (line 152) | @SuppressWarnings({"unchecked", "rawtypes"})
method getContainers (line 197) | @Nonnull
method registerContainer (line 206) | public void registerContainer(@Nonnull ConfigContainer container) {
method unregisterContainer (line 221) | public void unregisterContainer(@Nonnull ConfigContainer container) {
method addManagedConfigListener (line 235) | public void addManagedConfigListener(@Nonnull ManagedConfigListener li...
method removeManagedConfigListener (line 246) | public boolean removeManagedConfigListener(@Nonnull ManagedConfigListe...
method getServiceId (line 250) | @Nonnull
method getServiceConfig (line 256) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/config/ConfigManagerConfig.java
class ConfigManagerConfig (line 14) | @ApplicationScoped
method ConfigManagerConfig (line 16) | @Inject
FILE: recaf-core/src/main/java/software/coley/recaf/services/config/ManagedConfigListener.java
type ManagedConfigListener (line 13) | public interface ManagedConfigListener extends PrioritySortable {
method onRegister (line 18) | void onRegister(@Nonnull ConfigContainer container);
method onUnregister (line 24) | void onUnregister(@Nonnull ConfigContainer container);
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/AbstractAndroidDecompiler.java
class AbstractAndroidDecompiler (line 10) | public abstract class AbstractAndroidDecompiler extends AbstractDecompil...
method AbstractAndroidDecompiler (line 19) | public AbstractAndroidDecompiler(@Nonnull String name, @Nonnull String...
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/AbstractDecompiler.java
class AbstractDecompiler (line 14) | public abstract class AbstractDecompiler implements Decompiler {
method AbstractDecompiler (line 28) | public AbstractDecompiler(@Nonnull String name, @Nonnull String versio...
method getName (line 34) | @Nonnull
method getVersion (line 40) | @Nonnull
method getConfig (line 46) | @Nonnull
method addOutputTextFilter (line 52) | @Override
method removeOutputTextFilter (line 57) | @Override
method equals (line 62) | @Override
method hashCode (line 74) | @Override
method toString (line 82) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/AbstractJvmDecompiler.java
class AbstractJvmDecompiler (line 17) | public abstract class AbstractJvmDecompiler extends AbstractDecompiler i...
method AbstractJvmDecompiler (line 28) | public AbstractJvmDecompiler(@Nonnull String name, @Nonnull String ver...
method addJvmBytecodeFilter (line 32) | @Override
method removeJvmBytecodeFilter (line 37) | @Override
method decompile (line 42) | @Nonnull
method decompileInternal (line 72) | @Nonnull
method equals (line 75) | @Override
method hashCode (line 86) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/AndroidDecompiler.java
type AndroidDecompiler (line 12) | public interface AndroidDecompiler extends Decompiler {
method decompile (line 14) | DecompileResult decompile(@Nonnull Workspace workspace, @Nonnull Andro...
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/BaseDecompilerConfig.java
class BaseDecompilerConfig (line 13) | public class BaseDecompilerConfig extends BasicConfigContainer implement...
method BaseDecompilerConfig (line 20) | public BaseDecompilerConfig(@Nonnull String id) {
method getHash (line 24) | @Override
method setHash (line 29) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/DecompileResult.java
class DecompileResult (line 15) | public class DecompileResult {
method DecompileResult (line 30) | public DecompileResult(@Nonnull String text, int configHash) {
method DecompileResult (line 46) | public DecompileResult(@Nonnull Throwable exception, int configHash) {
method DecompileResult (line 60) | public DecompileResult(int configHash) {
method DecompileResult (line 74) | public DecompileResult(@Nonnull String text) {
method DecompileResult (line 93) | private DecompileResult(String text, Throwable exception, ResultType t...
method withText (line 106) | @Nonnull
method getText (line 115) | @Nullable
method getException (line 124) | @Nullable
method getType (line 132) | @Nonnull
method getConfigHash (line 141) | public int getConfigHash() {
method equals (line 145) | @Override
method hashCode (line 158) | @Override
type ResultType (line 170) | public enum ResultType {
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/Decompiler.java
type Decompiler (line 16) | public interface Decompiler {
method getName (line 20) | @Nonnull
method getVersion (line 26) | @Nonnull
method getConfig (line 32) | @Nonnull
method addOutputTextFilter (line 44) | boolean addOutputTextFilter(@Nonnull OutputTextFilter filter);
method removeOutputTextFilter (line 55) | boolean removeOutputTextFilter(@Nonnull OutputTextFilter filter);
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/DecompilerConfig.java
type DecompilerConfig (line 17) | public interface DecompilerConfig extends ConfigContainer {
method getHash (line 27) | int getHash();
method setHash (line 35) | void setHash(int hash);
method registerConfigValuesHashUpdates (line 42) | default void registerConfigValuesHashUpdates() {
method update (line 51) | private void update() {
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/DecompilerManager.java
class DecompilerManager (line 48) | @ApplicationScoped
method DecompilerManager (line 70) | @Inject
method decompile (line 116) | @Nonnull
method decompile (line 133) | @Nonnull
method decompile (line 180) | @Nonnull
method decompile (line 197) | @Nonnull
method addJvmBytecodeFilter (line 208) | public void addJvmBytecodeFilter(@Nonnull JvmBytecodeFilter filter) {
method removeJvmBytecodeFilter (line 218) | public void removeJvmBytecodeFilter(@Nonnull JvmBytecodeFilter filter) {
method addOutputTextFilter (line 228) | public void addOutputTextFilter(@Nonnull OutputTextFilter filter) {
method removeOutputTextFilter (line 238) | public void removeOutputTextFilter(@Nonnull OutputTextFilter filter) {
method getTargetJvmDecompiler (line 245) | @Nonnull
method getTargetAndroidDecompiler (line 253) | @Nonnull
method register (line 262) | public void register(@Nonnull JvmDecompiler decompiler) {
method register (line 270) | public void register(@Nonnull AndroidDecompiler decompiler) {
method getJvmDecompiler (line 280) | @Nullable
method getAndroidDecompiler (line 291) | @Nullable
method getJvmDecompilers (line 299) | @Nonnull
method getAndroidDecompilers (line 307) | @Nonnull
method getServiceId (line 312) | @Nonnull
method getServiceConfig (line 318) | @Nonnull
class LayeredJvmBytecodeFilter (line 331) | private class LayeredJvmBytecodeFilter implements JvmBytecodeFilter {
method filter (line 332) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/DecompilerManagerConfig.java
class DecompilerManagerConfig (line 19) | @ApplicationScoped
method DecompilerManagerConfig (line 38) | @Inject
method getPreferredJvmDecompiler (line 61) | @Nonnull
method getPreferredAndroidDecompiler (line 69) | @Nonnull
method getCacheDecompilations (line 77) | @Nonnull
method getFilterDebug (line 85) | @Nonnull
method getFilterHollow (line 93) | @Nonnull
method getFilterIllegalAnnotations (line 101) | @Nonnull
method getFilterDuplicateAnnotations (line 109) | @Nonnull
method getFilterLongAnnotations (line 117) | @Nonnull
method getFilterLongAnnotationsLength (line 125) | @Nonnull
method getFilterLongExceptions (line 133) | @Nonnull
method getFilterLongExceptionsLength (line 141) | @Nonnull
method getFilterSignatures (line 149) | @Nonnull
method getFilterSynthetics (line 157) | @Nonnull
method getFilterNonAsciiNames (line 165) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/JvmDecompiler.java
type JvmDecompiler (line 13) | public interface JvmDecompiler extends Decompiler {
method addJvmBytecodeFilter (line 23) | boolean addJvmBytecodeFilter(@Nonnull JvmBytecodeFilter filter);
method removeJvmBytecodeFilter (line 34) | boolean removeJvmBytecodeFilter(@Nonnull JvmBytecodeFilter filter);
method decompile (line 44) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/NoopAndroidDecompiler.java
class NoopAndroidDecompiler (line 12) | public class NoopAndroidDecompiler extends AbstractAndroidDecompiler {
method NoopAndroidDecompiler (line 15) | private NoopAndroidDecompiler() {
method getInstance (line 22) | public static NoopAndroidDecompiler getInstance() {
method decompile (line 26) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/NoopDecompilerConfig.java
class NoopDecompilerConfig (line 10) | @ExcludeFromJacocoGeneratedReport(justification = "Config POJO")
method NoopDecompilerConfig (line 15) | public NoopDecompilerConfig() {
method getHash (line 19) | @Override
method setHash (line 24) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/NoopJvmDecompiler.java
class NoopJvmDecompiler (line 12) | public class NoopJvmDecompiler extends AbstractJvmDecompiler {
method NoopJvmDecompiler (line 15) | private NoopJvmDecompiler() {
method getInstance (line 22) | public static NoopJvmDecompiler getInstance() {
method decompileInternal (line 26) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/cfr/CfrConfig.java
class CfrConfig (line 29) | @ApplicationScoped
method CfrConfig (line 114) | @Inject
method getOptHelp (line 209) | @Nullable
method getOptHelp (line 230) | @Nonnull
method toMap (line 248) | @Nonnull
method getStringbuffer (line 289) | @Nonnull
method getStringbuilder (line 294) | @Nonnull
method getStringconcat (line 299) | @Nonnull
method getDecodeenumswitch (line 304) | @Nonnull
method getSugarenums (line 309) | @Nonnull
method getDecodestringswitch (line 314) | @Nonnull
method getPreviewfeatures (line 319) | @Nonnull
method getSealed (line 324) | @Nonnull
method getSwitchexpression (line 329) | @Nonnull
method getRecordtypes (line 334) | @Nonnull
method getInstanceofpattern (line 339) | @Nonnull
method getArrayiter (line 344) | @Nonnull
method getCollectioniter (line 349) | @Nonnull
method getTryresources (line 354) | @Nonnull
method getDecodelambdas (line 359) | @Nonnull
method getInnerclasses (line 364) | @Nonnull
method getForbidmethodscopedclasses (line 369) | @Nonnull
method getForbidanonymousclasses (line 374) | @Nonnull
method getSkipbatchinnerclasses (line 379) | @Nonnull
method getHideutf (line 384) | @Nonnull
method getHidelongstrings (line 389) | @Nonnull
method getRemoveboilerplate (line 394) | @Nonnull
method getRemoveinnerclasssynthetics (line 399) | @Nonnull
method getRelinkconst (line 404) | @Nonnull
method getRelinkconststring (line 409) | @Nonnull
method getLiftconstructorinit (line 414) | @Nonnull
method getRemovedeadmethods (line 419) | @Nonnull
method getRemovebadgenerics (line 424) | @Nonnull
method getSugarasserts (line 429) | @Nonnull
method getSugarboxing (line 434) | @Nonnull
method getSugarretrolambda (line 439) | @Nonnull
method getShowversion (line 444) | @Nonnull
method getDecodefinally (line 449) | @Nonnull
method getTidymonitors (line 454) | @Nonnull
method getCommentmonitors (line 459) | @Nonnull
method getLenient (line 464) | @Nonnull
method getComments (line 469) | @Nonnull
method getForcetopsort (line 474) | @Nonnull
method getForceclassfilever (line 479) | @Nonnull
method getForloopaggcapture (line 484) | @Nonnull
method getForcetopsortaggress (line 489) | @Nonnull
method getForcetopsortnopull (line 494) | @Nonnull
method getForcecondpropagate (line 499) | @Nonnull
method getReducecondscope (line 504) | @Nonnull
method getForcereturningifs (line 509) | @Nonnull
method getIgnoreexceptionsalways (line 514) | @Nonnull
method getAntiobf (line 519) | @Nonnull
method getObfcontrol (line 524) | @Nonnull
method getObfattr (line 529) | @Nonnull
method getConstobf (line 534) | @Nonnull
method getHidebridgemethods (line 539) | @Nonnull
method getIgnoreexceptions (line 544) | @Nonnull
method getForceexceptionprune (line 549) | @Nonnull
method getAexagg (line 554) | @Nonnull
method getAexagg2 (line 559) | @Nonnull
method getRecovertypeclash (line 564) | @Nonnull
method getRecovertypehints (line 569) | @Nonnull
method getRecover (line 574) | @Nonnull
method getEclipse (line 579) | @Nonnull
method getOverride (line 584) | @Nonnull
method getShowinferrable (line 589) | @Nonnull
method getVersion (line 594) | @Nonnull
method getLabelledblocks (line 599) | @Nonnull
method getJ14classobj (line 604) | @Nonnull
method getHidelangimports (line 609) | @Nonnull
method getRenamedupmembers (line 614) | @Nonnull
method getRenamesmallmembers (line 619) | @Nonnull
method getRenameillegalidents (line 624) | @Nonnull
method getRenameenumidents (line 629) | @Nonnull
method getRemovedeadconditionals (line 634) | @Nonnull
method getAggressivedoextension (line 639) | @Nonnull
method getAggressiveduff (line 644) | @Nonnull
method getAggressivedocopy (line 649) | @Nonnull
method getAggressivesizethreshold (line 654) | @Nonnull
method getStaticinitreturn (line 659) | @Nonnull
method getUsenametable (line 664) | @Nonnull
method getPullcodecase (line 669) | @Nonnull
method getAllowmalformedswitch (line 674) | @Nonnull
method getElidescala (line 679) | @Nonnull
method getUsesignatures (line 684) | @Nonnull
type BooleanOption (line 692) | public enum BooleanOption {
type TrooleanOption (line 701) | public enum TrooleanOption {
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/cfr/CfrDecompiler.java
class CfrDecompiler (line 26) | @ApplicationScoped
method CfrDecompiler (line 39) | @Inject
method decompileInternal (line 49) | @Nonnull
method getConfig (line 75) | @Nonnull
method cleanup (line 81) | private static void cleanup() {
method filter (line 88) | private static String filter(String decompile) {
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/cfr/ClassSource.java
class ClassSource (line 17) | public class ClassSource implements ClassFileSource {
method ClassSource (line 32) | public ClassSource(@Nonnull Workspace workspace, @Nonnull String targe...
method informAnalysisRelativePathDetail (line 39) | @Override
method addJar (line 43) | @Override
method getPossiblyRenamedPath (line 48) | @Override
method getClassFileContent (line 53) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/cfr/SinkFactoryImpl.java
class SinkFactoryImpl (line 17) | public class SinkFactoryImpl implements OutputSinkFactory {
method getSupportedSinks (line 22) | @Override
method getSink (line 27) | @Override
method handleException (line 37) | private <T> void handleException(@Nullable T value) {
method setDecompilation (line 46) | private <T> void setDecompilation(T value) {
method getDecompilation (line 53) | @Nullable
method getException (line 61) | @Nullable
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/fallback/FallbackConfig.java
class FallbackConfig (line 13) | @ApplicationScoped
method FallbackConfig (line 16) | @Inject
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/fallback/FallbackDecompiler.java
class FallbackDecompiler (line 18) | @ApplicationScoped
method FallbackDecompiler (line 30) | @Inject
method decompileInternal (line 36) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/fallback/print/ClassPrinter.java
class ClassPrinter (line 21) | public class ClassPrinter {
method ClassPrinter (line 31) | public ClassPrinter(@Nonnull TextFormatConfig format, @Nonnull JvmClas...
method print (line 39) | @Nonnull
method appendPackage (line 55) | private void appendPackage(@Nonnull Printer out) {
method appendImports (line 70) | private void appendImports(@Nonnull Printer out) {
method appendDeclaration (line 112) | private void appendDeclaration(@Nonnull Printer out) {
method appendDeclarationAnnotations (line 131) | private void appendDeclarationAnnotations(@Nonnull Printer out) {
method appendEnumDeclaration (line 142) | private void appendEnumDeclaration(@Nonnull Printer out) {
method appendAnnotationDeclaration (line 181) | private void appendAnnotationDeclaration(@Nonnull Printer out) {
method appendInterfaceDeclaration (line 207) | private void appendInterfaceDeclaration(@Nonnull Printer out) {
method appendStandardDeclaration (line 241) | private void appendStandardDeclaration(@Nonnull Printer out) {
method appendMembers (line 271) | private void appendMembers(@Nonnull Printer out) {
method appendFieldMembers (line 333) | private void appendFieldMembers(@Nonnull Printer out) {
method appendEnumFieldMembers (line 347) | private void appendEnumFieldMembers(@Nonnull Printer out) {
method appendField (line 386) | private void appendField(@Nonnull Printer out, @Nonnull FieldMember fi...
method isEnumConst (line 433) | private boolean isEnumConst(@Nonnull FieldMember field) {
method appendStaticInitializer (line 454) | private void appendStaticInitializer(@Nonnull Printer out, @Nonnull Me...
method appendConstructor (line 493) | private void appendConstructor(@Nonnull Printer out, @Nonnull MethodMe...
method appendMethod (line 517) | private void appendMethod(@Nonnull Printer out, @Nonnull MethodMember ...
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/fallback/print/MethodPrinter.java
class MethodPrinter (line 30) | public class MethodPrinter {
method MethodPrinter (line 43) | public MethodPrinter(@Nonnull TextFormatConfig format, @Nonnull JvmCla...
method print (line 52) | @Nonnull
method appendAnnotations (line 71) | protected void appendAnnotations(@Nonnull StringBuilder sb) {
method appendDeclaration (line 88) | protected void appendDeclaration(@Nonnull StringBuilder sb) {
method buildDeclarationFlags (line 105) | protected void buildDeclarationFlags(@Nonnull StringBuilder sb) {
method buildDeclarationReturnType (line 122) | protected void buildDeclarationReturnType(@Nonnull StringBuilder sb) {
method buildDeclarationName (line 139) | protected void buildDeclarationName(@Nonnull StringBuilder sb) {
method buildDeclarationArgs (line 152) | protected void buildDeclarationArgs(@Nonnull StringBuilder sb) {
method buildDeclarationThrows (line 197) | protected void buildDeclarationThrows(@Nonnull StringBuilder sb) {
method appendAbstractBody (line 213) | protected void appendAbstractBody(@Nonnull StringBuilder sb) {
method appendBody (line 223) | protected void appendBody(@Nonnull StringBuilder sb) {
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/fallback/print/PrintUtils.java
class PrintUtils (line 24) | public class PrintUtils {
method annotationsToString (line 33) | @Nonnull
method annotationToString (line 56) | @Nonnull
method elementToString (line 91) | @Nonnull
method elementValueToString (line 105) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/fallback/print/Printer.java
class Printer (line 12) | public class Printer {
method setIndent (line 20) | public void setIndent(@Nonnull String indent) {
method appendLine (line 30) | public void appendLine(@Nonnull String line) {
method appendMultiLine (line 44) | public void appendMultiLine(@Nonnull String text) {
method newLine (line 53) | public void newLine() {
method toString (line 57) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/filter/JvmBytecodeFilter.java
type JvmBytecodeFilter (line 15) | public interface JvmBytecodeFilter {
method filter (line 27) | @Nonnull
method applyFilters (line 40) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/filter/OutputTextFilter.java
type OutputTextFilter (line 12) | public interface OutputTextFilter {
method filter (line 23) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/procyon/ProcyonConfig.java
class ProcyonConfig (line 23) | @ApplicationScoped
method ProcyonConfig (line 48) | @Inject
method toSettings (line 78) | @Nonnull
method getIncludeLineNumbersInBytecode (line 105) | @Nonnull
method getShowSyntheticMembers (line 110) | @Nonnull
method getAlwaysGenerateExceptionVariableForCatchBlocks (line 115) | @Nonnull
method getForceFullyQualifiedReferences (line 120) | @Nonnull
method getForceExplicitImports (line 125) | @Nonnull
method getForceExplicitTypeArguments (line 130) | @Nonnull
method getFlattenSwitchBlocks (line 135) | @Nonnull
method getExcludeNestedTypes (line 140) | @Nonnull
method getRetainRedundantCasts (line 145) | @Nonnull
method getRetainPointlessSwitches (line 150) | @Nonnull
method getIsUnicodeOutputEnabled (line 155) | @Nonnull
method getIncludeErrorDiagnostics (line 160) | @Nonnull
method getMergeVariables (line 165) | @Nonnull
method getDisableForEachTransforms (line 170) | @Nonnull
method getShowDebugLineNumbers (line 175) | @Nonnull
method getSimplifyMemberReferences (line 180) | @Nonnull
method getArePreviewFeaturesEnabled (line 185) | @Nonnull
method getTextBlockLineMinimum (line 190) | @Nonnull
method getForcedCompilerTarget (line 195) | @Nonnull
method getBytecodeOutputOptions (line 200) | @Nonnull
method getLanguageTarget (line 205) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/procyon/ProcyonDecompiler.java
class ProcyonDecompiler (line 37) | @ApplicationScoped
method ProcyonDecompiler (line 50) | @Inject
method decompileInternal (line 68) | @Nonnull
method tryLoadType (line 98) | @Override
class LanguageTypeAdapter (line 114) | private static class LanguageTypeAdapter extends TypeAdapter<Language> {
method write (line 115) | @Override
method read (line 120) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/procyon/WorkspaceTypeLoader.java
class WorkspaceTypeLoader (line 13) | public final class WorkspaceTypeLoader implements ITypeLoader {
method WorkspaceTypeLoader (line 20) | public WorkspaceTypeLoader(Workspace workspace) {
method tryLoadType (line 24) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/BaseSource.java
class BaseSource (line 17) | public abstract class BaseSource implements IContextSource {
method BaseSource (line 27) | protected BaseSource(@Nonnull Workspace workspace, @Nonnull JvmClassIn...
method getName (line 32) | @Override
method getInputStream (line 37) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/ClassSource.java
class ClassSource (line 19) | public class ClassSource extends BaseSource {
method ClassSource (line 28) | protected ClassSource(@Nonnull Workspace workspace, @Nonnull JvmClassI...
method getSink (line 36) | @Nonnull
method getEntries (line 41) | @Override
method createOutputSink (line 57) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/DecompiledOutputSink.java
class DecompiledOutputSink (line 14) | public class DecompiledOutputSink implements IContextSource.IOutputSink {
method DecompiledOutputSink (line 22) | protected DecompiledOutputSink(@Nonnull JvmClassInfo target) {
method getDecompiledOutput (line 29) | @Nonnull
method begin (line 34) | @Override
method acceptClass (line 39) | @Override
method acceptDirectory (line 45) | @Override
method acceptOther (line 50) | @Override
method close (line 55) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/DummyResultSaver.java
class DummyResultSaver (line 13) | @ExcludeFromJacocoGeneratedReport(justification = "We don't use VF file ...
method saveFolder (line 15) | @Override
method copyFile (line 20) | @Override
method saveClassFile (line 25) | @Override
method createArchive (line 30) | @Override
method saveDirEntry (line 35) | @Override
method copyEntry (line 40) | @Override
method saveClassEntry (line 45) | @Override
method closeArchive (line 50) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/LibrarySource.java
class LibrarySource (line 17) | public class LibrarySource extends BaseSource {
method LibrarySource (line 28) | protected LibrarySource(@Nonnull List<IContextSource.Entry> entries, @...
method getEntries (line 33) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/VineflowerConfig.java
class VineflowerConfig (line 25) | @ApplicationScoped
method main (line 80) | public static void main(String[] args) {
method VineflowerConfig (line 90) | @Inject
method getFernflowerProperties (line 148) | @Nonnull
method getLoggingLevel (line 165) | @Nonnull
method getRemoveBridge (line 170) | @Nonnull
method getRemoveSynthetic (line 175) | @Nonnull
method getDecompileInner (line 180) | @Nonnull
method getDecompileClass_1_4 (line 185) | @Nonnull
method getDecompileAssertions (line 190) | @Nonnull
method getHideEmptySuper (line 195) | @Nonnull
method getHideDefaultConstructor (line 200) | @Nonnull
method getDecompileGenericSignatures (line 205) | @Nonnull
method getNoExceptionsReturn (line 210) | @Nonnull
method getEnsureSynchronizedMonitor (line 215) | @Nonnull
method getDecompileEnum (line 220) | @Nonnull
method getRemoveGetClassNew (line 225) | @Nonnull
method getLiteralsAsIs (line 230) | @Nonnull
method getBooleanTrueOne (line 235) | @Nonnull
method getAsciiStringCharacters (line 240) | @Nonnull
method getSyntheticNotSet (line 245) | @Nonnull
method getUndefinedParamTypeObject (line 250) | @Nonnull
method getUseDebugVarNames (line 255) | @Nonnull
method getUseMethodParameters (line 260) | @Nonnull
method getRemoveEmptyRanges (line 265) | @Nonnull
method getFinallyDeinline (line 270) | @Nonnull
method getIdeaNotNullAnnotation (line 275) | @Nonnull
method getLambdaToAnonymousClass (line 280) | @Nonnull
method getBytecodeSourceMapping (line 285) | @Nonnull
method getDumpCodeLines (line 290) | @Nonnull
method getIgnoreInvalidBytecode (line 295) | @Nonnull
method getVerifyAnonymousClasses (line 300) | @Nonnull
method getTernaryConstantSimplification (line 305) | @Nonnull
method getOverrideAnnotation (line 310) | @Nonnull
method getPatternMatching (line 315) | @Nonnull
method getTryLoopFix (line 320) | @Nonnull
method getTernaryConditions (line 325) | @Nonnull
method getSwitchExpressions (line 330) | @Nonnull
method getShowHiddenStatements (line 335) | @Nonnull
method getSimplifyStackSecondPass (line 340) | @Nonnull
method getVerifyVariableMerges (line 345) | @Nonnull
method getDecompilePreview (line 350) | @Nonnull
method getExplicitGenericArguments (line 355) | @Nonnull
method getInlineSimpleLambdas (line 360) | @Nonnull
method getUseJadVarNaming (line 365) | @Nonnull
method getUseJadParameterNaming (line 370) | @Nonnull
method getSkipExtraFiles (line 375) | @Nonnull
method getWarnInconsistentInnerClasses (line 380) | @Nonnull
method getDumpBytecodeOnError (line 385) | @Nonnull
method getDumpExceptionOnError (line 390) | @Nonnull
method getDecompilerComments (line 395) | @Nonnull
method getSourceFileComments (line 400) | @Nonnull
method getDecompileComplexCondys (line 405) | @Nonnull
method getForceJsrInline (line 410) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/VineflowerDecompiler.java
class VineflowerDecompiler (line 19) | @ApplicationScoped
method VineflowerDecompiler (line 33) | @Inject
method decompileInternal (line 41) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/VineflowerLogger.java
class VineflowerLogger (line 15) | public class VineflowerLogger extends IFernflowerLogger {
method VineflowerLogger (line 20) | public VineflowerLogger(@Nonnull VineflowerConfig config) {
method writeMessage (line 24) | @Override
method writeMessage (line 40) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/decompile/vineflower/WorkspaceEntriesCache.java
class WorkspaceEntriesCache (line 17) | public class WorkspaceEntriesCache {
method getCachedEntries (line 27) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/CallResultInliningTransformer.java
class CallResultInliningTransformer (line 45) | @Dependent
method CallResultInliningTransformer (line 55) | @Inject
method setup (line 60) | @Override
method transform (line 66) | @Override
method recommendedSuccessors (line 127) | @Nonnull
method name (line 135) | @Nonnull
method canEvaluate (line 141) | private boolean canEvaluate(@Nonnull MethodInsnNode min) {
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/CycleClassRemovingTransformer.java
class CycleClassRemovingTransformer (line 23) | @Dependent
method CycleClassRemovingTransformer (line 29) | @Inject
method setup (line 36) | @Override
method transform (line 42) | @Override
method name (line 51) | @Nonnull
method pruneAfterNoWork (line 57) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/DeadCodeRemovingTransformer.java
class DeadCodeRemovingTransformer (line 41) | @Dependent
method transform (line 43) | @Override
method prune (line 56) | public boolean prune(@Nonnull ClassNode node, @Nonnull MethodNode meth...
method visit (line 137) | private static void visit(@Nonnull Set<AbstractInsnNode> visited, @Non...
method recommendedPredecessors (line 174) | @Nonnull
method name (line 182) | @Nonnull
method hasInsn (line 189) | boolean hasInsn(@Nonnull AbstractInsnNode insn) {
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/DuplicateAnnotationRemovingTransformer.java
class DuplicateAnnotationRemovingTransformer (line 22) | @Dependent
method transform (line 24) | @Override
method name (line 40) | @Nonnull
method pruneAfterNoWork (line 46) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/DuplicateCatchMergingTransformer.java
class DuplicateCatchMergingTransformer (line 36) | @Dependent
method transform (line 49) | @Override
method hasExternalFlowIntoCatchBlock (line 120) | private static boolean hasExternalFlowIntoCatchBlock(@Nonnull MethodNo...
method name (line 134) | @Nonnull
class CodeBlock (line 144) | private final static class CodeBlock implements Comparable<CodeBlock> {
method CodeBlock (line 149) | private CodeBlock(@Nonnull List<AbstractInsnNode> instructions) {
method pruneContent (line 164) | public void pruneContent(@Nonnull InsnList container) {
method redirectTo (line 179) | public void redirectTo(@Nonnull InsnList container, @Nonnull LabelNo...
method getIndex (line 187) | public int getIndex() {
method getInstructions (line 194) | @Nonnull
method equals (line 199) | @Override
method hashCode (line 206) | @Override
method toString (line 211) | @Override
method compareTo (line 216) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/EnumNameRestorationTransformer.java
class EnumNameRestorationTransformer (line 34) | @Dependent
method transform (line 38) | @Override
method handleValuesArray (line 82) | private void handleValuesArray(@Nonnull JvmTransformerContext context,
method handleEnumConst (line 106) | private static void handleEnumConst(@Nonnull JvmTransformerContext con...
method name (line 133) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/ExceptionCollectionTransformer.java
class ExceptionCollectionTransformer (line 32) | @Dependent
method ExceptionCollectionTransformer (line 38) | @Inject
method setup (line 47) | @Override
method transform (line 52) | @Override
method name (line 84) | @Nonnull
method getThrownExceptions (line 93) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/FrameRemovingTransformer.java
class FrameRemovingTransformer (line 25) | @Dependent
method transform (line 27) | @Override
method name (line 52) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/GotoInliningTransformer.java
class GotoInliningTransformer (line 41) | @Dependent
method transform (line 46) | @Override
method dependencies (line 303) | @Nonnull
method name (line 309) | @Nonnull
method copyOf (line 321) | @Nonnull
method isGotoBlockTerminator (line 340) | private static boolean isGotoBlockTerminator(int op) {
class VisitCounters (line 347) | private static class VisitCounters {
method of (line 350) | @Nonnull
class VisitCounter (line 359) | private static class VisitCounter {
method VisitCounter (line 365) | private VisitCounter(@Nonnull LabelNode label) {
method addExplicitSource (line 369) | public void addExplicitSource(@Nonnull AbstractInsnNode insn) {
method removeExplicitSource (line 373) | public void removeExplicitSource(@Nonnull AbstractInsnNode insn) {
method markImplicitFlow (line 377) | public void markImplicitFlow() {
method isVisited (line 381) | public boolean isVisited() {
method isImplicitFlow (line 387) | public boolean isImplicitFlow() {
method isTryTarget (line 391) | public boolean isTryTarget() {
method getExplicitFlowSourcesExcluding (line 395) | public long getExplicitFlowSourcesExcluding(@Nonnull Collection<Abst...
method count (line 401) | public int count() {
method markTryStart (line 405) | public void markTryStart() {
method markTryEnd (line 409) | public void markTryEnd() {
method markTryHandler (line 413) | public void markTryHandler() {
method toString (line 417) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/IllegalAnnotationRemovingTransformer.java
class IllegalAnnotationRemovingTransformer (line 21) | @Dependent
method transform (line 23) | @Override
method name (line 39) | @Nonnull
method pruneAfterNoWork (line 45) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/IllegalNameMappingTransformer.java
class IllegalNameMappingTransformer (line 28) | @Dependent
method transform (line 34) | @Override
method name (line 58) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/IllegalSignatureRemovingTransformer.java
class IllegalSignatureRemovingTransformer (line 21) | @Dependent
method transform (line 23) | @Override
method name (line 39) | @Nonnull
method pruneAfterNoWork (line 45) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/IllegalVarargsRemovingTransformer.java
class IllegalVarargsRemovingTransformer (line 23) | @Dependent
method transform (line 25) | @Override
method name (line 53) | @Nonnull
method pruneAfterNoWork (line 59) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/KotlinMetadataCollectionTransformer.java
class KotlinMetadataCollectionTransformer (line 54) | @Dependent
method setup (line 59) | @Override
method transform (line 64) | @Override
method getField (line 108) | @Nullable
method getFieldGetter (line 132) | @Nullable
method getMethod (line 156) | @Nullable
method getCandidates (line 172) | @Nonnull
method reverseMapDescriptor (line 204) | @Nonnull
method getKtClass (line 215) | @Nullable
method getKtFallbackMapping (line 226) | @Nullable
method name (line 231) | @Nonnull
method mapKtDescriptor (line 245) | @Nonnull
method mapKtDescriptor (line 262) | @Nonnull
method mapToJvm (line 286) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/KotlinNameRestorationTransformer.java
class KotlinNameRestorationTransformer (line 29) | @Dependent
method transform (line 31) | @Override
method name (line 83) | @Nonnull
method dependencies (line 89) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/LongAnnotationRemovingTransformer.java
class LongAnnotationRemovingTransformer (line 23) | @Dependent
method transform (line 27) | @Override
method name (line 43) | @Nonnull
method pruneAfterNoWork (line 49) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/LongExceptionRemovingTransformer.java
class LongExceptionRemovingTransformer (line 21) | @Dependent
method transform (line 25) | @Override
method name (line 42) | @Nonnull
method pruneAfterNoWork (line 48) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/OpaqueConstantFoldingTransformer.java
class OpaqueConstantFoldingTransformer (line 61) | @Dependent
method OpaqueConstantFoldingTransformer (line 68) | @Inject
method setup (line 73) | @Override
method transform (line 78) | @Override
method pass1StackManipulation (line 138) | private boolean pass1StackManipulation(@Nonnull JvmTransformerContext ...
method pass2SequenceFolding (line 330) | private boolean pass2SequenceFolding(@Nonnull JvmTransformerContext co...
method evaluateTopFromSequence (line 522) | @Nonnull
method foldRedundantOperations (line 564) | private static boolean foldRedundantOperations(@Nonnull InsnList instr...
method computeInstructionStackDifference (line 638) | private static int computeInstructionStackDifference(@Nonnull Frame<Re...
method shouldContinueSequence (line 668) | private static boolean shouldContinueSequence(@Nonnull List<AbstractIn...
method name (line 709) | @Nonnull
method recommendedPredecessors (line 715) | @Nonnull
method isSupportedValueProducer (line 732) | protected static boolean isSupportedValueProducer(@Nonnull AbstractIns...
method toInsn (line 762) | @Nullable
method getSlotsOccupied (line 786) | private static int getSlotsOccupied(@Nonnull Frame<ReValue> frame) {
method getBinaryOperationArguments (line 810) | @Nullable
method collectArgument (line 885) | @Nullable
method canConsumeAccumulatedStackConsumption (line 913) | private static boolean canConsumeAccumulatedStackConsumption(@Nonnull ...
method canConsumeAccumulatedStackConsumption (line 924) | private static boolean canConsumeAccumulatedStackConsumption(int inter...
method replaceBinOp (line 1031) | public void replaceBinOp(@Nonnull InsnList instructions) {
method hasIntermediates (line 1060) | public boolean hasIntermediates() {
method sameAs (line 1070) | public boolean sameAs(@Nonnull Argument other) {
method getCombinedStackConsumption (line 1080) | public int getCombinedStackConsumption(@Nonnull Argument other) {
method getCombinedIntermediates (line 1092) | @Nonnull
method toString (line 1101) | @Override
method providesBinaryOpValuesFor (line 1118) | public boolean providesBinaryOpValuesFor(int opcode) {
method replaceInsn (line 1146) | public boolean replaceInsn(@Nonnull InsnList instructions) {
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/OpaquePredicateFoldingTransformer.java
class OpaquePredicateFoldingTransformer (line 45) | @Dependent
method OpaquePredicateFoldingTransformer (line 50) | @Inject
method setup (line 55) | @Override
method transform (line 60) | @Override
method replaceIntValue (line 261) | private static boolean replaceIntValue(@Nonnull InsnList instructions,
method replaceIntIntValue (line 277) | private static boolean replaceIntIntValue(@Nonnull InsnList instructions,
method replaceObjValue (line 296) | private static boolean replaceObjValue(@Nonnull InsnList instructions,
method replaceObjObjValue (line 312) | private static boolean replaceObjObjValue(@Nonnull InsnList instructions,
method isValueProducerOrTopDup (line 335) | private static boolean isValueProducerOrTopDup(@Nonnull AbstractInsnNo...
method recommendedPredecessors (line 343) | @Nonnull
method dependencies (line 356) | @Nonnull
method name (line 362) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/RedundantTryCatchRemovingTransformer.java
class RedundantTryCatchRemovingTransformer (line 62) | @Dependent
method RedundantTryCatchRemovingTransformer (line 76) | @Inject
method setup (line 81) | @Override
method transform (line 86) | @Override
method dependencies (line 116) | @Nonnull
method name (line 122) | @Nonnull
method pruneRedundantTryCatches (line 143) | private boolean pruneRedundantTryCatches(@Nonnull JvmTransformerContex...
method removeIgnoredRanges (line 182) | @Nonnull
method mergeContinuousRanges (line 255) | @Nonnull
method removeExactDuplicates (line 291) | @Nonnull
method removeShadowedRanges (line 330) | @Nonnull
method removeImpossibleCatches (line 366) | @Nonnull
method canCatchBeUsed (line 387) | private boolean canCatchBeUsed(@Nonnull InsnList instructions,
method computeVisitedInstructions (line 478) | private static boolean[] computeVisitedInstructions(@Nonnull InsnList ...
method isWorkspaceExceptionNeverThrown (line 538) | private boolean isWorkspaceExceptionNeverThrown(@Nonnull String tryCat...
method canInsnThrowAnyException (line 553) | private boolean canInsnThrowAnyException(@Nonnull AbstractInsnNode ins...
method canInsnThrowCaughtException (line 587) | private boolean canInsnThrowCaughtException(@Nonnull AbstractInsnNode ...
method canArrayAccessThrow (line 625) | private static boolean canArrayAccessThrow(@Nullable ReValue arrayValu...
method canArrayAccessThrow (line 639) | private boolean canArrayAccessThrow(@Nonnull String catchType, @Nullab...
method canArrayStoreThrow (line 657) | private boolean canArrayStoreThrow(int opcode, @Nullable ReValue array...
method canArrayStoreThrow (line 677) | private boolean canArrayStoreThrow(@Nonnull String catchType, int opco...
method canArithmeticThrow (line 697) | private boolean canArithmeticThrow(@Nonnull String catchType, int opco...
method isZeroDivisorPossible (line 718) | private static boolean isZeroDivisorPossible(@Nullable ReValue value) {
method canAthrowThrow (line 734) | private boolean canAthrowThrow(@Nonnull String catchType, @Nullable Re...
method canMonitorExitThrow (line 765) | private boolean canMonitorExitThrow(@Nonnull String catchType, @Nullab...
method canCheckCastThrow (line 779) | private boolean canCheckCastThrow(@Nonnull TypeInsnNode cast, @Nullabl...
method canArrayStoreTypeThrow (line 807) | private boolean canArrayStoreTypeThrow(@Nullable ReValue arrayValue, @...
method isAssignable (line 835) | private boolean isAssignable(@Nonnull Type targetType, @Nonnull Type v...
method isNegativeSizePossible (line 864) | private static boolean isNegativeSizePossible(@Nullable ReValue value) {
method isNegativeMultiArraySizePossible (line 878) | private static boolean isNegativeMultiArraySizePossible(@Nonnull Multi...
method canArrayIndexThrow (line 893) | private static boolean canArrayIndexThrow(@Nullable ReValue arrayValue...
method canThrowNullPointer (line 920) | private boolean canThrowNullPointer(@Nonnull String catchType, @Nullab...
method canReferenceRuntimeTypeMatch (line 932) | private boolean canReferenceRuntimeTypeMatch(@Nonnull Type type, @Nonn...
method isCaughtException (line 949) | private boolean isCaughtException(@Nonnull String catchType, @Nonnull ...
method catchesSameOrBroaderException (line 962) | private boolean catchesSameOrBroaderException(@Nullable String broader...
method isReferencePossiblyNull (line 977) | private static boolean isReferencePossiblyNull(@Nullable ReValue value) {
method isReferenceKnownNull (line 987) | private static boolean isReferenceKnownNull(@Nullable ReValue value) {
method peekStack (line 1001) | @Nullable
method codeBoundaryIndex (line 1017) | private static int codeBoundaryIndex(@Nonnull InsnList instructions, @...
method snapshotState (line 1033) | @Nonnull
method snapshotStates (line 1049) | @Nonnull
method covers (line 1070) | private boolean covers(@Nonnull TryCatchState other) {
method Handlers (line 1094) | private Handlers() {
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/SourceNameRestorationTransformer.java
class SourceNameRestorationTransformer (line 21) | @Dependent
method transform (line 23) | @Override
method name (line 50) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/StaticValueCollectionTransformer.java
class StaticValueCollectionTransformer (line 48) | @Dependent
method StaticValueCollectionTransformer (line 56) | @Inject
method getStaticValue (line 72) | @Nullable
method get (line 80) | @Nonnull
method hasLookup (line 95) | @Override
method setup (line 100) | @Override
method transform (line 105) | @Override
method name (line 223) | @Nonnull
method hasStaticSetters (line 235) | private static boolean hasStaticSetters(@Nonnull MethodNode method) {
method key (line 251) | @Nonnull
class EffectivelyFinalFields (line 259) | private static class EffectivelyFinalFields {
method add (line 271) | public void add(@Nonnull String name, @Nonnull String desc) {
method addMaybe (line 285) | public void addMaybe(@Nonnull String name, @Nonnull String desc) {
method removeMaybe (line 299) | public void removeMaybe(@Nonnull String name, @Nonnull String desc) {
method commitMaybeIntoEffectivelyFinals (line 307) | public void commitMaybeIntoEffectivelyFinals() {
method contains (line 323) | public boolean contains(@Nonnull String name, @Nonnull String desc) {
class StaticValues (line 333) | private static class StaticValues {
method put (line 336) | private void put(@Nonnull String name, @Nonnull String desc, @Nonnul...
method get (line 340) | @Nullable
method commitRemainingAsDefaults (line 345) | private void commitRemainingAsDefaults(@Nonnull EffectivelyFinalFiel...
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/StaticValueInliningTransformer.java
class StaticValueInliningTransformer (line 37) | @Dependent
method transform (line 39) | @Override
method name (line 100) | @Nonnull
method dependencies (line 106) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/UnknownAttributeRemovingTransformer.java
class UnknownAttributeRemovingTransformer (line 25) | @Dependent
method transform (line 27) | @Override
method name (line 53) | @Nonnull
method pruneAfterNoWork (line 59) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/VariableFoldingTransformer.java
class VariableFoldingTransformer (line 53) | @Dependent
method VariableFoldingTransformer (line 58) | @Inject
method setup (line 63) | @Override
method transform (line 68) | @Override
method populateLiveness (line 216) | private static void populateLiveness(@Nonnull MethodNode method,
method populateVariableAccessStates (line 295) | private static void populateVariableAccessStates(@Nonnull MethodNode m...
method isRedundantStore (line 355) | private static boolean isRedundantStore(@Nonnull Int2ObjectMap<LocalAc...
method replaceRedundantVariableUsage (line 451) | private static void replaceRedundantVariableUsage(@Nonnull InsnList in...
method isMatchingLoad (line 471) | private static boolean isMatchingLoad(int typeSort, int opcode) {
method recommendedSuccessors (line 482) | @Nonnull
method name (line 490) | @Nonnull
method key (line 504) | private static int key(int slot, int typeSort) {
method slotFromKey (line 514) | private static int slotFromKey(int key) {
method typeSortFromKey (line 524) | private static int typeSortFromKey(int key) {
class LocalAccessState (line 534) | private static class LocalAccessState {
method LocalAccessState (line 539) | private LocalAccessState(int index) {
method addRead (line 543) | public void addRead(int offset, @Nonnull AbstractInsnNode instructio...
method addWrite (line 549) | public void addWrite(int offset, @Nonnull AbstractInsnNode instructi...
method getReads (line 555) | @Nonnull
method getWrites (line 562) | @Nonnull
method toString (line 569) | @Override
method compareTo (line 588) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/generic/VariableTableNormalizingTransformer.java
class VariableTableNormalizingTransformer (line 37) | @Dependent
method transform (line 39) | @Override
method name (line 116) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/deobfuscation/transform/specific/DashOpaqueSeedFoldingTransformer.java
class DashOpaqueSeedFoldingTransformer (line 30) | @Dependent
method transform (line 32) | @Override
method name (line 92) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/file/RecafDirectoriesConfig.java
class RecafDirectoriesConfig (line 27) | @ApplicationScoped
method RecafDirectoriesConfig (line 41) | @Inject
method initCurrentLogPath (line 51) | public void initCurrentLogPath(@Nonnull Path currentLog) {
method getCurrentLogPath (line 59) | @Nonnull
method getBaseDirectory (line 67) | @Nonnull
method getAgentDirectory (line 75) | @Nonnull
method getConfigDirectory (line 83) | @Nonnull
method getLogsDirectory (line 91) | @Nonnull
method getPluginDirectory (line 99) | @Nonnull
method getExtraPluginDirectory (line 109) | @Nullable
method getDisabledPluginDirectory (line 123) | @Nonnull
method getStyleDirectory (line 131) | @Nonnull
method getScriptsDirectory (line 139) | @Nonnull
method getTempDirectory (line 147) | @Nonnull
method resolveDirectory (line 152) | @Nonnull
method setupLocalTempDir (line 163) | private void setupLocalTempDir() {
method createBaseDirectory (line 187) | @Nonnull
method getSystemConfigDir (line 206) | @Nullable
FILE: recaf-core/src/main/java/software/coley/recaf/services/inheritance/ClassPathNodeProvider.java
type ClassPathNodeProvider (line 17) | sealed interface ClassPathNodeProvider {
method getNode (line 24) | @Nullable
method cache (line 35) | static ClassPathNodeProvider.Cached cache(@Nonnull Workspace workspace) {
method getNode (line 52) | @Nullable
method size (line 69) | int size() {
method getNode (line 73) | @Nullable
FILE: recaf-core/src/main/java/software/coley/recaf/services/inheritance/InheritanceGraph.java
class InheritanceGraph (line 43) | public class InheritanceGraph {
method InheritanceGraph (line 60) | public InheritanceGraph(@Nonnull Workspace workspace) {
method installMappingListener (line 87) | public void installMappingListener(@Nonnull MappingListeners mappingLi...
method uninstallMappingListener (line 100) | public void uninstallMappingListener(@Nonnull MappingListeners mapping...
method refreshChildLookup (line 111) | private void refreshChildLookup() {
method populateParentToChildLookup (line 131) | private void populateParentToChildLookup(@Nonnull String name, @Nonnul...
method populateParentToChildLookup (line 149) | private void populateParentToChildLookup(@Nonnull String name, @Nonnul...
method populateParentToChildLookup (line 159) | private void populateParentToChildLookup(@Nonnull ClassInfo info) {
method populateParentToChildLookup (line 173) | private void populateParentToChildLookup(@Nonnull ClassInfo info, @Non...
method populateParentToChildLookup (line 220) | private void populateParentToChildLookup(@Nonnull ClassInfo info, @Non...
method removeParentToChildLookup (line 230) | private void removeParentToChildLookup(@Nonnull ClassInfo info) {
method removeParentToChildLookup (line 246) | private void removeParentToChildLookup(@Nonnull String name, @Nonnull ...
method removeClass (line 264) | private void removeClass(@Nonnull ClassInfo cls) {
method getDirectChildren (line 277) | @Nonnull
method getVertex (line 290) | @Nullable
method getVertex (line 315) | @Nullable
method getVertexFamily (line 328) | @Nonnull
method isAssignableFrom (line 349) | public boolean isAssignableFrom(@Nonnull String first, @Nonnull String...
method getCommon (line 380) | @Nonnull
method getCommon (line 412) | @Nonnull
method isLibraryMethod (line 472) | public boolean isLibraryMethod(@Nonnull String name, @Nonnull String m...
method createVertex (line 491) | @Nullable
method onUpdateClassImpl (line 514) | private void onUpdateClassImpl(@Nonnull ClassInfo oldValue, @Nonnull C...
class ListenerHost (line 546) | private class ListenerHost implements WorkspaceModificationListener, W...
method onNewClass (line 549) | @Override
method onNewClass (line 554) | @Override
method onUpdateClass (line 559) | @Override
method onUpdateClass (line 564) | @Override
method onRemoveClass (line 569) | @Override
method onRemoveClass (line 574) | @Override
method onAddLibrary (line 579) | @Override
method onRemoveLibrary (line 591) | @Override
method onWorkspaceClosed (line 602) | @Override
method onPreApply (line 609) | @Override
method onPostApply (line 614) | @Override
class InheritanceStubVertex (line 646) | private static class InheritanceStubVertex extends InheritanceVertex {
method InheritanceStubVertex (line 647) | private InheritanceStubVertex() {
method hasField (line 651) | @Override
method hasMethod (line 656) | @Override
method isJavaLangObject (line 661) | @Override
method isParentOf (line 666) | @Override
method isChildOf (line 671) | @Override
method isIndirectFamilyMember (line 676) | @Override
method isIndirectFamilyMember (line 681) | @Override
method getFamily (line 686) | @Nonnull
method getAllParents (line 692) | @Nonnull
method allParents (line 698) | @Nonnull
method getParents (line 704) | @Nonnull
method getAllChildren (line 710) | @Nonnull
method getChildren (line 716) | @Nonnull
method getAllDirectVertices (line 722) | @Nonnull
method getName (line 728) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/inheritance/InheritanceGraphService.java
class InheritanceGraphService (line 22) | @EagerInitialization
method InheritanceGraphService (line 31) | @Inject
method getOrCreateInheritanceGraph (line 52) | @Nonnull
method newInheritanceGraph (line 65) | @Nonnull
method getCurrentWorkspaceInheritanceGraph (line 74) | @Nullable
method getServiceId (line 93) | @Nonnull
method getServiceConfig (line 99) | @Nonnull
class ListenerHost (line 105) | private class ListenerHost implements WorkspaceCloseListener {
method onWorkspaceClosed (line 106) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/inheritance/InheritanceGraphServiceConfig.java
class InheritanceGraphServiceConfig (line 14) | @ApplicationScoped
method InheritanceGraphServiceConfig (line 16) | @Inject
FILE: recaf-core/src/main/java/software/coley/recaf/services/inheritance/InheritanceVertex.java
class InheritanceVertex (line 29) | public class InheritanceVertex {
method InheritanceVertex (line 47) | public InheritanceVertex(@Nonnull ClassInfo value,
method hasField (line 64) | public boolean hasField(@Nonnull String name, @Nonnull String desc) {
method hasFieldInSelfOrParents (line 79) | public boolean hasFieldInSelfOrParents(@Nonnull String name, @Nonnull ...
method hasFieldInSelfOrChildren (line 95) | public boolean hasFieldInSelfOrChildren(@Nonnull String name, @Nonnull...
method hasMethod (line 111) | public boolean hasMethod(@Nonnull String name, @Nonnull String desc) {
method hasMethodInSelfOrParents (line 126) | public boolean hasMethodInSelfOrParents(@Nonnull String name, @Nonnull...
method hasMethodInSelfOrChildren (line 142) | public boolean hasMethodInSelfOrChildren(@Nonnull String name, @Nonnul...
method isLibraryVertex (line 155) | public boolean isLibraryVertex() {
method isJavaLangObject (line 162) | public boolean isJavaLangObject() {
method isLoop (line 169) | public boolean isLoop() {
method isModule (line 184) | public boolean isModule() {
method isLibraryMethod (line 197) | public boolean isLibraryMethod(@Nonnull String name, @Nonnull String d...
method isParentOf (line 218) | public boolean isParentOf(@Nonnull InheritanceVertex vertex) {
method isChildOf (line 228) | public boolean isChildOf(@Nonnull InheritanceVertex vertex) {
method isIndirectFamilyMember (line 238) | public boolean isIndirectFamilyMember(@Nonnull InheritanceVertex verte...
method isIndirectFamilyMember (line 250) | public boolean isIndirectFamilyMember(@Nonnull Set<InheritanceVertex> ...
method hasParent (line 263) | public boolean hasParent(@Nonnull String name) {
method hasChild (line 289) | public boolean hasChild(@Nonnull String name) {
method getFamily (line 303) | @Nonnull
method visitFamily (line 312) | private void visitFamily(@Nonnull Set<InheritanceVertex> vertices) {
method getAllParents (line 323) | @Nonnull
method allParents (line 331) | @Nonnull
method getParents (line 341) | @Nonnull
method getAllChildren (line 376) | @Nonnull
method allChildren (line 384) | @Nonnull
method getChildren (line 394) | @Nonnull
method getAllDirectVertices (line 423) | @Nonnull
method clearCachedVertices (line 431) | public void clearCachedVertices() {
method getName (line 442) | @Nonnull
method getParentNames (line 450) | @Nonnull
method getParentAndCurrentNames (line 460) | @Nonnull
method getValue (line 468) | @Nonnull
method setValue (line 477) | public void setValue(@Nonnull ClassInfo value) {
method equals (line 482) | @Override
method hashCode (line 490) | @Override
method toString (line 495) | @Override
FILE: recaf-core/src/main/java/software/coley/recaf/services/json/GsonProvider.java
class GsonProvider (line 25) | @ApplicationScoped
method GsonProvider (line 31) | @Inject
method getGson (line 39) | @Nonnull
method addTypeAdapterFactory (line 61) | public void addTypeAdapterFactory(@Nonnull TypeAdapterFactory factory) {
method addTypeAdapter (line 77) | public <T> void addTypeAdapter(@Nonnull Class<T> type, @Nonnull TypeAd...
method addTypeInstanceCreator (line 93) | public <T> void addTypeInstanceCreator(@Nonnull Class<? extends T> typ...
method addTypeDeserializer (line 109) | public <T> void addTypeDeserializer(@Nonnull Class<? extends T> type, ...
method addTypeSerializer (line 126) | public <T> void addTypeSerializer(@Nonnull Class<? extends T> type, @N...
method register (line 142) | private void register(@Nonnull Class<?> type, @Nonnull Object adapter) {
method getServiceId (line 146) | @Nonnull
method getServiceConfig (line 152) | @Nonnull
method getBuilderCopy (line 161) | @Nonnull
method updateBuilder (line 180) | private void updateBuilder(@Nullable Consumer<GsonBuilder> consumer) {
FILE: recaf-core/src/main/java/software/coley/recaf/services/json/GsonProviderConfig.java
class GsonProviderConfig (line 17) | @ApplicationScoped
method GsonProviderConfig (line 21) | @Inject
method getPrettyPrint (line 30) | @Nonnull
FILE: recaf-core/src/main/java/software/coley/recaf/services/mapping/BasicMappingsRemapper.java
class BasicMappingsRemapper (line 13) | public class BasicMappingsRemapper extends Remapper {
method BasicMappingsRemapper (line 21) | public BasicMappingsRemapper(@Nonnull Mappings mappings) {
method map (line 27) | @Override
method mapType (line 37) | @Override
method mapFieldName (line 51) |
Condensed preview — 1323 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (8,000K chars).
[
{
"path": ".gitattributes",
"chars": 966,
"preview": "# Auto detect text files and perform LF normalization\n* text=auto\n\n# Java sources\n*.java text dif"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 510,
"preview": "---\nname: Bug report\nabout: Create a report to notify developers of unintended behavior\n\n---\n\n**Describe the bug**\n\n> A "
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 117,
"preview": "---\nname: Feature request\nabout: Suggest a feature to improve Recaf\n\n---\n\n## Feature_Name\n\nDescription of the feature"
},
{
"path": ".github/ISSUE_TEMPLATE/other.md",
"chars": 81,
"preview": "---\nname: Other\nabout: If it isn't a bug or a feature request, choose this\n\n---\n\n"
},
{
"path": ".github/workflows/build.yml",
"chars": 6412,
"preview": "name: CI/CD\n\non:\n push:\n branches:\n - master\n pull_request:\n branches:\n - master\n workflow_dispatch:\n"
},
{
"path": ".gitignore",
"chars": 273,
"preview": "# IntelliJ\nout/\n.idea/\n.idea_modules/\n*.iws\n*.iml\n\n# Eclipse\n.settings/\n.classpath\n.checkstyle\n.project\n\n# Gradle\ntarget"
},
{
"path": "CONTRIBUTING.md",
"chars": 3294,
"preview": "# Contributing to Recaf\n\nThe following is a series of guidelines for contributing to Recaf. They're not _\"rules\"_ per sa"
},
{
"path": "LICENSE",
"chars": 1084,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2017-2025 Matthew Coley\n\nPermission is hereby granted, free of charge, to any perso"
},
{
"path": "PRIMER.md",
"chars": 2319,
"preview": "# What should I know before getting started?\n\n## JVM / Class file format\n\n### General concepts\n\nA basic understanding of"
},
{
"path": "PULL_REQUEST_TEMPLATE.md",
"chars": 80,
"preview": "## What's new\n\n* Summary of additions\n\n## What's fixed\n\n* Summary of bugs fixed\n"
},
{
"path": "README.md",
"chars": 4087,
"preview": "# Recaf [](https://discord.gg/Bya"
},
{
"path": "build.gradle",
"chars": 5566,
"preview": "plugins {\n alias(libs.plugins.benmanes.versions) apply false\n alias(libs.plugins.coverage.report.aggregator)\n a"
},
{
"path": "codecov.yml",
"chars": 212,
"preview": "coverage:\n precision: 2\n round: down\n status:\n project:\n default:\n informational: true\n patch:\n "
},
{
"path": "docs/README.md",
"chars": 270,
"preview": "# Github pages directory\n\nGithub pages requires this directory be named `docs`. \nIf you were looking for documentation g"
},
{
"path": "docs/index.html",
"chars": 845,
"preview": "<html lang=\"en\">\n<head>\n <title>Recaf - The modern bytecode editor</title>\n\t<meta charset=\"UTF-8\">\n\t<meta name=\"descr"
},
{
"path": "gradle/libs.versions.toml",
"chars": 7025,
"preview": "[versions]\nacc-agent = \"1.0.4\"\nassertj = \"3.27.3\"\nasm = \"9.9\"\natlantafx = \"2.1.0\"\nbinary-resources = \"31.3.0-alpha01.8\"\n"
},
{
"path": "gradle/tasks.gradle",
"chars": 24234,
"preview": "import java.nio.file.Files\nimport java.nio.file.StandardCopyOption\n\n// Copies all project dependencies (including transi"
},
{
"path": "gradle/wrapper/gradle-wrapper.properties",
"chars": 202,
"preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributi"
},
{
"path": "gradle.properties",
"chars": 23,
"preview": "org.gradle.caching=true"
},
{
"path": "gradlew",
"chars": 8047,
"preview": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
},
{
"path": "gradlew.bat",
"chars": 2763,
"preview": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (th"
},
{
"path": "jitpack.yml",
"chars": 97,
"preview": "jdk:\n - openjdk22\nbefore_install:\n - sdk install java 22.0.1-zulu\n - sdk use java 22.0.1-zulu\n"
},
{
"path": "libs/README.md",
"chars": 284,
"preview": "# Provided libraries\n\nIn some circumstances, libraries are not hosted on standard Maven hosts.\n\n## Kotlin Metadata\n\nGene"
},
{
"path": "recaf-core/build.gradle",
"chars": 2385,
"preview": "import java.nio.file.Files\n\nplugins {\n alias(libs.plugins.peterabeles.gversion)\n}\n\napply plugin: 'java-library'\napply"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/Bootstrap.java",
"chars": 2404,
"preview": "package software.coley.recaf;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport jakarta.ent"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/ExitCodes.java",
"chars": 708,
"preview": "package software.coley.recaf;\n\n/**\n * Exit codes for Recaf calling {@link System#exit(int)}.\n *\n * @author Matt Coley\n *"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/ExitDebugLoggingHook.java",
"chars": 10717,
"preview": "package software.coley.recaf;\n\nimport com.google.common.hash.Hasher;\nimport com.google.common.hash.Hashing;\nimport jakar"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/Recaf.java",
"chars": 2241,
"preview": "package software.coley.recaf;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.enterprise.inject.Instance;\nimport jaka"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/RecafConstants.java",
"chars": 296,
"preview": "package software.coley.recaf;\n\nimport org.objectweb.asm.Opcodes;\n\n/**\n * Common constants.\n *\n * @author Matt Coley\n */\n"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/analytics/SystemInformation.java",
"chars": 3135,
"preview": "package software.coley.recaf.analytics;\n\nimport jakarta.annotation.Nullable;\nimport org.slf4j.Logger;\n\nimport java.io.St"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/analytics/logging/DebuggingLogger.java",
"chars": 846,
"preview": "package software.coley.recaf.analytics.logging;\n\nimport jakarta.annotation.Nonnull;\nimport org.slf4j.Logger;\nimport soft"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/analytics/logging/InterceptingLogger.java",
"chars": 9779,
"preview": "package software.coley.recaf.analytics.logging;\n\nimport jakarta.annotation.Nonnull;\nimport org.slf4j.Logger;\nimport org."
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/analytics/logging/LogConsumer.java",
"chars": 923,
"preview": "package software.coley.recaf.analytics.logging;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\n"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/analytics/logging/Logging.java",
"chars": 4537,
"preview": "package software.coley.recaf.analytics.logging;\n\nimport ch.qos.logback.classic.LoggerContext;\nimport ch.qos.logback.clas"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/analytics/logging/RecafLoggingFilter.java",
"chars": 1782,
"preview": "package software.coley.recaf.analytics.logging;\n\nimport ch.qos.logback.classic.Level;\nimport ch.qos.logback.classic.spi."
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/behavior/Closing.java",
"chars": 178,
"preview": "package software.coley.recaf.behavior;\n\n/**\n * Type is closable.\n *\n * @author Matt Coley\n */\npublic interface Closing {"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/behavior/PriorityKeys.java",
"chars": 572,
"preview": "package software.coley.recaf.behavior;\n\n/**\n * Default keys for {@link PrioritySortable} implementations.\n * <p>\n * Sear"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/behavior/PrioritySortable.java",
"chars": 1374,
"preview": "package software.coley.recaf.behavior;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.collections.Lists;\n\nimp"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/cdi/EagerInitialization.java",
"chars": 1761,
"preview": "package software.coley.recaf.cdi;\n\nimport jakarta.enterprise.context.ApplicationScoped;\nimport jakarta.enterprise.event."
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/cdi/EagerInitializationExtension.java",
"chars": 3686,
"preview": "package software.coley.recaf.cdi;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.enterprise.context.ApplicationScope"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/cdi/InitializationEvent.java",
"chars": 289,
"preview": "package software.coley.recaf.cdi;\n\n/**\n * Empty type, used to notify CDI consumers observing this type that the applicat"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/cdi/InitializationStage.java",
"chars": 316,
"preview": "package software.coley.recaf.cdi;\n\n/**\n * Initialization stage for {@link EagerInitialization#value()}.\n *\n * @author Ma"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/cdi/UiInitializationEvent.java",
"chars": 284,
"preview": "package software.coley.recaf.cdi;\n\n/**\n * Empty type, used to notify CDI consumers observing this type that the UI has b"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/config/BasicCollectionConfigValue.java",
"chars": 3040,
"preview": "package software.coley.recaf.config;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.observables.ObservableCol"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/config/BasicConfigContainer.java",
"chars": 1391,
"preview": "package software.coley.recaf.config;\n\nimport jakarta.annotation.Nonnull;\n\nimport java.util.Map;\nimport java.util.TreeMap"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/config/BasicConfigValue.java",
"chars": 1861,
"preview": "package software.coley.recaf.config;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.observables.Observable;\n\n"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/config/BasicMapConfigValue.java",
"chars": 3307,
"preview": "package software.coley.recaf.config;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.observables.ObservableMap"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/config/ConfigCollectionValue.java",
"chars": 423,
"preview": "package software.coley.recaf.config;\n\nimport java.util.Collection;\n\n/**\n * An option stored in a {@link ConfigContainer}"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/config/ConfigContainer.java",
"chars": 1515,
"preview": "package software.coley.recaf.config;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.enterprise.context.ApplicationSc"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/config/ConfigGroups.java",
"chars": 2365,
"preview": "package software.coley.recaf.config;\n\nimport software.coley.recaf.services.Service;\n\n/**\n * Constants for {@link ConfigC"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/config/ConfigMapValue.java",
"chars": 481,
"preview": "package software.coley.recaf.config;\n\nimport java.util.Map;\n\n/**\n * An option stored in a {@link ConfigContainer} object"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/config/ConfigPersistence.java",
"chars": 477,
"preview": "package software.coley.recaf.config;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Outline of persistence for {@link Confi"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/config/ConfigValue.java",
"chars": 910,
"preview": "package software.coley.recaf.config;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.observables.Observable;\n\n"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/config/RestoreAwareConfigContainer.java",
"chars": 623,
"preview": "package software.coley.recaf.config;\n\nimport software.coley.recaf.services.config.ConfigManager;\n\n/**\n * Outline of a co"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/Accessed.java",
"chars": 5379,
"preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.member.ClassMember;\n\nimport static java.lang.reflec"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/AndroidChunkFileInfo.java",
"chars": 526,
"preview": "package software.coley.recaf.info;\n\nimport com.google.devrel.gmscore.tools.apk.arsc.BinaryResourceFile;\nimport jakarta.a"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/AndroidClassInfo.java",
"chars": 1540,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.builder.AndroidC"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/ApkFileInfo.java",
"chars": 167,
"preview": "package software.coley.recaf.info;\n\n/**\n * Outline of an APK Android file container.\n *\n * @author Matt Coley\n */\npublic"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/ArscFileInfo.java",
"chars": 511,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.android.xml.AndroidResource"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/AudioFileInfo.java",
"chars": 327,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Outline of an audio file.\n *\n * @author M"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicAndroidChunkFileInfo.java",
"chars": 806,
"preview": "package software.coley.recaf.info;\n\nimport com.google.devrel.gmscore.tools.apk.arsc.BinaryResourceFile;\nimport jakarta.a"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicAndroidClassInfo.java",
"chars": 2557,
"preview": "package software.coley.recaf.info;\n\nimport com.android.tools.r8.graph.DexProgramClass;\nimport jakarta.annotation.Nonnull"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicApkFileInfo.java",
"chars": 411,
"preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.ZipFileInfoBuilder;\n\n/**\n * Basic implement"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicArscFileInfo.java",
"chars": 1157,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport org.slf4j.Logger;\nimport software.coley.an"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicAudioFileInfo.java",
"chars": 412,
"preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.AudioFileInfoBuilder;\n\n/**\n * Basic impleme"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicBinaryXmlFileInfo.java",
"chars": 446,
"preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.BinaryXmlFileInfoBuilder;\n\n/**\n * Basic imp"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicClassInfo.java",
"chars": 8427,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.annotation.Annot"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicDexFileInfo.java",
"chars": 408,
"preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.DexFileInfoBuilder;\n\n/**\n * Basic implement"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicFileInfo.java",
"chars": 1957,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.builder.FileInfo"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicImageFileInfo.java",
"chars": 412,
"preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.ImageFileInfoBuilder;\n\n/**\n * Basic impleme"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicInnerClassInfo.java",
"chars": 2522,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\n\nimport java.util.Objects;\n\n/**\n * Basic implemen"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicJModFileInfo.java",
"chars": 406,
"preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.JModFileInfoBuilder;\n\n/**\n * Basic implemen"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicJarFileInfo.java",
"chars": 400,
"preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.JarFileInfoBuilder;\n\n/**\n * Basic implement"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicJvmClassInfo.java",
"chars": 1536,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport org.objectweb.asm.ClassReader;\nimport soft"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicModulesFileInfo.java",
"chars": 421,
"preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.ModulesFileInfoBuilder;\n\n/**\n * Basic imple"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicNativeLibraryFileInfo.java",
"chars": 460,
"preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.NativeLibraryFileInfoBuilder;\n\n/**\n * Basic"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicTextFileInfo.java",
"chars": 919,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.builder.TextFile"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicVideoFileInfo.java",
"chars": 411,
"preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.VideoFileInfoBuilder;\n\n/**\n * Basic impleme"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicWarFileInfo.java",
"chars": 400,
"preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.WarFileInfoBuilder;\n\n/**\n * Basic implement"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BasicZipFileInfo.java",
"chars": 397,
"preview": "package software.coley.recaf.info;\n\nimport software.coley.recaf.info.builder.ZipFileInfoBuilder;\n\n/**\n * Basic implement"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/BinaryXmlFileInfo.java",
"chars": 193,
"preview": "package software.coley.recaf.info;\n\n/**\n * Outline of a binary XML file, used by Android APK's.\n *\n * @author Matt Coley"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/ClassInfo.java",
"chars": 10098,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/DexFileInfo.java",
"chars": 154,
"preview": "package software.coley.recaf.info;\n\n/**\n * Outline of an Android dex file.\n *\n * @author Matt Coley\n */\npublic interface"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/FileInfo.java",
"chars": 3249,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/ImageFileInfo.java",
"chars": 327,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Outline of an image file.\n *\n * @author M"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/Info.java",
"chars": 585,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.properties.Prope"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/InnerClassInfo.java",
"chars": 3332,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\n\n/**\n * Outli"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/JModFileInfo.java",
"chars": 313,
"preview": "package software.coley.recaf.info;\n\n/**\n * Outline of a JVM JMod file.\n * These files are found at {@code %JAVA%/jmods/}"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/JarFileInfo.java",
"chars": 655,
"preview": "package software.coley.recaf.info;\n\n/**\n * Outline of a JAR file container.\n *\n * @author Matt Coley\n */\npublic interfac"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/JvmClassInfo.java",
"chars": 6724,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport org.objectweb.asm.ClassReader;\nimport org."
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/ModulesFileInfo.java",
"chars": 210,
"preview": "package software.coley.recaf.info;\n\n/**\n * Outline of a JVM modules file.\n * This file is found at {@code %JAVA%/lib/mod"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/Named.java",
"chars": 3351,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport net.greypanther.natsort.CaseInsensitiveSim"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/NativeLibraryFileInfo.java",
"chars": 382,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Outline of a native library or applicatio"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/StubClassInfo.java",
"chars": 4950,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport org.ob"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/StubFieldMember.java",
"chars": 863,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/StubFileInfo.java",
"chars": 3077,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.properties.Prope"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/StubMember.java",
"chars": 2127,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/StubMethodMember.java",
"chars": 1262,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/TextFileInfo.java",
"chars": 907,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.builder.TextFile"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/VideoFileInfo.java",
"chars": 326,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Outline of a video file.\n *\n * @author Ma"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/WarFileInfo.java",
"chars": 265,
"preview": "package software.coley.recaf.info;\n\n/**\n * Outline of a WAR file container.\n *\n * @author Matt Coley\n */\npublic interfac"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/ZipFileInfo.java",
"chars": 407,
"preview": "package software.coley.recaf.info;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Outline of a ZIP file container.\n *\n * @a"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/Annotated.java",
"chars": 1185,
"preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.Class"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/AnnotationArrayReference.java",
"chars": 342,
"preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\n\nimport java.util.List;\n\n/**\n * Outlin"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/AnnotationElement.java",
"chars": 556,
"preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\nimport org.objectweb.asm.Type;\n\nimport"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/AnnotationEnumReference.java",
"chars": 395,
"preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Outline of an enum reference f"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/AnnotationInfo.java",
"chars": 854,
"preview": "package software.coley.recaf.info.annotation;\n\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\ni"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicAnnotationArrayReference.java",
"chars": 1039,
"preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\n\nimport java.util.List;\nimport java.ut"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicAnnotationElement.java",
"chars": 1256,
"preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\n\nimport java.util.Objects;\n\n/**\n * Bas"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicAnnotationEnumReference.java",
"chars": 1237,
"preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Basic implementation of an ann"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicAnnotationInfo.java",
"chars": 3231,
"preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nim"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/BasicTypeAnnotationInfo.java",
"chars": 1609,
"preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nim"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/annotation/TypeAnnotationInfo.java",
"chars": 557,
"preview": "package software.coley.recaf.info.annotation;\n\nimport jakarta.annotation.Nullable;\nimport org.objectweb.asm.TypePath;\nim"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/AbstractClassInfoBuilder.java",
"chars": 7221,
"preview": "package software.coley.recaf.info.builder;\n\nimport software.coley.recaf.info.Accessed;\nimport software.coley.recaf.info."
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/AndroidClassInfoBuilder.java",
"chars": 8175,
"preview": "package software.coley.recaf.info.builder;\n\nimport com.android.tools.r8.graph.*;\nimport com.google.common.collect.Stream"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/ApkFileInfoBuilder.java",
"chars": 555,
"preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.*;\n\n/**\n"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/ArscFileInfoBuilder.java",
"chars": 624,
"preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.ArscFile"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/AudioFileInfoBuilder.java",
"chars": 649,
"preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicAud"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/BinaryXmlFileInfoBuilder.java",
"chars": 610,
"preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicBin"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/ChunkFileInfoBuilder.java",
"chars": 560,
"preview": "package software.coley.recaf.info.builder;\n\nimport software.coley.recaf.info.AndroidChunkFileInfo;\n\n/**\n * Common builde"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/DexFileInfoBuilder.java",
"chars": 623,
"preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicDex"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/FileInfoBuilder.java",
"chars": 3826,
"preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.*;\nimpor"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/ImageFileInfoBuilder.java",
"chars": 649,
"preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicIma"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/JModFileInfoBuilder.java",
"chars": 565,
"preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.*;\n\n/**\n"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/JarFileInfoBuilder.java",
"chars": 616,
"preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicJar"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/JvmClassInfoBuilder.java",
"chars": 24990,
"preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimpor"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/ModulesFileInfoBuilder.java",
"chars": 675,
"preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicMod"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/NativeLibraryFileInfoBuilder.java",
"chars": 741,
"preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicNat"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/TextFileInfoBuilder.java",
"chars": 1404,
"preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicTex"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/VideoFileInfoBuilder.java",
"chars": 649,
"preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicVid"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/WarFileInfoBuilder.java",
"chars": 555,
"preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.*;\n\n/**\n"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/builder/ZipFileInfoBuilder.java",
"chars": 1105,
"preview": "package software.coley.recaf.info.builder;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.info.BasicZip"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/member/BasicFieldMember.java",
"chars": 1672,
"preview": "package software.coley.recaf.info.member;\n\nimport java.util.Objects;\n\n/**\n * Basic implementation of a field member.\n *\n"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/member/BasicLocalVariable.java",
"chars": 1738,
"preview": "package software.coley.recaf.info.member;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\n\nimpor"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/member/BasicMember.java",
"chars": 3305,
"preview": "package software.coley.recaf.info.member;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/member/BasicMethodMember.java",
"chars": 2819,
"preview": "package software.coley.recaf.info.member;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/member/ClassMember.java",
"chars": 1347,
"preview": "package software.coley.recaf.info.member;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/member/FieldMember.java",
"chars": 712,
"preview": "package software.coley.recaf.info.member;\n\nimport jakarta.annotation.Nullable;\nimport software.coley.recaf.info.ClassInf"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/member/LocalVariable.java",
"chars": 514,
"preview": "package software.coley.recaf.info.member;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\n\n/**\n "
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/member/MethodMember.java",
"chars": 1131,
"preview": "package software.coley.recaf.info.member;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/BasicProperty.java",
"chars": 1196,
"preview": "package software.coley.recaf.info.properties;\n\nimport jakarta.annotation.Nonnull;\n\nimport java.util.Objects;\n\n/**\n * Bas"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/BasicPropertyContainer.java",
"chars": 1855,
"preview": "package software.coley.recaf.info.properties;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\n\ni"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/Property.java",
"chars": 1458,
"preview": "package software.coley.recaf.info.properties;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\n\n/"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/PropertyContainer.java",
"chars": 2250,
"preview": "package software.coley.recaf.info.properties;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\n\ni"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/BinaryXmlDecodedProperty.java",
"chars": 1271,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/CachedDecompileProperty.java",
"chars": 2814,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/HasMappedReferenceProperty.java",
"chars": 1243,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.in"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/IllegalClassSuspectProperty.java",
"chars": 1534,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.in"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/InputFilePathProperty.java",
"chars": 1224,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/MemberIndexAcceleratorProperty.java",
"chars": 2592,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.in"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/OriginalClassNameProperty.java",
"chars": 1863,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/PathOriginalNameProperty.java",
"chars": 1698,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/PathPrefixProperty.java",
"chars": 1997,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/PathSuffixProperty.java",
"chars": 1674,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ReferencedClassesProperty.java",
"chars": 1803,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/RemapOriginTaskProperty.java",
"chars": 1162,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.in"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/RemoteClassloaderProperty.java",
"chars": 1899,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;\nimport it.u"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/StringDefinitionsProperty.java",
"chars": 1492,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ThrowableProperty.java",
"chars": 1376,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.in"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/UnknownAttributesProperty.java",
"chars": 1627,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.in"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/VersionedClassProperty.java",
"chars": 1878,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;\nimport it.u"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipAccessTimeProperty.java",
"chars": 1808,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipCommentProperty.java",
"chars": 1732,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipCompressionProperty.java",
"chars": 1959,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipCreationTimeProperty.java",
"chars": 1826,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipEntryIndexProperty.java",
"chars": 1784,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipMarkerProperty.java",
"chars": 1373,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.in"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipModificationTimeProperty.java",
"chars": 1734,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/info/properties/builtin/ZipPrefixDataProperty.java",
"chars": 1302,
"preview": "package software.coley.recaf.info.properties.builtin;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Null"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/launch/LaunchArguments.java",
"chars": 2157,
"preview": "package software.coley.recaf.launch;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport jaka"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/launch/LaunchCommand.java",
"chars": 4280,
"preview": "package software.coley.recaf.launch;\n\nimport ch.qos.logback.classic.Level;\nimport jakarta.annotation.Nullable;\nimport ja"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/launch/LaunchHandler.java",
"chars": 851,
"preview": "package software.coley.recaf.launch;\n\nimport jakarta.annotation.PostConstruct;\nimport jakarta.enterprise.context.Applica"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/AbstractPathNode.java",
"chars": 3282,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/AnnotationPathNode.java",
"chars": 2088,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/BundlePathNode.java",
"chars": 5788,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/CatchPathNode.java",
"chars": 1511,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/ClassMemberPathNode.java",
"chars": 6330,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport org.ob"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/ClassPathNode.java",
"chars": 4728,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/DirectoryPathNode.java",
"chars": 4267,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport net.gr"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/EmbeddedResourceContainerPathNode.java",
"chars": 1492,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/FilePathNode.java",
"chars": 3280,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/IncompletePathException.java",
"chars": 881,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\n\n/**\n * Used "
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/InnerClassPathNode.java",
"chars": 1938,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/InstructionPathNode.java",
"chars": 1979,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport org.ob"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/LineNumberPathNode.java",
"chars": 1623,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/LocalVariablePathNode.java",
"chars": 1937,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/PathNode.java",
"chars": 9243,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/PathNodes.java",
"chars": 12844,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport org.ob"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/ResourcePathNode.java",
"chars": 5089,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/ThrowsPathNode.java",
"chars": 1475,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport jakarta.annotation.Nullable;\nimport softwa"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/path/WorkspacePathNode.java",
"chars": 2455,
"preview": "package software.coley.recaf.path;\n\nimport jakarta.annotation.Nonnull;\nimport software.coley.recaf.workspace.model.Works"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/plugin/Plugin.java",
"chars": 382,
"preview": "package software.coley.recaf.plugin;\n\n/**\n * Base interface that all plugins must inherit from.\n * Classes that implemen"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/plugin/PluginInformation.java",
"chars": 949,
"preview": "package software.coley.recaf.plugin;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nim"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/services/Service.java",
"chars": 369,
"preview": "package software.coley.recaf.services;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Outline of a service.\n *\n * @author M"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/services/ServiceConfig.java",
"chars": 682,
"preview": "package software.coley.recaf.services;\n\nimport jakarta.enterprise.context.ApplicationScoped;\nimport jakarta.inject.Injec"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/services/assembler/AbstractAssemblerPipeline.java",
"chars": 7442,
"preview": "package software.coley.recaf.services.assembler;\n\nimport jakarta.annotation.Nonnull;\nimport me.darknet.assembler.ast.AST"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/services/assembler/AndroidAssemblerPipeline.java",
"chars": 516,
"preview": "package software.coley.recaf.services.assembler;\n\nimport jakarta.annotation.Nonnull;\n\n/**\n * Dalvik assembler pipeline i"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/services/assembler/AndroidAssemblerPipelineConfig.java",
"chars": 1302,
"preview": "package software.coley.recaf.services.assembler;\n\nimport jakarta.enterprise.context.ApplicationScoped;\nimport jakarta.in"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/services/assembler/AssemblerPipeline.java",
"chars": 6552,
"preview": "package software.coley.recaf.services.assembler;\n\nimport jakarta.annotation.Nonnull;\nimport me.darknet.assembler.ast.AST"
},
{
"path": "recaf-core/src/main/java/software/coley/recaf/services/assembler/AssemblerPipelineConfig.java",
"chars": 1045,
"preview": "package software.coley.recaf.services.assembler;\n\nimport software.coley.recaf.config.ConfigContainer;\n\n/**\n * Assembler "
}
]
// ... and 1123 more files (download for full content)
About this extraction
This page contains the full source code of the Col-E/Recaf GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1323 files (7.0 MB), approximately 1.9M tokens, and a symbol index with 9970 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.