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

org.jetbrains.jet.j2k.ast.Class.kt Maven / Gradle / Ivy

There is a newer version: 2.0.0
Show newest version
/*
 * Copyright 2010-2013 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.jet.j2k.ast

import org.jetbrains.jet.j2k.*

open class Class(
        val name: Identifier,
        annotations: Annotations,
        modifiers: Modifiers,
        val typeParameterList: TypeParameterList,
        val extendsTypes: List,
        val baseClassParams: List,
        val implementsTypes: List,
        val body: ClassBody
) : Member(annotations, modifiers) {

    override fun generateCode(builder: CodeBuilder) {
        builder.append(body.factoryFunctions, "\n", "", "\n\n")

        builder.append(annotations)
                .appendWithSpaceAfter(presentationModifiers())
                .append(keyword)
                .append(" ")
                .append(name)
                .append(typeParameterList)

        if (body.primaryConstructorSignature != null) {
            builder.append(body.primaryConstructorSignature)
        }

        appendBaseTypes(builder)
        typeParameterList.appendWhere(builder)

        body.append(builder)
    }

    protected open val keyword: String
        get() = "class"

    protected fun appendBaseTypes(builder: CodeBuilder) {
        builder.append(baseClassSignatureWithParams(builder) + implementsTypes.map { { builder.append(it) } }, ", ", ":")
    }

    private fun baseClassSignatureWithParams(builder: CodeBuilder): List<() -> CodeBuilder> {
        if (keyword.equals("class") && extendsTypes.size() == 1) {
            return listOf({
                              builder append extendsTypes[0] append "("
                              builder.append(baseClassParams, ", ")
                              builder append ")"
                          })
        }
        return extendsTypes.map { { builder.append(it) } }
    }

    protected open fun presentationModifiers(): Modifiers
            = if (modifiers.contains(Modifier.ABSTRACT)) modifiers.without(Modifier.OPEN) else modifiers
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy