diff options
-rw-r--r-- | src/main/java/com/android/tools/metalava/Baseline.kt | 6 | ||||
-rw-r--r-- | src/main/java/com/android/tools/metalava/CompatibilityCheck.kt | 4 | ||||
-rw-r--r-- | src/main/java/com/android/tools/metalava/ReleaseType.kt | 14 | ||||
-rw-r--r-- | src/main/java/com/android/tools/metalava/Reporter.kt | 14 | ||||
-rw-r--r-- | src/main/java/com/android/tools/metalava/doclava1/Issues.java | 345 | ||||
-rw-r--r-- | src/main/java/com/android/tools/metalava/doclava1/Issues.kt | 310 | ||||
-rw-r--r-- | src/main/java/com/android/tools/metalava/model/IssueConfiguration.kt (renamed from src/main/java/com/android/tools/metalava/model/ErrorConfiguration.kt) | 10 |
7 files changed, 332 insertions, 371 deletions
diff --git a/src/main/java/com/android/tools/metalava/Baseline.kt b/src/main/java/com/android/tools/metalava/Baseline.kt index 205448e..8444d08 100644 --- a/src/main/java/com/android/tools/metalava/Baseline.kt +++ b/src/main/java/com/android/tools/metalava/Baseline.kt @@ -224,11 +224,11 @@ class Baseline( sb.append(format.header()) sb.append(headerComment) - map.keys.asSequence().sortedBy { it.name ?: it.code.toString() }.forEach { issue -> + map.keys.asSequence().sortedBy { it.name }.forEach { issue -> val idMap = map[issue] idMap?.keys?.sorted()?.forEach { elementId -> val message = idMap[elementId]!! - sb.append(issue.name ?: issue.code.toString()).append(": ") + sb.append(issue.name).append(": ") sb.append(elementId) sb.append(":\n ") sb.append(message).append('\n') @@ -260,7 +260,7 @@ class Baseline( " Count Issue Id Severity\n" + " ---------------------------------------------\n") val list = counts.entries.toMutableList() - list.sortWith(compareBy({ -it.value }, { it.key.name ?: it.key.code.toString() })) + list.sortWith(compareBy({ -it.value }, { it.key.name })) var total = 0 for (entry in list) { val count = entry.value diff --git a/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt b/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt index 0cd51dd..6292dce 100644 --- a/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt +++ b/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt @@ -869,10 +869,10 @@ class CompatibilityCheck( ) { val filter = apiType.getEmitFilter() val checker = CompatibilityCheck(filter, previous, apiType, base) - val errorConfiguration = releaseType.getErrorConfiguration() + val issueConfiguration = releaseType.getIssueConfiguration() val previousConfiguration = configuration try { - configuration = errorConfiguration + configuration = issueConfiguration CodebaseComparator().compare(checker, previous, codebase, filter) } finally { configuration = previousConfiguration diff --git a/src/main/java/com/android/tools/metalava/ReleaseType.kt b/src/main/java/com/android/tools/metalava/ReleaseType.kt index 6312b15..814cc77 100644 --- a/src/main/java/com/android/tools/metalava/ReleaseType.kt +++ b/src/main/java/com/android/tools/metalava/ReleaseType.kt @@ -17,7 +17,7 @@ package com.android.tools.metalava import com.android.tools.metalava.doclava1.Issues -import com.android.tools.metalava.model.ErrorConfiguration +import com.android.tools.metalava.model.IssueConfiguration enum class ReleaseType(val flagName: String, private val displayName: String = flagName) { DEV("current", "development") { @@ -30,8 +30,8 @@ enum class ReleaseType(val flagName: String, private val displayName: String = f * "-error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 " + * "-error 25 -error 26 -error 27", */ - override fun getErrorConfiguration(): ErrorConfiguration { - return super.getErrorConfiguration().apply { + override fun getIssueConfiguration(): IssueConfiguration { + return super.getIssueConfiguration().apply { error(Issues.ADDED_CLASS) error(Issues.ADDED_FIELD) error(Issues.ADDED_FINAL_UNINSTANTIABLE) @@ -58,8 +58,8 @@ enum class ReleaseType(val flagName: String, private val displayName: String = f * "-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 " + * "-error 16 -error 17 -error 18 -error 31", */ - override fun getErrorConfiguration(): ErrorConfiguration { - return super.getErrorConfiguration().apply { + override fun getIssueConfiguration(): IssueConfiguration { + return super.getIssueConfiguration().apply { error(Issues.ADDED_ABSTRACT_METHOD) hide(Issues.ADDED_CLASS) hide(Issues.ADDED_FIELD) @@ -75,8 +75,8 @@ enum class ReleaseType(val flagName: String, private val displayName: String = f }; /** Returns the error configuration to use for the given release type */ - open fun getErrorConfiguration(): ErrorConfiguration { - return ErrorConfiguration().apply { + open fun getIssueConfiguration(): IssueConfiguration { + return IssueConfiguration().apply { error(Issues.ADDED_FINAL) error(Issues.CHANGED_STATIC) error(Issues.CHANGED_SUPERCLASS) diff --git a/src/main/java/com/android/tools/metalava/Reporter.kt b/src/main/java/com/android/tools/metalava/Reporter.kt index 4371e4f..0af715a 100644 --- a/src/main/java/com/android/tools/metalava/Reporter.kt +++ b/src/main/java/com/android/tools/metalava/Reporter.kt @@ -328,7 +328,7 @@ open class Reporter(private val rootFolder: File? = File("").absoluteFile) { sb.append(resetTerminal()) sb.append(message) id?.let { - sb.append(" [").append(if (it.name != null) it.name else it.code).append("]") + sb.append(" [").append(it.name).append("]") } } else { if (!omitLocations) { @@ -344,7 +344,7 @@ open class Reporter(private val rootFolder: File? = File("").absoluteFile) { INHERIT, HIDDEN -> { } } - id?.let { sb.append(if (it.name != null) it.name else it.code).append(": ") } + id?.let { sb.append(it.name).append(": ") } sb.append(message) } else { when (severity) { @@ -358,13 +358,9 @@ open class Reporter(private val rootFolder: File? = File("").absoluteFile) { sb.append(message) id?.let { sb.append(" [") - if (it.name != null) { - sb.append(it.name) - } - if (compatibility.includeExitCode || it.name == null) { - if (it.name != null) { - sb.append(":") - } + sb.append(it.name) + if (compatibility.includeExitCode) { + sb.append(":") sb.append(it.code) } sb.append("]") diff --git a/src/main/java/com/android/tools/metalava/doclava1/Issues.java b/src/main/java/com/android/tools/metalava/doclava1/Issues.java deleted file mode 100644 index c1aefd8..0000000 --- a/src/main/java/com/android/tools/metalava/doclava1/Issues.java +++ /dev/null @@ -1,345 +0,0 @@ -/* - * Copyright (C) 2017 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.metalava.doclava1; - -import com.android.tools.metalava.Severity; -import org.jetbrains.annotations.Nullable; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; - -import static com.android.sdklib.SdkVersionInfo.underlinesToCamelCase; - -// Copied from doclava1 (and a bunch of stuff left alone; preserving to have same error id's) -public class Issues { - public static class Issue { - public final int code; - @Nullable - String fieldName; - - public final Severity defaultLevel; - - /** - * The name of this issue if known - */ - @Nullable - public String name; - - /** - * When {@code level} is set to {@link Severity#INHERIT}, this is the parent from - * which the issue will inherit its level. - */ - public final Issue parent; - - /** Related rule, if any */ - public final String rule; - - /** Related explanation, if any */ - public final String explanation; - - /** Applicable category */ - public final Category category; - - private Issue(int code, Severity defaultLevel) { - this(code, defaultLevel, Category.UNKNOWN); - } - - private Issue(int code, Severity defaultLevel, Category category) { - this(code, defaultLevel, null, category, null, null); - } - - private Issue(int code, Severity defaultLevel, Category category, String rule) { - this(code, defaultLevel, null, category, rule, null); - } - - private Issue(int code, Issue parent, Category category) { - this(code, Severity.INHERIT, parent, category, null, null); - } - - private Issue(int code, Severity defaultLevel, Issue parent, Category category, - String rule, String explanation) { - this.code = code; - this.defaultLevel = defaultLevel; - this.parent = parent; - this.category = category; - this.rule = rule; - this.explanation = explanation; - ISSUES.add(this); - } - - public String toString() { - return "Issue #" + this.code + " (" + this.name + ")"; - } - } - - private static final List<Issue> ISSUES = new ArrayList<>(100); - private static final Map<String, Issue> nameToIssue = new HashMap<>(100); - private static final Map<Integer, Issue> idToIssue = new HashMap<>(100); - - public enum Category { - COMPATIBILITY("Compatibility", null), - DOCUMENTATION("Documentation", null), - API_LINT("API Lint", "go/android-api-guidelines"), - UNKNOWN("Default", null); - - public final String description; - public final String ruleLink; - - Category(String description, String ruleLink) { - this.description = description; - this.ruleLink = ruleLink; - } - } - - // Issues for API verification - public static final Issue PARSE_ERROR = new Issue(1, Severity.ERROR); - public static final Issue ADDED_PACKAGE = new Issue(2, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue ADDED_CLASS = new Issue(3, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue ADDED_METHOD = new Issue(4, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue ADDED_FIELD = new Issue(5, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue ADDED_INTERFACE = new Issue(6, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue REMOVED_PACKAGE = new Issue(7, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue REMOVED_CLASS = new Issue(8, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue REMOVED_METHOD = new Issue(9, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue REMOVED_FIELD = new Issue(10, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue REMOVED_INTERFACE = new Issue(11, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue CHANGED_STATIC = new Issue(12, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue ADDED_FINAL = new Issue(13, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue CHANGED_TRANSIENT = new Issue(14, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue CHANGED_VOLATILE = new Issue(15, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue CHANGED_TYPE = new Issue(16, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue CHANGED_VALUE = new Issue(17, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue CHANGED_SUPERCLASS = new Issue(18, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue CHANGED_SCOPE = new Issue(19, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue CHANGED_ABSTRACT = new Issue(20, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue CHANGED_THROWS = new Issue(21, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue CHANGED_NATIVE = new Issue(22, Severity.HIDDEN, Category.COMPATIBILITY); - public static final Issue CHANGED_CLASS = new Issue(23, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue CHANGED_DEPRECATED = new Issue(24, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue CHANGED_SYNCHRONIZED = new Issue(25, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue ADDED_FINAL_UNINSTANTIABLE = new Issue(26, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue REMOVED_FINAL = new Issue(27, Severity.WARNING, Category.COMPATIBILITY); - public static final Issue REMOVED_DEPRECATED_CLASS = new Issue(28, REMOVED_CLASS, Category.COMPATIBILITY); - public static final Issue REMOVED_DEPRECATED_METHOD = new Issue(29, REMOVED_METHOD, Category.COMPATIBILITY); - public static final Issue REMOVED_DEPRECATED_FIELD = new Issue(30, REMOVED_FIELD, Category.COMPATIBILITY); - public static final Issue ADDED_ABSTRACT_METHOD = new Issue(31, ADDED_METHOD, Category.COMPATIBILITY); - public static final Issue ADDED_REIFIED = new Issue(32, Severity.WARNING, Category.COMPATIBILITY); - - // Issues in javadoc generation - public static final Issue UNRESOLVED_LINK = new Issue(101, Severity.LINT, Category.DOCUMENTATION); - public static final Issue BAD_INCLUDE_TAG = new Issue(102, Severity.LINT, Category.DOCUMENTATION); - public static final Issue UNKNOWN_TAG = new Issue(103, Severity.LINT, Category.DOCUMENTATION); - public static final Issue UNKNOWN_PARAM_TAG_NAME = new Issue(104, Severity.LINT, Category.DOCUMENTATION); - public static final Issue UNDOCUMENTED_PARAMETER = new Issue(105, Severity.HIDDEN, Category.DOCUMENTATION); - public static final Issue BAD_ATTR_TAG = new Issue(106, Severity.LINT, Category.DOCUMENTATION); - public static final Issue BAD_INHERITDOC = new Issue(107, Severity.HIDDEN, Category.DOCUMENTATION); - public static final Issue HIDDEN_LINK = new Issue(108, Severity.LINT, Category.DOCUMENTATION); - public static final Issue HIDDEN_CONSTRUCTOR = new Issue(109, Severity.WARNING, Category.DOCUMENTATION); - public static final Issue UNAVAILABLE_SYMBOL = new Issue(110, Severity.WARNING, Category.DOCUMENTATION); - public static final Issue HIDDEN_SUPERCLASS = new Issue(111, Severity.WARNING, Category.DOCUMENTATION); - public static final Issue DEPRECATED = new Issue(112, Severity.HIDDEN, Category.DOCUMENTATION); - public static final Issue DEPRECATION_MISMATCH = new Issue(113, Severity.ERROR, Category.DOCUMENTATION); - public static final Issue MISSING_COMMENT = new Issue(114, Severity.LINT, Category.DOCUMENTATION); - public static final Issue IO_ERROR = new Issue(115, Severity.ERROR); - public static final Issue NO_SINCE_DATA = new Issue(116, Severity.HIDDEN, Category.DOCUMENTATION); - public static final Issue NO_FEDERATION_DATA = new Issue(117, Severity.WARNING, Category.DOCUMENTATION); - public static final Issue BROKEN_SINCE_FILE = new Issue(118, Severity.ERROR, Category.DOCUMENTATION); - public static final Issue INVALID_CONTENT_TYPE = new Issue(119, Severity.ERROR, Category.DOCUMENTATION); - public static final Issue INVALID_SAMPLE_INDEX = new Issue(120, Severity.ERROR, Category.DOCUMENTATION); - public static final Issue HIDDEN_TYPE_PARAMETER = new Issue(121, Severity.WARNING, Category.DOCUMENTATION); - public static final Issue PRIVATE_SUPERCLASS = new Issue(122, Severity.WARNING, Category.DOCUMENTATION); - public static final Issue NULLABLE = new Issue(123, Severity.HIDDEN, Category.DOCUMENTATION); - public static final Issue INT_DEF = new Issue(124, Severity.HIDDEN, Category.DOCUMENTATION); - public static final Issue REQUIRES_PERMISSION = new Issue(125, Severity.LINT, Category.DOCUMENTATION); - public static final Issue BROADCAST_BEHAVIOR = new Issue(126, Severity.LINT, Category.DOCUMENTATION); - public static final Issue SDK_CONSTANT = new Issue(127, Severity.LINT, Category.DOCUMENTATION); - public static final Issue TODO = new Issue(128, Severity.LINT, Category.DOCUMENTATION); - public static final Issue NO_ARTIFACT_DATA = new Issue(129, Severity.HIDDEN, Category.DOCUMENTATION); - public static final Issue BROKEN_ARTIFACT_FILE = new Issue(130, Severity.ERROR, Category.DOCUMENTATION); - - // Metalava new warnings (not from doclava) - - public static final Issue TYPO = new Issue(131, Severity.WARNING, Category.DOCUMENTATION); - public static final Issue MISSING_PERMISSION = new Issue(132, Severity.LINT, Category.DOCUMENTATION); - public static final Issue MULTIPLE_THREAD_ANNOTATIONS = new Issue(133, Severity.LINT, Category.DOCUMENTATION); - public static final Issue UNRESOLVED_CLASS = new Issue(134, Severity.LINT, Category.DOCUMENTATION); - public static final Issue INVALID_NULL_CONVERSION = new Issue(135, Severity.ERROR, Category.COMPATIBILITY); - public static final Issue PARAMETER_NAME_CHANGE = new Issue(136, Severity.ERROR, Category.COMPATIBILITY); - public static final Issue OPERATOR_REMOVAL = new Issue(137, Severity.ERROR, Category.COMPATIBILITY); - public static final Issue INFIX_REMOVAL = new Issue(138, Severity.ERROR, Category.COMPATIBILITY); - public static final Issue VARARG_REMOVAL = new Issue(139, Severity.ERROR, Category.COMPATIBILITY); - public static final Issue ADD_SEALED = new Issue(140, Severity.ERROR, Category.COMPATIBILITY); - public static final Issue DEFAULT_VALUE_CHANGE = new Issue(141, Severity.ERROR, Category.COMPATIBILITY); // Formerly 144, then 382 - - public static final Issue ANNOTATION_EXTRACTION = new Issue(146, Severity.ERROR); - public static final Issue SUPERFLUOUS_PREFIX = new Issue(147, Severity.WARNING); - public static final Issue HIDDEN_TYPEDEF_CONSTANT = new Issue(148, Severity.ERROR); - public static final Issue EXPECTED_PLATFORM_TYPE = new Issue(149, Severity.HIDDEN); - public static final Issue INTERNAL_ERROR = new Issue(150, Severity.ERROR); - public static final Issue RETURNING_UNEXPECTED_CONSTANT = new Issue(151, Severity.WARNING); - public static final Issue DEPRECATED_OPTION = new Issue(152, Severity.WARNING); - public static final Issue BOTH_PACKAGE_INFO_AND_HTML = new Issue(153, Severity.WARNING, Category.DOCUMENTATION); - // The plan is for this to be set as an error once (1) existing code is marked as @deprecated - // and (2) the principle is adopted by the API council - public static final Issue REFERENCES_DEPRECATED = new Issue(154, Severity.HIDDEN); - public static final Issue UNHIDDEN_SYSTEM_API = new Issue(155, Severity.ERROR); - public static final Issue SHOWING_MEMBER_IN_HIDDEN_CLASS = new Issue(156, Severity.ERROR); - public static final Issue INVALID_NULLABILITY_ANNOTATION = new Issue(157, Severity.ERROR); - public static final Issue REFERENCES_HIDDEN = new Issue(158, Severity.ERROR); - public static final Issue IGNORING_SYMLINK = new Issue(159, Severity.INFO); - public static final Issue INVALID_NULLABILITY_ANNOTATION_WARNING = new Issue(160, Severity.WARNING); - // The plan is for this to be set as an error once (1) existing code is marked as @deprecated - // and (2) the principle is adopted by the API council - public static final Issue EXTENDS_DEPRECATED = new Issue(161, Severity.HIDDEN); - public static final Issue FORBIDDEN_TAG = new Issue(162, Severity.ERROR); - public static final Issue MISSING_COLUMN = new Issue(163, Severity.WARNING, Category.DOCUMENTATION); - public static final Issue INVALID_SYNTAX = new Issue(164, Severity.ERROR); - - // API lint - public static final Issue START_WITH_LOWER = new Issue(300, Severity.ERROR, Category.API_LINT, "S1"); - public static final Issue START_WITH_UPPER = new Issue(301, Severity.ERROR, Category.API_LINT, "S1"); - public static final Issue ALL_UPPER = new Issue(302, Severity.ERROR, Category.API_LINT, "C2"); - public static final Issue ACRONYM_NAME = new Issue(303, Severity.WARNING, Category.API_LINT, "S1"); - public static final Issue ENUM = new Issue(304, Severity.ERROR, Category.API_LINT, "F5"); - public static final Issue ENDS_WITH_IMPL = new Issue(305, Severity.ERROR, Category.API_LINT); - public static final Issue MIN_MAX_CONSTANT = new Issue(306, Severity.WARNING, Category.API_LINT, "C8"); - public static final Issue COMPILE_TIME_CONSTANT = new Issue(307, Severity.ERROR, Category.API_LINT); - public static final Issue SINGULAR_CALLBACK = new Issue(308, Severity.ERROR, Category.API_LINT, "L1"); - public static final Issue CALLBACK_NAME = new Issue(309, Severity.WARNING, Category.API_LINT, "L1"); - public static final Issue CALLBACK_INTERFACE = new Issue(310, Severity.ERROR, Category.API_LINT, "CL3"); - public static final Issue CALLBACK_METHOD_NAME = new Issue(311, Severity.ERROR, Category.API_LINT, "L1"); - public static final Issue LISTENER_INTERFACE = new Issue(312, Severity.ERROR, Category.API_LINT, "L1"); - public static final Issue SINGLE_METHOD_INTERFACE = new Issue(313, Severity.ERROR, Category.API_LINT, "L1"); - public static final Issue INTENT_NAME = new Issue(314, Severity.ERROR, Category.API_LINT, "C3"); - public static final Issue ACTION_VALUE = new Issue(315, Severity.ERROR, Category.API_LINT, "C4"); - public static final Issue EQUALS_AND_HASH_CODE = new Issue(316, Severity.ERROR, Category.API_LINT, "M8"); - public static final Issue PARCEL_CREATOR = new Issue(317, Severity.ERROR, Category.API_LINT, "FW3"); - public static final Issue PARCEL_NOT_FINAL = new Issue(318, Severity.ERROR, Category.API_LINT, "FW8"); - public static final Issue PARCEL_CONSTRUCTOR = new Issue(319, Severity.ERROR, Category.API_LINT, "FW3"); - public static final Issue PROTECTED_MEMBER = new Issue(320, Severity.ERROR, Category.API_LINT, "M7"); - public static final Issue PAIRED_REGISTRATION = new Issue(321, Severity.ERROR, Category.API_LINT, "L2"); - public static final Issue REGISTRATION_NAME = new Issue(322, Severity.ERROR, Category.API_LINT, "L3"); - public static final Issue VISIBLY_SYNCHRONIZED = new Issue(323, Severity.ERROR, Category.API_LINT, "M5"); - public static final Issue INTENT_BUILDER_NAME = new Issue(324, Severity.WARNING, Category.API_LINT, "FW1"); - public static final Issue CONTEXT_NAME_SUFFIX = new Issue(325, Severity.ERROR, Category.API_LINT, "C4"); - public static final Issue INTERFACE_CONSTANT = new Issue(326, Severity.ERROR, Category.API_LINT, "C4"); - public static final Issue ON_NAME_EXPECTED = new Issue(327, Severity.WARNING, Category.API_LINT); - public static final Issue TOP_LEVEL_BUILDER = new Issue(328, Severity.WARNING, Category.API_LINT); - public static final Issue MISSING_BUILD_METHOD = new Issue(329, Severity.WARNING, Category.API_LINT); - public static final Issue BUILDER_SET_STYLE = new Issue(330, Severity.WARNING, Category.API_LINT); - public static final Issue SETTER_RETURNS_THIS = new Issue(331, Severity.WARNING, Category.API_LINT, "M4"); - public static final Issue RAW_AIDL = new Issue(332, Severity.ERROR, Category.API_LINT); - public static final Issue INTERNAL_CLASSES = new Issue(333, Severity.ERROR, Category.API_LINT); - public static final Issue PACKAGE_LAYERING = new Issue(334, Severity.WARNING, Category.API_LINT, "FW6"); - public static final Issue GETTER_SETTER_NAMES = new Issue(335, Severity.ERROR, Category.API_LINT, "M6"); - public static final Issue CONCRETE_COLLECTION = new Issue(336, Severity.ERROR, Category.API_LINT, "CL2"); - public static final Issue OVERLAPPING_CONSTANTS = new Issue(337, Severity.WARNING, Category.API_LINT, "C1"); - public static final Issue GENERIC_EXCEPTION = new Issue(338, Severity.ERROR, Category.API_LINT, "S1"); - public static final Issue ILLEGAL_STATE_EXCEPTION = new Issue(339, Severity.WARNING, Category.API_LINT, "S1"); - public static final Issue RETHROW_REMOTE_EXCEPTION = new Issue(340, Severity.ERROR, Category.API_LINT, "FW9"); - public static final Issue MENTIONS_GOOGLE = new Issue(341, Severity.ERROR, Category.API_LINT); - public static final Issue HEAVY_BIT_SET = new Issue(342, Severity.ERROR, Category.API_LINT); - public static final Issue MANAGER_CONSTRUCTOR = new Issue(343, Severity.ERROR, Category.API_LINT); - public static final Issue MANAGER_LOOKUP = new Issue(344, Severity.ERROR, Category.API_LINT); - public static final Issue AUTO_BOXING = new Issue(345, Severity.ERROR, Category.API_LINT, "M11"); - public static final Issue STATIC_UTILS = new Issue(346, Severity.ERROR, Category.API_LINT); - public static final Issue CONTEXT_FIRST = new Issue(347, Severity.ERROR, Category.API_LINT, "M3"); - public static final Issue LISTENER_LAST = new Issue(348, Severity.WARNING, Category.API_LINT, "M3"); - public static final Issue EXECUTOR_REGISTRATION = new Issue(349, Severity.WARNING, Category.API_LINT, "L1"); - public static final Issue CONFIG_FIELD_NAME = new Issue(350, Severity.ERROR, Category.API_LINT); - public static final Issue RESOURCE_FIELD_NAME = new Issue(351, Severity.ERROR, Category.API_LINT); - public static final Issue RESOURCE_VALUE_FIELD_NAME = new Issue(352, Severity.ERROR, Category.API_LINT, "C7"); - public static final Issue RESOURCE_STYLE_FIELD_NAME = new Issue(353, Severity.ERROR, Category.API_LINT, "C7"); - public static final Issue STREAM_FILES = new Issue(354, Severity.WARNING, Category.API_LINT, "M10"); - public static final Issue PARCELABLE_LIST = new Issue(355, Severity.WARNING, Category.API_LINT); - public static final Issue ABSTRACT_INNER = new Issue(356, Severity.WARNING, Category.API_LINT); - public static final Issue BANNED_THROW = new Issue(358, Severity.ERROR, Category.API_LINT); - public static final Issue EXTENDS_ERROR = new Issue(359, Severity.ERROR, Category.API_LINT); - public static final Issue EXCEPTION_NAME = new Issue(360, Severity.ERROR, Category.API_LINT); - public static final Issue METHOD_NAME_UNITS = new Issue(361, Severity.ERROR, Category.API_LINT); - public static final Issue FRACTION_FLOAT = new Issue(362, Severity.ERROR, Category.API_LINT); - public static final Issue PERCENTAGE_INT = new Issue(363, Severity.ERROR, Category.API_LINT); - public static final Issue NOT_CLOSEABLE = new Issue(364, Severity.WARNING, Category.API_LINT); - public static final Issue KOTLIN_OPERATOR = new Issue(365, Severity.INFO, Category.API_LINT); - public static final Issue ARRAY_RETURN = new Issue(366, Severity.WARNING, Category.API_LINT); - public static final Issue USER_HANDLE = new Issue(367, Severity.WARNING, Category.API_LINT); - public static final Issue USER_HANDLE_NAME = new Issue(368, Severity.WARNING, Category.API_LINT); - public static final Issue SERVICE_NAME = new Issue(369, Severity.ERROR, Category.API_LINT, "C4"); - public static final Issue METHOD_NAME_TENSE = new Issue(370, Severity.WARNING, Category.API_LINT); - public static final Issue NO_CLONE = new Issue(371, Severity.ERROR, Category.API_LINT); - public static final Issue USE_ICU = new Issue(372, Severity.WARNING, Category.API_LINT); - public static final Issue USE_PARCEL_FILE_DESCRIPTOR = new Issue(373, Severity.ERROR, Category.API_LINT, "FW11"); - public static final Issue NO_BYTE_OR_SHORT = new Issue(374, Severity.WARNING, Category.API_LINT, "FW12"); - public static final Issue SINGLETON_CONSTRUCTOR = new Issue(375, Severity.ERROR, Category.API_LINT); - public static final Issue COMMON_ARGS_FIRST = new Issue(376, Severity.WARNING, Category.API_LINT, "M2"); - public static final Issue CONSISTENT_ARGUMENT_ORDER = new Issue(377, Severity.ERROR, Category.API_LINT, "M2"); - public static final Issue KOTLIN_KEYWORD = new Issue(378, Severity.ERROR, Category.API_LINT); // Formerly 141 - public static final Issue UNIQUE_KOTLIN_OPERATOR = new Issue(379, Severity.ERROR, Category.API_LINT); - public static final Issue SAM_SHOULD_BE_LAST = new Issue(380, Severity.WARNING, Category.API_LINT); // Formerly 142 - public static final Issue MISSING_JVMSTATIC = new Issue(381, Severity.WARNING, Category.API_LINT); // Formerly 143 - public static final Issue DOCUMENT_EXCEPTIONS = new Issue(383, Severity.ERROR, Category.API_LINT); // Formerly 145 - public static final Issue FORBIDDEN_SUPER_CLASS = new Issue(384, Severity.ERROR, Category.API_LINT); - public static final Issue MISSING_NULLABILITY = new Issue(385, Severity.ERROR, Category.API_LINT); - public static final Issue MUTABLE_BARE_FIELD = new Issue(386, Severity.ERROR, Category.API_LINT, "F2"); - public static final Issue INTERNAL_FIELD = new Issue(387, Severity.ERROR, Category.API_LINT, "F2"); - public static final Issue PUBLIC_TYPEDEF = new Issue(388, Severity.ERROR, Category.API_LINT, "FW15"); - public static final Issue ANDROID_URI = new Issue(389, Severity.ERROR, Category.API_LINT, "FW14"); - public static final Issue BAD_FUTURE = new Issue(390, Severity.ERROR, Category.API_LINT); - - static { - // Attempt to initialize issue names based on the field names - try { - for (Field field : Issues.class.getDeclaredFields()) { - Object o = field.get(null); - if (o instanceof Issue) { - Issue issue = (Issue) o; - String fieldName = field.getName(); - issue.fieldName = fieldName; - issue.name = underlinesToCamelCase(fieldName.toLowerCase(Locale.US)); - nameToIssue.put(issue.name, issue); - idToIssue.put(issue.code, issue); - } - } - } catch (Throwable unexpected) { - unexpected.printStackTrace(); - } - } - - @Nullable - public static Issue findIssueById(int id) { - return idToIssue.get(id); - } - - @Nullable - public static Issue findIssueById(String id) { - return nameToIssue.get(id); - } - - @Nullable - public static Issue findIssueByIdIgnoringCase(String id) { - for (Issue e : ISSUES) { - if (id.equalsIgnoreCase(e.name)) { - return e; - } - } - return null; - } -} - diff --git a/src/main/java/com/android/tools/metalava/doclava1/Issues.kt b/src/main/java/com/android/tools/metalava/doclava1/Issues.kt new file mode 100644 index 0000000..8b61599 --- /dev/null +++ b/src/main/java/com/android/tools/metalava/doclava1/Issues.kt @@ -0,0 +1,310 @@ +/* + * Copyright (C) 2017 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.metalava.doclava1 + +import com.android.sdklib.SdkVersionInfo +import com.android.tools.metalava.Severity +import java.util.ArrayList +import java.util.HashMap +import java.util.Locale +import kotlin.reflect.full.declaredMemberProperties + +// Copied from doclava1 (and a bunch of stuff left alone preserving to have same error id's) +object Issues { + private val allIssues: MutableList<Issue> = ArrayList(200) + private val nameToIssue: MutableMap<String, Issue> = HashMap(200) + private val idToIssue: MutableMap<Int, Issue> = HashMap(200) + + val PARSE_ERROR = Issue(1, Severity.ERROR) + val ADDED_PACKAGE = Issue(2, Severity.WARNING, Category.COMPATIBILITY) + val ADDED_CLASS = Issue(3, Severity.WARNING, Category.COMPATIBILITY) + val ADDED_METHOD = Issue(4, Severity.WARNING, Category.COMPATIBILITY) + val ADDED_FIELD = Issue(5, Severity.WARNING, Category.COMPATIBILITY) + val ADDED_INTERFACE = Issue(6, Severity.WARNING, Category.COMPATIBILITY) + val REMOVED_PACKAGE = Issue(7, Severity.WARNING, Category.COMPATIBILITY) + val REMOVED_CLASS = Issue(8, Severity.WARNING, Category.COMPATIBILITY) + val REMOVED_METHOD = Issue(9, Severity.WARNING, Category.COMPATIBILITY) + val REMOVED_FIELD = Issue(10, Severity.WARNING, Category.COMPATIBILITY) + val REMOVED_INTERFACE = Issue(11, Severity.WARNING, Category.COMPATIBILITY) + val CHANGED_STATIC = Issue(12, Severity.WARNING, Category.COMPATIBILITY) + val ADDED_FINAL = Issue(13, Severity.WARNING, Category.COMPATIBILITY) + val CHANGED_TRANSIENT = Issue(14, Severity.WARNING, Category.COMPATIBILITY) + val CHANGED_VOLATILE = Issue(15, Severity.WARNING, Category.COMPATIBILITY) + val CHANGED_TYPE = Issue(16, Severity.WARNING, Category.COMPATIBILITY) + val CHANGED_VALUE = Issue(17, Severity.WARNING, Category.COMPATIBILITY) + val CHANGED_SUPERCLASS = Issue(18, Severity.WARNING, Category.COMPATIBILITY) + val CHANGED_SCOPE = Issue(19, Severity.WARNING, Category.COMPATIBILITY) + val CHANGED_ABSTRACT = Issue(20, Severity.WARNING, Category.COMPATIBILITY) + val CHANGED_THROWS = Issue(21, Severity.WARNING, Category.COMPATIBILITY) + val CHANGED_NATIVE = Issue(22, Severity.HIDDEN, Category.COMPATIBILITY) + val CHANGED_CLASS = Issue(23, Severity.WARNING, Category.COMPATIBILITY) + val CHANGED_DEPRECATED = Issue(24, Severity.WARNING, Category.COMPATIBILITY) + val CHANGED_SYNCHRONIZED = Issue(25, Severity.WARNING, Category.COMPATIBILITY) + val ADDED_FINAL_UNINSTANTIABLE = Issue(26, Severity.WARNING, Category.COMPATIBILITY) + val REMOVED_FINAL = Issue(27, Severity.WARNING, Category.COMPATIBILITY) + val REMOVED_DEPRECATED_CLASS = Issue(28, REMOVED_CLASS, Category.COMPATIBILITY) + val REMOVED_DEPRECATED_METHOD = Issue(29, REMOVED_METHOD, Category.COMPATIBILITY) + val REMOVED_DEPRECATED_FIELD = Issue(30, REMOVED_FIELD, Category.COMPATIBILITY) + val ADDED_ABSTRACT_METHOD = Issue(31, ADDED_METHOD, Category.COMPATIBILITY) + val ADDED_REIFIED = Issue(32, Severity.WARNING, Category.COMPATIBILITY) + + // Issues in javadoc generation + val UNRESOLVED_LINK = Issue(101, Severity.LINT, Category.DOCUMENTATION) + val BAD_INCLUDE_TAG = Issue(102, Severity.LINT, Category.DOCUMENTATION) + val UNKNOWN_TAG = Issue(103, Severity.LINT, Category.DOCUMENTATION) + val UNKNOWN_PARAM_TAG_NAME = Issue(104, Severity.LINT, Category.DOCUMENTATION) + val UNDOCUMENTED_PARAMETER = Issue(105, Severity.HIDDEN, Category.DOCUMENTATION) + val BAD_ATTR_TAG = Issue(106, Severity.LINT, Category.DOCUMENTATION) + val BAD_INHERITDOC = Issue(107, Severity.HIDDEN, Category.DOCUMENTATION) + val HIDDEN_LINK = Issue(108, Severity.LINT, Category.DOCUMENTATION) + val HIDDEN_CONSTRUCTOR = Issue(109, Severity.WARNING, Category.DOCUMENTATION) + val UNAVAILABLE_SYMBOL = Issue(110, Severity.WARNING, Category.DOCUMENTATION) + val HIDDEN_SUPERCLASS = Issue(111, Severity.WARNING, Category.DOCUMENTATION) + val DEPRECATED = Issue(112, Severity.HIDDEN, Category.DOCUMENTATION) + val DEPRECATION_MISMATCH = Issue(113, Severity.ERROR, Category.DOCUMENTATION) + val MISSING_COMMENT = Issue(114, Severity.LINT, Category.DOCUMENTATION) + val IO_ERROR = Issue(115, Severity.ERROR) + val NO_SINCE_DATA = Issue(116, Severity.HIDDEN, Category.DOCUMENTATION) + val NO_FEDERATION_DATA = Issue(117, Severity.WARNING, Category.DOCUMENTATION) + val BROKEN_SINCE_FILE = Issue(118, Severity.ERROR, Category.DOCUMENTATION) + val INVALID_CONTENT_TYPE = Issue(119, Severity.ERROR, Category.DOCUMENTATION) + val INVALID_SAMPLE_INDEX = Issue(120, Severity.ERROR, Category.DOCUMENTATION) + val HIDDEN_TYPE_PARAMETER = Issue(121, Severity.WARNING, Category.DOCUMENTATION) + val PRIVATE_SUPERCLASS = Issue(122, Severity.WARNING, Category.DOCUMENTATION) + val NULLABLE = Issue(123, Severity.HIDDEN, Category.DOCUMENTATION) + val INT_DEF = Issue(124, Severity.HIDDEN, Category.DOCUMENTATION) + val REQUIRES_PERMISSION = Issue(125, Severity.LINT, Category.DOCUMENTATION) + val BROADCAST_BEHAVIOR = Issue(126, Severity.LINT, Category.DOCUMENTATION) + val SDK_CONSTANT = Issue(127, Severity.LINT, Category.DOCUMENTATION) + val TODO = Issue(128, Severity.LINT, Category.DOCUMENTATION) + val NO_ARTIFACT_DATA = Issue(129, Severity.HIDDEN, Category.DOCUMENTATION) + val BROKEN_ARTIFACT_FILE = Issue(130, Severity.ERROR, Category.DOCUMENTATION) + + // Metalava warnings (not from doclava) + + val TYPO = Issue(131, Severity.WARNING, Category.DOCUMENTATION) + val MISSING_PERMISSION = Issue(132, Severity.LINT, Category.DOCUMENTATION) + val MULTIPLE_THREAD_ANNOTATIONS = Issue(133, Severity.LINT, Category.DOCUMENTATION) + val UNRESOLVED_CLASS = Issue(134, Severity.LINT, Category.DOCUMENTATION) + val INVALID_NULL_CONVERSION = Issue(135, Severity.ERROR, Category.COMPATIBILITY) + val PARAMETER_NAME_CHANGE = Issue(136, Severity.ERROR, Category.COMPATIBILITY) + val OPERATOR_REMOVAL = Issue(137, Severity.ERROR, Category.COMPATIBILITY) + val INFIX_REMOVAL = Issue(138, Severity.ERROR, Category.COMPATIBILITY) + val VARARG_REMOVAL = Issue(139, Severity.ERROR, Category.COMPATIBILITY) + val ADD_SEALED = Issue(140, Severity.ERROR, Category.COMPATIBILITY) + val ANNOTATION_EXTRACTION = Issue(146, Severity.ERROR) + val SUPERFLUOUS_PREFIX = Issue(147, Severity.WARNING) + val HIDDEN_TYPEDEF_CONSTANT = Issue(148, Severity.ERROR) + val EXPECTED_PLATFORM_TYPE = Issue(149, Severity.HIDDEN) + val INTERNAL_ERROR = Issue(150, Severity.ERROR) + val RETURNING_UNEXPECTED_CONSTANT = Issue(151, Severity.WARNING) + val DEPRECATED_OPTION = Issue(152, Severity.WARNING) + val BOTH_PACKAGE_INFO_AND_HTML = Issue(153, Severity.WARNING, Category.DOCUMENTATION) + // The plan is for this to be set as an error once (1) existing code is marked as @deprecated + // and (2) the principle is adopted by the API council + val REFERENCES_DEPRECATED = Issue(154, Severity.HIDDEN) + val UNHIDDEN_SYSTEM_API = Issue(155, Severity.ERROR) + val SHOWING_MEMBER_IN_HIDDEN_CLASS = Issue(156, Severity.ERROR) + val INVALID_NULLABILITY_ANNOTATION = Issue(157, Severity.ERROR) + val REFERENCES_HIDDEN = Issue(158, Severity.ERROR) + val IGNORING_SYMLINK = Issue(159, Severity.INFO) + val INVALID_NULLABILITY_ANNOTATION_WARNING = Issue(160, Severity.WARNING) + // The plan is for this to be set as an error once (1) existing code is marked as @deprecated + // and (2) the principle is adopted by the API council + val EXTENDS_DEPRECATED = Issue(161, Severity.HIDDEN) + val FORBIDDEN_TAG = Issue(162, Severity.ERROR) + val MISSING_COLUMN = Issue(163, Severity.WARNING, Category.DOCUMENTATION) + val INVALID_SYNTAX = Issue(164, Severity.ERROR) + + // API lint + val START_WITH_LOWER = Issue(300, Severity.ERROR, Category.API_LINT, "S1") + val START_WITH_UPPER = Issue(301, Severity.ERROR, Category.API_LINT, "S1") + val ALL_UPPER = Issue(302, Severity.ERROR, Category.API_LINT, "C2") + val ACRONYM_NAME = Issue(303, Severity.WARNING, Category.API_LINT, "S1") + val ENUM = Issue(304, Severity.ERROR, Category.API_LINT, "F5") + val ENDS_WITH_IMPL = Issue(305, Severity.ERROR, Category.API_LINT) + val MIN_MAX_CONSTANT = Issue(306, Severity.WARNING, Category.API_LINT, "C8") + val COMPILE_TIME_CONSTANT = Issue(307, Severity.ERROR, Category.API_LINT) + val SINGULAR_CALLBACK = Issue(308, Severity.ERROR, Category.API_LINT, "L1") + val CALLBACK_NAME = Issue(309, Severity.WARNING, Category.API_LINT, "L1") + val CALLBACK_INTERFACE = Issue(310, Severity.ERROR, Category.API_LINT, "CL3") + val CALLBACK_METHOD_NAME = Issue(311, Severity.ERROR, Category.API_LINT, "L1") + val LISTENER_INTERFACE = Issue(312, Severity.ERROR, Category.API_LINT, "L1") + val SINGLE_METHOD_INTERFACE = Issue(313, Severity.ERROR, Category.API_LINT, "L1") + val INTENT_NAME = Issue(314, Severity.ERROR, Category.API_LINT, "C3") + val ACTION_VALUE = Issue(315, Severity.ERROR, Category.API_LINT, "C4") + val EQUALS_AND_HASH_CODE = Issue(316, Severity.ERROR, Category.API_LINT, "M8") + val PARCEL_CREATOR = Issue(317, Severity.ERROR, Category.API_LINT, "FW3") + val PARCEL_NOT_FINAL = Issue(318, Severity.ERROR, Category.API_LINT, "FW8") + val PARCEL_CONSTRUCTOR = Issue(319, Severity.ERROR, Category.API_LINT, "FW3") + val PROTECTED_MEMBER = Issue(320, Severity.ERROR, Category.API_LINT, "M7") + val PAIRED_REGISTRATION = Issue(321, Severity.ERROR, Category.API_LINT, "L2") + val REGISTRATION_NAME = Issue(322, Severity.ERROR, Category.API_LINT, "L3") + val VISIBLY_SYNCHRONIZED = Issue(323, Severity.ERROR, Category.API_LINT, "M5") + val INTENT_BUILDER_NAME = Issue(324, Severity.WARNING, Category.API_LINT, "FW1") + val CONTEXT_NAME_SUFFIX = Issue(325, Severity.ERROR, Category.API_LINT, "C4") + val INTERFACE_CONSTANT = Issue(326, Severity.ERROR, Category.API_LINT, "C4") + val ON_NAME_EXPECTED = Issue(327, Severity.WARNING, Category.API_LINT) + val TOP_LEVEL_BUILDER = Issue(328, Severity.WARNING, Category.API_LINT) + val MISSING_BUILD_METHOD = Issue(329, Severity.WARNING, Category.API_LINT) + val BUILDER_SET_STYLE = Issue(330, Severity.WARNING, Category.API_LINT) + val SETTER_RETURNS_THIS = Issue(331, Severity.WARNING, Category.API_LINT, "M4") + val RAW_AIDL = Issue(332, Severity.ERROR, Category.API_LINT) + val INTERNAL_CLASSES = Issue(333, Severity.ERROR, Category.API_LINT) + val PACKAGE_LAYERING = Issue(334, Severity.WARNING, Category.API_LINT, "FW6") + val GETTER_SETTER_NAMES = Issue(335, Severity.ERROR, Category.API_LINT, "M6") + val CONCRETE_COLLECTION = Issue(336, Severity.ERROR, Category.API_LINT, "CL2") + val OVERLAPPING_CONSTANTS = Issue(337, Severity.WARNING, Category.API_LINT, "C1") + val GENERIC_EXCEPTION = Issue(338, Severity.ERROR, Category.API_LINT, "S1") + val ILLEGAL_STATE_EXCEPTION = Issue(339, Severity.WARNING, Category.API_LINT, "S1") + val RETHROW_REMOTE_EXCEPTION = Issue(340, Severity.ERROR, Category.API_LINT, "FW9") + val MENTIONS_GOOGLE = Issue(341, Severity.ERROR, Category.API_LINT) + val HEAVY_BIT_SET = Issue(342, Severity.ERROR, Category.API_LINT) + val MANAGER_CONSTRUCTOR = Issue(343, Severity.ERROR, Category.API_LINT) + val MANAGER_LOOKUP = Issue(344, Severity.ERROR, Category.API_LINT) + val AUTO_BOXING = Issue(345, Severity.ERROR, Category.API_LINT, "M11") + val STATIC_UTILS = Issue(346, Severity.ERROR, Category.API_LINT) + val CONTEXT_FIRST = Issue(347, Severity.ERROR, Category.API_LINT, "M3") + val LISTENER_LAST = Issue(348, Severity.WARNING, Category.API_LINT, "M3") + val EXECUTOR_REGISTRATION = Issue(349, Severity.WARNING, Category.API_LINT, "L1") + val CONFIG_FIELD_NAME = Issue(350, Severity.ERROR, Category.API_LINT) + val RESOURCE_FIELD_NAME = Issue(351, Severity.ERROR, Category.API_LINT) + val RESOURCE_VALUE_FIELD_NAME = Issue(352, Severity.ERROR, Category.API_LINT, "C7") + val RESOURCE_STYLE_FIELD_NAME = Issue(353, Severity.ERROR, Category.API_LINT, "C7") + val STREAM_FILES = Issue(354, Severity.WARNING, Category.API_LINT, "M10") + val PARCELABLE_LIST = Issue(355, Severity.WARNING, Category.API_LINT) + val ABSTRACT_INNER = Issue(356, Severity.WARNING, Category.API_LINT) + val BANNED_THROW = Issue(358, Severity.ERROR, Category.API_LINT) + val EXTENDS_ERROR = Issue(359, Severity.ERROR, Category.API_LINT) + val EXCEPTION_NAME = Issue(360, Severity.ERROR, Category.API_LINT) + val METHOD_NAME_UNITS = Issue(361, Severity.ERROR, Category.API_LINT) + val FRACTION_FLOAT = Issue(362, Severity.ERROR, Category.API_LINT) + val PERCENTAGE_INT = Issue(363, Severity.ERROR, Category.API_LINT) + val NOT_CLOSEABLE = Issue(364, Severity.WARNING, Category.API_LINT) + val KOTLIN_OPERATOR = Issue(365, Severity.INFO, Category.API_LINT) + val ARRAY_RETURN = Issue(366, Severity.WARNING, Category.API_LINT) + val USER_HANDLE = Issue(367, Severity.WARNING, Category.API_LINT) + val USER_HANDLE_NAME = Issue(368, Severity.WARNING, Category.API_LINT) + val SERVICE_NAME = Issue(369, Severity.ERROR, Category.API_LINT, "C4") + val METHOD_NAME_TENSE = Issue(370, Severity.WARNING, Category.API_LINT) + val NO_CLONE = Issue(371, Severity.ERROR, Category.API_LINT) + val USE_ICU = Issue(372, Severity.WARNING, Category.API_LINT) + val USE_PARCEL_FILE_DESCRIPTOR = Issue(373, Severity.ERROR, Category.API_LINT, "FW11") + val NO_BYTE_OR_SHORT = Issue(374, Severity.WARNING, Category.API_LINT, "FW12") + val SINGLETON_CONSTRUCTOR = Issue(375, Severity.ERROR, Category.API_LINT) + val COMMON_ARGS_FIRST = Issue(376, Severity.WARNING, Category.API_LINT, "M2") + val CONSISTENT_ARGUMENT_ORDER = Issue(377, Severity.ERROR, Category.API_LINT, "M2") + val KOTLIN_KEYWORD = Issue(378, Severity.ERROR, Category.API_LINT) // Formerly 141 + val UNIQUE_KOTLIN_OPERATOR = Issue(379, Severity.ERROR, Category.API_LINT) + val SAM_SHOULD_BE_LAST = Issue(380, Severity.WARNING, Category.API_LINT) // Formerly 142 + val MISSING_JVMSTATIC = Issue(381, Severity.WARNING, Category.API_LINT) // Formerly 143 + val DEFAULT_VALUE_CHANGE = Issue(382, Severity.ERROR, Category.API_LINT) // Formerly 144 + val DOCUMENT_EXCEPTIONS = Issue(383, Severity.ERROR, Category.API_LINT) // Formerly 145 + val FORBIDDEN_SUPER_CLASS = Issue(384, Severity.ERROR, Category.API_LINT) + val MISSING_NULLABILITY = Issue(385, Severity.ERROR, Category.API_LINT) + val MUTABLE_BARE_FIELD = Issue(386, Severity.ERROR, Category.API_LINT, "F2") + val INTERNAL_FIELD = Issue(387, Severity.ERROR, Category.API_LINT, "F2") + val PUBLIC_TYPEDEF = Issue(388, Severity.ERROR, Category.API_LINT, "FW15") + val ANDROID_URI = Issue(389, Severity.ERROR, Category.API_LINT, "FW14") + val BAD_FUTURE = Issue(390, Severity.ERROR, Category.API_LINT) + + fun findIssueById(id: Int): Issue? { + return idToIssue[id] + } + + fun findIssueById(id: String?): Issue? { + return nameToIssue[id] + } + + fun findIssueByIdIgnoringCase(id: String): Issue? { + for (e in allIssues) { + if (id.equals(e.name, ignoreCase = true)) { + return e + } + } + return null + } + + class Issue private constructor( + val code: Int, + val defaultLevel: Severity, + /** + * When `level` is set to [Severity.INHERIT], this is the parent from + * which the issue will inherit its level. + */ + val parent: Issue?, + /** Applicable category */ + val category: Category, + /** Related rule, if any */ + val rule: String?, + /** Related explanation, if any */ + val explanation: String? + ) { + /** + * The name of this issue + */ + lateinit var name: String + internal set + + internal constructor( + code: Int, + defaultLevel: Severity, + category: Category = Category.UNKNOWN + ) : this(code, defaultLevel, null, category, null, null) + + internal constructor( + code: Int, + defaultLevel: Severity, + category: Category, + rule: String + ) : this(code, defaultLevel, null, category, rule, null) + + internal constructor( + code: Int, + parent: Issue, + category: Category + ) : this(code, Severity.INHERIT, parent, category, null, null) + + override fun toString(): String { + return "Issue #$code ($name)" + } + + init { + allIssues.add(this) + } + } + + enum class Category(val description: String, val ruleLink: String?) { + COMPATIBILITY("Compatibility", null), + DOCUMENTATION("Documentation", null), + API_LINT("API Lint", "go/android-api-guidelines"), + UNKNOWN("Default", null) + } + + init { // Initialize issue names based on the field names + for (property in Issues::class.declaredMemberProperties) { + if (property.returnType.classifier != Issue::class) continue + val issue = property.getter.call(Issues) as Issue + + issue.name = SdkVersionInfo.underlinesToCamelCase(property.name.toLowerCase(Locale.US)) + nameToIssue[issue.name] = issue + idToIssue[issue.code] = issue + } + for (issue in allIssues) { + check(issue.name != "") + } + } +}
\ No newline at end of file diff --git a/src/main/java/com/android/tools/metalava/model/ErrorConfiguration.kt b/src/main/java/com/android/tools/metalava/model/IssueConfiguration.kt index bac176c..527e240 100644 --- a/src/main/java/com/android/tools/metalava/model/ErrorConfiguration.kt +++ b/src/main/java/com/android/tools/metalava/model/IssueConfiguration.kt @@ -19,15 +19,15 @@ package com.android.tools.metalava.model import com.android.tools.metalava.Severity import com.android.tools.metalava.doclava1.Issues -/** An error configuration is a set of overrides for severities for various [Issues.Issue] */ -class ErrorConfiguration { +/** An issue configuration is a set of overrides for severities for various [Issues.Issue] */ +class IssueConfiguration { private val overrides = mutableMapOf<Issues.Issue, Severity>() /** Returns the severity of the given issue */ fun getSeverity(issue: Issues.Issue): Severity { overrides[issue]?.let { return it } if (issue.defaultLevel == Severity.INHERIT) { - return getSeverity(issue.parent) + return getSeverity(issue.parent!!) } return issue.defaultLevel } @@ -52,8 +52,8 @@ class ErrorConfiguration { } } -/** Default error configuration: uses all the severities initialized in the [Issues] class */ -val defaultConfiguration = ErrorConfiguration() +/** Default error configuration: uses the severities as configured in [Options] */ +val defaultConfiguration = IssueConfiguration() /** Current configuration to apply when reporting errors */ var configuration = defaultConfiguration |