diff --git a/java/java-tests/testData/compileServer/incremental/classProperties/convertToCheckedException.log b/java/java-tests/testData/compileServer/incremental/classProperties/convertToCheckedException.log new file mode 100644 index 000000000000..cba341b81869 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classProperties/convertToCheckedException.log @@ -0,0 +1,14 @@ +Cleaning output files: +out/production/ConvertToCheckedException/ppp/SomeException.class +End of files +Compiling files: +src/ppp/SomeException.java +End of files +Cleaning output files: +out/production/ConvertToCheckedException/ppp/Client.class +out/production/ConvertToCheckedException/ppp/Task.class +End of files +Compiling files: +src/ppp/Client.java +src/ppp/Task.java +End of files \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/classProperties/convertToCheckedException/src/ppp/Client.java b/java/java-tests/testData/compileServer/incremental/classProperties/convertToCheckedException/src/ppp/Client.java new file mode 100644 index 000000000000..5dc4f1504972 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classProperties/convertToCheckedException/src/ppp/Client.java @@ -0,0 +1,11 @@ +package ppp; + +public class Client { + public void foo(Task task) { + try { + task.execute(); + } + catch (RuntimeException e) { + } + } +} diff --git a/java/java-tests/testData/compileServer/incremental/classProperties/convertToCheckedException/src/ppp/SomeException.java b/java/java-tests/testData/compileServer/incremental/classProperties/convertToCheckedException/src/ppp/SomeException.java new file mode 100644 index 000000000000..b7ac46fbce07 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classProperties/convertToCheckedException/src/ppp/SomeException.java @@ -0,0 +1,4 @@ +package ppp; + +public class SomeException extends RuntimeException{ +} diff --git a/java/java-tests/testData/compileServer/incremental/classProperties/convertToCheckedException/src/ppp/SomeException.java.new b/java/java-tests/testData/compileServer/incremental/classProperties/convertToCheckedException/src/ppp/SomeException.java.new new file mode 100644 index 000000000000..32883f13b3f7 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classProperties/convertToCheckedException/src/ppp/SomeException.java.new @@ -0,0 +1,4 @@ +package ppp; + +public class SomeException extends Exception{ +} diff --git a/java/java-tests/testData/compileServer/incremental/classProperties/convertToCheckedException/src/ppp/Task.java b/java/java-tests/testData/compileServer/incremental/classProperties/convertToCheckedException/src/ppp/Task.java new file mode 100644 index 000000000000..133268457744 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classProperties/convertToCheckedException/src/ppp/Task.java @@ -0,0 +1,6 @@ +package ppp; + +public class Task { + public void execute() throws SomeException{ + } +} diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/DependencyContext.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/DependencyContext.java index f9884107220d..8aecebae9b23 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/DependencyContext.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/DependencyContext.java @@ -111,21 +111,21 @@ class DependencyContext implements NamingContext { @Override public void debug(String comment, Integer s) { - if (log.isDebugEnabled()) { + if (isDebugEnabled()) { log.debug(comment + getValue(s)); } } @Override public void debug(String comment, String t) { - if (log.isDebugEnabled()){ + if (isDebugEnabled()){ log.debug(comment + t); } } @Override public void debug(String comment, boolean t) { - if (log.isDebugEnabled()) { + if (isDebugEnabled()) { log.debug(comment + t); } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Mappings.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Mappings.java index 8589b408f505..2421fbe6c894 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Mappings.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Mappings.java @@ -309,12 +309,17 @@ public class Mappings { myMappings = mappings; } - void appendDependents(final ClassFileRepr c, final TIntHashSet result) { - final TIntHashSet depClasses = myClassToClassDependency.get(c.name); + TIntHashSet appendDependents(final ClassFileRepr c, final TIntHashSet result) { + return appendDependents(c.name, result); + } + @Nullable + TIntHashSet appendDependents(int className, TIntHashSet result) { + final TIntHashSet depClasses = myClassToClassDependency.get(className); if (depClasses != null) { addAll(result, depClasses); } + return depClasses; } void propagateMemberAccessRec(final TIntHashSet acc, final boolean isField, final boolean root, final MemberComparator comparator, final int reflcass) { @@ -687,10 +692,7 @@ public class Mappings { } } - final TIntHashSet depClasses = myClassToClassDependency.get(className); - if (depClasses != null) { - addAll(dependants, depClasses); - } + appendDependents(className, dependants); final TIntHashSet directSubclasses = myClassToSubclasses.get(className); if (directSubclasses != null) { @@ -712,10 +714,7 @@ public class Mappings { affectedUsages.add(rootUsage); classes.forEach(p -> { - final TIntHashSet deps = myClassToClassDependency.get(p); - if (deps != null) { - addAll(dependents, deps); - } + appendDependents(p, dependents); debug("Affect field usage referenced of class ", p); affectedUsages.add(rootUsage instanceof UsageRepr.FieldAssignUsage ? field.createAssignUsage(myContext, p) : field.createUsage(myContext, p)); return true; @@ -727,10 +726,7 @@ public class Mappings { affectedUsages.add(UsageRepr.createImportStaticMemberUsage(myContext, memberName, ownerName)); classes.forEach(cls -> { - final TIntHashSet deps = myClassToClassDependency.get(cls); - if (deps != null) { - addAll(dependents, deps); - } + appendDependents(cls, dependents); debug("Affect static member import usage referenced of class ", cls); affectedUsages.add(UsageRepr.createImportStaticMemberUsage(myContext, memberName, cls)); return true; @@ -742,24 +738,34 @@ public class Mappings { affectedUsages.add(UsageRepr.createImportStaticOnDemandUsage(myContext, ownerClass)); classes.forEach(cls -> { - final TIntHashSet deps = myClassToClassDependency.get(cls); - if (deps != null) { - addAll(dependents, deps); - } + appendDependents(cls, dependents); debug("Affect static member on-demand import usage referenced of class ", cls); affectedUsages.add(UsageRepr.createImportStaticOnDemandUsage(myContext, cls)); return true; }); } + void affectMethodUsagesThrowing(ClassRepr aClass, TypeRepr.ClassType exceptionClass, final Set affectedUsages, final TIntHashSet dependents) { + boolean shouldAffect = false; + for (MethodRepr method : aClass.getMethods()) { + if (method.myExceptions.contains(exceptionClass)) { + shouldAffect = true; + affectedUsages.add(method.createUsage(myContext, aClass.name)); + } + } + if (shouldAffect) { + if (myDebugS.isDebugEnabled()) { + debug("Affecting usages of methods throwing "+ myContext.getValue(exceptionClass.className) + " exception; class ", aClass.name); + } + appendDependents(aClass, dependents); + } + } + void affectMethodUsages(final MethodRepr method, final TIntHashSet subclasses, final UsageRepr.Usage rootUsage, final Set affectedUsages, final TIntHashSet dependents) { affectedUsages.add(rootUsage); if (subclasses != null) { subclasses.forEach(p -> { - final TIntHashSet deps = myClassToClassDependency.get(p); - if (deps != null) { - addAll(dependents, deps); - } + appendDependents(p, dependents); debug("Affect method usage referenced of class ", p); @@ -1225,12 +1231,7 @@ public class Mappings { final TIntHashSet yetPropagated = myPresent.propagateMethodAccess(method, it.name); if (isInheritor) { - final TIntHashSet deps = myClassToClassDependency.get(methodClass.name); - - if (deps != null) { - addAll(state.myDependants, deps); - } - + myPresent.appendDependents(methodClass, state.myDependants); myFuture.affectMethodUsages(method, yetPropagated, method.createUsage(myContext, methodClass.name), state.myAffectedUsages, state.myDependants); } @@ -1590,12 +1591,8 @@ public class Mappings { if (f.isStatic()) { myFuture.affectStaticMemberOnDemandUsages(subClass, propagated, state.myAffectedUsages, state.myDependants); } + myFuture.appendDependents(subClass, state.myDependants); - final TIntHashSet deps = myClassToClassDependency.get(subClass); - - if (deps != null) { - addAll(state.myDependants, deps); - } return true; }); } @@ -1861,7 +1858,7 @@ public class Mappings { continue; } - myPresent.appendDependents(changedClass, state.myDependants); + final TIntHashSet directDeps = myPresent.appendDependents(changedClass, state.myDependants); if (superClassChanged || interfacesChanged || signatureChanged) { debug("Superclass changed: ", superClassChanged); @@ -1876,6 +1873,17 @@ public class Mappings { myFuture.affectSubclasses(changedClass.name, myAffectedFiles, state.myAffectedUsages, state.myDependants, extendsChanged || interfacesRemoved || signatureChanged, myCompiledFiles, null); + if (extendsChanged && directDeps != null) { + final TypeRepr.ClassType excClass = TypeRepr.createClassType(myContext, changedClass.name); + directDeps.forEach(depClass -> { + final ClassRepr depClassRepr = myPresent.classReprByName(depClass); + if (depClassRepr != null) { + myPresent.affectMethodUsagesThrowing(depClassRepr, excClass, state.myAffectedUsages, state.myDependants); + } + return true; + }); + } + if (!changedClass.isAnonymous()) { final TIntHashSet parents = new TIntHashSet(); myPresent.collectSupersRecursively(changedClass.name, parents); @@ -1892,10 +1900,7 @@ public class Mappings { state.myUsageConstraints.put(usage, fileFilterConstraint); } - final TIntHashSet depClasses = myClassToClassDependency.get(className); - if (depClasses != null) { - addAll(state.myDependants, depClasses); - } + myPresent.appendDependents(className, state.myDependants); return true; }); } diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/ClassPropertyTest.java b/jps/jps-builders/testSrc/org/jetbrains/ether/ClassPropertyTest.java index 056f1218a3c7..92f587a62dc5 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/ClassPropertyTest.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/ClassPropertyTest.java @@ -62,4 +62,8 @@ public class ClassPropertyTest extends IncrementalTestCase { public void testChangeExtends2() { doTest(); } + + public void testConvertToCheckedException() { + doTest(); + } }