• 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.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 }