Иконка ресурса

Gradle task, который реплейсит строки с MCP именами их SRG вариантами

Версия(и) Minecraft
*
Ещё один кусочек из chiseled-me.
Тут хитрости с доставанием и считыванием маппингов можно повырезать и просто обрабатывать исходные файлы каким-либо хитрым образом, заимплементив что-то вроде макросов, к примеру.

Тут вызовы метода srg с литеральной строкой и опциональным числом (вроде srg("hello") или srg("player", 3)) реплейсятся строками вроде "field_123".
Число - индекс нужно в том случае, если существуют несколько переменных "player", которые маппятся в разные SRG.

Очевидно, что в моём варианте вам нужен будет метод srg, который принимает строку (ну и для dev-а, её же и возвращает) и тот индекс.
Ну или можно там свой regex нафигачить, всё в ваших руках.

Вот собстно та таска:
Gradle (Groovy):
import net.minecraftforge.gradle.user.TaskSourceCopy

task postProcessSources {
    dependsOn += tasks.withType(TaskSourceCopy.class)
    doLast {
        def map = [:].withDefault { [] }
        genSrgs.mcpToSrg.eachLine {
            if(it.startsWith('CL: ')) {
                return
            }
            def mcp, srg
            def desc = null
            if (it.startsWith('MD: ')) {
                (mcp, desc, srg) = it.split(' ')[1..3]
            } else {
                (mcp, srg) = it.split(' ')[1..2]
            }
            def idx = mcp.lastIndexOf('/')
            def cls = mcp.substring(mcp.lastIndexOf('/', idx - 1) + 1, idx)
            srg = srg.substring(srg.lastIndexOf('/') + 1)
            map.get(mcp.substring(idx + 1)).add([srg: srg, cls: cls, desc: desc])
        }
        def notFound = [:].withDefault { 0 }
        def ambiguous = [:].withDefault { 0 }
        tasks.withType(TaskSourceCopy.class) {
            fileTree(it.getOutput()).each {
                it.text = it.text.replaceAll('srg\\(\\s*"(.*?)"(?:\\s*,\\s*"(.*?)")?(?:\\s*,\\s*"(.*?)")?\\s*\\)') {
                    def (mcp, cls, desc) = it[1..3]
                    def m = map.get(mcp)
                    if (cls == null && m.size > 1) {
                        ambiguous[mcp] += 1
                        return "\"$mcp\""
                    }
                    def x = m.size == 1 ? m.get(0) : m.find { it.cls == cls && (desc == null || desc == it.desc) }
                    if (x == null) {
                        notFound[mcp] += 1
                        return "\"$mcp\""
                    }
                    return "\"$x\""
                }
            }
        }
        if (!notFound.isEmpty() || !ambiguous.isEmpty()) {
            def fn = { it.getKey() + (it.getValue() > 1 ? " (${it.getValue()} times)" : '') }
            throw new IllegalStateException("\nProcessing SRG literals failed:\n" +
                    (!notFound.isEmpty() ? "  * Mappings not found for:\n" +
                            "    - ${notFound.collect(fn).join("\n    - ")}\n" : "") +
                    (!ambiguous.isEmpty() ? "  * Multiple mappings exist but class is not clarified for:\n" +
                            "    - ${ambiguous.collect(fn).join("\n    - ")}\n" : ''))
        }
    }
}

tasks.withType(AbstractCompile) {
    it.dependsOn(postProcessSources)
}

А вот тут за вас я уже повырезал всё лишнее, изгаляйтесь над исходниками, как хотите:
Gradle (Groovy):
import net.minecraftforge.gradle.user.TaskSourceCopy

task postProcessSources {
    dependsOn += tasks.withType(TaskSourceCopy.class)
    doLast {
        tasks.withType(TaskSourceCopy.class) {
            fileTree(it.getOutput()).each {
                it.text = it.text // here you can do anything with it.text
            }
        }
    }
}

tasks.withType(AbstractCompile) {
    it.dependsOn(postProcessSources)
}

UPD: индексы себя не оправдали, потому-что очень много повторяющихся маппингов, и искать для каждого индекс (вроде 25 для "player") в маппинге - нифига не круто, нафиг вся эта таска спрашивается, если всё-равно надо просматривать те маппинги.
Крч теперь я считываю полный маппинг (не csv, а srg, тот что от MCP) и уточнение делается не индексом, а коротким названием файла, так намного лучше)
+ мне ещё один раз пригодилось, когда оверлоады, то там для методов можно и desc указать.
Автор
necauqua
Просмотры
812
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя necauqua

Сверху