diff --git a/build.gradle b/build.gradle index 8807cf0..5bfd6b7 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ plugins { } group 'io.izzel.taboolib' -version '1.5' +version '1.6' configurations { embed diff --git a/src/main/groovy/io/izzel/taboolib/gradle/IsolatedAnnotationVisitor.groovy b/src/main/groovy/io/izzel/taboolib/gradle/IsolatedAnnotationVisitor.groovy new file mode 100644 index 0000000..073a2b2 --- /dev/null +++ b/src/main/groovy/io/izzel/taboolib/gradle/IsolatedAnnotationVisitor.groovy @@ -0,0 +1,42 @@ +package io.izzel.taboolib.gradle + +import org.gradle.api.Project +import org.objectweb.asm.AnnotationVisitor +import org.objectweb.asm.Opcodes +import org.objectweb.asm.Type + +class IsolatedAnnotationVisitor extends AnnotationVisitor { + + String name + Project project + TabooLibClassVisitor parent + + IsolatedAnnotationVisitor(AnnotationVisitor annotationVisitor, project, name, parent) { + super(Opcodes.ASM7, annotationVisitor) + this.name = name + this.project = project + this.parent = parent + this.parent.isolated[name] = new ArrayList<>() + } + + @Override + AnnotationVisitor visitArray(String name) { + return new IsolatedExcludeAnnotationVisitor(super.visitArray(name), this) + } + + class IsolatedExcludeAnnotationVisitor extends AnnotationVisitor { + + IsolatedAnnotationVisitor parent + + IsolatedExcludeAnnotationVisitor(AnnotationVisitor annotationVisitor, parent) { + super(Opcodes.ASM7, annotationVisitor) + this.parent = parent + } + + @Override + void visit(String name, Object value) { + parent.parent.isolated[parent.name] += (value as Type).className + super.visit(name, value) + } + } +} diff --git a/src/main/groovy/io/izzel/taboolib/gradle/RelocateJar.groovy b/src/main/groovy/io/izzel/taboolib/gradle/RelocateJar.groovy index 915876c..8faa7da 100644 --- a/src/main/groovy/io/izzel/taboolib/gradle/RelocateJar.groovy +++ b/src/main/groovy/io/izzel/taboolib/gradle/RelocateJar.groovy @@ -41,6 +41,7 @@ class RelocateJar extends DefaultTask { def name = inJar.name.substring(0, index) + (classifier == null ? "" : "-" + classifier) + inJar.name.substring(index) def outJar = new File(inJar.getParentFile(), name) def tmpOut = File.createTempFile(name, ".jar") + def isolated = new HashMap>() new JarOutputStream(new FileOutputStream(tmpOut)).withCloseable { out -> project.logger.info(outJar.getAbsolutePath()) int n @@ -54,6 +55,7 @@ class RelocateJar extends DefaultTask { def writer = new ClassWriter(0) def visitor = new TabooLibClassVisitor(writer, project) reader.accept(new ClassRemapper(visitor, remapper), 0) + isolated.putAll(visitor.isolated) out.putNextEntry(new JarEntry(remapper.map(jarEntry.name))) out.write(writer.toByteArray()) } else { diff --git a/src/main/groovy/io/izzel/taboolib/gradle/TabooLibClassVisitor.groovy b/src/main/groovy/io/izzel/taboolib/gradle/TabooLibClassVisitor.groovy index 51b1db9..fc525aa 100644 --- a/src/main/groovy/io/izzel/taboolib/gradle/TabooLibClassVisitor.groovy +++ b/src/main/groovy/io/izzel/taboolib/gradle/TabooLibClassVisitor.groovy @@ -7,19 +7,34 @@ import org.objectweb.asm.Opcodes class TabooLibClassVisitor extends ClassVisitor { + String name Project project + Map> isolated = new HashMap() TabooLibClassVisitor(ClassVisitor classVisitor, Project project) { super(Opcodes.ASM7, classVisitor); this.project = project } + @Override + void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { + this.name = name + super.visit(version, access, name, signature, superName, interfaces) + } + @Override AnnotationVisitor visitAnnotation(String descriptor, boolean visible) { - if (descriptor == "Lorg/spongepowered/api/plugin/Plugin;") { + if (descriptor == "L${project.group.replace('.', '/')}/taboolib/common/Isolated;") { + return new IsolatedAnnotationVisitor(super.visitAnnotation(descriptor, visible), project, name, this) + } else if (descriptor == "Lorg/spongepowered/api/plugin/Plugin;") { return new SpongeAnnotationVisitor(super.visitAnnotation(descriptor, visible), project) } else { return super.visitAnnotation(descriptor, visible) } } + + @Override + void visitEnd() { + super.visitEnd() + } } diff --git a/src/main/groovy/io/izzel/taboolib/gradle/TabooLibPlugin.groovy b/src/main/groovy/io/izzel/taboolib/gradle/TabooLibPlugin.groovy index 2e10647..c5aa3da 100644 --- a/src/main/groovy/io/izzel/taboolib/gradle/TabooLibPlugin.groovy +++ b/src/main/groovy/io/izzel/taboolib/gradle/TabooLibPlugin.groovy @@ -29,7 +29,7 @@ class TabooLibPlugin implements Plugin { task.inJar = task.inJar ?: jarTask.archivePath task.relocations = tabooExt.relocation task.classifier = tabooExt.classifier - task.relocations['taboolib'] = task.relocations['taboolib'] ?: project.group.toString() + '.taboolib' + task.relocations['taboolib'] = project.group.toString() + '.taboolib' } } }