A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/pmd/pmd/issues/4902 below:

[java] "Bad intersection, unrelated class types" for Constable[] and Enum[] · Issue #4902 · pmd/pmd · GitHub

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:

  1. Copy the code sample above.
  2. As I was using Gradle 8.5, I configured PMD this way:
  pmd {
    toolVersion = '7.0.0'
  }

  dependencies {
    pmd 'net.sourceforge.pmd:pmd-ant:7.0.0'
    pmd 'net.sourceforge.pmd:pmd-java:7.0.0'
  }
  1. Run ./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