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