From 04ed20c574f1a82e430b68332210a6486b71fb16 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 22 Apr 2016 15:41:31 +0300 Subject: [PATCH] Lint: Remove AssertDetector (unrelated to Kotlin) --- idea/src/META-INF/android-lint.xml | 1 - .../tools/klint/checks/AssertDetector.java | 146 ------------------ .../klint/checks/BuiltinIssueRegistry.java | 1 - .../AndroidLintInspectionToolProvider.java | 6 - 4 files changed, 154 deletions(-) delete mode 100644 plugins/lint/lint-checks/src/com/android/tools/klint/checks/AssertDetector.java diff --git a/idea/src/META-INF/android-lint.xml b/idea/src/META-INF/android-lint.xml index 6fbdff07054..b2d3e9e6362 100644 --- a/idea/src/META-INF/android-lint.xml +++ b/idea/src/META-INF/android-lint.xml @@ -5,7 +5,6 @@ - diff --git a/plugins/lint/lint-checks/src/com/android/tools/klint/checks/AssertDetector.java b/plugins/lint/lint-checks/src/com/android/tools/klint/checks/AssertDetector.java deleted file mode 100644 index 94da417556b..00000000000 --- a/plugins/lint/lint-checks/src/com/android/tools/klint/checks/AssertDetector.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.tools.klint.checks; - -import com.android.annotations.NonNull; -import com.android.tools.klint.detector.api.Category; -import com.android.tools.klint.detector.api.Context; -import com.android.tools.klint.detector.api.Detector; -import com.android.tools.klint.detector.api.Implementation; -import com.android.tools.klint.detector.api.Issue; -import com.android.tools.klint.detector.api.Scope; -import com.android.tools.klint.detector.api.Severity; - -import java.io.File; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.uast.*; -import org.jetbrains.uast.check.UastAndroidContext; -import org.jetbrains.uast.check.UastScanner; -import org.jetbrains.uast.java.JavaUAssertExpression; -import org.jetbrains.uast.visitor.AbstractUastVisitor; -import org.jetbrains.uast.visitor.UastVisitor; - -import static org.jetbrains.uast.UastLiteralUtils.isNullLiteral; - -/** - * Looks for assertion usages. - */ -public class AssertDetector extends Detector implements UastScanner { - /** Using assertions */ - public static final Issue ISSUE = Issue.create( - "Assert", //$NON-NLS-1$ - "Assertions", - - "Assertions are not checked at runtime. There are ways to request that they be used " + - "by Dalvik (`adb shell setprop debug.assert 1`), but the property is ignored in " + - "many places and can not be relied upon. Instead, perform conditional checking " + - "inside `if (BuildConfig.DEBUG) { }` blocks. That constant is a static final boolean " + - "which is true in debug builds and false in release builds, and the Java compiler " + - "completely removes all code inside the if-body from the app.\n" + - "\n" + - "For example, you can replace `assert speed > 0` with " + - "`if (BuildConfig.DEBUG && !(speed > 0)) { throw new AssertionError() }`.\n" + - "\n" + - "(Note: This lint check does not flag assertions purely asserting nullness or " + - "non-nullness; these are typically more intended for tools usage than runtime " + - "checks.)", - - Category.CORRECTNESS, - 6, - Severity.WARNING, - new Implementation( - AssertDetector.class, - Scope.SOURCE_FILE_SCOPE)) - .addMoreInfo( - "https://code.google.com/p/android/issues/detail?id=65183"); //$NON-NLS-1$ - - /** Constructs a new {@link com.android.tools.lint.checks.AssertDetector} check */ - public AssertDetector() { - } - - @Override - public boolean appliesTo(@NonNull Context context, @NonNull File file) { - return true; - } - - // ---- Implements UastScanner ---- - - @Override - public UastVisitor createUastVisitor(final UastAndroidContext context) { - return new AbstractUastVisitor() { - @Override - public boolean visitCallExpression(@NotNull UCallExpression node) { - if (!(node instanceof JavaUAssertExpression)) { - return true; - } - - if (node.getValueArgumentCount() < 1) { - return true; - } - - if (!context.getLintContext().getMainProject().isAndroidProject()) { - return true; - } - - UExpression assertion = node.getValueArguments().get(0); - // Allow "assert true"; it's basically a no-op - if (assertion instanceof ULiteralExpression) { - ULiteralExpression literal = (ULiteralExpression) assertion; - if (literal.isBoolean()) { - Boolean b = ((Boolean)literal.getValue()); - if (b != null && b) { - return false; - } - } - } else { - // Allow assertions of the form "assert foo != null" because they are often used - // to make statements to tools about known nullness properties. For example, - // findViewById() may technically return null in some cases, but a developer - // may know that it won't be when it's called correctly, so the assertion helps - // to clear nullness warnings. - if (isNullCheck(assertion)) { - return false; - } - } - String message - = "Assertions are unreliable. Use `BuildConfig.DEBUG` conditional checks instead."; - context.report(ISSUE, node, context.getLocation(node), message); - return false; - } - }; - } - - /** - * Checks whether the given expression is purely a non-null check, e.g. it will return - * true for expressions like "a != null" and "a != null && b != null" and - * "b == null || c != null". - */ - private static boolean isNullCheck(UExpression expression) { - if (expression instanceof UBinaryExpression) { - UBinaryExpression binExp = (UBinaryExpression) expression; - if (isNullLiteral(binExp.getLeftOperand()) || - isNullLiteral(binExp.getRightOperand())) { - return true; - } else { - return isNullCheck(binExp.getLeftOperand()) && isNullCheck(binExp.getRightOperand()); - } - } else { - return false; - } - } -} diff --git a/plugins/lint/lint-checks/src/com/android/tools/klint/checks/BuiltinIssueRegistry.java b/plugins/lint/lint-checks/src/com/android/tools/klint/checks/BuiltinIssueRegistry.java index 20baa421d64..92407a2d6c1 100644 --- a/plugins/lint/lint-checks/src/com/android/tools/klint/checks/BuiltinIssueRegistry.java +++ b/plugins/lint/lint-checks/src/com/android/tools/klint/checks/BuiltinIssueRegistry.java @@ -43,7 +43,6 @@ public class BuiltinIssueRegistry extends IssueRegistry { issues.add(ApiDetector.OVERRIDE); issues.add(ApiDetector.UNSUPPORTED); issues.add(AppCompatCallDetector.ISSUE); - issues.add(AssertDetector.ISSUE); issues.add(CallSuperDetector.ISSUE); issues.add(CipherGetInstanceDetector.ISSUE); issues.add(CleanupDetector.COMMIT_FRAGMENT); diff --git a/plugins/lint/lint-idea/src/org/jetbrains/android/inspections/klint/AndroidLintInspectionToolProvider.java b/plugins/lint/lint-idea/src/org/jetbrains/android/inspections/klint/AndroidLintInspectionToolProvider.java index 12ae6e4de2e..1de28f8c1f4 100644 --- a/plugins/lint/lint-idea/src/org/jetbrains/android/inspections/klint/AndroidLintInspectionToolProvider.java +++ b/plugins/lint/lint-idea/src/org/jetbrains/android/inspections/klint/AndroidLintInspectionToolProvider.java @@ -117,12 +117,6 @@ public class AndroidLintInspectionToolProvider { } } - public static class AndroidKLintAssertInspection extends AndroidLintInspectionBase { - public AndroidKLintAssertInspection() { - super(AndroidBundle.message("android.lint.inspections.assert"), AssertDetector.ISSUE); - } - } - public static class AndroidKLintStringFormatCountInspection extends AndroidLintInspectionBase { public AndroidKLintStringFormatCountInspection() { super(AndroidBundle.message("android.lint.inspections.string.format.count"), StringFormatDetector.ARG_COUNT);