@@ -2,6 +2,7 @@ package org.javacs.kt.externalsources
2
2
3
3
import org.javacs.kt.util.partitionAroundLast
4
4
import org.javacs.kt.util.TemporaryDirectory
5
+ import org.javacs.kt.util.parseURI
5
6
import java.net.URI
6
7
import java.net.URL
7
8
import java.net.JarURLConnection
@@ -28,18 +29,12 @@ fun URI.toKlsURI(): KlsURI? = when (scheme) {
28
29
* Other file extensions for classes (such as .kt and .java) are supported too, in
29
30
* which case the file will directly be used without invoking the decompiler.
30
31
*/
31
- data class KlsURI (val fileUri : URI , val query : Map <QueryParam , Any >) {
32
+ data class KlsURI (val fileUri : URI , val query : Map <QueryParam , String >) {
32
33
/* * Possible KLS URI query parameters. */
33
34
enum class QueryParam (val parameterName : String ) {
34
35
SOURCE (" source" );
35
36
36
37
override fun toString (): String = parameterName
37
-
38
- companion object {
39
- val VALUE_PARSERS : Map <QueryParam , (String ) - > Any > = mapOf (
40
- Pair (QueryParam .SOURCE ) { it.toBoolean() }
41
- )
42
- }
43
38
}
44
39
45
40
private val queryString: String
@@ -54,19 +49,20 @@ data class KlsURI(val fileUri: URI, val query: Map<QueryParam, Any>) {
54
49
?.lastOrNull()
55
50
56
51
val jarPath: Path
57
- get() = Paths .get(fileUri.schemeSpecificPart.split(" !" )[0 ])
52
+ get() = Paths .get(parseURI( fileUri.schemeSpecificPart.split(" !" )[0 ]) )
58
53
val innerPath: String?
59
54
get() = fileUri.schemeSpecificPart.split(" !" , limit = 2 ).get(1 )
60
55
61
56
val source: Boolean
62
- get() = query[QueryParam .SOURCE ] as ? Boolean ? : false
57
+ get() = query[QueryParam .SOURCE ]?.toBoolean() ? : false
63
58
val isCompiled: Boolean
64
59
get() = fileExtension == " class"
65
60
66
61
constructor (uri: URI ) : this (parseKlsURIFileURI(uri), parseKlsURIQuery(uri))
67
62
68
- fun withJarPath (newJarPath : Path ): KlsURI =
69
- KlsURI (URI (newJarPath.toUri().toString() + (innerPath?.let { " !$it " } ? : " " )), query)
63
+ // If the newJarPath doesn't have the kls scheme, it is added in the returned KlsURI.
64
+ fun withJarPath (newJarPath : Path ): KlsURI ? =
65
+ URI (newJarPath.toUri().toString() + (innerPath?.let { " !$it " } ? : " " )).toKlsURI()?.let { KlsURI (it.fileUri, query) }
70
66
71
67
fun withFileExtension (newExtension : String ): KlsURI {
72
68
val (parentUri, fileName) = fileUri.toString().partitionAroundLast(" /" )
@@ -75,7 +71,7 @@ data class KlsURI(val fileUri: URI, val query: Map<QueryParam, Any>) {
75
71
}
76
72
77
73
fun withSource (source : Boolean ): KlsURI {
78
- val newQuery: MutableMap <QueryParam , Any > = mutableMapOf ()
74
+ val newQuery: MutableMap <QueryParam , String > = mutableMapOf ()
79
75
newQuery.putAll(query)
80
76
newQuery[QueryParam .SOURCE ] = source.toString()
81
77
return KlsURI (fileUri, newQuery)
@@ -120,21 +116,19 @@ data class KlsURI(val fileUri: URI, val query: Map<QueryParam, Any>) {
120
116
121
117
private fun parseKlsURIFileURI (uri : URI ): URI = URI (uri.toString().split(" ?" )[0 ])
122
118
123
- private fun parseKlsURIQuery (uri : URI ): Map <KlsURI .QueryParam , Any > = parseQuery(uri.toString().split(" ?" ).getOrElse(1 ) { " " })
119
+ private fun parseKlsURIQuery (uri : URI ): Map <KlsURI .QueryParam , String > = parseQuery(uri.toString().split(" ?" ).getOrElse(1 ) { " " })
124
120
125
- private fun parseQuery (query : String ): Map <KlsURI .QueryParam , Any > =
121
+ private fun parseQuery (query : String ): Map <KlsURI .QueryParam , String > =
126
122
query.split(" &" ).mapNotNull {
127
123
val parts = it.split(" =" )
128
124
if (parts.size == 2 ) getQueryParameter(parts[0 ], parts[1 ]) else null
129
125
}.toMap()
130
126
131
- private fun getQueryParameter (property : String , value : String ): Pair <KlsURI .QueryParam , Any >? {
127
+ private fun getQueryParameter (property : String , value : String ): Pair <KlsURI .QueryParam , String >? {
132
128
val queryParam: KlsURI .QueryParam ? = KlsURI .QueryParam .values().find { it.parameterName == property }
133
129
134
130
if (queryParam != null ) {
135
- val typeParser = KlsURI .QueryParam .VALUE_PARSERS [queryParam]
136
- val queryParamValue = typeParser?.invoke(value)
137
- return queryParamValue?.let { Pair (queryParam, it) }
131
+ return Pair (queryParam, value)
138
132
}
139
133
140
134
return null
0 commit comments