From: Andrew Udvare <audvare@gmail.com>
Subject: [PATCH] Port to Ghidra 12

Two API changes since 11.3, which is what upstream last built against.

Ghidra 12 moved the Objective-C format readers under
ghidra.app.util.bin.format.objc and dropped the ObjectiveC<n>_ prefix, so
objc2.ObjectiveC2_Constants is now objc.objc2.Objc2Constants. isObjectiveC2()
is unchanged.

Loader.postLoadProgramFixups() had its five trailing parameters replaced by a
single Loader.ImporterSettings record. The project is reached through
settings.project(); nothing else in the override used the others.

diff --git a/src/main/java/lol/fairplay/ghidraapple/analysis/passes/selectortrampoline/ARCFixupInstallerAnalyzer.kt b/src/main/java/lol/fairplay/ghidraapple/analysis/passes/selectortrampoline/ARCFixupInstallerAnalyzer.kt
index e85d570..8eb3611 100644
--- a/src/main/java/lol/fairplay/ghidraapple/analysis/passes/selectortrampoline/ARCFixupInstallerAnalyzer.kt
+++ b/src/main/java/lol/fairplay/ghidraapple/analysis/passes/selectortrampoline/ARCFixupInstallerAnalyzer.kt
@@ -3,7 +3,7 @@ package lol.fairplay.ghidraapple.analysis.passes.selectortrampoline
 import ghidra.app.services.AbstractAnalyzer
 import ghidra.app.services.AnalysisPriority
 import ghidra.app.services.AnalyzerType
-import ghidra.app.util.bin.format.objc2.ObjectiveC2_Constants
+import ghidra.app.util.bin.format.objc.objc2.Objc2Constants
 import ghidra.app.util.importer.MessageLog
 import ghidra.program.database.SpecExtension
 import ghidra.program.model.address.AddressSetView
@@ -26,7 +26,7 @@ class ARCFixupInstallerAnalyzer : AbstractAnalyzer(NAME, DESCRIPTION, AnalyzerTy
         setSupportsOneTimeAnalysis()
     }
 
-    override fun canAnalyze(program: Program?): Boolean = ObjectiveC2_Constants.isObjectiveC2(program)
+    override fun canAnalyze(program: Program?): Boolean = Objc2Constants.isObjectiveC2(program)
 
     private fun createCallFixupXML(
         name: String,
diff --git a/src/main/java/lol/fairplay/ghidraapple/loading/UniversalBinaryLoader.kt b/src/main/java/lol/fairplay/ghidraapple/loading/UniversalBinaryLoader.kt
index 40744f9..a986569 100644
--- a/src/main/java/lol/fairplay/ghidraapple/loading/UniversalBinaryLoader.kt
+++ b/src/main/java/lol/fairplay/ghidraapple/loading/UniversalBinaryLoader.kt
@@ -1,14 +1,10 @@
 package lol.fairplay.ghidraapple.loading
 
-import ghidra.app.util.Option
 import ghidra.app.util.bin.ByteProvider
-import ghidra.app.util.importer.MessageLog
-import ghidra.app.util.opinion.LoadSpec
 import ghidra.app.util.opinion.Loaded
+import ghidra.app.util.opinion.Loader
 import ghidra.app.util.opinion.MachoLoader
-import ghidra.framework.model.Project
 import ghidra.program.model.listing.Program
-import ghidra.util.task.TaskMonitor
 
 class UniversalBinaryLoader : MachoLoader() {
     override fun getPreferredFileName(byteProvider: ByteProvider): String {
@@ -26,13 +22,9 @@ class UniversalBinaryLoader : MachoLoader() {
 
     override fun postLoadProgramFixups(
         loadedPrograms: List<Loaded<Program>>?,
-        project: Project,
-        loadSpec: LoadSpec,
-        options: List<Option>,
-        messageLog: MessageLog,
-        monitor: TaskMonitor,
+        settings: Loader.ImporterSettings,
     ) {
-        super.postLoadProgramFixups(loadedPrograms, project, loadSpec, options, messageLog, monitor)
+        super.postLoadProgramFixups(loadedPrograms, settings)
         if (loadedPrograms != null) {
             for (loaded in loadedPrograms) {
                 // The actual program is wrapped, so we need to unwrap it.
@@ -62,7 +54,7 @@ class UniversalBinaryLoader : MachoLoader() {
                         .joinToString("/")
                 loaded.projectFolderPath = newFolderPath
                 // Now that the program is up one folder, we can delete the original one.
-                project.projectData?.getFolder(originalFolderPath)?.delete()
+                settings.project().projectData?.getFolder(originalFolderPath)?.delete()
             }
         }
     }
