From 8609e2540aeaed2742b90ef11d98278eff9691a4 Mon Sep 17 00:00:00 2001 From: "Roman.Ivanov" Date: Mon, 1 Apr 2019 16:54:05 +0700 Subject: [PATCH] CallMatcher: add default method for restricting language level --- .../com/siyeh/ig/callMatcher/CallMatcher.java | 33 +++++++++++++++++++ .../src/com/siyeh/ig/psiutils/BoolUtils.java | 6 +--- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/callMatcher/CallMatcher.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/callMatcher/CallMatcher.java index 70bf1c74284d..4752b5aa0fef 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/callMatcher/CallMatcher.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/callMatcher/CallMatcher.java @@ -1,6 +1,7 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.siyeh.ig.callMatcher; +import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiUtil; @@ -160,6 +161,38 @@ public interface CallMatcher extends Predicate { return null; } + + default CallMatcher withLanguageLevelAtLeast(@NotNull LanguageLevel level) { + return new CallMatcher() { + @Override + public Stream names() { + return CallMatcher.this.names(); + } + + @Override + public boolean methodReferenceMatches(PsiMethodReferenceExpression methodRef) { + return CallMatcher.this.methodReferenceMatches(methodRef); + } + + @Override + public boolean test(@Nullable PsiMethodCallExpression call) { + if (call == null || PsiUtil.getLanguageLevel(call).isAtLeast(level)) return false; + return CallMatcher.this.test(call); + } + + @Override + public boolean methodMatches(@Nullable PsiMethod method) { + if (method == null || PsiUtil.getLanguageLevel(method).isAtLeast(level)) return false; + return CallMatcher.this.methodMatches(method); + } + + @Override + public String toString() { + return CallMatcher.this.toString(); + } + }; + } + class Simple implements CallMatcher { static final Simple ENUM_VALUES = new Simple("", Collections.singleton("values"), ArrayUtil.EMPTY_STRING_ARRAY, CallType.ENUM_STATIC); static final Simple ENUM_VALUE_OF = diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/BoolUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/BoolUtils.java index 36ce3a67efbc..7eec0b8caa80 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/BoolUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/BoolUtils.java @@ -101,10 +101,6 @@ public class BoolUtils { CallMatcher.exactInstanceCall(OPTIONAL_DOUBLE, "isEmpty").parameterCount(0) ); - private static Predicate withMinimalLanguageLevel(CallMatcher matcher, LanguageLevel level) { - return matcher.and(expression -> PsiUtil.getLanguageLevel(expression).isAtLeast(level)); - } - private static class PredicatedReplacement { Predicate predicate; String name; @@ -118,7 +114,7 @@ public class BoolUtils { private static final List ourReplacements = new ArrayList<>(); static { ourReplacements.add(new PredicatedReplacement(OPTIONAL_IS_EMPTY, "isPresent")); - ourReplacements.add(new PredicatedReplacement(withMinimalLanguageLevel(OPTIONAL_IS_PRESENT, LanguageLevel.JDK_11), "isEmpty")); + ourReplacements.add(new PredicatedReplacement(OPTIONAL_IS_PRESENT.withLanguageLevelAtLeast(LanguageLevel.JDK_11), "isEmpty")); ourReplacements.add(new PredicatedReplacement(STREAM_ANY_MATCH, "noneMatch")); ourReplacements.add(new PredicatedReplacement(STREAM_NONE_MATCH, "anyMatch")); }