From f78bf9fb2571906aa6fb936761e32cd0ec7a799e Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Tue, 12 Mar 2024 10:08:48 +0100 Subject: [PATCH] isOverridable() check for a method GitOrigin-RevId: 30bb381b0e9dea864850bda46ece5c081c1bcba0 --- .../java/JavaDifferentiateStrategy.java | 16 ++++++++++------ .../jetbrains/jps/dependency/java/JvmMethod.java | 4 ++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/dependency/java/JavaDifferentiateStrategy.java b/jps/jps-builders/src/org/jetbrains/jps/dependency/java/JavaDifferentiateStrategy.java index cd87a2c3608a..3e84148985e3 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/dependency/java/JavaDifferentiateStrategy.java +++ b/jps/jps-builders/src/org/jetbrains/jps/dependency/java/JavaDifferentiateStrategy.java @@ -356,9 +356,11 @@ public final class JavaDifferentiateStrategy extends JvmDifferentiateStrategyImp debug("Return type, throws list or signature changed --- affecting method usages"); affectMemberUsages(context, changedClass.getReferenceID(), changedMethod, propagated); - if (!changedMethod.isPrivate() && !changedMethod.isStatic()) { - for (JvmNodeReferenceID subClass : unique(map(future.getOverridingMethods(changedClass, changedMethod, changedMethod::isSameByJavaRules), p -> p.getFirst().getReferenceID()))) { - affectNodeSources(context, subClass, "Affect source file of a class which overrides the changed method: "); + if (!changedMethod.isPrivate() && !changedMethod.isConstructor() && !changedMethod.isStatic()) { + if (!changedMethod.isFinal()) { + for (JvmNodeReferenceID subClass : unique(map(future.getOverridingMethods(changedClass, changedMethod, changedMethod::isSameByJavaRules), p -> p.getFirst().getReferenceID()))) { + affectNodeSources(context, subClass, "Affect source file of a class which overrides the changed method: "); + } } for (JvmNodeReferenceID id : propagated) { for (JvmClass subClass : future.getNodes(id, JvmClass.class)) { @@ -434,7 +436,7 @@ public final class JavaDifferentiateStrategy extends JvmDifferentiateStrategyImp if (toRecompile.contains(AnnotationChangesTracker.Recompile.USAGES)) { affectMemberUsages(context, changedClass.getReferenceID(), changedMethod, propagated); if (changedMethod.isAbstract() || toRecompile.contains(AnnotationChangesTracker.Recompile.SUBCLASSES)) { - for (Pair pair : recurse(Pair.create(changedClass, changedMethod), p -> future.getOverridingMethods(p.first, p.second, p.second::isSameByJavaRules), false)) { + for (Pair pair : recurse(Pair.create(changedClass, changedMethod), p -> p.second.isOverridable()? future.getOverridingMethods(p.first, p.second, p.second::isSameByJavaRules) : Collections.emptyList(), false)) { JvmNodeReferenceID clsId = pair.first.getReferenceID(); JvmMethod meth = pair.getSecond(); affectMemberUsages(context, clsId, meth, future.collectSubclassesWithoutMethod(clsId, meth)); @@ -524,8 +526,10 @@ public final class JavaDifferentiateStrategy extends JvmDifferentiateStrategyImp } } - for (Pair overriding : future.getOverridingMethods(changedClass, removedMethod, removedMethod::isSameByJavaRules)) { - affectNodeSources(context, overriding.getFirst().getReferenceID(), "Affecting file by overriding: "); + if (removedMethod.isOverridable()) { + for (Pair overriding : future.getOverridingMethods(changedClass, removedMethod, removedMethod::isSameByJavaRules)) { + affectNodeSources(context, overriding.getFirst().getReferenceID(), "Affecting file by overriding: "); + } } if (!removedMethod.isConstructor() && !removedMethod.isAbstract() && !removedMethod.isStatic()) { diff --git a/jps/jps-builders/src/org/jetbrains/jps/dependency/java/JvmMethod.java b/jps/jps-builders/src/org/jetbrains/jps/dependency/java/JvmMethod.java index 6d712c09f056..831c994afa51 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/dependency/java/JvmMethod.java +++ b/jps/jps-builders/src/org/jetbrains/jps/dependency/java/JvmMethod.java @@ -52,6 +52,10 @@ public final class JvmMethod extends ProtoMember implements DiffCapable".equals(getName()); } + public boolean isOverridable() { + return !isFinal() && !isStatic() && !isPrivate() && !isConstructor(); + } + @Override public MethodUsage createUsage(JvmNodeReferenceID owner) { return new MethodUsage(owner, getName(), getDescriptor());