From 6871c142ba54384bca1e61c69ae97228cd44234a Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Tue, 31 Oct 2017 16:24:48 +0300 Subject: [PATCH] - do not set 'outer class' property when parsing classes using inner classes declared elsewhere; - for inner classes store complete set of access flags --- .../incremental/classModifiers/addStatic.log | 4 +++- .../classModifiers/changeInnerClassModifiers.log | 16 ++++++++++++++++ .../changeInnerClassModifiers/A.java.new | 7 +++++++ .../changeInnerClassModifiers/src/A.java | 7 +++++++ .../changeInnerClassModifiers/src/B.java | 3 +++ .../changeInnerClassModifiers/src/C.java | 3 +++ .../incremental/classModifiers/removeStatic.log | 4 +++- .../java/dependencyView/ClassfileAnalyzer.java | 15 ++++++++++----- .../builders/java/dependencyView/Mappings.java | 7 +++++++ .../org/jetbrains/ether/ClassModifierTest.java | 4 ++++ 10 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers.log create mode 100644 java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers/A.java.new create mode 100644 java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers/src/A.java create mode 100644 java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers/src/B.java create mode 100644 java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers/src/C.java diff --git a/java/java-tests/testData/compileServer/incremental/classModifiers/addStatic.log b/java/java-tests/testData/compileServer/incremental/classModifiers/addStatic.log index dd63cde21ee2..daacba94d8d7 100644 --- a/java/java-tests/testData/compileServer/incremental/classModifiers/addStatic.log +++ b/java/java-tests/testData/compileServer/incremental/classModifiers/addStatic.log @@ -7,7 +7,9 @@ src/A.java End of files Cleaning output files: out/production/AddStatic/B.class +out/production/AddStatic/C.class End of files Compiling files: src/B.java -End of files +src/C.java +End of files \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers.log b/java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers.log new file mode 100644 index 000000000000..dae32a39fa71 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers.log @@ -0,0 +1,16 @@ +Cleaning output files: +out/production/ChangeInnerClassModifiers/A$Inner1.class +out/production/ChangeInnerClassModifiers/A$Inner2.class +out/production/ChangeInnerClassModifiers/A.class +End of files +Compiling files: +src/A.java +End of files +Cleaning output files: +out/production/ChangeInnerClassModifiers/B.class +out/production/ChangeInnerClassModifiers/C.class +End of files +Compiling files: +src/B.java +src/C.java +End of files \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers/A.java.new b/java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers/A.java.new new file mode 100644 index 000000000000..fb0cac4055ae --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers/A.java.new @@ -0,0 +1,7 @@ +public class A { + public static class Inner1 { + } + + public class Inner2 { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers/src/A.java b/java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers/src/A.java new file mode 100644 index 000000000000..9ca811aa4015 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers/src/A.java @@ -0,0 +1,7 @@ +public class A { + public class Inner1 { + } + + public abstract class Inner2 { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers/src/B.java b/java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers/src/B.java new file mode 100644 index 000000000000..a202505491ac --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers/src/B.java @@ -0,0 +1,3 @@ +public class B { + void perform(A.Inner1 param) {} +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers/src/C.java b/java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers/src/C.java new file mode 100644 index 000000000000..5baa5d654a4d --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/classModifiers/changeInnerClassModifiers/src/C.java @@ -0,0 +1,3 @@ +public class C { + void perform(A.Inner2 param) {} +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/classModifiers/removeStatic.log b/java/java-tests/testData/compileServer/incremental/classModifiers/removeStatic.log index f7e25a83b625..6832f0d4cd18 100644 --- a/java/java-tests/testData/compileServer/incremental/classModifiers/removeStatic.log +++ b/java/java-tests/testData/compileServer/incremental/classModifiers/removeStatic.log @@ -7,7 +7,9 @@ src/A.java End of files Cleaning output files: out/production/RemoveStatic/B.class +out/production/RemoveStatic/C.class End of files Compiling files: src/B.java -End of files +src/C.java +End of files \ No newline at end of file diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassfileAnalyzer.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassfileAnalyzer.java index 7229b89267e8..136b267cbc86 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassfileAnalyzer.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassfileAnalyzer.java @@ -742,11 +742,16 @@ class ClassfileAnalyzer { @Override public void visitInnerClass(String name, String outerName, String innerName, int access) { - if (outerName != null) { - myOuterClassName.set(outerName); - } - if (innerName == null) { - myAnonymousClassFlag.set(true); + if (myContext.get(name) == myName) { + // set outer class name only if we are parsing the real inner class and + // not the reference to inner class inside some top-level class + myAccess |= access; // information about some access flags for the inner class is missing from the mask passed to 'visit' method + if (outerName != null) { + myOuterClassName.set(outerName); + } + if (innerName == null) { + myAnonymousClassFlag.set(true); + } } } 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 3e1455c5aa7b..6ecff849d13e 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 @@ -1935,6 +1935,13 @@ public class Mappings { state.myAffectedUsages.add(UsageRepr.createClassNewUsage(myContext, changedClass.name)); } + if (!changedClass.isAnonymous() && !isEmpty(changedClass.getOuterClassName()) && !changedClass.isPrivate()) { + if (addedModifiers != 0 || diff.removedModifiers() != 0) { + debug("Some modifiers (access flags) were changed for non-private inner class, adding class usage to affected usages"); + state.myAffectedUsages.add(changedClass.createUsage()); + } + } + if (changedClass.isAnnotation()) { debug("Class is annotation, performing annotation-specific analysis"); diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/ClassModifierTest.java b/jps/jps-builders/testSrc/org/jetbrains/ether/ClassModifierTest.java index b894e64ab4bb..151534f5593b 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/ClassModifierTest.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/ClassModifierTest.java @@ -51,4 +51,8 @@ public class ClassModifierTest extends IncrementalTestCase { public void testSetFinal1() { doTest(); } + + public void testChangeInnerClassModifiers() { + doTest(); + } }