Compare commits

..

4 Commits

Author SHA1 Message Date
Andreas Stadelmeier
21aa7e0e9c Merge branch 'master' into removeWildcards 2024-12-18 00:44:19 +01:00
Andreas Stadelmeier
bc4d7d1bc9 Remove further wildcards from Collectors 2024-12-17 20:39:01 +01:00
Andreas Stadelmeier
7c06bd67df Merge branch 'master' into removeWildcards 2024-12-17 16:35:03 +01:00
Andreas Stadelmeier
849209b8cb Set Source/Release Version to 24 always and remove Wildcards from Collectors.toList and toSet 2024-12-17 15:36:28 +01:00
9 changed files with 29 additions and 122 deletions

View File

@ -222,7 +222,7 @@ public final class Collectors {
* {@code Collection}, in encounter order * {@code Collection}, in encounter order
*/ */
public static <T, C extends Collection<T>> public static <T, C extends Collection<T>>
Collector<T, ?, C> toCollection(Supplier<C> collectionFactory) { Collector<T, C, C> toCollection(Supplier<C> collectionFactory) {
return new CollectorImpl<>(collectionFactory, Collection::add, return new CollectorImpl<>(collectionFactory, Collection::add,
(r1, r2) -> { r1.addAll(r2); return r1; }, (r1, r2) -> { r1.addAll(r2); return r1; },
CH_ID); CH_ID);
@ -239,7 +239,7 @@ public final class Collectors {
* {@code List}, in encounter order * {@code List}, in encounter order
*/ */
public static <T> public static <T>
Collector<T, ?, List<T>> toList() { Collector<T, ArrayList<Object>, List<T>> toList() {
return new CollectorImpl<>(ArrayList::new, List::add, return new CollectorImpl<>(ArrayList::new, List::add,
(left, right) -> { left.addAll(right); return left; }, (left, right) -> { left.addAll(right); return left; },
CH_ID); CH_ID);
@ -257,7 +257,7 @@ public final class Collectors {
* @since 10 * @since 10
*/ */
public static <T> public static <T>
Collector<T, ?, List<T>> toUnmodifiableList() { Collector<T, ArrayList<Object>, List<T>> toUnmodifiableList() {
return new CollectorImpl<>(ArrayList::new, List::add, return new CollectorImpl<>(ArrayList::new, List::add,
(left, right) -> { left.addAll(right); return left; }, (left, right) -> { left.addAll(right); return left; },
list -> { list -> {
@ -286,7 +286,7 @@ public final class Collectors {
* {@code Set} * {@code Set}
*/ */
public static <T> public static <T>
Collector<T, ?, Set<T>> toSet() { Collector<T, HashSet<Object>, Set<T>> toSet() {
return new CollectorImpl<>(HashSet::new, Set::add, return new CollectorImpl<>(HashSet::new, Set::add,
(left, right) -> { (left, right) -> {
if (left.size() < right.size()) { if (left.size() < right.size()) {
@ -315,7 +315,7 @@ public final class Collectors {
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <T> public static <T>
Collector<T, ?, Set<T>> toUnmodifiableSet() { Collector<T, HashSet<Object>, Set<T>> toUnmodifiableSet() {
return new CollectorImpl<>(HashSet::new, Set::add, return new CollectorImpl<>(HashSet::new, Set::add,
(left, right) -> { (left, right) -> {
if (left.size() < right.size()) { if (left.size() < right.size()) {
@ -335,7 +335,7 @@ public final class Collectors {
* @return a {@code Collector} that concatenates the input elements into a * @return a {@code Collector} that concatenates the input elements into a
* {@code String}, in encounter order * {@code String}, in encounter order
*/ */
public static Collector<CharSequence, ?, String> joining() { public static Collector<CharSequence, StringBuilder, String> joining() {
return new CollectorImpl<>( return new CollectorImpl<>(
StringBuilder::new, StringBuilder::append, StringBuilder::new, StringBuilder::append,
(r1, r2) -> { (r1, r2) -> {
@ -353,7 +353,7 @@ public final class Collectors {
* @return A {@code Collector} which concatenates CharSequence elements, * @return A {@code Collector} which concatenates CharSequence elements,
* separated by the specified delimiter, in encounter order * separated by the specified delimiter, in encounter order
*/ */
public static Collector<CharSequence, ?, String> joining(CharSequence delimiter) { public static Collector<CharSequence, StringJoiner, String> joining(CharSequence delimiter) {
return joining(delimiter, "", ""); return joining(delimiter, "", "");
} }
@ -370,7 +370,7 @@ public final class Collectors {
* @return A {@code Collector} which concatenates CharSequence elements, * @return A {@code Collector} which concatenates CharSequence elements,
* separated by the specified delimiter, in encounter order * separated by the specified delimiter, in encounter order
*/ */
public static Collector<CharSequence, ?, String> joining(CharSequence delimiter, public static Collector<CharSequence, StringJoiner, String> joining(CharSequence delimiter,
CharSequence prefix, CharSequence prefix,
CharSequence suffix) { CharSequence suffix) {
return new CollectorImpl<>( return new CollectorImpl<>(
@ -428,7 +428,7 @@ public final class Collectors {
* elements and provides the mapped results to the downstream collector * elements and provides the mapped results to the downstream collector
*/ */
public static <T, U, A, R> public static <T, U, A, R>
Collector<T, ?, R> mapping(Function<? super T, ? extends U> mapper, Collector<T, A, R> mapping(Function<? super T, ? extends U> mapper,
Collector<? super U, A, R> downstream) { Collector<? super U, A, R> downstream) {
BiConsumer<A, ? super U> downstreamAccumulator = downstream.accumulator(); BiConsumer<A, ? super U> downstreamAccumulator = downstream.accumulator();
return new CollectorImpl<>(downstream.supplier(), return new CollectorImpl<>(downstream.supplier(),
@ -473,7 +473,7 @@ public final class Collectors {
* @since 9 * @since 9
*/ */
public static <T, U, A, R> public static <T, U, A, R>
Collector<T, ?, R> flatMapping(Function<? super T, ? extends Stream<? extends U>> mapper, Collector<T, A, R> flatMapping(Function<? super T, ? extends Stream<? extends U>> mapper,
Collector<? super U, A, R> downstream) { Collector<? super U, A, R> downstream) {
BiConsumer<A, ? super U> downstreamAccumulator = downstream.accumulator(); BiConsumer<A, ? super U> downstreamAccumulator = downstream.accumulator();
return new CollectorImpl<>(downstream.supplier(), return new CollectorImpl<>(downstream.supplier(),
@ -904,9 +904,8 @@ public final class Collectors {
} }
} }
} }
return new CollectorImpl<>( return new CollectorImpl<>(
OptionalBox::new, OptionalBox::accept, OptionalBox::new, Consumer<T>::accept,
(a, b) -> { (a, b) -> {
if (b.present) a.accept(b.value); if (b.present) a.accept(b.value);
return a; return a;
@ -952,7 +951,7 @@ public final class Collectors {
* @see #reducing(BinaryOperator) * @see #reducing(BinaryOperator)
*/ */
public static <T, U> public static <T, U>
Collector<T, ?, U> reducing(U identity, Collector<T, U[], U> reducing(U identity,
Function<? super T, ? extends U> mapper, Function<? super T, ? extends U> mapper,
BinaryOperator<U> op) { BinaryOperator<U> op) {
return new CollectorImpl<>( return new CollectorImpl<>(
@ -1102,7 +1101,7 @@ public final class Collectors {
* @see #groupingByConcurrent(Function, Supplier, Collector) * @see #groupingByConcurrent(Function, Supplier, Collector)
*/ */
public static <T, K, D, A, M extends Map<K, D>> public static <T, K, D, A, M extends Map<K, D>>
Collector<T, ?, M> groupingBy(Function<? super T, ? extends K> classifier, Collector<T, Map<K,A>, M> groupingBy(Function<? super T, ? extends K> classifier,
Supplier<M> mapFactory, Supplier<M> mapFactory,
Collector<? super T, A, D> downstream) { Collector<? super T, A, D> downstream) {
Supplier<A> downstreamSupplier = downstream.supplier(); Supplier<A> downstreamSupplier = downstream.supplier();
@ -1260,7 +1259,7 @@ public final class Collectors {
* @see #groupingBy(Function, Supplier, Collector) * @see #groupingBy(Function, Supplier, Collector)
*/ */
public static <T, K, A, D, M extends ConcurrentMap<K, D>> public static <T, K, A, D, M extends ConcurrentMap<K, D>>
Collector<T, ?, M> groupingByConcurrent(Function<? super T, ? extends K> classifier, Collector<T, ConcurrentMap<K,A>, M> groupingByConcurrent(Function<? super T, ? extends K> classifier,
Supplier<M> mapFactory, Supplier<M> mapFactory,
Collector<? super T, A, D> downstream) { Collector<? super T, A, D> downstream) {
Supplier<A> downstreamSupplier = downstream.supplier(); Supplier<A> downstreamSupplier = downstream.supplier();
@ -1438,7 +1437,7 @@ public final class Collectors {
* @see #toConcurrentMap(Function, Function) * @see #toConcurrentMap(Function, Function)
*/ */
public static <T, K, U> public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper, Collector<T, Map<K,U>, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper) { Function<? super T, ? extends U> valueMapper) {
return new CollectorImpl<>(HashMap::new, return new CollectorImpl<>(HashMap::new,
uniqKeysMapAccumulator(keyMapper, valueMapper), uniqKeysMapAccumulator(keyMapper, valueMapper),

View File

@ -61,5 +61,4 @@ public interface MethodInvocationTree extends ExpressionTree {
* @return the arguments * @return the arguments
*/ */
List<? extends ExpressionTree> getArguments(); List<? extends ExpressionTree> getArguments();
String getOwner();
} }

View File

@ -71,15 +71,6 @@ public interface VariableTree extends StatementTree {
*/ */
Tree getType(); Tree getType();
/**
* 0 - no generic
* 1 - is a generic
* 2 - contains a generic
* 3 - contains a generic like List<List<X>>
* @return
*/
int deepestGeneric();
/** /**
* Returns the initializer for the variable, or {@code null} if none. * Returns the initializer for the variable, or {@code null} if none.
* @return the initializer * @return the initializer

View File

@ -201,7 +201,7 @@ public class BasicJavacTask extends JavacTask {
PlatformDescription platformProvider = context.get(PlatformDescription.class); PlatformDescription platformProvider = context.get(PlatformDescription.class);
//ANDI: Init our own plugin to count CC's //ANDI: Init our own plugin to count CC's
initPlugin(new WildcardFinderPlugin((s -> Log.instance(context).printRawLines(Log.WriterKind.NOTICE,s)))); initPlugin(new WildcardFinderPlugin((s -> Log.instance(context).printRawLines(s))));
if (platformProvider != null) { if (platformProvider != null) {
for (PluginInfo<Plugin> pluginDesc : platformProvider.getPlugins()) { for (PluginInfo<Plugin> pluginDesc : platformProvider.getPlugins()) {
java.util.List<String> options = java.util.List<String> options =

View File

@ -1,9 +1,10 @@
package com.sun.tools.javac.api; package com.sun.tools.javac.api;
import com.sun.source.tree.*; import com.sun.source.tree.CompilationUnitTree;
import com.sun.source.tree.MemberSelectTree;
import com.sun.source.tree.MethodInvocationTree;
import com.sun.source.util.*; import com.sun.source.util.*;
import javax.tools.JavaFileObject;
import java.io.IOException; import java.io.IOException;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -12,7 +13,6 @@ public class WildcardFinderPlugin extends TreeScanner<Void, Void> implements Plu
private final Consumer<String> logger; private final Consumer<String> logger;
public WildcardFinderPlugin(Consumer<String> logger){ public WildcardFinderPlugin(Consumer<String> logger){
this.logger = logger; this.logger = logger;
} }
@Override @Override
@ -39,45 +39,16 @@ public class WildcardFinderPlugin extends TreeScanner<Void, Void> implements Plu
javacTask.addTaskListener(this); javacTask.addTaskListener(this);
} }
String currentClassName = "";
Boolean noIncompatibleFields = true;
@Override
public Void visitClass(ClassTree node, Void unused) {
noIncompatibleFields = true;
try {
currentClassName = currentPackage + "." + node.getSimpleName().toString();
node.getMembers().forEach(typeDecl -> {
if (typeDecl instanceof VariableTree) {
logger.accept(preText + "Field Type: " + ((VariableTree) typeDecl).getType().toString());
logger.accept(preText + "deepestGeneric: " + ((VariableTree) typeDecl).deepestGeneric());
if (((VariableTree) typeDecl).deepestGeneric() >= 3) {
logger.accept(preText + "Field not Wildcard compatible");
noIncompatibleFields = false;
}
//logger.accept("deepestGeneric: " + ((VariableTree)((VariableTree) typeDecl).getType()).deepestGeneric());
}
});
} catch (Exception e) {}
if(noIncompatibleFields){
logger.accept(preText + "Wildcard compatible class");
}else{
logger.accept(preText + "Wildcard incompatible class");
}
return super.visitClass(node, unused);
}
String currentPackage = "";
String currentSource = ""; String currentSource = "";
String currentClassContent = ""; String currentClassContent = "";
@Override @Override
public Void visitCompilationUnit(CompilationUnitTree node, Void unused) { public Void visitCompilationUnit(CompilationUnitTree node, Void unused) {
//System.out.println(node.getSourceFile().getName()); //System.out.println(node.getSourceFile().getName());
currentPackage = node.getPackageName()!=null?node.getPackageName().toString():"";
currentSource = node.getSourceFile().getName(); currentSource = node.getSourceFile().getName();
try { try {
currentClassContent = String.valueOf(node.getSourceFile().getCharContent(true)); currentClassContent = String.valueOf(node.getSourceFile().getCharContent(true));
} catch (IOException e) { } catch (IOException e) {
logger.accept(preText + "error5: " + e);
} }
return super.visitCompilationUnit(node, unused); return super.visitCompilationUnit(node, unused);
} }
@ -100,8 +71,7 @@ public class WildcardFinderPlugin extends TreeScanner<Void, Void> implements Plu
var pos_field = node.getClass().getField("pos"); var pos_field = node.getClass().getField("pos");
type_field.setAccessible(true); type_field.setAccessible(true);
pos_field.setAccessible(true); pos_field.setAccessible(true);
//Some fields (or "members") do not have a type... TODO: fix this String typeText = type_field.get(node).toString();
String typeText = type_field.get(node)!=null?type_field.get(node).toString():"";
int methodPos = pos_field.getInt(node); int methodPos = pos_field.getInt(node);
if(typeText.contains("capture#")){ //we found a capture conversion if(typeText.contains("capture#")){ //we found a capture conversion
//System.out.println(node.getClass().getMethod("getStartPosition").invoke(node)); //System.out.println(node.getClass().getMethod("getStartPosition").invoke(node));
@ -118,8 +88,7 @@ public class WildcardFinderPlugin extends TreeScanner<Void, Void> implements Plu
} }
} catch (Throwable e){ } catch (Throwable e){
//System.out.println("Error in method invocation: " + e.getMessage()+ //System.out.println("Error in method invocation: " + e.getMessage()+
// " in "+currentSource); // " in "+currentSource);i
logger.accept(preText + "error4: " + e);
} }
return super.visitMemberSelect(node, unused); return super.visitMemberSelect(node, unused);
} }
@ -149,11 +118,6 @@ public class WildcardFinderPlugin extends TreeScanner<Void, Void> implements Plu
if(typeText.contains("capture#") && methString.startsWith("<")){ //we found a capture conversion if(typeText.contains("capture#") && methString.startsWith("<")){ //we found a capture conversion
//System.out.println(node.getClass().getMethod("getStartPosition").invoke(node)); //System.out.println(node.getClass().getMethod("getStartPosition").invoke(node));
logger.accept(preText + "CC!: "+ "Arg#"+argumentNumber + ": " + typeText + " in " + currentSource + " " + lineOfPosition(currentClassContent,methodPos) + " of method " + methString); logger.accept(preText + "CC!: "+ "Arg#"+argumentNumber + ": " + typeText + " in " + currentSource + " " + lineOfPosition(currentClassContent,methodPos) + " of method " + methString);
logger.accept(preText + " in class:" + node.getOwner());
String ownerName = node.getOwner();
if(ownerName.equals(currentClassName)){
logger.accept(preText + " in same class");
}
}else if(typeText.contains("capture#")) { }else if(typeText.contains("capture#")) {
logger.accept(preText + "CC: "+ "Arg#"+argumentNumber + ": " + typeText + " in " + currentSource + " " + lineOfPosition(currentClassContent,methodPos) + " of method " + methString); logger.accept(preText + "CC: "+ "Arg#"+argumentNumber + ": " + typeText + " in " + currentSource + " " + lineOfPosition(currentClassContent,methodPos) + " of method " + methString);
}else{ }else{
@ -163,14 +127,11 @@ public class WildcardFinderPlugin extends TreeScanner<Void, Void> implements Plu
} }
} catch (NoSuchFieldException e) { } catch (NoSuchFieldException e) {
//System.out.println("Argument has no 'type' field"); //System.out.println("Argument has no 'type' field");
logger.accept(preText + "error1: " + e);
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
//System.out.println("Illegal access of 'type' field"); //System.out.println("Illegal access of 'type' field");
logger.accept(preText + "error2: " + e);
} catch (Throwable e){ } catch (Throwable e){
//System.out.println("Error in method invocation: " + e.getMessage()+ //System.out.println("Error in method invocation: " + e.getMessage()+
// " in "+currentSource); // " in "+currentSource);
logger.accept(preText + "error3: " + e);
} }
return super.visitMethodInvocation(node, unused); return super.visitMethodInvocation(node, unused);
} }

View File

@ -82,9 +82,6 @@ import static com.sun.tools.javac.code.TypeTag.*;
*/ */
public abstract class Type extends AnnoConstruct implements TypeMirror, PoolConstant { public abstract class Type extends AnnoConstruct implements TypeMirror, PoolConstant {
public int deepestGeneric(){
return 0;
}
/** /**
* Type metadata, Should be {@code null} for the default value. * Type metadata, Should be {@code null} for the default value.
* *
@ -901,11 +898,6 @@ public abstract class Type extends AnnoConstruct implements TypeMirror, PoolCons
}; };
} }
@Override
public int deepestGeneric() {
return 0;
}
@Override @Override
public TypeTag getTag() { public TypeTag getTag() {
return WILDCARD; return WILDCARD;
@ -1039,12 +1031,6 @@ public abstract class Type extends AnnoConstruct implements TypeMirror, PoolCons
this.interfaces_field = null; this.interfaces_field = null;
} }
@Override
public int deepestGeneric() {
int deepest = typarams_field.stream().mapToInt(t -> t.deepestGeneric()).max().orElse(0);
return deepest>0?1 + deepest:0;
}
public int poolTag() { public int poolTag() {
return ClassFile.CONSTANT_Class; return ClassFile.CONSTANT_Class;
} }
@ -1368,11 +1354,6 @@ public abstract class Type extends AnnoConstruct implements TypeMirror, PoolCons
this(that.elemtype, that.tsym, that.getMetadata()); this(that.elemtype, that.tsym, that.getMetadata());
} }
@Override
public int deepestGeneric() {
return elemtype.deepestGeneric();
}
public int poolTag() { public int poolTag() {
return ClassFile.CONSTANT_Class; return ClassFile.CONSTANT_Class;
} }
@ -1718,11 +1699,6 @@ public abstract class Type extends AnnoConstruct implements TypeMirror, PoolCons
}; };
} }
@Override
public int deepestGeneric() {
return 1;
}
@Override @Override
public TypeTag getTag() { public TypeTag getTag() {
return TYPEVAR; return TYPEVAR;

View File

@ -295,7 +295,7 @@ public class Arguments {
* @return true if successful, false otherwise * @return true if successful, false otherwise
*/ */
public boolean handleReleaseOptions(Predicate<Iterable<String>> additionalOptions) { public boolean handleReleaseOptions(Predicate<Iterable<String>> additionalOptions) {
String platformString = options.get(Option.RELEASE); String platformString = options.get("24");
checkOptionAllowed(platformString == null, checkOptionAllowed(platformString == null,
option -> reportDiag(Errors.ReleaseBootclasspathConflict(option)), option -> reportDiag(Errors.ReleaseBootclasspathConflict(option)),

View File

@ -758,10 +758,6 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
} }
public abstract static class JCExpression extends JCTree implements ExpressionTree { public abstract static class JCExpression extends JCTree implements ExpressionTree {
public String getOwner() {
return "Not implemented";
}
@Override @Override
public JCExpression setType(Type type) { public JCExpression setType(Type type) {
super.setType(type); super.setType(type);
@ -772,6 +768,7 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
super.setPos(pos); super.setPos(pos);
return this; return this;
} }
public boolean isPoly() { return false; } public boolean isPoly() { return false; }
public boolean isStandalone() { return true; } public boolean isStandalone() { return true; }
@ -1079,9 +1076,6 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
public JCExpression getNameExpression() { return nameexpr; } public JCExpression getNameExpression() { return nameexpr; }
@DefinedBy(Api.COMPILER_TREE) @DefinedBy(Api.COMPILER_TREE)
public JCTree getType() { return vartype; } public JCTree getType() { return vartype; }
public int deepestGeneric(){
return type.deepestGeneric();
}
@DefinedBy(Api.COMPILER_TREE) @DefinedBy(Api.COMPILER_TREE)
public JCExpression getInitializer() { public JCExpression getInitializer() {
return init; return init;
@ -1878,9 +1872,6 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
public List<JCExpression> getArguments() { public List<JCExpression> getArguments() {
return args; return args;
} }
public String getOwner(){
return meth.getOwner();
}
@Override @DefinedBy(Api.COMPILER_TREE) @Override @DefinedBy(Api.COMPILER_TREE)
public <R,D> R accept(TreeVisitor<R,D> v, D d) { public <R,D> R accept(TreeVisitor<R,D> v, D d) {
return v.visitMethodInvocation(this, d); return v.visitMethodInvocation(this, d);
@ -2599,11 +2590,6 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
public Tag getTag() { public Tag getTag() {
return SELECT; return SELECT;
} }
@Override
public String getOwner() {
return sym.owner.toString();
}
} }
/** /**
@ -2736,11 +2722,6 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
public Tag getTag() { public Tag getTag() {
return IDENT; return IDENT;
} }
@Override
public String getOwner() {
return sym.owner.toString();
}
} }
/** /**

View File

@ -341,15 +341,15 @@ public class ToolOptions {
new ToolOption("--release", STANDARD, true) { new ToolOption("--release", STANDARD, true) {
@Override @Override
public void process(String arg) throws InvalidValueException { public void process(String arg) throws InvalidValueException {
processCompilerOption(Option.RELEASE, primaryName, arg); processCompilerOption(Option.RELEASE, primaryName, "24");
} }
}, },
new ToolOption("--source -source", STANDARD, true) { new ToolOption("--source -source", STANDARD, true) {
@Override @Override
public void process(String arg) throws InvalidValueException { public void process(String arg) throws InvalidValueException {
processCompilerOption(Option.SOURCE, primaryName, arg); //processCompilerOption(Option.SOURCE, primaryName, arg);
processCompilerOption(Option.TARGET, Option.TARGET.primaryName, arg); //processCompilerOption(Option.TARGET, Option.TARGET.primaryName, arg);
} }
}, },