• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
<lambda>null2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.tools.metalava.cli.signature
18 
19 import com.android.tools.metalava.OptionsDelegate
20 import com.android.tools.metalava.cli.common.DefaultSignatureFileLoader
21 import com.android.tools.metalava.cli.common.MetalavaSubCommand
22 import com.android.tools.metalava.cli.common.existingFile
23 import com.android.tools.metalava.cli.common.newFile
24 import com.android.tools.metalava.cli.common.progressTracker
25 import com.android.tools.metalava.createReportFile
26 import com.android.tools.metalava.model.Codebase
27 import com.android.tools.metalava.model.text.SignatureFile
28 import com.android.tools.metalava.model.visitors.ApiPredicate
29 import com.android.tools.metalava.model.visitors.ApiType
30 import com.android.tools.metalava.model.visitors.FilteringApiVisitor
31 import com.github.ajalt.clikt.parameters.arguments.argument
32 import com.github.ajalt.clikt.parameters.arguments.multiple
33 import com.github.ajalt.clikt.parameters.options.option
34 import com.github.ajalt.clikt.parameters.options.required
35 
36 const val ARG_OUT = "--out"
37 
38 class SignatureToDexCommand :
39     MetalavaSubCommand(
40         help = "Convert API signature files into a file containing a list of DEX signatures.",
41     ) {
42 
43     private val apiFiles by
44         argument(
45                 name = "<api-file>",
46                 help = "API signature files to convert to DEX signatures.",
47             )
48             .existingFile()
49             .multiple(required = true)
50 
51     private val outFile by
52         option(
53                 ARG_OUT,
54                 help = "Output DEX signatures file.",
55             )
56             .newFile()
57             .required()
58 
59     override fun run() {
60         // Make sure that none of the code called by this command accesses the global `options`
61         // property.
62         OptionsDelegate.disallowAccess()
63 
64         val codebaseConfig = Codebase.Config.NOOP
65         val signatureFileLoader = DefaultSignatureFileLoader(codebaseConfig)
66         val signatureApi = signatureFileLoader.load(SignatureFile.fromFiles(apiFiles))
67 
68         val apiPredicateConfig = ApiPredicate.Config()
69         val apiType = ApiType.ALL
70         val apiFilters = apiType.getApiFilters(apiPredicateConfig)
71 
72         createReportFile(progressTracker, signatureApi, outFile, "DEX API") { printWriter ->
73             DexApiWriter(
74                     printWriter,
75                 )
76                 .let { dexApiWriter ->
77                     FilteringApiVisitor(
78                         dexApiWriter,
79                         inlineInheritedFields = true,
80                         apiFilters = apiFilters,
81                         preFiltered = signatureApi.preFiltered,
82                     )
83                 }
84         }
85     }
86 }
87