• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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