org.jetbrains.kotlin.cli.common.repl.replUtil.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of kotlin-compiler-embeddable Show documentation
Show all versions of kotlin-compiler-embeddable Show documentation
the Kotlin compiler embeddable
/*
* Copyright 2010-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.cli.common.repl
import com.google.common.base.Throwables
import java.io.File
import java.net.URLClassLoader
fun makeScriptBaseName(codeLine: ReplCodeLine, generation: Long) =
"Line_${codeLine.no}${if (generation > 1) "_gen_$generation" else ""}"
fun renderReplStackTrace(cause: Throwable, startFromMethodName: String): String {
val newTrace = arrayListOf()
var skip = true
for ((i, element) in cause.stackTrace.withIndex().reversed()) {
if ("${element.className}.${element.methodName}" == startFromMethodName) {
skip = false
}
if (!skip) {
newTrace.add(element)
}
}
val resultingTrace = newTrace.reversed().dropLast(1)
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UsePropertyAccessSyntax")
(cause as java.lang.Throwable).setStackTrace(resultingTrace.toTypedArray())
return Throwables.getStackTraceAsString(cause)
}
fun NO_ACTION(): Unit = Unit
fun NO_ACTION_THAT_RETURNS(v: T): T = v
internal fun ClassLoader.listAllUrlsAsFiles(): List {
val parents = generateSequence(this) { loader -> loader.parent }.filterIsInstance(URLClassLoader::class.java)
return parents.fold(emptyList()) { accum, loader ->
loader.listLocalUrlsAsFiles() + accum
}.distinct()
}
internal fun URLClassLoader.listLocalUrlsAsFiles(): List {
return this.urLs.map { it.toString().removePrefix("file:") }.filterNotNull().map(::File)
}
internal fun List.ensureNotEmpty(error: String): List {
if (this.isEmpty()) throw IllegalStateException(error)
return this
}