diff --git a/build.gradle.kts b/build.gradle.kts index 9692403d2d2..fb29fba2d6e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -335,6 +335,7 @@ extra["tasksWithWarnings"] = listOf( ":kotlin-stdlib:compileTestKotlin", ":kotlin-stdlib-jdk7:compileTestKotlin", ":kotlin-stdlib-jdk8:compileTestKotlin", + ":plugins:uast-kotlin-base:compileKotlin", ":plugins:uast-kotlin:compileKotlin", ":plugins:uast-kotlin:compileTestKotlin", ":plugins:uast-kotlin-fir:compileKotlin", diff --git a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUFile.kt b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUFile.kt similarity index 70% rename from plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUFile.kt rename to plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUFile.kt index 5aeb9f30b53..d085db4cb99 100644 --- a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUFile.kt +++ b/plugins/uast-kotlin-base/src/org/jetbrains/uast/kotlin/declarations/KotlinUFile.kt @@ -5,6 +5,7 @@ package org.jetbrains.uast.kotlin +import com.intellij.psi.PsiClass import com.intellij.psi.PsiComment import com.intellij.psi.PsiElement import com.intellij.psi.PsiRecursiveElementWalkingVisitor @@ -15,19 +16,17 @@ import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.uast.* import java.util.ArrayList -class FirKotlinUFile( +class KotlinUFile( override val psi: KtFile, - override val languagePlugin: UastLanguagePlugin = firKotlinUastPlugin + override val languagePlugin: UastLanguagePlugin ) : UFile { override val javaPsi: PsiElement? = null override val sourcePsi: KtFile = psi - override val uAnnotations: List - get() { - // TODO: Not yet implemented - return emptyList() - } + override val uAnnotations: List by lz { + sourcePsi.annotationEntries.mapNotNull { languagePlugin.convertOpt(it, this) } + } override val packageName: String by lz { sourcePsi.packageFqName.asString() @@ -35,24 +34,24 @@ class FirKotlinUFile( override val allCommentsInFile by lz { val comments = ArrayList(0) - psi.accept(object : PsiRecursiveElementWalkingVisitor() { + sourcePsi.accept(object : PsiRecursiveElementWalkingVisitor() { override fun visitComment(comment: PsiComment) { - comments += UComment(comment, this@FirKotlinUFile) + comments += UComment(comment, this@KotlinUFile) } }) comments } override val imports: List by lz { - sourcePsi.importDirectives.map { FirKotlinUImportStatement(it, this) } + sourcePsi.importDirectives.mapNotNull { languagePlugin.convertOpt(it, this@KotlinUFile) } } override val classes: List by lz { val facadeOrScriptClass = if (sourcePsi.isScript()) sourcePsi.script?.toLightClass() else sourcePsi.findFacadeClass() val facadeOrScriptUClass = facadeOrScriptClass?.toUClass()?.let { listOf(it) } ?: emptyList() - val classes = sourcePsi.declarations.mapNotNull { (it as? KtClassOrObject)?.toUClass() } + val classes = sourcePsi.declarations.mapNotNull { (it as? KtClassOrObject)?.toLightClass()?.toUClass() } facadeOrScriptUClass + classes } - private fun PsiElement.toUClass() = languagePlugin.convertOpt(this, this@FirKotlinUFile) + private fun PsiClass.toUClass() = languagePlugin.convertOpt(this, this@KotlinUFile) } diff --git a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt index 09bce633298..a72a915a734 100644 --- a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt +++ b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt @@ -58,7 +58,7 @@ internal object FirKotlinConverter { convertKtFile(original, givenParent, requiredTypes).firstOrNull() } is FakeFileForLightClass -> { - el { FirKotlinUFile(original.navigationElement) } + el { KotlinUFile(original.navigationElement, firKotlinUastPlugin) } } is KtLightClass -> { @@ -112,7 +112,7 @@ internal object FirKotlinConverter { ): Sequence { return requiredTypes.accommodate( // File - alternative { FirKotlinUFile(element) }, + alternative { KotlinUFile(element, firKotlinUastPlugin) }, // Facade alternative { element.findFacadeClass()?.let { AbstractFirKotlinUClass.create(it, givenParent) } } ) diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt index 90b79672b36..42cde1e9fba 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt @@ -562,7 +562,7 @@ internal object KotlinConverter { is KtParameter -> convertParameter(original, givenParent, this).firstOrNull() is KtFile -> convertKtFile(original, givenParent, this).firstOrNull() - is FakeFileForLightClass -> el { KotlinUFile(original.navigationElement) } + is FakeFileForLightClass -> el { KotlinUFile(original.navigationElement, kotlinUastPlugin) } is KtAnnotationEntry -> el(build(::KotlinUAnnotation)) is KtCallExpression -> if (expectedTypes.isAssignableFrom(KotlinUNestedAnnotation::class.java) && !expectedTypes.isAssignableFrom(UCallExpression::class.java)) { @@ -680,7 +680,7 @@ internal object KotlinConverter { givenParent: UElement?, requiredTypes: Array> ): Sequence = requiredTypes.accommodate( - alternative { KotlinUFile(element) }, + alternative { KotlinUFile(element, kotlinUastPlugin) }, alternative { element.findFacadeClass()?.let { KotlinUClass.create(it, givenParent) } } ) diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUFile.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUFile.kt deleted file mode 100644 index 2247a57385f..00000000000 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUFile.kt +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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.uast.kotlin - -import com.intellij.psi.PsiClass -import com.intellij.psi.PsiComment -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiRecursiveElementWalkingVisitor -import org.jetbrains.kotlin.asJava.findFacadeClass -import org.jetbrains.kotlin.asJava.toLightClass -import org.jetbrains.kotlin.psi.KtClassOrObject -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.uast.* -import java.util.* - -class KotlinUFile( - override val psi: KtFile, - override val languagePlugin: UastLanguagePlugin = kotlinUastPlugin -) : UFile { - override val packageName: String - get() = psi.packageFqName.asString() - - override val annotations: List - get() = psi.annotationEntries.map { KotlinUAnnotation(it, this) } - - override val javaPsi: PsiElement? = null - - override val sourcePsi: KtFile = psi - - override val allCommentsInFile by lz { - val comments = ArrayList(0) - psi.accept(object : PsiRecursiveElementWalkingVisitor() { - override fun visitComment(comment: PsiComment) { - comments += UComment(comment, this@KotlinUFile) - } - }) - comments - } - - override val imports by lz { psi.importDirectives.map { KotlinUImportStatement(it, this) } } - - override val classes by lz { - val facadeOrScriptClass = if (psi.isScript()) psi.script?.toLightClass() else psi.findFacadeClass() - val classes = psi.declarations.mapNotNull { (it as? KtClassOrObject)?.toLightClass()?.toUClass() } - - (facadeOrScriptClass?.toUClass()?.let { listOf(it) } ?: emptyList()) + classes - } - - private fun PsiClass.toUClass() = languagePlugin.convertOpt(this, this@KotlinUFile) -} \ No newline at end of file