diff --git a/.bazelignore b/.bazelignore index 7615b80..4facf42 100644 --- a/.bazelignore +++ b/.bazelignore @@ -1,2 +1,2 @@ -lint-tests/ -lint-examples/ \ No newline at end of file +e2e/ +examples/ \ No newline at end of file diff --git a/.bazelrc b/.bazelrc index 44a9217..dc47369 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1 +1,4 @@ -common --experimental_google_legacy_api +# Required until this is the default; expected in Bazel 7 +common --enable_bzlmod + +try-import %workspace%/.bazelrc.user diff --git a/.bazelversion b/.bazelversion index f4965a3..19b860c 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -6.0.0 \ No newline at end of file +6.4.0 diff --git a/.bcr/README.md b/.bcr/README.md new file mode 100644 index 0000000..44ae7fe --- /dev/null +++ b/.bcr/README.md @@ -0,0 +1,9 @@ +# Bazel Central Registry + +When the ruleset is released, we want it to be published to the +Bazel Central Registry automatically: + + +This folder contains configuration files to automate the publish step. +See +for authoritative documentation about these files. diff --git a/.bcr/config.yml b/.bcr/config.yml new file mode 100644 index 0000000..fadd8bd --- /dev/null +++ b/.bcr/config.yml @@ -0,0 +1,6 @@ +# See https://github.com/bazel-contrib/publish-to-bcr#a-note-on-release-automation +# for guidance about whether to uncomment this section: +# +# fixedReleaser: +# login: my_github_handle +# email: me@my.org diff --git a/.bcr/metadata.template.json b/.bcr/metadata.template.json new file mode 100644 index 0000000..4bc41d0 --- /dev/null +++ b/.bcr/metadata.template.json @@ -0,0 +1,7 @@ +{ + "homepage": "https://github.com/bencodes/rules_android_lint", + "maintainers": [], + "repository": ["github:bencodes/rules_android_lint"], + "versions": [], + "yanked_versions": {} +} diff --git a/.bcr/presubmit.yml b/.bcr/presubmit.yml new file mode 100644 index 0000000..34333e3 --- /dev/null +++ b/.bcr/presubmit.yml @@ -0,0 +1,10 @@ +bcr_test_module: + module_path: "e2e/smoke" + matrix: + platform: ["debian10", "macos", "ubuntu2004", "windows"] + tasks: + run_tests: + name: "Run test module" + platform: ${{ platform }} + test_targets: + - "//..." diff --git a/.bcr/source.template.json b/.bcr/source.template.json new file mode 100644 index 0000000..e91611e --- /dev/null +++ b/.bcr/source.template.json @@ -0,0 +1,5 @@ +{ + "integrity": "**leave this alone**", + "strip_prefix": "{REPO}-{VERSION}", + "url": "https://github.com/{OWNER}/{REPO}/releases/download/{TAG}/rules_android_lint-{TAG}.tar.gz" +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fb496ed --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +docs/*.md linguist-generated=true diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 120c689..0000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,6 +0,0 @@ -version: 2 -updates: - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "weekly" \ No newline at end of file diff --git a/.github/workflows/BUILD.bazel b/.github/workflows/BUILD.bazel new file mode 100644 index 0000000..adecb14 --- /dev/null +++ b/.github/workflows/BUILD.bazel @@ -0,0 +1,8 @@ +load("@buildifier_prebuilt//:rules.bzl", "buildifier") + +buildifier( + name = "buildifier.check", + exclude_patterns = ["./.git/*"], + lint_mode = "warn", + mode = "diff", +) diff --git a/.github/workflows/buildifier.yaml b/.github/workflows/buildifier.yaml new file mode 100644 index 0000000..37cf165 --- /dev/null +++ b/.github/workflows/buildifier.yaml @@ -0,0 +1,19 @@ +name: Buildifier + +# Controls when the action will run. +on: + # Triggers the workflow on push or pull request events but only for the main branch + push: + branches: [ main ] + pull_request: + branches: [ main ] + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: buildifier + run: bazel run --enable_bzlmod //.github/workflows:buildifier.check diff --git a/.github/workflows/ci.bazelrc b/.github/workflows/ci.bazelrc new file mode 100644 index 0000000..3b4aad2 --- /dev/null +++ b/.github/workflows/ci.bazelrc @@ -0,0 +1,15 @@ +# This file contains Bazel settings to apply on CI only. +# It is referenced with a --bazelrc option in the call to bazel in ci.yaml + +# Debug where options came from +build --announce_rc +# This directory is configured in GitHub actions to be persisted between runs. +# We do not enable the repository cache to cache downloaded external artifacts +# as these are generally faster to download again than to fetch them from the +# GitHub actions cache. +build --disk_cache=~/.cache/bazel +# Don't rely on test logs being easily accessible from the test runner, +# though it makes the log noisier. +test --test_output=errors +# Allows tests to run bazelisk-in-bazel, since this is the cache folder used +test --test_env=XDG_CACHE_HOME diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..1938b11 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,47 @@ +name: CI + +# Controls when the action will run. +on: + # Triggers the workflow on push or pull request events but only for the main branch + push: + branches: [main] + pull_request: + branches: [main] + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +concurrency: + # Cancel previous actions from the same PR: https://stackoverflow.com/a/72408109 + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: "Checkout the sources" + uses: actions/checkout@v4 + - name: "Install JDK 11" + uses: actions/setup-java@v3 + with: + distribution: "zulu" + java-version: "11" + - name: "Setup Bazelisk" + uses: bazelbuild/setup-bazelisk@v2 + - name: "Building //bazel:android-all with bzlmod" + run: bazel build //... --enable_bzlmod=true + integration-tests: + runs-on: ubuntu-latest + steps: + - name: "Checkout the sources" + uses: actions/checkout@v4 + - name: "Install JDK 11" + uses: actions/setup-java@v3 + with: + distribution: "zulu" + java-version: "11" + - name: "Setup Bazelisk" + uses: bazelbuild/setup-bazelisk@v2 + - name: "Running integration tests with bzlmod" + working-directory: examples/simple-android + run: bazel test //... --enable_bzlmod=true \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index 7e328e8..0000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: CI - -on: - pull_request: - push: - branches: - - "master" - -jobs: - buildifier: - runs-on: ubuntu-latest - steps: - - name: "Checkout the sources" - uses: actions/checkout@v3.5.0 - - name: "Install JDK 11" - uses: actions/setup-java@v3 - with: - distribution: "zulu" - java-version: "11" - - name: "Setup Bazelisk" - uses: bazelbuild/setup-bazelisk@v2 - - name: "Linting Starlark" - run: bazel run @buildifier_prebuilt//:buildifier -- -mode check -lint warn -r . - - name: "Lint Shell files" - run: ./scripts/lint-shell-files.sh - - test: - runs-on: ubuntu-latest - steps: - - name: "Checkout the sources" - uses: actions/checkout@v3.5.0 - - name: "Install JDK 11" - uses: actions/setup-java@v3 - with: - distribution: "zulu" - java-version: "11" - - name: "Setup Bazelisk" - uses: bazelbuild/setup-bazelisk@v2 - - name: "Building examples" - run: ./scripts/build-examples.sh \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..64b081b --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,15 @@ +# Cut a release whenever a new tag is pushed to the repo. +# You should use an annotated tag, like `git tag -a v1.2.3` +# and put the release notes into the commit message for the tag. +name: Release + +on: + push: + tags: + - "v*.*.*" + +jobs: + release: + uses: bazel-contrib/.github/.github/workflows/release_ruleset.yaml@v4 + with: + release_files: rules_android_lint-*.tar.gz diff --git a/.github/workflows/release_prep.sh b/.github/workflows/release_prep.sh new file mode 100755 index 0000000..cb761ee --- /dev/null +++ b/.github/workflows/release_prep.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash + +set -o errexit -o nounset -o pipefail + +# Don't include examples in the distribution artifact, to reduce size. +# You may want to add additional exclusions for folders or files that users don't need. +# NB: this mechanism relies on a `git archive` feature, which is much simpler and less +# error-prone than using Bazel to build a release artifact from sources in the repository. +# See https://git-scm.com/docs/git-archive#ATTRIBUTES +echo >>.git/info/attributes "examples export-ignore" + +# Set by GH actions, see +# https://docs.github.com/en/actions/learn-github-actions/environment-variables#default-environment-variables +TAG=${GITHUB_REF_NAME} +# The prefix is chosen to match what GitHub generates for source archives +PREFIX="rules_android_lint-${TAG:1}" +ARCHIVE="rules_android_lint-$TAG.tar.gz" +git archive --format=tar --prefix=${PREFIX}/ ${TAG} | gzip > $ARCHIVE +SHA=$(shasum -a 256 $ARCHIVE | awk '{print $1}') + +cat << EOF +## Using Bzlmod with Bazel 6 + +1. Enable with \`common --enable_bzlmod\` in \`.bazelrc\`. +2. Add to your \`MODULE.bazel\` file: + +\`\`\`starlark +bazel_dep(name = "rules_android_lint", version = "${TAG:1}") +\`\`\` + +## Using WORKSPACE + +Paste this snippet into your `WORKSPACE.bazel` file: + +\`\`\`starlark +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +http_archive( + name = "rules_android_lint", + sha256 = "${SHA}", + strip_prefix = "${PREFIX}", + url = "https://github.com/bencodes/rules_android_lint/releases/download/${TAG}/${ARCHIVE}", +) +EOF + +echo "\`\`\`" diff --git a/.gitignore b/.gitignore index aa25aee..52646d3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,30 +1,4 @@ - -# Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,bazel -# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,bazel - -### Bazel ### -# gitignore template for Bazel build system -# website: https://bazel.build/ - -# Ignore all bazel-* symlinks. There is no full list since this can change -# based on the name of the directory bazel is cloned into. -/bazel-* - -# Bazel Intellij -/.ijwb/ -# Bazel Android Studio -/.aswb/ - -### VisualStudioCode ### -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -### VisualStudioCode Patch ### -# Ignore all local history of files -.history - -trace.profile.gz +bazel-* +.bazelrc.user +.idea/ +.ijwb/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..2cff700 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,35 @@ +# See CONTRIBUTING.md for instructions. +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks + +# Commitizen runs in commit-msg stage +# but we don't want to run the other hooks on commit messages +default_stages: [commit] + +# Use a slightly older version of node by default +# as the default uses a very new version of GLIBC +default_language_version: + node: 16.18.0 + +repos: + # Check formatting and lint for starlark code + - repo: https://github.com/keith/pre-commit-buildifier + rev: 6.1.0.1 + hooks: + - id: buildifier + - id: buildifier-lint + # Enforce that commit messages allow for later changelog generation + - repo: https://github.com/commitizen-tools/commitizen + rev: v2.18.0 + hooks: + # Requires that commitizen is already installed + - id: commitizen + stages: [commit-msg] + - repo: https://github.com/pre-commit/mirrors-prettier + rev: "v2.4.0" + hooks: + - id: prettier + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: end-of-file-fixer \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..2e117bf --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +docs/*.md diff --git a/BUILD.bazel b/BUILD.bazel new file mode 100644 index 0000000..771e672 --- /dev/null +++ b/BUILD.bazel @@ -0,0 +1,11 @@ +load("@rules_kotlin//kotlin:lint.bzl", "ktlint_config") + +exports_files(["maven_install.json"]) + +ktlint_config( + name = "editorconfig", + android_rules_enabled = False, + editorconfig = "//:.editorconfig", + experimental_rules_enabled = False, + visibility = ["//visibility:public"], +) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..25cade4 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,37 @@ +# How to Contribute + +## Formatting + +Starlark files should be formatted by buildifier. +We suggest using a pre-commit hook to automate this. +First [install pre-commit](https://pre-commit.com/#installation), +then run + +```shell +pre-commit install +``` + +Otherwise later tooling on CI will yell at you about formatting/linting violations. + +## Using this as a development dependency of other rules + +You'll commonly find that you develop in another WORKSPACE, such as +some other ruleset that depends on rules_android_lint, or in a nested +WORKSPACE in the integration_tests folder. + +To always tell Bazel to use this directory rather than some release +artifact or a version fetched from the internet, run this from this +directory: + +```sh +OVERRIDE="--override_repository=rules_android_lint=$(pwd)/rules_android_lint" +echo "common $OVERRIDE" >> ~/.bazelrc +``` + +This means that any usage of `@rules_android_lint` on your system will point to this folder. + +## Releasing + +1. Determine the next release version, following semver (could automate in the future from changelog) +1. Tag the repo and push it (or create a tag in GH UI) +1. Watch the automation run on GitHub actions diff --git a/MODULE.bazel b/MODULE.bazel new file mode 100644 index 0000000..3174002 --- /dev/null +++ b/MODULE.bazel @@ -0,0 +1,44 @@ +module( + name = "rules_android_lint", + version = "0.0.0", + compatibility_level = 1, +) + +bazel_dep(name = "rules_java", version = "7.0.6") +bazel_dep(name = "rules_jvm_external", version = "5.3") +bazel_dep(name = "rules_kotlin", version = "1.9.0") +bazel_dep(name = "bazel_skylib", version = "1.4.2") +bazel_dep(name = "platforms", version = "0.0.8") +bazel_dep(name = "aspect_bazel_lib", version = "1.32.1", dev_dependency = True) +bazel_dep(name = "buildifier_prebuilt", version = "6.1.2", dev_dependency = True) + +#android_lint = use_extension("//rules:extensions.bzl", "android_lint") +#android_lint.toolchain(android_lint_version = "31.3.0-alpha09") +#use_repo(android_lint, "android_lint_toolchains") + +register_toolchains("//rules:android_lint_default_toolchain") + +# TODO(bencodes) Lint needs to be downloaded dynamically +maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven") +maven.install( + name = "rules_android_lint_deps", + artifacts = [ + # Worker Dependencies + # TODO(bencodes) Remove these and use the worker impl. that Bazel defines internally + "com.squareup.moshi:moshi:1.15.0", + "com.squareup.moshi:moshi-kotlin:1.15.0", + "com.squareup.okio:okio-jvm:3.6.0", + "io.reactivex.rxjava3:rxjava:3.1.8", + "com.xenomachina:kotlin-argparser:2.0.7", + # Lint Dependencies + "com.android.tools.lint:lint:31.3.0-alpha09", + "com.android.tools.lint:lint-api:31.3.0-alpha09", + "com.android.tools.lint:lint-checks:31.3.0-alpha09", + "com.android.tools.lint:lint-model:31.3.0-alpha09", + ], + repositories = [ + "https://maven.google.com", + "https://repo1.maven.org/maven2", + ], +) +use_repo(maven, "rules_android_lint_deps") diff --git a/README.md b/README.md index 739645b..dc9940b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ # rules_android_lint -TODO \ No newline at end of file +### TODO diff --git a/WORKSPACE b/WORKSPACE deleted file mode 100644 index c31de7f..0000000 --- a/WORKSPACE +++ /dev/null @@ -1,58 +0,0 @@ -workspace(name = "rules_android_lint") - -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") - -# ## Lint Dependencies - -load("@rules_android_lint//lint:dependencies.bzl", "rules_android_lint_dependencies") - -rules_android_lint_dependencies() - -load("@rules_android_lint//lint:toolchains.bzl", "rules_android_lint_toolchains") - -rules_android_lint_toolchains() - -## Lint Testing - -http_archive( - name = "bazel_skylib", - sha256 = "1c531376ac7e5a180e0237938a2536de0c54d93f5c278634818e0efc952dd56c", - url = "https://github.com/bazelbuild/bazel-skylib/releases/download/1.0.3/bazel-skylib-1.0.3.tar.gz", -) - -load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") - -bazel_skylib_workspace() - -# Kotlin - -http_archive( - name = "io_bazel_rules_kotlin", - sha256 = "fd92a98bd8a8f0e1cdcb490b93f5acef1f1727ed992571232d33de42395ca9b3", - url = "https://github.com/bazelbuild/rules_kotlin/releases/download/v1.7.1/rules_kotlin_release.tgz", -) - -load("@io_bazel_rules_kotlin//kotlin:repositories.bzl", "kotlin_repositories") - -kotlin_repositories() - -load("@io_bazel_rules_kotlin//kotlin:core.bzl", "kt_register_toolchains") - -kt_register_toolchains() - -## Buildifier - -http_archive( - name = "buildifier_prebuilt", - sha256 = "f7093a960a8c3471552764892ce12cb62d9b72600fa4c8b08b2090c45db05ce8", - strip_prefix = "buildifier-prebuilt-6.0.0.1", - url = "http://github.com/keith/buildifier-prebuilt/archive/6.0.0.1.tar.gz", -) - -load("@buildifier_prebuilt//:deps.bzl", "buildifier_prebuilt_deps") - -buildifier_prebuilt_deps() - -load("@buildifier_prebuilt//:defs.bzl", "buildifier_prebuilt_register_toolchains") - -buildifier_prebuilt_register_toolchains() diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel new file mode 100644 index 0000000..53b52af --- /dev/null +++ b/WORKSPACE.bazel @@ -0,0 +1 @@ +# Marker that this is the root of a Bazel workspace. diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel new file mode 100644 index 0000000..bdd9f54 --- /dev/null +++ b/docs/BUILD.bazel @@ -0,0 +1,10 @@ +# This load statement must be in the docs/ package rather than anything users depend on +# so that the dependency on stardoc doesn't leak to them. +load("@aspect_bazel_lib//lib:docs.bzl", "stardoc_with_diff_test", "update_docs") + +stardoc_with_diff_test( + name = "rules", + bzl_library_target = "//rules:defs", +) + +update_docs(name = "update") diff --git a/docs/rules.md b/docs/rules.md new file mode 100644 index 0000000..e92ecad --- /dev/null +++ b/docs/rules.md @@ -0,0 +1,56 @@ + + + + + + +## android_lint_test + +
+android_lint_test(name, autofix, baseline, config, custom_rules, deps, disable_checks,
+                  enable_checks, is_test_sources, manifest, resource_files, self, srcs,
+                  warnings_as_errors)
+
+ + + +**ATTRIBUTES** + + +| Name | Description | Type | Mandatory | Default | +| :------------- | :------------- | :------------- | :------------- | :------------- | +| name | A unique name for this target. | Name | required | | +| autofix | Enables lint autofix | Boolean | optional | False | +| baseline | Lint baseline file. | Label | optional | None | +| config | Lint configuration file. | Label | optional | None | +| custom_rules | Custom lint rules to run. | List of labels | optional | [] | +| deps | Dependencies that should be on the classpath during execution. | List of labels | optional | [] | +| disable_checks | List of checks to disable. | List of strings | optional | [] | +| enable_checks | List of checks to enable. | List of strings | optional | [] | +| is_test_sources | True when linting test sources, otherwise false. | Boolean | optional | False | +| manifest | Android manifest to run Android Lint against. | Label | optional | None | +| resource_files | Android resource files to run Android Lint against. | List of labels | optional | [] | +| self | The target being linted. | Label | required | | +| srcs | Sources to run Android Lint against. | List of labels | required | | +| warnings_as_errors | When true, lint will treat warnings as errors. | Boolean | optional | False | + + + + +## AndroidLintResultsInfo + +
+AndroidLintResultsInfo(output, project_configuration)
+
+ +Info needed to evaluate lint results + +**FIELDS** + + +| Name | Description | +| :------------- | :------------- | +| output | The Android Lint baseline output | +| project_configuration | The Android Lint output configuration file | + + diff --git a/lint/BUILD b/e2e/smoke/.bazelrc similarity index 100% rename from lint/BUILD rename to e2e/smoke/.bazelrc diff --git a/e2e/smoke/BUILD b/e2e/smoke/BUILD new file mode 100644 index 0000000..ea753de --- /dev/null +++ b/e2e/smoke/BUILD @@ -0,0 +1,17 @@ +"""Provides a simple way to test your rules as an external workspace. +Add a basic smoke-test target below. +""" + +load("@bazel_skylib//rules:build_test.bzl", "build_test") +# load("rules_android_lint//android_lint:defs.bzl", "...") + +# Replace with a usage of your rule/macro +filegroup(name = "empty") + +build_test( + name = "smoke_test", + targets = [ + # targets you add above + ":empty", + ], +) diff --git a/e2e/smoke/MODULE.bazel b/e2e/smoke/MODULE.bazel new file mode 100644 index 0000000..a3dc8ca --- /dev/null +++ b/e2e/smoke/MODULE.bazel @@ -0,0 +1,7 @@ +bazel_dep(name = "rules_android_lint", version = "0.0.0", dev_dependency = True) +bazel_dep(name = "bazel_skylib", version = "1.3.0", dev_dependency = True) + +local_path_override( + module_name = "rules_android_lint", + path = "../..", +) diff --git a/e2e/smoke/README.md b/e2e/smoke/README.md new file mode 100644 index 0000000..fb9fe98 --- /dev/null +++ b/e2e/smoke/README.md @@ -0,0 +1,5 @@ +# smoke test + +This e2e exercises the repo from an end-users perpective. +It catches mistakes in our install instructions, or usages that fail when called from an "external" repository to rules_android_lint. +It is also used by the presubmit check for the Bazel Central Registry. diff --git a/e2e/smoke/WORKSPACE.bazel b/e2e/smoke/WORKSPACE.bazel new file mode 100644 index 0000000..1e9cb40 --- /dev/null +++ b/e2e/smoke/WORKSPACE.bazel @@ -0,0 +1,19 @@ +# Override http_archive for local testing +local_repository( + name = "rules_android_lint", + path = "../..", +) + +#---SNIP--- Below here is re-used in the workspace snippet published on releases + +###################### +# rules_android_lint setup # +###################### +# Fetches the rules_android_lint dependencies. +# If you want to have a different version of some dependency, +# you should fetch it *before* calling this. +# Alternatively, you can skip calling this function, so long as you've +# already fetched all the dependencies. +load("@rules_android_lint//android_lint:repositories.bzl", "rules_android_lint_dependencies") + +rules_android_lint_dependencies() diff --git a/e2e/smoke/WORKSPACE.bzlmod b/e2e/smoke/WORKSPACE.bzlmod new file mode 100644 index 0000000..7784218 --- /dev/null +++ b/e2e/smoke/WORKSPACE.bzlmod @@ -0,0 +1,2 @@ +# When --enable_bzlmod is set, this file replaces WORKSPACE.bazel. +# Dependencies then come from MODULE.bazel instead. diff --git a/examples/simple-android/.bazelrc b/examples/simple-android/.bazelrc new file mode 100644 index 0000000..bd5d7ce --- /dev/null +++ b/examples/simple-android/.bazelrc @@ -0,0 +1,3 @@ +common --enable_bzlmod +common --enable_lockfile=False +common --experimental_google_legacy_api diff --git a/examples/simple-android/.bazelversion b/examples/simple-android/.bazelversion new file mode 100644 index 0000000..a585a9b --- /dev/null +++ b/examples/simple-android/.bazelversion @@ -0,0 +1 @@ +7.0.0-pre.20230724.1 diff --git a/examples/simple-android/AndroidManifest.xml b/examples/simple-android/AndroidManifest.xml new file mode 100644 index 0000000..b377777 --- /dev/null +++ b/examples/simple-android/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/examples/simple-android/BUILD.bazel b/examples/simple-android/BUILD.bazel new file mode 100644 index 0000000..370a658 --- /dev/null +++ b/examples/simple-android/BUILD.bazel @@ -0,0 +1,14 @@ +load("@rules_android//android:rules.bzl", "android_library") +load("@rules_android_lint//rules:defs.bzl", "android_lint_test") + +android_library( + name = "lib", + srcs = ["Foo.java"], + custom_package = "com.rules.android.lint.examples", +) + +android_lint_test( + name = "lib_lint_test", + srcs = ["Foo.java"], + self = ":lib", +) diff --git a/examples/simple-android/Foo.java b/examples/simple-android/Foo.java new file mode 100644 index 0000000..417309e --- /dev/null +++ b/examples/simple-android/Foo.java @@ -0,0 +1,3 @@ +package com.rules.android.lint.examples; + +public class Foo {} diff --git a/examples/simple-android/MODULE.bazel b/examples/simple-android/MODULE.bazel new file mode 100644 index 0000000..743dc13 --- /dev/null +++ b/examples/simple-android/MODULE.bazel @@ -0,0 +1,14 @@ +module( + name = "examples_simple", + version = "TODO", +) + +bazel_dep(name = "rules_android_lint") +local_path_override(module_name = "rules_android_lint", path = "../../") + +bazel_dep(name = "platforms", version = "0.0.8") +bazel_dep(name = "rules_android", version = "0.1.1") +bazel_dep(name = "rules_jvm_external", version = "5.3") + +remote_android_extensions = use_extension("@bazel_tools//tools/android:android_extensions.bzl", "remote_android_tools_extensions") +use_repo(remote_android_extensions, "android_tools", "android_gmaven_r8") diff --git a/examples/simple-android/WORKSPACE b/examples/simple-android/WORKSPACE new file mode 100644 index 0000000..e69de29 diff --git a/examples/simple-android/WORKSPACE.bzlmod b/examples/simple-android/WORKSPACE.bzlmod new file mode 100644 index 0000000..9cc43bb --- /dev/null +++ b/examples/simple-android/WORKSPACE.bzlmod @@ -0,0 +1 @@ +android_sdk_repository(name = "androidsdk") diff --git a/lint-examples/.bazelrc b/lint-examples/.bazelrc deleted file mode 100644 index b2aca44..0000000 --- a/lint-examples/.bazelrc +++ /dev/null @@ -1 +0,0 @@ -common --experimental_google_legacy_api \ No newline at end of file diff --git a/lint-examples/.bazelversion b/lint-examples/.bazelversion deleted file mode 100644 index f4965a3..0000000 --- a/lint-examples/.bazelversion +++ /dev/null @@ -1 +0,0 @@ -6.0.0 \ No newline at end of file diff --git a/lint-examples/.gitignore b/lint-examples/.gitignore deleted file mode 100644 index 9b434d1..0000000 --- a/lint-examples/.gitignore +++ /dev/null @@ -1,28 +0,0 @@ - -# Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,bazel -# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,bazel - -### Bazel ### -# gitignore template for Bazel build system -# website: https://bazel.build/ - -# Ignore all bazel-* symlinks. There is no full list since this can change -# based on the name of the directory bazel is cloned into. -/bazel-* - -# Bazel Intellij -/.ijwb/ - -### VisualStudioCode ### -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -### VisualStudioCode Patch ### -# Ignore all local history of files -.history - -# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,bazel diff --git a/lint-examples/BUILD b/lint-examples/BUILD deleted file mode 100644 index 0acc125..0000000 --- a/lint-examples/BUILD +++ /dev/null @@ -1,5 +0,0 @@ -filegroup( - name = "checks", - srcs = ["lint.xml"], - visibility = ["//visibility:public"], -) diff --git a/lint-examples/WORKSPACE b/lint-examples/WORKSPACE deleted file mode 100644 index fe1ba01..0000000 --- a/lint-examples/WORKSPACE +++ /dev/null @@ -1,90 +0,0 @@ -workspace(name = "rules_android_lint_examples") - -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") - -# Android - -http_archive( - name = "build_bazel_rules_android", - sha256 = "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", - strip_prefix = "rules_android-0.1.1", - urls = ["https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip"], -) - -load("@build_bazel_rules_android//android:rules.bzl", "android_sdk_repository") - -android_sdk_repository(name = "androidsdk") - -# Java - -RULES_JAVA_VERSION = "5.4.0" - -RULES_JAVA_SHA = "9b87757af5c77e9db5f7c000579309afae75cf6517da745de01ba0c6e4870951" - -http_archive( - name = "rules_java", - sha256 = RULES_JAVA_SHA, - url = "https://github.com/bazelbuild/rules_java/releases/download/{v}/rules_java-{v}.tar.gz".format(v = RULES_JAVA_VERSION), -) - -# Maven - -RULES_JVM_EXTERNAL = "4.5" - -RULES_JVM_EXTERNAL_SHA = "b17d7388feb9bfa7f2fa09031b32707df529f26c91ab9e5d909eb1676badd9a6" - -http_archive( - name = "rules_jvm_external", - sha256 = RULES_JVM_EXTERNAL_SHA, - strip_prefix = "rules_jvm_external-{}".format(RULES_JVM_EXTERNAL), - url = "https://github.com/bazelbuild/rules_jvm_external/archive/{v}.zip".format(v = RULES_JVM_EXTERNAL), -) - -load("@rules_jvm_external//:defs.bzl", "maven_install") - -maven_install( - artifacts = [ - "androidx.activity:activity:1.6.0", - ], - repositories = [ - "https://maven.google.com", - "https://repo1.maven.org/maven2", - ], -) - -# # Kotlin - -rules_kotlin_version = "1.7.1" - -rules_kotlin_sha = "fd92a98bd8a8f0e1cdcb490b93f5acef1f1727ed992571232d33de42395ca9b3" - -http_archive( - name = "io_bazel_rules_kotlin", - sha256 = rules_kotlin_sha, - urls = ["https://github.com/bazelbuild/rules_kotlin/releases/download/v%s/rules_kotlin_release.tgz" % rules_kotlin_version], -) - -load("@io_bazel_rules_kotlin//kotlin:repositories.bzl", "kotlin_repositories") - -kotlin_repositories() - -load("@io_bazel_rules_kotlin//kotlin:core.bzl", "kt_register_toolchains") - -kt_register_toolchains() - -# # Directly load the lint rules from the parent repo. - -local_repository( - name = "rules_android_lint", - path = "../", -) - -# Lint Dependencies - -load("@rules_android_lint//lint:dependencies.bzl", "rules_android_lint_dependencies") - -rules_android_lint_dependencies() - -load("@rules_android_lint//lint:toolchains.bzl", "rules_android_lint_toolchains") - -rules_android_lint_toolchains() diff --git a/lint-examples/android/BUILD b/lint-examples/android/BUILD deleted file mode 100644 index 17d1211..0000000 --- a/lint-examples/android/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@rules_android_lint//lint:rules.bzl", "lint_test") -load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") - -kt_android_library( - name = "lib", - srcs = ["src/bazel/android/MainActivity.kt"], - manifest = "MyAndroidManifest.xml", - resource_files = glob(["res/**"]), - deps = ["@maven//:androidx_activity_activity"], -) - -lint_test( - name = "lib_lint", - srcs = ["src/bazel/android/MainActivity.kt"], - manifest = "MyAndroidManifest.xml", - resource_files = glob(["res/**"]), - self = ":lib", - tags = ["lint"], - deps = [ - ":lib", - "@maven//:androidx_activity_activity", - ], -) diff --git a/lint-examples/android/MyAndroidManifest.xml b/lint-examples/android/MyAndroidManifest.xml deleted file mode 100644 index 3f9770f..0000000 --- a/lint-examples/android/MyAndroidManifest.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/lint-examples/android/res/values/colors.xml b/lint-examples/android/res/values/colors.xml deleted file mode 100644 index 0c714af..0000000 --- a/lint-examples/android/res/values/colors.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #FF99CC00 - \ No newline at end of file diff --git a/lint-examples/android/res/values/styles.xml b/lint-examples/android/res/values/styles.xml deleted file mode 100644 index 55344e5..0000000 --- a/lint-examples/android/res/values/styles.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/lint-examples/android/src/bazel/android/MainActivity.kt b/lint-examples/android/src/bazel/android/MainActivity.kt deleted file mode 100644 index 5d307f4..0000000 --- a/lint-examples/android/src/bazel/android/MainActivity.kt +++ /dev/null @@ -1,6 +0,0 @@ -package bazel.android - -import android.app.Activity - -class MainActivity : Activity() { -} diff --git a/lint-examples/lint.xml b/lint-examples/lint.xml deleted file mode 100644 index fc29420..0000000 --- a/lint-examples/lint.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/lint-examples/simple/BUILD b/lint-examples/simple/BUILD deleted file mode 100644 index 2ef1045..0000000 --- a/lint-examples/simple/BUILD +++ /dev/null @@ -1,22 +0,0 @@ -load("@rules_java//java:defs.bzl", "java_library") -load("@rules_android_lint//lint:rules.bzl", "lint_test") - -java_library( - name = "lib", - srcs = ["Foo.java"], - deps = [":lint_tests_dep"], -) - -java_library( - name = "lint_tests_dep", - srcs = ["Bar.java"], -) - -lint_test( - name = "lib_lint", - srcs = ["Foo.java"], - config = "//:checks", - self = ":lib", - tags = ["lint"], - deps = [":lib"], -) diff --git a/lint-examples/simple/Bar.java b/lint-examples/simple/Bar.java deleted file mode 100644 index f6ecb5e..0000000 --- a/lint-examples/simple/Bar.java +++ /dev/null @@ -1,2 +0,0 @@ -class Bar { -} \ No newline at end of file diff --git a/lint-examples/simple/Foo.java b/lint-examples/simple/Foo.java deleted file mode 100644 index 4572fbc..0000000 --- a/lint-examples/simple/Foo.java +++ /dev/null @@ -1,3 +0,0 @@ -class Foo { - final Bar bar = new Bar(); -} \ No newline at end of file diff --git a/lint/dependencies.bzl b/lint/dependencies.bzl deleted file mode 100644 index 603afb7..0000000 --- a/lint/dependencies.bzl +++ /dev/null @@ -1,7 +0,0 @@ -""" -Dependencies requirements to expose in rules_android_lint -""" - -load("@rules_android_lint//lint/internal:dependencies.bzl", _rules_android_lint_dependencies = "rules_android_lint_dependencies") - -rules_android_lint_dependencies = _rules_android_lint_dependencies diff --git a/lint/internal/BUILD b/lint/internal/BUILD deleted file mode 100644 index 2b392ce..0000000 --- a/lint/internal/BUILD +++ /dev/null @@ -1,5 +0,0 @@ -py_binary( - name = "test_runner_executable", - srcs = ["test_runner_executable.py"], - visibility = ["//visibility:public"], -) diff --git a/lint/internal/constants.bzl b/lint/internal/constants.bzl deleted file mode 100644 index df961a7..0000000 --- a/lint/internal/constants.bzl +++ /dev/null @@ -1,3 +0,0 @@ -""" -Lint CLI constants -""" diff --git a/lint/internal/dependencies.bzl b/lint/internal/dependencies.bzl deleted file mode 100644 index ba3c809..0000000 --- a/lint/internal/dependencies.bzl +++ /dev/null @@ -1,32 +0,0 @@ -""" -Dependencies required by Lint -""" - -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") - -def rules_android_lint_dependencies(): - """Fetches the dependencies needed for the rules - """ - maybe( - repo_rule = http_archive, - name = "rules_java", - url = "https://github.com/bazelbuild/rules_java/releases/download/5.4.1/rules_java-5.4.1.tar.gz", - sha256 = "a1f82b730b9c6395d3653032bd7e3a660f9d5ddb1099f427c1e1fe768f92e395", - ) - - maybe( - repo_rule = http_archive, - name = "build_bazel_rules_android", - sha256 = "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", - strip_prefix = "rules_android-0.1.1", - urls = ["https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip"], - ) - - maybe( - repo_rule = http_archive, - name = "rules_jvm_external", - url = "https://github.com/bazelbuild/rules_jvm_external/archive/refs/tags/4.5.zip", - strip_prefix = "rules_jvm_external-4.5", - sha256 = "b17d7388feb9bfa7f2fa09031b32707df529f26c91ab9e5d909eb1676badd9a6", - ) diff --git a/lint/internal/toolchains.bzl b/lint/internal/toolchains.bzl deleted file mode 100644 index 792a3f4..0000000 --- a/lint/internal/toolchains.bzl +++ /dev/null @@ -1,45 +0,0 @@ -"""TODO -""" - -load("@rules_java//java:repositories.bzl", "rules_java_dependencies", "rules_java_toolchains") -load("@rules_jvm_external//:defs.bzl", "maven_install") -load("@rules_jvm_external//:specs.bzl", "maven") - -_LINT_VERSION = "30.4.1" - -def rules_android_lint_toolchains(lint_version = _LINT_VERSION): - """Configures the required lint dependencies for lint to run. - - Args: - lint_version: Version of lint to use - """ - - # Java - rules_java_dependencies() - rules_java_toolchains() - - # Install the artifacts that are needed - maven_install( - name = "rules_android_lint_dependencies", - artifacts = [ - # Worker dependencies - maven.artifact("com.squareup.moshi", "moshi", "1.14.0"), - maven.artifact("com.squareup.moshi", "moshi-kotlin", "1.14.0"), - maven.artifact("com.squareup.okio", "okio-jvm", "3.2.0"), - maven.artifact("io.reactivex.rxjava3", "rxjava", "3.0.10"), - maven.artifact("com.xenomachina", "kotlin-argparser", "2.0.7"), - # Testing dependencies - maven.artifact("junit", "junit", "4.13.2", testonly = True), - maven.artifact("org.assertj", "assertj-core", "3.24.2", testonly = True), - # These need to be passed in via the toolchain and dynamically - "com.android.tools.lint:lint:{}".format(lint_version), - "com.android.tools.lint:lint-api:{}".format(lint_version), - "com.android.tools.lint:lint-checks:{}".format(lint_version), - "com.android.tools.lint:lint-model:{}".format(lint_version), - ], - repositories = [ - "https://maven.google.com", - "https://repo1.maven.org/maven2", - ], - fetch_sources = True, - ) diff --git a/lint/internal/worker/BUILD b/lint/internal/worker/BUILD deleted file mode 100644 index b639a08..0000000 --- a/lint/internal/worker/BUILD +++ /dev/null @@ -1,14 +0,0 @@ -load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") - -kt_jvm_library( - name = "worker", - srcs = glob(["*.kt"]), - visibility = ["//visibility:public"], - deps = [ - "@rules_android_lint_dependencies//:com_squareup_moshi_moshi", - "@rules_android_lint_dependencies//:com_squareup_moshi_moshi_kotlin", - "@rules_android_lint_dependencies//:com_squareup_okio_okio_jvm", - "@rules_android_lint_dependencies//:io_reactivex_rxjava3_rxjava", - "@rules_android_lint_dependencies//:org_reactivestreams_reactive_streams", - ], -) diff --git a/lint/internal/wrapper/AndroidLintWrapperUtils.kt b/lint/internal/wrapper/AndroidLintWrapperUtils.kt deleted file mode 100644 index f32e8d6..0000000 --- a/lint/internal/wrapper/AndroidLintWrapperUtils.kt +++ /dev/null @@ -1,49 +0,0 @@ -import com.android.tools.lint.LintCliFlags -import com.android.tools.lint.Main -import java.io.File -import java.nio.file.Path -import java.util.zip.ZipInputStream -import kotlin.io.path.absolutePathString -import kotlin.io.path.inputStream - -// By default, Lint uses "$HOME/.android/cache" as shared cache directory for things like unpacking "aar" files. -// This results in concurrency/data issues: -// - We run lint in parallel in different modules -// - We use same file names for "aar" files while Lint uses just the file name for its cache dir -// Thus, we override cache dir and make it unique for each build target at the cost of unzipping same "aar" files multiple times during the build. -// -// Nothing about this solution is thread safe, but it at least isolates the cache to the worker and the best we -// can do until lint provides better APIs for this -@Suppress("UNCHECKED_CAST") -internal fun updateAndroidSDKCacheDirectory(cacheDirectory: Path) { - // Get an instance of the - val pe = Class.forName("java.lang.ProcessEnvironment") - val getenv = pe.getDeclaredMethod("getenv") - getenv.isAccessible = true - val unmodifiableEnvironment = getenv.invoke(null) - val map = Class.forName("java.util.Collections\$UnmodifiableMap") - val m = map.getDeclaredField("m") - m.isAccessible = true - - (m[unmodifiableEnvironment] as MutableMap)["ANDROID_SDK_CACHE_DIR"] = - cacheDirectory.absolutePathString() -} - -internal fun unzip(src: Path, dst: Path) { - val dstFile = dst.toFile() - val bufferedZipInputStream = src.inputStream().buffered() - ZipInputStream(bufferedZipInputStream).use { zipStream -> - var zipEntry = zipStream.nextEntry - while (zipEntry != null) { - if (zipEntry.isDirectory) { - File(dstFile, zipEntry.name).mkdirs() - } else { - File(dstFile, zipEntry.name).also { it.parentFile.mkdirs() }.outputStream() - .use { fileOutputStream -> zipStream.copyTo(fileOutputStream) } - } - - zipStream.closeEntry() - zipEntry = zipStream.nextEntry - } - } -} diff --git a/lint/internal/wrapper/BUILD b/lint/internal/wrapper/BUILD deleted file mode 100644 index 6a16766..0000000 --- a/lint/internal/wrapper/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@rules_java//java:defs.bzl", "java_binary") -load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") - -java_binary( - name = "lint_wrapper", - main_class = "AndroidLintAction", - visibility = ["//visibility:public"], - runtime_deps = [":lint"], -) - -kt_jvm_library( - name = "lint", - srcs = glob(["*.kt"]), - visibility = ["//visibility:public"], - deps = [ - "//lint/internal/worker", - "@rules_android_lint_dependencies//:com_android_tools_lint_lint", - "@rules_android_lint_dependencies//:com_android_tools_lint_lint_api", - "@rules_android_lint_dependencies//:com_android_tools_lint_lint_checks", - "@rules_android_lint_dependencies//:com_android_tools_lint_lint_model", - "@rules_android_lint_dependencies//:com_xenomachina_kotlin_argparser", - ], -) diff --git a/lint/rules.bzl b/lint/rules.bzl deleted file mode 100644 index 6380f07..0000000 --- a/lint/rules.bzl +++ /dev/null @@ -1,7 +0,0 @@ -""" -Rules defined and exposed by rules_android_lint -""" - -load("@rules_android_lint//lint/internal:defs.bzl", _lint_test = "lint_test") - -lint_test = _lint_test diff --git a/lint/toolchains.bzl b/lint/toolchains.bzl deleted file mode 100644 index fe31ec5..0000000 --- a/lint/toolchains.bzl +++ /dev/null @@ -1,7 +0,0 @@ -""" -toolchains requirements to expose in rules_android_lint -""" - -load("@rules_android_lint//lint/internal:toolchains.bzl", _rules_android_lint_toolchains = "rules_android_lint_toolchains") - -rules_android_lint_toolchains = _rules_android_lint_toolchains diff --git a/maven_install.json b/maven_install.json new file mode 100755 index 0000000..2d919a6 --- /dev/null +++ b/maven_install.json @@ -0,0 +1,3401 @@ +{ + "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", + "__INPUT_ARTIFACTS_HASH": -246305440, + "__RESOLVED_ARTIFACTS_HASH": 933055535, + "artifacts": { + "com.android.tools.analytics-library:protos": { + "shasums": { + "jar": "21b97bf06380d775bb85e1102f39e717712fd127eb5513a3eca72530961f61d2", + "sources": "f90fe3d5abb3d059cbd41f555fc05b8c5782a5d4bd8b10a4b10336e313ab9f83" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools.analytics-library:shared": { + "shasums": { + "jar": "ae0989cd623920b402b6bd3907b7255c13df5ca8acd1446da521679a52b79701", + "sources": "2a9f6f3ed822de577d524267040be8ebe36e275fb492bdb9ac75e0f118e7b7b3" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools.analytics-library:tracker": { + "shasums": { + "jar": "ae5a6fde1ae13cabb92a4fe90286af9e0f01fd25f73c45ff2f458a5f8ea51565", + "sources": "710fef9b25a8da50cd931cc50f8da30a3b88a8eee3cf750d9a5ab06486c1e36b" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools.build:aapt2-proto": { + "shasums": { + "jar": "a14400d0df3765e0d6f2f136f851fd08f18a6e2b0ceb1f32522df8371d2c1305", + "sources": "0a74655a1d176bff2e2255f4ac16152ca330f2b1b56f8a716fcc6920e3d2131e" + }, + "version": "8.3.0-alpha09-10880808" + }, + "com.android.tools.build:builder-model": { + "shasums": { + "jar": "2a957e5d9891273aee1b5602fb656840ea504bb317ed2003b12547402be8edd9", + "sources": "da23e569ac4334d52177a80f760a012bba9cd6b8f0f1d272b5a574f0684595b0" + }, + "version": "8.3.0-alpha09" + }, + "com.android.tools.build:manifest-merger": { + "shasums": { + "jar": "8df73f4690a6bf1b324f1f5a68146cbd9558225fecbb43a5588acfbab3a66a0f", + "sources": "9d7b1045aee2f033de4705e557f80ab54fe480dc284d77203a49172f29b43f19" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools.ddms:ddmlib": { + "shasums": { + "jar": "ef0f1ea9bbf453537f3b781fa2b3c40e235797758ce8d8e2363565ef276a4e99", + "sources": "e49590c9a76693a6443d35e1ad903991e29c2b56c1648efd224a99c7b88622d1" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools.external.com-intellij:intellij-core": { + "shasums": { + "jar": "159e8275113bb9432e6ca937f3798fbaf071e790295a909d7c4ebd6b90f4e692", + "sources": "89544507cc209decfcd4df70006ac6a8ca96973876badf82f28ae5d847e92fa8" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools.external.com-intellij:kotlin-compiler": { + "shasums": { + "jar": "a36d1397296679ecb909369802eb99bbde47f4ccb3b087601ca4d7c032edd794", + "sources": "aa36e70c26cc1599d15667c44b9c09e962204727e46117facc2ca21fe4dea72c" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools.external.org-jetbrains:uast": { + "shasums": { + "jar": "9ad499cb766d5568cc30e7a8ce19c58b559d6db234a4ecb46e9743b61a5a63ea", + "sources": "4ac9ca3143b6c6f4a91ec96b11e3cad86f49ffad433259d9afccaf9ac574336b" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools.layoutlib:layoutlib-api": { + "shasums": { + "jar": "45d764875651cf57f08539b75e27b865aec54a8f65013a84f1b832015f925399", + "sources": "7d5780010af4e084fdc7f6b4f99bc991c66ba97ef7a1a6d79f777ab9b2151a19" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools.lint:lint": { + "shasums": { + "jar": "b45ed67fb0167c0042d27340b8dd2aae35eafc75a263e2c9d6fb320ef0d6fb89", + "sources": "99d1bd21580a84d165889a66ac3d4d1e41bd41c8f88c65933eb8fde31d86e5dd" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools.lint:lint-api": { + "shasums": { + "jar": "e4656df660b43f99377f335138697e5a1ddc92fa44575393d22941bbf333d794", + "sources": "07cfa4533875c2b25de13ea337bf01b7eb48e2f420d2662a69a8793d632f942a" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools.lint:lint-checks": { + "shasums": { + "jar": "455a5b70b448df6379ab7fddcea003282a98d086f0488803ba14e75a98ac9cd4", + "sources": "491728e796a27f330bac6a09dfac96abee6d6ef5cd71ef47e1cd49a00f077137" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools.lint:lint-model": { + "shasums": { + "jar": "c00977aa6f9393a7777ce69792c42df490abd74916dadce971c5f19b9108b430", + "sources": "6452518da2c7f36b609386b5391bd969e154564648f8efd5eb57a59375c67fa2" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools:annotations": { + "shasums": { + "jar": "ee3bfd9cdb5012bdb61520f8654a785577e9bb337e5939c5c6149a446684ee16", + "sources": "05b37dacc5d19df2caf9f9e72f752834bb0079325ade38f7a991acce49205000" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools:common": { + "shasums": { + "jar": "36ec03dafbde315e6d5f044feb8dd6b69d457379ce5fad9a8fe410dbe8437d4c", + "sources": "2f94f971c109089b840322195e764ca09176d7e2214a5058d4b16e9bf76e0542" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools:dvlib": { + "shasums": { + "jar": "0cb57c126ed95657ae1e0974af092b401a52b76d5683f7ccbe1f8f21af06794e", + "sources": "a606cd9c24ebd26aa5243bbcc1b6d8d8ec0877b84c1e635bf4a584f715104219" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools:play-sdk-proto": { + "shasums": { + "jar": "27b6310f28e46a4bb11b8809c5ddf0221795b5e6461c12bdf3efa945d62830a6", + "sources": "72d3f1b9a96de879a52f606f6fe1a42611c069fb4b39a5dc24c355eae736837d" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools:repository": { + "shasums": { + "jar": "0f1778a98a79fb6f3a8fa5116b7f16092960bf49509802656c1117c75cc7875c", + "sources": "6feb347d2d7e994bac2cef46408ad4a83b5e2a4651763a8b2050e12bcbe32af8" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools:sdk-common": { + "shasums": { + "jar": "0c19a1422fbd38d2ac8fe3de34ab542b7790d8f4331d7432d4e15b39ada680b7", + "sources": "b8e77596a64597e65aad0387acf5051b762315970b937b67be511cb6c4e99ddc" + }, + "version": "31.3.0-alpha09" + }, + "com.android.tools:sdklib": { + "shasums": { + "jar": "86f727068b1ad988cbc87d1cbff921740de6832073995326ca723d219697cc59", + "sources": "f7176fb20ecaa6aab55d69c4564ef7b97d73c3a06d77517a7b23db3a8f345bc0" + }, + "version": "31.3.0-alpha09" + }, + "com.google.code.findbugs:jsr305": { + "shasums": { + "jar": "766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7", + "sources": "1c9e85e272d0708c6a591dc74828c71603053b48cc75ae83cce56912a2aa063b" + }, + "version": "3.0.2" + }, + "com.google.code.gson:gson": { + "shasums": { + "jar": "0cdd163ce3598a20fc04eee71b140b24f6f2a3b35f0a499dbbdd9852e83fbfaf", + "sources": "984c3636c3911185469a2df991da1bb325de391b9215088ce6c26476bdd61f99" + }, + "version": "2.10" + }, + "com.google.errorprone:error_prone_annotations": { + "shasums": { + "jar": "721cb91842b46fa056847d104d5225c8b8e1e8b62263b993051e1e5a0137b7ec", + "sources": "31a8f1bd791fb22c606af95049062a3c8252ce4b1b17555d00dc609e6371101d" + }, + "version": "2.11.0" + }, + "com.google.guava:failureaccess": { + "shasums": { + "jar": "a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26", + "sources": "092346eebbb1657b51aa7485a246bf602bb464cc0b0e2e1c7e7201fadce1e98f" + }, + "version": "1.0.1" + }, + "com.google.guava:guava": { + "shasums": { + "jar": "a42edc9cab792e39fe39bb94f3fca655ed157ff87a8af78e1d6ba5b07c4a00ab", + "sources": "8ab1853cdaf936ec88be80c17302b7c20abafbd4f54d4fb54d7011c529e3a44a" + }, + "version": "31.1-jre" + }, + "com.google.guava:listenablefuture": { + "shasums": { + "jar": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99", + "sources": null + }, + "version": "9999.0-empty-to-avoid-conflict-with-guava" + }, + "com.google.j2objc:j2objc-annotations": { + "shasums": { + "jar": "21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b", + "sources": "ba4df669fec153fa4cd0ef8d02c6d3ef0702b7ac4cabe080facf3b6e490bb972" + }, + "version": "1.3" + }, + "com.google.jimfs:jimfs": { + "shasums": { + "jar": "c4828e28d7c0a930af9387510b3bada7daa5c04d7c25a75c7b8b081f1c257ddd", + "sources": "adebb53450d2313d6927db5155c9be85336109e8f8c0af106ec2a30bc37e64ce" + }, + "version": "1.1" + }, + "com.google.protobuf:protobuf-java": { + "shasums": { + "jar": "6a9a2dff91dcf71f85be71ae971f6164b5a631dcd34bff08f0618535ca44ad02", + "sources": "98118edf28c74f173b25d8fce03f86ff95d61009df0c66324333573ec842f5d3" + }, + "version": "3.19.6" + }, + "com.squareup.moshi:moshi": { + "shasums": { + "jar": "3439b2c21ac4acd25034030854a6bd07d8a037f2e09f98cb13708908c84e9b15", + "sources": "e2c0c64a278d7e2726f8bca2269f682c2900065acceef595c5a9072f89b29724" + }, + "version": "1.14.0" + }, + "com.squareup.moshi:moshi-kotlin": { + "shasums": { + "jar": "0d3193fd0c3a2f60b63bb5b3b55adcaa235da653a8b0b381091c27f94caaf664", + "sources": "9a877f3883129b5234110045b85c4a67e581d56a2bf917daa7c7f017b6352a13" + }, + "version": "1.14.0" + }, + "com.squareup.okio:okio": { + "shasums": { + "jar": "a27f091d34aa452e37227e2cfa85809f29012a8ef2501a9b5a125a978e4fcbc1", + "sources": "4f255d11829d7e1949be042efa70f933650a7d929e68d594c1608f97884a0535" + }, + "version": "2.10.0" + }, + "com.squareup.okio:okio-jvm": { + "shasums": { + "jar": "b642baef4c570055de4cb3d1667b2b16dced901ff8066345a063691aa06025a4", + "sources": "821d4ea7914bda87cc9076ac4464ecec6e0d15b37ea0e652c7a87a5188ae9124" + }, + "version": "3.2.0" + }, + "com.sun.activation:javax.activation": { + "shasums": { + "jar": "993302b16cd7056f21e779cc577d175a810bb4900ef73cd8fbf2b50f928ba9ce", + "sources": "7e5aed0cc354684f1c96a1d24513c95f0971541b9ed03bf90a782ba189571022" + }, + "version": "1.2.0" + }, + "com.sun.istack:istack-commons-runtime": { + "shasums": { + "jar": "4ffabb06be454a05e4398e20c77fa2b6308d4b88dfbef7ca30a76b5b7d5505ef", + "sources": "4874ce5789c8684debd0099c8fa4ec8e00545626af4c9890760f0cb6fdf6d4db" + }, + "version": "3.0.8" + }, + "com.sun.xml.fastinfoset:FastInfoset": { + "shasums": { + "jar": "056f3a1e144409f21ed16afc26805f58e9a21f3fce1543c42d400719d250c511", + "sources": "b648209797a327140d6fa4ecf78a276f613ec92c5d9ccd6e7a51ff71976b84b0" + }, + "version": "1.2.16" + }, + "com.xenomachina:kotlin-argparser": { + "shasums": { + "jar": "ff0312ea7c14fe5ece8c4e617fa855a408f936fb453c3c5be3d7d57e7a143753", + "sources": "0e5d7f58074c34bda16725405f60a00b3cf4ad80af967cef1230e5e98db325c1" + }, + "version": "2.0.7" + }, + "com.xenomachina:xenocom": { + "shasums": { + "jar": "c6242652b9e82d7ce4e811c3cf7602582fb8e8dc9193b3cb7f3475e020aa68d1", + "sources": "fc10113c701cc9c2bbd80c6cb7e156aa8ae9273bd3de07665b2e45958935eebc" + }, + "version": "0.0.7" + }, + "commons-codec:commons-codec": { + "shasums": { + "jar": "4241dfa94e711d435f29a4604a3e2de5c4aa3c165e23bd066be6fc1fc4309569", + "sources": "dfae68268ce86f1a18fc45b99317c13d6c9d252f001d37961e79a51076808986" + }, + "version": "1.10" + }, + "commons-io:commons-io": { + "shasums": { + "jar": "671eaa39688dac2ffaa4645b3c9980ae2d0ea2471e4ae6a5da199cd15ae23666", + "sources": "1c7bece2e87ac49b24f09ec3c5ceb51560edd7a259889fceef96dda9c046a1b3" + }, + "version": "2.13.0" + }, + "commons-logging:commons-logging": { + "shasums": { + "jar": "daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636", + "sources": "44347acfe5860461728e9cb33251e97345be36f8a0dfd5c5130c172559455f41" + }, + "version": "1.2" + }, + "io.reactivex.rxjava3:rxjava": { + "shasums": { + "jar": "a250782ab8036cd049e063a40d6744ecf7bd9247714d459a2a67ca354541e7af", + "sources": "706628d56cc6cd5b1b15335d67d0f8fc279d02a228ff58dca7a7241d79440776" + }, + "version": "3.0.10" + }, + "jakarta.activation:jakarta.activation-api": { + "shasums": { + "jar": "8b0a0f52fa8b05c5431921a063ed866efaa41dadf2e3a7ee3e1961f2b0d9645b", + "sources": "e9638b764202c0def1b4d54bd37a984c681b2ed46a548ae94ef3f7e4a4b58a31" + }, + "version": "1.2.1" + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "shasums": { + "jar": "69156304079bdeed9fc0ae3b39389f19b3cc4ba4443bc80508995394ead742ea", + "sources": "61ceb3ed35ecf99f1803eac9c4b8f12103c7531952beae38ba53cc727f405532" + }, + "version": "2.3.2" + }, + "javax.inject:javax.inject": { + "shasums": { + "jar": "91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff", + "sources": "c4b87ee2911c139c3daf498a781967f1eb2e75bc1a8529a2e7b328a15d0e433e" + }, + "version": "1" + }, + "net.java.dev.jna:jna": { + "shasums": { + "jar": "5557e235a8aa2f9766d5dc609d67948f2a8832c2d796cea9ef1d6cbe0b3b7eaf", + "sources": "3bb0536c6bfe8931afa898a5022af628f936b09a8437552429a2f9977d254c46" + }, + "version": "5.6.0" + }, + "net.java.dev.jna:jna-platform": { + "shasums": { + "jar": "9ecea8bf2b1b39963939d18b70464eef60c508fed8820f9dcaba0c35518eabf7", + "sources": "ec090292829f0974710c1890634a58b55d3285feecad8ac6121515a7e27891fe" + }, + "version": "5.6.0" + }, + "net.sf.kxml:kxml2": { + "shasums": { + "jar": "f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2", + "sources": "85495366666158b58961e8911ced0f6f3bc92f1ebee865518b493fdb90760250" + }, + "version": "2.3.0" + }, + "org.apache.commons:commons-compress": { + "shasums": { + "jar": "6aecfd5459728a595601cfa07258d131972ffc39b492eb48bdd596577a2f244a", + "sources": "f64973e7c00455e819bcf8b74dda6e91b3e09557135b11b3603c2ba7a0e5479b" + }, + "version": "1.21" + }, + "org.apache.httpcomponents:httpclient": { + "shasums": { + "jar": "c03f813195e7a80e3608d0ddd8da80b21696a4c92a6a2298865bf149071551c7", + "sources": "6a8076d9a98a5be9f1a055011166f9055b0aee2de133699db3ccf20377533e58" + }, + "version": "4.5.6" + }, + "org.apache.httpcomponents:httpcore": { + "shasums": { + "jar": "6c9b3dd142a09dc468e23ad39aad6f75a0f2b85125104469f026e52a474e464f", + "sources": "705f8cf3671093b6c1db16bbf6971a7ef400e3819784f1af53e5bc3e67b5a9a0" + }, + "version": "4.4.16" + }, + "org.apache.httpcomponents:httpmime": { + "shasums": { + "jar": "0b2b1102c18d3c7e05a77214b9b7501a6f6056174ae5604e0e256776eda7553e", + "sources": "3054d6f3160cdc1a4a60cf2a199f5acd2f3b209aa3e82e2f69e7028741847622" + }, + "version": "4.5.6" + }, + "org.bouncycastle:bcpkix-jdk15on": { + "shasums": { + "jar": "efbca754880ce3922ca47a43c1f0b72c45731450a0ef193b9db33bf4bb38ce5f", + "sources": "927a8f1900d834ead8b5fc7394763c6fea101b4358810f700458d54b10254c69" + }, + "version": "1.67" + }, + "org.bouncycastle:bcprov-jdk15on": { + "shasums": { + "jar": "fa0041a36f9f20af3c6b8dbf6eb49a969e2c9cc029049d61acc526ba3247b3ef", + "sources": "8426860edbb2cacc187764206e070a94ab805c8f1a991034962d1ae8e203d0f5" + }, + "version": "1.67" + }, + "org.checkerframework:checker-qual": { + "shasums": { + "jar": "ff10785ac2a357ec5de9c293cb982a2cbb605c0309ea4cc1cb9b9bc6dbe7f3cb", + "sources": "fd99a45195ed893803624d1030387056a96601013f5e61ccabd79abb4ddfa876" + }, + "version": "3.12.0" + }, + "org.glassfish.jaxb:jaxb-runtime": { + "shasums": { + "jar": "e6e0a1e89fb6ff786279e6a0082d5cef52dc2ebe67053d041800737652b4fd1b", + "sources": "b85c2e314e6565e7dc4fb7e00ec8688c1c0fe9c9f7275125fb8dee43898f3743" + }, + "version": "2.3.2" + }, + "org.glassfish.jaxb:txw2": { + "shasums": { + "jar": "4a6a9f483388d461b81aa9a28c685b8b74c0597993bf1884b04eddbca95f48fe", + "sources": "a5ae8ac7886df60992e4039c75b7095cf04d1bea3a81f77f72e2c652f8f57a56" + }, + "version": "2.3.2" + }, + "org.jetbrains.intellij.deps:trove4j": { + "shasums": { + "jar": "c5fd725bffab51846bf3c77db1383c60aaaebfe1b7fe2f00d23fe1b7df0a439d", + "sources": "2e0174e80b989eb5deafcfb77407c908a0abe1f67a80306f98aeca63246e5481" + }, + "version": "1.0.20200330" + }, + "org.jetbrains.kotlin:kotlin-reflect": { + "shasums": { + "jar": "333269a37bb3c26e6016ec86fbccb55005cb7365157ef5cf3faa7ebe2bea2510", + "sources": "a97bb6693d786467019487fe16dbcb12535bfc24c973420e1fa57c0b5017059b" + }, + "version": "1.9.20-RC" + }, + "org.jetbrains.kotlin:kotlin-stdlib": { + "shasums": { + "jar": "36403fd76b3e923ddc739238dbbbbc864293ab440b2266e48d94bb189aad5247", + "sources": "81be2691baf65bd17e48f10944a0ef92c2ae7a196949e4cadb70f8dbea56151d" + }, + "version": "1.9.20-RC" + }, + "org.jetbrains.kotlin:kotlin-stdlib-common": { + "shasums": { + "jar": "8da40a2520d30dcb1012176fe93d24e82d08a3e346c37e0343b0fb6f64f6be01", + "sources": "a9791dcdf2a3316fceb4bfbfb5577926523eeac9d672dfe52981195f6905aaa9" + }, + "version": "1.6.20" + }, + "org.jetbrains.kotlin:kotlin-stdlib-jdk7": { + "shasums": { + "jar": "10faed74893d4119e9549c0c47a1931f551d3415dd95095e6a99455a3173d013", + "sources": "2534c8908432e06de73177509903d405b55f423dd4c2f747e16b92a2162611e6" + }, + "version": "1.9.20-RC" + }, + "org.jetbrains.kotlin:kotlin-stdlib-jdk8": { + "shasums": { + "jar": "33da138558a064fb369a2f5888944f04b210422548c11d85966257e2a2510916", + "sources": "3cb6895054a0985bba591c165503fe4dd63a215af53263b67a071ccdc242bf6e" + }, + "version": "1.9.20-RC" + }, + "org.jetbrains:annotations": { + "shasums": { + "jar": "ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478", + "sources": "42a5e144b8e81d50d6913d1007b695e62e614705268d8cf9f13dbdc478c2c68e" + }, + "version": "13.0" + }, + "org.jvnet.staxex:stax-ex": { + "shasums": { + "jar": "20522549056e9e50aa35ef0b445a2e47a53d06be0b0a9467d704e2483ffb049a", + "sources": "1333d591414aa494425e49fae1f3cb8aec6b58148956353ef1d0b53fac49129c" + }, + "version": "1.8.1" + }, + "org.ow2.asm:asm": { + "shasums": { + "jar": "1263369b59e29c943918de11d6d6152e2ec6085ce63e5710516f8c67d368e4bc", + "sources": "5ceb3d0b41a8eb8b416f28778b27c0e290143b6dc29d887b1cf40e2c0727f096" + }, + "version": "9.3" + }, + "org.ow2.asm:asm-analysis": { + "shasums": { + "jar": "37fd5392bb2cf4c15f202ffefd46d0e92bb34ff848c549f30d426a60d6b29495", + "sources": "e293ebc94d7c5c3604b11de1a3d92166edeed801500a921ae16e500faae491fd" + }, + "version": "9.3" + }, + "org.ow2.asm:asm-tree": { + "shasums": { + "jar": "ae629c2609f39681ef8d140a42a23800464a94f2d23e36d8f25cd10d5e4caff4", + "sources": "cee7d78eb5190f052d6214e1fff4b3c36cca23ef0a21837fa2316c75f90da021" + }, + "version": "9.3" + }, + "org.reactivestreams:reactive-streams": { + "shasums": { + "jar": "1dee0481072d19c929b623e155e14d2f6085dc011529a0a0dbefc84cf571d865", + "sources": "d5b4070a22c9b1ca5b9b5aa668466bcca391dbe5d5fe8311c300765c1621feba" + }, + "version": "1.0.3" + }, + "xerces:xercesImpl": { + "shasums": { + "jar": "6fc991829af1708d15aea50c66f0beadcd2cfeb6968e0b2f55c1b0909883fe16", + "sources": "3c531edfc074e3e0885e5d4a777a9e7317e108028be50ef6e893a5a9cf3e12c2" + }, + "version": "2.12.2" + }, + "xml-apis:xml-apis": { + "shasums": { + "jar": "a840968176645684bb01aed376e067ab39614885f9eee44abe35a5f20ebe7fad", + "sources": "5db8b94589e334283e01075458cfae920995e37ab997cb3b475fd0667b3158b2" + }, + "version": "1.4.01" + } + }, + "dependencies": { + "com.android.tools.analytics-library:protos": [ + "com.google.protobuf:protobuf-java" + ], + "com.android.tools.analytics-library:shared": [ + "com.android.tools.analytics-library:protos", + "com.android.tools:annotations", + "com.android.tools:common", + "com.google.code.gson:gson", + "com.google.guava:guava", + "net.java.dev.jna:jna-platform", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "com.android.tools.analytics-library:tracker": [ + "com.android.tools.analytics-library:protos", + "com.android.tools.analytics-library:shared", + "com.android.tools:annotations", + "com.android.tools:common", + "com.google.guava:guava", + "com.google.protobuf:protobuf-java", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "com.android.tools.build:aapt2-proto": [ + "com.google.protobuf:protobuf-java" + ], + "com.android.tools.build:builder-model": [ + "com.android.tools:annotations", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "com.android.tools.build:manifest-merger": [ + "com.android.tools:common", + "com.android.tools:sdk-common", + "com.android.tools:sdklib", + "com.google.code.gson:gson", + "net.sf.kxml:kxml2", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "com.android.tools.ddms:ddmlib": [ + "com.android.tools:common", + "com.google.protobuf:protobuf-java", + "net.sf.kxml:kxml2", + "org.jetbrains:annotations" + ], + "com.android.tools.external.com-intellij:intellij-core": [ + "org.jetbrains.intellij.deps:trove4j" + ], + "com.android.tools.layoutlib:layoutlib-api": [ + "com.android.tools:annotations", + "com.android.tools:common", + "net.sf.kxml:kxml2", + "org.jetbrains:annotations" + ], + "com.android.tools.lint:lint": [ + "com.android.tools.analytics-library:protos", + "com.android.tools.analytics-library:shared", + "com.android.tools.analytics-library:tracker", + "com.android.tools.build:manifest-merger", + "com.android.tools.external.com-intellij:intellij-core", + "com.android.tools.external.com-intellij:kotlin-compiler", + "com.android.tools.external.org-jetbrains:uast", + "com.android.tools.layoutlib:layoutlib-api", + "com.android.tools.lint:lint-api", + "com.android.tools.lint:lint-checks", + "com.android.tools:common", + "com.android.tools:sdk-common", + "com.android.tools:sdklib", + "com.google.guava:guava", + "net.sf.kxml:kxml2", + "org.jetbrains.kotlin:kotlin-reflect", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "com.android.tools.lint:lint-api": [ + "com.android.tools.build:builder-model", + "com.android.tools.build:manifest-merger", + "com.android.tools.external.com-intellij:intellij-core", + "com.android.tools.external.com-intellij:kotlin-compiler", + "com.android.tools.external.org-jetbrains:uast", + "com.android.tools.layoutlib:layoutlib-api", + "com.android.tools.lint:lint-model", + "com.android.tools:common", + "com.android.tools:sdk-common", + "com.android.tools:sdklib", + "com.google.guava:guava", + "commons-io:commons-io", + "net.sf.kxml:kxml2", + "org.jetbrains.kotlin:kotlin-reflect", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "org.ow2.asm:asm", + "org.ow2.asm:asm-tree" + ], + "com.android.tools.lint:lint-checks": [ + "com.android.tools.external.com-intellij:intellij-core", + "com.android.tools.external.com-intellij:kotlin-compiler", + "com.android.tools.external.org-jetbrains:uast", + "com.android.tools.layoutlib:layoutlib-api", + "com.android.tools.lint:lint-api", + "com.android.tools:common", + "com.android.tools:play-sdk-proto", + "com.android.tools:sdk-common", + "com.android.tools:sdklib", + "com.google.code.gson:gson", + "com.google.guava:guava", + "net.sf.kxml:kxml2", + "org.jetbrains.intellij.deps:trove4j", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "org.ow2.asm:asm-analysis" + ], + "com.android.tools.lint:lint-model": [ + "com.android.tools.build:builder-model", + "com.android.tools:common", + "com.android.tools:sdk-common", + "net.sf.kxml:kxml2", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "com.android.tools:common": [ + "com.android.tools:annotations", + "com.google.guava:guava", + "net.java.dev.jna:jna-platform", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "com.android.tools:dvlib": [ + "com.android.tools:common" + ], + "com.android.tools:play-sdk-proto": [ + "com.google.protobuf:protobuf-java" + ], + "com.android.tools:repository": [ + "com.android.tools.analytics-library:shared", + "com.android.tools:common", + "com.google.jimfs:jimfs", + "com.sun.activation:javax.activation", + "org.apache.commons:commons-compress", + "org.glassfish.jaxb:jaxb-runtime", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "com.android.tools:sdk-common": [ + "com.android.tools.analytics-library:shared", + "com.android.tools.build:aapt2-proto", + "com.android.tools.ddms:ddmlib", + "com.android.tools.layoutlib:layoutlib-api", + "com.android.tools:common", + "com.android.tools:sdklib", + "com.google.code.gson:gson", + "com.google.guava:guava", + "com.google.protobuf:protobuf-java", + "javax.inject:javax.inject", + "net.sf.kxml:kxml2", + "org.bouncycastle:bcpkix-jdk15on", + "org.bouncycastle:bcprov-jdk15on", + "org.glassfish.jaxb:jaxb-runtime", + "org.jetbrains.intellij.deps:trove4j", + "org.jetbrains.kotlin:kotlin-reflect", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "xerces:xercesImpl" + ], + "com.android.tools:sdklib": [ + "com.android.tools.layoutlib:layoutlib-api", + "com.android.tools:common", + "com.android.tools:dvlib", + "com.android.tools:repository", + "com.google.code.gson:gson", + "org.apache.commons:commons-compress", + "org.apache.httpcomponents:httpcore", + "org.apache.httpcomponents:httpmime", + "org.glassfish.jaxb:jaxb-runtime" + ], + "com.google.guava:guava": [ + "com.google.code.findbugs:jsr305", + "com.google.errorprone:error_prone_annotations", + "com.google.guava:failureaccess", + "com.google.guava:listenablefuture", + "com.google.j2objc:j2objc-annotations", + "org.checkerframework:checker-qual" + ], + "com.google.jimfs:jimfs": [ + "com.google.guava:guava" + ], + "com.squareup.moshi:moshi": [ + "com.squareup.okio:okio", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "com.squareup.moshi:moshi-kotlin": [ + "com.squareup.moshi:moshi", + "org.jetbrains.kotlin:kotlin-reflect", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "com.squareup.okio:okio": [ + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlin:kotlin-stdlib-common" + ], + "com.squareup.okio:okio-jvm": [ + "org.jetbrains.kotlin:kotlin-stdlib-common", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "com.sun.istack:istack-commons-runtime": [ + "jakarta.activation:jakarta.activation-api" + ], + "com.xenomachina:kotlin-argparser": [ + "com.xenomachina:xenocom", + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "com.xenomachina:xenocom": [ + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "io.reactivex.rxjava3:rxjava": [ + "org.reactivestreams:reactive-streams" + ], + "jakarta.xml.bind:jakarta.xml.bind-api": [ + "jakarta.activation:jakarta.activation-api" + ], + "net.java.dev.jna:jna-platform": [ + "net.java.dev.jna:jna" + ], + "org.apache.httpcomponents:httpclient": [ + "commons-codec:commons-codec", + "commons-logging:commons-logging", + "org.apache.httpcomponents:httpcore" + ], + "org.apache.httpcomponents:httpmime": [ + "org.apache.httpcomponents:httpclient" + ], + "org.bouncycastle:bcpkix-jdk15on": [ + "org.bouncycastle:bcprov-jdk15on" + ], + "org.glassfish.jaxb:jaxb-runtime": [ + "com.sun.istack:istack-commons-runtime", + "com.sun.xml.fastinfoset:FastInfoset", + "jakarta.activation:jakarta.activation-api", + "jakarta.xml.bind:jakarta.xml.bind-api", + "org.glassfish.jaxb:txw2", + "org.jvnet.staxex:stax-ex" + ], + "org.jetbrains.kotlin:kotlin-reflect": [ + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "org.jetbrains.kotlin:kotlin-stdlib": [ + "org.jetbrains:annotations" + ], + "org.jetbrains.kotlin:kotlin-stdlib-jdk7": [ + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "org.jetbrains.kotlin:kotlin-stdlib-jdk8": [ + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7" + ], + "org.jvnet.staxex:stax-ex": [ + "jakarta.activation:jakarta.activation-api", + "jakarta.xml.bind:jakarta.xml.bind-api" + ], + "org.ow2.asm:asm-analysis": [ + "org.ow2.asm:asm-tree" + ], + "org.ow2.asm:asm-tree": [ + "org.ow2.asm:asm" + ], + "xerces:xercesImpl": [ + "xml-apis:xml-apis" + ] + }, + "skipped": [ + "com.google.guava:listenablefuture:jar:sources" + ], + "packages": { + "com.android.tools.analytics-library:protos": [ + "com.android.tools.build.gradle.internal.profile", + "com.google.wireless.android.play.playlog.proto", + "com.google.wireless.android.sdk.stats" + ], + "com.android.tools.analytics-library:shared": [ + "com.android.tools.analytics" + ], + "com.android.tools.analytics-library:tracker": [ + "com.android.tools.analytics" + ], + "com.android.tools.build:aapt2-proto": [ + "android.aapt.pb.internal", + "com.android.aapt" + ], + "com.android.tools.build:builder-model": [ + "com.android.build", + "com.android.builder.model", + "com.android.builder.model.level2", + "com.android.builder.model.v2", + "com.android.builder.model.v2.dsl", + "com.android.builder.model.v2.ide", + "com.android.builder.model.v2.models", + "com.android.builder.model.v2.models.ndk" + ], + "com.android.tools.build:manifest-merger": [ + "com.android.manifmerger" + ], + "com.android.tools.ddms:ddmlib": [ + "com.android.commands.am", + "com.android.ddmlib", + "com.android.ddmlib.clientmanager", + "com.android.ddmlib.idevicemanager", + "com.android.ddmlib.internal", + "com.android.ddmlib.internal.commands", + "com.android.ddmlib.internal.jdwp", + "com.android.ddmlib.internal.jdwp.chunkhandler", + "com.android.ddmlib.internal.jdwp.interceptor", + "com.android.ddmlib.jdwp", + "com.android.ddmlib.jdwp.packets", + "com.android.ddmlib.log", + "com.android.ddmlib.logcat", + "com.android.ddmlib.testrunner", + "com.android.ddmlib.utils", + "com.android.incfs.install", + "com.android.incfs.install.adb.ddmlib", + "com.android.server.adb.protos" + ], + "com.android.tools.external.com-intellij:intellij-core": [ + "_COROUTINE", + "com.esotericsoftware.kryo.kryo5", + "com.esotericsoftware.kryo.kryo5.asm", + "com.esotericsoftware.kryo.kryo5.io", + "com.esotericsoftware.kryo.kryo5.minlog", + "com.esotericsoftware.kryo.kryo5.objenesis", + "com.esotericsoftware.kryo.kryo5.objenesis.instantiator", + "com.esotericsoftware.kryo.kryo5.objenesis.instantiator.android", + "com.esotericsoftware.kryo.kryo5.objenesis.instantiator.annotations", + "com.esotericsoftware.kryo.kryo5.objenesis.instantiator.basic", + "com.esotericsoftware.kryo.kryo5.objenesis.instantiator.gcj", + "com.esotericsoftware.kryo.kryo5.objenesis.instantiator.perc", + "com.esotericsoftware.kryo.kryo5.objenesis.instantiator.sun", + "com.esotericsoftware.kryo.kryo5.objenesis.instantiator.util", + "com.esotericsoftware.kryo.kryo5.objenesis.strategy", + "com.esotericsoftware.kryo.kryo5.reflectasm", + "com.esotericsoftware.kryo.kryo5.serializers", + "com.esotericsoftware.kryo.kryo5.unsafe", + "com.esotericsoftware.kryo.kryo5.util", + "com.fasterxml.aalto", + "com.fasterxml.aalto.async", + "com.fasterxml.aalto.dom", + "com.fasterxml.aalto.evt", + "com.fasterxml.aalto.impl", + "com.fasterxml.aalto.in", + "com.fasterxml.aalto.io", + "com.fasterxml.aalto.out", + "com.fasterxml.aalto.sax", + "com.fasterxml.aalto.stax", + "com.fasterxml.aalto.util", + "com.github.benmanes.caffeine.cache", + "com.github.benmanes.caffeine.cache.stats", + "com.intellij", + "com.intellij.application", + "com.intellij.codeInsight", + "com.intellij.codeInsight.completion", + "com.intellij.codeInsight.completion.proc", + "com.intellij.codeInsight.completion.scope", + "com.intellij.codeInsight.controlflow", + "com.intellij.codeInsight.controlflow.impl", + "com.intellij.codeInsight.daemon.impl", + "com.intellij.codeInsight.daemon.impl.analysis", + "com.intellij.codeInsight.documentation", + "com.intellij.codeInsight.folding", + "com.intellij.codeInsight.folding.impl", + "com.intellij.codeInsight.generation", + "com.intellij.codeInsight.highlighting", + "com.intellij.codeInsight.javadoc", + "com.intellij.codeInsight.runner", + "com.intellij.codeInspection", + "com.intellij.codeWithMe", + "com.intellij.concurrency", + "com.intellij.configurationStore", + "com.intellij.core", + "com.intellij.diagnostic", + "com.intellij.diagnostic.tracing", + "com.intellij.diff.comparison", + "com.intellij.diff.comparison.iterables", + "com.intellij.diff.fragments", + "com.intellij.diff.tools.util.text", + "com.intellij.diff.util", + "com.intellij.execution", + "com.intellij.execution.configurations", + "com.intellij.execution.filters", + "com.intellij.execution.process", + "com.intellij.execution.rmi", + "com.intellij.execution.rmi.ssl", + "com.intellij.extapi.psi", + "com.intellij.filename", + "com.intellij.formatting", + "com.intellij.ide", + "com.intellij.ide.bootstrap", + "com.intellij.ide.fileTemplates", + "com.intellij.ide.highlighter", + "com.intellij.ide.highlighter.custom", + "com.intellij.ide.highlighter.custom.tokens", + "com.intellij.ide.lightEdit", + "com.intellij.ide.plugins", + "com.intellij.ide.plugins.cl", + "com.intellij.ide.util", + "com.intellij.idea", + "com.intellij.indentation", + "com.intellij.injected.editor", + "com.intellij.java.workspace.entities", + "com.intellij.jna", + "com.intellij.lang", + "com.intellij.lang.folding", + "com.intellij.lang.impl", + "com.intellij.lang.injection", + "com.intellij.lang.injection.general", + "com.intellij.lang.java", + "com.intellij.lang.java.beans", + "com.intellij.lang.java.lexer", + "com.intellij.lang.java.parser", + "com.intellij.lang.java.source", + "com.intellij.lang.jvm", + "com.intellij.lang.jvm.annotation", + "com.intellij.lang.jvm.facade", + "com.intellij.lang.jvm.source", + "com.intellij.lang.jvm.types", + "com.intellij.lang.jvm.util", + "com.intellij.lang.spi", + "com.intellij.lexer", + "com.intellij.mock", + "com.intellij.model", + "com.intellij.model.presentation", + "com.intellij.model.psi", + "com.intellij.model.psi.impl", + "com.intellij.model.search", + "com.intellij.navigation", + "com.intellij.notebook.editor", + "com.intellij.openapi", + "com.intellij.openapi.application", + "com.intellij.openapi.application.ex", + "com.intellij.openapi.application.impl", + "com.intellij.openapi.client", + "com.intellij.openapi.command", + "com.intellij.openapi.command.impl", + "com.intellij.openapi.command.undo", + "com.intellij.openapi.components", + "com.intellij.openapi.diagnostic", + "com.intellij.openapi.editor", + "com.intellij.openapi.editor.actionSystem", + "com.intellij.openapi.editor.colors", + "com.intellij.openapi.editor.event", + "com.intellij.openapi.editor.ex", + "com.intellij.openapi.editor.ex.util", + "com.intellij.openapi.editor.impl", + "com.intellij.openapi.editor.impl.event", + "com.intellij.openapi.editor.markup", + "com.intellij.openapi.extensions", + "com.intellij.openapi.extensions.impl", + "com.intellij.openapi.fileEditor", + "com.intellij.openapi.fileEditor.impl", + "com.intellij.openapi.fileTypes", + "com.intellij.openapi.fileTypes.ex", + "com.intellij.openapi.fileTypes.impl", + "com.intellij.openapi.module", + "com.intellij.openapi.module.impl", + "com.intellij.openapi.options", + "com.intellij.openapi.progress", + "com.intellij.openapi.progress.impl", + "com.intellij.openapi.progress.util", + "com.intellij.openapi.project", + "com.intellij.openapi.projectRoots", + "com.intellij.openapi.roots", + "com.intellij.openapi.roots.ex", + "com.intellij.openapi.roots.impl", + "com.intellij.openapi.roots.impl.libraries", + "com.intellij.openapi.roots.libraries", + "com.intellij.openapi.startup", + "com.intellij.openapi.ui", + "com.intellij.openapi.util", + "com.intellij.openapi.util.io", + "com.intellij.openapi.util.objectTree", + "com.intellij.openapi.util.registry", + "com.intellij.openapi.util.text", + "com.intellij.openapi.vfs", + "com.intellij.openapi.vfs.encoding", + "com.intellij.openapi.vfs.ex", + "com.intellij.openapi.vfs.ex.http", + "com.intellij.openapi.vfs.impl", + "com.intellij.openapi.vfs.impl.http", + "com.intellij.openapi.vfs.impl.jar", + "com.intellij.openapi.vfs.local", + "com.intellij.openapi.vfs.newvfs", + "com.intellij.openapi.vfs.newvfs.events", + "com.intellij.openapi.vfs.pointers", + "com.intellij.openapi.wm.ex", + "com.intellij.patterns", + "com.intellij.patterns.compiler", + "com.intellij.platform.backend.navigation", + "com.intellij.platform.backend.presentation", + "com.intellij.platform.backend.workspace", + "com.intellij.platform.diagnostic.telemetry", + "com.intellij.platform.diagnostic.telemetry.helpers", + "com.intellij.platform.diagnostic.telemetry.otExporters", + "com.intellij.platform.jps.model.diagnostic", + "com.intellij.platform.jps.model.impl.resolver", + "com.intellij.platform.jps.model.resolver", + "com.intellij.platform.jps.model.serialization.resolver", + "com.intellij.platform.util", + "com.intellij.platform.workspace.jps", + "com.intellij.platform.workspace.jps.entities", + "com.intellij.platform.workspace.jps.serialization", + "com.intellij.platform.workspace.jps.serialization.impl", + "com.intellij.platform.workspace.storage", + "com.intellij.platform.workspace.storage.annotations", + "com.intellij.platform.workspace.storage.impl", + "com.intellij.platform.workspace.storage.impl.containers", + "com.intellij.platform.workspace.storage.impl.exceptions", + "com.intellij.platform.workspace.storage.impl.external", + "com.intellij.platform.workspace.storage.impl.indices", + "com.intellij.platform.workspace.storage.impl.url", + "com.intellij.platform.workspace.storage.instrumentation", + "com.intellij.platform.workspace.storage.url", + "com.intellij.pom", + "com.intellij.pom.core.impl", + "com.intellij.pom.event", + "com.intellij.pom.impl", + "com.intellij.pom.java", + "com.intellij.pom.references", + "com.intellij.pom.tree", + "com.intellij.pom.tree.events", + "com.intellij.pom.tree.events.impl", + "com.intellij.pom.wrappers", + "com.intellij.projectModel", + "com.intellij.psi", + "com.intellij.psi.augment", + "com.intellij.psi.codeStyle", + "com.intellij.psi.compiled", + "com.intellij.psi.controlFlow", + "com.intellij.psi.css", + "com.intellij.psi.filters", + "com.intellij.psi.filters.classes", + "com.intellij.psi.filters.element", + "com.intellij.psi.filters.position", + "com.intellij.psi.impl", + "com.intellij.psi.impl.cache", + "com.intellij.psi.impl.compiled", + "com.intellij.psi.impl.file", + "com.intellij.psi.impl.file.impl", + "com.intellij.psi.impl.java.stubs", + "com.intellij.psi.impl.java.stubs.impl", + "com.intellij.psi.impl.java.stubs.index", + "com.intellij.psi.impl.light", + "com.intellij.psi.impl.meta", + "com.intellij.psi.impl.search", + "com.intellij.psi.impl.smartPointers", + "com.intellij.psi.impl.source", + "com.intellij.psi.impl.source.codeStyle", + "com.intellij.psi.impl.source.javadoc", + "com.intellij.psi.impl.source.resolve", + "com.intellij.psi.impl.source.resolve.graphInference", + "com.intellij.psi.impl.source.resolve.graphInference.constraints", + "com.intellij.psi.impl.source.resolve.reference", + "com.intellij.psi.impl.source.resolve.reference.impl", + "com.intellij.psi.impl.source.resolve.reference.impl.manipulators", + "com.intellij.psi.impl.source.resolve.reference.impl.providers", + "com.intellij.psi.impl.source.tree", + "com.intellij.psi.impl.source.tree.injected", + "com.intellij.psi.impl.source.tree.java", + "com.intellij.psi.infos", + "com.intellij.psi.javadoc", + "com.intellij.psi.meta", + "com.intellij.psi.presentation.java", + "com.intellij.psi.scope", + "com.intellij.psi.scope.conflictResolvers", + "com.intellij.psi.scope.processor", + "com.intellij.psi.scope.util", + "com.intellij.psi.search", + "com.intellij.psi.search.impl", + "com.intellij.psi.search.searches", + "com.intellij.psi.stub", + "com.intellij.psi.stubs", + "com.intellij.psi.targets", + "com.intellij.psi.templateLanguages", + "com.intellij.psi.text", + "com.intellij.psi.tree", + "com.intellij.psi.tree.java", + "com.intellij.psi.util", + "com.intellij.refactoring.rename", + "com.intellij.refactoring.util", + "com.intellij.reference", + "com.intellij.security", + "com.intellij.serialization", + "com.intellij.serviceContainer", + "com.intellij.smRunner", + "com.intellij.testFramework", + "com.intellij.testIntegration", + "com.intellij.ui", + "com.intellij.ui.icons", + "com.intellij.usageView", + "com.intellij.util", + "com.intellij.util.cls", + "com.intellij.util.codeInsight", + "com.intellij.util.concurrency", + "com.intellij.util.concurrency.annotations", + "com.intellij.util.containers", + "com.intellij.util.containers.hash", + "com.intellij.util.containers.prefix.factory", + "com.intellij.util.containers.prefix.map", + "com.intellij.util.containers.prefix.set", + "com.intellij.util.diff", + "com.intellij.util.download", + "com.intellij.util.download.impl", + "com.intellij.util.execution", + "com.intellij.util.fmap", + "com.intellij.util.graph", + "com.intellij.util.graph.impl", + "com.intellij.util.indexing", + "com.intellij.util.indexing.containers", + "com.intellij.util.indexing.flavor", + "com.intellij.util.indexing.impl", + "com.intellij.util.indexing.impl.forward", + "com.intellij.util.io", + "com.intellij.util.io.externalizer", + "com.intellij.util.io.keyStorage", + "com.intellij.util.io.pagecache", + "com.intellij.util.io.pagecache.impl", + "com.intellij.util.io.stats", + "com.intellij.util.io.storage", + "com.intellij.util.io.zip", + "com.intellij.util.keyFMap", + "com.intellij.util.lang", + "com.intellij.util.messages", + "com.intellij.util.messages.impl", + "com.intellij.util.pico", + "com.intellij.util.profiling", + "com.intellij.util.progress", + "com.intellij.util.ref", + "com.intellij.util.system", + "com.intellij.util.text", + "com.intellij.util.ui", + "com.intellij.util.xml.dom", + "com.intellij.util.xmlb", + "com.intellij.util.xmlb.annotations", + "com.intellij.workspaceModel.ide", + "com.intellij.xml", + "com.intellij.xml.util", + "com.sun.jna", + "com.sun.jna.internal", + "com.sun.jna.platform", + "com.sun.jna.platform.dnd", + "com.sun.jna.platform.linux", + "com.sun.jna.platform.mac", + "com.sun.jna.platform.unix", + "com.sun.jna.platform.unix.aix", + "com.sun.jna.platform.unix.solaris", + "com.sun.jna.platform.win32", + "com.sun.jna.platform.win32.COM", + "com.sun.jna.platform.win32.COM.tlb", + "com.sun.jna.platform.win32.COM.tlb.imp", + "com.sun.jna.platform.win32.COM.util", + "com.sun.jna.platform.win32.COM.util.annotation", + "com.sun.jna.platform.wince", + "com.sun.jna.ptr", + "com.sun.jna.win32", + "gnu.trove", + "io.opentelemetry.api", + "io.opentelemetry.api.baggage", + "io.opentelemetry.api.baggage.propagation", + "io.opentelemetry.api.common", + "io.opentelemetry.api.events", + "io.opentelemetry.api.internal", + "io.opentelemetry.api.logs", + "io.opentelemetry.api.metrics", + "io.opentelemetry.api.trace", + "io.opentelemetry.api.trace.propagation", + "io.opentelemetry.api.trace.propagation.internal", + "io.opentelemetry.context", + "io.opentelemetry.context.internal.shaded", + "io.opentelemetry.context.propagation", + "io.opentelemetry.extension.incubator.metrics", + "io.opentelemetry.extension.incubator.propagation", + "io.opentelemetry.extension.incubator.trace", + "io.opentelemetry.internal.shaded.jctools.queues", + "io.opentelemetry.internal.shaded.jctools.util", + "io.opentelemetry.sdk", + "io.opentelemetry.sdk.common", + "io.opentelemetry.sdk.common.export", + "io.opentelemetry.sdk.common.internal", + "io.opentelemetry.sdk.internal", + "io.opentelemetry.sdk.logs", + "io.opentelemetry.sdk.logs.data", + "io.opentelemetry.sdk.logs.export", + "io.opentelemetry.sdk.logs.internal", + "io.opentelemetry.sdk.metrics", + "io.opentelemetry.sdk.metrics.data", + "io.opentelemetry.sdk.metrics.export", + "io.opentelemetry.sdk.metrics.internal", + "io.opentelemetry.sdk.metrics.internal.aggregator", + "io.opentelemetry.sdk.metrics.internal.concurrent", + "io.opentelemetry.sdk.metrics.internal.data", + "io.opentelemetry.sdk.metrics.internal.debug", + "io.opentelemetry.sdk.metrics.internal.descriptor", + "io.opentelemetry.sdk.metrics.internal.exemplar", + "io.opentelemetry.sdk.metrics.internal.export", + "io.opentelemetry.sdk.metrics.internal.state", + "io.opentelemetry.sdk.metrics.internal.view", + "io.opentelemetry.sdk.resources", + "io.opentelemetry.sdk.trace", + "io.opentelemetry.sdk.trace.data", + "io.opentelemetry.sdk.trace.export", + "io.opentelemetry.sdk.trace.internal", + "io.opentelemetry.sdk.trace.internal.data", + "io.opentelemetry.sdk.trace.samplers", + "io.opentelemetry.semconv.resource.attributes", + "io.opentelemetry.semconv.trace.attributes", + "it.unimi.dsi.fastutil", + "it.unimi.dsi.fastutil.booleans", + "it.unimi.dsi.fastutil.bytes", + "it.unimi.dsi.fastutil.chars", + "it.unimi.dsi.fastutil.doubles", + "it.unimi.dsi.fastutil.floats", + "it.unimi.dsi.fastutil.ints", + "it.unimi.dsi.fastutil.io", + "it.unimi.dsi.fastutil.longs", + "it.unimi.dsi.fastutil.objects", + "it.unimi.dsi.fastutil.shorts", + "kotlinx.collections.immutable", + "kotlinx.collections.immutable.adapters", + "kotlinx.collections.immutable.implementations.immutableList", + "kotlinx.collections.immutable.implementations.immutableMap", + "kotlinx.collections.immutable.implementations.immutableSet", + "kotlinx.collections.immutable.implementations.persistentOrderedMap", + "kotlinx.collections.immutable.implementations.persistentOrderedSet", + "kotlinx.collections.immutable.internal", + "kotlinx.coroutines", + "kotlinx.coroutines.channels", + "kotlinx.coroutines.debug", + "kotlinx.coroutines.debug.internal", + "kotlinx.coroutines.debug.junit4", + "kotlinx.coroutines.debug.junit5", + "kotlinx.coroutines.flow", + "kotlinx.coroutines.flow.internal", + "kotlinx.coroutines.future", + "kotlinx.coroutines.internal", + "kotlinx.coroutines.intrinsics", + "kotlinx.coroutines.repackaged.net.bytebuddy", + "kotlinx.coroutines.repackaged.net.bytebuddy.agent", + "kotlinx.coroutines.repackaged.net.bytebuddy.agent.builder", + "kotlinx.coroutines.repackaged.net.bytebuddy.asm", + "kotlinx.coroutines.repackaged.net.bytebuddy.build", + "kotlinx.coroutines.repackaged.net.bytebuddy.description", + "kotlinx.coroutines.repackaged.net.bytebuddy.description.annotation", + "kotlinx.coroutines.repackaged.net.bytebuddy.description.enumeration", + "kotlinx.coroutines.repackaged.net.bytebuddy.description.field", + "kotlinx.coroutines.repackaged.net.bytebuddy.description.method", + "kotlinx.coroutines.repackaged.net.bytebuddy.description.modifier", + "kotlinx.coroutines.repackaged.net.bytebuddy.description.type", + "kotlinx.coroutines.repackaged.net.bytebuddy.dynamic", + "kotlinx.coroutines.repackaged.net.bytebuddy.dynamic.loading", + "kotlinx.coroutines.repackaged.net.bytebuddy.dynamic.scaffold", + "kotlinx.coroutines.repackaged.net.bytebuddy.dynamic.scaffold.inline", + "kotlinx.coroutines.repackaged.net.bytebuddy.dynamic.scaffold.subclass", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.attribute", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.auxiliary", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bind", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bind.annotation", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bytecode", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bytecode.assign", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bytecode.assign.primitive", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bytecode.assign.reference", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bytecode.collection", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bytecode.constant", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bytecode.member", + "kotlinx.coroutines.repackaged.net.bytebuddy.jar.asm", + "kotlinx.coroutines.repackaged.net.bytebuddy.jar.asm.commons", + "kotlinx.coroutines.repackaged.net.bytebuddy.jar.asm.signature", + "kotlinx.coroutines.repackaged.net.bytebuddy.matcher", + "kotlinx.coroutines.repackaged.net.bytebuddy.pool", + "kotlinx.coroutines.repackaged.net.bytebuddy.utility", + "kotlinx.coroutines.repackaged.net.bytebuddy.utility.privilege", + "kotlinx.coroutines.repackaged.net.bytebuddy.utility.visitor", + "kotlinx.coroutines.scheduling", + "kotlinx.coroutines.selects", + "kotlinx.coroutines.stream", + "kotlinx.coroutines.sync", + "kotlinx.coroutines.time", + "net.jpountz.lz4", + "net.jpountz.util", + "net.jpountz.xxhash", + "net.n3.nanoxml", + "one.util.streamex", + "org.apache.commons.compress", + "org.apache.commons.compress.archivers", + "org.apache.commons.compress.archivers.ar", + "org.apache.commons.compress.archivers.arj", + "org.apache.commons.compress.archivers.cpio", + "org.apache.commons.compress.archivers.dump", + "org.apache.commons.compress.archivers.examples", + "org.apache.commons.compress.archivers.jar", + "org.apache.commons.compress.archivers.sevenz", + "org.apache.commons.compress.archivers.tar", + "org.apache.commons.compress.archivers.zip", + "org.apache.commons.compress.changes", + "org.apache.commons.compress.compressors", + "org.apache.commons.compress.compressors.brotli", + "org.apache.commons.compress.compressors.bzip2", + "org.apache.commons.compress.compressors.deflate", + "org.apache.commons.compress.compressors.deflate64", + "org.apache.commons.compress.compressors.gzip", + "org.apache.commons.compress.compressors.lz4", + "org.apache.commons.compress.compressors.lz77support", + "org.apache.commons.compress.compressors.lzma", + "org.apache.commons.compress.compressors.lzw", + "org.apache.commons.compress.compressors.pack200", + "org.apache.commons.compress.compressors.snappy", + "org.apache.commons.compress.compressors.xz", + "org.apache.commons.compress.compressors.z", + "org.apache.commons.compress.compressors.zstandard", + "org.apache.commons.compress.harmony", + "org.apache.commons.compress.harmony.archive.internal.nls", + "org.apache.commons.compress.harmony.pack200", + "org.apache.commons.compress.harmony.unpack200", + "org.apache.commons.compress.harmony.unpack200.bytecode", + "org.apache.commons.compress.harmony.unpack200.bytecode.forms", + "org.apache.commons.compress.java.util.jar", + "org.apache.commons.compress.parallel", + "org.apache.commons.compress.utils", + "org.apache.log4j", + "org.apache.log4j.helpers", + "org.apache.log4j.spi", + "org.apache.log4j.xml", + "org.apache.oro.io", + "org.apache.oro.text", + "org.apache.oro.text.awk", + "org.apache.oro.text.perl", + "org.apache.oro.text.regex", + "org.apache.oro.util", + "org.codehaus.stax2", + "org.codehaus.stax2.evt", + "org.codehaus.stax2.io", + "org.codehaus.stax2.osgi", + "org.codehaus.stax2.ri", + "org.codehaus.stax2.ri.dom", + "org.codehaus.stax2.ri.evt", + "org.codehaus.stax2.ri.typed", + "org.codehaus.stax2.typed", + "org.codehaus.stax2.util", + "org.codehaus.stax2.validation", + "org.intellij.lang.annotations", + "org.jaxen", + "org.jaxen.dom", + "org.jaxen.dom4j", + "org.jaxen.expr", + "org.jaxen.expr.iter", + "org.jaxen.function", + "org.jaxen.function.ext", + "org.jaxen.function.xslt", + "org.jaxen.javabean", + "org.jaxen.jdom", + "org.jaxen.pattern", + "org.jaxen.saxpath", + "org.jaxen.saxpath.base", + "org.jaxen.saxpath.helpers", + "org.jaxen.util", + "org.jaxen.xom", + "org.jdom", + "org.jdom.adapters", + "org.jdom.filter", + "org.jdom.filter2", + "org.jdom.input", + "org.jdom.input.sax", + "org.jdom.output", + "org.jdom.util", + "org.jdom.xpath", + "org.jdom.xpath.jaxen", + "org.jdom.xpath.util", + "org.jetbrains.annotations", + "org.jetbrains.concurrency", + "org.jetbrains.ide", + "org.jetbrains.jps", + "org.jetbrains.jps.model", + "org.jetbrains.jps.model.artifact", + "org.jetbrains.jps.model.artifact.elements", + "org.jetbrains.jps.model.artifact.elements.ex", + "org.jetbrains.jps.model.artifact.impl", + "org.jetbrains.jps.model.artifact.impl.elements", + "org.jetbrains.jps.model.ex", + "org.jetbrains.jps.model.fileTypes", + "org.jetbrains.jps.model.fileTypes.impl", + "org.jetbrains.jps.model.impl", + "org.jetbrains.jps.model.impl.runConfiguration", + "org.jetbrains.jps.model.jarRepository", + "org.jetbrains.jps.model.jarRepository.impl", + "org.jetbrains.jps.model.java", + "org.jetbrains.jps.model.java.compiler", + "org.jetbrains.jps.model.java.impl", + "org.jetbrains.jps.model.java.impl.compiler", + "org.jetbrains.jps.model.java.impl.runConfiguration", + "org.jetbrains.jps.model.java.runConfiguration", + "org.jetbrains.jps.model.library", + "org.jetbrains.jps.model.library.impl", + "org.jetbrains.jps.model.library.impl.sdk", + "org.jetbrains.jps.model.library.sdk", + "org.jetbrains.jps.model.module", + "org.jetbrains.jps.model.module.impl", + "org.jetbrains.jps.model.runConfiguration", + "org.jetbrains.jps.model.serialization", + "org.jetbrains.jps.model.serialization.artifact", + "org.jetbrains.jps.model.serialization.facet", + "org.jetbrains.jps.model.serialization.impl", + "org.jetbrains.jps.model.serialization.jarRepository", + "org.jetbrains.jps.model.serialization.java", + "org.jetbrains.jps.model.serialization.java.compiler", + "org.jetbrains.jps.model.serialization.library", + "org.jetbrains.jps.model.serialization.module", + "org.jetbrains.jps.model.serialization.runConfigurations", + "org.jetbrains.jps.plugin", + "org.jetbrains.jps.service", + "org.jetbrains.jps.service.impl", + "org.jetbrains.jps.util", + "org.jetbrains.org.objectweb.asm", + "org.jetbrains.org.objectweb.asm.commons", + "org.jetbrains.org.objectweb.asm.signature", + "org.jetbrains.org.objectweb.asm.tree", + "org.jetbrains.org.objectweb.asm.tree.analysis", + "org.jetbrains.org.objectweb.asm.util", + "org.jetbrains.xxh3", + "org.picocontainer" + ], + "com.android.tools.external.com-intellij:intellij-core:jar:sources": [ + "io.opentelemetry.sdk.internal" + ], + "com.android.tools.external.com-intellij:kotlin-compiler": [ + "", + "com.google.gwt.dev.js", + "com.google.gwt.dev.js.parserExceptions", + "com.google.gwt.dev.js.rhino", + "com.intellij.util.io", + "javaslang", + "javaslang.collection", + "javaslang.concurrent", + "javaslang.control", + "javaslang.match", + "javaslang.match.annotation", + "javaslang.match.generator", + "javaslang.match.model", + "kotlin.script.dependencies", + "kotlin.script.experimental.annotations", + "kotlin.script.experimental.api", + "kotlin.script.experimental.dependencies", + "kotlin.script.experimental.host", + "kotlin.script.experimental.impl", + "kotlin.script.experimental.jvm", + "kotlin.script.experimental.jvm.compat", + "kotlin.script.experimental.jvm.impl", + "kotlin.script.experimental.jvm.util", + "kotlin.script.experimental.location", + "kotlin.script.experimental.util", + "kotlin.script.extensions", + "kotlin.script.templates", + "kotlin.script.templates.standard", + "kotlinx.collections.immutable", + "kotlinx.collections.immutable.adapters", + "kotlinx.collections.immutable.implementations.immutableList", + "kotlinx.collections.immutable.implementations.immutableMap", + "kotlinx.collections.immutable.implementations.immutableSet", + "kotlinx.collections.immutable.implementations.persistentOrderedMap", + "kotlinx.collections.immutable.implementations.persistentOrderedSet", + "kotlinx.collections.immutable.internal", + "net.rubygrapefruit.platform", + "net.rubygrapefruit.platform.internal", + "net.rubygrapefruit.platform.internal.jni", + "org.jetbrains.annotations", + "org.jetbrains.kotlin", + "org.jetbrains.kotlin.analysis.api", + "org.jetbrains.kotlin.analysis.api.annotations", + "org.jetbrains.kotlin.analysis.api.base", + "org.jetbrains.kotlin.analysis.api.calls", + "org.jetbrains.kotlin.analysis.api.compile", + "org.jetbrains.kotlin.analysis.api.components", + "org.jetbrains.kotlin.analysis.api.contracts.description", + "org.jetbrains.kotlin.analysis.api.contracts.description.booleans", + "org.jetbrains.kotlin.analysis.api.descriptors", + "org.jetbrains.kotlin.analysis.api.descriptors.annotations", + "org.jetbrains.kotlin.analysis.api.descriptors.components", + "org.jetbrains.kotlin.analysis.api.descriptors.components.base", + "org.jetbrains.kotlin.analysis.api.descriptors.contracts", + "org.jetbrains.kotlin.analysis.api.descriptors.references", + "org.jetbrains.kotlin.analysis.api.descriptors.scopes", + "org.jetbrains.kotlin.analysis.api.descriptors.signatures", + "org.jetbrains.kotlin.analysis.api.descriptors.symbols", + "org.jetbrains.kotlin.analysis.api.descriptors.symbols.base", + "org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased", + "org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base", + "org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers", + "org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased", + "org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base", + "org.jetbrains.kotlin.analysis.api.descriptors.types", + "org.jetbrains.kotlin.analysis.api.descriptors.types.base", + "org.jetbrains.kotlin.analysis.api.descriptors.utils", + "org.jetbrains.kotlin.analysis.api.diagnostics", + "org.jetbrains.kotlin.analysis.api.fir", + "org.jetbrains.kotlin.analysis.api.fir.annotations", + "org.jetbrains.kotlin.analysis.api.fir.components", + "org.jetbrains.kotlin.analysis.api.fir.contracts", + "org.jetbrains.kotlin.analysis.api.fir.diagnostics", + "org.jetbrains.kotlin.analysis.api.fir.evaluate", + "org.jetbrains.kotlin.analysis.api.fir.references", + "org.jetbrains.kotlin.analysis.api.fir.scopes", + "org.jetbrains.kotlin.analysis.api.fir.signatures", + "org.jetbrains.kotlin.analysis.api.fir.symbols", + "org.jetbrains.kotlin.analysis.api.fir.symbols.pointers", + "org.jetbrains.kotlin.analysis.api.fir.types", + "org.jetbrains.kotlin.analysis.api.fir.types.qualifiers", + "org.jetbrains.kotlin.analysis.api.fir.utils", + "org.jetbrains.kotlin.analysis.api.impl.barebone.annotations", + "org.jetbrains.kotlin.analysis.api.impl.base", + "org.jetbrains.kotlin.analysis.api.impl.base.annotations", + "org.jetbrains.kotlin.analysis.api.impl.base.components", + "org.jetbrains.kotlin.analysis.api.impl.base.java.source", + "org.jetbrains.kotlin.analysis.api.impl.base.references", + "org.jetbrains.kotlin.analysis.api.impl.base.scopes", + "org.jetbrains.kotlin.analysis.api.impl.base.symbols", + "org.jetbrains.kotlin.analysis.api.impl.base.symbols.pointers", + "org.jetbrains.kotlin.analysis.api.impl.base.util", + "org.jetbrains.kotlin.analysis.api.lifetime", + "org.jetbrains.kotlin.analysis.api.lifetime.impl", + "org.jetbrains.kotlin.analysis.api.renderer.base", + "org.jetbrains.kotlin.analysis.api.renderer.base.annotations", + "org.jetbrains.kotlin.analysis.api.renderer.base.annotations.renderers", + "org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers", + "org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers.renderers", + "org.jetbrains.kotlin.analysis.api.renderer.declarations", + "org.jetbrains.kotlin.analysis.api.renderer.declarations.bodies", + "org.jetbrains.kotlin.analysis.api.renderer.declarations.impl", + "org.jetbrains.kotlin.analysis.api.renderer.declarations.modifiers", + "org.jetbrains.kotlin.analysis.api.renderer.declarations.modifiers.impl", + "org.jetbrains.kotlin.analysis.api.renderer.declarations.modifiers.renderers", + "org.jetbrains.kotlin.analysis.api.renderer.declarations.renderers", + "org.jetbrains.kotlin.analysis.api.renderer.declarations.renderers.callables", + "org.jetbrains.kotlin.analysis.api.renderer.declarations.renderers.classifiers", + "org.jetbrains.kotlin.analysis.api.renderer.declarations.superTypes", + "org.jetbrains.kotlin.analysis.api.renderer.types", + "org.jetbrains.kotlin.analysis.api.renderer.types.impl", + "org.jetbrains.kotlin.analysis.api.renderer.types.renderers", + "org.jetbrains.kotlin.analysis.api.resolve.extensions", + "org.jetbrains.kotlin.analysis.api.scopes", + "org.jetbrains.kotlin.analysis.api.session", + "org.jetbrains.kotlin.analysis.api.signatures", + "org.jetbrains.kotlin.analysis.api.standalone", + "org.jetbrains.kotlin.analysis.api.standalone.base.project.structure", + "org.jetbrains.kotlin.analysis.api.symbols", + "org.jetbrains.kotlin.analysis.api.symbols.markers", + "org.jetbrains.kotlin.analysis.api.symbols.pointers", + "org.jetbrains.kotlin.analysis.api.types", + "org.jetbrains.kotlin.analysis.decompiled.light.classes", + "org.jetbrains.kotlin.analysis.decompiled.light.classes.fe10", + "org.jetbrains.kotlin.analysis.decompiled.light.classes.origin", + "org.jetbrains.kotlin.analysis.decompiler.psi", + "org.jetbrains.kotlin.analysis.decompiler.psi.file", + "org.jetbrains.kotlin.analysis.decompiler.psi.text", + "org.jetbrains.kotlin.analysis.decompiler.stub", + "org.jetbrains.kotlin.analysis.decompiler.stub.file", + "org.jetbrains.kotlin.analysis.decompiler.stub.flags", + "org.jetbrains.kotlin.analysis.low.level.api.fir", + "org.jetbrains.kotlin.analysis.low.level.api.fir.api", + "org.jetbrains.kotlin.analysis.low.level.api.fir.api.services", + "org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets", + "org.jetbrains.kotlin.analysis.low.level.api.fir.caches", + "org.jetbrains.kotlin.analysis.low.level.api.fir.compile", + "org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics", + "org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.fir", + "org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder", + "org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder", + "org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure", + "org.jetbrains.kotlin.analysis.low.level.api.fir.fir.caches", + "org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve", + "org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure", + "org.jetbrains.kotlin.analysis.low.level.api.fir.providers", + "org.jetbrains.kotlin.analysis.low.level.api.fir.resolve.extensions", + "org.jetbrains.kotlin.analysis.low.level.api.fir.resolver", + "org.jetbrains.kotlin.analysis.low.level.api.fir.sessions", + "org.jetbrains.kotlin.analysis.low.level.api.fir.state", + "org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization", + "org.jetbrains.kotlin.analysis.low.level.api.fir.transformers", + "org.jetbrains.kotlin.analysis.low.level.api.fir.util", + "org.jetbrains.kotlin.analysis.project.structure", + "org.jetbrains.kotlin.analysis.project.structure.builder", + "org.jetbrains.kotlin.analysis.project.structure.impl", + "org.jetbrains.kotlin.analysis.providers", + "org.jetbrains.kotlin.analysis.providers.impl", + "org.jetbrains.kotlin.analysis.providers.impl.declarationProviders", + "org.jetbrains.kotlin.analysis.providers.impl.util", + "org.jetbrains.kotlin.analysis.providers.topics", + "org.jetbrains.kotlin.analysis.utils", + "org.jetbrains.kotlin.analysis.utils.caches", + "org.jetbrains.kotlin.analysis.utils.collections", + "org.jetbrains.kotlin.analysis.utils.errors", + "org.jetbrains.kotlin.analysis.utils.printer", + "org.jetbrains.kotlin.analysis.utils.relfection", + "org.jetbrains.kotlin.analyzer", + "org.jetbrains.kotlin.analyzer.common", + "org.jetbrains.kotlin.arguments", + "org.jetbrains.kotlin.asJava", + "org.jetbrains.kotlin.asJava.builder", + "org.jetbrains.kotlin.asJava.classes", + "org.jetbrains.kotlin.asJava.elements", + "org.jetbrains.kotlin.asJava.finder", + "org.jetbrains.kotlin.backend.common", + "org.jetbrains.kotlin.backend.common.bridges", + "org.jetbrains.kotlin.backend.common.linkage.issues", + "org.jetbrains.kotlin.backend.common.linkage.partial", + "org.jetbrains.kotlin.backend.common.output", + "org.jetbrains.kotlin.backend.common.overrides", + "org.jetbrains.kotlin.backend.common.serialization", + "org.jetbrains.kotlin.backend.common.serialization.encodings", + "org.jetbrains.kotlin.backend.common.serialization.mangle", + "org.jetbrains.kotlin.backend.common.serialization.mangle.descriptor", + "org.jetbrains.kotlin.backend.common.serialization.mangle.ir", + "org.jetbrains.kotlin.backend.common.serialization.metadata", + "org.jetbrains.kotlin.backend.common.serialization.metadata.impl", + "org.jetbrains.kotlin.backend.common.serialization.proto", + "org.jetbrains.kotlin.backend.common.serialization.signature", + "org.jetbrains.kotlin.backend.jvm", + "org.jetbrains.kotlin.backend.jvm.caches", + "org.jetbrains.kotlin.backend.jvm.codegen", + "org.jetbrains.kotlin.backend.jvm.extensions", + "org.jetbrains.kotlin.backend.jvm.intrinsics", + "org.jetbrains.kotlin.backend.jvm.ir", + "org.jetbrains.kotlin.backend.jvm.lower", + "org.jetbrains.kotlin.backend.jvm.lower.indy", + "org.jetbrains.kotlin.backend.jvm.mapping", + "org.jetbrains.kotlin.backend.jvm.metadata", + "org.jetbrains.kotlin.build", + "org.jetbrains.kotlin.build.report", + "org.jetbrains.kotlin.build.report.metrics", + "org.jetbrains.kotlin.build.report.statistics", + "org.jetbrains.kotlin.build.report.statistics.file", + "org.jetbrains.kotlin.buildtools.api", + "org.jetbrains.kotlin.buildtools.api.jvm", + "org.jetbrains.kotlin.builtins", + "org.jetbrains.kotlin.builtins.functions", + "org.jetbrains.kotlin.builtins.jvm", + "org.jetbrains.kotlin.builtins.konan", + "org.jetbrains.kotlin.cfg", + "org.jetbrains.kotlin.cfg.pseudocode", + "org.jetbrains.kotlin.cfg.pseudocode.instructions", + "org.jetbrains.kotlin.cfg.pseudocode.instructions.eval", + "org.jetbrains.kotlin.cfg.pseudocode.instructions.jumps", + "org.jetbrains.kotlin.cfg.pseudocode.instructions.special", + "org.jetbrains.kotlin.cfg.pseudocodeTraverser", + "org.jetbrains.kotlin.cfg.variable", + "org.jetbrains.kotlin.checkers", + "org.jetbrains.kotlin.checkers.diagnostics", + "org.jetbrains.kotlin.checkers.diagnostics.factories", + "org.jetbrains.kotlin.checkers.utils", + "org.jetbrains.kotlin.cli.common", + "org.jetbrains.kotlin.cli.common.arguments", + "org.jetbrains.kotlin.cli.common.config", + "org.jetbrains.kotlin.cli.common.environment", + "org.jetbrains.kotlin.cli.common.extensions", + "org.jetbrains.kotlin.cli.common.fir", + "org.jetbrains.kotlin.cli.common.messages", + "org.jetbrains.kotlin.cli.common.modules", + "org.jetbrains.kotlin.cli.common.output", + "org.jetbrains.kotlin.cli.common.profiling", + "org.jetbrains.kotlin.cli.common.repl", + "org.jetbrains.kotlin.cli.js", + "org.jetbrains.kotlin.cli.js.dce", + "org.jetbrains.kotlin.cli.js.internal", + "org.jetbrains.kotlin.cli.js.klib", + "org.jetbrains.kotlin.cli.jvm", + "org.jetbrains.kotlin.cli.jvm.compiler", + "org.jetbrains.kotlin.cli.jvm.compiler.builder", + "org.jetbrains.kotlin.cli.jvm.compiler.jarfs", + "org.jetbrains.kotlin.cli.jvm.compiler.pipeline", + "org.jetbrains.kotlin.cli.jvm.config", + "org.jetbrains.kotlin.cli.jvm.index", + "org.jetbrains.kotlin.cli.jvm.javac", + "org.jetbrains.kotlin.cli.jvm.modules", + "org.jetbrains.kotlin.cli.jvm.plugins", + "org.jetbrains.kotlin.cli.metadata", + "org.jetbrains.kotlin.cli.plugins", + "org.jetbrains.kotlin.codegen", + "org.jetbrains.kotlin.codegen.binding", + "org.jetbrains.kotlin.codegen.context", + "org.jetbrains.kotlin.codegen.coroutines", + "org.jetbrains.kotlin.codegen.extensions", + "org.jetbrains.kotlin.codegen.inline", + "org.jetbrains.kotlin.codegen.inline.coroutines", + "org.jetbrains.kotlin.codegen.intrinsics", + "org.jetbrains.kotlin.codegen.optimization", + "org.jetbrains.kotlin.codegen.optimization.boxing", + "org.jetbrains.kotlin.codegen.optimization.common", + "org.jetbrains.kotlin.codegen.optimization.fixStack", + "org.jetbrains.kotlin.codegen.optimization.nullCheck", + "org.jetbrains.kotlin.codegen.optimization.temporaryVals", + "org.jetbrains.kotlin.codegen.optimization.transformer", + "org.jetbrains.kotlin.codegen.pseudoInsns", + "org.jetbrains.kotlin.codegen.range", + "org.jetbrains.kotlin.codegen.range.comparison", + "org.jetbrains.kotlin.codegen.range.forLoop", + "org.jetbrains.kotlin.codegen.range.inExpression", + "org.jetbrains.kotlin.codegen.serialization", + "org.jetbrains.kotlin.codegen.signature", + "org.jetbrains.kotlin.codegen.state", + "org.jetbrains.kotlin.codegen.when", + "org.jetbrains.kotlin.compiler.plugin", + "org.jetbrains.kotlin.compilerRunner", + "org.jetbrains.kotlin.config", + "org.jetbrains.kotlin.constant", + "org.jetbrains.kotlin.container", + "org.jetbrains.kotlin.context", + "org.jetbrains.kotlin.contracts", + "org.jetbrains.kotlin.contracts.description", + "org.jetbrains.kotlin.contracts.description.expressions", + "org.jetbrains.kotlin.contracts.interpretation", + "org.jetbrains.kotlin.contracts.model", + "org.jetbrains.kotlin.contracts.model.functors", + "org.jetbrains.kotlin.contracts.model.structure", + "org.jetbrains.kotlin.contracts.model.visitors", + "org.jetbrains.kotlin.contracts.parsing", + "org.jetbrains.kotlin.contracts.parsing.effects", + "org.jetbrains.kotlin.coroutines", + "org.jetbrains.kotlin.daemon.client", + "org.jetbrains.kotlin.daemon.common", + "org.jetbrains.kotlin.descriptors", + "org.jetbrains.kotlin.descriptors.annotations", + "org.jetbrains.kotlin.descriptors.deserialization", + "org.jetbrains.kotlin.descriptors.impl", + "org.jetbrains.kotlin.descriptors.java", + "org.jetbrains.kotlin.descriptors.konan", + "org.jetbrains.kotlin.descriptors.runtime.components", + "org.jetbrains.kotlin.descriptors.runtime.structure", + "org.jetbrains.kotlin.descriptors.synthetic", + "org.jetbrains.kotlin.diagnostics", + "org.jetbrains.kotlin.diagnostics.impl", + "org.jetbrains.kotlin.diagnostics.rendering", + "org.jetbrains.kotlin.extensions", + "org.jetbrains.kotlin.extensions.internal", + "org.jetbrains.kotlin.fileClasses", + "org.jetbrains.kotlin.fir", + "org.jetbrains.kotlin.fir.analysis", + "org.jetbrains.kotlin.fir.analysis.cfa", + "org.jetbrains.kotlin.fir.analysis.cfa.util", + "org.jetbrains.kotlin.fir.analysis.checkers", + "org.jetbrains.kotlin.fir.analysis.checkers.cfa", + "org.jetbrains.kotlin.fir.analysis.checkers.config", + "org.jetbrains.kotlin.fir.analysis.checkers.context", + "org.jetbrains.kotlin.fir.analysis.checkers.declaration", + "org.jetbrains.kotlin.fir.analysis.checkers.expression", + "org.jetbrains.kotlin.fir.analysis.checkers.extended", + "org.jetbrains.kotlin.fir.analysis.checkers.syntax", + "org.jetbrains.kotlin.fir.analysis.checkers.type", + "org.jetbrains.kotlin.fir.analysis.collectors", + "org.jetbrains.kotlin.fir.analysis.collectors.components", + "org.jetbrains.kotlin.fir.analysis.diagnostics", + "org.jetbrains.kotlin.fir.analysis.diagnostics.js", + "org.jetbrains.kotlin.fir.analysis.diagnostics.jvm", + "org.jetbrains.kotlin.fir.analysis.diagnostics.native", + "org.jetbrains.kotlin.fir.analysis.extensions", + "org.jetbrains.kotlin.fir.analysis.js.checkers", + "org.jetbrains.kotlin.fir.analysis.js.checkers.declaration", + "org.jetbrains.kotlin.fir.analysis.js.checkers.expression", + "org.jetbrains.kotlin.fir.analysis.jvm", + "org.jetbrains.kotlin.fir.analysis.jvm.checkers", + "org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration", + "org.jetbrains.kotlin.fir.analysis.jvm.checkers.expression", + "org.jetbrains.kotlin.fir.analysis.jvm.checkers.type", + "org.jetbrains.kotlin.fir.analysis.native.checkers", + "org.jetbrains.kotlin.fir.backend", + "org.jetbrains.kotlin.fir.backend.generators", + "org.jetbrains.kotlin.fir.backend.jvm", + "org.jetbrains.kotlin.fir.builder", + "org.jetbrains.kotlin.fir.caches", + "org.jetbrains.kotlin.fir.checkers", + "org.jetbrains.kotlin.fir.contracts", + "org.jetbrains.kotlin.fir.contracts.builder", + "org.jetbrains.kotlin.fir.contracts.description", + "org.jetbrains.kotlin.fir.contracts.impl", + "org.jetbrains.kotlin.fir.declarations", + "org.jetbrains.kotlin.fir.declarations.builder", + "org.jetbrains.kotlin.fir.declarations.comparators", + "org.jetbrains.kotlin.fir.declarations.impl", + "org.jetbrains.kotlin.fir.declarations.synthetic", + "org.jetbrains.kotlin.fir.declarations.utils", + "org.jetbrains.kotlin.fir.descriptors", + "org.jetbrains.kotlin.fir.deserialization", + "org.jetbrains.kotlin.fir.diagnostics", + "org.jetbrains.kotlin.fir.expressions", + "org.jetbrains.kotlin.fir.expressions.builder", + "org.jetbrains.kotlin.fir.expressions.impl", + "org.jetbrains.kotlin.fir.extensions", + "org.jetbrains.kotlin.fir.extensions.predicate", + "org.jetbrains.kotlin.fir.extensions.utils", + "org.jetbrains.kotlin.fir.impl", + "org.jetbrains.kotlin.fir.java", + "org.jetbrains.kotlin.fir.java.declarations", + "org.jetbrains.kotlin.fir.java.deserialization", + "org.jetbrains.kotlin.fir.java.enhancement", + "org.jetbrains.kotlin.fir.java.scopes", + "org.jetbrains.kotlin.fir.java.symbols", + "org.jetbrains.kotlin.fir.lazy", + "org.jetbrains.kotlin.fir.pipeline", + "org.jetbrains.kotlin.fir.plugin", + "org.jetbrains.kotlin.fir.references", + "org.jetbrains.kotlin.fir.references.builder", + "org.jetbrains.kotlin.fir.references.impl", + "org.jetbrains.kotlin.fir.renderer", + "org.jetbrains.kotlin.fir.resolve", + "org.jetbrains.kotlin.fir.resolve.calls", + "org.jetbrains.kotlin.fir.resolve.calls.jvm", + "org.jetbrains.kotlin.fir.resolve.calls.tower", + "org.jetbrains.kotlin.fir.resolve.dfa", + "org.jetbrains.kotlin.fir.resolve.dfa.cfg", + "org.jetbrains.kotlin.fir.resolve.diagnostics", + "org.jetbrains.kotlin.fir.resolve.inference", + "org.jetbrains.kotlin.fir.resolve.inference.model", + "org.jetbrains.kotlin.fir.resolve.providers", + "org.jetbrains.kotlin.fir.resolve.providers.impl", + "org.jetbrains.kotlin.fir.resolve.scopes", + "org.jetbrains.kotlin.fir.resolve.substitution", + "org.jetbrains.kotlin.fir.resolve.transformers", + "org.jetbrains.kotlin.fir.resolve.transformers.body.resolve", + "org.jetbrains.kotlin.fir.resolve.transformers.contracts", + "org.jetbrains.kotlin.fir.resolve.transformers.mpp", + "org.jetbrains.kotlin.fir.resolve.transformers.plugin", + "org.jetbrains.kotlin.fir.scopes", + "org.jetbrains.kotlin.fir.scopes.impl", + "org.jetbrains.kotlin.fir.scopes.jvm", + "org.jetbrains.kotlin.fir.serialization", + "org.jetbrains.kotlin.fir.serialization.constant", + "org.jetbrains.kotlin.fir.session", + "org.jetbrains.kotlin.fir.session.environment", + "org.jetbrains.kotlin.fir.signaturer", + "org.jetbrains.kotlin.fir.symbols", + "org.jetbrains.kotlin.fir.symbols.impl", + "org.jetbrains.kotlin.fir.types", + "org.jetbrains.kotlin.fir.types.builder", + "org.jetbrains.kotlin.fir.types.impl", + "org.jetbrains.kotlin.fir.types.jvm", + "org.jetbrains.kotlin.fir.util", + "org.jetbrains.kotlin.fir.utils.exceptions", + "org.jetbrains.kotlin.fir.visitors", + "org.jetbrains.kotlin.frontend.di", + "org.jetbrains.kotlin.frontend.java.di", + "org.jetbrains.kotlin.frontend.js.di", + "org.jetbrains.kotlin.idea", + "org.jetbrains.kotlin.idea.references", + "org.jetbrains.kotlin.incremental", + "org.jetbrains.kotlin.incremental.components", + "org.jetbrains.kotlin.incremental.js", + "org.jetbrains.kotlin.incremental.storage", + "org.jetbrains.kotlin.inline", + "org.jetbrains.kotlin.ir", + "org.jetbrains.kotlin.ir.backend.js", + "org.jetbrains.kotlin.ir.builders", + "org.jetbrains.kotlin.ir.builders.declarations", + "org.jetbrains.kotlin.ir.declarations", + "org.jetbrains.kotlin.ir.declarations.impl", + "org.jetbrains.kotlin.ir.declarations.lazy", + "org.jetbrains.kotlin.ir.descriptors", + "org.jetbrains.kotlin.ir.expressions", + "org.jetbrains.kotlin.ir.expressions.impl", + "org.jetbrains.kotlin.ir.linkage", + "org.jetbrains.kotlin.ir.linkage.partial", + "org.jetbrains.kotlin.ir.overrides", + "org.jetbrains.kotlin.ir.symbols", + "org.jetbrains.kotlin.ir.symbols.impl", + "org.jetbrains.kotlin.ir.types", + "org.jetbrains.kotlin.ir.types.impl", + "org.jetbrains.kotlin.ir.util", + "org.jetbrains.kotlin.ir.visitors", + "org.jetbrains.kotlin.js", + "org.jetbrains.kotlin.js.analyze", + "org.jetbrains.kotlin.js.analyzer", + "org.jetbrains.kotlin.js.backend", + "org.jetbrains.kotlin.js.backend.ast", + "org.jetbrains.kotlin.js.backend.ast.metadata", + "org.jetbrains.kotlin.js.common", + "org.jetbrains.kotlin.js.config", + "org.jetbrains.kotlin.js.coroutine", + "org.jetbrains.kotlin.js.descriptorUtils", + "org.jetbrains.kotlin.js.facade", + "org.jetbrains.kotlin.js.facade.exceptions", + "org.jetbrains.kotlin.js.inline", + "org.jetbrains.kotlin.js.inline.clean", + "org.jetbrains.kotlin.js.inline.context", + "org.jetbrains.kotlin.js.inline.util", + "org.jetbrains.kotlin.js.inline.util.collectors", + "org.jetbrains.kotlin.js.inline.util.rewriters", + "org.jetbrains.kotlin.js.naming", + "org.jetbrains.kotlin.js.parser", + "org.jetbrains.kotlin.js.parser.sourcemaps", + "org.jetbrains.kotlin.js.patterns", + "org.jetbrains.kotlin.js.patterns.typePredicates", + "org.jetbrains.kotlin.js.resolve", + "org.jetbrains.kotlin.js.resolve.diagnostics", + "org.jetbrains.kotlin.js.sourceMap", + "org.jetbrains.kotlin.js.translate.callTranslator", + "org.jetbrains.kotlin.js.translate.context", + "org.jetbrains.kotlin.js.translate.context.generator", + "org.jetbrains.kotlin.js.translate.declaration", + "org.jetbrains.kotlin.js.translate.expression", + "org.jetbrains.kotlin.js.translate.extensions", + "org.jetbrains.kotlin.js.translate.general", + "org.jetbrains.kotlin.js.translate.initializer", + "org.jetbrains.kotlin.js.translate.intrinsic", + "org.jetbrains.kotlin.js.translate.intrinsic.functions", + "org.jetbrains.kotlin.js.translate.intrinsic.functions.basic", + "org.jetbrains.kotlin.js.translate.intrinsic.functions.factories", + "org.jetbrains.kotlin.js.translate.intrinsic.objects", + "org.jetbrains.kotlin.js.translate.intrinsic.operation", + "org.jetbrains.kotlin.js.translate.operation", + "org.jetbrains.kotlin.js.translate.reference", + "org.jetbrains.kotlin.js.translate.test", + "org.jetbrains.kotlin.js.translate.utils", + "org.jetbrains.kotlin.js.translate.utils.jsAstUtils", + "org.jetbrains.kotlin.js.translate.utils.mutator", + "org.jetbrains.kotlin.js.util", + "org.jetbrains.kotlin.kapt3.diagnostic", + "org.jetbrains.kotlin.kdoc.lexer", + "org.jetbrains.kotlin.kdoc.parser", + "org.jetbrains.kotlin.kdoc.psi.api", + "org.jetbrains.kotlin.kdoc.psi.impl", + "org.jetbrains.kotlin.konan", + "org.jetbrains.kotlin.konan.exec", + "org.jetbrains.kotlin.konan.file", + "org.jetbrains.kotlin.konan.library", + "org.jetbrains.kotlin.konan.library.impl", + "org.jetbrains.kotlin.konan.properties", + "org.jetbrains.kotlin.konan.target", + "org.jetbrains.kotlin.konan.util", + "org.jetbrains.kotlin.lexer", + "org.jetbrains.kotlin.library", + "org.jetbrains.kotlin.library.abi", + "org.jetbrains.kotlin.library.abi.impl", + "org.jetbrains.kotlin.library.encodings", + "org.jetbrains.kotlin.library.impl", + "org.jetbrains.kotlin.library.metadata", + "org.jetbrains.kotlin.library.metadata.impl", + "org.jetbrains.kotlin.library.metadata.resolver", + "org.jetbrains.kotlin.library.metadata.resolver.impl", + "org.jetbrains.kotlin.library.resolver", + "org.jetbrains.kotlin.library.resolver.impl", + "org.jetbrains.kotlin.light.classes.symbol", + "org.jetbrains.kotlin.light.classes.symbol.annotations", + "org.jetbrains.kotlin.light.classes.symbol.classes", + "org.jetbrains.kotlin.light.classes.symbol.codeReferences", + "org.jetbrains.kotlin.light.classes.symbol.fields", + "org.jetbrains.kotlin.light.classes.symbol.methods", + "org.jetbrains.kotlin.light.classes.symbol.modifierLists", + "org.jetbrains.kotlin.light.classes.symbol.parameters", + "org.jetbrains.kotlin.load.java", + "org.jetbrains.kotlin.load.java.components", + "org.jetbrains.kotlin.load.java.descriptors", + "org.jetbrains.kotlin.load.java.lazy", + "org.jetbrains.kotlin.load.java.lazy.descriptors", + "org.jetbrains.kotlin.load.java.lazy.types", + "org.jetbrains.kotlin.load.java.sam", + "org.jetbrains.kotlin.load.java.sources", + "org.jetbrains.kotlin.load.java.structure", + "org.jetbrains.kotlin.load.java.structure.impl", + "org.jetbrains.kotlin.load.java.structure.impl.classFiles", + "org.jetbrains.kotlin.load.java.structure.impl.source", + "org.jetbrains.kotlin.load.java.typeEnhancement", + "org.jetbrains.kotlin.load.kotlin", + "org.jetbrains.kotlin.load.kotlin.header", + "org.jetbrains.kotlin.load.kotlin.incremental", + "org.jetbrains.kotlin.load.kotlin.incremental.components", + "org.jetbrains.kotlin.metadata", + "org.jetbrains.kotlin.metadata.builtins", + "org.jetbrains.kotlin.metadata.deserialization", + "org.jetbrains.kotlin.metadata.java", + "org.jetbrains.kotlin.metadata.js", + "org.jetbrains.kotlin.metadata.jvm", + "org.jetbrains.kotlin.metadata.jvm.deserialization", + "org.jetbrains.kotlin.metadata.jvm.serialization", + "org.jetbrains.kotlin.metadata.serialization", + "org.jetbrains.kotlin.modules", + "org.jetbrains.kotlin.mpp", + "org.jetbrains.kotlin.name", + "org.jetbrains.kotlin.parsing", + "org.jetbrains.kotlin.platform", + "org.jetbrains.kotlin.platform.compat", + "org.jetbrains.kotlin.platform.impl", + "org.jetbrains.kotlin.platform.js", + "org.jetbrains.kotlin.platform.jvm", + "org.jetbrains.kotlin.platform.konan", + "org.jetbrains.kotlin.platform.wasm", + "org.jetbrains.kotlin.plugin.references", + "org.jetbrains.kotlin.preloading", + "org.jetbrains.kotlin.preloading.instrumentation", + "org.jetbrains.kotlin.preloading.instrumentation.annotations", + "org.jetbrains.kotlin.progress", + "org.jetbrains.kotlin.protobuf", + "org.jetbrains.kotlin.psi", + "org.jetbrains.kotlin.psi.addRemoveModifier", + "org.jetbrains.kotlin.psi.codeFragmentUtil", + "org.jetbrains.kotlin.psi.debugText", + "org.jetbrains.kotlin.psi.findDocComment", + "org.jetbrains.kotlin.psi.psiUtil", + "org.jetbrains.kotlin.psi.stubs", + "org.jetbrains.kotlin.psi.stubs.elements", + "org.jetbrains.kotlin.psi.stubs.impl", + "org.jetbrains.kotlin.psi.synthetics", + "org.jetbrains.kotlin.psi.typeRefHelpers", + "org.jetbrains.kotlin.psi2ir", + "org.jetbrains.kotlin.psi2ir.descriptors", + "org.jetbrains.kotlin.psi2ir.generators", + "org.jetbrains.kotlin.psi2ir.generators.fragments", + "org.jetbrains.kotlin.psi2ir.intermediate", + "org.jetbrains.kotlin.psi2ir.preprocessing", + "org.jetbrains.kotlin.psi2ir.transformations", + "org.jetbrains.kotlin.references.fe10", + "org.jetbrains.kotlin.references.fe10.base", + "org.jetbrains.kotlin.references.fe10.util", + "org.jetbrains.kotlin.renderer", + "org.jetbrains.kotlin.resolve", + "org.jetbrains.kotlin.resolve.annotations", + "org.jetbrains.kotlin.resolve.bindingContextUtil", + "org.jetbrains.kotlin.resolve.calls", + "org.jetbrains.kotlin.resolve.calls.callUtil", + "org.jetbrains.kotlin.resolve.calls.checkers", + "org.jetbrains.kotlin.resolve.calls.components", + "org.jetbrains.kotlin.resolve.calls.components.candidate", + "org.jetbrains.kotlin.resolve.calls.context", + "org.jetbrains.kotlin.resolve.calls.inference", + "org.jetbrains.kotlin.resolve.calls.inference.components", + "org.jetbrains.kotlin.resolve.calls.inference.constraintPosition", + "org.jetbrains.kotlin.resolve.calls.inference.model", + "org.jetbrains.kotlin.resolve.calls.model", + "org.jetbrains.kotlin.resolve.calls.mpp", + "org.jetbrains.kotlin.resolve.calls.results", + "org.jetbrains.kotlin.resolve.calls.smartcasts", + "org.jetbrains.kotlin.resolve.calls.tasks", + "org.jetbrains.kotlin.resolve.calls.tower", + "org.jetbrains.kotlin.resolve.calls.util", + "org.jetbrains.kotlin.resolve.checkers", + "org.jetbrains.kotlin.resolve.constants", + "org.jetbrains.kotlin.resolve.constants.evaluate", + "org.jetbrains.kotlin.resolve.deprecation", + "org.jetbrains.kotlin.resolve.descriptorUtil", + "org.jetbrains.kotlin.resolve.diagnostics", + "org.jetbrains.kotlin.resolve.extensions", + "org.jetbrains.kotlin.resolve.inline", + "org.jetbrains.kotlin.resolve.jvm", + "org.jetbrains.kotlin.resolve.jvm.annotations", + "org.jetbrains.kotlin.resolve.jvm.checkers", + "org.jetbrains.kotlin.resolve.jvm.diagnostics", + "org.jetbrains.kotlin.resolve.jvm.extensions", + "org.jetbrains.kotlin.resolve.jvm.jvmSignature", + "org.jetbrains.kotlin.resolve.jvm.kotlinSignature", + "org.jetbrains.kotlin.resolve.jvm.modules", + "org.jetbrains.kotlin.resolve.jvm.multiplatform", + "org.jetbrains.kotlin.resolve.jvm.platform", + "org.jetbrains.kotlin.resolve.konan.diagnostics", + "org.jetbrains.kotlin.resolve.konan.platform", + "org.jetbrains.kotlin.resolve.lazy", + "org.jetbrains.kotlin.resolve.lazy.data", + "org.jetbrains.kotlin.resolve.lazy.declarations", + "org.jetbrains.kotlin.resolve.lazy.descriptors", + "org.jetbrains.kotlin.resolve.multiplatform", + "org.jetbrains.kotlin.resolve.references", + "org.jetbrains.kotlin.resolve.repl", + "org.jetbrains.kotlin.resolve.sam", + "org.jetbrains.kotlin.resolve.scopes", + "org.jetbrains.kotlin.resolve.scopes.optimization", + "org.jetbrains.kotlin.resolve.scopes.receivers", + "org.jetbrains.kotlin.resolve.scopes.synthetic", + "org.jetbrains.kotlin.resolve.scopes.utils", + "org.jetbrains.kotlin.resolve.source", + "org.jetbrains.kotlin.resolve.typeBinding", + "org.jetbrains.kotlin.scripting", + "org.jetbrains.kotlin.scripting.compiler.plugin", + "org.jetbrains.kotlin.scripting.compiler.plugin.definitions", + "org.jetbrains.kotlin.scripting.compiler.plugin.dependencies", + "org.jetbrains.kotlin.scripting.compiler.plugin.extensions", + "org.jetbrains.kotlin.scripting.compiler.plugin.impl", + "org.jetbrains.kotlin.scripting.compiler.plugin.repl", + "org.jetbrains.kotlin.scripting.compiler.plugin.repl.configuration", + "org.jetbrains.kotlin.scripting.compiler.plugin.repl.messages", + "org.jetbrains.kotlin.scripting.compiler.plugin.repl.reader", + "org.jetbrains.kotlin.scripting.compiler.plugin.repl.writer", + "org.jetbrains.kotlin.scripting.compiler.plugin.services", + "org.jetbrains.kotlin.scripting.configuration", + "org.jetbrains.kotlin.scripting.definitions", + "org.jetbrains.kotlin.scripting.extensions", + "org.jetbrains.kotlin.scripting.resolve", + "org.jetbrains.kotlin.serialization", + "org.jetbrains.kotlin.serialization.builtins", + "org.jetbrains.kotlin.serialization.deserialization", + "org.jetbrains.kotlin.serialization.deserialization.builtins", + "org.jetbrains.kotlin.serialization.deserialization.descriptors", + "org.jetbrains.kotlin.serialization.js", + "org.jetbrains.kotlin.serialization.js.ast", + "org.jetbrains.kotlin.serialization.konan", + "org.jetbrains.kotlin.serialization.konan.impl", + "org.jetbrains.kotlin.storage", + "org.jetbrains.kotlin.synthetic", + "org.jetbrains.kotlin.type", + "org.jetbrains.kotlin.types", + "org.jetbrains.kotlin.types.checker", + "org.jetbrains.kotlin.types.error", + "org.jetbrains.kotlin.types.expressions", + "org.jetbrains.kotlin.types.expressions.typeInfoFactory", + "org.jetbrains.kotlin.types.expressions.unqualifiedSuper", + "org.jetbrains.kotlin.types.extensions", + "org.jetbrains.kotlin.types.model", + "org.jetbrains.kotlin.types.typeUtil", + "org.jetbrains.kotlin.types.typesApproximation", + "org.jetbrains.kotlin.util", + "org.jetbrains.kotlin.util.capitalizeDecapitalize", + "org.jetbrains.kotlin.util.collectionUtils", + "org.jetbrains.kotlin.util.javaslang", + "org.jetbrains.kotlin.util.slicedMap", + "org.jetbrains.kotlin.utils", + "org.jetbrains.kotlin.utils.addToStdlib", + "org.jetbrains.kotlin.utils.concurrent.block", + "org.jetbrains.kotlin.utils.exceptions", + "org.jetbrains.kotlin.utils.fileUtils", + "org.jetbrains.kotlin.utils.intellij", + "org.jetbrains.kotlin.utils.kapt", + "org.jetbrains.kotlin.utils.repl", + "org.jetbrains.kotlin.utils.strings", + "org.jetbrains.kotlin.wasm.analyze", + "org.jetbrains.kotlin.wasm.resolve", + "org.jetbrains.kotlin.wasm.resolve.diagnostics", + "org.jetbrains.kotlin.wasm.util", + "org.jline.builtins", + "org.jline.builtins.ssh", + "org.jline.builtins.telnet", + "org.jline.keymap", + "org.jline.reader", + "org.jline.reader.impl", + "org.jline.reader.impl.completer", + "org.jline.reader.impl.history", + "org.jline.terminal", + "org.jline.terminal.impl", + "org.jline.terminal.impl.jansi", + "org.jline.terminal.impl.jansi.freebsd", + "org.jline.terminal.impl.jansi.linux", + "org.jline.terminal.impl.jansi.osx", + "org.jline.terminal.impl.jansi.solaris", + "org.jline.terminal.impl.jansi.win", + "org.jline.terminal.impl.jna", + "org.jline.terminal.impl.jna.freebsd", + "org.jline.terminal.impl.jna.linux", + "org.jline.terminal.impl.jna.osx", + "org.jline.terminal.impl.jna.solaris", + "org.jline.terminal.impl.jna.win", + "org.jline.terminal.spi", + "org.jline.utils" + ], + "com.android.tools.external.org-jetbrains:uast": [ + "org.jetbrains.uast", + "org.jetbrains.uast.analysis", + "org.jetbrains.uast.evaluation", + "org.jetbrains.uast.expressions", + "org.jetbrains.uast.generate", + "org.jetbrains.uast.internal", + "org.jetbrains.uast.java", + "org.jetbrains.uast.java.declarations", + "org.jetbrains.uast.java.expressions", + "org.jetbrains.uast.java.internal", + "org.jetbrains.uast.java.kinds", + "org.jetbrains.uast.kotlin", + "org.jetbrains.uast.kotlin.evaluation", + "org.jetbrains.uast.kotlin.internal", + "org.jetbrains.uast.kotlin.kinds", + "org.jetbrains.uast.kotlin.psi", + "org.jetbrains.uast.psi", + "org.jetbrains.uast.util", + "org.jetbrains.uast.values", + "org.jetbrains.uast.visitor" + ], + "com.android.tools.layoutlib:layoutlib-api": [ + "com.android.ide.common.rendering.api", + "com.android.resources" + ], + "com.android.tools.lint:lint": [ + "com.android.tools.lint", + "com.android.tools.lint.gradle" + ], + "com.android.tools.lint:lint-api": [ + "com.android.tools.lint.client.api", + "com.android.tools.lint.detector.api", + "com.android.tools.lint.detector.api.interprocedural", + "com.android.tools.lint.helpers" + ], + "com.android.tools.lint:lint-checks": [ + "com.android.tools.lint.checks", + "com.android.tools.lint.checks.optional", + "com.android.tools.lint.checks.plurals" + ], + "com.android.tools.lint:lint-model": [ + "com.android.tools.lint.model" + ], + "com.android.tools:annotations": [ + "com.android.annotations", + "com.android.annotations.concurrency" + ], + "com.android.tools:common": [ + "com.android", + "com.android.ide.common.blame", + "com.android.io", + "com.android.prefs", + "com.android.resources", + "com.android.sdklib", + "com.android.support", + "com.android.testing.utils", + "com.android.tools.proguard", + "com.android.utils", + "com.android.utils.concurrency", + "com.android.utils.cxx", + "com.android.utils.cxx.collections", + "com.android.utils.cxx.io", + "com.android.utils.cxx.ninja", + "com.android.utils.cxx.os", + "com.android.utils.cxx.process", + "com.android.utils.reflection", + "com.android.utils.sleep", + "com.android.utils.time", + "com.android.xml", + "com.android.xml.sax" + ], + "com.android.tools:dvlib": [ + "com.android.dvlib" + ], + "com.android.tools:play-sdk-proto": [ + "com.android.tools.lint.checks" + ], + "com.android.tools:repository": [ + "com.android.repository", + "com.android.repository.api", + "com.android.repository.impl.downloader", + "com.android.repository.impl.generated.generic.v1", + "com.android.repository.impl.generated.generic.v2", + "com.android.repository.impl.generated.v1", + "com.android.repository.impl.generated.v2", + "com.android.repository.impl.installer", + "com.android.repository.impl.manager", + "com.android.repository.impl.meta", + "com.android.repository.impl.sources", + "com.android.repository.impl.sources.generated.v1", + "com.android.repository.io", + "com.android.repository.util" + ], + "com.android.tools:sdk-common": [ + "com.android.ide.common.blame", + "com.android.ide.common.blame.parser", + "com.android.ide.common.blame.parser.aapt", + "com.android.ide.common.blame.parser.util", + "com.android.ide.common.build", + "com.android.ide.common.caching", + "com.android.ide.common.fonts", + "com.android.ide.common.gradle", + "com.android.ide.common.internal", + "com.android.ide.common.process", + "com.android.ide.common.rendering", + "com.android.ide.common.repository", + "com.android.ide.common.resources", + "com.android.ide.common.resources.configuration", + "com.android.ide.common.resources.escape.string", + "com.android.ide.common.resources.escape.xml", + "com.android.ide.common.resources.sampledata", + "com.android.ide.common.resources.usage", + "com.android.ide.common.sdk", + "com.android.ide.common.signing", + "com.android.ide.common.symbols", + "com.android.ide.common.util", + "com.android.ide.common.vectordrawable", + "com.android.ide.common.workers", + "com.android.ide.common.xml", + "com.android.instantapp.provision", + "com.android.instantapp.run", + "com.android.instantapp.sdk", + "com.android.instantapp.utils", + "com.android.projectmodel", + "wireless.android.instantapps.sdk" + ], + "com.android.tools:sdklib": [ + "com.android.sdklib", + "com.android.sdklib.devices", + "com.android.sdklib.internal.avd", + "com.android.sdklib.internal.build", + "com.android.sdklib.internal.project", + "com.android.sdklib.repository", + "com.android.sdklib.repository.generated.addon.v1", + "com.android.sdklib.repository.generated.addon.v2", + "com.android.sdklib.repository.generated.addon.v3", + "com.android.sdklib.repository.generated.common.v1", + "com.android.sdklib.repository.generated.common.v2", + "com.android.sdklib.repository.generated.common.v3", + "com.android.sdklib.repository.generated.repository.v1", + "com.android.sdklib.repository.generated.repository.v2", + "com.android.sdklib.repository.generated.repository.v3", + "com.android.sdklib.repository.generated.sysimg.v1", + "com.android.sdklib.repository.generated.sysimg.v2", + "com.android.sdklib.repository.generated.sysimg.v3", + "com.android.sdklib.repository.installer", + "com.android.sdklib.repository.legacy", + "com.android.sdklib.repository.legacy.descriptors", + "com.android.sdklib.repository.legacy.io", + "com.android.sdklib.repository.legacy.local", + "com.android.sdklib.repository.legacy.remote", + "com.android.sdklib.repository.legacy.remote.internal", + "com.android.sdklib.repository.legacy.remote.internal.archives", + "com.android.sdklib.repository.legacy.remote.internal.packages", + "com.android.sdklib.repository.legacy.remote.internal.sources", + "com.android.sdklib.repository.meta", + "com.android.sdklib.repository.sources", + "com.android.sdklib.repository.sources.generated.v1", + "com.android.sdklib.repository.sources.generated.v2", + "com.android.sdklib.repository.sources.generated.v3", + "com.android.sdklib.repository.sources.generated.v4", + "com.android.sdklib.repository.sources.generated.v5", + "com.android.sdklib.repository.targets", + "com.android.sdklib.tool", + "com.android.sdklib.tool.sdkmanager", + "com.android.sdklib.util" + ], + "com.google.code.findbugs:jsr305": [ + "javax.annotation", + "javax.annotation.concurrent", + "javax.annotation.meta" + ], + "com.google.code.gson:gson": [ + "com.google.gson", + "com.google.gson.annotations", + "com.google.gson.internal", + "com.google.gson.internal.bind", + "com.google.gson.internal.bind.util", + "com.google.gson.internal.reflect", + "com.google.gson.internal.sql", + "com.google.gson.reflect", + "com.google.gson.stream" + ], + "com.google.errorprone:error_prone_annotations": [ + "com.google.errorprone.annotations", + "com.google.errorprone.annotations.concurrent" + ], + "com.google.guava:failureaccess": [ + "com.google.common.util.concurrent.internal" + ], + "com.google.guava:guava": [ + "com.google.common.annotations", + "com.google.common.base", + "com.google.common.base.internal", + "com.google.common.cache", + "com.google.common.collect", + "com.google.common.escape", + "com.google.common.eventbus", + "com.google.common.graph", + "com.google.common.hash", + "com.google.common.html", + "com.google.common.io", + "com.google.common.math", + "com.google.common.net", + "com.google.common.primitives", + "com.google.common.reflect", + "com.google.common.util.concurrent", + "com.google.common.xml", + "com.google.thirdparty.publicsuffix" + ], + "com.google.j2objc:j2objc-annotations": [ + "com.google.j2objc.annotations" + ], + "com.google.jimfs:jimfs": [ + "com.google.common.jimfs" + ], + "com.google.protobuf:protobuf-java": [ + "com.google.protobuf", + "com.google.protobuf.compiler" + ], + "com.squareup.moshi:moshi": [ + "com.squareup.moshi", + "com.squareup.moshi.internal" + ], + "com.squareup.moshi:moshi-kotlin": [ + "com.squareup.moshi", + "com.squareup.moshi.kotlin.reflect" + ], + "com.squareup.okio:okio": [ + "okio", + "okio.internal" + ], + "com.squareup.okio:okio-jvm": [ + "okio", + "okio.internal" + ], + "com.sun.activation:javax.activation": [ + "com.sun.activation.registries", + "com.sun.activation.viewers", + "javax.activation" + ], + "com.sun.istack:istack-commons-runtime": [ + "com.sun.istack", + "com.sun.istack.localization", + "com.sun.istack.logging" + ], + "com.sun.xml.fastinfoset:FastInfoset": [ + "com.sun.xml.fastinfoset", + "com.sun.xml.fastinfoset.algorithm", + "com.sun.xml.fastinfoset.alphabet", + "com.sun.xml.fastinfoset.dom", + "com.sun.xml.fastinfoset.org.apache.xerces.util", + "com.sun.xml.fastinfoset.sax", + "com.sun.xml.fastinfoset.stax", + "com.sun.xml.fastinfoset.stax.events", + "com.sun.xml.fastinfoset.stax.factory", + "com.sun.xml.fastinfoset.stax.util", + "com.sun.xml.fastinfoset.tools", + "com.sun.xml.fastinfoset.util", + "com.sun.xml.fastinfoset.vocab", + "org.jvnet.fastinfoset", + "org.jvnet.fastinfoset.sax", + "org.jvnet.fastinfoset.sax.helpers", + "org.jvnet.fastinfoset.stax" + ], + "com.xenomachina:kotlin-argparser": [ + "com.xenomachina.argparser" + ], + "com.xenomachina:xenocom": [ + "com.xenomachina.common", + "com.xenomachina.text", + "com.xenomachina.text.term" + ], + "commons-codec:commons-codec": [ + "org.apache.commons.codec", + "org.apache.commons.codec.binary", + "org.apache.commons.codec.digest", + "org.apache.commons.codec.language", + "org.apache.commons.codec.language.bm", + "org.apache.commons.codec.net" + ], + "commons-io:commons-io": [ + "org.apache.commons.io", + "org.apache.commons.io.build", + "org.apache.commons.io.charset", + "org.apache.commons.io.comparator", + "org.apache.commons.io.file", + "org.apache.commons.io.file.attribute", + "org.apache.commons.io.file.spi", + "org.apache.commons.io.filefilter", + "org.apache.commons.io.function", + "org.apache.commons.io.input", + "org.apache.commons.io.input.buffer", + "org.apache.commons.io.monitor", + "org.apache.commons.io.output", + "org.apache.commons.io.serialization" + ], + "commons-logging:commons-logging": [ + "org.apache.commons.logging", + "org.apache.commons.logging.impl" + ], + "io.reactivex.rxjava3:rxjava": [ + "io.reactivex.rxjava3.annotations", + "io.reactivex.rxjava3.core", + "io.reactivex.rxjava3.disposables", + "io.reactivex.rxjava3.exceptions", + "io.reactivex.rxjava3.flowables", + "io.reactivex.rxjava3.functions", + "io.reactivex.rxjava3.internal.disposables", + "io.reactivex.rxjava3.internal.functions", + "io.reactivex.rxjava3.internal.fuseable", + "io.reactivex.rxjava3.internal.jdk8", + "io.reactivex.rxjava3.internal.observers", + "io.reactivex.rxjava3.internal.operators.completable", + "io.reactivex.rxjava3.internal.operators.flowable", + "io.reactivex.rxjava3.internal.operators.maybe", + "io.reactivex.rxjava3.internal.operators.mixed", + "io.reactivex.rxjava3.internal.operators.observable", + "io.reactivex.rxjava3.internal.operators.parallel", + "io.reactivex.rxjava3.internal.operators.single", + "io.reactivex.rxjava3.internal.queue", + "io.reactivex.rxjava3.internal.schedulers", + "io.reactivex.rxjava3.internal.subscribers", + "io.reactivex.rxjava3.internal.subscriptions", + "io.reactivex.rxjava3.internal.util", + "io.reactivex.rxjava3.observables", + "io.reactivex.rxjava3.observers", + "io.reactivex.rxjava3.parallel", + "io.reactivex.rxjava3.plugins", + "io.reactivex.rxjava3.processors", + "io.reactivex.rxjava3.schedulers", + "io.reactivex.rxjava3.subjects", + "io.reactivex.rxjava3.subscribers" + ], + "jakarta.activation:jakarta.activation-api": [ + "javax.activation" + ], + "jakarta.xml.bind:jakarta.xml.bind-api": [ + "javax.xml.bind", + "javax.xml.bind.annotation", + "javax.xml.bind.annotation.adapters", + "javax.xml.bind.attachment", + "javax.xml.bind.helpers", + "javax.xml.bind.util" + ], + "javax.inject:javax.inject": [ + "javax.inject" + ], + "net.java.dev.jna:jna": [ + "com.sun.jna", + "com.sun.jna.internal", + "com.sun.jna.ptr", + "com.sun.jna.win32" + ], + "net.java.dev.jna:jna-platform": [ + "com.sun.jna.platform", + "com.sun.jna.platform.dnd", + "com.sun.jna.platform.linux", + "com.sun.jna.platform.mac", + "com.sun.jna.platform.unix", + "com.sun.jna.platform.unix.solaris", + "com.sun.jna.platform.win32", + "com.sun.jna.platform.win32.COM", + "com.sun.jna.platform.win32.COM.tlb", + "com.sun.jna.platform.win32.COM.tlb.imp", + "com.sun.jna.platform.win32.COM.util", + "com.sun.jna.platform.win32.COM.util.annotation", + "com.sun.jna.platform.wince" + ], + "net.sf.kxml:kxml2": [ + "org.kxml2.io", + "org.kxml2.kdom", + "org.kxml2.wap", + "org.kxml2.wap.syncml", + "org.kxml2.wap.wml", + "org.kxml2.wap.wv", + "org.xmlpull.v1" + ], + "org.apache.commons:commons-compress": [ + "org.apache.commons.compress", + "org.apache.commons.compress.archivers", + "org.apache.commons.compress.archivers.ar", + "org.apache.commons.compress.archivers.arj", + "org.apache.commons.compress.archivers.cpio", + "org.apache.commons.compress.archivers.dump", + "org.apache.commons.compress.archivers.examples", + "org.apache.commons.compress.archivers.jar", + "org.apache.commons.compress.archivers.sevenz", + "org.apache.commons.compress.archivers.tar", + "org.apache.commons.compress.archivers.zip", + "org.apache.commons.compress.changes", + "org.apache.commons.compress.compressors", + "org.apache.commons.compress.compressors.brotli", + "org.apache.commons.compress.compressors.bzip2", + "org.apache.commons.compress.compressors.deflate", + "org.apache.commons.compress.compressors.deflate64", + "org.apache.commons.compress.compressors.gzip", + "org.apache.commons.compress.compressors.lz4", + "org.apache.commons.compress.compressors.lz77support", + "org.apache.commons.compress.compressors.lzma", + "org.apache.commons.compress.compressors.lzw", + "org.apache.commons.compress.compressors.pack200", + "org.apache.commons.compress.compressors.snappy", + "org.apache.commons.compress.compressors.xz", + "org.apache.commons.compress.compressors.z", + "org.apache.commons.compress.compressors.zstandard", + "org.apache.commons.compress.harmony.archive.internal.nls", + "org.apache.commons.compress.harmony.pack200", + "org.apache.commons.compress.harmony.unpack200", + "org.apache.commons.compress.harmony.unpack200.bytecode", + "org.apache.commons.compress.harmony.unpack200.bytecode.forms", + "org.apache.commons.compress.java.util.jar", + "org.apache.commons.compress.parallel", + "org.apache.commons.compress.utils" + ], + "org.apache.httpcomponents:httpclient": [ + "org.apache.http.auth", + "org.apache.http.auth.params", + "org.apache.http.client", + "org.apache.http.client.config", + "org.apache.http.client.entity", + "org.apache.http.client.methods", + "org.apache.http.client.params", + "org.apache.http.client.protocol", + "org.apache.http.client.utils", + "org.apache.http.conn", + "org.apache.http.conn.params", + "org.apache.http.conn.routing", + "org.apache.http.conn.scheme", + "org.apache.http.conn.socket", + "org.apache.http.conn.ssl", + "org.apache.http.conn.util", + "org.apache.http.cookie", + "org.apache.http.cookie.params", + "org.apache.http.impl.auth", + "org.apache.http.impl.client", + "org.apache.http.impl.conn", + "org.apache.http.impl.conn.tsccm", + "org.apache.http.impl.cookie", + "org.apache.http.impl.execchain" + ], + "org.apache.httpcomponents:httpcore": [ + "org.apache.http", + "org.apache.http.annotation", + "org.apache.http.concurrent", + "org.apache.http.config", + "org.apache.http.entity", + "org.apache.http.impl", + "org.apache.http.impl.bootstrap", + "org.apache.http.impl.entity", + "org.apache.http.impl.io", + "org.apache.http.impl.pool", + "org.apache.http.io", + "org.apache.http.message", + "org.apache.http.params", + "org.apache.http.pool", + "org.apache.http.protocol", + "org.apache.http.ssl", + "org.apache.http.util" + ], + "org.apache.httpcomponents:httpmime": [ + "org.apache.http.entity.mime", + "org.apache.http.entity.mime.content" + ], + "org.bouncycastle:bcpkix-jdk15on": [ + "org.bouncycastle.cert", + "org.bouncycastle.cert.bc", + "org.bouncycastle.cert.cmp", + "org.bouncycastle.cert.crmf", + "org.bouncycastle.cert.crmf.bc", + "org.bouncycastle.cert.crmf.jcajce", + "org.bouncycastle.cert.dane", + "org.bouncycastle.cert.dane.fetcher", + "org.bouncycastle.cert.jcajce", + "org.bouncycastle.cert.ocsp", + "org.bouncycastle.cert.ocsp.jcajce", + "org.bouncycastle.cert.path", + "org.bouncycastle.cert.path.validations", + "org.bouncycastle.cert.selector", + "org.bouncycastle.cert.selector.jcajce", + "org.bouncycastle.cmc", + "org.bouncycastle.cms", + "org.bouncycastle.cms.bc", + "org.bouncycastle.cms.jcajce", + "org.bouncycastle.dvcs", + "org.bouncycastle.eac", + "org.bouncycastle.eac.jcajce", + "org.bouncycastle.eac.operator", + "org.bouncycastle.eac.operator.jcajce", + "org.bouncycastle.est", + "org.bouncycastle.est.jcajce", + "org.bouncycastle.mime", + "org.bouncycastle.mime.encoding", + "org.bouncycastle.mime.smime", + "org.bouncycastle.mozilla", + "org.bouncycastle.mozilla.jcajce", + "org.bouncycastle.openssl", + "org.bouncycastle.openssl.bc", + "org.bouncycastle.openssl.jcajce", + "org.bouncycastle.operator", + "org.bouncycastle.operator.bc", + "org.bouncycastle.operator.jcajce", + "org.bouncycastle.pkcs", + "org.bouncycastle.pkcs.bc", + "org.bouncycastle.pkcs.jcajce", + "org.bouncycastle.pkix", + "org.bouncycastle.pkix.jcajce", + "org.bouncycastle.tsp", + "org.bouncycastle.tsp.cms", + "org.bouncycastle.voms" + ], + "org.bouncycastle:bcprov-jdk15on": [ + "org.bouncycastle", + "org.bouncycastle.asn1", + "org.bouncycastle.asn1.anssi", + "org.bouncycastle.asn1.bc", + "org.bouncycastle.asn1.bsi", + "org.bouncycastle.asn1.cmc", + "org.bouncycastle.asn1.cmp", + "org.bouncycastle.asn1.cms", + "org.bouncycastle.asn1.cms.ecc", + "org.bouncycastle.asn1.crmf", + "org.bouncycastle.asn1.cryptlib", + "org.bouncycastle.asn1.cryptopro", + "org.bouncycastle.asn1.dvcs", + "org.bouncycastle.asn1.eac", + "org.bouncycastle.asn1.edec", + "org.bouncycastle.asn1.esf", + "org.bouncycastle.asn1.ess", + "org.bouncycastle.asn1.est", + "org.bouncycastle.asn1.gm", + "org.bouncycastle.asn1.gnu", + "org.bouncycastle.asn1.iana", + "org.bouncycastle.asn1.icao", + "org.bouncycastle.asn1.isara", + "org.bouncycastle.asn1.isismtt", + "org.bouncycastle.asn1.isismtt.ocsp", + "org.bouncycastle.asn1.isismtt.x509", + "org.bouncycastle.asn1.iso", + "org.bouncycastle.asn1.kisa", + "org.bouncycastle.asn1.microsoft", + "org.bouncycastle.asn1.misc", + "org.bouncycastle.asn1.mozilla", + "org.bouncycastle.asn1.nist", + "org.bouncycastle.asn1.nsri", + "org.bouncycastle.asn1.ntt", + "org.bouncycastle.asn1.ocsp", + "org.bouncycastle.asn1.oiw", + "org.bouncycastle.asn1.pkcs", + "org.bouncycastle.asn1.rosstandart", + "org.bouncycastle.asn1.sec", + "org.bouncycastle.asn1.smime", + "org.bouncycastle.asn1.teletrust", + "org.bouncycastle.asn1.tsp", + "org.bouncycastle.asn1.ua", + "org.bouncycastle.asn1.util", + "org.bouncycastle.asn1.x500", + "org.bouncycastle.asn1.x500.style", + "org.bouncycastle.asn1.x509", + "org.bouncycastle.asn1.x509.qualified", + "org.bouncycastle.asn1.x509.sigi", + "org.bouncycastle.asn1.x9", + "org.bouncycastle.crypto", + "org.bouncycastle.crypto.agreement", + "org.bouncycastle.crypto.agreement.jpake", + "org.bouncycastle.crypto.agreement.kdf", + "org.bouncycastle.crypto.agreement.srp", + "org.bouncycastle.crypto.commitments", + "org.bouncycastle.crypto.digests", + "org.bouncycastle.crypto.ec", + "org.bouncycastle.crypto.encodings", + "org.bouncycastle.crypto.engines", + "org.bouncycastle.crypto.examples", + "org.bouncycastle.crypto.generators", + "org.bouncycastle.crypto.io", + "org.bouncycastle.crypto.kems", + "org.bouncycastle.crypto.macs", + "org.bouncycastle.crypto.modes", + "org.bouncycastle.crypto.modes.gcm", + "org.bouncycastle.crypto.modes.kgcm", + "org.bouncycastle.crypto.paddings", + "org.bouncycastle.crypto.params", + "org.bouncycastle.crypto.parsers", + "org.bouncycastle.crypto.prng", + "org.bouncycastle.crypto.prng.drbg", + "org.bouncycastle.crypto.signers", + "org.bouncycastle.crypto.util", + "org.bouncycastle.i18n", + "org.bouncycastle.i18n.filter", + "org.bouncycastle.iana", + "org.bouncycastle.its.asn1", + "org.bouncycastle.jcajce", + "org.bouncycastle.jcajce.interfaces", + "org.bouncycastle.jcajce.io", + "org.bouncycastle.jcajce.provider.asymmetric", + "org.bouncycastle.jcajce.provider.asymmetric.dh", + "org.bouncycastle.jcajce.provider.asymmetric.dsa", + "org.bouncycastle.jcajce.provider.asymmetric.dstu", + "org.bouncycastle.jcajce.provider.asymmetric.ec", + "org.bouncycastle.jcajce.provider.asymmetric.ecgost", + "org.bouncycastle.jcajce.provider.asymmetric.ecgost12", + "org.bouncycastle.jcajce.provider.asymmetric.edec", + "org.bouncycastle.jcajce.provider.asymmetric.elgamal", + "org.bouncycastle.jcajce.provider.asymmetric.gost", + "org.bouncycastle.jcajce.provider.asymmetric.ies", + "org.bouncycastle.jcajce.provider.asymmetric.rsa", + "org.bouncycastle.jcajce.provider.asymmetric.util", + "org.bouncycastle.jcajce.provider.asymmetric.x509", + "org.bouncycastle.jcajce.provider.config", + "org.bouncycastle.jcajce.provider.digest", + "org.bouncycastle.jcajce.provider.drbg", + "org.bouncycastle.jcajce.provider.keystore", + "org.bouncycastle.jcajce.provider.keystore.bc", + "org.bouncycastle.jcajce.provider.keystore.bcfks", + "org.bouncycastle.jcajce.provider.keystore.pkcs12", + "org.bouncycastle.jcajce.provider.symmetric", + "org.bouncycastle.jcajce.provider.symmetric.util", + "org.bouncycastle.jcajce.provider.util", + "org.bouncycastle.jcajce.spec", + "org.bouncycastle.jcajce.util", + "org.bouncycastle.jce", + "org.bouncycastle.jce.exception", + "org.bouncycastle.jce.interfaces", + "org.bouncycastle.jce.netscape", + "org.bouncycastle.jce.provider", + "org.bouncycastle.jce.spec", + "org.bouncycastle.math", + "org.bouncycastle.math.ec", + "org.bouncycastle.math.ec.custom.djb", + "org.bouncycastle.math.ec.custom.gm", + "org.bouncycastle.math.ec.custom.sec", + "org.bouncycastle.math.ec.endo", + "org.bouncycastle.math.ec.rfc7748", + "org.bouncycastle.math.ec.rfc8032", + "org.bouncycastle.math.ec.tools", + "org.bouncycastle.math.field", + "org.bouncycastle.math.raw", + "org.bouncycastle.pqc.asn1", + "org.bouncycastle.pqc.crypto", + "org.bouncycastle.pqc.crypto.gmss", + "org.bouncycastle.pqc.crypto.gmss.util", + "org.bouncycastle.pqc.crypto.lms", + "org.bouncycastle.pqc.crypto.mceliece", + "org.bouncycastle.pqc.crypto.newhope", + "org.bouncycastle.pqc.crypto.qtesla", + "org.bouncycastle.pqc.crypto.rainbow", + "org.bouncycastle.pqc.crypto.rainbow.util", + "org.bouncycastle.pqc.crypto.sphincs", + "org.bouncycastle.pqc.crypto.util", + "org.bouncycastle.pqc.crypto.xmss", + "org.bouncycastle.pqc.jcajce.interfaces", + "org.bouncycastle.pqc.jcajce.provider", + "org.bouncycastle.pqc.jcajce.provider.gmss", + "org.bouncycastle.pqc.jcajce.provider.lms", + "org.bouncycastle.pqc.jcajce.provider.mceliece", + "org.bouncycastle.pqc.jcajce.provider.newhope", + "org.bouncycastle.pqc.jcajce.provider.qtesla", + "org.bouncycastle.pqc.jcajce.provider.rainbow", + "org.bouncycastle.pqc.jcajce.provider.sphincs", + "org.bouncycastle.pqc.jcajce.provider.util", + "org.bouncycastle.pqc.jcajce.provider.xmss", + "org.bouncycastle.pqc.jcajce.spec", + "org.bouncycastle.pqc.math.linearalgebra", + "org.bouncycastle.util", + "org.bouncycastle.util.encoders", + "org.bouncycastle.util.io", + "org.bouncycastle.util.io.pem", + "org.bouncycastle.util.test", + "org.bouncycastle.x509", + "org.bouncycastle.x509.extension", + "org.bouncycastle.x509.util" + ], + "org.checkerframework:checker-qual": [ + "org.checkerframework.checker.builder.qual", + "org.checkerframework.checker.calledmethods.qual", + "org.checkerframework.checker.compilermsgs.qual", + "org.checkerframework.checker.fenum.qual", + "org.checkerframework.checker.formatter.qual", + "org.checkerframework.checker.guieffect.qual", + "org.checkerframework.checker.i18n.qual", + "org.checkerframework.checker.i18nformatter.qual", + "org.checkerframework.checker.index.qual", + "org.checkerframework.checker.initialization.qual", + "org.checkerframework.checker.interning.qual", + "org.checkerframework.checker.lock.qual", + "org.checkerframework.checker.nullness.qual", + "org.checkerframework.checker.optional.qual", + "org.checkerframework.checker.propkey.qual", + "org.checkerframework.checker.regex.qual", + "org.checkerframework.checker.signature.qual", + "org.checkerframework.checker.signedness.qual", + "org.checkerframework.checker.tainting.qual", + "org.checkerframework.checker.units.qual", + "org.checkerframework.common.aliasing.qual", + "org.checkerframework.common.initializedfields.qual", + "org.checkerframework.common.reflection.qual", + "org.checkerframework.common.returnsreceiver.qual", + "org.checkerframework.common.subtyping.qual", + "org.checkerframework.common.util.report.qual", + "org.checkerframework.common.value.qual", + "org.checkerframework.dataflow.qual", + "org.checkerframework.framework.qual" + ], + "org.glassfish.jaxb:jaxb-runtime": [ + "com.sun.xml.bind", + "com.sun.xml.bind.annotation", + "com.sun.xml.bind.api", + "com.sun.xml.bind.api.impl", + "com.sun.xml.bind.marshaller", + "com.sun.xml.bind.unmarshaller", + "com.sun.xml.bind.util", + "com.sun.xml.bind.v2", + "com.sun.xml.bind.v2.bytecode", + "com.sun.xml.bind.v2.model.annotation", + "com.sun.xml.bind.v2.model.core", + "com.sun.xml.bind.v2.model.impl", + "com.sun.xml.bind.v2.model.nav", + "com.sun.xml.bind.v2.model.runtime", + "com.sun.xml.bind.v2.model.util", + "com.sun.xml.bind.v2.runtime", + "com.sun.xml.bind.v2.runtime.output", + "com.sun.xml.bind.v2.runtime.property", + "com.sun.xml.bind.v2.runtime.reflect", + "com.sun.xml.bind.v2.runtime.reflect.opt", + "com.sun.xml.bind.v2.runtime.unmarshaller", + "com.sun.xml.bind.v2.schemagen", + "com.sun.xml.bind.v2.schemagen.episode", + "com.sun.xml.bind.v2.schemagen.xmlschema", + "com.sun.xml.bind.v2.util" + ], + "org.glassfish.jaxb:txw2": [ + "com.sun.xml.txw2", + "com.sun.xml.txw2.annotation", + "com.sun.xml.txw2.output" + ], + "org.jetbrains.intellij.deps:trove4j": [ + "gnu.trove", + "gnu.trove.decorator" + ], + "org.jetbrains.kotlin:kotlin-reflect": [ + "kotlin.reflect.full", + "kotlin.reflect.jvm", + "kotlin.reflect.jvm.internal", + "kotlin.reflect.jvm.internal.calls", + "kotlin.reflect.jvm.internal.impl", + "kotlin.reflect.jvm.internal.impl.builtins", + "kotlin.reflect.jvm.internal.impl.builtins.functions", + "kotlin.reflect.jvm.internal.impl.builtins.jvm", + "kotlin.reflect.jvm.internal.impl.descriptors", + "kotlin.reflect.jvm.internal.impl.descriptors.annotations", + "kotlin.reflect.jvm.internal.impl.descriptors.deserialization", + "kotlin.reflect.jvm.internal.impl.descriptors.impl", + "kotlin.reflect.jvm.internal.impl.descriptors.java", + "kotlin.reflect.jvm.internal.impl.descriptors.runtime.components", + "kotlin.reflect.jvm.internal.impl.descriptors.runtime.structure", + "kotlin.reflect.jvm.internal.impl.incremental", + "kotlin.reflect.jvm.internal.impl.incremental.components", + "kotlin.reflect.jvm.internal.impl.load.java", + "kotlin.reflect.jvm.internal.impl.load.java.components", + "kotlin.reflect.jvm.internal.impl.load.java.descriptors", + "kotlin.reflect.jvm.internal.impl.load.java.lazy", + "kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors", + "kotlin.reflect.jvm.internal.impl.load.java.lazy.types", + "kotlin.reflect.jvm.internal.impl.load.java.sources", + "kotlin.reflect.jvm.internal.impl.load.java.structure", + "kotlin.reflect.jvm.internal.impl.load.java.typeEnhancement", + "kotlin.reflect.jvm.internal.impl.load.kotlin", + "kotlin.reflect.jvm.internal.impl.load.kotlin.header", + "kotlin.reflect.jvm.internal.impl.metadata", + "kotlin.reflect.jvm.internal.impl.metadata.builtins", + "kotlin.reflect.jvm.internal.impl.metadata.deserialization", + "kotlin.reflect.jvm.internal.impl.metadata.jvm", + "kotlin.reflect.jvm.internal.impl.metadata.jvm.deserialization", + "kotlin.reflect.jvm.internal.impl.name", + "kotlin.reflect.jvm.internal.impl.platform", + "kotlin.reflect.jvm.internal.impl.protobuf", + "kotlin.reflect.jvm.internal.impl.renderer", + "kotlin.reflect.jvm.internal.impl.resolve", + "kotlin.reflect.jvm.internal.impl.resolve.calls.inference", + "kotlin.reflect.jvm.internal.impl.resolve.constants", + "kotlin.reflect.jvm.internal.impl.resolve.deprecation", + "kotlin.reflect.jvm.internal.impl.resolve.descriptorUtil", + "kotlin.reflect.jvm.internal.impl.resolve.jvm", + "kotlin.reflect.jvm.internal.impl.resolve.sam", + "kotlin.reflect.jvm.internal.impl.resolve.scopes", + "kotlin.reflect.jvm.internal.impl.resolve.scopes.receivers", + "kotlin.reflect.jvm.internal.impl.serialization", + "kotlin.reflect.jvm.internal.impl.serialization.deserialization", + "kotlin.reflect.jvm.internal.impl.serialization.deserialization.builtins", + "kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors", + "kotlin.reflect.jvm.internal.impl.storage", + "kotlin.reflect.jvm.internal.impl.types", + "kotlin.reflect.jvm.internal.impl.types.checker", + "kotlin.reflect.jvm.internal.impl.types.error", + "kotlin.reflect.jvm.internal.impl.types.extensions", + "kotlin.reflect.jvm.internal.impl.types.model", + "kotlin.reflect.jvm.internal.impl.types.typeUtil", + "kotlin.reflect.jvm.internal.impl.types.typesApproximation", + "kotlin.reflect.jvm.internal.impl.util", + "kotlin.reflect.jvm.internal.impl.util.capitalizeDecapitalize", + "kotlin.reflect.jvm.internal.impl.util.collectionUtils", + "kotlin.reflect.jvm.internal.impl.utils", + "kotlin.reflect.jvm.internal.impl.utils.addToStdlib" + ], + "org.jetbrains.kotlin:kotlin-stdlib": [ + "kotlin", + "kotlin.annotation", + "kotlin.collections", + "kotlin.collections.builders", + "kotlin.collections.jdk8", + "kotlin.collections.unsigned", + "kotlin.comparisons", + "kotlin.concurrent", + "kotlin.contracts", + "kotlin.coroutines", + "kotlin.coroutines.cancellation", + "kotlin.coroutines.intrinsics", + "kotlin.coroutines.jvm.internal", + "kotlin.enums", + "kotlin.experimental", + "kotlin.internal", + "kotlin.internal.jdk7", + "kotlin.internal.jdk8", + "kotlin.io", + "kotlin.io.encoding", + "kotlin.io.path", + "kotlin.jdk7", + "kotlin.js", + "kotlin.jvm", + "kotlin.jvm.functions", + "kotlin.jvm.internal", + "kotlin.jvm.internal.markers", + "kotlin.jvm.internal.unsafe", + "kotlin.jvm.jdk8", + "kotlin.jvm.optionals", + "kotlin.math", + "kotlin.properties", + "kotlin.random", + "kotlin.random.jdk8", + "kotlin.ranges", + "kotlin.reflect", + "kotlin.sequences", + "kotlin.streams.jdk8", + "kotlin.system", + "kotlin.text", + "kotlin.text.jdk8", + "kotlin.time", + "kotlin.time.jdk8" + ], + "org.jetbrains:annotations": [ + "org.intellij.lang.annotations", + "org.jetbrains.annotations" + ], + "org.jvnet.staxex:stax-ex": [ + "org.jvnet.staxex", + "org.jvnet.staxex.util" + ], + "org.ow2.asm:asm": [ + "org.objectweb.asm", + "org.objectweb.asm.signature" + ], + "org.ow2.asm:asm-analysis": [ + "org.objectweb.asm.tree.analysis" + ], + "org.ow2.asm:asm-tree": [ + "org.objectweb.asm.tree" + ], + "org.reactivestreams:reactive-streams": [ + "org.reactivestreams" + ], + "xerces:xercesImpl": [ + "org.apache.html.dom", + "org.apache.wml", + "org.apache.wml.dom", + "org.apache.xerces.dom", + "org.apache.xerces.dom.events", + "org.apache.xerces.dom3.as", + "org.apache.xerces.impl", + "org.apache.xerces.impl.dtd", + "org.apache.xerces.impl.dtd.models", + "org.apache.xerces.impl.dv", + "org.apache.xerces.impl.dv.dtd", + "org.apache.xerces.impl.dv.util", + "org.apache.xerces.impl.dv.xs", + "org.apache.xerces.impl.io", + "org.apache.xerces.impl.msg", + "org.apache.xerces.impl.validation", + "org.apache.xerces.impl.xpath", + "org.apache.xerces.impl.xpath.regex", + "org.apache.xerces.impl.xs", + "org.apache.xerces.impl.xs.identity", + "org.apache.xerces.impl.xs.models", + "org.apache.xerces.impl.xs.opti", + "org.apache.xerces.impl.xs.traversers", + "org.apache.xerces.impl.xs.util", + "org.apache.xerces.jaxp", + "org.apache.xerces.jaxp.datatype", + "org.apache.xerces.jaxp.validation", + "org.apache.xerces.parsers", + "org.apache.xerces.stax", + "org.apache.xerces.stax.events", + "org.apache.xerces.util", + "org.apache.xerces.xinclude", + "org.apache.xerces.xni", + "org.apache.xerces.xni.grammars", + "org.apache.xerces.xni.parser", + "org.apache.xerces.xpointer", + "org.apache.xerces.xs", + "org.apache.xerces.xs.datatypes", + "org.apache.xml.serialize", + "org.w3c.dom.html" + ], + "xml-apis:xml-apis": [ + "javax.xml", + "javax.xml.datatype", + "javax.xml.namespace", + "javax.xml.parsers", + "javax.xml.stream", + "javax.xml.stream.events", + "javax.xml.stream.util", + "javax.xml.transform", + "javax.xml.transform.dom", + "javax.xml.transform.sax", + "javax.xml.transform.stax", + "javax.xml.transform.stream", + "javax.xml.validation", + "javax.xml.xpath", + "org.apache.xmlcommons", + "org.w3c.dom", + "org.w3c.dom.bootstrap", + "org.w3c.dom.css", + "org.w3c.dom.events", + "org.w3c.dom.html", + "org.w3c.dom.ls", + "org.w3c.dom.ranges", + "org.w3c.dom.stylesheets", + "org.w3c.dom.traversal", + "org.w3c.dom.views", + "org.w3c.dom.xpath", + "org.xml.sax", + "org.xml.sax.ext", + "org.xml.sax.helpers" + ] + }, + "repositories": { + "https://maven.google.com/": [ + "com.android.tools.analytics-library:protos", + "com.android.tools.analytics-library:protos:jar:sources", + "com.android.tools.analytics-library:shared", + "com.android.tools.analytics-library:shared:jar:sources", + "com.android.tools.analytics-library:tracker", + "com.android.tools.analytics-library:tracker:jar:sources", + "com.android.tools.build:aapt2-proto", + "com.android.tools.build:aapt2-proto:jar:sources", + "com.android.tools.build:builder-model", + "com.android.tools.build:builder-model:jar:sources", + "com.android.tools.build:manifest-merger", + "com.android.tools.build:manifest-merger:jar:sources", + "com.android.tools.ddms:ddmlib", + "com.android.tools.ddms:ddmlib:jar:sources", + "com.android.tools.external.com-intellij:intellij-core", + "com.android.tools.external.com-intellij:intellij-core:jar:sources", + "com.android.tools.external.com-intellij:kotlin-compiler", + "com.android.tools.external.com-intellij:kotlin-compiler:jar:sources", + "com.android.tools.external.org-jetbrains:uast", + "com.android.tools.external.org-jetbrains:uast:jar:sources", + "com.android.tools.layoutlib:layoutlib-api", + "com.android.tools.layoutlib:layoutlib-api:jar:sources", + "com.android.tools.lint:lint", + "com.android.tools.lint:lint-api", + "com.android.tools.lint:lint-api:jar:sources", + "com.android.tools.lint:lint-checks", + "com.android.tools.lint:lint-checks:jar:sources", + "com.android.tools.lint:lint-model", + "com.android.tools.lint:lint-model:jar:sources", + "com.android.tools.lint:lint:jar:sources", + "com.android.tools:annotations", + "com.android.tools:annotations:jar:sources", + "com.android.tools:common", + "com.android.tools:common:jar:sources", + "com.android.tools:dvlib", + "com.android.tools:dvlib:jar:sources", + "com.android.tools:play-sdk-proto", + "com.android.tools:play-sdk-proto:jar:sources", + "com.android.tools:repository", + "com.android.tools:repository:jar:sources", + "com.android.tools:sdk-common", + "com.android.tools:sdk-common:jar:sources", + "com.android.tools:sdklib", + "com.android.tools:sdklib:jar:sources", + "com.google.code.findbugs:jsr305", + "com.google.code.findbugs:jsr305:jar:sources", + "com.google.code.gson:gson", + "com.google.code.gson:gson:jar:sources", + "com.google.errorprone:error_prone_annotations", + "com.google.errorprone:error_prone_annotations:jar:sources", + "com.google.guava:failureaccess", + "com.google.guava:failureaccess:jar:sources", + "com.google.guava:guava", + "com.google.guava:guava:jar:sources", + "com.google.guava:listenablefuture", + "com.google.j2objc:j2objc-annotations", + "com.google.j2objc:j2objc-annotations:jar:sources", + "com.google.jimfs:jimfs", + "com.google.jimfs:jimfs:jar:sources", + "com.google.protobuf:protobuf-java", + "com.google.protobuf:protobuf-java:jar:sources", + "com.squareup.moshi:moshi", + "com.squareup.moshi:moshi-kotlin", + "com.squareup.moshi:moshi-kotlin:jar:sources", + "com.squareup.moshi:moshi:jar:sources", + "com.squareup.okio:okio", + "com.squareup.okio:okio-jvm", + "com.squareup.okio:okio-jvm:jar:sources", + "com.squareup.okio:okio:jar:sources", + "com.sun.activation:javax.activation", + "com.sun.activation:javax.activation:jar:sources", + "com.sun.istack:istack-commons-runtime", + "com.sun.istack:istack-commons-runtime:jar:sources", + "com.sun.xml.fastinfoset:FastInfoset", + "com.sun.xml.fastinfoset:FastInfoset:jar:sources", + "com.xenomachina:kotlin-argparser", + "com.xenomachina:kotlin-argparser:jar:sources", + "com.xenomachina:xenocom", + "com.xenomachina:xenocom:jar:sources", + "commons-codec:commons-codec", + "commons-codec:commons-codec:jar:sources", + "commons-io:commons-io", + "commons-io:commons-io:jar:sources", + "commons-logging:commons-logging", + "commons-logging:commons-logging:jar:sources", + "io.reactivex.rxjava3:rxjava", + "io.reactivex.rxjava3:rxjava:jar:sources", + "jakarta.activation:jakarta.activation-api", + "jakarta.activation:jakarta.activation-api:jar:sources", + "jakarta.xml.bind:jakarta.xml.bind-api", + "jakarta.xml.bind:jakarta.xml.bind-api:jar:sources", + "javax.inject:javax.inject", + "javax.inject:javax.inject:jar:sources", + "net.java.dev.jna:jna", + "net.java.dev.jna:jna-platform", + "net.java.dev.jna:jna-platform:jar:sources", + "net.java.dev.jna:jna:jar:sources", + "net.sf.kxml:kxml2", + "net.sf.kxml:kxml2:jar:sources", + "org.apache.commons:commons-compress", + "org.apache.commons:commons-compress:jar:sources", + "org.apache.httpcomponents:httpclient", + "org.apache.httpcomponents:httpclient:jar:sources", + "org.apache.httpcomponents:httpcore", + "org.apache.httpcomponents:httpcore:jar:sources", + "org.apache.httpcomponents:httpmime", + "org.apache.httpcomponents:httpmime:jar:sources", + "org.bouncycastle:bcpkix-jdk15on", + "org.bouncycastle:bcpkix-jdk15on:jar:sources", + "org.bouncycastle:bcprov-jdk15on", + "org.bouncycastle:bcprov-jdk15on:jar:sources", + "org.checkerframework:checker-qual", + "org.checkerframework:checker-qual:jar:sources", + "org.glassfish.jaxb:jaxb-runtime", + "org.glassfish.jaxb:jaxb-runtime:jar:sources", + "org.glassfish.jaxb:txw2", + "org.glassfish.jaxb:txw2:jar:sources", + "org.jetbrains.intellij.deps:trove4j", + "org.jetbrains.intellij.deps:trove4j:jar:sources", + "org.jetbrains.kotlin:kotlin-reflect", + "org.jetbrains.kotlin:kotlin-reflect:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlin:kotlin-stdlib-common", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources", + "org.jetbrains:annotations", + "org.jetbrains:annotations:jar:sources", + "org.jvnet.staxex:stax-ex", + "org.jvnet.staxex:stax-ex:jar:sources", + "org.ow2.asm:asm", + "org.ow2.asm:asm-analysis", + "org.ow2.asm:asm-analysis:jar:sources", + "org.ow2.asm:asm-tree", + "org.ow2.asm:asm-tree:jar:sources", + "org.ow2.asm:asm:jar:sources", + "org.reactivestreams:reactive-streams", + "org.reactivestreams:reactive-streams:jar:sources", + "xerces:xercesImpl", + "xerces:xercesImpl:jar:sources", + "xml-apis:xml-apis", + "xml-apis:xml-apis:jar:sources" + ], + "https://repo1.maven.org/maven2/": [ + "com.android.tools.analytics-library:protos", + "com.android.tools.analytics-library:protos:jar:sources", + "com.android.tools.analytics-library:shared", + "com.android.tools.analytics-library:shared:jar:sources", + "com.android.tools.analytics-library:tracker", + "com.android.tools.analytics-library:tracker:jar:sources", + "com.android.tools.build:aapt2-proto", + "com.android.tools.build:aapt2-proto:jar:sources", + "com.android.tools.build:builder-model", + "com.android.tools.build:builder-model:jar:sources", + "com.android.tools.build:manifest-merger", + "com.android.tools.build:manifest-merger:jar:sources", + "com.android.tools.ddms:ddmlib", + "com.android.tools.ddms:ddmlib:jar:sources", + "com.android.tools.external.com-intellij:intellij-core", + "com.android.tools.external.com-intellij:intellij-core:jar:sources", + "com.android.tools.external.com-intellij:kotlin-compiler", + "com.android.tools.external.com-intellij:kotlin-compiler:jar:sources", + "com.android.tools.external.org-jetbrains:uast", + "com.android.tools.external.org-jetbrains:uast:jar:sources", + "com.android.tools.layoutlib:layoutlib-api", + "com.android.tools.layoutlib:layoutlib-api:jar:sources", + "com.android.tools.lint:lint", + "com.android.tools.lint:lint-api", + "com.android.tools.lint:lint-api:jar:sources", + "com.android.tools.lint:lint-checks", + "com.android.tools.lint:lint-checks:jar:sources", + "com.android.tools.lint:lint-model", + "com.android.tools.lint:lint-model:jar:sources", + "com.android.tools.lint:lint:jar:sources", + "com.android.tools:annotations", + "com.android.tools:annotations:jar:sources", + "com.android.tools:common", + "com.android.tools:common:jar:sources", + "com.android.tools:dvlib", + "com.android.tools:dvlib:jar:sources", + "com.android.tools:play-sdk-proto", + "com.android.tools:play-sdk-proto:jar:sources", + "com.android.tools:repository", + "com.android.tools:repository:jar:sources", + "com.android.tools:sdk-common", + "com.android.tools:sdk-common:jar:sources", + "com.android.tools:sdklib", + "com.android.tools:sdklib:jar:sources", + "com.google.code.findbugs:jsr305", + "com.google.code.findbugs:jsr305:jar:sources", + "com.google.code.gson:gson", + "com.google.code.gson:gson:jar:sources", + "com.google.errorprone:error_prone_annotations", + "com.google.errorprone:error_prone_annotations:jar:sources", + "com.google.guava:failureaccess", + "com.google.guava:failureaccess:jar:sources", + "com.google.guava:guava", + "com.google.guava:guava:jar:sources", + "com.google.guava:listenablefuture", + "com.google.j2objc:j2objc-annotations", + "com.google.j2objc:j2objc-annotations:jar:sources", + "com.google.jimfs:jimfs", + "com.google.jimfs:jimfs:jar:sources", + "com.google.protobuf:protobuf-java", + "com.google.protobuf:protobuf-java:jar:sources", + "com.squareup.moshi:moshi", + "com.squareup.moshi:moshi-kotlin", + "com.squareup.moshi:moshi-kotlin:jar:sources", + "com.squareup.moshi:moshi:jar:sources", + "com.squareup.okio:okio", + "com.squareup.okio:okio-jvm", + "com.squareup.okio:okio-jvm:jar:sources", + "com.squareup.okio:okio:jar:sources", + "com.sun.activation:javax.activation", + "com.sun.activation:javax.activation:jar:sources", + "com.sun.istack:istack-commons-runtime", + "com.sun.istack:istack-commons-runtime:jar:sources", + "com.sun.xml.fastinfoset:FastInfoset", + "com.sun.xml.fastinfoset:FastInfoset:jar:sources", + "com.xenomachina:kotlin-argparser", + "com.xenomachina:kotlin-argparser:jar:sources", + "com.xenomachina:xenocom", + "com.xenomachina:xenocom:jar:sources", + "commons-codec:commons-codec", + "commons-codec:commons-codec:jar:sources", + "commons-io:commons-io", + "commons-io:commons-io:jar:sources", + "commons-logging:commons-logging", + "commons-logging:commons-logging:jar:sources", + "io.reactivex.rxjava3:rxjava", + "io.reactivex.rxjava3:rxjava:jar:sources", + "jakarta.activation:jakarta.activation-api", + "jakarta.activation:jakarta.activation-api:jar:sources", + "jakarta.xml.bind:jakarta.xml.bind-api", + "jakarta.xml.bind:jakarta.xml.bind-api:jar:sources", + "javax.inject:javax.inject", + "javax.inject:javax.inject:jar:sources", + "net.java.dev.jna:jna", + "net.java.dev.jna:jna-platform", + "net.java.dev.jna:jna-platform:jar:sources", + "net.java.dev.jna:jna:jar:sources", + "net.sf.kxml:kxml2", + "net.sf.kxml:kxml2:jar:sources", + "org.apache.commons:commons-compress", + "org.apache.commons:commons-compress:jar:sources", + "org.apache.httpcomponents:httpclient", + "org.apache.httpcomponents:httpclient:jar:sources", + "org.apache.httpcomponents:httpcore", + "org.apache.httpcomponents:httpcore:jar:sources", + "org.apache.httpcomponents:httpmime", + "org.apache.httpcomponents:httpmime:jar:sources", + "org.bouncycastle:bcpkix-jdk15on", + "org.bouncycastle:bcpkix-jdk15on:jar:sources", + "org.bouncycastle:bcprov-jdk15on", + "org.bouncycastle:bcprov-jdk15on:jar:sources", + "org.checkerframework:checker-qual", + "org.checkerframework:checker-qual:jar:sources", + "org.glassfish.jaxb:jaxb-runtime", + "org.glassfish.jaxb:jaxb-runtime:jar:sources", + "org.glassfish.jaxb:txw2", + "org.glassfish.jaxb:txw2:jar:sources", + "org.jetbrains.intellij.deps:trove4j", + "org.jetbrains.intellij.deps:trove4j:jar:sources", + "org.jetbrains.kotlin:kotlin-reflect", + "org.jetbrains.kotlin:kotlin-reflect:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlin:kotlin-stdlib-common", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources", + "org.jetbrains:annotations", + "org.jetbrains:annotations:jar:sources", + "org.jvnet.staxex:stax-ex", + "org.jvnet.staxex:stax-ex:jar:sources", + "org.ow2.asm:asm", + "org.ow2.asm:asm-analysis", + "org.ow2.asm:asm-analysis:jar:sources", + "org.ow2.asm:asm-tree", + "org.ow2.asm:asm-tree:jar:sources", + "org.ow2.asm:asm:jar:sources", + "org.reactivestreams:reactive-streams", + "org.reactivestreams:reactive-streams:jar:sources", + "xerces:xercesImpl", + "xerces:xercesImpl:jar:sources", + "xml-apis:xml-apis", + "xml-apis:xml-apis:jar:sources" + ] + }, + "version": "2" +} diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..7e0acef --- /dev/null +++ b/renovate.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + ":dependencyDashboard", + ":semanticPrefixFixDepsChoreOthers", + "group:monorepos", + "group:recommended", + "replacements:all", + "workarounds:all" + ], + "packageRules": [ + { + "matchFiles": [ + "MODULE.bazel" + ], + "enabled": false + } + ] +} diff --git a/rules/BUILD.bazel b/rules/BUILD.bazel new file mode 100644 index 0000000..d3f5f63 --- /dev/null +++ b/rules/BUILD.bazel @@ -0,0 +1,60 @@ +load("@bazel_skylib//:bzl_library.bzl", "bzl_library") +load("//rules:toolchain.bzl", "android_lint_toolchain") + +# For stardoc to reference the files +exports_files(["defs.bzl"]) + +toolchain_type( + name = "toolchain_type", + visibility = ["//visibility:public"], +) + +android_lint_toolchain( + name = "android_lint_default", + visibility = ["//visibility:public"], +) + +toolchain( + name = "android_lint_default_toolchain", + toolchain = ":android_lint_default", + toolchain_type = ":toolchain_type", +) + +bzl_library( + name = "repositories", + srcs = ["repositories.bzl"], + visibility = ["//visibility:public"], + deps = [ + "@bazel_tools//tools/build_defs/repo:http.bzl", + "@bazel_tools//tools/build_defs/repo:utils.bzl", + ], +) + +bzl_library( + name = "defs", + srcs = ["defs.bzl"], + visibility = ["//visibility:public"], + deps = [ + "//rules/private:collect_aar_outputs_aspect", + "@bazel_skylib//lib:dicts", + ], +) + +bzl_library( + name = "extensions", + srcs = ["extensions.bzl"], + visibility = ["//visibility:public"], + deps = [":repositories"], +) + +bzl_library( + name = "toolchain", + srcs = ["toolchain.bzl"], + visibility = ["//visibility:public"], +) + +py_binary( + name = "test_runner_executable", + srcs = ["test_runner_executable.py"], + visibility = ["//visibility:public"], +) diff --git a/rules/collect_aar_outputs_aspect.bzl b/rules/collect_aar_outputs_aspect.bzl new file mode 100644 index 0000000..8f02348 --- /dev/null +++ b/rules/collect_aar_outputs_aspect.bzl @@ -0,0 +1,41 @@ +"""Aspect that collects the AAR outputs. + +Lint needs access to the raw archived aar outputs. This aspect collects them all from the dependences, +exports, and associates of the target. It then wraps them up in an AndroidLintAARInfo provider so that +Lint targets have access to them. +""" + +AndroidLintAARInfo = provider( + "A provider to collect all aars from transitive dependencies", + fields = { + "aars": "depset of aars", + }, +) + +def _collect_aar_outputs_aspect(_, ctx): + deps = getattr(ctx.rule.attr, "deps", []) + exports = getattr(ctx.rule.attr, "exports", []) + associates = getattr(ctx.rule.attr, "associates", []) + transitive_aar_depsets = [] + for dep in deps + exports + associates: + if AndroidLintAARInfo in dep: + transitive_aar_depsets.append(dep[AndroidLintAARInfo].aars) + + direct_aars = None + if hasattr(ctx.rule.attr, "aar"): + aar = ctx.rule.attr.aar.files.to_list()[0] + direct_aars = [aar] + + return [ + AndroidLintAARInfo( + aars = depset( + direct = direct_aars, + transitive = transitive_aar_depsets, + ), + ), + ] + +collect_aar_outputs_aspect = aspect( + implementation = _collect_aar_outputs_aspect, + attr_aspects = ["aar", "deps", "exports", "associates"], +) diff --git a/lint/internal/defs.bzl b/rules/defs.bzl similarity index 77% rename from lint/internal/defs.bzl rename to rules/defs.bzl index 85441d8..1816c6d 100644 --- a/lint/internal/defs.bzl +++ b/rules/defs.bzl @@ -1,4 +1,12 @@ -load("@bazel_skylib//lib:dicts.bzl", "dicts") +load( + "@bazel_skylib//lib:dicts.bzl", + _dicts = "dicts", +) +load( + "//rules/private:collect_aar_outputs_aspect.bzl", + _AndroidLintAARInfo = "AndroidLintAARInfo", + _collect_aar_outputs_aspect = "collect_aar_outputs_aspect", +) AndroidLintResultsInfo = provider( "Info needed to evaluate lint results", @@ -8,120 +16,93 @@ AndroidLintResultsInfo = provider( }, ) -AndroidLintAARInfo = provider( - "A provider to collect all aars from transitive dependencies", - fields = { - "aars": "depset of aars", - }, -) +_ANDROID_LINT_TOOLCHAIN_TYPE = Label("//rules:toolchain_type") -def _collect_aar_outputs_aspect(_, ctx): - deps = getattr(ctx.rule.attr, "deps", []) - exports = getattr(ctx.rule.attr, "exports", []) - transitive_aar_depsets = [] - for dep in deps + exports: - if AndroidLintAARInfo in dep: - transitive_aar_depsets.append(dep[AndroidLintAARInfo].aars) - - direct_aars = None - if hasattr(ctx.rule.attr, "aar"): - aar = ctx.rule.attr.aar.files.to_list()[0] - direct_aars = [aar] - - return [ - AndroidLintAARInfo( - aars = depset( - direct = direct_aars, - transitive = transitive_aar_depsets, - ), - ), - ] +def _get_android_lint_toolchain(ctx): + return ctx.toolchains[_ANDROID_LINT_TOOLCHAIN_TYPE] -collect_aar_outputs_aspect = aspect( - implementation = _collect_aar_outputs_aspect, - attr_aspects = ["aar", "deps", "exports"], +_AUTOMATIC_EXEC_GROUPS_ENABLED = dict( + _use_auto_exec_groups = attr.bool(default = True), ) -_ATTRS = { - "_lint_wrapper": attr.label( - default = "//lint/internal/wrapper:lint_wrapper", +_ATTRS = dict( + _lint_wrapper = attr.label( + default = "//rules/private/cli:lint_wrapper", executable = True, cfg = "exec", - doc = "Implementation for the Lint worker.", ), - "_test_runner_executable": attr.label( - default = "//lint/internal:test_runner_executable", + _test_runner_executable = attr.label( + default = "//rules:test_runner_executable", executable = True, cfg = "exec", - doc = "Test runner executible for validating the output results.", ), - "srcs": attr.label_list( + srcs = attr.label_list( mandatory = True, allow_files = [".java", ".kt", ".kts"], allow_empty = True, doc = "Sources to run Android Lint against.", ), - "resource_files": attr.label_list( + resource_files = attr.label_list( mandatory = False, allow_files = [".xml"], allow_empty = True, default = [], doc = "Android resource files to run Android Lint against.", ), - "self": attr.label( + # TODO(bencodes) Replace this with an aspect + self = attr.label( mandatory = True, doc = "The target being linted.", ), - "manifest": attr.label( + manifest = attr.label( mandatory = False, allow_single_file = True, doc = "Android manifest to run Android Lint against.", ), - "deps": attr.label_list( + deps = attr.label_list( mandatory = False, allow_empty = True, - allow_files = True, default = [], - aspects = [collect_aar_outputs_aspect], + aspects = [_collect_aar_outputs_aspect], doc = "Dependencies that should be on the classpath during execution.", ), - "config": attr.label( + config = attr.label( mandatory = False, allow_single_file = True, doc = "Lint configuration file.", ), - "is_test_sources": attr.bool( + is_test_sources = attr.bool( default = False, doc = "True when linting test sources, otherwise false.", ), - "autofix": attr.bool( + autofix = attr.bool( default = False, doc = "Enables lint autofix", ), - "warnings_as_errors": attr.bool( + warnings_as_errors = attr.bool( default = False, doc = "When true, lint will treat warnings as errors.", ), - "disable_checks": attr.string_list( + disable_checks = attr.string_list( mandatory = False, allow_empty = True, default = [], doc = "List of checks to disable.", ), - "enable_checks": attr.string_list( + enable_checks = attr.string_list( mandatory = False, allow_empty = True, default = [], doc = "List of checks to enable.", ), - "custom_rules": attr.label_list( + custom_rules = attr.label_list( mandatory = False, allow_empty = True, allow_files = True, default = [], doc = "Custom lint rules to run.", ), -} +) def _collect_android_lint_providers(ctx, regenerate): args = ctx.actions.args() @@ -131,11 +112,9 @@ def _collect_android_lint_providers(ctx, regenerate): inputs = [] outputs = [] - # Append the module root - module_root = ctx.build_file_path.replace("/BUILD", "") - args.add("--module-root", module_root) - # Append the module name + # TODO(Bencodes) Might be able to just replace this with custom_package + module_root = ctx.build_file_path.replace("/BUILD", "") module_name = module_root.replace("/", "_").replace("-", "_") args.add("--module-name", "{}_{}".format(module_name, ctx.attr.name)) @@ -144,9 +123,9 @@ def _collect_android_lint_providers(ctx, regenerate): args.add("--label", "{}".format(self)) # Append the extra information that Lint needs to know about our byte code - args.add("--compile-sdk-version", "33") - args.add("--java-language-level", "1.8") - args.add("--kotlin-language-level", "1.8") + args.add("--compile-sdk-version", _get_android_lint_toolchain(ctx).compile_sdk_version) + args.add("--java-language-level", _get_android_lint_toolchain(ctx).java_language_level) + args.add("--kotlin-language-level", _get_android_lint_toolchain(ctx).kotlin_language_level) # Append the input source files for src in ctx.files.srcs: @@ -159,6 +138,7 @@ def _collect_android_lint_providers(ctx, regenerate): inputs.extend(ctx.files.resource_files) # Append the Android manifest file + # Lint requires that the input manifest files be named exactly `AndroidManifest.xml`. if ctx.attr.manifest: manifest = ctx.file.manifest if ctx.file.manifest.basename != "AndroidManifest.xml": @@ -175,9 +155,13 @@ def _collect_android_lint_providers(ctx, regenerate): args.add("--regenerate-baseline-files") # Append the configuration + # This either comes globally from the toolchain or from the target if ctx.attr.config: args.add("--config-file", ctx.file.config) inputs.append(ctx.file.config) + elif _get_android_lint_toolchain(ctx).android_lint_config: + args.add("--config-file", _get_android_lint_toolchain(ctx).android_lint_config) + inputs.append(_get_android_lint_toolchain(ctx).android_lint_config) # Append the configuration if ctx.attr.warnings_as_errors: @@ -199,8 +183,8 @@ def _collect_android_lint_providers(ctx, regenerate): classpath_jars.append(dep[AndroidLibraryResourceClassJarProvider].jars) if AndroidLibraryAarInfo in dep: classpath_aars.append(dep[AndroidLibraryAarInfo].transitive_aar_artifacts) - if AndroidLintAARInfo in dep: - classpath_aars.append(dep[AndroidLintAARInfo].aars) + if _AndroidLintAARInfo in dep: + classpath_aars.append(dep[_AndroidLintAARInfo].aars) # Append the compiled R files for our self if ctx.attr.self: @@ -250,6 +234,7 @@ def _collect_android_lint_providers(ctx, regenerate): progress_message = "Running Android Lint {}".format(str(ctx.label)), arguments = [args], tools = [ctx.executable._lint_wrapper], + toolchain = _ANDROID_LINT_TOOLCHAIN_TYPE, execution_requirements = { "supports-workers": "1", "requires-worker-protocol": "json", @@ -300,18 +285,24 @@ def _test_impl(ctx): ), ] -lint_test = rule( +android_lint_test = rule( implementation = _test_impl, - attrs = dicts.add( + attrs = _dicts.add( _ATTRS, - { - "baseline": attr.label( + dict( + baseline = attr.label( mandatory = False, allow_single_file = True, doc = "Lint baseline file.", ), - }, + ), + _AUTOMATIC_EXEC_GROUPS_ENABLED, ), - provides = [DefaultInfo, AndroidLintResultsInfo], + provides = [ + AndroidLintResultsInfo, + ], test = True, + toolchains = [ + "//rules:toolchain_type", + ], ) diff --git a/rules/extensions.bzl b/rules/extensions.bzl new file mode 100644 index 0000000..88c2ac3 --- /dev/null +++ b/rules/extensions.bzl @@ -0,0 +1,59 @@ +"""Extensions for bzlmod. + +Installs a android_lint toolchain. +Every module can define a toolchain version under the default name, "android_lint". +The latest of those versions will be selected (the rest discarded), +and will always be registered by rules_android_lint. + +Additionally, the root module can define arbitrarily many more toolchain versions under different +names (the latest version will be picked for each name) and can register them as it sees fit, +effectively overriding the default named toolchain due to toolchain resolution precedence. +""" + +load(":repositories.bzl", "android_lint_register_toolchains") + +_DEFAULT_NAME = "android_lint" + +android_lint_toolchain = tag_class(attrs = { + "name": attr.string(doc = """\ +Base name for generated repositories, allowing more than one android_lint toolchain to be registered. +Overriding the default is only permitted in the root module. +""", default = _DEFAULT_NAME), + "android_lint_version": attr.string(doc = "Explicit version of android_lint.", mandatory = True), +}) + +def _toolchain_extension(module_ctx): + registrations = {} + for mod in module_ctx.modules: + for toolchain in mod.tags.toolchain: + if toolchain.name != _DEFAULT_NAME and not mod.is_root: + fail("""\ + Only the root module may override the default name for the android_lint toolchain. + This prevents conflicting registrations in the global namespace of external repos. + """) + if toolchain.name not in registrations.keys(): + registrations[toolchain.name] = [] + registrations[toolchain.name].append(toolchain.android_lint_version) + for name, versions in registrations.items(): + if len(versions) > 1: + # TODO: should be semver-aware, using MVS + selected = sorted(versions, reverse = True)[0] + + # buildifier: disable=print + print("NOTE: android_lint toolchain {} has multiple versions {}, selected {}".format(name, versions, selected)) + else: + selected = versions[0] + + android_lint_register_toolchains( + name = name, + android_lint_version = selected, + register = False, + ) + pass + +android_lint = module_extension( + implementation = _toolchain_extension, + tag_classes = { + "toolchain": android_lint_toolchain, + }, +) diff --git a/rules/private/BUILD.bazel b/rules/private/BUILD.bazel new file mode 100644 index 0000000..58e111c --- /dev/null +++ b/rules/private/BUILD.bazel @@ -0,0 +1,7 @@ +load("@bazel_skylib//:bzl_library.bzl", "bzl_library") + +bzl_library( + name = "collect_aar_outputs_aspect", + srcs = ["collect_aar_outputs_aspect.bzl"], + visibility = ["//visibility:public"], +) diff --git a/lint/internal/wrapper/AndroidLintAction.kt b/rules/private/cli/AndroidLintAction.kt similarity index 73% rename from lint/internal/wrapper/AndroidLintAction.kt rename to rules/private/cli/AndroidLintAction.kt index 47029cb..a92a216 100644 --- a/lint/internal/wrapper/AndroidLintAction.kt +++ b/rules/private/cli/AndroidLintAction.kt @@ -1,16 +1,12 @@ +package com.rules.android.lint.cli + +import com.rules.android.lint.worker.Worker import java.io.PrintStream import java.nio.file.Files import kotlin.system.exitProcess object AndroidLintAction { - init { - // Attempt to better isolate the Android lint execution - val androidSdkCacheDirectory = Files.createTempDirectory("android_sdk_cache") - androidSdkCacheDirectory.toFile().deleteOnExit() - updateAndroidSDKCacheDirectory(androidSdkCacheDirectory) - } - @JvmStatic fun main(args: Array) { val worker = Worker.fromArgs(args, AndroidLintExecutor()) @@ -20,7 +16,7 @@ object AndroidLintAction { private class AndroidLintExecutor : Worker.WorkRequestCallback { override fun processWorkRequest(args: List, printStream: PrintStream): Int { - val workingDirectory = Files.createTempDirectory("android_lint") + val workingDirectory = Files.createTempDirectory("rules") try { val runner = AndroidLintRunner() diff --git a/lint/internal/wrapper/AndroidLintActionArgs.kt b/rules/private/cli/AndroidLintActionArgs.kt similarity index 95% rename from lint/internal/wrapper/AndroidLintActionArgs.kt rename to rules/private/cli/AndroidLintActionArgs.kt index a02065c..7b6feb5 100644 --- a/lint/internal/wrapper/AndroidLintActionArgs.kt +++ b/rules/private/cli/AndroidLintActionArgs.kt @@ -1,3 +1,5 @@ +package com.rules.android.lint.cli + import com.xenomachina.argparser.ArgParser import com.xenomachina.argparser.default import java.io.File @@ -53,12 +55,6 @@ internal class AndroidLintActionArgs( transform = argsParserPathTransformer, ).default { null } - val moduleRoot: Path by parser.storing( - names = arrayOf("--module-root"), - help = "", - transform = argsParserPathTransformer, - ) - val baselineFile: Path? by parser.storing( names = arrayOf("--baseline-file"), help = "", @@ -85,7 +81,7 @@ internal class AndroidLintActionArgs( val autofix: Boolean by parser.flagging( names = arrayOf("--autofix"), - help = "", + help = "TODO Not supported yet", ).default { false } val regenerateBaselineFile: Boolean by parser.flagging( diff --git a/rules/private/cli/AndroidLintBaselineSanitizer.kt b/rules/private/cli/AndroidLintBaselineSanitizer.kt new file mode 100644 index 0000000..3c50817 --- /dev/null +++ b/rules/private/cli/AndroidLintBaselineSanitizer.kt @@ -0,0 +1,42 @@ +package com.rules.android.lint.cli + +object AndroidLintBaselineSanitizer { + + internal fun sanitize(content: String): String { + return content.split("\n").asSequence().map(::sanitizeLine).joinToString("\n") + } + + internal fun sanitizeLine(content: String): String { + if (!content.contains("file=")) { + // No need to sanitize lines that don't have absolute paths in them + return content + } + + return content.run { + removeRelativePathPrefixes(this) + }.run { + removePreSanitizedAarPath(this) + } + } + + // Remove relative path prefixes from the file attribute. + // Example: file="../../../foo/Bar.java + private fun removeRelativePathPrefixes(content: String): String { + var c = content + val find = "file=\"../" + while (c.contains(find)) { + c = c.replace(find, "file=\"") + } + return c + } + + private fun removePreSanitizedAarPath(content: String): String { + return if (content.contains(".jar!/")) { + val start = content.indexOf("file=\"") + "file=\"".length + val end = content.indexOf(".jar!/") + ".jar!/".length + content.removeRange(start, end) + } else { + content + } + } +} diff --git a/lint/internal/wrapper/AndroidLintProject.kt b/rules/private/cli/AndroidLintProject.kt similarity index 98% rename from lint/internal/wrapper/AndroidLintProject.kt rename to rules/private/cli/AndroidLintProject.kt index 9236141..01b2bea 100644 --- a/lint/internal/wrapper/AndroidLintProject.kt +++ b/rules/private/cli/AndroidLintProject.kt @@ -1,3 +1,5 @@ +package com.rules.android.lint.cli + import java.io.StringWriter import java.nio.file.Path import javax.xml.parsers.DocumentBuilderFactory @@ -8,7 +10,6 @@ import javax.xml.transform.stream.StreamResult import kotlin.io.path.absolutePathString import kotlin.io.path.pathString - internal fun createProjectXMLString( moduleName: String, srcs: List, diff --git a/lint/internal/wrapper/AndroidLintRunner.kt b/rules/private/cli/AndroidLintRunner.kt similarity index 89% rename from lint/internal/wrapper/AndroidLintRunner.kt rename to rules/private/cli/AndroidLintRunner.kt index 0d04075..845f307 100644 --- a/lint/internal/wrapper/AndroidLintRunner.kt +++ b/rules/private/cli/AndroidLintRunner.kt @@ -1,3 +1,5 @@ +package com.rules.android.lint.cli + import com.android.tools.lint.LintCliFlags import com.android.tools.lint.Main import java.nio.file.Files @@ -5,8 +7,13 @@ import java.nio.file.Path import java.util.concurrent.ExecutorService import java.util.concurrent.Executors import java.util.concurrent.TimeUnit -import kotlin.io.path.* - +import kotlin.io.path.exists +import kotlin.io.path.extension +import kotlin.io.path.isRegularFile +import kotlin.io.path.name +import kotlin.io.path.pathString +import kotlin.io.path.readText +import kotlin.io.path.writeText internal class AndroidLintRunner { @@ -49,18 +56,14 @@ internal class AndroidLintRunner { ), ) - // Run Android Lint val exitCode = runAndroidLintCLI(args, projectFile, baselineFile) // Pure hacks to strip the relative paths out of the file locations. Lint doesn't offer any way to disable this // and if we parse-and-transform the baseline, we can't easily match format that Lint produces. - args.output.readText().run { - args.output.writeText( - this.replace("../", "") - .replace("file=\"" + args.moduleRoot.pathString + "/", "file=\""), - ) - } + val sanitizedContent = args.output.readText() + .run { AndroidLintBaselineSanitizer.sanitize(this) } + args.output.writeText(sanitizedContent) /* * Exit Status: @@ -99,11 +102,12 @@ internal class AndroidLintRunner { actionArgs.javaLanguageLevel, "--kotlin-language-level", actionArgs.kotlinLanguageLevel, - "--update-baseline", "--stacktrace", "--quiet", + "--offline", "--baseline", baselineFilePath.pathString, + "--update-baseline", ) if (actionArgs.warningsAsErrors) { args.add("-Werror") @@ -129,8 +133,8 @@ internal class AndroidLintRunner { return main.run(args.toTypedArray()) } - // A reflection hack for forcing lint to not run against transitive dependencies + // TODO(bencodes) Allow this to be toggled from the toolchain private fun disableDependenciesCheck(lintMain: Main) { val mainClass = Class.forName("com.android.tools.lint.Main") val lintCliFlagsField = mainClass.getDeclaredField("flags") @@ -145,14 +149,15 @@ internal class AndroidLintRunner { * with this structure: ${tmpDirectory}/${aarFileName}--aar-unzipped/ * * This is a necessary workaround for Lint wanting to unpack these aars into a global - * shared directory, which causes lots of obscure concurrency issues inside of lint. + * shared directory, which causes lots of obscure concurrency issues inside of lint + * when operating in persistent worker mode. */ private fun unpackAars( aars: List, dstDirectory: Path, executorService: ExecutorService = Executors.newFixedThreadPool(6), ): List> { - val aarsToUnpack = aars.map { it to dstDirectory.resolve("${it.name}-aar-unzipped") } + val aarsToUnpack = aars.map { it to dstDirectory.resolve("${it.name}-aar-contents") } aarsToUnpack.forEach { (src, dst) -> unzip(src, dst) } executorService.awaitTermination(15, TimeUnit.SECONDS) return aarsToUnpack.sortedBy { it.first } diff --git a/rules/private/cli/AndroidLintWrapperUtils.kt b/rules/private/cli/AndroidLintWrapperUtils.kt new file mode 100644 index 0000000..a23ec29 --- /dev/null +++ b/rules/private/cli/AndroidLintWrapperUtils.kt @@ -0,0 +1,25 @@ +package com.rules.android.lint.cli + +import java.io.File +import java.nio.file.Path +import java.util.zip.ZipInputStream +import kotlin.io.path.inputStream + +internal fun unzip(src: Path, dst: Path) { + val dstFile = dst.toFile() + val bufferedZipInputStream = src.inputStream().buffered() + ZipInputStream(bufferedZipInputStream).use { zipStream -> + var zipEntry = zipStream.nextEntry + while (zipEntry != null) { + if (zipEntry.isDirectory) { + File(dstFile, zipEntry.name).mkdirs() + } else { + File(dstFile, zipEntry.name).also { it.parentFile.mkdirs() }.outputStream() + .use { fileOutputStream -> zipStream.copyTo(fileOutputStream) } + } + + zipStream.closeEntry() + zipEntry = zipStream.nextEntry + } + } +} diff --git a/rules/private/cli/BUILD b/rules/private/cli/BUILD new file mode 100644 index 0000000..8b1ca6b --- /dev/null +++ b/rules/private/cli/BUILD @@ -0,0 +1,38 @@ +load("@rules_java//java:defs.bzl", "java_binary") +load("@rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") +load("@rules_kotlin//kotlin:lint.bzl", "ktlint_fix", "ktlint_test") + +java_binary( + name = "lint_wrapper", + main_class = "com.rules.android.lint.cli.AndroidLintAction", + visibility = ["//visibility:public"], + runtime_deps = [":lint"], +) + +ktlint_test( + name = "lint_ktlint_test", + srcs = glob(["*.kt"]), + config = "//:editorconfig", + visibility = ["//visibility:private"], +) + +ktlint_fix( + name = "lint_ktlint_fix", + srcs = glob(["*.kt"]), + config = "//:editorconfig", + visibility = ["//visibility:private"], +) + +kt_jvm_library( + name = "lint", + srcs = glob(["*.kt"]), + visibility = ["//visibility:public"], + deps = [ + "//rules/private/worker", + "@rules_android_lint_deps//:com_android_tools_lint_lint", + "@rules_android_lint_deps//:com_android_tools_lint_lint_api", + "@rules_android_lint_deps//:com_android_tools_lint_lint_checks", + "@rules_android_lint_deps//:com_android_tools_lint_lint_model", + "@rules_android_lint_deps//:com_xenomachina_kotlin_argparser", + ], +) diff --git a/rules/private/collect_aar_outputs_aspect.bzl b/rules/private/collect_aar_outputs_aspect.bzl new file mode 100644 index 0000000..854f251 --- /dev/null +++ b/rules/private/collect_aar_outputs_aspect.bzl @@ -0,0 +1,34 @@ +AndroidLintAARInfo = provider( + "A provider to collect all aars from transitive dependencies", + fields = { + "aars": "depset of aars", + }, +) + +def _collect_aar_outputs_aspect(_, ctx): + deps = getattr(ctx.rule.attr, "deps", []) + exports = getattr(ctx.rule.attr, "exports", []) + associates = getattr(ctx.rule.attr, "associates", []) + transitive_aar_depsets = [] + for dep in deps + exports + associates: + if AndroidLintAARInfo in dep: + transitive_aar_depsets.append(dep[AndroidLintAARInfo].aars) + + direct_aars = None + if hasattr(ctx.rule.attr, "aar"): + aar = ctx.rule.attr.aar.files.to_list()[0] + direct_aars = [aar] + + return [ + AndroidLintAARInfo( + aars = depset( + direct = direct_aars, + transitive = transitive_aar_depsets, + ), + ), + ] + +collect_aar_outputs_aspect = aspect( + implementation = _collect_aar_outputs_aspect, + attr_aspects = ["aar", "deps", "exports", "associates"], +) diff --git a/rules/private/worker/BUILD b/rules/private/worker/BUILD new file mode 100644 index 0000000..3c8aa3d --- /dev/null +++ b/rules/private/worker/BUILD @@ -0,0 +1,29 @@ +load("@rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") +load("@rules_kotlin//kotlin:lint.bzl", "ktlint_fix", "ktlint_test") + +kt_jvm_library( + name = "worker", + srcs = glob(["*.kt"]), + visibility = ["//visibility:public"], + deps = [ + "@rules_android_lint_deps//:com_squareup_moshi_moshi", + "@rules_android_lint_deps//:com_squareup_moshi_moshi_kotlin", + "@rules_android_lint_deps//:com_squareup_okio_okio_jvm", + "@rules_android_lint_deps//:io_reactivex_rxjava3_rxjava", + "@rules_android_lint_deps//:org_reactivestreams_reactive_streams", + ], +) + +ktlint_test( + name = "lint_ktlint_test", + srcs = glob(["*.kt"]), + config = "//:editorconfig", + visibility = ["//visibility:private"], +) + +ktlint_fix( + name = "lint_ktlint_fix", + srcs = glob(["*.kt"]), + config = "//:editorconfig", + visibility = ["//visibility:private"], +) diff --git a/lint/internal/worker/InvocationWorker.kt b/rules/private/worker/InvocationWorker.kt similarity index 88% rename from lint/internal/worker/InvocationWorker.kt rename to rules/private/worker/InvocationWorker.kt index 73a6b03..631e928 100644 --- a/lint/internal/worker/InvocationWorker.kt +++ b/rules/private/worker/InvocationWorker.kt @@ -1,3 +1,5 @@ +package com.rules.android.lint.worker + internal class InvocationWorker( private val args: Array, private val workerMessageProcessor: Worker.WorkRequestCallback, diff --git a/lint/internal/worker/PersistentWorker.kt b/rules/private/worker/PersistentWorker.kt similarity index 91% rename from lint/internal/worker/PersistentWorker.kt rename to rules/private/worker/PersistentWorker.kt index 59c8c2d..794bd43 100644 --- a/lint/internal/worker/PersistentWorker.kt +++ b/rules/private/worker/PersistentWorker.kt @@ -1,3 +1,5 @@ +package com.rules.android.lint.worker + import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Scheduler @@ -90,8 +92,14 @@ internal class PersistentWorker( try { // Sanity check the work request arguments val arguments = - requireNotNull(request.arguments) { "Request with id ${request.requestId} does not have arguments!" } - require(arguments.isNotEmpty()) { "Request with id ${request.requestId} does not have arguments!" } + requireNotNull(request.arguments) { + "Request with id ${request.requestId} " + + "does not have arguments!" + } + require(arguments.isNotEmpty()) { + "Request with id ${request.requestId} " + + "does not have arguments!" + } exitCode = workerWorkRequestCallback.processWorkRequest(arguments, printStream) } catch (e: Exception) { e.printStackTrace(printStream) diff --git a/lint/internal/worker/PersistentWorkerCpuTimeBasedGcScheduler.kt b/rules/private/worker/PersistentWorkerCpuTimeBasedGcScheduler.kt similarity index 89% rename from lint/internal/worker/PersistentWorkerCpuTimeBasedGcScheduler.kt rename to rules/private/worker/PersistentWorkerCpuTimeBasedGcScheduler.kt index 47554b8..3290e4a 100644 --- a/lint/internal/worker/PersistentWorkerCpuTimeBasedGcScheduler.kt +++ b/rules/private/worker/PersistentWorkerCpuTimeBasedGcScheduler.kt @@ -1,3 +1,5 @@ +package com.rules.android.lint.worker + import com.sun.management.OperatingSystemMXBean import java.lang.management.ManagementFactory import java.time.Duration @@ -23,8 +25,8 @@ internal class PersistentWorkerCpuTimeBasedGcScheduler( val currentCpuTime = cpuTime val lastCpuTime = cpuTimeAtLastGc.get() // Do GC when enough CPU time has been used, but only if nobody else beat us to it. - if (currentCpuTime.minus(lastCpuTime) > cpuUsageBeforeGc - && cpuTimeAtLastGc.compareAndSet(lastCpuTime, currentCpuTime) + if (currentCpuTime.minus(lastCpuTime) > cpuUsageBeforeGc && + cpuTimeAtLastGc.compareAndSet(lastCpuTime, currentCpuTime) ) { System.gc() // Avoid counting GC CPU time against CPU time before next GC. diff --git a/lint/internal/worker/WorkRequest.kt b/rules/private/worker/WorkRequest.kt similarity index 87% rename from lint/internal/worker/WorkRequest.kt rename to rules/private/worker/WorkRequest.kt index 6485706..7cc49a4 100644 --- a/lint/internal/worker/WorkRequest.kt +++ b/rules/private/worker/WorkRequest.kt @@ -1,3 +1,5 @@ +package com.rules.android.lint.worker + import com.squareup.moshi.Json data class WorkRequest( diff --git a/lint/internal/worker/WorkResponse.kt b/rules/private/worker/WorkResponse.kt similarity index 90% rename from lint/internal/worker/WorkResponse.kt rename to rules/private/worker/WorkResponse.kt index 8b30c7b..418d5a3 100644 --- a/lint/internal/worker/WorkResponse.kt +++ b/rules/private/worker/WorkResponse.kt @@ -1,3 +1,5 @@ +package com.rules.android.lint.worker + import com.squareup.moshi.Json data class WorkResponse( diff --git a/lint/internal/worker/Worker.kt b/rules/private/worker/Worker.kt similarity index 96% rename from lint/internal/worker/Worker.kt rename to rules/private/worker/Worker.kt index 3446c46..f009f01 100644 --- a/lint/internal/worker/Worker.kt +++ b/rules/private/worker/Worker.kt @@ -1,3 +1,5 @@ +package com.rules.android.lint.worker + import java.io.IOException import java.io.PrintStream diff --git a/lint/internal/worker/WorkerIO.kt b/rules/private/worker/WorkerIO.kt similarity index 90% rename from lint/internal/worker/WorkerIO.kt rename to rules/private/worker/WorkerIO.kt index 05f9c8b..159a662 100644 --- a/lint/internal/worker/WorkerIO.kt +++ b/rules/private/worker/WorkerIO.kt @@ -1,3 +1,5 @@ +package com.rules.android.lint.worker + import java.io.InputStream import java.io.PrintStream diff --git a/lint/internal/worker/WorkerJsonMessageProcessor.kt b/rules/private/worker/WorkerJsonMessageProcessor.kt similarity index 89% rename from lint/internal/worker/WorkerJsonMessageProcessor.kt rename to rules/private/worker/WorkerJsonMessageProcessor.kt index 4b4cc53..6d530c2 100644 --- a/lint/internal/worker/WorkerJsonMessageProcessor.kt +++ b/rules/private/worker/WorkerJsonMessageProcessor.kt @@ -1,7 +1,13 @@ +package com.rules.android.lint.worker + import com.squareup.moshi.JsonAdapter import com.squareup.moshi.Moshi import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory -import okio.* +import okio.BufferedSink +import okio.BufferedSource +import okio.buffer +import okio.sink +import okio.source import java.io.InputStream import java.io.OutputStream diff --git a/rules/repositories.bzl b/rules/repositories.bzl new file mode 100644 index 0000000..52d022d --- /dev/null +++ b/rules/repositories.bzl @@ -0,0 +1,48 @@ +"""Declare runtime dependencies + +These are needed for local dev, and users must install them as well. +See https://docs.bazel.build/versions/main/skylark/deploying.html#dependencies +""" + +load("@bazel_tools//tools/build_defs/repo:http.bzl", _http_archive = "http_archive") +load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") + +def http_archive(name, **kwargs): + maybe(_http_archive, name = name, **kwargs) + +# WARNING: any changes in this function may be BREAKING CHANGES for users +# because we'll fetch a dependency which may be different from one that +# they were previously fetching later in their WORKSPACE setup, and now +# ours took precedence. Such breakages are challenging for users, so any +# changes in this function should be marked as BREAKING in the commit message +# and released only in semver majors. +# This is all fixed by bzlmod, so we just tolerate it for now. +def rules_android_lint_dependencies(): + # The minimal version of bazel_skylib we require + http_archive( + name = "bazel_skylib", + sha256 = "74d544d96f4a5bb630d465ca8bbcfe231e3594e5aae57e1edbf17a6eb3ca2506", + urls = [ + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.3.0/bazel-skylib-1.3.0.tar.gz", + "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.3.0/bazel-skylib-1.3.0.tar.gz", + ], + ) + +# Wrapper macro around everything above, this is the primary API +def android_lint_register_toolchains(name, register = True, **kwargs): + """Convenience macro for users which does typical setup. + + - create a repository for each built-in platform like "android_lint_linux_amd64" - + this repository is lazily fetched when node is needed for that platform. + - TODO: create a convenience repository for the host platform like "android_lint_host" + - create a repository exposing toolchains for each platform like "android_lint_platforms" + - register a toolchain pointing at each platform + Users can avoid this macro and do these steps themselves, if they want more control. + Args: + name: base name for all created repos, like "android_lint1_14" + register: whether to call through to native.register_toolchains. + Should be True for WORKSPACE users, but false when used under bzlmod extension + **kwargs: passed to each node_repositories call + """ + if register: + native.register_toolchains("//rules:android_lint_default_toolchain") diff --git a/lint/internal/test_runner_executable.py b/rules/test_runner_executable.py old mode 100644 new mode 100755 similarity index 100% rename from lint/internal/test_runner_executable.py rename to rules/test_runner_executable.py diff --git a/rules/toolchain.bzl b/rules/toolchain.bzl new file mode 100644 index 0000000..a3cf88d --- /dev/null +++ b/rules/toolchain.bzl @@ -0,0 +1,31 @@ +"""Android Lint Toolchain.""" + +_ATTRS = dict( + compile_sdk_version = attr.string( + default = "34", + doc = "The Android SDK version to compile against.", + ), + java_language_level = attr.string( + default = "1.8", + doc = "The Java language level to compile against.", + ), + kotlin_language_level = attr.string( + default = "1.8", + doc = "The Kotlin language level to compile against.", + ), + android_lint_config = attr.label( + default = None, + doc = "The Android Lint config file to use globally.", + allow_single_file = True, + ), +) + +def _impl(ctx): + return [platform_common.ToolchainInfo( + **{name: getattr(ctx.attr, name) for name in _ATTRS.keys()} + )] + +android_lint_toolchain = rule( + implementation = _impl, + attrs = _ATTRS, +) diff --git a/scripts/build-examples.sh b/scripts/build-examples.sh deleted file mode 100755 index 1c240c6..0000000 --- a/scripts/build-examples.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -cd lint-examples || exit - -bazel test //android:lib_lint //simple:lib_lint --test_output=all diff --git a/scripts/lint-shell-files.sh b/scripts/lint-shell-files.sh deleted file mode 100755 index fe2d6e9..0000000 --- a/scripts/lint-shell-files.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -find . -type f -name "*.sh" -exec "shellcheck" {} \; diff --git a/tests/BUILD b/tests/BUILD deleted file mode 100644 index 6027dca..0000000 --- a/tests/BUILD +++ /dev/null @@ -1,7 +0,0 @@ -test_suite( - name = "tests", - tests = [ - "//tests/internal:test_runner_executable_tests", - "//tests/internal/wrapper:tests", - ], -) diff --git a/tests/BUILD.bazel b/tests/BUILD.bazel new file mode 100644 index 0000000..6fba512 --- /dev/null +++ b/tests/BUILD.bazel @@ -0,0 +1,12 @@ +load(":versions_test.bzl", "versions_test_suite") + +versions_test_suite(name = "versions_test") + +test_suite( + name = "tests", + tests = [ + ":versions_test", + "//tests/private/cli:tests", + "//tests/private/worker:tests", + ], +) diff --git a/tests/internal/BUILD b/tests/internal/BUILD deleted file mode 100644 index 0944773..0000000 --- a/tests/internal/BUILD +++ /dev/null @@ -1,5 +0,0 @@ -py_test( - name = "test_runner_executable_tests", - srcs = ["test_runner_executable_tests.py"], - deps = ["//lint/internal:test_runner_executable"], -) diff --git a/tests/internal/test_runner_executable_tests.py b/tests/internal/test_runner_executable_tests.py deleted file mode 100644 index 251c554..0000000 --- a/tests/internal/test_runner_executable_tests.py +++ /dev/null @@ -1,4 +0,0 @@ -if __name__ == "__main__": - # Parse the arguments - # TODO Add tests - pass diff --git a/tests/internal/wrapper/AndroidLintActionArgsTest.kt b/tests/internal/wrapper/AndroidLintActionArgsTest.kt deleted file mode 100644 index da15356..0000000 --- a/tests/internal/wrapper/AndroidLintActionArgsTest.kt +++ /dev/null @@ -1,78 +0,0 @@ -import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.JUnit4 -import java.nio.file.Paths -import org.assertj.core.api.Assertions.assertThat - - -@RunWith(JUnit4::class) -class AndroidLintActionArgsTest { - - @Test - fun `does parse all arguments`() { - val parseArgs = AndroidLintActionArgs.parseArgs( - args = arrayOf( - "--module-name", - "test_module_name", - "--label", - "test", - "--src", - "path/to/Foo.kt", - "--output", - "output.jar", - "--project-config-output", - "project.xml", - "--resource", - "path/to/resource/strings.xml", - "--android-manifest", - "AndroidManifest.xml", - "--module-root", - "/tmp/", - "--baseline-file", - "lib_lint_baseline.xml", - "--config-file", - "lint_config.xml", - "--custom-rule", - "custom_rule.jar", - "--classpath", - "classpath.jar", - "--classpath", - "classpath.aar", - "--autofix", - "--regenerate-baseline-files", - "--warnings-as-errors", - "--enable-check", - "custom-check", - "--disable-check", - "custom-disabled-check", - "--compile-sdk-version", - "1.6", - "--java-language-level", - "1.7", - "--kotlin-language-level", - "1.8", - ), - ) - - assertThat(parseArgs.moduleName).isEqualTo("test_module_name") - assertThat(parseArgs.label).isEqualTo("test") - assertThat(parseArgs.srcs).containsExactly(Paths.get("path/to/Foo.kt")) - assertThat(parseArgs.output).isEqualTo(Paths.get("output.jar")) - assertThat(parseArgs.projectConfigOutput).isEqualTo(Paths.get("project.xml")) - assertThat(parseArgs.resources).containsExactly(Paths.get("path/to/resource/strings.xml")) - assertThat(parseArgs.moduleRoot).isEqualTo(Paths.get("/tmp/")) - assertThat(parseArgs.baselineFile).isEqualTo(Paths.get("lib_lint_baseline.xml")) - assertThat(parseArgs.config).isEqualTo(Paths.get("lint_config.xml")) - assertThat(parseArgs.customChecks).containsExactly(Paths.get("custom_rule.jar")) - assertThat(parseArgs.classpath) - .containsExactly(Paths.get("classpath.jar"), Paths.get("classpath.aar")) - assertThat(parseArgs.autofix).isTrue - assertThat(parseArgs.regenerateBaselineFile).isTrue - assertThat(parseArgs.warningsAsErrors).isTrue - assertThat(parseArgs.enableChecks).containsExactly("custom-check") - assertThat(parseArgs.disableChecks).containsExactly("custom-disabled-check") - assertThat(parseArgs.compileSdkVersion).isEqualTo("1.6") - assertThat(parseArgs.javaLanguageLevel).isEqualTo("1.7") - assertThat(parseArgs.kotlinLanguageLevel).isEqualTo("1.8") - } -} diff --git a/tests/internal/wrapper/AndroidLintActionTest.kt b/tests/internal/wrapper/AndroidLintActionTest.kt deleted file mode 100644 index f57f99b..0000000 --- a/tests/internal/wrapper/AndroidLintActionTest.kt +++ /dev/null @@ -1,6 +0,0 @@ -import org.junit.runner.RunWith -import org.junit.runners.JUnit4 - -@RunWith(JUnit4::class) -class AndroidLintActionTest { -} diff --git a/tests/internal/wrapper/AndroidLintProjectTest.kt b/tests/internal/wrapper/AndroidLintProjectTest.kt deleted file mode 100644 index 836a7d3..0000000 --- a/tests/internal/wrapper/AndroidLintProjectTest.kt +++ /dev/null @@ -1,55 +0,0 @@ -import org.assertj.core.api.Assertions.assertThat -import org.junit.Rule -import org.junit.Test -import org.junit.rules.TemporaryFolder -import org.junit.runner.RunWith -import org.junit.runners.JUnit4 -import java.nio.file.Path - - -@RunWith(JUnit4::class) -class AndroidLintProjectTest { - - @Rule - @JvmField - var tmpDirectory = TemporaryFolder() - - private fun TemporaryFolder.newPath(name: String): Path = this.newFile(name).toPath() - - @Test - fun `test asXMLString does produce correct project file content`() { - assertThat( - createProjectXMLString( - moduleName = "test_module_name", - srcs = listOf(tmpDirectory.newPath("Foo.kt")), - resources = listOf(tmpDirectory.newPath("foo.xml")), - androidManifest = tmpDirectory.newPath("AndroidManifest.xml"), - classpathJars = listOf(tmpDirectory.newPath("Foo.jar")), - classpathAars = listOf(tmpDirectory.newPath("Foo.aar")), - classpathExtractedAarDirectories = listOf( - Pair( - tmpDirectory.newPath("Bar.aar"), - tmpDirectory.newFolder("tmp/unpacked_aars/bar/").toPath(), - ), - ), - customLintChecks = listOf(tmpDirectory.newPath("tmp/unpacked_aars/bar/lint.jar")), - ), - ).isEqualTo( - """ - - - - - - - - - - - - - - """.trimIndent().replace("{root}", tmpDirectory.root.absolutePath), - ) - } -} diff --git a/tests/internal/wrapper/BUILD b/tests/internal/wrapper/BUILD deleted file mode 100644 index 04c820e..0000000 --- a/tests/internal/wrapper/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library", "kt_jvm_test") - -kt_jvm_test( - name = "AndroidLintActionTest", - srcs = ["AndroidLintActionTest.kt"], - associates = ["//lint/internal/wrapper:lint"], - test_class = "AndroidLintActionTest", - deps = [ - "@rules_android_lint_dependencies//:junit_junit", - "@rules_android_lint_dependencies//:org_assertj_assertj_core", - ], -) - -kt_jvm_test( - name = "AndroidLintProjectTest", - srcs = ["AndroidLintProjectTest.kt"], - associates = ["//lint/internal/wrapper:lint"], - test_class = "AndroidLintProjectTest", - deps = [ - "@rules_android_lint_dependencies//:junit_junit", - "@rules_android_lint_dependencies//:org_assertj_assertj_core", - ], -) - -kt_jvm_test( - name = "AndroidLintActionArgsTest", - srcs = ["AndroidLintActionArgsTest.kt"], - associates = ["//lint/internal/wrapper:lint"], - test_class = "AndroidLintActionArgsTest", - deps = [ - "@rules_android_lint_dependencies//:junit_junit", - "@rules_android_lint_dependencies//:org_assertj_assertj_core", - ], -) - -test_suite( - name = "tests", - tests = [ - ":AndroidLintActionArgsTest", - ":AndroidLintActionTest", - ":AndroidLintProjectTest", - ], -) diff --git a/tests/private/cli/BUILD b/tests/private/cli/BUILD new file mode 100644 index 0000000..e0cfdc1 --- /dev/null +++ b/tests/private/cli/BUILD @@ -0,0 +1,6 @@ +load("@rules_kotlin//kotlin:jvm.bzl", "kt_jvm_test") +load("@rules_kotlin//kotlin:lint.bzl", "ktlint_fix", "ktlint_test") + +test_suite( + name = "tests", +) diff --git a/tests/private/worker/BUILD b/tests/private/worker/BUILD new file mode 100644 index 0000000..e0cfdc1 --- /dev/null +++ b/tests/private/worker/BUILD @@ -0,0 +1,6 @@ +load("@rules_kotlin//kotlin:jvm.bzl", "kt_jvm_test") +load("@rules_kotlin//kotlin:lint.bzl", "ktlint_fix", "ktlint_test") + +test_suite( + name = "tests", +) diff --git a/tests/versions_test.bzl b/tests/versions_test.bzl new file mode 100644 index 0000000..aa25af4 --- /dev/null +++ b/tests/versions_test.bzl @@ -0,0 +1,16 @@ +"""Unit tests for starlark helpers +""" + +load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest") + +def _smoke_test_impl(ctx): + env = unittest.begin(ctx) + asserts.equals(env, "1", "1") + return unittest.end(env) + +# The unittest library requires that we export the test cases as named test rules, +# but their names are arbitrary and don't appear anywhere. +_t0_test = unittest.make(_smoke_test_impl) + +def versions_test_suite(name): + unittest.suite(name, _t0_test)