1 /*
<lambda>null2  * Copyright (C) 2020 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
18 
19 import com.android.tools.metalava.model.Item
20 import com.android.tools.metalava.model.MethodItem
21 import java.util.function.Predicate
22 
23 /**
24  * Filter that will elide exact duplicate methods that are already included in another
25  * superclass/interfaces.
26  */
27 class ElidingPredicate(
28     private val wrapped: Predicate<Item>,
29 
30     /** Whether overriding methods essential for compiling the stubs should be elided or not. */
31     private val addAdditionalOverrides: Boolean,
32 ) : Predicate<Item> {
33 
34     // Returning true means we are keeping this item
35     // i.e. when this returns false, we are eliding the item
36     override fun test(method: Item): Boolean {
37         // This method should be included, but if it's an exact duplicate
38         // override then we can elide it.
39         return if (method is MethodItem && !method.isConstructor()) {
40             val differentSuper =
41                 method.findPredicateSuperMethod(
42                     // This predicate returns true if
43                     // the potential super method has same signature
44                     Predicate { maybeEqualSuperMethod ->
45                         // We're looking for included and perfect signature
46                         wrapped.test(maybeEqualSuperMethod) &&
47                             maybeEqualSuperMethod is MethodItem &&
48                             MethodItem.sameSignature(
49                                 method,
50                                 maybeEqualSuperMethod,
51                                 addAdditionalOverrides = addAdditionalOverrides,
52                             )
53                     }
54                 )
55 
56             val doNotElideForAdditionalOverridePurpose =
57                 addAdditionalOverrides && method.isRequiredOverridingMethodForTextStub()
58 
59             differentSuper == null || doNotElideForAdditionalOverridePurpose
60         } else {
61             true
62         }
63     }
64 }
65