1 /* 2 * Copyright 2018 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.build.jetifier.core.rule 18 19 import com.android.tools.build.jetifier.core.type.JavaType 20 21 /** 22 * Contains all [RewriteRule]s. 23 */ 24 class RewriteRulesMap(val rewriteRules: List<RewriteRule>) { 25 26 companion object { 27 private const val TAG = "RewriteRulesMap" 28 29 val EMPTY = RewriteRulesMap(emptyList()) 30 } 31 32 constructor(vararg rules: RewriteRule) : this(rules.toList()) 33 34 val runtimeIgnoreRules = rewriteRules.filter { it.isRuntimeIgnoreRule() }.toSet() 35 36 /** 37 * Tries to rewrite the given given type using the rules. If 38 */ 39 fun rewriteType(type: JavaType): JavaType? { 40 // Try to find a rule 41 for (rule in rewriteRules) { 42 if (rule.isIgnoreRule()) { 43 continue 44 } 45 val typeRewriteResult = rule.apply(type) 46 if (typeRewriteResult.result == null) { 47 continue 48 } 49 return typeRewriteResult.result 50 } 51 52 return null 53 } 54 55 fun reverse(): RewriteRulesMap { 56 return RewriteRulesMap(rewriteRules 57 .filter { !it.isIgnoreRule() } 58 .map { it.reverse() } 59 .toList()) 60 } 61 62 fun appendRules(rules: List<RewriteRule>): RewriteRulesMap { 63 return RewriteRulesMap(rewriteRules + rules) 64 } 65 66 fun toJson(): JsonData { 67 return JsonData(rewriteRules.map { it.toJson() }.toSet()) 68 } 69 70 /** 71 * JSON data model for [RewriteRulesMap]. 72 */ 73 data class JsonData(val rules: Set<RewriteRule.JsonData>) 74 }