All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jetbrains.kotlin.preprocessor.Conditional.kt Maven / Gradle / Ivy

There is a newer version: 2.1.0-Beta1
Show newest version
/*
 * Copyright 2010-2015 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.preprocessor

import org.jetbrains.kotlin.psi.*

interface Conditional {

    interface PlatformVersion : Conditional

    abstract class Parser(val name: String, val parse: (arguments: PositionalAndNamedArguments) -> Conditional)

    data class JvmVersion(val minimum: Int, val maximum: Int): PlatformVersion {
        val versionRange: IntRange = minimum..maximum
        companion object : Parser("JvmVersion", parse = { arguments ->
            val minimum = arguments[0, "minimum"]?.parseIntegerValue()
            val maximum = arguments[1, "maximum"]?.parseIntegerValue()

            JvmVersion(minimum ?: 6, maximum ?: 100)
        })
    }

    data class JsVersion(val version: Int = 5): PlatformVersion {
        companion object : Parser("JsVersion", parse = { JsVersion() })
    }

    data class TargetName(val name: String): Conditional {
        companion object : Parser("RenameOnTargetPlatform", parse = { arguments ->
            val name = arguments[0, "name"]!!.parseStringValue()
            TargetName(name)
        })
    }


    companion object {
        val ANNOTATIONS: Map = listOf(JvmVersion, JsVersion, TargetName).associateBy { it.name }
    }
}

fun KtAnnotated.parseConditionalAnnotations(): List =
        annotationEntries.map {
            val parser = Conditional.ANNOTATIONS.get(it.typeReferenceName)
            parser?.parse?.invoke(it.valueArguments.splitToPositionalAndNamed())
        }.filterNotNull()


val KtAnnotationEntry.typeReferenceName: String? get() =
        (typeReference?.typeElement as? KtUserType)?.referencedName





© 2015 - 2024 Weber Informatics LLC | Privacy Policy