12e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets/*
22e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets * Copyright (C) 2017 The Android Open Source Project
32e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets *
42e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets * Licensed under the Apache License, Version 2.0 (the "License");
52e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets * you may not use this file except in compliance with the License.
62e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets * You may obtain a copy of the License at
72e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets *
82e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets *      http://www.apache.org/licenses/LICENSE-2.0
92e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets *
102e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets * Unless required by applicable law or agreed to in writing, software
112e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets * distributed under the License is distributed on an "AS IS" BASIS,
122e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets * See the License for the specific language governing permissions and
142e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets * limitations under the License.
152e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets */
162e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets
17bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viverettepackage androidx.lifecycle.model
182e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets
19bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.lifecycle.name
20bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.lifecycle.syntheticName
212e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinetsimport javax.lang.model.element.ExecutableElement
222e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinetsimport javax.lang.model.element.TypeElement
232e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets
242e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinetsdata class InputModel(
252e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets        // all java files with lifecycle annotations excluding classes from classpath
262e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets        private val rootTypes: Set<TypeElement>,
272e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets        // info about all lifecycle observers including classes from classpath
282e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets        val observersInfo: Map<TypeElement, LifecycleObserverInfo>,
292e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets        // info about generated adapters from class path
302e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets        val generatedAdapters: Map<TypeElement, List<ExecutableElement>>) {
312e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets
322e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets    /**
332e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets     *  Root class is class defined in currently processed module, not in classpath
342e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets     */
352e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets    fun isRootType(type: TypeElement) = type in rootTypes
362e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets
372e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets    fun hasSyntheticAccessorFor(eventMethod: EventMethod): Boolean {
382e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets        val syntheticMethods = generatedAdapters[eventMethod.type] ?: return false
392e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets        return syntheticMethods.any { executable ->
402e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets            executable.name() == syntheticName(eventMethod.method)
412e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets                    // same number + receiver object
422e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets                    && (eventMethod.method.parameters.size + 1) == executable.parameters.size
432e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets        }
442e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets    }
452e9de5a9a940a64564f9d08953cfffa84226757bSergey Vasilinets}