Skip to content

Commit 04da62f

Browse files
authored
Merge pull request #300 from daplf/fix-go-to-definition
Fix Go To Definition
2 parents 9cf8d00 + 126bed6 commit 04da62f

File tree

2 files changed

+13
-19
lines changed

2 files changed

+13
-19
lines changed

server/src/main/kotlin/org/javacs/kt/externalsources/JarClassContentProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class JarClassContentProvider(
3535
* If the file is inside a source JAR, the source code is returned as is.
3636
*/
3737
public fun contentOf(uri: KlsURI): Pair<KlsURI, String> {
38-
val resolvedUri = sourceJarProvider.fetchSourceJar(uri.jarPath)?.let(uri::withJarPath) ?: uri
38+
val resolvedUri = sourceJarProvider.fetchSourceJar(uri.jarPath)?.let(uri.withSource(true)::withJarPath) ?: uri
3939
val key = resolvedUri.toString()
4040
val (contents, extension) = cachedContents[key] ?: run {
4141
LOG.info("Finding contents of {}", describeURI(uri.fileUri))

server/src/main/kotlin/org/javacs/kt/externalsources/KlsURI.kt

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package org.javacs.kt.externalsources
22

33
import org.javacs.kt.util.partitionAroundLast
44
import org.javacs.kt.util.TemporaryDirectory
5+
import org.javacs.kt.util.parseURI
56
import java.net.URI
67
import java.net.URL
78
import java.net.JarURLConnection
@@ -28,18 +29,12 @@ fun URI.toKlsURI(): KlsURI? = when (scheme) {
2829
* Other file extensions for classes (such as .kt and .java) are supported too, in
2930
* which case the file will directly be used without invoking the decompiler.
3031
*/
31-
data class KlsURI(val fileUri: URI, val query: Map<QueryParam, Any>) {
32+
data class KlsURI(val fileUri: URI, val query: Map<QueryParam, String>) {
3233
/** Possible KLS URI query parameters. */
3334
enum class QueryParam(val parameterName: String) {
3435
SOURCE("source");
3536

3637
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-
}
4338
}
4439

4540
private val queryString: String
@@ -54,19 +49,20 @@ data class KlsURI(val fileUri: URI, val query: Map<QueryParam, Any>) {
5449
?.lastOrNull()
5550

5651
val jarPath: Path
57-
get() = Paths.get(fileUri.schemeSpecificPart.split("!")[0])
52+
get() = Paths.get(parseURI(fileUri.schemeSpecificPart.split("!")[0]))
5853
val innerPath: String?
5954
get() = fileUri.schemeSpecificPart.split("!", limit = 2).get(1)
6055

6156
val source: Boolean
62-
get() = query[QueryParam.SOURCE] as? Boolean ?: false
57+
get() = query[QueryParam.SOURCE]?.toBoolean() ?: false
6358
val isCompiled: Boolean
6459
get() = fileExtension == "class"
6560

6661
constructor(uri: URI) : this(parseKlsURIFileURI(uri), parseKlsURIQuery(uri))
6762

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) }
7066

7167
fun withFileExtension(newExtension: String): KlsURI {
7268
val (parentUri, fileName) = fileUri.toString().partitionAroundLast("/")
@@ -75,7 +71,7 @@ data class KlsURI(val fileUri: URI, val query: Map<QueryParam, Any>) {
7571
}
7672

7773
fun withSource(source: Boolean): KlsURI {
78-
val newQuery: MutableMap<QueryParam, Any> = mutableMapOf()
74+
val newQuery: MutableMap<QueryParam, String> = mutableMapOf()
7975
newQuery.putAll(query)
8076
newQuery[QueryParam.SOURCE] = source.toString()
8177
return KlsURI(fileUri, newQuery)
@@ -120,21 +116,19 @@ data class KlsURI(val fileUri: URI, val query: Map<QueryParam, Any>) {
120116

121117
private fun parseKlsURIFileURI(uri: URI): URI = URI(uri.toString().split("?")[0])
122118

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) { "" })
124120

125-
private fun parseQuery(query: String): Map<KlsURI.QueryParam, Any> =
121+
private fun parseQuery(query: String): Map<KlsURI.QueryParam, String> =
126122
query.split("&").mapNotNull {
127123
val parts = it.split("=")
128124
if (parts.size == 2) getQueryParameter(parts[0], parts[1]) else null
129125
}.toMap()
130126

131-
private fun getQueryParameter(property: String, value: String): Pair<KlsURI.QueryParam, Any>? {
127+
private fun getQueryParameter(property: String, value: String): Pair<KlsURI.QueryParam, String>? {
132128
val queryParam: KlsURI.QueryParam? = KlsURI.QueryParam.values().find { it.parameterName == property }
133129

134130
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)
138132
}
139133

140134
return null

0 commit comments

Comments
 (0)