Bump ForgeSPI version, and add support for DistCleaner stripping interfaces from classes.

Add more detail to VersionChecker log info.
This commit is contained in:
LexManos 2019-05-06 15:52:12 -07:00
parent 616416569b
commit a7204b5cd3
3 changed files with 48 additions and 6 deletions

View File

@ -291,7 +291,7 @@ project(':forge') {
installer 'cpw.mods:modlauncher:1.0.+' installer 'cpw.mods:modlauncher:1.0.+'
installer 'net.minecraftforge:accesstransformers:0.16.+:shadowed' installer 'net.minecraftforge:accesstransformers:0.16.+:shadowed'
installer 'net.minecraftforge:eventbus:0.8.+:service' installer 'net.minecraftforge:eventbus:0.8.+:service'
installer 'net.minecraftforge:forgespi:0.11.+' installer 'net.minecraftforge:forgespi:0.12.+'
installer 'net.minecraftforge:coremods:0.4.+' installer 'net.minecraftforge:coremods:0.4.+'
installer 'net.minecraftforge:unsafe:0.2.+' installer 'net.minecraftforge:unsafe:0.2.+'
installer 'com.electronwill.night-config:core:3.6.0' installer 'com.electronwill.night-config:core:3.6.0'

View File

@ -20,17 +20,20 @@
package net.minecraftforge.fml.loading; package net.minecraftforge.fml.loading;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.stream.Collectors;
import com.google.common.collect.Streams; import com.google.common.collect.Streams;
import cpw.mods.modlauncher.serviceapi.ILaunchPluginService; import cpw.mods.modlauncher.serviceapi.ILaunchPluginService;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.api.distmarker.OnlyIns;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.Marker;
@ -51,6 +54,7 @@ public class RuntimeDistCleaner implements ILaunchPluginService
private static final Marker DISTXFORM = MarkerManager.getMarker("DISTXFORM"); private static final Marker DISTXFORM = MarkerManager.getMarker("DISTXFORM");
private static String DIST; private static String DIST;
private static final String ONLYIN = Type.getDescriptor(OnlyIn.class); private static final String ONLYIN = Type.getDescriptor(OnlyIn.class);
private static final String ONLYINS = Type.getDescriptor(OnlyIns.class);
@Override @Override
public String name() public String name()
{ {
@ -67,6 +71,34 @@ public class RuntimeDistCleaner implements ILaunchPluginService
throw new RuntimeException("Attempted to load class "+ classNode.name + " for invalid dist "+ DIST); throw new RuntimeException("Attempted to load class "+ classNode.name + " for invalid dist "+ DIST);
} }
if (classNode.interfaces != null )
{
unpack(classNode.visibleAnnotations).stream()
.filter(ann->Objects.equals(ann.desc, ONLYIN))
.filter(ann->ann.values.indexOf("_interface") != -1)
.filter(ann->!Objects.equals(((String[])ann.values.get(ann.values.indexOf("value") + 1))[1], DIST))
.map(ann -> ((Type)ann.values.get(ann.values.indexOf("_interface") + 1)).getInternalName())
.forEach(intf -> {
if (classNode.interfaces.remove(intf)) {
LOGGER.debug(DISTXFORM,"Removing Interface: {} implements {}", classNode.name, intf);
changes.compareAndSet(false, true);
}
});
//Remove Class level @OnlyIn/@OnlyIns annotations, this is important if anyone gets ambitious and tries to reflect an annotation with _interface set.
if (classNode.visibleAnnotations != null) {
Iterator<AnnotationNode> itr = classNode.visibleAnnotations.iterator();
while (itr.hasNext()) {
AnnotationNode ann = itr.next();
if (Objects.equals(ann.desc, ONLYIN) || Objects.equals(ann.desc, ONLYINS)) {
LOGGER.debug(DISTXFORM,"Removing Class Annotation: {} @{}", classNode.name, ann.desc);
itr.remove();
changes.compareAndSet(false, true);
}
}
}
}
Iterator<FieldNode> fields = classNode.fields.iterator(); Iterator<FieldNode> fields = classNode.fields.iterator();
while(fields.hasNext()) while(fields.hasNext())
{ {
@ -118,10 +150,22 @@ public class RuntimeDistCleaner implements ILaunchPluginService
return changes.get(); return changes.get();
} }
@SuppressWarnings("unchecked")
private static List<AnnotationNode> unpack(final List<AnnotationNode> anns) {
if (anns == null) return Collections.emptyList();
List<AnnotationNode> ret = anns.stream().filter(ann->Objects.equals(ann.desc, ONLYIN)).collect(Collectors.toList());
anns.stream().filter(ann->Objects.equals(ann.desc, ONLYINS) && ann.values != null)
.map( ann -> (List<AnnotationNode>)ann.values.get(ann.values.indexOf("value") + 1))
.filter(v -> v != null)
.forEach(v -> v.forEach(ret::add));
return ret;
}
private boolean remove(final List<AnnotationNode> anns, final String side) private boolean remove(final List<AnnotationNode> anns, final String side)
{ {
return !(anns == null) && anns.stream(). return unpack(anns).stream().
filter(ann->Objects.equals(ann.desc, ONLYIN)). filter(ann->Objects.equals(ann.desc, ONLYIN)).
filter(ann->ann.values.indexOf("_interface") == -1).
anyMatch(ann -> !Objects.equals(((String[])ann.values.get(ann.values.indexOf("value")+1))[1], side)); anyMatch(ann -> !Objects.equals(((String[])ann.values.get(ann.values.indexOf("value")+1))[1], side));
} }

View File

@ -235,17 +235,15 @@ public class VersionChecker
{ {
ComparableVersion latest = new ComparableVersion(lat); ComparableVersion latest = new ComparableVersion(lat);
if (current.compareTo(latest) < 0) if (current.compareTo(latest) < 0)
{
status = BETA_OUTDATED; status = BETA_OUTDATED;
target = latest;
}
else else
status = BETA; status = BETA;
target = latest;
} }
else else
status = BETA; status = BETA;
LOGGER.info("[{}] Found status: {} Target: {}", mod.getModId(), status, target); LOGGER.info("[{}] Found status: {} Current: {} Target: {}", mod.getModId(), status, current, target);
changes = new LinkedHashMap<>(); changes = new LinkedHashMap<>();
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")