Affects PMD Version:
7.0.0
Description:
PMD does not properly handle code that combines values from 2 enums which share the same interface.
Exception Stacktrace:
org.apache.commons.lang3.exception.ContextedRuntimeException: java.lang.IllegalArgumentException: Bad intersection, unrelated class types java.lang.constant.Constable[] and java.lang.Enum[] in [java.lang.Enum[], java.lang.constant.Constable[], BadIntersection$Animal[]]
Exception Context:
[1:Resolving type of=!debug only! [MethodCall:22:12]Stream.of(
Bird.values(),
Fish.values()
)]
[2:Rule applied on node=!debug only! [MethodCall:22:12]Stream.of(
Bird.values(),
Fish.values()
)
.flatMap(Arrays::stream)]
---------------------------------
at net.sourceforge.pmd.util.AssertionUtil.contexted(AssertionUtil.java:232)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaTypeNode.getTypeMirror(AbstractJavaTypeNode.java:54)
at net.sourceforge.pmd.lang.java.ast.ASTMethodCall.getTypeMirror(ASTMethodCall.java:22)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaTypeNode.getTypeMirror(AbstractJavaTypeNode.java:39)
at net.sourceforge.pmd.lang.java.ast.ASTMethodCall.getTypeMirror(ASTMethodCall.java:22)
at net.sourceforge.pmd.lang.java.types.TypeTestUtil.isA(TypeTestUtil.java:65)
at net.sourceforge.pmd.lang.java.rule.bestpractices.UseCollectionIsEmptyRule.visit(UseCollectionIsEmptyRule.java:29)
at net.sourceforge.pmd.lang.java.ast.ASTMethodCall.acceptVisitor(ASTMethodCall.java:75)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaNode.acceptVisitor(AbstractJavaNode.java:38)
at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.apply(AbstractJavaRule.java:30)
at net.sourceforge.pmd.lang.rule.RuleReference.apply(RuleReference.java:415)
at net.sourceforge.pmd.lang.rule.internal.RuleApplicator.applyOnIndex(RuleApplicator.java:77)
at net.sourceforge.pmd.lang.rule.internal.RuleApplicator.apply(RuleApplicator.java:57)
at net.sourceforge.pmd.lang.rule.internal.RuleSets.apply(RuleSets.java:155)
at net.sourceforge.pmd.lang.impl.PmdRunnable.processSource(PmdRunnable.java:140)
at net.sourceforge.pmd.lang.impl.PmdRunnable.run(PmdRunnable.java:80)
at java.base@17.0.10/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base@17.0.10/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base@17.0.10/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base@17.0.10/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base@17.0.10/java.lang.Thread.run(Thread.java:840)
Caused by: java.lang.IllegalArgumentException: Bad intersection, unrelated class types java.lang.constant.Constable[] and java.lang.Enum[] in [java.lang.Enum[], java.lang.constant.Constable[], BadIntersection$Animal[]]
at net.sourceforge.pmd.lang.java.types.Lub.glb(Lub.java:337)
at net.sourceforge.pmd.lang.java.types.TypeSystem.glb(TypeSystem.java:715)
at net.sourceforge.pmd.lang.java.types.Lub$LubJudge.lub(Lub.java:164)
at net.sourceforge.pmd.lang.java.types.Lub.lub(Lub.java:35)
at net.sourceforge.pmd.lang.java.types.TypeSystem.lub(TypeSystem.java:680)
at net.sourceforge.pmd.lang.java.types.internal.infer.ReductionStep$2.solve(ReductionStep.java:41)
at net.sourceforge.pmd.lang.java.types.internal.infer.InferenceContext.solveBatchProgressed(InferenceContext.java:444)
at net.sourceforge.pmd.lang.java.types.internal.infer.InferenceContext.solve(InferenceContext.java:424)
at net.sourceforge.pmd.lang.java.types.internal.infer.InferenceContext.solve(InferenceContext.java:400)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateImpl(Infer.java:576)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMaybeNoInfer(Infer.java:541)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethod(Infer.java:385)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.instantiateMethodOrCtor(Infer.java:365)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.logInference(Infer.java:348)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.computeCompileTimeDecl(Infer.java:288)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.getCompileTimeDecl(Infer.java:250)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.goToInvocationWithFallback(Infer.java:183)
at net.sourceforge.pmd.lang.java.types.internal.infer.Infer.inferInvocationRecursively(Infer.java:172)
at net.sourceforge.pmd.lang.java.types.ast.internal.PolyResolution.inferInvocation(PolyResolution.java:254)
at net.sourceforge.pmd.lang.java.types.ast.internal.PolyResolution.polyTypeOtherCtx(PolyResolution.java:126)
at net.sourceforge.pmd.lang.java.types.ast.internal.PolyResolution.computePolyType(PolyResolution.java:116)
at net.sourceforge.pmd.lang.java.types.ast.internal.LazyTypeResolver.handlePoly(LazyTypeResolver.java:267)
at net.sourceforge.pmd.lang.java.types.ast.internal.LazyTypeResolver.visit(LazyTypeResolver.java:272)
at net.sourceforge.pmd.lang.java.types.ast.internal.LazyTypeResolver.visit(LazyTypeResolver.java:95)
at net.sourceforge.pmd.lang.java.ast.ASTMethodCall.acceptVisitor(ASTMethodCall.java:75)
at net.sourceforge.pmd.lang.java.ast.AbstractJavaTypeNode.getTypeMirror(AbstractJavaTypeNode.java:51)
... 19 more
Exception occurred on node !debug only! [MethodCall:22:12]Stream.of(
Bird.values(),
Fish.values()
)
.flatMap(Arrays::stream)
Code Sample demonstrating the issue:
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class BadIntersection { interface Animal { } enum Bird implements Animal { PARROT, CHICKEN } enum Fish implements Animal { GOLDFISH, MACKEREL } private static List<Animal> combineAnimals() { return Stream.of( Bird.values(), Fish.values() ) .flatMap(Arrays::stream) .collect(Collectors.toList()); } public static void main(String[] args) { List<Animal> animals = combineAnimals(); for (Animal animal : animals) { System.out.println("animal = " + animal); } } }
Steps to reproduce:
pmd { toolVersion = '7.0.0' } dependencies { pmd 'net.sourceforge.pmd:pmd-ant:7.0.0' pmd 'net.sourceforge.pmd:pmd-java:7.0.0' }
./gradlew pmdMain
Running PMD through: Gradle
Happens on OpenJDK versions 11, 17, and 21.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4