96 lines
2.5 KiB
Groovy
96 lines
2.5 KiB
Groovy
package net.minecraftforge.forge.tasks
|
|
|
|
import java.util.ArrayList
|
|
import java.util.TreeMap
|
|
|
|
import org.gradle.api.DefaultTask
|
|
import org.gradle.api.tasks.InputFile
|
|
import org.gradle.api.tasks.InputFiles
|
|
import org.gradle.api.tasks.TaskAction
|
|
|
|
import org.objectweb.asm.ClassReader
|
|
import org.objectweb.asm.ClassVisitor
|
|
import org.objectweb.asm.MethodVisitor
|
|
import org.objectweb.asm.Opcodes
|
|
import org.objectweb.asm.Type
|
|
|
|
import java.util.zip.ZipEntry
|
|
import java.util.zip.ZipInputStream
|
|
|
|
public class CheckExcs extends DefaultTask {
|
|
@InputFile File binary
|
|
@InputFiles File[] excs
|
|
|
|
@TaskAction
|
|
protected void exec() {
|
|
Util.init()
|
|
def known = []
|
|
binary.withInputStream { i ->
|
|
new ZipInputStream(i).withCloseable { zin ->
|
|
def visitor = new ClassVisitor(Opcodes.ASM7) {
|
|
private String cls
|
|
@Override
|
|
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
|
|
this.cls = name
|
|
}
|
|
|
|
@Override
|
|
public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
|
|
known.add(this.cls + '.' + name + descriptor)
|
|
super.visitMethod(access, name, descriptor, signature, exceptions)
|
|
}
|
|
}
|
|
ZipEntry zein
|
|
while ((zein = zin.nextEntry) != null) {
|
|
if (zein.name.endsWith('.class')) {
|
|
ClassReader reader = new ClassReader(zin)
|
|
reader.accept(visitor, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
excs.each { f ->
|
|
def lines = []
|
|
f.eachLine { line ->
|
|
def idx = line.indexOf('#')
|
|
if (idx == 0 || line.isEmpty()) {
|
|
return
|
|
}
|
|
|
|
def comment = idx == -1 ? null : line.substring(idx)
|
|
if (idx != -1) line = line.substring(0, idx - 1)
|
|
|
|
if (!line.contains('=')) {
|
|
println('Invalid: ' + line)
|
|
return
|
|
}
|
|
|
|
def (key, value) = line.split('=', 2)
|
|
if (!known.contains(key)) {
|
|
println(key)
|
|
println('Invalid: ' + line)
|
|
return
|
|
}
|
|
|
|
def (cls, desc) = key.split('\\.', 2)
|
|
if (!desc.contains('(')) {
|
|
println('Invalid: ' + line)
|
|
return
|
|
}
|
|
def name = desc.split('\\(', 2)[0]
|
|
desc = '(' + desc.split('\\(', 2)[1]
|
|
|
|
def (exceptions, args) = value.contains('|') ? value.split('|', 2) : [value, '']
|
|
|
|
if (args.split(',').length != Type.getArgumentTypes(desc).length) {
|
|
println('Invalid: ' + line)
|
|
return
|
|
}
|
|
lines.add(line)
|
|
}
|
|
f.text = lines.sort().join('\n')
|
|
}
|
|
}
|
|
}
|