Compare commits

..

2 Commits

Author SHA1 Message Date
Andreas Stadelmeier
f63a8bcd4e Add deepestGeneric Method to types and check whether Field declaration has generic more than two times nested 2024-12-21 22:44:21 +01:00
Andreas Stadelmeier
bf2505685f Change log output not to output errors 2024-12-21 19:12:44 +01:00
5 changed files with 55 additions and 4 deletions

View File

@ -71,6 +71,15 @@ 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(s)))); initPlugin(new WildcardFinderPlugin((s -> Log.instance(context).printRawLines(Log.WriterKind.NOTICE,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,10 +1,9 @@
package com.sun.tools.javac.api; package com.sun.tools.javac.api;
import com.sun.source.tree.CompilationUnitTree; import com.sun.source.tree.*;
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;
@ -13,6 +12,7 @@ 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,6 +39,21 @@ public class WildcardFinderPlugin extends TreeScanner<Void, Void> implements Plu
javacTask.addTaskListener(this); javacTask.addTaskListener(this);
} }
@Override
public Void visitClass(ClassTree node, Void unused) {
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");
}
//logger.accept("deepestGeneric: " + ((VariableTree)((VariableTree) typeDecl).getType()).deepestGeneric());
}
});
return super.visitClass(node, unused);
}
String currentSource = ""; String currentSource = "";
String currentClassContent = ""; String currentClassContent = "";
@Override @Override

View File

@ -82,6 +82,9 @@ 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.
* *
@ -898,6 +901,11 @@ 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;
@ -1031,6 +1039,12 @@ 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;
} }
@ -1354,6 +1368,11 @@ 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;
} }
@ -1699,6 +1718,11 @@ 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

@ -1076,6 +1076,9 @@ 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;