From 0c7e86cf4c8573244e0d99488fc36dfb5bc79505 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 6 Dec 2018 18:12:23 +0700 Subject: [PATCH] IDEA-203697 Class.getClass() false-negative on Java 12 switch expression --- .../intellij/codeInspection/ClassGetClassInspection.java | 3 ++- .../classGetClass/afterClassGetClassExpressionSwitch.java | 8 ++++++++ .../beforeClassGetClassExpressionSwitch.java | 8 ++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/inspection/classGetClass/afterClassGetClassExpressionSwitch.java create mode 100644 java/java-tests/testData/inspection/classGetClass/beforeClassGetClassExpressionSwitch.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/ClassGetClassInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/ClassGetClassInspection.java index bc5121f06e18..7a449a72d9da 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/ClassGetClassInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/ClassGetClassInspection.java @@ -24,7 +24,8 @@ public class ClassGetClassInspection extends AbstractBaseJavaLocalInspectionTool if (!OBJECT_GET_CLASS.test(call)) return; // Sometimes people use xyz.getClass() for implicit NPE check. While it's a questionable code style // do not warn about such case - if (call.getParent() instanceof PsiExpressionStatement) return; + if (call.getParent() instanceof PsiExpressionStatement && + !(call.getParent().getParent() instanceof PsiSwitchLabeledRuleStatement)) return; PsiExpression qualifier = call.getMethodExpression().getQualifierExpression(); if (qualifier == null) return; PsiType type = qualifier.getType(); diff --git a/java/java-tests/testData/inspection/classGetClass/afterClassGetClassExpressionSwitch.java b/java/java-tests/testData/inspection/classGetClass/afterClassGetClassExpressionSwitch.java new file mode 100644 index 000000000000..d67482aef8a5 --- /dev/null +++ b/java/java-tests/testData/inspection/classGetClass/afterClassGetClassExpressionSwitch.java @@ -0,0 +1,8 @@ +// "Remove 'getClass()' call" "true" +public class Main { + Class test(Class obj) { + return switch(obj.hashCode()) { + default -> obj; + }; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/classGetClass/beforeClassGetClassExpressionSwitch.java b/java/java-tests/testData/inspection/classGetClass/beforeClassGetClassExpressionSwitch.java new file mode 100644 index 000000000000..67f3b84dde77 --- /dev/null +++ b/java/java-tests/testData/inspection/classGetClass/beforeClassGetClassExpressionSwitch.java @@ -0,0 +1,8 @@ +// "Remove 'getClass()' call" "true" +public class Main { + Class test(Class obj) { + return switch(obj.hashCode()) { + default -> obj.getClass(); + }; + } +} \ No newline at end of file