1 /* 2 * Copyright (C) 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.metalava.model.text 18 19 import com.android.tools.metalava.model.TypeParameterItem 20 import com.android.tools.metalava.model.TypeParameterList 21 import com.android.tools.metalava.model.TypeParameterListOwner 22 23 class TextTypeParameterList( 24 val codebase: TextCodebase, 25 var owner: TypeParameterListOwner?, 26 private val typeListString: String 27 ) : TypeParameterList { 28 private var typeParameters: List<TypeParameterItem>? = null 29 private var typeParameterNames: List<String>? = null 30 toStringnull31 override fun toString(): String = typeListString 32 33 override fun typeParameterNames(): List<String> { 34 if (typeParameterNames == null) { 35 // TODO: Delete this method now that I'm doing it differently: typeParameterNames(typeListString) 36 val typeParameters = typeParameters() 37 val names = ArrayList<String>(typeParameters.size) 38 for (parameter in typeParameters) { 39 names.add(parameter.simpleName()) 40 } 41 typeParameterNames = names 42 } 43 return typeParameterNames!! 44 } 45 typeParametersnull46 override fun typeParameters(): List<TypeParameterItem> { 47 if (typeParameters == null) { 48 val strings = typeParameterStrings(typeListString) 49 val list = ArrayList<TypeParameterItem>(strings.size) 50 strings.mapTo(list) { TextTypeParameterItem.create(codebase, owner, it) } 51 typeParameters = list 52 } 53 return typeParameters!! 54 } 55 56 companion object { createnull57 fun create(codebase: TextCodebase, owner: TypeParameterListOwner?, typeListString: String): TypeParameterList { 58 return TextTypeParameterList(codebase, owner, typeListString) 59 } 60 typeParameterStringsnull61 fun typeParameterStrings(typeString: String?): List<String> { 62 val s = typeString ?: return emptyList() 63 val list = mutableListOf<String>() 64 var balance = 0 65 var expect = false 66 var start = 0 67 for (i in s.indices) { 68 val c = s[i] 69 if (c == '<') { 70 balance++ 71 expect = balance == 1 72 } else if (c == '>') { 73 balance-- 74 if (balance == 1) { 75 add(list, s, start, i + 1) 76 start = i + 1 77 } else if (balance == 0) { 78 add(list, s, start, i) 79 return list 80 } 81 } else if (c == ',') { 82 expect = if (balance == 1) { 83 add(list, s, start, i) 84 true 85 } else { 86 false 87 } 88 } else if (expect && balance == 1) { 89 start = i 90 expect = false 91 } 92 } 93 return list 94 } 95 addnull96 private fun add(list: MutableList<String>, s: String, from: Int, to: Int) { 97 for (i in from until to) { 98 if (!Character.isWhitespace(s[i])) { 99 list.add(s.substring(i, to)) 100 return 101 } 102 } 103 } 104 } 105 } 106