diff --git a/build.gradle b/build.gradle index 2e1e89f4..70ed472b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,142 +1,85 @@ plugins { - id 'java-library' - id 'application' - id 'maven-publish' - id "checkstyle" - id 'org.openjfx.javafxplugin' - id 'com.github.johnrengelman.shadow' - id 'org.gradlex.extra-java-module-info' + id 'com.github.johnrengelman.shadow' apply false + id 'org.gradlex.extra-java-module-info' apply false } -repositories { - mavenCentral() - maven { - name "Fabric" - url 'https://maven.fabricmc.net/' - } -} - -archivesBaseName = 'matcher' -group = 'net.fabricmc' - -def ENV = System.getenv() - -checkstyle { - configFile = project.file("checkstyle.xml") - toolVersion = project.checkstyle_version -} - -java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 +subprojects { + apply plugin: 'java-library' + apply plugin: 'maven-publish' + apply plugin: 'checkstyle' + apply plugin: 'com.github.johnrengelman.shadow' + apply plugin: 'org.gradlex.extra-java-module-info' - if (!JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_17)) { - toolchain { - languageVersion = JavaLanguageVersion.of(17) + repositories { + mavenCentral() + maven { + name "Fabric" + url 'https://maven.fabricmc.net/' } } - withSourcesJar() -} - -tasks.withType(JavaCompile).configureEach { - it.options.encoding = "UTF-8" - it.options.release = 17 -} + group = 'net.fabricmc.matcher' + version = rootProject.version -javafx { - version = javafx_version - modules = [ 'javafx.controls', 'javafx.web' ] + checkstyle { + configFile = rootProject.file("checkstyle.xml") + toolVersion = rootProject.checkstyle_version + } - // Don't include native binaries via the plugin, - // since it will only include those for the current OS. - // The full set of native libraries gets shadowed a few lines beneath. - configuration = 'compileOnly' -} + extraJavaModuleInfo { + failOnMissingModuleInfo.set(false) // because of transitive dependencies -dependencies { - api "org.ow2.asm:asm:${asm_version}" - api "org.ow2.asm:asm-tree:${asm_version}" - api "org.slf4j:slf4j-api:${slf4j_version}" - api "net.fabricmc:mapping-io:${mappingio_version}" - implementation "org.ow2.asm:asm-commons:${asm_version}" - implementation "org.ow2.asm:asm-util:${asm_version}" - implementation "com.github.javaparser:javaparser-core:${javaparser_version}" - implementation "net.fabricmc:cfr:${fabric_cfr_version}" - implementation "org.vineflower:vineflower:${vineflower_version}" - implementation "org.bitbucket.mstrobel:procyon-compilertools:${procyon_version}" - implementation ("io.github.skylot:jadx-core:${jadx_version}") { - exclude group: 'com.android.tools.build', module: 'aapt2-proto' - } - implementation ("io.github.skylot:jadx-java-input:${jadx_version}") { - exclude group: 'io.github.skylot', module: 'raung-disasm' - } - runtimeOnly "org.tinylog:tinylog-impl:${tinylog_version}" - runtimeOnly "org.tinylog:slf4j-tinylog:${tinylog_version}" - - // JavaFX for all platforms (needed for cross-platform fat jar) - runtimeOnly "org.openjfx:javafx-base:${javafx_version}:win" - runtimeOnly "org.openjfx:javafx-base:${javafx_version}:mac" - runtimeOnly "org.openjfx:javafx-base:${javafx_version}:linux" - runtimeOnly "org.openjfx:javafx-graphics:${javafx_version}:win" - runtimeOnly "org.openjfx:javafx-graphics:${javafx_version}:mac" - runtimeOnly "org.openjfx:javafx-graphics:${javafx_version}:linux" - runtimeOnly "org.openjfx:javafx-controls:${javafx_version}:win" - runtimeOnly "org.openjfx:javafx-controls:${javafx_version}:mac" - runtimeOnly "org.openjfx:javafx-controls:${javafx_version}:linux" - runtimeOnly "org.openjfx:javafx-web:${javafx_version}:win" - runtimeOnly "org.openjfx:javafx-web:${javafx_version}:mac" - runtimeOnly "org.openjfx:javafx-web:${javafx_version}:linux" - runtimeOnly "org.openjfx:javafx-media:${javafx_version}:win" - runtimeOnly "org.openjfx:javafx-media:${javafx_version}:mac" - runtimeOnly "org.openjfx:javafx-media:${javafx_version}:linux" -} + // JCommander + automaticModule("com.beust:jcommander", "jcommander") -extraJavaModuleInfo { - failOnMissingModuleInfo.set(false) // because of transitive dependencies + // CFR + automaticModule("net.fabricmc:cfr", "cfr") - // CFR - automaticModule("net.fabricmc:cfr", "cfr") + // Vineflower + automaticModule("org.vineflower:vineflower", "org.vineflower.vineflower") - // Vineflower - automaticModule("org.vineflower:vineflower", "org.vineflower.vineflower") + // Procyon + automaticModule("org.bitbucket.mstrobel:procyon-compilertools", "procyon.compilertools") - // Procyon - automaticModule("org.bitbucket.mstrobel:procyon-compilertools", "procyon.compilertools") + // JADX + automaticModule("io.github.skylot:jadx-core", "jadx.core") + automaticModule("io.github.skylot:jadx-plugins-api", "jadx.plugins.api") + automaticModule("io.github.skylot:jadx-java-input", "jadx.plugins.java_input") + } - // JADX - automaticModule("io.github.skylot:jadx-core", "jadx.core") - automaticModule("io.github.skylot:jadx-plugins-api", "jadx.plugins.api") - automaticModule("io.github.skylot:jadx-java-input", "jadx.plugins.java_input") -} + java { + withJavadocJar() + withSourcesJar() + } -application { - mainModule = 'matcher' - mainClass = 'matcher.Main' -} + tasks.withType(JavaCompile).configureEach { + it.options.encoding = "UTF-8" + } -jar { - processResources.exclude('tinylog-dev.properties') -} + tasks.withType(com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar).configureEach { + // https://github.com/johnrengelman/shadow/issues/882#issuecomment-1715703146 + // Defer the resolution of 'runtimeClasspath'. This is an issue in the shadow + // plugin that it automatically accesses the files in 'runtimeClasspath' while + // Gradle is building the task graph. The three lines below work around that. + inputs.files(project.configurations.runtimeClasspath) + configurations = Collections.emptyList() -publishing { - publications { - mavenJava(MavenPublication) { - from components.java + doFirst { + configurations = Collections.singletonList(project.configurations.runtimeClasspath) } } - repositories { - mavenLocal() - - if (ENV.MAVEN_URL) { - repositories.maven { - name "fabric" - url ENV.MAVEN_URL - credentials { - username ENV.MAVEN_USERNAME - password ENV.MAVEN_PASSWORD - } + javadoc { + options.addBooleanOption('html5', true) + + // disable 'missing' warnings + options.addStringOption('Xdoclint:all,-missing', '-quiet') + } + + publishing { + publications { + "$project.name"(MavenPublication) { + from components.java } } } diff --git a/gradle.properties b/gradle.properties index 457ad746..265ad09b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,6 +3,7 @@ org.gradle.jvmargs=-Xmx2G # Gradle Plugins javafx_plugin_version = 0.1.0 +checkstyle_version = 10.12.5 shadow_version = 7.1.2 extra_java_module_info_version = 1.6 @@ -10,14 +11,17 @@ extra_java_module_info_version = 1.6 version = 0.1.0 # Project Dependencies +# Core +slf4j_version = 2.0.12 asm_version = 9.6 +mappingio_version = 0.5.0 +# CLI +jcommander_version = 1.82 +tinylog_version = 2.7.0 +# GUI fabric_cfr_version = 0.2.1 vineflower_version = 1.9.3 procyon_version = 0.6.0 jadx_version = 1.4.7 -mappingio_version = 0.5.0 javaparser_version = 3.25.6 javafx_version = 21.0.1 -checkstyle_version = 10.12.5 -slf4j_version = 2.0.12 -tinylog_version = 2.7.0 diff --git a/matcher-cli/build.gradle b/matcher-cli/build.gradle new file mode 100644 index 00000000..ce5a1f51 --- /dev/null +++ b/matcher-cli/build.gradle @@ -0,0 +1,35 @@ +plugins { + id 'application' +} + +archivesBaseName = 'matcher-cli' + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + + if (!JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_17)) { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } + } +} + +tasks.withType(JavaCompile).configureEach { + it.options.release = 17 +} + +dependencies { + api project(':matcher-core') + api "com.beust:jcommander:${jcommander_version}" + runtimeOnly "org.tinylog:tinylog-impl:${tinylog_version}" + runtimeOnly "org.tinylog:slf4j-tinylog:${tinylog_version}" +} + +application { + mainClass = 'matcher.cli.Main' +} + +jar { + processResources.exclude('tinylog-dev.properties') +} diff --git a/matcher-cli/src/main/java/matcher/cli/Main.java b/matcher-cli/src/main/java/matcher/cli/Main.java new file mode 100644 index 00000000..50237186 --- /dev/null +++ b/matcher-cli/src/main/java/matcher/cli/Main.java @@ -0,0 +1,23 @@ +package matcher.cli; + +import matcher.cli.provider.builtin.AdditionalPluginsCliParameterProvider; +import matcher.cli.provider.builtin.AutomatchCliCommandProvider; +import matcher.model.config.Config; + +public class Main { + public static void main(String[] args) { + Config.init(); + + // Instantiate the CLI handler. We don't accept unknown parameters, + // since this is the base implementation where only known + // providers are registered. + MatcherCli matcherCli = new MatcherCli(false); + + // Register all default providers. + matcherCli.registerParameterProvider(new AdditionalPluginsCliParameterProvider()); + matcherCli.registerCommandProvider(new AutomatchCliCommandProvider()); + + // Parse, handle errors, delegate to the correct provider. + matcherCli.processArgs(args); + } +} diff --git a/matcher-cli/src/main/java/matcher/cli/MatcherCli.java b/matcher-cli/src/main/java/matcher/cli/MatcherCli.java new file mode 100644 index 00000000..15fdb284 --- /dev/null +++ b/matcher-cli/src/main/java/matcher/cli/MatcherCli.java @@ -0,0 +1,67 @@ +package matcher.cli; + +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.beust.jcommander.JCommander; + +import matcher.cli.provider.CliCommandProvider; +import matcher.cli.provider.CliParameterProvider; + +/** + * Main CLI arg handler. + * You have to first register your {@link CliParameterProvider}s and/or {@link CliCommandProvider}s + * via their respective register methods, and then call {@link #processArgs(String[])}. + * JCommander attempts to parse the passed args into the providers, and if applicable, + * then proceeds to call their own {@code processArgs} methods, from where they're free + * to handle the parsed arguments as needed. + */ +public class MatcherCli { + public MatcherCli(boolean acceptUnknownParams) { + this.acceptUnknownParams = acceptUnknownParams; + } + + public void registerParameterProvider(CliParameterProvider paramProvider) { + paramProviders.add(paramProvider); + } + + public void registerCommandProvider(CliCommandProvider commandProvider) { + commandProviders.add(commandProvider); + } + + public void processArgs(String[] args) { + JCommander.Builder jcBuilder = JCommander.newBuilder(); + + // Top level parameter providers + for (CliParameterProvider paramProvider : paramProviders) { + jcBuilder.addObject(paramProvider.getDataHolder()); + } + + // Command providers + for (CliCommandProvider commandProvider : commandProviders) { + jcBuilder.addCommand(commandProvider.getCommandName(), commandProvider.getDataHolder()); + } + + JCommander jCommander = jcBuilder.build(); + jCommander.setAcceptUnknownOptions(acceptUnknownParams); + jCommander.parse(args); + + for (CliParameterProvider paramProvider : paramProviders) { + paramProvider.processArgs(); + } + + for (CliCommandProvider commandProvider : commandProviders) { + if (commandProvider.getCommandName().equals(jCommander.getParsedCommand())) { + commandProvider.processArgs(); + break; + } + } + } + + public static final Logger LOGGER = LoggerFactory.getLogger("Matcher CLI"); + private final List paramProviders = new ArrayList<>(5); + private final List commandProviders = new ArrayList<>(5); + private final boolean acceptUnknownParams; +} diff --git a/matcher-cli/src/main/java/matcher/cli/provider/CliCommandProvider.java b/matcher-cli/src/main/java/matcher/cli/provider/CliCommandProvider.java new file mode 100644 index 00000000..b061c81d --- /dev/null +++ b/matcher-cli/src/main/java/matcher/cli/provider/CliCommandProvider.java @@ -0,0 +1,5 @@ +package matcher.cli.provider; + +public interface CliCommandProvider extends CliParameterProvider { + String getCommandName(); +} diff --git a/matcher-cli/src/main/java/matcher/cli/provider/CliParameterProvider.java b/matcher-cli/src/main/java/matcher/cli/provider/CliParameterProvider.java new file mode 100644 index 00000000..7bc76aeb --- /dev/null +++ b/matcher-cli/src/main/java/matcher/cli/provider/CliParameterProvider.java @@ -0,0 +1,18 @@ +package matcher.cli.provider; + +import com.beust.jcommander.Parameter; + +/** + * Top-level parameter provider. + */ +public interface CliParameterProvider { + /** + * Instance of the class containing the {@link Parameter} annotations. + */ + Object getDataHolder(); + + /** + * Verifies args and handles them. + */ + void processArgs(); +} diff --git a/matcher-cli/src/main/java/matcher/cli/provider/builtin/AdditionalPluginsCliParameterProvider.java b/matcher-cli/src/main/java/matcher/cli/provider/builtin/AdditionalPluginsCliParameterProvider.java new file mode 100644 index 00000000..43d01f1e --- /dev/null +++ b/matcher-cli/src/main/java/matcher/cli/provider/builtin/AdditionalPluginsCliParameterProvider.java @@ -0,0 +1,29 @@ +package matcher.cli.provider.builtin; + +import java.nio.file.Path; +import java.util.Collections; +import java.util.List; + +import com.beust.jcommander.Parameter; + +import matcher.PluginLoader; +import matcher.cli.provider.CliParameterProvider; + +/** + * Provides the default {@code --additional-plugins} parameter. + * If the parameter is present, the passed plugins are automatically loaded. + */ +public class AdditionalPluginsCliParameterProvider implements CliParameterProvider { + @Parameter(names = {BuiltinCliParameters.ADDITIONAL_PLUGINS}) + List additionalPlugins = Collections.emptyList(); + + @Override + public Object getDataHolder() { + return this; + } + + @Override + public void processArgs() { + PluginLoader.run(additionalPlugins); + } +} diff --git a/matcher-cli/src/main/java/matcher/cli/provider/builtin/AutomatchCliCommandProvider.java b/matcher-cli/src/main/java/matcher/cli/provider/builtin/AutomatchCliCommandProvider.java new file mode 100644 index 00000000..a78cc420 --- /dev/null +++ b/matcher-cli/src/main/java/matcher/cli/provider/builtin/AutomatchCliCommandProvider.java @@ -0,0 +1,153 @@ +package matcher.cli.provider.builtin; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; + +import net.fabricmc.mappingio.MappingReader; + +import matcher.Matcher; +import matcher.cli.MatcherCli; +import matcher.cli.provider.CliCommandProvider; +import matcher.model.config.Config; +import matcher.model.config.ProjectConfig; +import matcher.model.mapping.MappingField; +import matcher.model.mapping.Mappings; +import matcher.model.type.ClassEnvironment; +import matcher.serdes.MatchesIo; + +/** + * Provides the default {@code automatch} command. + */ +public class AutomatchCliCommandProvider implements CliCommandProvider { + @Parameters(commandNames = {commandName}) + class AutomatchCommand { + @Parameter(names = {BuiltinCliParameters.INPUTS_A}, required = true) + List inputsA = Collections.emptyList(); + + @Parameter(names = {BuiltinCliParameters.INPUTS_B}, required = true) + List inputsB = Collections.emptyList(); + + @Parameter(names = {BuiltinCliParameters.CLASSPATH_A}) + List classpathA = Collections.emptyList(); + + @Parameter(names = {BuiltinCliParameters.CLASSPATH_B}) + List classpathB = Collections.emptyList(); + + @Parameter(names = {BuiltinCliParameters.SHARED_CLASSPATH}) + List sharedClasspath = Collections.emptyList(); + + @Parameter(names = {BuiltinCliParameters.INPUTS_BEFORE_CLASSPATH}) + boolean inputsBeforeClasspath; + + @Parameter(names = {BuiltinCliParameters.NON_OBFUSCATED_CLASS_PATTERN_A}) + String nonObfuscatedClassPatternA = ""; + + @Parameter(names = {BuiltinCliParameters.NON_OBFUSCATED_CLASS_PATTERN_B}) + String nonObfuscatedClassPatternB = ""; + + @Parameter(names = {BuiltinCliParameters.NON_OBFUSCATED_MEMBER_PATTERN_A}) + String nonObfuscatedMemberPatternA = ""; + + @Parameter(names = {BuiltinCliParameters.NON_OBFUSCATED_MEMBER_PATTERN_B}) + String nonObfuscatedMemberPatternB = ""; + + @Parameter(names = {BuiltinCliParameters.MAPPINGS_A}) + Path mappingsPathA; + + @Parameter(names = {BuiltinCliParameters.MAPPINGS_B}) + Path mappingsPathB; + + @Parameter(names = {BuiltinCliParameters.OUTPUT_FILE}, required = true) + Path outputFile; + + @Parameter(names = {BuiltinCliParameters.DONT_SAVE_UNMAPPED_MATCHES}) + boolean dontSaveUnmappedMatches; + + @Parameter(names = {BuiltinCliParameters.PASSES}) + int passes = 1; + } + + @Override + public String getCommandName() { + return commandName; + } + + @Override + public Object getDataHolder() { + return command; + } + + @Override + public void processArgs() { + Matcher.init(); + ClassEnvironment env = new ClassEnvironment(); + Matcher matcher = new Matcher(env); + ProjectConfig config = new ProjectConfig.Builder(command.inputsA, command.inputsB) + .classPathA(new ArrayList<>(command.classpathA)) + .classPathB(new ArrayList<>(command.classpathB)) + .sharedClassPath(new ArrayList<>(command.sharedClasspath)) + .inputsBeforeClassPath(command.inputsBeforeClasspath) + .mappingsPathA(command.mappingsPathA) + .mappingsPathB(command.mappingsPathB) + .saveUnmappedMatches(!command.dontSaveUnmappedMatches) + .nonObfuscatedClassPatternA(command.nonObfuscatedClassPatternA) + .nonObfuscatedClassPatternB(command.nonObfuscatedClassPatternB) + .nonObfuscatedMemberPatternA(command.nonObfuscatedMemberPatternA) + .nonObfuscatedMemberPatternB(command.nonObfuscatedMemberPatternB) + .build(); + + Config.setProjectConfig(config); + matcher.init(config, (progress) -> { }); + + if (config.getMappingsPathA() != null) { + Path mappingsPath = config.getMappingsPathA(); + + try { + List namespaces = MappingReader.getNamespaces(mappingsPath, null); + Mappings.load(mappingsPath, null, + namespaces.get(0), namespaces.get(1), + MappingField.PLAIN, MappingField.MAPPED, + env.getEnvA(), true); + } catch (IOException e) { + e.printStackTrace(); + } + } + + if (config.getMappingsPathB() != null) { + Path mappingsPath = config.getMappingsPathB(); + + try { + List namespaces = MappingReader.getNamespaces(mappingsPath, null); + Mappings.load(mappingsPath, null, + namespaces.get(0), namespaces.get(1), + MappingField.PLAIN, MappingField.MAPPED, + env.getEnvB(), true); + } catch (IOException e) { + e.printStackTrace(); + } + } + + for (int i = 0; i < command.passes; i++) { + matcher.autoMatchAll((progress) -> { }); + } + + try { + Files.deleteIfExists(command.outputFile); + MatchesIo.write(matcher, command.outputFile); + } catch (Throwable e) { + throw new RuntimeException(e); + } + + MatcherCli.LOGGER.info("Auto-matching done!"); + } + + private static final String commandName = "automatch"; + private final AutomatchCommand command = new AutomatchCommand(); +} diff --git a/matcher-cli/src/main/java/matcher/cli/provider/builtin/BuiltinCliParameters.java b/matcher-cli/src/main/java/matcher/cli/provider/builtin/BuiltinCliParameters.java new file mode 100644 index 00000000..fa2087e1 --- /dev/null +++ b/matcher-cli/src/main/java/matcher/cli/provider/builtin/BuiltinCliParameters.java @@ -0,0 +1,23 @@ +package matcher.cli.provider.builtin; + +/** + * All CLI parameters the CLI module handles by default. + */ +public class BuiltinCliParameters { + public static final String ADDITIONAL_PLUGINS = "--additional-plugins"; + public static final String INPUTS_A = "--inputs-a"; + public static final String INPUTS_B = "--inputs-b"; + public static final String CLASSPATH_A = "--classpath-a"; + public static final String CLASSPATH_B = "--classpath-b"; + public static final String SHARED_CLASSPATH = "--shared-classpath"; + public static final String INPUTS_BEFORE_CLASSPATH = "--inputs-before-classpath"; + public static final String NON_OBFUSCATED_CLASS_PATTERN_A = "--non-obfuscated-class-pattern-a"; + public static final String NON_OBFUSCATED_CLASS_PATTERN_B = "--non-obfuscated-class-pattern-b"; + public static final String NON_OBFUSCATED_MEMBER_PATTERN_A = "--non-obfuscated-member-pattern-a"; + public static final String NON_OBFUSCATED_MEMBER_PATTERN_B = "--non-obfuscated-member-pattern-b"; + public static final String MAPPINGS_A = "--mappings-a"; + public static final String MAPPINGS_B = "--mappings-b"; + public static final String OUTPUT_FILE = "--output-file"; + public static final String DONT_SAVE_UNMAPPED_MATCHES = "--dont-save-unmapped-matches"; + public static final String PASSES = "--passes"; +} diff --git a/matcher-cli/src/main/java/module-info.java b/matcher-cli/src/main/java/module-info.java new file mode 100644 index 00000000..9feb7a87 --- /dev/null +++ b/matcher-cli/src/main/java/module-info.java @@ -0,0 +1,12 @@ +module matcher.cli { + requires transitive jcommander; + requires transitive matcher.core; + + uses matcher.Plugin; + + exports matcher.cli; + exports matcher.cli.provider; + exports matcher.cli.provider.builtin; + + opens matcher.cli.provider.builtin to jcommander; +} diff --git a/src/main/resources/tinylog-dev.properties b/matcher-cli/src/main/resources/tinylog-dev.properties similarity index 100% rename from src/main/resources/tinylog-dev.properties rename to matcher-cli/src/main/resources/tinylog-dev.properties diff --git a/src/main/resources/tinylog.properties b/matcher-cli/src/main/resources/tinylog.properties similarity index 100% rename from src/main/resources/tinylog.properties rename to matcher-cli/src/main/resources/tinylog.properties diff --git a/matcher-core/build.gradle b/matcher-core/build.gradle new file mode 100644 index 00000000..cf7019c7 --- /dev/null +++ b/matcher-core/build.gradle @@ -0,0 +1,20 @@ +archivesBaseName = 'matcher-core' + +java { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + + if (!JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_11)) { + toolchain { + languageVersion = JavaLanguageVersion.of(11) + } + } +} + +tasks.withType(JavaCompile).configureEach { + it.options.release = 11 +} + +dependencies { + api project(':matcher-model') +} diff --git a/src/main/java/matcher/Matcher.java b/matcher-core/src/main/java/matcher/Matcher.java similarity index 97% rename from src/main/java/matcher/Matcher.java rename to matcher-core/src/main/java/matcher/Matcher.java index 121b604b..f1afe280 100644 --- a/src/main/java/matcher/Matcher.java +++ b/matcher-core/src/main/java/matcher/Matcher.java @@ -29,23 +29,24 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import matcher.classifier.ClassClassifier; -import matcher.classifier.ClassifierLevel; -import matcher.classifier.FieldClassifier; -import matcher.classifier.IRanker; -import matcher.classifier.MethodClassifier; -import matcher.classifier.MethodVarClassifier; -import matcher.classifier.RankResult; -import matcher.config.Config; -import matcher.config.ProjectConfig; -import matcher.type.ClassEnv; -import matcher.type.ClassEnvironment; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.InputFile; -import matcher.type.MemberInstance; -import matcher.type.MethodInstance; -import matcher.type.MethodVarInstance; +import matcher.model.NameType; +import matcher.model.classifier.ClassClassifier; +import matcher.model.classifier.ClassifierLevel; +import matcher.model.classifier.FieldClassifier; +import matcher.model.classifier.IRanker; +import matcher.model.classifier.MethodClassifier; +import matcher.model.classifier.MethodVarClassifier; +import matcher.model.classifier.RankResult; +import matcher.model.config.Config; +import matcher.model.config.ProjectConfig; +import matcher.model.type.ClassEnv; +import matcher.model.type.ClassEnvironment; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.InputFile; +import matcher.model.type.MemberInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodVarInstance; public class Matcher { public static void init() { diff --git a/src/main/java/matcher/Plugin.java b/matcher-core/src/main/java/matcher/Plugin.java similarity index 100% rename from src/main/java/matcher/Plugin.java rename to matcher-core/src/main/java/matcher/Plugin.java diff --git a/src/main/java/matcher/PluginLoader.java b/matcher-core/src/main/java/matcher/PluginLoader.java similarity index 78% rename from src/main/java/matcher/PluginLoader.java rename to matcher-core/src/main/java/matcher/PluginLoader.java index 8ca378a4..4dff28c4 100644 --- a/src/main/java/matcher/PluginLoader.java +++ b/matcher-core/src/main/java/matcher/PluginLoader.java @@ -7,7 +7,6 @@ import java.net.URLClassLoader; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -15,22 +14,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -class PluginLoader { - public static void run(String[] args) { - List pluginPaths = new ArrayList<>(); - pluginPaths.add(Paths.get("plugins")); - - for (int i = 0; i < args.length; i++) { - switch (args[i]) { - case "--additional-plugins": - while (i+1 < args.length && !args[i+1].startsWith("--")) { - pluginPaths.add(Path.of(args[++i])); - } - - break; - } - } - +public class PluginLoader { + public static void run(List pluginPaths) { List urls = new ArrayList<>(); for (Path path : pluginPaths) { diff --git a/src/main/java/matcher/serdes/MatchesIo.java b/matcher-core/src/main/java/matcher/serdes/MatchesIo.java similarity index 97% rename from src/main/java/matcher/serdes/MatchesIo.java rename to matcher-core/src/main/java/matcher/serdes/MatchesIo.java index 01b58a75..fdb18452 100644 --- a/src/main/java/matcher/serdes/MatchesIo.java +++ b/matcher-core/src/main/java/matcher/serdes/MatchesIo.java @@ -16,16 +16,16 @@ import java.util.function.DoubleConsumer; import matcher.Matcher; -import matcher.config.Config; -import matcher.type.ClassEnvironment; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.InputFile; -import matcher.type.InputFile.HashType; -import matcher.type.LocalClassEnv; -import matcher.type.MemberInstance; -import matcher.type.MethodInstance; -import matcher.type.MethodVarInstance; +import matcher.model.config.Config; +import matcher.model.type.ClassEnvironment; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.InputFile; +import matcher.model.type.InputFile.HashType; +import matcher.model.type.LocalClassEnv; +import matcher.model.type.MemberInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodVarInstance; public class MatchesIo { public static void read(Path path, List inputDirs, boolean verifyInputs, Matcher matcher, DoubleConsumer progressReceiver) { diff --git a/matcher-core/src/main/java/module-info.java b/matcher-core/src/main/java/module-info.java new file mode 100644 index 00000000..13d0f100 --- /dev/null +++ b/matcher-core/src/main/java/module-info.java @@ -0,0 +1,8 @@ +module matcher.core { + requires transitive matcher.model; + + uses matcher.Plugin; + + exports matcher; + exports matcher.serdes; +} diff --git a/matcher-gui/build.gradle b/matcher-gui/build.gradle new file mode 100644 index 00000000..a11fd2ec --- /dev/null +++ b/matcher-gui/build.gradle @@ -0,0 +1,68 @@ +plugins { + id 'application' + id 'org.openjfx.javafxplugin' +} + +archivesBaseName = 'matcher-gui' + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + + if (!JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_17)) { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } + } +} + +tasks.withType(JavaCompile).configureEach { + it.options.release = 17 +} + +javafx { + version = javafx_version + modules = [ 'javafx.controls', 'javafx.web' ] + + // Don't bundle native binaries via the plugin, + // since it will only include those for the current OS. + // The full set of native libraries gets shaded a few lines beneath. + configuration = 'compileOnly' +} + +dependencies { + api project(':matcher-cli') + api "com.github.javaparser:javaparser-core:${javaparser_version}" + api "net.fabricmc:cfr:${fabric_cfr_version}" + api "org.bitbucket.mstrobel:procyon-compilertools:${procyon_version}" + implementation "org.ow2.asm:asm-util:${asm_version}" + implementation "org.vineflower:vineflower:${vineflower_version}" + implementation ("io.github.skylot:jadx-core:${jadx_version}") { + exclude group: 'com.android.tools.build', module: 'aapt2-proto' + } + implementation ("io.github.skylot:jadx-java-input:${jadx_version}") { + exclude group: 'io.github.skylot', module: 'raung-disasm' + } + + // JavaFX for all platforms (required for cross-platform fat jar) + runtimeOnly "org.openjfx:javafx-base:${javafx_version}:win" + runtimeOnly "org.openjfx:javafx-base:${javafx_version}:mac" + runtimeOnly "org.openjfx:javafx-base:${javafx_version}:linux" + runtimeOnly "org.openjfx:javafx-graphics:${javafx_version}:win" + runtimeOnly "org.openjfx:javafx-graphics:${javafx_version}:mac" + runtimeOnly "org.openjfx:javafx-graphics:${javafx_version}:linux" + runtimeOnly "org.openjfx:javafx-controls:${javafx_version}:win" + runtimeOnly "org.openjfx:javafx-controls:${javafx_version}:mac" + runtimeOnly "org.openjfx:javafx-controls:${javafx_version}:linux" + runtimeOnly "org.openjfx:javafx-web:${javafx_version}:win" + runtimeOnly "org.openjfx:javafx-web:${javafx_version}:mac" + runtimeOnly "org.openjfx:javafx-web:${javafx_version}:linux" + runtimeOnly "org.openjfx:javafx-media:${javafx_version}:win" + runtimeOnly "org.openjfx:javafx-media:${javafx_version}:mac" + runtimeOnly "org.openjfx:javafx-media:${javafx_version}:linux" +} + +application { + mainModule = 'matcher.gui' + mainClass = 'matcher.gui.Main' +} diff --git a/matcher-gui/src/main/java/matcher/gui/Main.java b/matcher-gui/src/main/java/matcher/gui/Main.java new file mode 100644 index 00000000..1eae3ad5 --- /dev/null +++ b/matcher-gui/src/main/java/matcher/gui/Main.java @@ -0,0 +1,30 @@ +package matcher.gui; + +import java.util.Collections; +import java.nio.file.Paths; + +import javafx.application.Application; + +import matcher.PluginLoader; +import matcher.cli.MatcherCli; +import matcher.cli.provider.builtin.AdditionalPluginsCliParameterProvider; +import matcher.model.config.Config; +import matcher.gui.cli.PreLaunchGuiCliParameterProvider; + +public class Main { + public static void main(String[] args) { + Config.init(); + PluginLoader.run(Collections.singletonList(Paths.get("plugins"))); + + handlePreLaunchStartupArgs(args); + Application.launch(MatcherGui.class, args); + } + + private static void handlePreLaunchStartupArgs(String[] args) { + MatcherCli cli = new MatcherCli(true); + + cli.registerParameterProvider(new AdditionalPluginsCliParameterProvider()); + cli.registerParameterProvider(new PreLaunchGuiCliParameterProvider()); + cli.processArgs(args); + } +} diff --git a/src/main/java/matcher/gui/Gui.java b/matcher-gui/src/main/java/matcher/gui/MatcherGui.java similarity index 77% rename from src/main/java/matcher/gui/Gui.java rename to matcher-gui/src/main/java/matcher/gui/MatcherGui.java index f7b5564e..5159b5d1 100644 --- a/src/main/java/matcher/gui/Gui.java +++ b/matcher-gui/src/main/java/matcher/gui/MatcherGui.java @@ -44,20 +44,28 @@ import net.fabricmc.mappingio.MappingReader; import matcher.Matcher; -import matcher.NameType; -import matcher.config.Config; -import matcher.config.ProjectConfig; -import matcher.config.Theme; -import matcher.gui.IGuiComponent.ViewChangeCause; -import matcher.gui.menu.MainMenuBar; -import matcher.gui.menu.NewProjectPane; -import matcher.mapping.MappingField; -import matcher.mapping.Mappings; -import matcher.srcprocess.BuiltinDecompiler; -import matcher.type.ClassEnvironment; -import matcher.type.MatchType; - -public class Gui extends Application { +import matcher.cli.MatcherCli; +import matcher.gui.cli.PostLaunchGuiCliParameterProvider; +import matcher.gui.srcprocess.BuiltinDecompiler; +import matcher.gui.ui.BottomPane; +import matcher.gui.ui.GuiConstants; +import matcher.gui.ui.IGuiComponent; +import matcher.gui.ui.IGuiComponent.ViewChangeCause; +import matcher.gui.ui.MatchPaneDst; +import matcher.gui.ui.MatchPaneSrc; +import matcher.gui.ui.Shortcuts; +import matcher.gui.ui.menu.MainMenuBar; +import matcher.gui.ui.menu.NewProjectPane; +import matcher.model.NameType; +import matcher.model.config.Config; +import matcher.model.config.ProjectConfig; +import matcher.model.config.Theme; +import matcher.model.mapping.MappingField; +import matcher.model.mapping.Mappings; +import matcher.model.type.ClassEnvironment; +import matcher.model.type.MatchType; + +public class MatcherGui extends Application { @Override public void start(Stage stage) { Matcher.init(); @@ -95,18 +103,25 @@ public void start(Stage stage) { scene = new Scene(border, 1400, 800); Shortcuts.init(this); - for (Consumer l : loadListeners) { + for (Consumer l : loadListeners) { l.accept(this); } updateCss(); - stage.setScene(scene); stage.setTitle("Matcher"); stage.show(); border.requestFocus(); - handleStartupArgs(getParameters().getRaw()); + handlePostLaunchStartupArgs(); + } + + void handlePostLaunchStartupArgs() { + String[] args = getParameters().getRaw().toArray(String[]::new); + MatcherCli cli = new MatcherCli(true); + + cli.registerParameterProvider(new PostLaunchGuiCliParameterProvider(this)); + cli.processArgs(args); } @Override @@ -114,121 +129,6 @@ public void stop() throws Exception { threadPool.shutdown(); } - private void handleStartupArgs(List args) { - List inputsA = new ArrayList<>(); - List inputsB = new ArrayList<>(); - List classPathA = new ArrayList<>(); - List classPathB = new ArrayList<>(); - List sharedClassPath = new ArrayList<>(); - boolean inputsBeforeClassPath = false; - Path mappingsPathA = null; - Path mappingsPathB = null; - boolean saveUnmappedMatches = true; - String nonObfuscatedClassPatternA = ""; - String nonObfuscatedClassPatternB = ""; - String nonObfuscatedMemberPatternA = ""; - String nonObfuscatedMemberPatternB = ""; - boolean validProjectConfigArgPresent = false; - - for (int i = 0; i < args.size(); i++) { - switch (args.get(i)) { - // ProjectConfig args - - case "--inputs-a": - while (i+1 < args.size() && !args.get(i+1).startsWith("--")) { - inputsA.add(Path.of(args.get(++i))); - validProjectConfigArgPresent = true; - } - - break; - case "--inputs-b": - while (i+1 < args.size() && !args.get(i+1).startsWith("--")) { - inputsB.add(Path.of(args.get(++i))); - validProjectConfigArgPresent = true; - } - - break; - case "--classpath-a": - while (i+1 < args.size() && !args.get(i+1).startsWith("--")) { - classPathA.add(Path.of(args.get(++i))); - validProjectConfigArgPresent = true; - } - - break; - case "--classpath-b": - while (i+1 < args.size() && !args.get(i+1).startsWith("--")) { - classPathB.add(Path.of(args.get(++i))); - validProjectConfigArgPresent = true; - } - - break; - case "--shared-classpath": - while (i+1 < args.size() && !args.get(i+1).startsWith("--")) { - sharedClassPath.add(Path.of(args.get(++i))); - validProjectConfigArgPresent = true; - } - - break; - case "--mappings-a": - mappingsPathA = Path.of(args.get(++i)); - validProjectConfigArgPresent = true; - break; - case "--mappings-b": - mappingsPathB = Path.of(args.get(++i)); - validProjectConfigArgPresent = true; - break; - case "--dont-save-unmapped-matches": - saveUnmappedMatches = false; - validProjectConfigArgPresent = true; - break; - case "--inputs-before-classpath": - inputsBeforeClassPath = true; - validProjectConfigArgPresent = true; - break; - case "--non-obfuscated-class-pattern-a": - nonObfuscatedClassPatternA = args.get(++i); - validProjectConfigArgPresent = true; - break; - case "--non-obfuscated-class-pattern-b": - nonObfuscatedClassPatternB = args.get(++i); - validProjectConfigArgPresent = true; - break; - case "--non-obfuscated-member-pattern-a": - nonObfuscatedMemberPatternA = args.get(++i); - validProjectConfigArgPresent = true; - break; - case "--non-obfuscated-member-pattern-b": - nonObfuscatedMemberPatternB = args.get(++i); - validProjectConfigArgPresent = true; - break; - - // GUI args - - case "--hide-unmapped-a": - hideUnmappedA = true; - break; - } - } - - if (!validProjectConfigArgPresent) return; - - ProjectConfig config = new ProjectConfig.Builder(inputsA, inputsB) - .classPathA(new ArrayList<>(classPathA)) - .classPathB(new ArrayList<>(classPathB)) - .sharedClassPath(new ArrayList<>(sharedClassPath)) - .inputsBeforeClassPath(inputsBeforeClassPath) - .mappingsPathA(mappingsPathA) - .mappingsPathB(mappingsPathB) - .saveUnmappedMatches(saveUnmappedMatches) - .nonObfuscatedClassPatternA(nonObfuscatedClassPatternA) - .nonObfuscatedClassPatternB(nonObfuscatedClassPatternB) - .nonObfuscatedMemberPatternA(nonObfuscatedMemberPatternA) - .nonObfuscatedMemberPatternB(nonObfuscatedMemberPatternB) - .build(); - - newProject(config, inputsA.isEmpty() || inputsB.isEmpty()); - } - public CompletableFuture newProject(ProjectConfig config, boolean showConfigDialog) { ProjectConfig newConfig; @@ -639,7 +539,7 @@ public enum SortKey { Name, MappedName, MatchStatus, Similarity; } - public static final List> loadListeners = new ArrayList<>(); + public static final List> loadListeners = new ArrayList<>(); private static final ExecutorService threadPool = Executors.newCachedThreadPool(); diff --git a/matcher-gui/src/main/java/matcher/gui/cli/BuiltinGuiCliParameters.java b/matcher-gui/src/main/java/matcher/gui/cli/BuiltinGuiCliParameters.java new file mode 100644 index 00000000..ab165ac4 --- /dev/null +++ b/matcher-gui/src/main/java/matcher/gui/cli/BuiltinGuiCliParameters.java @@ -0,0 +1,6 @@ +package matcher.gui.cli; + +public class BuiltinGuiCliParameters { + public static final String HIDE_UNMAPPED_A = "--hide-unmapped-a"; + public static final String THEME = "--theme"; +} diff --git a/matcher-gui/src/main/java/matcher/gui/cli/PostLaunchGuiCliParameterProvider.java b/matcher-gui/src/main/java/matcher/gui/cli/PostLaunchGuiCliParameterProvider.java new file mode 100644 index 00000000..08a3c039 --- /dev/null +++ b/matcher-gui/src/main/java/matcher/gui/cli/PostLaunchGuiCliParameterProvider.java @@ -0,0 +1,113 @@ +package matcher.gui.cli; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.beust.jcommander.Parameter; + +import matcher.cli.provider.CliParameterProvider; +import matcher.cli.provider.builtin.BuiltinCliParameters; +import matcher.gui.MatcherGui; +import matcher.model.config.ProjectConfig; + +public class PostLaunchGuiCliParameterProvider implements CliParameterProvider { + public PostLaunchGuiCliParameterProvider(MatcherGui gui) { + this.gui = gui; + } + + @Parameter(names = {BuiltinCliParameters.INPUTS_A}) + List inputsA = defaultInputsA; + + @Parameter(names = {BuiltinCliParameters.INPUTS_B}) + List inputsB = defaultInputsB; + + @Parameter(names = {BuiltinCliParameters.CLASSPATH_A}) + List classpathA = defaultClasspathA; + + @Parameter(names = {BuiltinCliParameters.CLASSPATH_B}) + List classpathB = defaultClasspathB; + + @Parameter(names = {BuiltinCliParameters.SHARED_CLASSPATH}) + List sharedClasspath = defaultSharedClasspath; + + @Parameter(names = {BuiltinCliParameters.INPUTS_BEFORE_CLASSPATH}) + boolean inputsBeforeClasspath = defaultInputsBeforeClasspath; + + @Parameter(names = {BuiltinCliParameters.NON_OBFUSCATED_CLASS_PATTERN_A}) + String nonObfuscatedClassPatternA = defaultNonObfuscatedClassPatternA; + + @Parameter(names = {BuiltinCliParameters.NON_OBFUSCATED_CLASS_PATTERN_B}) + String nonObfuscatedClassPatternB = defaultNonObfuscatedClassPatternB; + + @Parameter(names = {BuiltinCliParameters.NON_OBFUSCATED_MEMBER_PATTERN_A}) + String nonObfuscatedMemberPatternA = defaultNonObfuscatedMemberPatternA; + + @Parameter(names = {BuiltinCliParameters.NON_OBFUSCATED_MEMBER_PATTERN_B}) + String nonObfuscatedMemberPatternB = defaultNonObfuscatedMemberPatternB; + + @Parameter(names = {BuiltinCliParameters.MAPPINGS_A}) + Path mappingsPathA; + + @Parameter(names = {BuiltinCliParameters.MAPPINGS_B}) + Path mappingsPathB; + + @Parameter(names = {BuiltinCliParameters.DONT_SAVE_UNMAPPED_MATCHES}) + boolean dontSaveUnmappedMatches; + + @Parameter(names = {BuiltinCliParameters.OUTPUT_FILE}) + Path outputFile; + + @Parameter(names = {BuiltinGuiCliParameters.HIDE_UNMAPPED_A}) + boolean hideUnmappedA; + + @Override + public Object getDataHolder() { + return this; + } + + @Override + public void processArgs() { + gui.setHideUnmappedA(hideUnmappedA); + + if (!inputsA.equals(defaultInputsA) + || !inputsB.equals(defaultInputsB) + || !classpathA.equals(defaultClasspathA) + || !classpathB.equals(defaultClasspathB) + || !sharedClasspath.equals(defaultSharedClasspath) + || inputsBeforeClasspath != defaultInputsBeforeClasspath + || !nonObfuscatedClassPatternA.equals(defaultNonObfuscatedClassPatternA) + || !nonObfuscatedClassPatternB.equals(defaultNonObfuscatedClassPatternB) + || !nonObfuscatedMemberPatternA.equals(defaultNonObfuscatedMemberPatternA) + || !nonObfuscatedMemberPatternB.equals(defaultNonObfuscatedMemberPatternB)) { + ProjectConfig config = new ProjectConfig.Builder(inputsA, inputsB) + .classPathA(new ArrayList<>(classpathA)) + .classPathB(new ArrayList<>(classpathB)) + .sharedClassPath(new ArrayList<>(sharedClasspath)) + .inputsBeforeClassPath(inputsBeforeClasspath) + .mappingsPathA(mappingsPathA) + .mappingsPathB(mappingsPathB) + .saveUnmappedMatches(!dontSaveUnmappedMatches) + .nonObfuscatedClassPatternA(nonObfuscatedClassPatternA) + .nonObfuscatedClassPatternB(nonObfuscatedClassPatternB) + .nonObfuscatedMemberPatternA(nonObfuscatedMemberPatternA) + .nonObfuscatedMemberPatternB(nonObfuscatedMemberPatternB) + .build(); + + gui.newProject(config, inputsA.isEmpty() || inputsB.isEmpty()); + } + } + + private static final List defaultInputsA = Collections.emptyList(); + private static final List defaultInputsB = Collections.emptyList(); + private static final List defaultClasspathA = Collections.emptyList(); + private static final List defaultClasspathB = Collections.emptyList(); + private static final List defaultSharedClasspath = Collections.emptyList(); + private static final boolean defaultInputsBeforeClasspath = false; + private static final String defaultNonObfuscatedClassPatternA = ""; + private static final String defaultNonObfuscatedClassPatternB = ""; + private static final String defaultNonObfuscatedMemberPatternA = ""; + private static final String defaultNonObfuscatedMemberPatternB = ""; + private final MatcherGui gui; +} diff --git a/matcher-gui/src/main/java/matcher/gui/cli/PreLaunchGuiCliParameterProvider.java b/matcher-gui/src/main/java/matcher/gui/cli/PreLaunchGuiCliParameterProvider.java new file mode 100644 index 00000000..ace360ac --- /dev/null +++ b/matcher-gui/src/main/java/matcher/gui/cli/PreLaunchGuiCliParameterProvider.java @@ -0,0 +1,31 @@ +package matcher.gui.cli; + +import com.beust.jcommander.Parameter; + +import matcher.Matcher; +import matcher.cli.provider.CliParameterProvider; +import matcher.model.config.Config; +import matcher.model.config.Theme; + +public class PreLaunchGuiCliParameterProvider implements CliParameterProvider { + @Parameter(names = {BuiltinGuiCliParameters.THEME}) + String themeId; + + @Override + public Object getDataHolder() { + return this; + } + + @Override + public void processArgs() { + if (themeId != null) { + Theme theme = Theme.getById(themeId); + + if (theme == null) { + Matcher.LOGGER.error("Startup arg '--theme' couldn't be applied, as there exists no theme with ID " + themeId + "!"); + } else { + Config.setTheme(theme); + } + } + } +} diff --git a/src/main/java/matcher/srcprocess/BuiltinDecompiler.java b/matcher-gui/src/main/java/matcher/gui/srcprocess/BuiltinDecompiler.java similarity index 95% rename from src/main/java/matcher/srcprocess/BuiltinDecompiler.java rename to matcher-gui/src/main/java/matcher/gui/srcprocess/BuiltinDecompiler.java index ff5c58d9..289bbd3f 100644 --- a/src/main/java/matcher/srcprocess/BuiltinDecompiler.java +++ b/matcher-gui/src/main/java/matcher/gui/srcprocess/BuiltinDecompiler.java @@ -1,4 +1,4 @@ -package matcher.srcprocess; +package matcher.gui.srcprocess; import java.util.function.Supplier; diff --git a/src/main/java/matcher/srcprocess/Cfr.java b/matcher-gui/src/main/java/matcher/gui/srcprocess/Cfr.java similarity index 95% rename from src/main/java/matcher/srcprocess/Cfr.java rename to matcher-gui/src/main/java/matcher/gui/srcprocess/Cfr.java index 2f00d994..95f6031c 100644 --- a/src/main/java/matcher/srcprocess/Cfr.java +++ b/matcher-gui/src/main/java/matcher/gui/srcprocess/Cfr.java @@ -1,4 +1,4 @@ -package matcher.srcprocess; +package matcher.gui.srcprocess; import java.io.IOException; import java.nio.file.NoSuchFileException; @@ -14,9 +14,9 @@ import org.benf.cfr.reader.bytecode.analysis.parse.utils.Pair; import matcher.Matcher; -import matcher.NameType; -import matcher.type.ClassFeatureExtractor; -import matcher.type.ClassInstance; +import matcher.model.NameType; +import matcher.model.type.ClassFeatureExtractor; +import matcher.model.type.ClassInstance; public class Cfr implements Decompiler { @Override diff --git a/matcher-gui/src/main/java/matcher/gui/srcprocess/Decompiler.java b/matcher-gui/src/main/java/matcher/gui/srcprocess/Decompiler.java new file mode 100644 index 00000000..37d1af57 --- /dev/null +++ b/matcher-gui/src/main/java/matcher/gui/srcprocess/Decompiler.java @@ -0,0 +1,26 @@ +package matcher.gui.srcprocess; + +import matcher.model.NameType; +import matcher.model.type.ClassEnvironment; +import matcher.model.type.ClassFeatureExtractor; +import matcher.model.type.ClassInstance; + +public interface Decompiler { + static String decompile(ClassEnvironment env, Decompiler decompiler, ClassInstance cls, NameType nameType) { + ClassFeatureExtractor extractorA = (ClassFeatureExtractor) env.getEnvA(); + ClassFeatureExtractor extractorB = (ClassFeatureExtractor) env.getEnvB(); + ClassFeatureExtractor extractor; + + if (extractorA.getLocalClsById(cls.getId()) == cls) { + extractor = extractorA; + } else if (extractorB.getLocalClsById(cls.getId()) == cls) { + extractor = extractorB; + } else { + throw new IllegalArgumentException("unknown class: "+cls); + } + + return decompiler.decompile(cls, extractor, nameType); + } + + String decompile(ClassInstance cls, ClassFeatureExtractor extractor, NameType nameType); +} diff --git a/src/main/java/matcher/srcprocess/HtmlPrinter.java b/matcher-gui/src/main/java/matcher/gui/srcprocess/HtmlPrinter.java similarity index 99% rename from src/main/java/matcher/srcprocess/HtmlPrinter.java rename to matcher-gui/src/main/java/matcher/gui/srcprocess/HtmlPrinter.java index 1bca18ca..ae74aca8 100644 --- a/src/main/java/matcher/srcprocess/HtmlPrinter.java +++ b/matcher-gui/src/main/java/matcher/gui/srcprocess/HtmlPrinter.java @@ -21,7 +21,7 @@ * GNU Lesser General Public License for more details. */ -package matcher.srcprocess; +package matcher.gui.srcprocess; import static com.github.javaparser.utils.PositionUtils.sortByBeginPosition; import static com.github.javaparser.utils.Utils.isNullOrEmpty; @@ -133,8 +133,8 @@ import com.github.javaparser.printer.configuration.Indentation.IndentType; import com.github.javaparser.utils.Utils; -import matcher.type.FieldInstance; -import matcher.type.MethodInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MethodInstance; public class HtmlPrinter extends DefaultPrettyPrinterVisitor { public HtmlPrinter(TypeResolver typeResolver) { diff --git a/src/main/java/matcher/srcprocess/HtmlUtil.java b/matcher-gui/src/main/java/matcher/gui/srcprocess/HtmlUtil.java similarity index 95% rename from src/main/java/matcher/srcprocess/HtmlUtil.java rename to matcher-gui/src/main/java/matcher/gui/srcprocess/HtmlUtil.java index eb5b21fd..1832d340 100644 --- a/src/main/java/matcher/srcprocess/HtmlUtil.java +++ b/matcher-gui/src/main/java/matcher/gui/srcprocess/HtmlUtil.java @@ -1,9 +1,9 @@ -package matcher.srcprocess; +package matcher.gui.srcprocess; import java.util.regex.Pattern; -import matcher.type.FieldInstance; -import matcher.type.MethodInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MethodInstance; public class HtmlUtil { public static String getId(MethodInstance method) { diff --git a/src/main/java/matcher/srcprocess/Jadx.java b/matcher-gui/src/main/java/matcher/gui/srcprocess/Jadx.java similarity index 91% rename from src/main/java/matcher/srcprocess/Jadx.java rename to matcher-gui/src/main/java/matcher/gui/srcprocess/Jadx.java index 7ccc9aa9..cc99436c 100644 --- a/src/main/java/matcher/srcprocess/Jadx.java +++ b/matcher-gui/src/main/java/matcher/gui/srcprocess/Jadx.java @@ -1,4 +1,4 @@ -package matcher.srcprocess; +package matcher.gui.srcprocess; import java.io.IOException; import java.util.function.Consumer; @@ -13,10 +13,10 @@ import jadx.plugins.input.java.JavaClassReader; import jadx.plugins.input.java.data.JavaClassData; -import matcher.NameType; -import matcher.Util; -import matcher.type.ClassFeatureExtractor; -import matcher.type.ClassInstance; +import matcher.model.Util; +import matcher.model.NameType; +import matcher.model.type.ClassFeatureExtractor; +import matcher.model.type.ClassInstance; public class Jadx implements Decompiler { @Override diff --git a/src/main/java/matcher/srcprocess/Procyon.java b/matcher-gui/src/main/java/matcher/gui/srcprocess/Procyon.java similarity index 92% rename from src/main/java/matcher/srcprocess/Procyon.java rename to matcher-gui/src/main/java/matcher/gui/srcprocess/Procyon.java index a2914d5f..80a41706 100644 --- a/src/main/java/matcher/srcprocess/Procyon.java +++ b/matcher-gui/src/main/java/matcher/gui/srcprocess/Procyon.java @@ -1,4 +1,4 @@ -package matcher.srcprocess; +package matcher.gui.srcprocess; import java.util.HashSet; import java.util.Set; @@ -11,9 +11,9 @@ import com.strobel.decompiler.PlainTextOutput; import matcher.Matcher; -import matcher.NameType; -import matcher.type.ClassFeatureExtractor; -import matcher.type.ClassInstance; +import matcher.model.NameType; +import matcher.model.type.ClassFeatureExtractor; +import matcher.model.type.ClassInstance; public class Procyon implements Decompiler { @Override diff --git a/src/main/java/matcher/srcprocess/SrcDecorator.java b/matcher-gui/src/main/java/matcher/gui/srcprocess/SrcDecorator.java similarity index 97% rename from src/main/java/matcher/srcprocess/SrcDecorator.java rename to matcher-gui/src/main/java/matcher/gui/srcprocess/SrcDecorator.java index f694af43..9089c393 100644 --- a/src/main/java/matcher/srcprocess/SrcDecorator.java +++ b/matcher-gui/src/main/java/matcher/gui/srcprocess/SrcDecorator.java @@ -1,4 +1,4 @@ -package matcher.srcprocess; +package matcher.gui.srcprocess; import java.io.BufferedReader; import java.io.StringReader; @@ -8,6 +8,7 @@ import com.github.javaparser.JavaParser; import com.github.javaparser.JavaToken; +import com.github.javaparser.JavaToken.Kind; import com.github.javaparser.ParseResult; import com.github.javaparser.ParserConfiguration; import com.github.javaparser.ParserConfiguration.LanguageLevel; @@ -15,7 +16,6 @@ import com.github.javaparser.Problem; import com.github.javaparser.Range; import com.github.javaparser.TokenRange; -import com.github.javaparser.JavaToken.Kind; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.Node; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; @@ -30,11 +30,11 @@ import com.github.javaparser.ast.visitor.VoidVisitorAdapter; import matcher.Matcher; -import matcher.NameType; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.MethodInstance; -import matcher.type.MethodVarInstance; +import matcher.model.NameType; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodVarInstance; public class SrcDecorator { public static String decorate(String src, ClassInstance cls, NameType nameType) { diff --git a/src/main/java/matcher/srcprocess/TypeResolver.java b/matcher-gui/src/main/java/matcher/gui/srcprocess/TypeResolver.java similarity index 96% rename from src/main/java/matcher/srcprocess/TypeResolver.java rename to matcher-gui/src/main/java/matcher/gui/srcprocess/TypeResolver.java index 1faeb31a..095c0d74 100644 --- a/src/main/java/matcher/srcprocess/TypeResolver.java +++ b/matcher-gui/src/main/java/matcher/gui/srcprocess/TypeResolver.java @@ -1,4 +1,4 @@ -package matcher.srcprocess; +package matcher.gui.srcprocess; import java.util.ArrayList; import java.util.HashMap; @@ -24,12 +24,12 @@ import com.github.javaparser.ast.type.Type; import com.github.javaparser.ast.type.VoidType; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.NameType; -import matcher.type.ClassEnv; -import matcher.type.Matchable; -import matcher.type.MethodInstance; +import matcher.model.NameType; +import matcher.model.type.ClassEnv; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.Matchable; +import matcher.model.type.MethodInstance; class TypeResolver { public void setup(ClassInstance rootCls, NameType nameType, CompilationUnit cu) { diff --git a/src/main/java/matcher/srcprocess/Vineflower.java b/matcher-gui/src/main/java/matcher/gui/srcprocess/Vineflower.java similarity index 97% rename from src/main/java/matcher/srcprocess/Vineflower.java rename to matcher-gui/src/main/java/matcher/gui/srcprocess/Vineflower.java index 78efffcb..3213d5aa 100644 --- a/src/main/java/matcher/srcprocess/Vineflower.java +++ b/matcher-gui/src/main/java/matcher/gui/srcprocess/Vineflower.java @@ -1,4 +1,4 @@ -package matcher.srcprocess; +package matcher.gui.srcprocess; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -19,9 +19,9 @@ import org.jetbrains.java.decompiler.main.extern.IResultSaver; import matcher.Matcher; -import matcher.NameType; -import matcher.type.ClassFeatureExtractor; -import matcher.type.ClassInstance; +import matcher.model.NameType; +import matcher.model.type.ClassFeatureExtractor; +import matcher.model.type.ClassInstance; public class Vineflower implements Decompiler { @Override diff --git a/src/main/java/matcher/gui/BottomPane.java b/matcher-gui/src/main/java/matcher/gui/ui/BottomPane.java similarity index 95% rename from src/main/java/matcher/gui/BottomPane.java rename to matcher-gui/src/main/java/matcher/gui/ui/BottomPane.java index e6320d81..5d54472c 100644 --- a/src/main/java/matcher/gui/BottomPane.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/BottomPane.java @@ -1,4 +1,4 @@ -package matcher.gui; +package matcher.gui.ui; import java.util.EnumSet; import java.util.IdentityHashMap; @@ -12,19 +12,20 @@ import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; -import matcher.classifier.ClassifierLevel; -import matcher.classifier.FieldClassifier; -import matcher.classifier.MethodClassifier; -import matcher.classifier.RankResult; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.MatchType; -import matcher.type.MemberInstance; -import matcher.type.MethodInstance; -import matcher.type.MethodVarInstance; +import matcher.gui.MatcherGui; +import matcher.model.classifier.ClassifierLevel; +import matcher.model.classifier.FieldClassifier; +import matcher.model.classifier.MethodClassifier; +import matcher.model.classifier.RankResult; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MatchType; +import matcher.model.type.MemberInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodVarInstance; public class BottomPane extends StackPane implements IGuiComponent { - public BottomPane(Gui gui, MatchPaneSrc srcPane, MatchPaneDst dstPane) { + public BottomPane(MatcherGui gui, MatchPaneSrc srcPane, MatchPaneDst dstPane) { super(); this.gui = gui; @@ -399,7 +400,7 @@ public Button getUnmatchVarButton() { return unmatchVarButton; } - private final Gui gui; + private final MatcherGui gui; private final MatchPaneSrc srcPane; private final MatchPaneDst dstPane; private final Button matchButton = new Button(); diff --git a/src/main/java/matcher/gui/ContentPane.java b/matcher-gui/src/main/java/matcher/gui/ui/ContentPane.java similarity index 80% rename from src/main/java/matcher/gui/ContentPane.java rename to matcher-gui/src/main/java/matcher/gui/ui/ContentPane.java index 5f21e826..9d291e9c 100644 --- a/src/main/java/matcher/gui/ContentPane.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/ContentPane.java @@ -1,23 +1,24 @@ -package matcher.gui; +package matcher.gui.ui; import java.util.ArrayList; import java.util.Collection; import javafx.scene.control.TabPane; -import matcher.gui.tab.BytecodeTab; -import matcher.gui.tab.ClassInfoTab; -import matcher.gui.tab.ClassScoresTab; -import matcher.gui.tab.FieldInfoTab; -import matcher.gui.tab.HierarchyTab; -import matcher.gui.tab.MemberScoresTab; -import matcher.gui.tab.MethodInfoTab; -import matcher.gui.tab.MethodVarScoresTab; -import matcher.gui.tab.SourcecodeTab; -import matcher.gui.tab.VarInfoTab; +import matcher.gui.MatcherGui; +import matcher.gui.ui.tab.BytecodeTab; +import matcher.gui.ui.tab.ClassInfoTab; +import matcher.gui.ui.tab.ClassScoresTab; +import matcher.gui.ui.tab.FieldInfoTab; +import matcher.gui.ui.tab.HierarchyTab; +import matcher.gui.ui.tab.MemberScoresTab; +import matcher.gui.ui.tab.MethodInfoTab; +import matcher.gui.ui.tab.MethodVarScoresTab; +import matcher.gui.ui.tab.SourcecodeTab; +import matcher.gui.ui.tab.VarInfoTab; public class ContentPane extends TabPane implements IFwdGuiComponent { - public ContentPane(Gui gui, ISelectionProvider selectionProvider, boolean isSource) { + public ContentPane(MatcherGui gui, ISelectionProvider selectionProvider, boolean isSource) { this.gui = gui; this.isSource = isSource; @@ -107,7 +108,7 @@ public Collection getComponents() { private static final boolean showHierarchy = false; - private final Gui gui; + private final MatcherGui gui; private final boolean isSource; private final Collection components = new ArrayList<>(); } diff --git a/src/main/java/matcher/gui/GuiConstants.java b/matcher-gui/src/main/java/matcher/gui/ui/GuiConstants.java similarity index 75% rename from src/main/java/matcher/gui/GuiConstants.java rename to matcher-gui/src/main/java/matcher/gui/ui/GuiConstants.java index 5d226d61..bc4e9c07 100644 --- a/src/main/java/matcher/gui/GuiConstants.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/GuiConstants.java @@ -1,4 +1,4 @@ -package matcher.gui; +package matcher.gui.ui; public class GuiConstants { public static final double padding = 5; diff --git a/src/main/java/matcher/gui/GuiUtil.java b/matcher-gui/src/main/java/matcher/gui/ui/GuiUtil.java similarity index 98% rename from src/main/java/matcher/gui/GuiUtil.java rename to matcher-gui/src/main/java/matcher/gui/ui/GuiUtil.java index e3421cfb..ee0f49af 100644 --- a/src/main/java/matcher/gui/GuiUtil.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/GuiUtil.java @@ -1,4 +1,4 @@ -package matcher.gui; +package matcher.gui.ui; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/matcher/gui/IFwdGuiComponent.java b/matcher-gui/src/main/java/matcher/gui/ui/IFwdGuiComponent.java similarity index 86% rename from src/main/java/matcher/gui/IFwdGuiComponent.java rename to matcher-gui/src/main/java/matcher/gui/ui/IFwdGuiComponent.java index 58a50972..fc7ff907 100644 --- a/src/main/java/matcher/gui/IFwdGuiComponent.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/IFwdGuiComponent.java @@ -1,13 +1,13 @@ -package matcher.gui; +package matcher.gui.ui; import java.util.Collection; import java.util.Set; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.MatchType; -import matcher.type.MethodInstance; -import matcher.type.MethodVarInstance; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MatchType; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodVarInstance; public interface IFwdGuiComponent extends IGuiComponent { Collection getComponents(); diff --git a/src/main/java/matcher/gui/IGuiComponent.java b/matcher-gui/src/main/java/matcher/gui/ui/IGuiComponent.java similarity index 77% rename from src/main/java/matcher/gui/IGuiComponent.java rename to matcher-gui/src/main/java/matcher/gui/ui/IGuiComponent.java index 807e0dc6..0be2599e 100644 --- a/src/main/java/matcher/gui/IGuiComponent.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/IGuiComponent.java @@ -1,12 +1,12 @@ -package matcher.gui; +package matcher.gui.ui; import java.util.Set; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.MatchType; -import matcher.type.MethodInstance; -import matcher.type.MethodVarInstance; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MatchType; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodVarInstance; public interface IGuiComponent { default void onProjectChange() { } diff --git a/matcher-gui/src/main/java/matcher/gui/ui/ISelectionProvider.java b/matcher-gui/src/main/java/matcher/gui/ui/ISelectionProvider.java new file mode 100644 index 00000000..67f2eac3 --- /dev/null +++ b/matcher-gui/src/main/java/matcher/gui/ui/ISelectionProvider.java @@ -0,0 +1,21 @@ +package matcher.gui.ui; + +import matcher.model.classifier.RankResult; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MatchType; +import matcher.model.type.MemberInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodVarInstance; + +public interface ISelectionProvider { + ClassInstance getSelectedClass(); + MemberInstance getSelectedMember(); + MethodInstance getSelectedMethod(); + FieldInstance getSelectedField(); + MethodVarInstance getSelectedMethodVar(); + + default RankResult getSelectedRankResult(MatchType type) { + return null; + } +} diff --git a/src/main/java/matcher/gui/MatchPaneDst.java b/matcher-gui/src/main/java/matcher/gui/ui/MatchPaneDst.java similarity index 96% rename from src/main/java/matcher/gui/MatchPaneDst.java rename to matcher-gui/src/main/java/matcher/gui/ui/MatchPaneDst.java index c6fc3a8d..2e230053 100644 --- a/src/main/java/matcher/gui/MatchPaneDst.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/MatchPaneDst.java @@ -1,4 +1,4 @@ -package matcher.gui; +package matcher.gui.ui; import java.util.ArrayList; import java.util.Collection; @@ -19,25 +19,26 @@ import javafx.scene.layout.VBox; import matcher.Matcher; -import matcher.NameType; -import matcher.classifier.ClassClassifier; -import matcher.classifier.ClassifierLevel; -import matcher.classifier.FieldClassifier; -import matcher.classifier.MethodClassifier; -import matcher.classifier.MethodVarClassifier; -import matcher.classifier.RankResult; -import matcher.type.ClassEnv; -import matcher.type.ClassEnvironment; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.MatchType; -import matcher.type.Matchable; -import matcher.type.MemberInstance; -import matcher.type.MethodInstance; -import matcher.type.MethodVarInstance; +import matcher.gui.MatcherGui; +import matcher.model.NameType; +import matcher.model.classifier.ClassClassifier; +import matcher.model.classifier.ClassifierLevel; +import matcher.model.classifier.FieldClassifier; +import matcher.model.classifier.MethodClassifier; +import matcher.model.classifier.MethodVarClassifier; +import matcher.model.classifier.RankResult; +import matcher.model.type.ClassEnv; +import matcher.model.type.ClassEnvironment; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MatchType; +import matcher.model.type.Matchable; +import matcher.model.type.MemberInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodVarInstance; public class MatchPaneDst extends SplitPane implements IFwdGuiComponent, ISelectionProvider { - public MatchPaneDst(Gui gui, MatchPaneSrc srcPane) { + public MatchPaneDst(MatcherGui gui, MatchPaneSrc srcPane) { this.gui = gui; this.srcPane = srcPane; @@ -730,7 +731,7 @@ void onSelect(Set matchChangeTypes) { final int cTaskId = ++taskId; // update matches list - Gui.runAsyncTask(ranker).whenComplete((res, exc) -> { + MatcherGui.runAsyncTask(ranker).whenComplete((res, exc) -> { if (exc != null) { exc.printStackTrace(); } else if (taskId == cTaskId) { @@ -772,7 +773,7 @@ private Matchable getMatchableSrcSelection() { private Matchable oldDstSelection; } - private final Gui gui; + private final MatcherGui gui; private final MatchPaneSrc srcPane; private final Collection components = new ArrayList<>(); private final ListView>> matchList = new ListView<>(); diff --git a/src/main/java/matcher/gui/MatchPaneSrc.java b/matcher-gui/src/main/java/matcher/gui/ui/MatchPaneSrc.java similarity index 97% rename from src/main/java/matcher/gui/MatchPaneSrc.java rename to matcher-gui/src/main/java/matcher/gui/ui/MatchPaneSrc.java index 47ee5203..d1ff1b08 100644 --- a/src/main/java/matcher/gui/MatchPaneSrc.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/MatchPaneSrc.java @@ -1,4 +1,4 @@ -package matcher.gui; +package matcher.gui.ui; import java.io.IOException; import java.net.URISyntaxException; @@ -30,20 +30,21 @@ import javafx.scene.paint.Color; import matcher.Matcher; -import matcher.NameType; -import matcher.Util; -import matcher.config.Config; -import matcher.gui.Gui.SortKey; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.MatchType; -import matcher.type.Matchable; -import matcher.type.MemberInstance; -import matcher.type.MethodInstance; -import matcher.type.MethodVarInstance; +import matcher.gui.MatcherGui; +import matcher.gui.MatcherGui.SortKey; +import matcher.model.NameType; +import matcher.model.Util; +import matcher.model.config.Config; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MatchType; +import matcher.model.type.Matchable; +import matcher.model.type.MemberInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodVarInstance; public class MatchPaneSrc extends SplitPane implements IFwdGuiComponent, ISelectionProvider { - public MatchPaneSrc(Gui gui) { + public MatchPaneSrc(MatcherGui gui) { this.gui = gui; init(); @@ -791,7 +792,7 @@ public Collection getComponents() { private static final Map similarityToColorRgb = new HashMap<>(diffColorSteps / 2 + 1); private static final Map similarityToColorHsb = new HashMap<>(diffColorSteps / 2 + 1); - private final Gui gui; + private final MatcherGui gui; private final Collection components = new ArrayList<>(); private boolean useClassTree; private ListView classList; diff --git a/src/main/java/matcher/gui/Shortcuts.java b/matcher-gui/src/main/java/matcher/gui/ui/Shortcuts.java similarity index 89% rename from src/main/java/matcher/gui/Shortcuts.java rename to matcher-gui/src/main/java/matcher/gui/ui/Shortcuts.java index da0c768b..3606ebe0 100644 --- a/src/main/java/matcher/gui/Shortcuts.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/Shortcuts.java @@ -1,4 +1,4 @@ -package matcher.gui; +package matcher.gui.ui; import java.util.Map; @@ -7,8 +7,10 @@ import javafx.scene.input.KeyCodeCombination; import javafx.scene.input.KeyCombination; -class Shortcuts { - public static void init(Gui gui) { +import matcher.gui.MatcherGui; + +public class Shortcuts { + public static void init(MatcherGui gui) { Map accelerators = gui.getScene().getAccelerators(); // M - match diff --git a/src/main/java/matcher/gui/StyledListCell.java b/matcher-gui/src/main/java/matcher/gui/ui/StyledListCell.java similarity index 94% rename from src/main/java/matcher/gui/StyledListCell.java rename to matcher-gui/src/main/java/matcher/gui/ui/StyledListCell.java index 870e34d0..7fff536c 100644 --- a/src/main/java/matcher/gui/StyledListCell.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/StyledListCell.java @@ -1,4 +1,4 @@ -package matcher.gui; +package matcher.gui.ui; import javafx.scene.control.ListCell; diff --git a/src/main/java/matcher/gui/StyledTreeCell.java b/matcher-gui/src/main/java/matcher/gui/ui/StyledTreeCell.java similarity index 94% rename from src/main/java/matcher/gui/StyledTreeCell.java rename to matcher-gui/src/main/java/matcher/gui/ui/StyledTreeCell.java index 9520677a..cc244789 100644 --- a/src/main/java/matcher/gui/StyledTreeCell.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/StyledTreeCell.java @@ -1,4 +1,4 @@ -package matcher.gui; +package matcher.gui.ui; import javafx.scene.control.TreeCell; diff --git a/src/main/java/matcher/gui/menu/FileMenu.java b/matcher-gui/src/main/java/matcher/gui/ui/menu/FileMenu.java similarity index 90% rename from src/main/java/matcher/gui/menu/FileMenu.java rename to matcher-gui/src/main/java/matcher/gui/ui/menu/FileMenu.java index c64541c3..4afa70ee 100644 --- a/src/main/java/matcher/gui/menu/FileMenu.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/menu/FileMenu.java @@ -1,4 +1,4 @@ -package matcher.gui.menu; +package matcher.gui.ui.menu; import java.io.File; import java.io.IOException; @@ -27,20 +27,20 @@ import net.fabricmc.mappingio.MappingReader; import net.fabricmc.mappingio.format.MappingFormat; -import matcher.Util; -import matcher.config.Config; -import matcher.gui.Gui; -import matcher.gui.Gui.SelectedFile; -import matcher.gui.menu.LoadMappingsPane.MappingsLoadSettings; -import matcher.gui.menu.LoadProjectPane.ProjectLoadSettings; -import matcher.gui.menu.SaveMappingsPane.MappingsSaveSettings; -import matcher.mapping.Mappings; +import matcher.gui.MatcherGui; +import matcher.gui.MatcherGui.SelectedFile; +import matcher.gui.ui.menu.LoadMappingsPane.MappingsLoadSettings; +import matcher.gui.ui.menu.LoadProjectPane.ProjectLoadSettings; +import matcher.gui.ui.menu.SaveMappingsPane.MappingsSaveSettings; +import matcher.model.Util; +import matcher.model.config.Config; +import matcher.model.mapping.Mappings; +import matcher.model.type.ClassEnvironment; +import matcher.model.type.MatchType; import matcher.serdes.MatchesIo; -import matcher.type.ClassEnvironment; -import matcher.type.MatchType; public class FileMenu extends Menu { - FileMenu(Gui gui) { + FileMenu(MatcherGui gui) { super("File"); this.gui = gui; @@ -104,7 +104,7 @@ private void newProject() { } private void loadProject() { - SelectedFile res = Gui.requestFile("Select matches file", gui.getScene().getWindow(), getMatchesLoadExtensionFilters(), true); + SelectedFile res = MatcherGui.requestFile("Select matches file", gui.getScene().getWindow(), getMatchesLoadExtensionFilters(), true); if (res == null) return; ProjectLoadSettings newConfig = requestProjectLoadSettings(); @@ -148,13 +148,13 @@ private void loadMappings(MappingFormat format) { Path file; if (format == null || format.hasSingleFile()) { - SelectedFile res = Gui.requestFile("Select mapping file", window, getMappingLoadExtensionFilters(), true); // TODO: pre-select format if non-null + SelectedFile res = MatcherGui.requestFile("Select mapping file", window, getMappingLoadExtensionFilters(), true); // TODO: pre-select format if non-null if (res == null) return; // aborted file = res.path; format = getFormat(res.filter.getDescription()); } else { - file = Gui.requestDir("Select mapping dir", window); + file = MatcherGui.requestDir("Select mapping dir", window); } if (file == null) return; @@ -235,7 +235,7 @@ private void saveMappings(MappingFormat format) { path = file.toPath(); format = getFormat(fileChooser.getSelectedExtensionFilter().getDescription()); } else { - path = Gui.requestDir("Save mapping dir", window); + path = MatcherGui.requestDir("Save mapping dir", window); if (path == null) return; if (Files.exists(path) && !isDirEmpty(path)) { // reusing existing dir, clear out after confirmation @@ -336,7 +336,7 @@ private static MappingFormat getFormat(String selectedName) { } private void loadMatches() { - SelectedFile res = Gui.requestFile("Select matches file", gui.getScene().getWindow(), getMatchesLoadExtensionFilters(), true); + SelectedFile res = MatcherGui.requestFile("Select matches file", gui.getScene().getWindow(), getMatchesLoadExtensionFilters(), true); if (res == null) return; MatchesIo.read(res.path, null, false, gui.getMatcher(), progress -> { }); @@ -348,7 +348,7 @@ private static List getMatchesLoadExtensionFilters() { } private void saveMatches() { - SelectedFile res = Gui.requestFile("Save matches file", gui.getScene().getWindow(), Arrays.asList(new FileChooser.ExtensionFilter("Matches", "*.match")), false); + SelectedFile res = MatcherGui.requestFile("Save matches file", gui.getScene().getWindow(), Arrays.asList(new FileChooser.ExtensionFilter("Matches", "*.match")), false); if (res == null) return; Path path = res.path; @@ -374,5 +374,5 @@ private void saveMatches() { } } - private final Gui gui; + private final MatcherGui gui; } diff --git a/src/main/java/matcher/gui/menu/FixRecordNamesPane.java b/matcher-gui/src/main/java/matcher/gui/ui/menu/FixRecordNamesPane.java similarity index 93% rename from src/main/java/matcher/gui/menu/FixRecordNamesPane.java rename to matcher-gui/src/main/java/matcher/gui/ui/menu/FixRecordNamesPane.java index 830db996..509a25e7 100644 --- a/src/main/java/matcher/gui/menu/FixRecordNamesPane.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/menu/FixRecordNamesPane.java @@ -1,4 +1,4 @@ -package matcher.gui.menu; +package matcher.gui.ui.menu; import java.util.ArrayList; import java.util.Arrays; @@ -9,8 +9,8 @@ import javafx.scene.control.Label; import javafx.scene.layout.GridPane; -import matcher.NameType; -import matcher.gui.GuiConstants; +import matcher.gui.ui.GuiConstants; +import matcher.model.NameType; class FixRecordNamesPane extends GridPane { FixRecordNamesPane() { diff --git a/src/main/java/matcher/gui/menu/LoadMappingsPane.java b/matcher-gui/src/main/java/matcher/gui/ui/menu/LoadMappingsPane.java similarity index 97% rename from src/main/java/matcher/gui/menu/LoadMappingsPane.java rename to matcher-gui/src/main/java/matcher/gui/ui/menu/LoadMappingsPane.java index 53c4d279..9c52195d 100644 --- a/src/main/java/matcher/gui/menu/LoadMappingsPane.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/menu/LoadMappingsPane.java @@ -1,4 +1,4 @@ -package matcher.gui.menu; +package matcher.gui.ui.menu; import java.util.List; @@ -14,8 +14,8 @@ import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; -import matcher.gui.GuiConstants; -import matcher.mapping.MappingField; +import matcher.gui.ui.GuiConstants; +import matcher.model.mapping.MappingField; class LoadMappingsPane extends GridPane { LoadMappingsPane(List namespaces) { diff --git a/src/main/java/matcher/gui/menu/LoadProjectPane.java b/matcher-gui/src/main/java/matcher/gui/ui/menu/LoadProjectPane.java similarity index 94% rename from src/main/java/matcher/gui/menu/LoadProjectPane.java rename to matcher-gui/src/main/java/matcher/gui/ui/menu/LoadProjectPane.java index a45d65d5..5e4c8dcd 100644 --- a/src/main/java/matcher/gui/menu/LoadProjectPane.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/menu/LoadProjectPane.java @@ -1,4 +1,4 @@ -package matcher.gui.menu; +package matcher.gui.ui.menu; import java.nio.file.Path; import java.util.ArrayList; @@ -21,9 +21,9 @@ import javafx.scene.layout.VBox; import javafx.stage.Window; -import matcher.gui.Gui; -import matcher.gui.GuiConstants; -import matcher.gui.GuiUtil; +import matcher.gui.MatcherGui; +import matcher.gui.ui.GuiConstants; +import matcher.gui.ui.GuiUtil; public class LoadProjectPane extends VBox { LoadProjectPane(List paths, boolean verifyFiles, Window window, Node okButton) { @@ -56,7 +56,7 @@ private void init() { Button button = new Button("add"); footer.getChildren().add(button); button.setOnAction(event -> { - Path path = Gui.requestDir("Select directory to add", window); + Path path = MatcherGui.requestDir("Select directory to add", window); if (path != null && !list.getItems().contains(path)) list.getItems().add(path); }); diff --git a/src/main/java/matcher/gui/menu/MainMenuBar.java b/matcher-gui/src/main/java/matcher/gui/ui/menu/MainMenuBar.java similarity index 86% rename from src/main/java/matcher/gui/menu/MainMenuBar.java rename to matcher-gui/src/main/java/matcher/gui/ui/menu/MainMenuBar.java index ac1939bf..451c73b1 100644 --- a/src/main/java/matcher/gui/menu/MainMenuBar.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/menu/MainMenuBar.java @@ -1,13 +1,13 @@ -package matcher.gui.menu; +package matcher.gui.ui.menu; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; -import matcher.gui.Gui; -import matcher.gui.IGuiComponent; +import matcher.gui.MatcherGui; +import matcher.gui.ui.IGuiComponent; public class MainMenuBar extends MenuBar implements IGuiComponent { - public MainMenuBar(Gui gui) { + public MainMenuBar(MatcherGui gui) { this.gui = gui; init(); @@ -51,7 +51,7 @@ public ViewMenu getViewMenu() { return viewMenu; } - private final Gui gui; + private final MatcherGui gui; private FileMenu fileMenu; private MatchingMenu matchingMenu; diff --git a/src/main/java/matcher/gui/menu/MappingMenu.java b/matcher-gui/src/main/java/matcher/gui/ui/menu/MappingMenu.java similarity index 86% rename from src/main/java/matcher/gui/menu/MappingMenu.java rename to matcher-gui/src/main/java/matcher/gui/ui/menu/MappingMenu.java index 2988386d..74aaaeb9 100644 --- a/src/main/java/matcher/gui/menu/MappingMenu.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/menu/MappingMenu.java @@ -1,4 +1,4 @@ -package matcher.gui.menu; +package matcher.gui.ui.menu; import java.util.Optional; @@ -7,12 +7,12 @@ import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; -import matcher.gui.Gui; -import matcher.gui.menu.FixRecordNamesPane.NamespaceSettings; -import matcher.mapping.MappingPropagator; +import matcher.gui.MatcherGui; +import matcher.gui.ui.menu.FixRecordNamesPane.NamespaceSettings; +import matcher.model.mapping.MappingPropagator; public class MappingMenu extends Menu { - MappingMenu(Gui gui) { + MappingMenu(MatcherGui gui) { super("Mapping"); this.gui = gui; @@ -55,5 +55,5 @@ private void fixRecordMemberNames() { } } - private final Gui gui; + private final MatcherGui gui; } diff --git a/src/main/java/matcher/gui/menu/MatchingMenu.java b/matcher-gui/src/main/java/matcher/gui/ui/menu/MatchingMenu.java similarity index 96% rename from src/main/java/matcher/gui/menu/MatchingMenu.java rename to matcher-gui/src/main/java/matcher/gui/ui/menu/MatchingMenu.java index 48274533..d063ba7d 100644 --- a/src/main/java/matcher/gui/menu/MatchingMenu.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/menu/MatchingMenu.java @@ -1,4 +1,4 @@ -package matcher.gui.menu; +package matcher.gui.ui.menu; import java.util.EnumSet; @@ -8,11 +8,11 @@ import javafx.scene.control.SeparatorMenuItem; import matcher.Matcher.MatchingStatus; -import matcher.gui.Gui; -import matcher.type.MatchType; +import matcher.gui.MatcherGui; +import matcher.model.type.MatchType; public class MatchingMenu extends Menu { - MatchingMenu(Gui gui) { + MatchingMenu(MatcherGui gui) { super("Matching"); this.gui = gui; @@ -115,5 +115,5 @@ public void showMatchingStatus() { )); } - private final Gui gui; + private final MatcherGui gui; } diff --git a/src/main/java/matcher/gui/menu/NewProjectPane.java b/matcher-gui/src/main/java/matcher/gui/ui/menu/NewProjectPane.java similarity index 96% rename from src/main/java/matcher/gui/menu/NewProjectPane.java rename to matcher-gui/src/main/java/matcher/gui/ui/menu/NewProjectPane.java index 518761d4..28a2b782 100644 --- a/src/main/java/matcher/gui/menu/NewProjectPane.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/menu/NewProjectPane.java @@ -1,4 +1,4 @@ -package matcher.gui.menu; +package matcher.gui.ui.menu; import java.io.IOException; import java.nio.file.FileSystems; @@ -34,11 +34,11 @@ import javafx.stage.FileChooser.ExtensionFilter; import javafx.stage.Window; -import matcher.config.ProjectConfig; -import matcher.gui.Gui; -import matcher.gui.Gui.SelectedFile; -import matcher.gui.GuiConstants; -import matcher.gui.GuiUtil; +import matcher.gui.MatcherGui; +import matcher.gui.MatcherGui.SelectedFile; +import matcher.gui.ui.GuiConstants; +import matcher.gui.ui.GuiUtil; +import matcher.model.config.ProjectConfig; public class NewProjectPane extends GridPane { public NewProjectPane(ProjectConfig config, Window window, Node okButton) { @@ -209,7 +209,7 @@ private Node createFilesSelectionPane(String name, ObservableList entries, Button button = new Button("add"); footer.getChildren().add(button); button.setOnAction(event -> { - List res = Gui.requestFiles("Select file to add", window, getInputLoadExtensionFilters()); + List res = MatcherGui.requestFiles("Select file to add", window, getInputLoadExtensionFilters()); for (SelectedFile each : res) { if (!list.getItems().contains(each.path)) list.getItems().add(each.path); @@ -219,7 +219,7 @@ private Node createFilesSelectionPane(String name, ObservableList entries, Button addDirecotyButton = new Button("add dir"); footer.getChildren().add(addDirecotyButton); addDirecotyButton.setOnAction(event -> { - Path res = Gui.requestDir("Select directory to add", window); + Path res = MatcherGui.requestDir("Select directory to add", window); try (Stream stream = Files.walk(res, 128)) { stream.filter(Files::isRegularFile) diff --git a/src/main/java/matcher/gui/menu/SaveMappingsPane.java b/matcher-gui/src/main/java/matcher/gui/ui/menu/SaveMappingsPane.java similarity index 95% rename from src/main/java/matcher/gui/menu/SaveMappingsPane.java rename to matcher-gui/src/main/java/matcher/gui/ui/menu/SaveMappingsPane.java index 82367041..d03a139f 100644 --- a/src/main/java/matcher/gui/menu/SaveMappingsPane.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/menu/SaveMappingsPane.java @@ -1,4 +1,4 @@ -package matcher.gui.menu; +package matcher.gui.ui.menu; import java.util.List; @@ -12,9 +12,9 @@ import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; -import matcher.NameType; -import matcher.gui.GuiConstants; -import matcher.mapping.MappingsExportVerbosity; +import matcher.gui.ui.GuiConstants; +import matcher.model.NameType; +import matcher.model.mapping.MappingsExportVerbosity; class SaveMappingsPane extends GridPane { SaveMappingsPane(boolean offerNamespaces) { diff --git a/src/main/java/matcher/gui/menu/UidMenu.java b/matcher-gui/src/main/java/matcher/gui/ui/menu/UidMenu.java similarity index 94% rename from src/main/java/matcher/gui/menu/UidMenu.java rename to matcher-gui/src/main/java/matcher/gui/ui/menu/UidMenu.java index 84df5d9d..eab50f29 100644 --- a/src/main/java/matcher/gui/menu/UidMenu.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/menu/UidMenu.java @@ -1,4 +1,4 @@ -package matcher.gui.menu; +package matcher.gui.ui.menu; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -19,21 +19,21 @@ import javafx.scene.control.SeparatorMenuItem; import matcher.Matcher; -import matcher.config.Config; -import matcher.config.UidConfig; -import matcher.gui.Gui; -import matcher.type.ClassEnv; -import matcher.type.ClassEnvironment; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.Matchable; -import matcher.type.MatchType; -import matcher.type.MemberInstance; -import matcher.type.MethodInstance; -import matcher.type.MethodVarInstance; +import matcher.gui.MatcherGui; +import matcher.model.config.Config; +import matcher.model.config.UidConfig; +import matcher.model.type.ClassEnv; +import matcher.model.type.ClassEnvironment; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MatchType; +import matcher.model.type.Matchable; +import matcher.model.type.MemberInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodVarInstance; public class UidMenu extends Menu { - UidMenu(Gui gui) { + UidMenu(MatcherGui gui) { super("UID"); this.gui = gui; @@ -334,5 +334,5 @@ private void assignMissing() { private static final byte TYPE_ARG = 3; private static final byte TYPE_VAR = 4; - private final Gui gui; + private final MatcherGui gui; } diff --git a/src/main/java/matcher/gui/menu/UidSetupPane.java b/matcher-gui/src/main/java/matcher/gui/ui/menu/UidSetupPane.java similarity index 96% rename from src/main/java/matcher/gui/menu/UidSetupPane.java rename to matcher-gui/src/main/java/matcher/gui/ui/menu/UidSetupPane.java index ccfcfa07..c952261a 100644 --- a/src/main/java/matcher/gui/menu/UidSetupPane.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/menu/UidSetupPane.java @@ -1,4 +1,4 @@ -package matcher.gui.menu; +package matcher.gui.ui.menu; import java.net.InetSocketAddress; @@ -9,8 +9,8 @@ import javafx.scene.layout.GridPane; import javafx.stage.Window; -import matcher.config.UidConfig; -import matcher.gui.GuiConstants; +import matcher.gui.ui.GuiConstants; +import matcher.model.config.UidConfig; public class UidSetupPane extends GridPane { UidSetupPane(UidConfig config, Window window, Node okButton) { diff --git a/src/main/java/matcher/gui/menu/ViewMenu.java b/matcher-gui/src/main/java/matcher/gui/ui/menu/ViewMenu.java similarity index 93% rename from src/main/java/matcher/gui/menu/ViewMenu.java rename to matcher-gui/src/main/java/matcher/gui/ui/menu/ViewMenu.java index c8c33676..4ca80196 100644 --- a/src/main/java/matcher/gui/menu/ViewMenu.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/menu/ViewMenu.java @@ -1,4 +1,4 @@ -package matcher.gui.menu; +package matcher.gui.ui.menu; import javafx.scene.control.CheckMenuItem; import javafx.scene.control.Menu; @@ -7,17 +7,17 @@ import javafx.scene.control.Toggle; import javafx.scene.control.ToggleGroup; -import matcher.NameType; -import matcher.config.Config; -import matcher.config.Theme; -import matcher.gui.Gui; -import matcher.gui.Gui.SortKey; -import matcher.gui.GuiUtil; -import matcher.gui.IGuiComponent; -import matcher.srcprocess.BuiltinDecompiler; +import matcher.gui.MatcherGui; +import matcher.gui.MatcherGui.SortKey; +import matcher.gui.srcprocess.BuiltinDecompiler; +import matcher.gui.ui.GuiUtil; +import matcher.gui.ui.IGuiComponent; +import matcher.model.NameType; +import matcher.model.config.Config; +import matcher.model.config.Theme; public class ViewMenu extends Menu implements IGuiComponent { - ViewMenu(Gui gui) { + ViewMenu(MatcherGui gui) { super("View"); this.gui = gui; @@ -177,7 +177,7 @@ private void updateSelections() { } } - private final Gui gui; + private final MatcherGui gui; private ToggleGroup sortSourceToggleGroup; private ToggleGroup themeToggleGroup; private CheckMenuItem sortAlphabeticallyItem; diff --git a/src/main/java/matcher/gui/tab/BytecodeTab.java b/matcher-gui/src/main/java/matcher/gui/ui/tab/BytecodeTab.java similarity index 84% rename from src/main/java/matcher/gui/tab/BytecodeTab.java rename to matcher-gui/src/main/java/matcher/gui/ui/tab/BytecodeTab.java index 6468cf0d..5a595740 100644 --- a/src/main/java/matcher/gui/tab/BytecodeTab.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/tab/BytecodeTab.java @@ -1,21 +1,21 @@ -package matcher.gui.tab; +package matcher.gui.ui.tab; import java.io.PrintWriter; import java.io.StringWriter; import org.objectweb.asm.util.TraceClassVisitor; -import matcher.NameType; -import matcher.gui.Gui; -import matcher.gui.ISelectionProvider; -import matcher.srcprocess.HtmlUtil; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.MemberInstance; -import matcher.type.MethodInstance; +import matcher.gui.MatcherGui; +import matcher.gui.srcprocess.HtmlUtil; +import matcher.gui.ui.ISelectionProvider; +import matcher.model.NameType; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MemberInstance; +import matcher.model.type.MethodInstance; public class BytecodeTab extends WebViewTab { - public BytecodeTab(Gui gui, ISelectionProvider selectionProvider, boolean unmatchedTmp) { + public BytecodeTab(MatcherGui gui, ISelectionProvider selectionProvider, boolean unmatchedTmp) { super("bytecode", "ui/templates/CodeViewTemplate.htm"); this.gui = gui; @@ -102,7 +102,7 @@ public void onFieldSelect(FieldInstance field) { } } - private final Gui gui; + private final MatcherGui gui; private final ISelectionProvider selectionProvider; private final boolean unmatchedTmp; diff --git a/src/main/java/matcher/gui/tab/ClassInfoTab.java b/matcher-gui/src/main/java/matcher/gui/ui/tab/ClassInfoTab.java similarity index 93% rename from src/main/java/matcher/gui/tab/ClassInfoTab.java rename to matcher-gui/src/main/java/matcher/gui/ui/tab/ClassInfoTab.java index 714bed40..90026223 100644 --- a/src/main/java/matcher/gui/tab/ClassInfoTab.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/tab/ClassInfoTab.java @@ -1,4 +1,4 @@ -package matcher.gui.tab; +package matcher.gui.ui.tab; import java.util.Collection; import java.util.Objects; @@ -15,18 +15,18 @@ import javafx.scene.layout.GridPane; import org.objectweb.asm.tree.ClassNode; -import matcher.NameType; -import matcher.Util; -import matcher.Util.AFElementType; -import matcher.gui.Gui; -import matcher.gui.GuiConstants; -import matcher.gui.IGuiComponent; -import matcher.gui.ISelectionProvider; -import matcher.type.ClassInstance; -import matcher.type.Matchable; +import matcher.gui.MatcherGui; +import matcher.gui.ui.GuiConstants; +import matcher.gui.ui.IGuiComponent; +import matcher.gui.ui.ISelectionProvider; +import matcher.model.NameType; +import matcher.model.Util; +import matcher.model.Util.AFElementType; +import matcher.model.type.ClassInstance; +import matcher.model.type.Matchable; public class ClassInfoTab extends Tab implements IGuiComponent { - public ClassInfoTab(Gui gui, ISelectionProvider selectionProvider, boolean unmatchedTmp) { + public ClassInfoTab(MatcherGui gui, ISelectionProvider selectionProvider, boolean unmatchedTmp) { super("info"); this.gui = gui; @@ -196,7 +196,7 @@ static String nullToMissing(String s) { return s != null ? s : "-"; } - private final Gui gui; + private final MatcherGui gui; private final ISelectionProvider selectionProvider; private final boolean unmatchedTmp; diff --git a/src/main/java/matcher/gui/tab/ClassScoresTab.java b/matcher-gui/src/main/java/matcher/gui/ui/tab/ClassScoresTab.java similarity index 88% rename from src/main/java/matcher/gui/tab/ClassScoresTab.java rename to matcher-gui/src/main/java/matcher/gui/ui/tab/ClassScoresTab.java index 4e1626a6..9114e764 100644 --- a/src/main/java/matcher/gui/tab/ClassScoresTab.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/tab/ClassScoresTab.java @@ -1,4 +1,4 @@ -package matcher.gui.tab; +package matcher.gui.ui.tab; import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.collections.FXCollections; @@ -6,12 +6,12 @@ import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; -import matcher.classifier.ClassifierResult; -import matcher.classifier.RankResult; -import matcher.gui.IGuiComponent; -import matcher.gui.ISelectionProvider; -import matcher.type.ClassInstance; -import matcher.type.MatchType; +import matcher.gui.ui.IGuiComponent; +import matcher.gui.ui.ISelectionProvider; +import matcher.model.classifier.ClassifierResult; +import matcher.model.classifier.RankResult; +import matcher.model.type.ClassInstance; +import matcher.model.type.MatchType; public class ClassScoresTab extends Tab implements IGuiComponent { public ClassScoresTab(ISelectionProvider selectionProvider) { diff --git a/src/main/java/matcher/gui/tab/FieldInfoTab.java b/matcher-gui/src/main/java/matcher/gui/ui/tab/FieldInfoTab.java similarity index 89% rename from src/main/java/matcher/gui/tab/FieldInfoTab.java rename to matcher-gui/src/main/java/matcher/gui/ui/tab/FieldInfoTab.java index 9d4e051f..dbd7892d 100644 --- a/src/main/java/matcher/gui/tab/FieldInfoTab.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/tab/FieldInfoTab.java @@ -1,8 +1,8 @@ -package matcher.gui.tab; +package matcher.gui.ui.tab; -import static matcher.gui.tab.ClassInfoTab.format; -import static matcher.gui.tab.ClassInfoTab.getName; -import static matcher.gui.tab.MethodInfoTab.formatClass; +import static matcher.gui.ui.tab.ClassInfoTab.format; +import static matcher.gui.ui.tab.ClassInfoTab.getName; +import static matcher.gui.ui.tab.MethodInfoTab.formatClass; import javafx.geometry.Insets; import javafx.geometry.VPos; @@ -13,17 +13,17 @@ import javafx.scene.layout.GridPane; import org.objectweb.asm.tree.FieldNode; -import matcher.NameType; -import matcher.Util; -import matcher.Util.AFElementType; -import matcher.gui.Gui; -import matcher.gui.GuiConstants; -import matcher.gui.IGuiComponent; -import matcher.gui.ISelectionProvider; -import matcher.type.FieldInstance; +import matcher.gui.MatcherGui; +import matcher.gui.ui.GuiConstants; +import matcher.gui.ui.IGuiComponent; +import matcher.gui.ui.ISelectionProvider; +import matcher.model.NameType; +import matcher.model.Util; +import matcher.model.Util.AFElementType; +import matcher.model.type.FieldInstance; public class FieldInfoTab extends Tab implements IGuiComponent { - public FieldInfoTab(Gui gui, ISelectionProvider selectionProvider, boolean unmatchedTmp) { + public FieldInfoTab(MatcherGui gui, ISelectionProvider selectionProvider, boolean unmatchedTmp) { super("field info"); this.gui = gui; @@ -149,7 +149,7 @@ private void update(FieldInstance field) { } } - private final Gui gui; + private final MatcherGui gui; private final ISelectionProvider selectionProvider; private final boolean unmatchedTmp; diff --git a/src/main/java/matcher/gui/tab/HierarchyTab.java b/matcher-gui/src/main/java/matcher/gui/ui/tab/HierarchyTab.java similarity index 97% rename from src/main/java/matcher/gui/tab/HierarchyTab.java rename to matcher-gui/src/main/java/matcher/gui/ui/tab/HierarchyTab.java index 46e12b4c..0efafee7 100644 --- a/src/main/java/matcher/gui/tab/HierarchyTab.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/tab/HierarchyTab.java @@ -1,4 +1,4 @@ -package matcher.gui.tab; +package matcher.gui.ui.tab; import java.util.ArrayDeque; import java.util.ArrayList; @@ -16,8 +16,8 @@ import javafx.scene.layout.VBox; import javafx.util.Callback; -import matcher.gui.IGuiComponent; -import matcher.type.ClassInstance; +import matcher.gui.ui.IGuiComponent; +import matcher.model.type.ClassInstance; public class HierarchyTab extends Tab implements IGuiComponent { public HierarchyTab() { diff --git a/src/main/java/matcher/gui/tab/HtmlTextifier.java b/matcher-gui/src/main/java/matcher/gui/ui/tab/HtmlTextifier.java similarity index 99% rename from src/main/java/matcher/gui/tab/HtmlTextifier.java rename to matcher-gui/src/main/java/matcher/gui/ui/tab/HtmlTextifier.java index 746b8cdf..62d255dd 100644 --- a/src/main/java/matcher/gui/tab/HtmlTextifier.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/tab/HtmlTextifier.java @@ -31,7 +31,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -package matcher.gui.tab; +package matcher.gui.ui.tab; import java.util.Arrays; import java.util.Collections; @@ -53,11 +53,11 @@ import org.objectweb.asm.util.TextifierSupport; import org.objectweb.asm.util.TraceSignatureVisitor; -import matcher.NameType; -import matcher.srcprocess.HtmlUtil; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.MethodInstance; +import matcher.gui.srcprocess.HtmlUtil; +import matcher.model.NameType; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MethodInstance; final class HtmlTextifier extends Textifier { HtmlTextifier(ClassInstance cls, NameType nameType) { diff --git a/src/main/java/matcher/gui/tab/MemberScoresTab.java b/matcher-gui/src/main/java/matcher/gui/ui/tab/MemberScoresTab.java similarity index 75% rename from src/main/java/matcher/gui/tab/MemberScoresTab.java rename to matcher-gui/src/main/java/matcher/gui/ui/tab/MemberScoresTab.java index 9c7f4570..0e8b466e 100644 --- a/src/main/java/matcher/gui/tab/MemberScoresTab.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/tab/MemberScoresTab.java @@ -1,16 +1,16 @@ -package matcher.gui.tab; +package matcher.gui.ui.tab; import javafx.scene.control.Tab; import javafx.scene.control.TableView; -import matcher.classifier.ClassifierResult; -import matcher.classifier.RankResult; -import matcher.gui.IGuiComponent; -import matcher.gui.ISelectionProvider; -import matcher.type.FieldInstance; -import matcher.type.MatchType; -import matcher.type.MemberInstance; -import matcher.type.MethodInstance; +import matcher.gui.ui.IGuiComponent; +import matcher.gui.ui.ISelectionProvider; +import matcher.model.classifier.ClassifierResult; +import matcher.model.classifier.RankResult; +import matcher.model.type.FieldInstance; +import matcher.model.type.MatchType; +import matcher.model.type.MemberInstance; +import matcher.model.type.MethodInstance; public class MemberScoresTab extends Tab implements IGuiComponent { public MemberScoresTab(ISelectionProvider selectionProvider) { diff --git a/src/main/java/matcher/gui/tab/MethodInfoTab.java b/matcher-gui/src/main/java/matcher/gui/ui/tab/MethodInfoTab.java similarity index 92% rename from src/main/java/matcher/gui/tab/MethodInfoTab.java rename to matcher-gui/src/main/java/matcher/gui/ui/tab/MethodInfoTab.java index 00dc558a..c26b56f8 100644 --- a/src/main/java/matcher/gui/tab/MethodInfoTab.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/tab/MethodInfoTab.java @@ -1,7 +1,7 @@ -package matcher.gui.tab; +package matcher.gui.ui.tab; -import static matcher.gui.tab.ClassInfoTab.format; -import static matcher.gui.tab.ClassInfoTab.getName; +import static matcher.gui.ui.tab.ClassInfoTab.format; +import static matcher.gui.ui.tab.ClassInfoTab.getName; import java.util.Arrays; import java.util.Collection; @@ -16,19 +16,19 @@ import javafx.scene.layout.GridPane; import org.objectweb.asm.tree.MethodNode; -import matcher.NameType; -import matcher.Util; -import matcher.Util.AFElementType; -import matcher.gui.Gui; -import matcher.gui.GuiConstants; -import matcher.gui.IGuiComponent; -import matcher.gui.ISelectionProvider; -import matcher.type.MemberInstance; -import matcher.type.MethodInstance; -import matcher.type.MethodVarInstance; +import matcher.gui.MatcherGui; +import matcher.gui.ui.GuiConstants; +import matcher.gui.ui.IGuiComponent; +import matcher.gui.ui.ISelectionProvider; +import matcher.model.NameType; +import matcher.model.Util; +import matcher.model.Util.AFElementType; +import matcher.model.type.MemberInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodVarInstance; public class MethodInfoTab extends Tab implements IGuiComponent { - public MethodInfoTab(Gui gui, ISelectionProvider selectionProvider, boolean unmatchedTmp) { + public MethodInfoTab(MatcherGui gui, ISelectionProvider selectionProvider, boolean unmatchedTmp) { super("method info"); this.gui = gui; @@ -187,7 +187,7 @@ static String formatClass(Collection> c, NameType na return c.stream().map(v -> getName(v.getCls(), nameType)).sorted().collect(Collectors.joining("\n")); } - private final Gui gui; + private final MatcherGui gui; private final ISelectionProvider selectionProvider; private final boolean unmatchedTmp; diff --git a/src/main/java/matcher/gui/tab/MethodVarScoresTab.java b/matcher-gui/src/main/java/matcher/gui/ui/tab/MethodVarScoresTab.java similarity index 76% rename from src/main/java/matcher/gui/tab/MethodVarScoresTab.java rename to matcher-gui/src/main/java/matcher/gui/ui/tab/MethodVarScoresTab.java index bc091b6f..bb66b1e5 100644 --- a/src/main/java/matcher/gui/tab/MethodVarScoresTab.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/tab/MethodVarScoresTab.java @@ -1,14 +1,14 @@ -package matcher.gui.tab; +package matcher.gui.ui.tab; import javafx.scene.control.Tab; import javafx.scene.control.TableView; -import matcher.classifier.ClassifierResult; -import matcher.classifier.RankResult; -import matcher.gui.IGuiComponent; -import matcher.gui.ISelectionProvider; -import matcher.type.MatchType; -import matcher.type.MethodVarInstance; +import matcher.gui.ui.IGuiComponent; +import matcher.gui.ui.ISelectionProvider; +import matcher.model.classifier.ClassifierResult; +import matcher.model.classifier.RankResult; +import matcher.model.type.MatchType; +import matcher.model.type.MethodVarInstance; public class MethodVarScoresTab extends Tab implements IGuiComponent { public MethodVarScoresTab(ISelectionProvider selectionProvider) { diff --git a/src/main/java/matcher/gui/tab/SourcecodeTab.java b/matcher-gui/src/main/java/matcher/gui/ui/tab/SourcecodeTab.java similarity index 79% rename from src/main/java/matcher/gui/tab/SourcecodeTab.java rename to matcher-gui/src/main/java/matcher/gui/ui/tab/SourcecodeTab.java index 1c782df3..913b4808 100644 --- a/src/main/java/matcher/gui/tab/SourcecodeTab.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/tab/SourcecodeTab.java @@ -1,23 +1,24 @@ -package matcher.gui.tab; +package matcher.gui.ui.tab; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Set; -import matcher.NameType; -import matcher.gui.Gui; -import matcher.gui.ISelectionProvider; -import matcher.srcprocess.HtmlUtil; -import matcher.srcprocess.SrcDecorator; -import matcher.srcprocess.SrcDecorator.SrcParseException; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.MatchType; -import matcher.type.MemberInstance; -import matcher.type.MethodInstance; +import matcher.gui.MatcherGui; +import matcher.gui.srcprocess.Decompiler; +import matcher.gui.srcprocess.HtmlUtil; +import matcher.gui.srcprocess.SrcDecorator; +import matcher.gui.srcprocess.SrcDecorator.SrcParseException; +import matcher.gui.ui.ISelectionProvider; +import matcher.model.NameType; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MatchType; +import matcher.model.type.MemberInstance; +import matcher.model.type.MethodInstance; public class SourcecodeTab extends WebViewTab { - public SourcecodeTab(Gui gui, ISelectionProvider selectionProvider, boolean unmatchedTmp) { + public SourcecodeTab(MatcherGui gui, ISelectionProvider selectionProvider, boolean unmatchedTmp) { super("source", "ui/templates/CodeViewTemplate.htm"); this.gui = gui; @@ -88,7 +89,7 @@ private void update() { NameType nameType = gui.getNameType().withUnmatchedTmp(unmatchedTmp); //Gui.runAsyncTask(() -> gui.getEnv().decompile(selectedClass, true)) - Gui.runAsyncTask(() -> SrcDecorator.decorate(gui.getEnv().decompile(gui.getDecompiler().get(), selectedClass, nameType), selectedClass, nameType)) + MatcherGui.runAsyncTask(() -> SrcDecorator.decorate(Decompiler.decompile(gui.getEnv(), gui.getDecompiler().get(), selectedClass, nameType), selectedClass, nameType)) .whenComplete((res, exc) -> { if (cDecompId == decompId) { if (exc != null) { @@ -138,7 +139,7 @@ public void onFieldSelect(FieldInstance field) { } } - private final Gui gui; + private final MatcherGui gui; private final ISelectionProvider selectionProvider; private final boolean unmatchedTmp; diff --git a/src/main/java/matcher/gui/tab/VarInfoTab.java b/matcher-gui/src/main/java/matcher/gui/ui/tab/VarInfoTab.java similarity index 91% rename from src/main/java/matcher/gui/tab/VarInfoTab.java rename to matcher-gui/src/main/java/matcher/gui/ui/tab/VarInfoTab.java index 6dcc9853..282e2bb7 100644 --- a/src/main/java/matcher/gui/tab/VarInfoTab.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/tab/VarInfoTab.java @@ -1,6 +1,6 @@ -package matcher.gui.tab; +package matcher.gui.ui.tab; -import static matcher.gui.tab.ClassInfoTab.getName; +import static matcher.gui.ui.tab.ClassInfoTab.getName; import javafx.geometry.Insets; import javafx.geometry.VPos; @@ -10,15 +10,15 @@ import javafx.scene.control.Tab; import javafx.scene.layout.GridPane; -import matcher.NameType; -import matcher.gui.Gui; -import matcher.gui.GuiConstants; -import matcher.gui.IGuiComponent; -import matcher.gui.ISelectionProvider; -import matcher.type.MethodVarInstance; +import matcher.gui.MatcherGui; +import matcher.gui.ui.GuiConstants; +import matcher.gui.ui.IGuiComponent; +import matcher.gui.ui.ISelectionProvider; +import matcher.model.NameType; +import matcher.model.type.MethodVarInstance; public class VarInfoTab extends Tab implements IGuiComponent { - public VarInfoTab(Gui gui, ISelectionProvider selectionProvider, boolean unmatchedTmp) { + public VarInfoTab(MatcherGui gui, ISelectionProvider selectionProvider, boolean unmatchedTmp) { super("var info"); this.gui = gui; @@ -134,7 +134,7 @@ private void update(MethodVarInstance var) { } } - private final Gui gui; + private final MatcherGui gui; private final ISelectionProvider selectionProvider; private final boolean unmatchedTmp; diff --git a/src/main/java/matcher/gui/tab/WebViewTab.java b/matcher-gui/src/main/java/matcher/gui/ui/tab/WebViewTab.java similarity index 95% rename from src/main/java/matcher/gui/tab/WebViewTab.java rename to matcher-gui/src/main/java/matcher/gui/ui/tab/WebViewTab.java index d5e75b3a..55ee0d3f 100644 --- a/src/main/java/matcher/gui/tab/WebViewTab.java +++ b/matcher-gui/src/main/java/matcher/gui/ui/tab/WebViewTab.java @@ -1,4 +1,4 @@ -package matcher.gui.tab; +package matcher.gui.ui.tab; import java.io.FileNotFoundException; import java.io.IOException; @@ -15,9 +15,9 @@ import javafx.scene.control.Tab; import javafx.scene.web.WebView; -import matcher.config.Config; -import matcher.gui.IGuiComponent; -import matcher.srcprocess.HtmlUtil; +import matcher.gui.srcprocess.HtmlUtil; +import matcher.gui.ui.IGuiComponent; +import matcher.model.config.Config; abstract class WebViewTab extends Tab implements IGuiComponent.Selectable { protected WebViewTab(String text, String templatePath) { diff --git a/matcher-gui/src/main/java/module-info.java b/matcher-gui/src/main/java/module-info.java new file mode 100644 index 00000000..f9eadace --- /dev/null +++ b/matcher-gui/src/main/java/module-info.java @@ -0,0 +1,25 @@ +module matcher.gui { + requires cfr; + requires com.github.javaparser.core; + requires org.objectweb.asm.util; + requires org.vineflower.vineflower; + requires procyon.compilertools; + requires jadx.core; + requires jadx.plugins.api; + requires jadx.plugins.java_input; + requires transitive javafx.base; + requires transitive javafx.controls; + requires transitive javafx.graphics; + requires transitive javafx.web; + requires transitive matcher.cli; + + uses matcher.Plugin; + + exports matcher.gui; + exports matcher.gui.srcprocess; + exports matcher.gui.ui; + exports matcher.gui.ui.menu; + exports matcher.gui.ui.tab; + + opens matcher.gui.cli to jcommander; +} diff --git a/src/main/resources/ui/styles/darcula.css b/matcher-gui/src/main/resources/ui/styles/darcula.css similarity index 100% rename from src/main/resources/ui/styles/darcula.css rename to matcher-gui/src/main/resources/ui/styles/darcula.css diff --git a/src/main/resources/ui/styles/eclipse-light.css b/matcher-gui/src/main/resources/ui/styles/eclipse-light.css similarity index 100% rename from src/main/resources/ui/styles/eclipse-light.css rename to matcher-gui/src/main/resources/ui/styles/eclipse-light.css diff --git a/src/main/resources/ui/styles/one-dark.css b/matcher-gui/src/main/resources/ui/styles/one-dark.css similarity index 100% rename from src/main/resources/ui/styles/one-dark.css rename to matcher-gui/src/main/resources/ui/styles/one-dark.css diff --git a/src/main/resources/ui/styles/presets/base.css b/matcher-gui/src/main/resources/ui/styles/presets/base.css similarity index 100% rename from src/main/resources/ui/styles/presets/base.css rename to matcher-gui/src/main/resources/ui/styles/presets/base.css diff --git a/src/main/resources/ui/styles/presets/borderless-controls.css b/matcher-gui/src/main/resources/ui/styles/presets/borderless-controls.css similarity index 100% rename from src/main/resources/ui/styles/presets/borderless-controls.css rename to matcher-gui/src/main/resources/ui/styles/presets/borderless-controls.css diff --git a/src/main/resources/ui/styles/presets/light-theme-match-cells.css b/matcher-gui/src/main/resources/ui/styles/presets/light-theme-match-cells.css similarity index 100% rename from src/main/resources/ui/styles/presets/light-theme-match-cells.css rename to matcher-gui/src/main/resources/ui/styles/presets/light-theme-match-cells.css diff --git a/src/main/resources/ui/styles/vs-code-light.css b/matcher-gui/src/main/resources/ui/styles/vs-code-light.css similarity index 100% rename from src/main/resources/ui/styles/vs-code-light.css rename to matcher-gui/src/main/resources/ui/styles/vs-code-light.css diff --git a/src/main/resources/ui/templates/CodeViewTemplate.htm b/matcher-gui/src/main/resources/ui/templates/CodeViewTemplate.htm similarity index 100% rename from src/main/resources/ui/templates/CodeViewTemplate.htm rename to matcher-gui/src/main/resources/ui/templates/CodeViewTemplate.htm diff --git a/matcher-model/build.gradle b/matcher-model/build.gradle new file mode 100644 index 00000000..3753dc12 --- /dev/null +++ b/matcher-model/build.gradle @@ -0,0 +1,25 @@ +archivesBaseName = 'matcher-model' + +java { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + + if (!JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_11)) { + toolchain { + languageVersion = JavaLanguageVersion.of(11) + } + } +} + +tasks.withType(JavaCompile).configureEach { + it.options.release = 11 +} + +dependencies { + api "net.fabricmc:mapping-io:${mappingio_version}" + api "org.ow2.asm:asm:${asm_version}" + api "org.ow2.asm:asm-tree:${asm_version}" + api "org.slf4j:slf4j-api:${slf4j_version}" + implementation "org.ow2.asm:asm-commons:${asm_version}" + implementation "org.ow2.asm:asm-util:${asm_version}" +} diff --git a/src/main/java/matcher/NameType.java b/matcher-model/src/main/java/matcher/model/NameType.java similarity index 99% rename from src/main/java/matcher/NameType.java rename to matcher-model/src/main/java/matcher/model/NameType.java index db9493ec..0b1d0691 100644 --- a/src/main/java/matcher/NameType.java +++ b/matcher-model/src/main/java/matcher/model/NameType.java @@ -1,4 +1,4 @@ -package matcher; +package matcher.model; import java.util.NoSuchElementException; import java.util.Objects; diff --git a/src/main/java/matcher/SignatureInference.java b/matcher-model/src/main/java/matcher/model/SignatureInference.java similarity index 82% rename from src/main/java/matcher/SignatureInference.java rename to matcher-model/src/main/java/matcher/model/SignatureInference.java index 6daf39f2..0ef4271d 100644 --- a/src/main/java/matcher/SignatureInference.java +++ b/matcher-model/src/main/java/matcher/model/SignatureInference.java @@ -1,21 +1,21 @@ -package matcher; +package matcher.model; import java.util.HashSet; import java.util.Set; -import matcher.type.ClassEnvironment; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.MethodInstance; -import matcher.type.Signature.ClassTypeSignature; -import matcher.type.Signature.FieldSignature; -import matcher.type.Signature.JavaTypeSignature; -import matcher.type.Signature.MethodSignature; -import matcher.type.Signature.ReferenceTypeSignature; -import matcher.type.Signature.SimpleClassTypeSignature; -import matcher.type.Signature.ThrowsSignature; -import matcher.type.Signature.TypeArgument; -import matcher.type.Signature.TypeParameter; +import matcher.model.type.ClassEnvironment; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.Signature.ClassTypeSignature; +import matcher.model.type.Signature.FieldSignature; +import matcher.model.type.Signature.JavaTypeSignature; +import matcher.model.type.Signature.MethodSignature; +import matcher.model.type.Signature.ReferenceTypeSignature; +import matcher.model.type.Signature.SimpleClassTypeSignature; +import matcher.model.type.Signature.ThrowsSignature; +import matcher.model.type.Signature.TypeArgument; +import matcher.model.type.Signature.TypeParameter; public final class SignatureInference { public static void process(ClassEnvironment env) { diff --git a/src/main/java/matcher/SimilarityChecker.java b/matcher-model/src/main/java/matcher/model/SimilarityChecker.java similarity index 90% rename from src/main/java/matcher/SimilarityChecker.java rename to matcher-model/src/main/java/matcher/model/SimilarityChecker.java index adf97080..a88e87ee 100644 --- a/src/main/java/matcher/SimilarityChecker.java +++ b/matcher-model/src/main/java/matcher/model/SimilarityChecker.java @@ -1,11 +1,11 @@ -package matcher; - -import matcher.classifier.ClassifierUtil; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.MemberInstance; -import matcher.type.MethodInstance; -import matcher.type.MethodVarInstance; +package matcher.model; + +import matcher.model.classifier.ClassifierUtil; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MemberInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodVarInstance; public final class SimilarityChecker { public static float compare(ClassInstance a, ClassInstance b) { diff --git a/src/main/java/matcher/Util.java b/matcher-model/src/main/java/matcher/model/Util.java similarity index 92% rename from src/main/java/matcher/Util.java rename to matcher-model/src/main/java/matcher/model/Util.java index 33e1fb19..b3a9b612 100644 --- a/src/main/java/matcher/Util.java +++ b/matcher-model/src/main/java/matcher/model/Util.java @@ -1,4 +1,4 @@ -package matcher; +package matcher.model; import java.io.Closeable; import java.io.IOException; @@ -20,6 +20,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.IdentityHashMap; +import java.util.List; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; @@ -29,8 +30,33 @@ import org.objectweb.asm.Handle; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.MethodInsnNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import matcher.model.classifier.RankResult; public class Util { + public static double getScore(double rawScore, double maxScore) { + double ret = rawScore / maxScore; + + return ret * ret; + } + + public static boolean checkRank(List> ranking, double absThreshold, double relThreshold, double maxScore) { + if (ranking.isEmpty()) return false; + + double score = getScore(ranking.get(0).getScore(), maxScore); + if (score < absThreshold) return false; + + if (ranking.size() == 1) { + return true; + } else { + double nextScore = getScore(ranking.get(1).getScore(), maxScore); + + return nextScore < score * (1 - relThreshold); + } + } + public static Set newIdentityHashSet() { return Collections.newSetFromMap(new IdentityHashMap<>()); //new IdentityHashSet<>(); } @@ -215,7 +241,7 @@ public static Handle getTargetHandle(Handle bsm, Object[] bsmArgs) { } else if (isIrrelevantBsm(bsm)) { return null; } else { - Matcher.LOGGER.warn("Unknown invokedynamic bsm: {}/{}{} (tag={} iif={})", + logger.warn("Unknown invokedynamic bsm: {}/{}{} (tag={} iif={})", bsm.getOwner(), bsm.getName(), bsm.getDesc(), bsm.getTag(), bsm.isInterface()); return null; @@ -372,5 +398,6 @@ public static int compareNatural(String a, String b) { } } + private static final Logger logger = LoggerFactory.getLogger(Util.class); public static final Object asmNodeSync = new Object(); } diff --git a/src/main/java/matcher/bcremap/AsmClassRemapper.java b/matcher-model/src/main/java/matcher/model/bcremap/AsmClassRemapper.java similarity index 99% rename from src/main/java/matcher/bcremap/AsmClassRemapper.java rename to matcher-model/src/main/java/matcher/model/bcremap/AsmClassRemapper.java index 834f9c64..d67bbc09 100644 --- a/src/main/java/matcher/bcremap/AsmClassRemapper.java +++ b/matcher-model/src/main/java/matcher/model/bcremap/AsmClassRemapper.java @@ -1,4 +1,4 @@ -package matcher.bcremap; +package matcher.model.bcremap; import java.util.Arrays; import java.util.IdentityHashMap; @@ -15,7 +15,7 @@ import org.objectweb.asm.commons.MethodRemapper; import org.objectweb.asm.tree.ClassNode; -import matcher.Util; +import matcher.model.Util; public class AsmClassRemapper extends ClassRemapper { public static void process(ClassNode source, AsmRemapper remapper, ClassVisitor sink) { diff --git a/src/main/java/matcher/bcremap/AsmRemapper.java b/matcher-model/src/main/java/matcher/model/bcremap/AsmRemapper.java similarity index 91% rename from src/main/java/matcher/bcremap/AsmRemapper.java rename to matcher-model/src/main/java/matcher/model/bcremap/AsmRemapper.java index ae8c7c95..c4697aef 100644 --- a/src/main/java/matcher/bcremap/AsmRemapper.java +++ b/matcher-model/src/main/java/matcher/model/bcremap/AsmRemapper.java @@ -1,13 +1,13 @@ -package matcher.bcremap; +package matcher.model.bcremap; import org.objectweb.asm.commons.Remapper; -import matcher.NameType; -import matcher.type.ClassEnv; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.MethodInstance; -import matcher.type.MethodVarInstance; +import matcher.model.NameType; +import matcher.model.type.ClassEnv; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodVarInstance; public class AsmRemapper extends Remapper { public AsmRemapper(ClassEnv env, NameType nameType) { diff --git a/src/main/java/matcher/classifier/ClassClassifier.java b/matcher-model/src/main/java/matcher/model/classifier/ClassClassifier.java similarity index 96% rename from src/main/java/matcher/classifier/ClassClassifier.java rename to matcher-model/src/main/java/matcher/model/classifier/ClassClassifier.java index 9719d641..ee6ef1f7 100644 --- a/src/main/java/matcher/classifier/ClassClassifier.java +++ b/matcher-model/src/main/java/matcher/model/classifier/ClassClassifier.java @@ -1,4 +1,4 @@ -package matcher.classifier; +package matcher.model.classifier; import java.util.ArrayList; import java.util.Arrays; @@ -16,14 +16,13 @@ import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; -import matcher.Matcher; -import matcher.Util; -import matcher.type.ClassEnvironment; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.MethodInstance; -import matcher.type.MethodVarInstance; -import matcher.type.Signature.ClassSignature; +import matcher.model.Util; +import matcher.model.type.ClassEnvironment; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodVarInstance; +import matcher.model.type.Signature.ClassSignature; public class ClassClassifier { public static void init() { @@ -420,7 +419,7 @@ public double getScore(ClassInstance clsA, ClassInstance clsB, ClassEnvironment @Override public double getScore(ClassInstance clsA, ClassInstance clsB, ClassEnvironment env) { /*if (clsA.getName().equals("agl") && clsB.getName().equals("aht")) { - Matcher.LOGGER.info(); + logger.info(); }*/ final double absThreshold = 0.8; @@ -435,7 +434,7 @@ public double getScore(ClassInstance clsA, ClassInstance clsB, ClassEnvironment if (!method.isMatchable()) continue; List> ranking = MethodClassifier.rank(method, clsB.getMethods(), level, env); - if (Matcher.checkRank(ranking, absThreshold, relThreshold, maxScore)) match += Matcher.getScore(ranking.get(0).getScore(), maxScore); + if (Util.checkRank(ranking, absThreshold, relThreshold, maxScore)) match += Util.getScore(ranking.get(0).getScore(), maxScore); } } @@ -446,7 +445,7 @@ public double getScore(ClassInstance clsA, ClassInstance clsB, ClassEnvironment if (!field.isMatchable()) continue; List> ranking = FieldClassifier.rank(field, clsB.getFields(), level, env); - if (Matcher.checkRank(ranking, absThreshold, relThreshold, maxScore)) match += Matcher.getScore(ranking.get(0).getScore(), maxScore); + if (Util.checkRank(ranking, absThreshold, relThreshold, maxScore)) match += Util.getScore(ranking.get(0).getScore(), maxScore); } } diff --git a/src/main/java/matcher/classifier/ClassifierLevel.java b/matcher-model/src/main/java/matcher/model/classifier/ClassifierLevel.java similarity index 79% rename from src/main/java/matcher/classifier/ClassifierLevel.java rename to matcher-model/src/main/java/matcher/model/classifier/ClassifierLevel.java index 03b51364..c38c410d 100644 --- a/src/main/java/matcher/classifier/ClassifierLevel.java +++ b/matcher-model/src/main/java/matcher/model/classifier/ClassifierLevel.java @@ -1,4 +1,4 @@ -package matcher.classifier; +package matcher.model.classifier; public enum ClassifierLevel { Initial, diff --git a/src/main/java/matcher/classifier/ClassifierResult.java b/matcher-model/src/main/java/matcher/model/classifier/ClassifierResult.java similarity index 92% rename from src/main/java/matcher/classifier/ClassifierResult.java rename to matcher-model/src/main/java/matcher/model/classifier/ClassifierResult.java index 0baf5284..f830e5ac 100644 --- a/src/main/java/matcher/classifier/ClassifierResult.java +++ b/matcher-model/src/main/java/matcher/model/classifier/ClassifierResult.java @@ -1,4 +1,4 @@ -package matcher.classifier; +package matcher.model.classifier; public class ClassifierResult { public ClassifierResult(IClassifier classifier, double score) { diff --git a/src/main/java/matcher/classifier/ClassifierUtil.java b/matcher-model/src/main/java/matcher/model/classifier/ClassifierUtil.java similarity index 95% rename from src/main/java/matcher/classifier/ClassifierUtil.java rename to matcher-model/src/main/java/matcher/model/classifier/ClassifierUtil.java index 4939c747..078d82e1 100644 --- a/src/main/java/matcher/classifier/ClassifierUtil.java +++ b/matcher-model/src/main/java/matcher/model/classifier/ClassifierUtil.java @@ -1,4 +1,4 @@ -package matcher.classifier; +package matcher.model.classifier; import java.util.ArrayList; import java.util.Arrays; @@ -36,18 +36,19 @@ import org.objectweb.asm.tree.VarInsnNode; import org.objectweb.asm.util.Textifier; import org.objectweb.asm.util.TraceMethodVisitor; - -import matcher.Matcher; -import matcher.Util; -import matcher.classifier.MatchingCache.CacheToken; -import matcher.type.ClassEnvironment; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.Matchable; -import matcher.type.MemberInstance; -import matcher.type.MethodInstance; -import matcher.type.MethodType; -import matcher.type.MethodVarInstance; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import matcher.model.Util; +import matcher.model.classifier.MatchingCache.CacheToken; +import matcher.model.type.ClassEnvironment; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.Matchable; +import matcher.model.type.MemberInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodType; +import matcher.model.type.MethodVarInstance; public class ClassifierUtil { public static boolean checkPotentialEquality(ClassInstance a, ClassInstance b) { @@ -378,10 +379,10 @@ private static int compareInsns(AbstractInsnNode insnA, AbstractInsnNode ins implB.getOwner(), implB.getName(), implB.getDesc(), Util.isCallToInterface(implB), env) ? COMPARED_SIMILAR : COMPARED_DISTINCT; default: - Matcher.LOGGER.warn("Unexpected impl tag: {}", implA.getTag()); + logger.warn("Unexpected impl tag: {}", implA.getTag()); } } else if (!Util.isIrrelevantBsm(a.bsm)) { - Matcher.LOGGER.warn("Unknown invokedynamic bsm: {}/{}{} (tag={} iif={})", + logger.warn("Unknown invokedynamic bsm: {}/{}{} (tag={} iif={})", a.bsm.getOwner(), a.bsm.getName(), a.bsm.getDesc(), a.bsm.getTag(), a.bsm.isInterface()); } @@ -624,10 +625,10 @@ private static int[] mapLists(T listA, T listB, ListElementRetriever int[] mapLists(T listA, T listB, ListElementRetriever= COMPARED_DISTINCT) { assert c - keepCost == COMPARED_DISTINCT; - //Matcher.LOGGER.debug("{}/{} rep {} -> {}", i-1, j-1, toString(elementRetriever.apply(listA, i - 1)), toString(elementRetriever.apply(listB, j - 1))); + //logger.debug("{}/{} rep {} -> {}", i-1, j-1, toString(elementRetriever.apply(listA, i - 1)), toString(elementRetriever.apply(listB, j - 1))); ret[i - 1] = -1; } else { - //Matcher.LOGGER.debug("{}/{} eq {} - {}", i-1, j-1, toString(elementRetriever.apply(listA, i - 1)), toString(elementRetriever.apply(listB, j - 1))); + //logger.debug("{}/{} eq {} - {}", i-1, j-1, toString(elementRetriever.apply(listA, i - 1)), toString(elementRetriever.apply(listB, j - 1))); ret[i - 1] = j - 1; /*U e = elementRetriever.apply(listA, i - 1); @@ -660,11 +661,11 @@ private static int[] mapLists(T listA, T listB, ListElementRetriever ilMapCacheToken = new CacheToken<>(); } diff --git a/src/main/java/matcher/classifier/FieldClassifier.java b/matcher-model/src/main/java/matcher/model/classifier/FieldClassifier.java similarity index 97% rename from src/main/java/matcher/classifier/FieldClassifier.java rename to matcher-model/src/main/java/matcher/model/classifier/FieldClassifier.java index afa9b790..5ac90387 100644 --- a/src/main/java/matcher/classifier/FieldClassifier.java +++ b/matcher-model/src/main/java/matcher/model/classifier/FieldClassifier.java @@ -1,4 +1,4 @@ -package matcher.classifier; +package matcher.model.classifier; import java.util.ArrayList; import java.util.Collections; @@ -14,12 +14,12 @@ import org.objectweb.asm.tree.FieldInsnNode; import org.objectweb.asm.tree.InsnList; -import matcher.type.ClassEnvironment; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.MemberInstance; -import matcher.type.MethodInstance; -import matcher.type.Signature.FieldSignature; +import matcher.model.type.ClassEnvironment; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MemberInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.Signature.FieldSignature; public class FieldClassifier { public static void init() { diff --git a/src/main/java/matcher/classifier/IClassifier.java b/matcher-model/src/main/java/matcher/model/classifier/IClassifier.java similarity index 62% rename from src/main/java/matcher/classifier/IClassifier.java rename to matcher-model/src/main/java/matcher/model/classifier/IClassifier.java index c1061569..c6140341 100644 --- a/src/main/java/matcher/classifier/IClassifier.java +++ b/matcher-model/src/main/java/matcher/model/classifier/IClassifier.java @@ -1,6 +1,6 @@ -package matcher.classifier; +package matcher.model.classifier; -import matcher.type.ClassEnvironment; +import matcher.model.type.ClassEnvironment; public interface IClassifier { String getName(); diff --git a/src/main/java/matcher/classifier/IRanker.java b/matcher-model/src/main/java/matcher/model/classifier/IRanker.java similarity index 68% rename from src/main/java/matcher/classifier/IRanker.java rename to matcher-model/src/main/java/matcher/model/classifier/IRanker.java index a8ca811a..ec7ae678 100644 --- a/src/main/java/matcher/classifier/IRanker.java +++ b/matcher-model/src/main/java/matcher/model/classifier/IRanker.java @@ -1,8 +1,8 @@ -package matcher.classifier; +package matcher.model.classifier; import java.util.List; -import matcher.type.ClassEnvironment; +import matcher.model.type.ClassEnvironment; public interface IRanker { List> rank(T src, T[] dsts, ClassifierLevel level, ClassEnvironment env, double maxMismatch); diff --git a/src/main/java/matcher/classifier/MatchingCache.java b/matcher-model/src/main/java/matcher/model/classifier/MatchingCache.java similarity index 94% rename from src/main/java/matcher/classifier/MatchingCache.java rename to matcher-model/src/main/java/matcher/model/classifier/MatchingCache.java index caf0d0e1..e2674a0a 100644 --- a/src/main/java/matcher/classifier/MatchingCache.java +++ b/matcher-model/src/main/java/matcher/model/classifier/MatchingCache.java @@ -1,10 +1,10 @@ -package matcher.classifier; +package matcher.model.classifier; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiFunction; -import matcher.type.Matchable; +import matcher.model.type.Matchable; public class MatchingCache { @SuppressWarnings("unchecked") diff --git a/src/main/java/matcher/classifier/MethodClassifier.java b/matcher-model/src/main/java/matcher/model/classifier/MethodClassifier.java similarity index 97% rename from src/main/java/matcher/classifier/MethodClassifier.java rename to matcher-model/src/main/java/matcher/model/classifier/MethodClassifier.java index 8a309a91..87017b24 100644 --- a/src/main/java/matcher/classifier/MethodClassifier.java +++ b/matcher-model/src/main/java/matcher/model/classifier/MethodClassifier.java @@ -1,4 +1,4 @@ -package matcher.classifier; +package matcher.model.classifier; import java.util.ArrayList; import java.util.Arrays; @@ -16,13 +16,13 @@ import org.objectweb.asm.tree.InvokeDynamicInsnNode; import org.objectweb.asm.tree.MethodInsnNode; -import matcher.Util; -import matcher.type.ClassEnvironment; -import matcher.type.ClassInstance; -import matcher.type.MemberInstance; -import matcher.type.MethodInstance; -import matcher.type.MethodVarInstance; -import matcher.type.Signature.MethodSignature; +import matcher.model.Util; +import matcher.model.type.ClassEnvironment; +import matcher.model.type.ClassInstance; +import matcher.model.type.MemberInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodVarInstance; +import matcher.model.type.Signature.MethodSignature; public class MethodClassifier { public static void init() { diff --git a/src/main/java/matcher/classifier/MethodVarClassifier.java b/matcher-model/src/main/java/matcher/model/classifier/MethodVarClassifier.java similarity index 97% rename from src/main/java/matcher/classifier/MethodVarClassifier.java rename to matcher-model/src/main/java/matcher/model/classifier/MethodVarClassifier.java index ab642405..7a9a0db7 100644 --- a/src/main/java/matcher/classifier/MethodVarClassifier.java +++ b/matcher-model/src/main/java/matcher/model/classifier/MethodVarClassifier.java @@ -1,4 +1,4 @@ -package matcher.classifier; +package matcher.model.classifier; import java.util.ArrayList; import java.util.Collections; @@ -11,8 +11,8 @@ import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.VarInsnNode; -import matcher.type.ClassEnvironment; -import matcher.type.MethodVarInstance; +import matcher.model.type.ClassEnvironment; +import matcher.model.type.MethodVarInstance; public class MethodVarClassifier { public static void init() { diff --git a/src/main/java/matcher/classifier/RankResult.java b/matcher-model/src/main/java/matcher/model/classifier/RankResult.java similarity index 93% rename from src/main/java/matcher/classifier/RankResult.java rename to matcher-model/src/main/java/matcher/model/classifier/RankResult.java index f595086f..c48dca17 100644 --- a/src/main/java/matcher/classifier/RankResult.java +++ b/matcher-model/src/main/java/matcher/model/classifier/RankResult.java @@ -1,4 +1,4 @@ -package matcher.classifier; +package matcher.model.classifier; import java.util.List; diff --git a/src/main/java/matcher/config/Config.java b/matcher-model/src/main/java/matcher/model/config/Config.java similarity index 89% rename from src/main/java/matcher/config/Config.java rename to matcher-model/src/main/java/matcher/model/config/Config.java index 77d445d8..fc0b9ba5 100644 --- a/src/main/java/matcher/config/Config.java +++ b/matcher-model/src/main/java/matcher/model/config/Config.java @@ -1,4 +1,4 @@ -package matcher.config; +package matcher.model.config; import java.nio.file.Path; import java.nio.file.Paths; @@ -10,7 +10,7 @@ import java.util.prefs.Preferences; public class Config { - public static void init(String[] args) { + public static void init() { Preferences prefs = Preferences.userRoot(); // in ~/.java/.userPrefs try { @@ -26,22 +26,6 @@ public static void init(String[] args) { } catch (BackingStoreException e) { // ignored } - - for (int i = 0; i < args.length; i++) { - switch (args[i]) { - case "--theme": - String themeId = args[++i]; - Theme theme = Theme.getById(themeId); - - if (theme == null) { - System.err.println("Startup arg '--theme' couldn't be applied, as there exists no theme with ID " + themeId + "!"); - } else { - setTheme(theme); - } - - break; - } - } } private Config() { } diff --git a/src/main/java/matcher/config/ProjectConfig.java b/matcher-model/src/main/java/matcher/model/config/ProjectConfig.java similarity index 99% rename from src/main/java/matcher/config/ProjectConfig.java rename to matcher-model/src/main/java/matcher/model/config/ProjectConfig.java index 11059c36..535dd287 100644 --- a/src/main/java/matcher/config/ProjectConfig.java +++ b/matcher-model/src/main/java/matcher/model/config/ProjectConfig.java @@ -1,4 +1,4 @@ -package matcher.config; +package matcher.model.config; import java.nio.file.Path; import java.util.Collections; diff --git a/src/main/java/matcher/config/Theme.java b/matcher-model/src/main/java/matcher/model/config/Theme.java similarity index 97% rename from src/main/java/matcher/config/Theme.java rename to matcher-model/src/main/java/matcher/model/config/Theme.java index ac15d2cf..1ef60908 100644 --- a/src/main/java/matcher/config/Theme.java +++ b/matcher-model/src/main/java/matcher/model/config/Theme.java @@ -1,4 +1,4 @@ -package matcher.config; +package matcher.model.config; import java.net.URL; diff --git a/src/main/java/matcher/config/UidConfig.java b/matcher-model/src/main/java/matcher/model/config/UidConfig.java similarity index 98% rename from src/main/java/matcher/config/UidConfig.java rename to matcher-model/src/main/java/matcher/model/config/UidConfig.java index db7891e6..06ec7e9a 100644 --- a/src/main/java/matcher/config/UidConfig.java +++ b/matcher-model/src/main/java/matcher/model/config/UidConfig.java @@ -1,4 +1,4 @@ -package matcher.config; +package matcher.model.config; import java.net.InetSocketAddress; import java.util.prefs.Preferences; diff --git a/src/main/java/matcher/mapping/MappedElementComparators.java b/matcher-model/src/main/java/matcher/model/mapping/MappedElementComparators.java similarity index 93% rename from src/main/java/matcher/mapping/MappedElementComparators.java rename to matcher-model/src/main/java/matcher/model/mapping/MappedElementComparators.java index bf6b2cc1..83a52ac6 100644 --- a/src/main/java/matcher/mapping/MappedElementComparators.java +++ b/matcher-model/src/main/java/matcher/model/mapping/MappedElementComparators.java @@ -1,13 +1,13 @@ -package matcher.mapping; +package matcher.model.mapping; import java.util.Comparator; import java.util.Objects; -import matcher.NameType; -import matcher.type.ClassInstance; -import matcher.type.Matchable; -import matcher.type.MemberInstance; -import matcher.type.MethodVarInstance; +import matcher.model.NameType; +import matcher.model.type.ClassInstance; +import matcher.model.type.Matchable; +import matcher.model.type.MemberInstance; +import matcher.model.type.MethodVarInstance; public final class MappedElementComparators { public static > Comparator byName(NameType ns) { diff --git a/src/main/java/matcher/mapping/MappingField.java b/matcher-model/src/main/java/matcher/model/mapping/MappingField.java similarity index 88% rename from src/main/java/matcher/mapping/MappingField.java rename to matcher-model/src/main/java/matcher/model/mapping/MappingField.java index a55e1dfb..295eaecc 100644 --- a/src/main/java/matcher/mapping/MappingField.java +++ b/matcher-model/src/main/java/matcher/model/mapping/MappingField.java @@ -1,6 +1,6 @@ -package matcher.mapping; +package matcher.model.mapping; -import matcher.NameType; +import matcher.model.NameType; public enum MappingField { PLAIN("Plain", NameType.PLAIN), diff --git a/src/main/java/matcher/mapping/MappingPropagator.java b/matcher-model/src/main/java/matcher/model/mapping/MappingPropagator.java similarity index 81% rename from src/main/java/matcher/mapping/MappingPropagator.java rename to matcher-model/src/main/java/matcher/model/mapping/MappingPropagator.java index 5aab9841..813816ba 100644 --- a/src/main/java/matcher/mapping/MappingPropagator.java +++ b/matcher-model/src/main/java/matcher/model/mapping/MappingPropagator.java @@ -1,17 +1,19 @@ -package matcher.mapping; +package matcher.model.mapping; import java.util.Objects; import java.util.Set; import java.util.function.DoubleConsumer; -import matcher.Matcher; -import matcher.NameType; -import matcher.Util; -import matcher.type.ClassEnvironment; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.MethodInstance; -import matcher.type.MethodVarInstance; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import matcher.model.NameType; +import matcher.model.Util; +import matcher.model.type.ClassEnvironment; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodVarInstance; public final class MappingPropagator { public static boolean propagateNames(ClassEnvironment env, DoubleConsumer progressReceiver) { @@ -88,7 +90,7 @@ public static boolean propagateNames(ClassEnvironment env, DoubleConsumer progre } } - Matcher.LOGGER.info("Propagated {} method names and {} method arg names", propagatedMethodNames, propagatedArgNames); + logger.info("Propagated {} method names and {} method arg names", propagatedMethodNames, propagatedArgNames); return propagatedMethodNames > 0 || propagatedArgNames > 0; } @@ -115,10 +117,10 @@ public static boolean fixRecordMemberNames(ClassEnvironment env, NameType nameTy if (linkedMethod.isNameObfuscated() && (!field.isNameObfuscated() || !linkedMethod.hasMappedName() || field.hasMappedName())) { - Matcher.LOGGER.debug("Copying record component name for method {} from field {} -> {}", linkedMethod, field, fieldName); + logger.debug("Copying record component name for method {} from field {} -> {}", linkedMethod, field, fieldName); linkedMethod.setMappedName(fieldName); } else { - Matcher.LOGGER.debug("Copying record component name for field {} from method {} -> {}", field, linkedMethod, methodName); + logger.debug("Copying record component name for field {} from method {} -> {}", field, linkedMethod, methodName); field.setMappedName(methodName); } @@ -126,8 +128,10 @@ public static boolean fixRecordMemberNames(ClassEnvironment env, NameType nameTy } } - Matcher.LOGGER.info("Fixed {} record names.", modified); + logger.info("Fixed {} record names.", modified); return modified > 0; } + + private static final Logger logger = LoggerFactory.getLogger(MappingPropagator.class); } diff --git a/src/main/java/matcher/mapping/Mappings.java b/matcher-model/src/main/java/matcher/model/mapping/Mappings.java similarity index 92% rename from src/main/java/matcher/mapping/Mappings.java rename to matcher-model/src/main/java/matcher/model/mapping/Mappings.java index 81d2867b..95f394e1 100644 --- a/src/main/java/matcher/mapping/Mappings.java +++ b/matcher-model/src/main/java/matcher/model/mapping/Mappings.java @@ -1,4 +1,4 @@ -package matcher.mapping; +package matcher.model.mapping; import java.io.IOException; import java.nio.file.Path; @@ -8,6 +8,9 @@ import java.util.List; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.fabricmc.mappingio.FlatMappingVisitor; import net.fabricmc.mappingio.MappedElementKind; import net.fabricmc.mappingio.MappingReader; @@ -17,18 +20,17 @@ import net.fabricmc.mappingio.adapter.RegularAsFlatMappingVisitor; import net.fabricmc.mappingio.format.MappingFormat; -import matcher.Matcher; -import matcher.NameType; -import matcher.Util; -import matcher.type.ClassEnv; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.LocalClassEnv; -import matcher.type.Matchable; -import matcher.type.MatchableKind; -import matcher.type.MemberInstance; -import matcher.type.MethodInstance; -import matcher.type.MethodVarInstance; +import matcher.model.NameType; +import matcher.model.Util; +import matcher.model.type.ClassEnv; +import matcher.model.type.ClassInstance; +import matcher.model.type.FieldInstance; +import matcher.model.type.LocalClassEnv; +import matcher.model.type.Matchable; +import matcher.model.type.MatchableKind; +import matcher.model.type.MemberInstance; +import matcher.model.type.MethodInstance; +import matcher.model.type.MethodVarInstance; public class Mappings { public static void load(Path path, MappingFormat format, @@ -81,7 +83,7 @@ public boolean visitClass(String srcName) { cur = cls = findClass(srcName, fieldSource, env); if (cls == null) { - if (warnedClasses.add(srcName)) Matcher.LOGGER.warn("Can't find mapped class {}", srcName); + if (warnedClasses.add(srcName)) logger.warn("Can't find mapped class {}", srcName); return false; } @@ -97,7 +99,7 @@ public boolean visitMethod(String srcName, String srcDesc) { cur = method = cls.getMethod(srcName, srcDesc, fieldSource.type); if (method == null || !method.isReal()) { - Matcher.LOGGER.warn("Can't find mapped method {}/{}{}", + logger.warn("Can't find mapped method {}/{}{}", cls.getName(fieldSource.type), srcName, srcDesc); return false; } @@ -133,28 +135,28 @@ public boolean visitMethodVar(int asmIndex, int lvIndex, int startOpIdx, int end private MethodVarInstance getMethodVar(int varIndex, int lvIndex, int startOpIdx, int asmIndex, boolean isArg) { if (isArg && varIndex < -1 || varIndex >= method.getArgs().length) { - Matcher.LOGGER.warn("Invalid var index {} for method {}", varIndex, method); + logger.warn("Invalid var index {} for method {}", varIndex, method); } else if (lvIndex < -1 || lvIndex >= (isArg ? method.getArgs() : method.getVars()).length * 2 + 1) { - Matcher.LOGGER.warn("Invalid lv index {} for method {}", lvIndex, method); + logger.warn("Invalid lv index {} for method {}", lvIndex, method); } else if (asmIndex < -1) { - Matcher.LOGGER.warn("Invalid lv asm index {} for method {}", asmIndex, method); + logger.warn("Invalid lv asm index {} for method {}", asmIndex, method); } else { if (!isArg || varIndex == -1) { if (asmIndex >= 0) { varIndex = findVarIndexByAsm(isArg ? method.getArgs() : method.getVars(), asmIndex); if (varIndex == -1) { - Matcher.LOGGER.warn("Invalid lv asm index {} for method {}", asmIndex, method); + logger.warn("Invalid lv asm index {} for method {}", asmIndex, method); return null; } } else if (lvIndex <= -1) { - Matcher.LOGGER.warn("Missing arg+lvt index {} for method {}", lvIndex, method); + logger.warn("Missing arg+lvt index {} for method {}", lvIndex, method); return null; } else { varIndex = findVarIndexByLv(isArg ? method.getArgs() : method.getVars(), lvIndex, startOpIdx); if (varIndex == -1) { - Matcher.LOGGER.warn("Invalid lv index {} for method {}", lvIndex, method); + logger.warn("Invalid lv index {} for method {}", lvIndex, method); return null; } } @@ -163,12 +165,12 @@ private MethodVarInstance getMethodVar(int varIndex, int lvIndex, int startOpIdx MethodVarInstance var = isArg ? method.getArg(varIndex) : method.getVar(varIndex); if (lvIndex != -1 && var.getLvIndex() != lvIndex) { - Matcher.LOGGER.warn("Mismatched lv index {} for method {}", lvIndex, method); + logger.warn("Mismatched lv index {} for method {}", lvIndex, method); return null; } if (asmIndex != -1 && var.getAsmIndex() != asmIndex) { - Matcher.LOGGER.warn("Mismatched lv asm index {} for method {}", asmIndex, method); + logger.warn("Mismatched lv asm index {} for method {}", asmIndex, method); return null; } @@ -187,7 +189,7 @@ public boolean visitField(String srcName, String srcDesc) { cur = field = cls.getField(srcName, srcDesc, fieldSource.type); if (field == null || !field.isReal()) { - Matcher.LOGGER.warn("Can't find mapped field {}/{}", cls.getName(fieldSource.type), srcName); + logger.warn("Can't find mapped field {}/{}", cls.getName(fieldSource.type), srcName); return false; } @@ -226,7 +228,7 @@ public void visitDstName(MappedElementKind targetKind, int namespace, String nam String prefix = env.getGlobal().classUidPrefix; if (!name.startsWith(prefix)) { - Matcher.LOGGER.warn("Invalid uid class name {}", name); + logger.warn("Invalid uid class name {}", name); return; } else { int innerNameStart = name.lastIndexOf('$') + 1; @@ -236,7 +238,7 @@ public void visitDstName(MappedElementKind targetKind, int namespace, String nam int subPrefixStart = prefix.lastIndexOf('/') + 1; if (!name.startsWith(prefix.substring(subPrefixStart), innerNameStart)) { - Matcher.LOGGER.warn("Invalid uid class name {}", name); + logger.warn("Invalid uid class name {}", name); return; } else { uidStr = name.substring(innerNameStart + prefix.length() - subPrefixStart); @@ -248,7 +250,7 @@ public void visitDstName(MappedElementKind targetKind, int namespace, String nam int uid = Integer.parseInt(uidStr); if (uid < 0) { - Matcher.LOGGER.warn("Invalid class uid {}", uid); + logger.warn("Invalid class uid {}", uid); return; } else if (cls.getUid() < 0 || cls.getUid() > uid || replace) { cls.setUid(uid); @@ -284,13 +286,13 @@ public void visitDstName(MappedElementKind targetKind, int namespace, String nam String prefix = env.getGlobal().fieldUidPrefix; if (!name.startsWith(prefix)) { - Matcher.LOGGER.warn("Invalid uid field name {}", name); + logger.warn("Invalid uid field name {}", name); return; } else { int uid = Integer.parseInt(name.substring(prefix.length())); if (uid < 0) { - Matcher.LOGGER.warn("Invalid field uid {}", uid); + logger.warn("Invalid field uid {}", uid); return; } else if (field.getUid() < 0 || field.getUid() > uid || replace) { for (FieldInstance f : field.getAllHierarchyMembers()) { @@ -328,13 +330,13 @@ public void visitDstName(MappedElementKind targetKind, int namespace, String nam String prefix = env.getGlobal().methodUidPrefix; if (!name.startsWith(prefix)) { - Matcher.LOGGER.warn("Invalid uid method name {}", name); + logger.warn("Invalid uid method name {}", name); return; } else { int uid = Integer.parseInt(name.substring(prefix.length())); if (uid < 0) { - Matcher.LOGGER.warn("Invalid method uid {}", uid); + logger.warn("Invalid method uid {}", uid); return; } else if (method.getUid() < 0 || method.getUid() > uid || replace) { for (MethodInstance m : method.getAllHierarchyMembers()) { @@ -411,7 +413,7 @@ public void visitComment(MappedElementKind targetKind, String comment) { throw t; } - Matcher.LOGGER.info("Loaded mappings for {} classes, {} methods ({} args, {} vars) and {} fields (comments: {}/{}/{}).", + logger.info("Loaded mappings for {} classes, {} methods ({} args, {} vars) and {} fields (comments: {}/{}/{}).", dstNameCounts[MatchableKind.CLASS.ordinal()], dstNameCounts[MatchableKind.METHOD.ordinal()], dstNameCounts[MatchableKind.METHOD_ARG.ordinal()], @@ -857,6 +859,7 @@ public static void clear(ClassEnv env) { } } + private static final Logger logger = LoggerFactory.getLogger(Mappings.class); public static final String metaUidNextClass = "uid-next-class"; public static final String metaUidNextMethod = "uid-next-method"; public static final String metaUidNextField = "uid-next-field"; diff --git a/src/main/java/matcher/mapping/MappingsExportVerbosity.java b/matcher-model/src/main/java/matcher/model/mapping/MappingsExportVerbosity.java similarity index 67% rename from src/main/java/matcher/mapping/MappingsExportVerbosity.java rename to matcher-model/src/main/java/matcher/model/mapping/MappingsExportVerbosity.java index 40301b5b..c6ad13d7 100644 --- a/src/main/java/matcher/mapping/MappingsExportVerbosity.java +++ b/matcher-model/src/main/java/matcher/model/mapping/MappingsExportVerbosity.java @@ -1,4 +1,4 @@ -package matcher.mapping; +package matcher.model.mapping; public enum MappingsExportVerbosity { MINIMAL, ROOTS, FULL; diff --git a/src/main/java/matcher/type/Analysis.java b/matcher-model/src/main/java/matcher/model/type/Analysis.java similarity index 98% rename from src/main/java/matcher/type/Analysis.java rename to matcher-model/src/main/java/matcher/model/type/Analysis.java index 53d9666e..c39492d9 100644 --- a/src/main/java/matcher/type/Analysis.java +++ b/matcher-model/src/main/java/matcher/model/type/Analysis.java @@ -1,4 +1,4 @@ -package matcher.type; +package matcher.model.type; import java.io.PrintWriter; import java.io.StringWriter; @@ -46,17 +46,18 @@ import org.objectweb.asm.util.Printer; import org.objectweb.asm.util.Textifier; import org.objectweb.asm.util.TraceMethodVisitor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import matcher.Matcher; -import matcher.NameType; -import matcher.Util; +import matcher.model.NameType; +import matcher.model.Util; class Analysis { static void analyzeMethod(MethodInstance method, CommonClasses common) { MethodNode asmNode = method.getAsmNode(); if (asmNode == null || (asmNode.access & Opcodes.ACC_ABSTRACT) != 0 || asmNode.instructions.size() == 0) return; - Matcher.LOGGER.debug(method.getDisplayName(NameType.MAPPED_PLAIN, true)); + logger.debug(method.getDisplayName(NameType.MAPPED_PLAIN, true)); dump(asmNode); StateRecorder rec = new StateRecorder(method, common); @@ -1144,12 +1145,12 @@ private static List createLocalVariables(InsnList il, StateRe lvToVar = null; - Matcher.LOGGER.debug("Local vars raw:"); + logger.debug("Local vars raw:"); for (int i = 0; i < varCount; i++) { ExecState state = rec.getState(startIndices[i]); - Matcher.LOGGER.debug(" {}: LV {} @ {} - {}: {}\t\t({})", + logger.debug(" {}: LV {} @ {} - {}: {}\t\t({})", i, varToLv[i], startIndices[i], endIndices[i], state.locals[varToLv[i]].toString(), rec.varSources[state.localVarIds[varToLv[i]] - 1].name()); } @@ -1255,12 +1256,12 @@ private static List createLocalVariables(InsnList il, StateRe } } - Matcher.LOGGER.debug("Local vars:"); + logger.debug("Local vars:"); for (int i = 0; i < varCount; i++) { ExecState state = rec.getState(startIndices[i]); - Matcher.LOGGER.debug(" {}: LV {} @ {} - {}: {}\t\t({})", + logger.debug(" {}: LV {} @ {} - {}: {}\t\t({})", i, varToLv[i], startIndices[i], endIndices[i], state.locals[varToLv[i]].toString(), rec.varSources[state.localVarIds[varToLv[i]] - 1].name()); } @@ -1282,14 +1283,14 @@ private static List createLocalVariables(InsnList il, StateRe } if (!mismatch) { - Matcher.LOGGER.debug("Existing vars matched!"); + logger.debug("Existing vars matched!"); } else { - Matcher.LOGGER.debug("Existing vars mismatch:"); + logger.debug("Existing vars mismatch:"); for (int i = 0; i < orig.size(); i++) { LocalVariableNode lvn = orig.get(i); - Matcher.LOGGER.debug(" {}: LV {} @ {} - {}: {}", + logger.debug(" {}: LV {} @ {} - {}: {}", i, lvn.index, il.indexOf(lvn.start), il.indexOf(lvn.end) - 1, lvn.desc); } } @@ -1861,7 +1862,7 @@ public void dump(InsnList il) { sb.append('\n'); } - Matcher.LOGGER.debug(sb.toString()); + logger.debug(sb.toString()); } private void dumpVars(ClassInstance[] types, int[] ids, StringBuilder sb) { @@ -1896,7 +1897,7 @@ private void dumpVars(ClassInstance[] types, int[] ids, StringBuilder sb) { } sb.append(']'); - Matcher.LOGGER.debug(sb.toString()); + logger.debug(sb.toString()); } final ExecState[] states; // state at the start of every instruction index @@ -1980,7 +1981,7 @@ static void checkInitializer(FieldInstance field, ClassFeatureExtractor context) AbstractInsnNode fieldWrite = null; //dump(method.asmNode); - //Matcher.LOGGER.debug("\n------------------------\n"); + //logger.debug("\n------------------------\n"); for (Iterator it = il.iterator(); it.hasNext(); ) { AbstractInsnNode aInsn = it.next(); @@ -2084,10 +2085,10 @@ static void checkInitializer(FieldInstance field, ClassFeatureExtractor context) in = il.get(pos); initIl.add(in); - /*Matcher.LOGGER.debug(pos+": "); + /*logger.debug(pos+": "); il.get(pos).accept(visitor); - Matcher.LOGGER.debug(textifier.getText().get(0)); + logger.debug(textifier.getText().get(0)); textifier.getText().clear();*/ pos++; @@ -2098,7 +2099,7 @@ static void checkInitializer(FieldInstance field, ClassFeatureExtractor context) /* int pos = fieldWritePos; for (int i = 0; i < 100; i++) { - Matcher.LOGGER.debug(i+" ("+pos+"):"); + logger.debug(i+" ("+pos+"):"); Frame frame = frames[pos]; Frame nextFrame = frames[pos + 1]; @@ -2108,24 +2109,24 @@ static void checkInitializer(FieldInstance field, ClassFeatureExtractor context) SourceValue value = frame.getStack(frame.getStackSize() - 1); if (value.insns.isEmpty()) { - Matcher.LOGGER.debug("empty"); + logger.debug("empty"); break; } for (AbstractInsnNode ain : value.insns) { ain.accept(visitor); - Matcher.LOGGER.debug(textifier.getText().get(0)); + logger.debug(textifier.getText().get(0)); textifier.getText().clear(); } pos = method.asmNode.instructions.indexOf(value.insns.iterator().next()); }*/ - /*Matcher.LOGGER.debug(frame); - Matcher.LOGGER.debug("\n------------------------\n"); + /*logger.debug(frame); + logger.debug("\n------------------------\n"); dump(frame.getStack(frame.getStackSize() - 1).insns);*/ - //Matcher.LOGGER.debug(); + //logger.debug(); } private static int getStackDemand(AbstractInsnNode ain, Frame frame) { @@ -2392,7 +2393,7 @@ private static void dump(MethodNode method) { textifier.print(pw); } - Matcher.LOGGER.debug(writer.toString()); + logger.debug(writer.toString()); } private static void dump(Iterable il) { @@ -2410,6 +2411,8 @@ private static void dump(Iterable il) { textifier.print(pw); } - Matcher.LOGGER.debug(writer.toString()); + logger.debug(writer.toString()); } + + private static final Logger logger = LoggerFactory.getLogger(Analysis.class); } diff --git a/src/main/java/matcher/type/ClassEnv.java b/matcher-model/src/main/java/matcher/model/type/ClassEnv.java similarity index 93% rename from src/main/java/matcher/type/ClassEnv.java rename to matcher-model/src/main/java/matcher/model/type/ClassEnv.java index 2cb20ee3..91a83114 100644 --- a/src/main/java/matcher/type/ClassEnv.java +++ b/matcher-model/src/main/java/matcher/model/type/ClassEnv.java @@ -1,8 +1,8 @@ -package matcher.type; +package matcher.model.type; import java.util.Collection; -import matcher.NameType; +import matcher.model.NameType; public interface ClassEnv { boolean isShared(); diff --git a/src/main/java/matcher/type/ClassEnvironment.java b/matcher-model/src/main/java/matcher/model/type/ClassEnvironment.java similarity index 95% rename from src/main/java/matcher/type/ClassEnvironment.java rename to matcher-model/src/main/java/matcher/model/type/ClassEnvironment.java index edf79759..7a6d4cdf 100644 --- a/src/main/java/matcher/type/ClassEnvironment.java +++ b/matcher-model/src/main/java/matcher/model/type/ClassEnvironment.java @@ -1,4 +1,4 @@ -package matcher.type; +package matcher.model.type; import java.io.IOException; import java.io.UncheckedIOException; @@ -32,15 +32,15 @@ import org.objectweb.asm.tree.FieldNode; import org.objectweb.asm.tree.InnerClassNode; import org.objectweb.asm.tree.MethodNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import matcher.Matcher; -import matcher.NameType; -import matcher.Util; -import matcher.classifier.ClassifierUtil; -import matcher.classifier.MatchingCache; -import matcher.config.ProjectConfig; -import matcher.srcprocess.Decompiler; -import matcher.type.Signature.ClassSignature; +import matcher.model.classifier.ClassifierUtil; +import matcher.model.classifier.MatchingCache; +import matcher.model.config.ProjectConfig; +import matcher.model.NameType; +import matcher.model.Util; +import matcher.model.type.Signature.ClassSignature; public final class ClassEnvironment implements ClassEnv { public void init(ProjectConfig config, DoubleConsumer progressReceiver) { @@ -314,20 +314,6 @@ public Collection getInputFilesB() { return extractorB.getInputFiles(); } - public String decompile(Decompiler decompiler, ClassInstance cls, NameType nameType) { - ClassFeatureExtractor extractor; - - if (extractorA.getLocalClsById(cls.getId()) == cls) { - extractor = extractorA; - } else if (extractorB.getLocalClsById(cls.getId()) == cls) { - extractor = extractorB; - } else { - throw new IllegalArgumentException("unknown class: "+cls); - } - - return decompiler.decompile(cls, extractor, nameType); - } - @Override public ClassInstance getCreateClassInstance(String id, boolean createUnknown) { ClassInstance ret = getSharedClsById(id); @@ -587,7 +573,7 @@ private static void addOuterClass(ClassInstance cls, String name, boolean create outerClass = cls.getEnv().getCreateClassInstance(ClassInstance.getId(name), createUnknown); if (outerClass == null) { - Matcher.LOGGER.trace("Missing outer cls: {} for {}", name, cls); + logger.error("Missing outer cls: {} for {}", name, cls); return; } } @@ -615,6 +601,7 @@ public MatchingCache getCache() { return cache; } + private static final Logger logger = LoggerFactory.getLogger(ClassEnvironment.class); private final List cpFiles = new ArrayList<>(); private final Map sharedClasses = new HashMap<>(); private final List openFileSystems = new ArrayList<>(); diff --git a/src/main/java/matcher/type/ClassFeatureExtractor.java b/matcher-model/src/main/java/matcher/model/type/ClassFeatureExtractor.java similarity index 97% rename from src/main/java/matcher/type/ClassFeatureExtractor.java rename to matcher-model/src/main/java/matcher/model/type/ClassFeatureExtractor.java index dcafb6f7..43e6e404 100644 --- a/src/main/java/matcher/type/ClassFeatureExtractor.java +++ b/matcher-model/src/main/java/matcher/model/type/ClassFeatureExtractor.java @@ -1,4 +1,4 @@ -package matcher.type; +package matcher.model.type; import java.net.URI; import java.nio.file.FileSystem; @@ -27,11 +27,12 @@ import org.objectweb.asm.tree.InvokeDynamicInsnNode; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.TypeInsnNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import matcher.Matcher; -import matcher.NameType; -import matcher.Util; -import matcher.type.Analysis.CommonClasses; +import matcher.model.NameType; +import matcher.model.Util; +import matcher.model.type.Analysis.CommonClasses; public class ClassFeatureExtractor implements LocalClassEnv { public ClassFeatureExtractor(ClassEnvironment env) { @@ -241,7 +242,7 @@ private void processClassB(ClassInstance cls) { private void processMethodInsns(MethodInstance method) { if (!method.isReal()) { // artificial method to capture calls to types with incomplete/unknown hierarchy/super type method info - Matcher.LOGGER.debug("Skipping empty method {}", method); + logger.debug("Skipping empty method {}", method); return; } @@ -304,7 +305,7 @@ private void processMethodInsns(MethodInstance method) { Util.isCallToInterface(impl), impl.getTag() == Opcodes.H_INVOKESTATIC); break; default: - Matcher.LOGGER.warn("Unexpected impl tag: {}", impl.getTag()); + logger.warn("Unexpected impl tag: {}", impl.getTag()); } break; @@ -329,7 +330,7 @@ private MethodInstance resolveMethod(String owner, String name, String desc, boo MethodInstance ret = cls.resolveMethod(name, desc, toInterface); if (ret == null && create) { - Matcher.LOGGER.trace("Creating synthetic method {}/{}{}", owner, name, desc); + logger.trace("Creating synthetic method {}/{}{}", owner, name, desc); ret = new MethodInstance(cls, name, desc, isStatic); cls.addMethod(ret); @@ -723,6 +724,7 @@ public ClassEnv getOther() { return this == env.getEnvA() ? env.getEnvB() : env.getEnvA(); } + private static final Logger logger = LoggerFactory.getLogger(ClassFeatureExtractor.class); final ClassEnvironment env; private final List inputFiles = new ArrayList<>(); private final List cpFiles = new ArrayList<>(); diff --git a/src/main/java/matcher/type/ClassInstance.java b/matcher-model/src/main/java/matcher/model/type/ClassInstance.java similarity index 99% rename from src/main/java/matcher/type/ClassInstance.java rename to matcher-model/src/main/java/matcher/model/type/ClassInstance.java index 30ce62db..d6cc1973 100644 --- a/src/main/java/matcher/type/ClassInstance.java +++ b/matcher-model/src/main/java/matcher/model/type/ClassInstance.java @@ -1,4 +1,4 @@ -package matcher.type; +package matcher.model.type; import java.net.URI; import java.util.ArrayDeque; @@ -19,13 +19,13 @@ import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.ClassNode; -import matcher.NameType; -import matcher.SimilarityChecker; -import matcher.Util; -import matcher.bcremap.AsmClassRemapper; -import matcher.bcremap.AsmRemapper; -import matcher.classifier.ClassifierUtil; -import matcher.type.Signature.ClassSignature; +import matcher.model.bcremap.AsmClassRemapper; +import matcher.model.bcremap.AsmRemapper; +import matcher.model.classifier.ClassifierUtil; +import matcher.model.NameType; +import matcher.model.SimilarityChecker; +import matcher.model.Util; +import matcher.model.type.Signature.ClassSignature; public final class ClassInstance implements ParentInstance, Matchable { /** diff --git a/src/main/java/matcher/type/FieldInstance.java b/matcher-model/src/main/java/matcher/model/type/FieldInstance.java similarity index 95% rename from src/main/java/matcher/type/FieldInstance.java rename to matcher-model/src/main/java/matcher/model/type/FieldInstance.java index 4021042e..bad37d26 100644 --- a/src/main/java/matcher/type/FieldInstance.java +++ b/matcher-model/src/main/java/matcher/model/type/FieldInstance.java @@ -1,4 +1,4 @@ -package matcher.type; +package matcher.model.type; import java.util.List; import java.util.Set; @@ -7,10 +7,10 @@ import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.FieldNode; -import matcher.NameType; -import matcher.Util; -import matcher.classifier.ClassifierUtil; -import matcher.type.Signature.FieldSignature; +import matcher.model.classifier.ClassifierUtil; +import matcher.model.NameType; +import matcher.model.Util; +import matcher.model.type.Signature.FieldSignature; public final class FieldInstance extends MemberInstance { /** diff --git a/src/main/java/matcher/type/InputFile.java b/matcher-model/src/main/java/matcher/model/type/InputFile.java similarity index 99% rename from src/main/java/matcher/type/InputFile.java rename to matcher-model/src/main/java/matcher/model/type/InputFile.java index fe445112..ebea5560 100644 --- a/src/main/java/matcher/type/InputFile.java +++ b/matcher-model/src/main/java/matcher/model/type/InputFile.java @@ -1,4 +1,4 @@ -package matcher.type; +package matcher.model.type; import java.io.IOException; import java.io.UncheckedIOException; diff --git a/src/main/java/matcher/type/InvalidSharedEnvException.java b/matcher-model/src/main/java/matcher/model/type/InvalidSharedEnvException.java similarity index 93% rename from src/main/java/matcher/type/InvalidSharedEnvException.java rename to matcher-model/src/main/java/matcher/model/type/InvalidSharedEnvException.java index cfb0493f..f42dfa76 100644 --- a/src/main/java/matcher/type/InvalidSharedEnvException.java +++ b/matcher-model/src/main/java/matcher/model/type/InvalidSharedEnvException.java @@ -1,4 +1,4 @@ -package matcher.type; +package matcher.model.type; @SuppressWarnings("serial") public final class InvalidSharedEnvException extends RuntimeException { diff --git a/src/main/java/matcher/type/InvalidSharedEnvQueryException.java b/matcher-model/src/main/java/matcher/model/type/InvalidSharedEnvQueryException.java similarity index 95% rename from src/main/java/matcher/type/InvalidSharedEnvQueryException.java rename to matcher-model/src/main/java/matcher/model/type/InvalidSharedEnvQueryException.java index 84191d36..8119e5a4 100644 --- a/src/main/java/matcher/type/InvalidSharedEnvQueryException.java +++ b/matcher-model/src/main/java/matcher/model/type/InvalidSharedEnvQueryException.java @@ -1,4 +1,4 @@ -package matcher.type; +package matcher.model.type; @SuppressWarnings("serial") public final class InvalidSharedEnvQueryException extends RuntimeException { diff --git a/src/main/java/matcher/type/LocalClassEnv.java b/matcher-model/src/main/java/matcher/model/type/LocalClassEnv.java similarity index 65% rename from src/main/java/matcher/type/LocalClassEnv.java rename to matcher-model/src/main/java/matcher/model/type/LocalClassEnv.java index aa4dbc7d..fada78f4 100644 --- a/src/main/java/matcher/type/LocalClassEnv.java +++ b/matcher-model/src/main/java/matcher/model/type/LocalClassEnv.java @@ -1,4 +1,4 @@ -package matcher.type; +package matcher.model.type; public interface LocalClassEnv extends ClassEnv { } diff --git a/src/main/java/matcher/type/MatchType.java b/matcher-model/src/main/java/matcher/model/type/MatchType.java similarity index 68% rename from src/main/java/matcher/type/MatchType.java rename to matcher-model/src/main/java/matcher/model/type/MatchType.java index c7869bc0..e709be3b 100644 --- a/src/main/java/matcher/type/MatchType.java +++ b/matcher-model/src/main/java/matcher/model/type/MatchType.java @@ -1,4 +1,4 @@ -package matcher.type; +package matcher.model.type; public enum MatchType { Class, Method, Field, MethodVar; diff --git a/src/main/java/matcher/type/Matchable.java b/matcher-model/src/main/java/matcher/model/type/Matchable.java similarity index 92% rename from src/main/java/matcher/type/Matchable.java rename to matcher-model/src/main/java/matcher/model/type/Matchable.java index 5171e011..165cb195 100644 --- a/src/main/java/matcher/type/Matchable.java +++ b/matcher-model/src/main/java/matcher/model/type/Matchable.java @@ -1,6 +1,6 @@ -package matcher.type; +package matcher.model.type; -import matcher.NameType; +import matcher.model.NameType; public interface Matchable> { MatchableKind getKind(); diff --git a/src/main/java/matcher/type/MatchableKind.java b/matcher-model/src/main/java/matcher/model/type/MatchableKind.java similarity index 82% rename from src/main/java/matcher/type/MatchableKind.java rename to matcher-model/src/main/java/matcher/model/type/MatchableKind.java index 8e0f6686..bce9dd2d 100644 --- a/src/main/java/matcher/type/MatchableKind.java +++ b/matcher-model/src/main/java/matcher/model/type/MatchableKind.java @@ -1,4 +1,4 @@ -package matcher.type; +package matcher.model.type; public enum MatchableKind { CLASS, FIELD, METHOD, METHOD_ARG, METHOD_VAR; diff --git a/src/main/java/matcher/type/MemberHierarchyData.java b/matcher-model/src/main/java/matcher/model/type/MemberHierarchyData.java similarity index 95% rename from src/main/java/matcher/type/MemberHierarchyData.java rename to matcher-model/src/main/java/matcher/model/type/MemberHierarchyData.java index ecf23f51..534cbb7d 100644 --- a/src/main/java/matcher/type/MemberHierarchyData.java +++ b/matcher-model/src/main/java/matcher/model/type/MemberHierarchyData.java @@ -1,4 +1,4 @@ -package matcher.type; +package matcher.model.type; import java.util.Set; diff --git a/src/main/java/matcher/type/MemberInstance.java b/matcher-model/src/main/java/matcher/model/type/MemberInstance.java similarity index 98% rename from src/main/java/matcher/type/MemberInstance.java rename to matcher-model/src/main/java/matcher/model/type/MemberInstance.java index ca863472..df764ce4 100644 --- a/src/main/java/matcher/type/MemberInstance.java +++ b/matcher-model/src/main/java/matcher/model/type/MemberInstance.java @@ -1,4 +1,4 @@ -package matcher.type; +package matcher.model.type; import java.util.Collections; import java.util.Comparator; @@ -6,9 +6,9 @@ import org.objectweb.asm.Opcodes; -import matcher.NameType; -import matcher.SimilarityChecker; -import matcher.Util; +import matcher.model.NameType; +import matcher.model.SimilarityChecker; +import matcher.model.Util; public abstract class MemberInstance> implements Matchable { @SuppressWarnings("unchecked") diff --git a/src/main/java/matcher/type/MethodInstance.java b/matcher-model/src/main/java/matcher/model/type/MethodInstance.java similarity index 98% rename from src/main/java/matcher/type/MethodInstance.java rename to matcher-model/src/main/java/matcher/model/type/MethodInstance.java index 8b74f04b..69e5d600 100644 --- a/src/main/java/matcher/type/MethodInstance.java +++ b/matcher-model/src/main/java/matcher/model/type/MethodInstance.java @@ -1,4 +1,4 @@ -package matcher.type; +package matcher.model.type; import java.net.URI; import java.util.ArrayList; @@ -15,10 +15,10 @@ import org.objectweb.asm.tree.LocalVariableNode; import org.objectweb.asm.tree.MethodNode; -import matcher.NameType; -import matcher.Util; -import matcher.classifier.ClassifierUtil; -import matcher.type.Signature.MethodSignature; +import matcher.model.classifier.ClassifierUtil; +import matcher.model.NameType; +import matcher.model.Util; +import matcher.model.type.Signature.MethodSignature; public final class MethodInstance extends MemberInstance implements ParentInstance { /** diff --git a/src/main/java/matcher/type/MethodType.java b/matcher-model/src/main/java/matcher/model/type/MethodType.java similarity index 74% rename from src/main/java/matcher/type/MethodType.java rename to matcher-model/src/main/java/matcher/model/type/MethodType.java index 0928cbae..346a4d36 100644 --- a/src/main/java/matcher/type/MethodType.java +++ b/matcher-model/src/main/java/matcher/model/type/MethodType.java @@ -1,4 +1,4 @@ -package matcher.type; +package matcher.model.type; public enum MethodType { UNKNOWN, OTHER, CLASS_INIT, CONSTRUCTOR, LAMBDA_IMPL; diff --git a/src/main/java/matcher/type/MethodVarInstance.java b/matcher-model/src/main/java/matcher/model/type/MethodVarInstance.java similarity index 97% rename from src/main/java/matcher/type/MethodVarInstance.java rename to matcher-model/src/main/java/matcher/model/type/MethodVarInstance.java index 5911789e..d01f07ef 100644 --- a/src/main/java/matcher/type/MethodVarInstance.java +++ b/matcher-model/src/main/java/matcher/model/type/MethodVarInstance.java @@ -1,9 +1,9 @@ -package matcher.type; +package matcher.model.type; -import matcher.NameType; -import matcher.SimilarityChecker; -import matcher.Util; -import matcher.classifier.ClassifierUtil; +import matcher.model.classifier.ClassifierUtil; +import matcher.model.NameType; +import matcher.model.SimilarityChecker; +import matcher.model.Util; public final class MethodVarInstance implements Matchable { MethodVarInstance(MethodInstance method, boolean isArg, int index, int lvIndex, int asmIndex, diff --git a/src/main/java/matcher/type/ParentInstance.java b/matcher-model/src/main/java/matcher/model/type/ParentInstance.java similarity index 70% rename from src/main/java/matcher/type/ParentInstance.java rename to matcher-model/src/main/java/matcher/model/type/ParentInstance.java index ee24eb83..56faaeb0 100644 --- a/src/main/java/matcher/type/ParentInstance.java +++ b/matcher-model/src/main/java/matcher/model/type/ParentInstance.java @@ -1,4 +1,4 @@ -package matcher.type; +package matcher.model.type; public interface ParentInstance { boolean hasMappedChildren(); diff --git a/src/main/java/matcher/type/Signature.java b/matcher-model/src/main/java/matcher/model/type/Signature.java similarity index 99% rename from src/main/java/matcher/type/Signature.java rename to matcher-model/src/main/java/matcher/model/type/Signature.java index d149188d..d3679e4e 100644 --- a/src/main/java/matcher/type/Signature.java +++ b/matcher-model/src/main/java/matcher/model/type/Signature.java @@ -1,11 +1,11 @@ -package matcher.type; +package matcher.model.type; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import matcher.NameType; -import matcher.classifier.ClassifierUtil; +import matcher.model.classifier.ClassifierUtil; +import matcher.model.NameType; public final class Signature { public static final class ClassSignature implements PotentialComparable { diff --git a/matcher-model/src/main/java/module-info.java b/matcher-model/src/main/java/module-info.java new file mode 100644 index 00000000..2c609c46 --- /dev/null +++ b/matcher-model/src/main/java/module-info.java @@ -0,0 +1,17 @@ +module matcher.model { + requires java.prefs; + requires org.objectweb.asm.commons; + requires org.objectweb.asm.tree.analysis; + requires org.objectweb.asm.util; + requires transitive net.fabricmc.mappingio; + requires transitive org.objectweb.asm; + requires transitive org.objectweb.asm.tree; + requires transitive org.slf4j; + + exports matcher.model; + exports matcher.model.bcremap; + exports matcher.model.classifier; + exports matcher.model.config; + exports matcher.model.mapping; + exports matcher.model.type; +} diff --git a/settings.gradle b/settings.gradle index 797324ea..6aa5ded3 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,3 +11,8 @@ pluginManagement { } rootProject.name = 'matcher' + +include 'matcher-model' +include 'matcher-core' +include 'matcher-cli' +include 'matcher-gui' diff --git a/src/main/java/matcher/Main.java b/src/main/java/matcher/Main.java deleted file mode 100644 index 50614ddc..00000000 --- a/src/main/java/matcher/Main.java +++ /dev/null @@ -1,14 +0,0 @@ -package matcher; - -import javafx.application.Application; - -import matcher.config.Config; -import matcher.gui.Gui; - -public class Main { - public static void main(String[] args) { - Config.init(args); - PluginLoader.run(args); - Application.launch(Gui.class, args); - } -} diff --git a/src/main/java/matcher/gui/ISelectionProvider.java b/src/main/java/matcher/gui/ISelectionProvider.java deleted file mode 100644 index 3bbb9296..00000000 --- a/src/main/java/matcher/gui/ISelectionProvider.java +++ /dev/null @@ -1,21 +0,0 @@ -package matcher.gui; - -import matcher.classifier.RankResult; -import matcher.type.ClassInstance; -import matcher.type.FieldInstance; -import matcher.type.MatchType; -import matcher.type.MemberInstance; -import matcher.type.MethodInstance; -import matcher.type.MethodVarInstance; - -public interface ISelectionProvider { - ClassInstance getSelectedClass(); - MemberInstance getSelectedMember(); - MethodInstance getSelectedMethod(); - FieldInstance getSelectedField(); - MethodVarInstance getSelectedMethodVar(); - - default RankResult getSelectedRankResult(MatchType type) { - return null; - } -} diff --git a/src/main/java/matcher/srcprocess/Decompiler.java b/src/main/java/matcher/srcprocess/Decompiler.java deleted file mode 100644 index 32c0fb08..00000000 --- a/src/main/java/matcher/srcprocess/Decompiler.java +++ /dev/null @@ -1,9 +0,0 @@ -package matcher.srcprocess; - -import matcher.NameType; -import matcher.type.ClassFeatureExtractor; -import matcher.type.ClassInstance; - -public interface Decompiler { - String decompile(ClassInstance cls, ClassFeatureExtractor extractor, NameType nameType); -} diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java deleted file mode 100644 index 3ac85dbe..00000000 --- a/src/main/java/module-info.java +++ /dev/null @@ -1,35 +0,0 @@ -module matcher { - exports matcher.config; - exports matcher.srcprocess; - exports matcher.gui; - exports matcher.gui.tab; - exports matcher.type; - exports matcher.gui.menu; - exports matcher.mapping; - exports matcher.classifier; - exports matcher; - exports matcher.bcremap; - exports matcher.serdes; - - requires transitive org.slf4j; - requires cfr; - requires com.github.javaparser.core; - requires org.vineflower.vineflower; - requires java.prefs; - requires transitive javafx.base; - requires transitive javafx.controls; - requires transitive javafx.graphics; - requires transitive javafx.web; - requires transitive org.objectweb.asm; - requires transitive org.objectweb.asm.tree; - requires org.objectweb.asm.commons; - requires org.objectweb.asm.tree.analysis; - requires org.objectweb.asm.util; - requires procyon.compilertools; - requires jadx.core; - requires jadx.plugins.api; - requires jadx.plugins.java_input; - requires transitive net.fabricmc.mappingio; - - uses matcher.Plugin; -}