Kotlin Uast: Initial implementation
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* 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.lint
|
||||
|
||||
import com.android.tools.lint.client.api.LintLanguageExtension
|
||||
import org.jetbrains.kotlin.uast.KotlinConverter
|
||||
|
||||
class KotlinLintLanguageExtension : LintLanguageExtension() {
|
||||
override fun getConverter() = KotlinConverter
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.impl.source.tree.LeafPsiElement
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.uast.*
|
||||
|
||||
object KotlinConverter : UastConverter {
|
||||
override fun isFileSupported(path: String) = path.endsWith(".kt", false) || path.endsWith(".kts", false)
|
||||
|
||||
override fun convert(element: Any?, parent: UElement): UElement? {
|
||||
if (element !is KtElement) return null
|
||||
return convertKtElement(element, parent)
|
||||
}
|
||||
|
||||
override fun convertWithParent(element: Any?): UElement? {
|
||||
if (element !is KtElement) return null
|
||||
if (element is KtFile) return KotlinUFile(element)
|
||||
|
||||
val parent = element.parent ?: return null
|
||||
val parentUElement = convertWithParent(parent) ?: return null
|
||||
return convertKtElement(element, parentUElement)
|
||||
}
|
||||
|
||||
private fun convertKtElement(element: KtElement?, parent: UElement): UElement? = when (element) {
|
||||
is KtFile -> KotlinUFile(element)
|
||||
is KtAnnotationEntry -> KotlinUAnnotation(element, parent)
|
||||
is KtAnnotation -> KotlinUAnnotationList(element, parent).apply {
|
||||
annotations = element.entries.map { KotlinUAnnotation(it, this) }
|
||||
}
|
||||
is KtDeclaration -> convert(element, parent)
|
||||
is KtImportDirective -> KotlinUImportStatement(element, parent)
|
||||
is KtCatchClause -> KotlinUCatchClause(element, parent)
|
||||
is KtExpression -> KotlinConverter.convert(element, parent)
|
||||
else -> {
|
||||
if (element is LeafPsiElement && element.elementType == KtTokens.IDENTIFIER) {
|
||||
asSimpleReference(element, parent)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal fun convert(element: KtDeclaration, parent: UElement): UDeclaration? = when (element) {
|
||||
is KtClassOrObject -> KotlinUClass(element, parent)
|
||||
is KtConstructor<*> -> KotlinConstructorUFunction(element, parent)
|
||||
is KtFunction -> KotlinUFunction(element, parent)
|
||||
is KtVariableDeclaration -> KotlinUVariable(element, parent)
|
||||
is KtParameter -> convert(element, parent)
|
||||
else -> null
|
||||
}
|
||||
|
||||
private fun convertStringTemplateExpression(
|
||||
expression: KtStringTemplateExpression,
|
||||
parent: UElement,
|
||||
i: Int
|
||||
): UExpression {
|
||||
return if (i == 1) KotlinStringTemplateUBinaryExpression(expression, parent).apply {
|
||||
leftOperand = convert(expression.entries[0], this)
|
||||
rightOperand = convert(expression.entries[1], this)
|
||||
} else KotlinStringTemplateUBinaryExpression(expression, parent).apply {
|
||||
leftOperand = convertStringTemplateExpression(expression, parent, i - 1)
|
||||
rightOperand = convert(expression.entries[i], this)
|
||||
}
|
||||
}
|
||||
|
||||
internal fun convert(entry: KtStringTemplateEntry, parent: UElement): UExpression = when (entry) {
|
||||
is KtStringTemplateEntryWithExpression -> convertOrEmpty(entry.expression, parent)
|
||||
else -> KotlinStringULiteralExpression(entry, parent)
|
||||
}
|
||||
|
||||
internal fun convert(expression: KtExpression, parent: UElement): UExpression = when (expression) {
|
||||
is KtFunction -> convertDeclaration(expression, parent)
|
||||
is KtVariableDeclaration -> convertDeclaration(expression, parent)
|
||||
is KtClass -> convertDeclaration(expression, parent)
|
||||
|
||||
is KtStringTemplateExpression -> {
|
||||
if (expression.entries.size == 1)
|
||||
convert(expression.entries[0], parent)
|
||||
else
|
||||
convertStringTemplateExpression(expression, parent, expression.entries.size - 1)
|
||||
}
|
||||
is KtDestructuringDeclaration -> KotlinUDeclarationsExpression(parent).apply {
|
||||
val tempAssignment = KotlinDestructuringUVariable(expression, this)
|
||||
val destructuringAssignments = expression.entries.mapIndexed { i, entry ->
|
||||
KotlinDestructuredUVariable(entry, this).apply {
|
||||
initializer = KotlinUComponentQualifiedExpression(entry, this).apply {
|
||||
receiver = KotlinStringUSimpleReferenceExpression(tempAssignment.name, this)
|
||||
selector = KotlinUComponentFunctionCallExpression(entry, i + 1, this)
|
||||
}
|
||||
}
|
||||
}
|
||||
declarations = listOf(tempAssignment) + destructuringAssignments
|
||||
}
|
||||
is KtStringTemplateEntry -> convertOrEmpty(expression.expression, parent)
|
||||
is KtDotQualifiedExpression -> KotlinUQualifiedExpression(expression, parent)
|
||||
is KtSafeQualifiedExpression -> KotlinUSafeQualifiedExpression(expression, parent)
|
||||
is KtSimpleNameExpression -> KotlinUSimpleReferenceExpression(expression, expression.getReferencedName(), parent)
|
||||
is KtCallExpression -> KotlinUFunctionCallExpression(expression, parent)
|
||||
is KtBinaryExpression -> KotlinUBinaryExpression(expression, parent)
|
||||
is KtParenthesizedExpression -> KotlinUParenthesizedExpression(expression, parent)
|
||||
is KtPrefixExpression -> KotlinUPrefixExpression(expression, parent)
|
||||
is KtPostfixExpression -> KotlinUPostfixExpression(expression, parent)
|
||||
is KtThisExpression -> KotlinUThisExpression(expression, parent)
|
||||
is KtSuperExpression -> KotlinUSuperExpression(expression, parent)
|
||||
is KtIsExpression -> KotlinUTypeCheckExpression(expression, parent)
|
||||
is KtIfExpression -> KotlinUIfExpression(expression, parent)
|
||||
is KtWhileExpression -> KotlinUWhileExpression(expression, parent)
|
||||
is KtDoWhileExpression -> KotlinUDoWhileExpression(expression, parent)
|
||||
is KtForExpression -> KotlinUForEachExpression(expression, parent)
|
||||
is KtWhenExpression -> KotlinUSwitchExpression(expression, parent)
|
||||
is KtBreakExpression -> KotlinUSpecialExpressionList.Empty(expression, UastSpecialExpressionKind.BREAK, parent)
|
||||
is KtContinueExpression -> KotlinUSpecialExpressionList.Empty(expression, UastSpecialExpressionKind.CONTINUE, parent)
|
||||
is KtReturnExpression -> KotlinUSpecialExpressionList(expression, UastSpecialExpressionKind.RETURN, parent).apply {
|
||||
expressions = listOf(convertOrEmpty(expression.returnedExpression, this))
|
||||
}
|
||||
is KtThrowExpression -> KotlinUSpecialExpressionList(expression, UastSpecialExpressionKind.THROW, parent).apply {
|
||||
expressions = singletonListOrEmpty(convertOrNull(expression.thrownExpression, this))
|
||||
}
|
||||
is KtBlockExpression -> KotlinUBlockExpression(expression, parent)
|
||||
is KtConstantExpression -> KotlinULiteralExpression(expression, parent)
|
||||
is KtTryExpression -> KotlinUTryExpression(expression, parent)
|
||||
is KtArrayAccessExpression -> KotlinUArrayAccess(expression, parent)
|
||||
is KtLambdaExpression -> KotlinULambdaExpression(expression, parent)
|
||||
is KtBinaryExpressionWithTypeRHS -> KotlinUBinaryExpressionWithType(expression, parent)
|
||||
|
||||
else -> UnknownKotlinExpression(expression, parent)
|
||||
}
|
||||
|
||||
internal fun convert(element: KtParameter, parent: UElement) : UVariable {
|
||||
return KotlinParameterUVariable(element, parent)
|
||||
}
|
||||
|
||||
internal fun convert(element: KotlinType, project: Project, parent: UElement?): UType {
|
||||
return KotlinUType(element, project, parent)
|
||||
}
|
||||
|
||||
internal fun convert(typeReference: KtTypeReference?, parent: UElement): UType {
|
||||
if (typeReference == null) return KotlinUErrorType
|
||||
val bindingContext = typeReference.analyze(BodyResolveMode.PARTIAL)
|
||||
val type = bindingContext[BindingContext.TYPE, typeReference] ?: return KotlinUErrorType
|
||||
return convert(type, typeReference.project, parent)
|
||||
}
|
||||
|
||||
internal fun asSimpleReference(element: PsiElement?, parent: UElement): USimpleReferenceExpression? {
|
||||
if (element == null) return null
|
||||
return KotlinUSimpleReferenceExpression(element, KtPsiUtil.unquoteIdentifier(element.text), parent)
|
||||
}
|
||||
|
||||
internal fun convertOrEmpty(expression: KtExpression?, parent: UElement): UExpression {
|
||||
return if (expression != null) convert(expression, parent) else EmptyExpression(parent)
|
||||
}
|
||||
|
||||
internal fun convertOrNull(expression: KtExpression?, parent: UElement): UExpression? {
|
||||
return if (expression != null) convert(expression, parent) else null
|
||||
}
|
||||
|
||||
private fun convertDeclaration(declaration: KtDeclaration, parent: UElement): UExpression {
|
||||
val udeclarations = mutableListOf<UElement>()
|
||||
return SimpleUDeclarationsExpression(parent, udeclarations).apply {
|
||||
convert(declaration, this)?.let { udeclarations += it }
|
||||
}
|
||||
}
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.uast.NoTraverse
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinPsiElementStub(
|
||||
override val psi: PsiElement,
|
||||
override val parent: UElement
|
||||
) : UElement, PsiElementBacked, NoTraverse {
|
||||
override fun logString() = "KotlinPsiElementStub"
|
||||
override fun renderString() = "<stub@$psi>"
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||
import org.jetbrains.kotlin.psi.KtAnnotationEntry
|
||||
import org.jetbrains.kotlin.psi.KtUserType
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.uast.*
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUAnnotation(
|
||||
override val psi: KtAnnotationEntry,
|
||||
override val parent: UElement
|
||||
) : UAnnotation, PsiElementBacked {
|
||||
override val fqName: String?
|
||||
get() = resolveToDescriptor()?.fqNameSafe?.asString()
|
||||
|
||||
override val name: String
|
||||
get() = (psi.typeReference?.typeElement as? KtUserType)?.referencedName.orAnonymous()
|
||||
|
||||
override val valueArguments by lz {
|
||||
psi.valueArguments.map {
|
||||
val name = it.getArgumentName()?.asName?.identifier.orAnonymous()
|
||||
UNamedExpression(name, this).apply {
|
||||
expression = KotlinConverter.convertOrEmpty(it.getArgumentExpression(), this)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun resolveToDescriptor(): ClassDescriptor? {
|
||||
val bindingContext = psi.analyze(BodyResolveMode.PARTIAL)
|
||||
val resolvedCall = psi.calleeExpression?.getResolvedCall(bindingContext) ?: return null
|
||||
return (resolvedCall.resultingDescriptor as? ConstructorDescriptor)?.containingDeclaration
|
||||
}
|
||||
|
||||
override fun resolve(context: UastContext): UClass? {
|
||||
val classDescriptor = resolveToDescriptor() ?: return null
|
||||
val source = DescriptorToSourceUtilsIde.getAnyDeclaration(psi.project, classDescriptor) ?: return null
|
||||
return context.convert(source) as? UClass
|
||||
}
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtAnnotation
|
||||
import org.jetbrains.uast.UAnnotation
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UastHandler
|
||||
import org.jetbrains.uast.handleTraverseList
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUAnnotationList(
|
||||
override val psi: KtAnnotation,
|
||||
override val parent: UElement
|
||||
) : UElement, PsiElementBacked {
|
||||
lateinit var annotations: List<UAnnotation>
|
||||
|
||||
override fun logString() = "KotlinUAnnotationList"
|
||||
override fun renderString() = annotations.joinToString(" ") { it.renderString() }
|
||||
override fun traverse(handler: UastHandler) {
|
||||
annotations.handleTraverseList(handler)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.codegen.ClassBuilderMode
|
||||
import org.jetbrains.kotlin.codegen.state.IncompatibleClassTracker
|
||||
import org.jetbrains.kotlin.codegen.state.JetTypeMapper
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.fileClasses.NoResolveFileClassesProvider
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
||||
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||
import org.jetbrains.kotlin.psi.KtClass
|
||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||
import org.jetbrains.kotlin.psi.KtObjectDeclaration
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.kotlin.types.typeUtil.supertypes
|
||||
import org.jetbrains.uast.*
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUClass(
|
||||
override val psi: KtClassOrObject,
|
||||
override val parent: UElement
|
||||
) : UClass, PsiElementBacked {
|
||||
override val name: String
|
||||
get() = psi.name.orAnonymous()
|
||||
|
||||
override val nameElement by lz { KotlinConverter.asSimpleReference(psi.nameIdentifier, this) }
|
||||
|
||||
override val fqName: String?
|
||||
get() = psi.fqName?.asString()
|
||||
|
||||
override val isEnum: Boolean
|
||||
get() = (psi as? KtClass)?.isEnum() ?: false
|
||||
|
||||
override val isInterface: Boolean
|
||||
get() = (psi as? KtClass)?.isInterface() ?: false
|
||||
|
||||
override val isObject: Boolean
|
||||
get() = psi is KtObjectDeclaration
|
||||
|
||||
override val isAnnotation: Boolean
|
||||
get() = psi.isAnnotation()
|
||||
|
||||
override val isAnonymous = false
|
||||
|
||||
override val internalName by lz {
|
||||
val descriptor = resolveToDescriptor() ?: return@lz null
|
||||
val typeMapper = JetTypeMapper(BindingContext.EMPTY, ClassBuilderMode.LIGHT_CLASSES, NoResolveFileClassesProvider, null,
|
||||
IncompatibleClassTracker.DoNothing, JvmAbi.DEFAULT_MODULE_NAME)
|
||||
typeMapper.mapClass(descriptor).internalName
|
||||
}
|
||||
|
||||
override fun getSuperClass(context: UastContext): UClass? {
|
||||
val superClass = resolveToDescriptor()?.getSuperClassOrAny() ?: return null
|
||||
val source = DescriptorToSourceUtilsIde.getAnyDeclaration(psi.project, superClass) ?: return null
|
||||
return context.convert(source) as? UClass
|
||||
}
|
||||
|
||||
override fun hasModifier(modifier: UastModifier) = psi.hasModifier(modifier)
|
||||
|
||||
override val declarations by lz {
|
||||
val primaryConstructor = psi.getPrimaryConstructor()?.let { KotlinConverter.convert(it, this) }
|
||||
val declarations = psi.declarations.map { KotlinConverter.convert(it, this) }.filterNotNull()
|
||||
if (primaryConstructor != null) listOf(primaryConstructor) + declarations else declarations
|
||||
}
|
||||
|
||||
override val superTypes by lz {
|
||||
val superTypes = resolveToDescriptor()?.typeConstructor?.supertypes ?: return@lz emptyList<UType>()
|
||||
superTypes.map { KotlinConverter.convert(it, psi.project, this) }
|
||||
}
|
||||
|
||||
override val annotations by lz { psi.getUastAnnotations(this) }
|
||||
|
||||
override val visibility by lz { psi.getVisibility() }
|
||||
|
||||
override fun isSubclassOf(name: String): Boolean {
|
||||
val descriptor = psi.resolveToDescriptorIfAny() as? ClassDescriptor ?: return false
|
||||
return descriptor.defaultType.supertypes().any {
|
||||
it.constructor.declarationDescriptor?.fqNameSafe?.asString() == name
|
||||
}
|
||||
}
|
||||
|
||||
private fun resolveToDescriptor(): ClassDescriptor? {
|
||||
val bindingContext = psi.analyze(BodyResolveMode.PARTIAL)
|
||||
return bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, psi] as? ClassDescriptor
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.uast.UFile
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUFile(override val psi: KtFile): UFile, PsiElementBacked {
|
||||
override val packageFqName by lz {
|
||||
val packageName = psi.packageFqName.asString()
|
||||
if (packageName.isNotBlank()) packageName else null
|
||||
}
|
||||
|
||||
override val declarations by lz { psi.declarations.map { KotlinConverter.convert(it, this) }.filterNotNull() }
|
||||
override val importStatements by lz { psi.importDirectives.map { KotlinUImportStatement(it, this) } }
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtImportDirective
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UImportStatement
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUImportStatement(
|
||||
override val psi: KtImportDirective,
|
||||
override val parent: UElement
|
||||
) : UImportStatement, PsiElementBacked {
|
||||
override val nameToImport = psi.importedFqName?.asString()
|
||||
|
||||
override val isStarImport: Boolean
|
||||
get() = psi.isAllUnder
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import com.intellij.openapi.project.Project
|
||||
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.types.typeUtil.isBooleanOrNullableBoolean
|
||||
import org.jetbrains.uast.*
|
||||
|
||||
class KotlinUType(
|
||||
val type: KotlinType,
|
||||
val project: Project,
|
||||
override val parent: UElement?
|
||||
) : UType {
|
||||
override val name: String
|
||||
get() = type.toString()
|
||||
|
||||
override val fqName: String?
|
||||
get() = type.constructor.declarationDescriptor?.fqNameSafe?.asString()
|
||||
|
||||
override val isInt = name == "Int"
|
||||
|
||||
override fun resolve(context: UastContext): UClass? {
|
||||
val descriptor = type.constructor.declarationDescriptor ?: return null
|
||||
val sourceElement = DescriptorToSourceUtilsIde.getAnyDeclaration(project, descriptor) ?: return null
|
||||
return context.convert(sourceElement) as? UClass
|
||||
}
|
||||
|
||||
override val isBoolean: Boolean
|
||||
get() = type.isBooleanOrNullableBoolean()
|
||||
|
||||
//TODO
|
||||
override val annotations = emptyList<UAnnotation>()
|
||||
}
|
||||
|
||||
object KotlinUErrorType : UType, NoAnnotations {
|
||||
override val isInt = false
|
||||
override val parent = null
|
||||
override val name = "<error>"
|
||||
override val fqName = null
|
||||
override val isBoolean = false
|
||||
override fun resolve(context: UastContext) = null
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.uast.*
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
open class KotlinUVariable(
|
||||
override val psi: KtVariableDeclaration,
|
||||
override val parent: UElement
|
||||
) : UVariable, PsiElementBacked {
|
||||
override val name: String
|
||||
get() = psi.name.orAnonymous()
|
||||
|
||||
override val nameElement by lz { KotlinConverter.asSimpleReference(psi.nameIdentifier, this) }
|
||||
|
||||
override val initializer by lz { KotlinConverter.convertOrEmpty(psi.initializer, this) }
|
||||
|
||||
override val type by lz {
|
||||
val descriptor = psi.resolveToDescriptorIfAny() as? CallableDescriptor ?: return@lz KotlinUErrorType
|
||||
val type = descriptor.returnType ?: return@lz KotlinUErrorType
|
||||
KotlinConverter.convert(type, psi.project, this)
|
||||
}
|
||||
|
||||
override val kind: UastVariableKind
|
||||
get() = when (psi.parent) {
|
||||
is KtClassBody -> UastVariableKind.MEMBER
|
||||
is KtClassOrObject -> UastVariableKind.MEMBER
|
||||
else -> UastVariableKind.LOCAL_VARIABLE
|
||||
}
|
||||
|
||||
override fun hasModifier(modifier: UastModifier) = psi.hasModifier(modifier)
|
||||
override val annotations by lz { psi.getUastAnnotations(this) }
|
||||
}
|
||||
|
||||
class KotlinDestructuredUVariable(
|
||||
val entry: KtDestructuringDeclarationEntry,
|
||||
parent: UElement
|
||||
) : KotlinUVariable(entry, parent) {
|
||||
override lateinit var initializer: UExpression
|
||||
|
||||
override val type by lz {
|
||||
val bindingContext = entry.analyze(BodyResolveMode.PARTIAL)
|
||||
val resolvedCall = bindingContext[BindingContext.COMPONENT_RESOLVED_CALL, entry] ?: return@lz KotlinUErrorType
|
||||
val returnType = resolvedCall.resultingDescriptor.returnType ?: return@lz KotlinUErrorType
|
||||
KotlinConverter.convert(returnType, entry.project, this)
|
||||
}
|
||||
}
|
||||
|
||||
class KotlinDestructuringUVariable(
|
||||
override val psi: KtDestructuringDeclaration,
|
||||
override val parent: UElement
|
||||
) : UVariable, PsiElementBacked {
|
||||
override val name = "var" + psi.text.hashCode()
|
||||
override val initializer by lz { KotlinConverter.convertOrEmpty(psi.initializer, this) }
|
||||
override val kind = UastVariableKind.LOCAL_VARIABLE
|
||||
override val type: UType
|
||||
get() = initializer.getExpressionType() ?: KotlinUErrorType
|
||||
|
||||
override val nameElement = null
|
||||
override fun hasModifier(modifier: UastModifier) = false
|
||||
override val annotations = emptyList<UAnnotation>()
|
||||
}
|
||||
|
||||
class KotlinParameterUVariable(
|
||||
override val psi: KtParameter,
|
||||
override val parent: UElement
|
||||
) : UVariable, PsiElementBacked {
|
||||
override val name: String
|
||||
get() = psi.name.orAnonymous()
|
||||
|
||||
override val nameElement by lz { KotlinConverter.asSimpleReference(psi.nameIdentifier, this) }
|
||||
|
||||
override val initializer by lz { KotlinConverter.convertOrEmpty(psi.defaultValue, this) }
|
||||
|
||||
override val kind = UastVariableKind.VALUE_PARAMETER
|
||||
|
||||
override val type by lz {
|
||||
val bindingContext = psi.analyze(BodyResolveMode.PARTIAL)
|
||||
val param = bindingContext[BindingContext.VALUE_PARAMETER, psi] ?: return@lz KotlinUErrorType
|
||||
KotlinConverter.convert(param.type, psi.project, this)
|
||||
}
|
||||
|
||||
override fun hasModifier(modifier: UastModifier) = psi.hasModifier(modifier)
|
||||
override val annotations = psi.getUastAnnotations(this)
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
||||
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||
import org.jetbrains.kotlin.psi.KtConstructor
|
||||
import org.jetbrains.kotlin.psi.KtFunction
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.uast.*
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
abstract class KotlinAbstractUFunction : UFunction, PsiElementBacked {
|
||||
override abstract val psi: KtFunction
|
||||
|
||||
override val name by lz { psi.name.orAnonymous() }
|
||||
|
||||
override val valueParameterCount: Int
|
||||
get() = psi.valueParameters.size
|
||||
|
||||
override val valueParameters by lz { psi.valueParameters.map { KotlinConverter.convert(it, this) } }
|
||||
|
||||
override fun getSuperFunctions(context: UastContext): List<UFunction> {
|
||||
val bindingContext = psi.analyze(BodyResolveMode.PARTIAL)
|
||||
val clazz = bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, psi] as? FunctionDescriptor ?: return emptyList()
|
||||
return clazz.overriddenDescriptors.map {
|
||||
context.convert(DescriptorToSourceUtilsIde.getAnyDeclaration(psi.getProject(), it)) as? UFunction
|
||||
}.filterNotNull()
|
||||
}
|
||||
|
||||
override fun hasModifier(modifier: UastModifier) = psi.hasModifier(modifier)
|
||||
override val annotations by lz { psi.getUastAnnotations(this) }
|
||||
|
||||
override val body by lz { KotlinConverter.convertOrEmpty(psi.bodyExpression, this) }
|
||||
override val visibility by lz { psi.getVisibility() }
|
||||
}
|
||||
|
||||
class KotlinConstructorUFunction(
|
||||
override val psi: KtConstructor<*>,
|
||||
override val parent: UElement
|
||||
) : KotlinAbstractUFunction(), PsiElementBacked {
|
||||
override val nameElement by lz {
|
||||
val constructorKeyword = psi.getConstructorKeyword()?.let { KotlinPsiElementStub(it, this) }
|
||||
constructorKeyword ?: this.getContainingFunction()?.nameElement
|
||||
}
|
||||
|
||||
override val kind = UastFunctionKind.CONSTRUCTOR
|
||||
|
||||
override val typeParameterCount = 0
|
||||
override val typeParameters = emptyList<UTypeReference>()
|
||||
|
||||
override val returnType = null
|
||||
}
|
||||
|
||||
class KotlinUFunction(
|
||||
override val psi: KtFunction,
|
||||
override val parent: UElement
|
||||
) : KotlinAbstractUFunction(), PsiElementBacked {
|
||||
override val nameElement by lz { psi.nameIdentifier?.let { KotlinConverter.convert(it, this) } }
|
||||
|
||||
override val kind = UastFunctionKind.FUNCTION
|
||||
|
||||
override val returnType by lz {
|
||||
val descriptor = psi.resolveToDescriptorIfAny() as? FunctionDescriptor ?: return@lz null
|
||||
val type = descriptor.returnType ?: return@lz null
|
||||
KotlinConverter.convert(type, psi.project, this)
|
||||
}
|
||||
|
||||
//TODO
|
||||
override val typeParameterCount = 0
|
||||
override val typeParameters = emptyList<UTypeReference>()
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* 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.uast;
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtStringTemplateExpression
|
||||
import org.jetbrains.uast.UBinaryExpression
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UExpression
|
||||
import org.jetbrains.uast.UastBinaryOperator
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinStringTemplateUBinaryExpression(
|
||||
override val psi: KtStringTemplateExpression,
|
||||
override val parent: UElement
|
||||
) : UBinaryExpression, PsiElementBacked, KotlinTypeHelper, KotlinEvaluateHelper {
|
||||
override lateinit var leftOperand: UExpression
|
||||
override lateinit var rightOperand: UExpression
|
||||
|
||||
override val operator = UastBinaryOperator.PLUS
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtArrayAccessExpression
|
||||
import org.jetbrains.uast.NoEvaluate
|
||||
import org.jetbrains.uast.UArrayAccessExpression
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUArrayAccess(
|
||||
override val psi: KtArrayAccessExpression,
|
||||
override val parent: UElement
|
||||
) : UArrayAccessExpression, PsiElementBacked, KotlinTypeHelper, NoEvaluate {
|
||||
override val receiver by lz { KotlinConverter.convertOrEmpty(psi.arrayExpression, this) }
|
||||
override val indices by lz { psi.indexExpressions.map { KotlinConverter.convert(it, this) } }
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtArrayAccessExpression
|
||||
import org.jetbrains.uast.UArrayAccessExpression
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUArrayAccessExpression(
|
||||
override val psi: KtArrayAccessExpression,
|
||||
override val parent: UElement
|
||||
) : UArrayAccessExpression, PsiElementBacked, KotlinTypeHelper, KotlinEvaluateHelper {
|
||||
override val receiver by lz { KotlinConverter.convertOrEmpty(psi.arrayExpression, this) }
|
||||
override val indices by lz { psi.indexExpressions.map { KotlinConverter.convert(it, this) } }
|
||||
}
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.psi.KtBinaryExpression
|
||||
import org.jetbrains.uast.*
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUBinaryExpression(
|
||||
override val psi: KtBinaryExpression,
|
||||
override val parent: UElement
|
||||
) : UBinaryExpression, PsiElementBacked, KotlinTypeHelper, KotlinEvaluateHelper {
|
||||
override val leftOperand by lz { KotlinConverter.convertOrEmpty(psi.left, this) }
|
||||
override val rightOperand by lz { KotlinConverter.convertOrEmpty(psi.right, this) }
|
||||
|
||||
override val operator = when (psi.operationToken) {
|
||||
KtTokens.PLUS -> UastBinaryOperator.PLUS
|
||||
KtTokens.MINUS -> UastBinaryOperator.MINUS
|
||||
KtTokens.MUL -> UastBinaryOperator.MULT
|
||||
KtTokens.DIV -> UastBinaryOperator.DIV
|
||||
KtTokens.PERC -> UastBinaryOperator.MOD
|
||||
KtTokens.EQEQ -> UastBinaryOperator.EQUALS
|
||||
KtTokens.EXCLEQ -> UastBinaryOperator.NOT_EQUALS
|
||||
KtTokens.EQEQEQ -> UastBinaryOperator.IDENTITY_EQUALS
|
||||
KtTokens.EXCLEQEQEQ -> UastBinaryOperator.IDENTITY_NOT_EQUALS
|
||||
KtTokens.GT -> UastBinaryOperator.GREATER
|
||||
KtTokens.GTEQ -> UastBinaryOperator.GREATER_OR_EQUAL
|
||||
KtTokens.LT -> UastBinaryOperator.LESS
|
||||
KtTokens.LTEQ -> UastBinaryOperator.LESS_OR_EQUAL
|
||||
KtTokens.IN_KEYWORD -> KotlinBinaryOperators.IN
|
||||
KtTokens.NOT_IN -> KotlinBinaryOperators.NOT_IN
|
||||
else -> UastBinaryOperator.UNKNOWN
|
||||
}
|
||||
}
|
||||
|
||||
class KotlinCustomUBinaryExpression(
|
||||
override val psi: PsiElement,
|
||||
override val parent: UElement
|
||||
) : UBinaryExpression, PsiElementBacked, NoEvaluate {
|
||||
lateinit override var leftOperand: UExpression
|
||||
lateinit override var operator: UastBinaryOperator
|
||||
lateinit override var rightOperand: UExpression
|
||||
}
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.psi.KtBinaryExpressionWithTypeRHS
|
||||
import org.jetbrains.uast.*
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUBinaryExpressionWithType(
|
||||
override val psi: KtBinaryExpressionWithTypeRHS,
|
||||
override val parent: UElement
|
||||
) : UBinaryExpressionWithType, PsiElementBacked, KotlinTypeHelper, KotlinEvaluateHelper {
|
||||
override val operand by lz { KotlinConverter.convert(psi.left, this) }
|
||||
override val type by lz { KotlinConverter.convert(psi.right, this) }
|
||||
override val operationKind = when (psi.operationReference.getReferencedNameElementType()) {
|
||||
KtTokens.AS_KEYWORD -> UastBinaryExpressionWithTypeKind.TYPE_CAST
|
||||
KtTokens.AS_SAFE -> KotlinBinaryExpressionWithTypeKinds.SAFE_TYPE_CAST
|
||||
else -> UastBinaryExpressionWithTypeKind.UNKNOWN
|
||||
}
|
||||
}
|
||||
|
||||
class KotlinCustomUBinaryExpressionWithType(
|
||||
override val psi: PsiElement,
|
||||
override val parent: UElement
|
||||
) : UBinaryExpressionWithType, PsiElementBacked, NoEvaluate {
|
||||
lateinit override var operand: UExpression
|
||||
lateinit override var operationKind: UastBinaryExpressionWithTypeKind
|
||||
lateinit override var type: UType
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtBlockExpression
|
||||
import org.jetbrains.uast.NoEvaluate
|
||||
import org.jetbrains.uast.UBlockExpression
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUBlockExpression(
|
||||
override val psi: KtBlockExpression,
|
||||
override val parent: UElement
|
||||
) : UBlockExpression, PsiElementBacked, KotlinTypeHelper, NoEvaluate {
|
||||
override val expressions by lz { psi.statements.map { KotlinConverter.convertOrEmpty(it, this) } }
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.psi.KtCatchClause
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.uast.UCatchClause
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UType
|
||||
import org.jetbrains.uast.UVariable
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUCatchClause(
|
||||
override val psi: KtCatchClause,
|
||||
override val parent: UElement
|
||||
) : UCatchClause, PsiElementBacked {
|
||||
override val body by lz { KotlinConverter.convertOrEmpty(psi.catchBody, this) }
|
||||
override val parameters by lz { psi.catchParameter?.let { listOf(KotlinConverter.convert(it, this)) } ?: emptyList<UVariable>() }
|
||||
override val types by lz {
|
||||
val catchParameter = psi.catchParameter ?: return@lz emptyList<UType>()
|
||||
val bindingContext = psi.analyze(BodyResolveMode.PARTIAL)
|
||||
val parameter = bindingContext[BindingContext.VALUE_PARAMETER, catchParameter] ?: return@lz emptyList<UType>()
|
||||
listOf(KotlinConverter.convert(parameter.type, psi.project, this))
|
||||
}
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* 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
|
||||
|
||||
class KotlinUDeclarationsExpression(override val parent: UElement) : UDeclarationsExpression {
|
||||
override lateinit var declarations: List<UElement>
|
||||
override fun evaluate() = null
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtDoWhileExpression
|
||||
import org.jetbrains.uast.NoEvaluate
|
||||
import org.jetbrains.uast.UDoWhileExpression
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUDoWhileExpression(
|
||||
override val psi: KtDoWhileExpression,
|
||||
override val parent: UElement
|
||||
) : UDoWhileExpression, PsiElementBacked, NoEvaluate {
|
||||
override val condition by lz { KotlinConverter.convertOrEmpty(psi.condition, this) }
|
||||
override val body by lz { KotlinConverter.convertOrEmpty(psi.body, this) }
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.psi.KtExpression
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.kotlin.types.TypeUtils
|
||||
import org.jetbrains.uast.UExpression
|
||||
import org.jetbrains.uast.UType
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
interface KotlinTypeHelper : UExpression, PsiElementBacked {
|
||||
override fun getExpressionType(): UType? {
|
||||
val ktElement = psi as? KtExpression ?: return null
|
||||
val ktType = ktElement.analyze(BodyResolveMode.PARTIAL)[BindingContext.EXPECTED_EXPRESSION_TYPE, ktElement] ?: return null
|
||||
return KotlinConverter.convert(ktType, ktElement.project, null)
|
||||
}
|
||||
}
|
||||
|
||||
interface KotlinEvaluateHelper : UExpression, PsiElementBacked {
|
||||
override fun evaluate(): Any? {
|
||||
val ktElement = psi as? KtExpression ?: return null
|
||||
val compileTimeConst = ktElement.analyze(BodyResolveMode.PARTIAL)[BindingContext.COMPILE_TIME_VALUE, ktElement]
|
||||
return compileTimeConst?.getValue(TypeUtils.NO_EXPECTED_TYPE)
|
||||
}
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtForExpression
|
||||
import org.jetbrains.uast.NoEvaluate
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UForEachExpression
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUForEachExpression(
|
||||
override val psi: KtForExpression,
|
||||
override val parent: UElement
|
||||
) : UForEachExpression, PsiElementBacked, NoEvaluate {
|
||||
override val variableName by lz { psi.loopParameter?.name }
|
||||
override val iteratedValue by lz { KotlinConverter.convertOrEmpty(psi.loopRange, this) }
|
||||
override val body by lz { KotlinConverter.convertOrEmpty(psi.body, this) }
|
||||
}
|
||||
+91
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||
import org.jetbrains.kotlin.psi.KtCallExpression
|
||||
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.uast.*
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUFunctionCallExpression(
|
||||
override val psi: KtCallExpression,
|
||||
override val parent: UElement
|
||||
) : UCallExpression, PsiElementBacked, KotlinTypeHelper, NoEvaluate {
|
||||
override val functionName: String?
|
||||
get() = (psi.calleeExpression as? KtSimpleNameExpression)?.getReferencedName()
|
||||
|
||||
override val functionNameElement by lz { psi.calleeExpression?.let { KotlinConverter.convert(it, this) } }
|
||||
|
||||
override val classReference by lz {
|
||||
KotlinClassViaConstructorUSimpleReferenceExpression(psi, functionName.orAnonymous("class"), this)
|
||||
}
|
||||
|
||||
override val functionReference by lz {
|
||||
val calleeExpression = psi.calleeExpression ?: return@lz null
|
||||
val name = (calleeExpression as? KtSimpleNameExpression)?.getReferencedName() ?: return@lz null
|
||||
KotlinUSimpleReferenceExpression(calleeExpression, name, this)
|
||||
}
|
||||
|
||||
override val valueArgumentCount: Int
|
||||
get() = psi.valueArguments.size
|
||||
|
||||
override val valueArguments by lz { psi.valueArguments.map { KotlinConverter.convertOrEmpty(it.getArgumentExpression(), this) } }
|
||||
|
||||
override val typeArgumentCount: Int
|
||||
get() = psi.typeArguments.size
|
||||
|
||||
override val typeArguments by lz { psi.typeArguments.map { KotlinConverter.convert(it.typeReference, this) } }
|
||||
|
||||
override val kind by lz {
|
||||
when (resolveCall()?.resultingDescriptor) {
|
||||
is ConstructorDescriptor -> UastCallKind.CONSTRUCTOR_CALL
|
||||
else -> UastCallKind.FUNCTION_CALL
|
||||
}
|
||||
}
|
||||
|
||||
override fun resolve(context: UastContext): UFunction? {
|
||||
val resultingDescriptor = resolveCall()?.resultingDescriptor ?: return null
|
||||
val source = DescriptorToSourceUtilsIde.getAnyDeclaration(psi.project, resultingDescriptor) ?: return null
|
||||
return context.convert(source) as? UFunction
|
||||
}
|
||||
|
||||
private fun resolveCall() = psi.getResolvedCall(psi.analyze(BodyResolveMode.PARTIAL))
|
||||
}
|
||||
|
||||
class KotlinUComponentFunctionCallExpression(
|
||||
override val psi: PsiElement,
|
||||
val n: Int,
|
||||
override val parent: UElement
|
||||
) : UCallExpression, PsiElementBacked, NoEvaluate {
|
||||
override val valueArgumentCount = 0
|
||||
override val valueArguments = emptyList<UExpression>()
|
||||
override val typeArgumentCount = 0
|
||||
override val typeArguments = emptyList<UType>()
|
||||
override val classReference = null
|
||||
override val functionName = "component$n"
|
||||
override val functionReference by lz { KotlinStringUSimpleReferenceExpression(functionName, this) }
|
||||
override val functionNameElement = null
|
||||
override val kind = UastCallKind.FUNCTION_CALL
|
||||
override fun resolve(context: UastContext) = null
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtIfExpression
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UIfExpression
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUIfExpression(
|
||||
override val psi: KtIfExpression,
|
||||
override val parent: UElement
|
||||
) : UIfExpression, PsiElementBacked, KotlinTypeHelper, KotlinEvaluateHelper {
|
||||
override val condition by lz { KotlinConverter.convertOrEmpty(psi.condition, this) }
|
||||
override val thenBranch by lz { KotlinConverter.convertOrNull(psi.then, this) }
|
||||
override val elseBranch by lz { KotlinConverter.convertOrNull(psi.`else`, this) }
|
||||
override val isTernary = false
|
||||
}
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.uast.*
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinULambdaExpression(
|
||||
override val psi: KtLambdaExpression,
|
||||
override val parent: UElement
|
||||
) : ULambdaExpression, PsiElementBacked, KotlinTypeHelper, NoEvaluate {
|
||||
override val body by lz { KotlinConverter.convertOrEmpty(psi.bodyExpression, this) }
|
||||
override val valueParameters by lz { psi.valueParameters.map { KotlinConverter.convert(it, this) } }
|
||||
override fun renderString(): String {
|
||||
val renderedValueParameters = if (valueParameters.isEmpty())
|
||||
""
|
||||
else
|
||||
valueParameters.joinToString { it.renderString() } + " ->\n"
|
||||
val expressions = (body as? UBlockExpression)?.expressions
|
||||
?.joinToString("\n") { it.renderString().withMargin } ?: body.renderString()
|
||||
|
||||
return "{ " + renderedValueParameters + "\n" + expressions + "\n}"
|
||||
}
|
||||
}
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isNullExpression
|
||||
import org.jetbrains.kotlin.psi.KtConstantExpression
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.ULiteralExpression
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinULiteralExpression(
|
||||
override val psi: KtConstantExpression,
|
||||
override val parent: UElement
|
||||
) : ULiteralExpression, PsiElementBacked, KotlinTypeHelper, KotlinEvaluateHelper {
|
||||
override val isNull: Boolean
|
||||
get() = psi.isNullExpression()
|
||||
|
||||
override val text: String
|
||||
get() = psi.text
|
||||
|
||||
override val value by lz { evaluate() }
|
||||
}
|
||||
|
||||
class KotlinStringULiteralExpression(
|
||||
override val psi: PsiElement,
|
||||
override val parent: UElement
|
||||
) : ULiteralExpression, PsiElementBacked, KotlinTypeHelper, KotlinEvaluateHelper {
|
||||
override val isNull = false
|
||||
override val text: String
|
||||
get() = '"' + psi.text + '"'
|
||||
|
||||
override val value: String
|
||||
get() = psi.text
|
||||
|
||||
override fun evaluate() = psi.text
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtParenthesizedExpression
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UParenthesizedExpression
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUParenthesizedExpression(
|
||||
override val psi: KtParenthesizedExpression,
|
||||
override val parent: UElement
|
||||
) : UParenthesizedExpression, PsiElementBacked, KotlinTypeHelper, KotlinEvaluateHelper {
|
||||
override val expression by lz { KotlinConverter.convertOrEmpty(psi.expression, this) }
|
||||
}
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.psi.KtPostfixExpression
|
||||
import org.jetbrains.uast.NoEvaluate
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UPostfixExpression
|
||||
import org.jetbrains.uast.UastPostfixOperator
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUPostfixExpression(
|
||||
override val psi: KtPostfixExpression,
|
||||
override val parent: UElement
|
||||
) : UPostfixExpression, PsiElementBacked, KotlinTypeHelper, KotlinEvaluateHelper {
|
||||
override val operand by lz { KotlinConverter.convertOrEmpty(psi.baseExpression, this) }
|
||||
|
||||
override val operator = when (psi.operationToken) {
|
||||
KtTokens.PLUSPLUS -> UastPostfixOperator.INC
|
||||
KtTokens.MINUSMINUS -> UastPostfixOperator.DEC
|
||||
KtTokens.EXCLEXCL -> KotlinPostfixOperators.EXCLEXCL
|
||||
else -> UastPostfixOperator.UNKNOWN
|
||||
}
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.psi.KtPrefixExpression
|
||||
import org.jetbrains.uast.NoEvaluate
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UPrefixExpression
|
||||
import org.jetbrains.uast.UastPrefixOperator
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUPrefixExpression(
|
||||
override val psi: KtPrefixExpression,
|
||||
override val parent: UElement
|
||||
) : UPrefixExpression, PsiElementBacked, KotlinTypeHelper, KotlinEvaluateHelper {
|
||||
override val operand by lz { KotlinConverter.convertOrEmpty(psi.baseExpression, this) }
|
||||
|
||||
override val operator = when (psi.operationToken) {
|
||||
KtTokens.PLUS -> UastPrefixOperator.UNARY_PLUS
|
||||
KtTokens.MINUS -> UastPrefixOperator.UNARY_MINUS
|
||||
KtTokens.PLUSPLUS -> UastPrefixOperator.INC
|
||||
KtTokens.MINUSMINUS -> UastPrefixOperator.DEC
|
||||
else -> UastPrefixOperator.UNKNOWN
|
||||
}
|
||||
}
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtDestructuringDeclarationEntry
|
||||
import org.jetbrains.kotlin.psi.KtDotQualifiedExpression
|
||||
import org.jetbrains.uast.*
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUQualifiedExpression(
|
||||
override val psi: KtDotQualifiedExpression,
|
||||
override val parent: UElement
|
||||
) : UQualifiedExpression, PsiElementBacked, KotlinTypeHelper, KotlinEvaluateHelper {
|
||||
override val receiver by lz { KotlinConverter.convertOrEmpty(psi.receiverExpression, this) }
|
||||
override val selector by lz { KotlinConverter.convertOrEmpty(psi.selectorExpression, this) }
|
||||
override val accessType = UastQualifiedExpressionAccessType.SIMPLE
|
||||
|
||||
override fun resolve(context: UastContext) = psi.selectorExpression.resolveCallToUDeclaration(context)
|
||||
}
|
||||
|
||||
class KotlinUComponentQualifiedExpression(
|
||||
override val psi: KtDestructuringDeclarationEntry,
|
||||
override val parent: UElement
|
||||
) : UQualifiedExpression, PsiElementBacked, KotlinTypeHelper, KotlinEvaluateHelper {
|
||||
override lateinit var receiver: UExpression
|
||||
override lateinit var selector: UExpression
|
||||
override val accessType = UastQualifiedExpressionAccessType.SIMPLE
|
||||
override fun resolve(context: UastContext) = null
|
||||
}
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtSafeQualifiedExpression
|
||||
import org.jetbrains.uast.NoEvaluate
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UQualifiedExpression
|
||||
import org.jetbrains.uast.UastContext
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUSafeQualifiedExpression(
|
||||
override val psi: KtSafeQualifiedExpression,
|
||||
override val parent: UElement
|
||||
) : UQualifiedExpression, PsiElementBacked, KotlinTypeHelper, KotlinEvaluateHelper {
|
||||
override val receiver by lz { KotlinConverter.convertOrEmpty(psi.receiverExpression, this) }
|
||||
override val selector by lz { KotlinConverter.convertOrEmpty(psi.selectorExpression, this) }
|
||||
override val accessType = KotlinQualifiedExpressionAccessTypes.SAFE
|
||||
|
||||
override fun resolve(context: UastContext) = psi.selectorExpression.resolveCallToUDeclaration(context)
|
||||
}
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||
import org.jetbrains.kotlin.psi.KtCallExpression
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.uast.*
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUSimpleReferenceExpression(
|
||||
override val psi: PsiElement,
|
||||
override val identifier: String,
|
||||
override val parent: UElement
|
||||
) : USimpleReferenceExpression, PsiElementBacked, KotlinTypeHelper, NoEvaluate {
|
||||
override fun resolve(context: UastContext) = context.convert(
|
||||
psi.references.firstOrNull()?.resolve()) as? UDeclaration
|
||||
}
|
||||
|
||||
class KotlinClassViaConstructorUSimpleReferenceExpression(
|
||||
override val psi: KtCallExpression,
|
||||
override val identifier: String,
|
||||
override val parent: UElement
|
||||
) : USimpleReferenceExpression, PsiElementBacked, KotlinTypeHelper, NoEvaluate {
|
||||
override fun resolve(context: UastContext): UDeclaration? {
|
||||
val resolvedCall = psi.getResolvedCall(psi.analyze(BodyResolveMode.PARTIAL))
|
||||
val resultingDescriptor = resolvedCall?.resultingDescriptor as? ConstructorDescriptor ?: return null
|
||||
val clazz = resultingDescriptor.containingDeclaration
|
||||
val source = DescriptorToSourceUtilsIde.getAnyDeclaration(psi.project, clazz) ?: return null
|
||||
return context.convert(source) as? UClass
|
||||
}
|
||||
}
|
||||
|
||||
class KotlinStringUSimpleReferenceExpression(
|
||||
override val identifier: String,
|
||||
override val parent: UElement
|
||||
) : USimpleReferenceExpression, NoEvaluate {
|
||||
override fun resolve(context: UastContext) = null
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.psi.KtExpression
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.kotlin.types.TypeUtils
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UExpression
|
||||
import org.jetbrains.uast.USpecialExpressionList
|
||||
import org.jetbrains.uast.UastSpecialExpressionKind
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
open class KotlinUSpecialExpressionList(
|
||||
override val psi: PsiElement,
|
||||
override val kind: UastSpecialExpressionKind, // original element
|
||||
override val parent: UElement
|
||||
) : USpecialExpressionList, PsiElementBacked, KotlinTypeHelper, KotlinEvaluateHelper {
|
||||
class Empty(psi: PsiElement, expressionType: UastSpecialExpressionKind, parent: UElement) :
|
||||
KotlinUSpecialExpressionList(psi, expressionType, parent) {
|
||||
init { expressions = emptyList() }
|
||||
}
|
||||
|
||||
override lateinit var expressions: List<UExpression>
|
||||
|
||||
override fun evaluate(): Any? {
|
||||
val ktElement = psi as? KtExpression ?: return null
|
||||
val compileTimeConst = ktElement.analyze(BodyResolveMode.PARTIAL)[BindingContext.COMPILE_TIME_VALUE, ktElement]
|
||||
return compileTimeConst?.getValue(TypeUtils.NO_EXPECTED_TYPE)
|
||||
}
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtSuperExpression
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.USuperExpression
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUSuperExpression(
|
||||
override val psi: KtSuperExpression,
|
||||
override val parent: UElement
|
||||
) : USuperExpression, PsiElementBacked, KotlinTypeHelper, KotlinEvaluateHelper
|
||||
+107
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.uast.kinds.KotlinSpecialExpressionKinds
|
||||
import org.jetbrains.uast.*
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUSwitchExpression(
|
||||
override val psi: KtWhenExpression,
|
||||
override val parent: UElement
|
||||
) : USwitchExpression, PsiElementBacked, KotlinTypeHelper, NoEvaluate {
|
||||
override val expression by lz { KotlinConverter.convertOrNull(psi.subjectExpression, this) }
|
||||
|
||||
//TODO to entries
|
||||
override val body: UExpression by lz {
|
||||
object : KotlinUSpecialExpressionList(psi, KotlinSpecialExpressionKinds.WHEN, this) {
|
||||
override fun renderString() = expressions.joinToString("\n") { it.renderString().withMargin }
|
||||
}.apply {
|
||||
expressions = this@KotlinUSwitchExpression.psi.entries.map { KotlinUSwitchEntry(it, this) }
|
||||
}
|
||||
}
|
||||
|
||||
override fun renderString() = buildString {
|
||||
val expr = expression?.let { "(" + it.renderString() + ") " } ?: ""
|
||||
appendln("switch $expr {")
|
||||
appendln(body.renderString())
|
||||
appendln("}")
|
||||
}
|
||||
}
|
||||
|
||||
class KotlinUSwitchEntry(
|
||||
override val psi: KtWhenEntry,
|
||||
override val parent: UExpression
|
||||
) : UExpression, PsiElementBacked, NoEvaluate {
|
||||
val conditions by lz {
|
||||
psi.conditions.map { when (it) {
|
||||
is KtWhenConditionInRange -> KotlinCustomUBinaryExpression(it, this).apply {
|
||||
leftOperand = KotlinStringUSimpleReferenceExpression("it", this)
|
||||
operator = when {
|
||||
it.isNegated -> KotlinBinaryOperators.NOT_IN
|
||||
else -> KotlinBinaryOperators.IN
|
||||
}
|
||||
rightOperand = KotlinConverter.convertOrEmpty(it.rangeExpression, this)
|
||||
}
|
||||
is KtWhenConditionIsPattern -> KotlinCustomUBinaryExpressionWithType(it, this).apply {
|
||||
operand = KotlinStringUSimpleReferenceExpression("it", this)
|
||||
operationKind = when {
|
||||
it.isNegated -> KotlinBinaryExpressionWithTypeKinds.NEGATED_INSTANCE_CHECK
|
||||
else -> UastBinaryExpressionWithTypeKind.INSTANCE_CHECK
|
||||
}
|
||||
type = KotlinConverter.convert(it.typeReference, this)
|
||||
}
|
||||
is KtWhenConditionWithExpression -> KotlinConverter.convertOrEmpty(it.expression, this)
|
||||
else -> EmptyExpression(this)
|
||||
}}
|
||||
}
|
||||
|
||||
val expression: UExpression by lz {
|
||||
object : KotlinUSpecialExpressionList(psi, KotlinSpecialExpressionKinds.WHEN_ENTRY, this) {
|
||||
override fun renderString() = buildString {
|
||||
appendln("{")
|
||||
expressions.forEach { appendln(it.renderString().withMargin) }
|
||||
appendln("}")
|
||||
}
|
||||
}.apply {
|
||||
val exprPsi = this@KotlinUSwitchEntry.psi.expression
|
||||
val userExpressions = when (exprPsi) {
|
||||
is KtBlockExpression -> exprPsi.statements.map { KotlinConverter.convert(it, this) }
|
||||
else -> listOf(KotlinConverter.convertOrEmpty(exprPsi, this))
|
||||
}
|
||||
expressions = userExpressions + KotlinUSpecialExpressionList.Empty(
|
||||
exprPsi ?: this@KotlinUSwitchEntry.psi, UastSpecialExpressionKind.BREAK, parent)
|
||||
}
|
||||
}
|
||||
|
||||
override fun renderString() = buildString {
|
||||
if (conditions.isEmpty()) {
|
||||
append("else")
|
||||
} else {
|
||||
append(conditions.joinToString { it.renderString() })
|
||||
}
|
||||
append(" -> ")
|
||||
append(expression.renderString())
|
||||
}
|
||||
|
||||
override fun logString() = log("KotlinUSwitchEntry", expression)
|
||||
|
||||
override fun traverse(handler: UastHandler) {
|
||||
expression.handleTraverse(handler)
|
||||
}
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtThisExpression
|
||||
import org.jetbrains.uast.NoEvaluate
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UThisExpression
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUThisExpression(
|
||||
override val psi: KtThisExpression,
|
||||
override val parent: UElement
|
||||
) : UThisExpression, PsiElementBacked, KotlinTypeHelper, KotlinEvaluateHelper
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtTryExpression
|
||||
import org.jetbrains.uast.NoEvaluate
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UTryExpression
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUTryExpression(
|
||||
override val psi: KtTryExpression,
|
||||
override val parent: UElement
|
||||
) : UTryExpression, PsiElementBacked, KotlinTypeHelper, NoEvaluate {
|
||||
override val tryClause by lz { KotlinConverter.convert(psi.tryBlock, this) }
|
||||
override val catchClauses by lz { psi.catchClauses.map { KotlinUCatchClause(it, this) } }
|
||||
override val finallyClause by lz { psi.finallyBlock?.finalExpression?.let { KotlinConverter.convert(it, this) } }
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtIsExpression
|
||||
import org.jetbrains.uast.UBinaryExpressionWithType
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUTypeCheckExpression(
|
||||
override val psi: KtIsExpression,
|
||||
override val parent: UElement
|
||||
) : UBinaryExpressionWithType, PsiElementBacked, KotlinTypeHelper, KotlinEvaluateHelper {
|
||||
override val operand by lz { KotlinConverter.convert(psi.leftHandSide, this) }
|
||||
override val type by lz { KotlinConverter.convert(psi.typeReference, this) }
|
||||
override val operationKind = KotlinBinaryExpressionWithTypeKinds.NEGATED_INSTANCE_CHECK
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtWhileExpression
|
||||
import org.jetbrains.uast.NoEvaluate
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UWhileExpression
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class KotlinUWhileExpression(
|
||||
override val psi: KtWhileExpression,
|
||||
override val parent: UElement
|
||||
) : UWhileExpression, PsiElementBacked, NoEvaluate {
|
||||
override val condition by lz { KotlinConverter.convertOrEmpty(psi.condition, this) }
|
||||
override val body by lz { KotlinConverter.convertOrEmpty(psi.body, this) }
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtExpression
|
||||
import org.jetbrains.uast.NoEvaluate
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UExpression
|
||||
import org.jetbrains.uast.UastHandler
|
||||
import org.jetbrains.uast.psi.PsiElementBacked
|
||||
|
||||
class UnknownKotlinExpression(
|
||||
override val psi: KtExpression,
|
||||
override val parent: UElement
|
||||
) : UExpression, PsiElementBacked, NoEvaluate {
|
||||
override fun traverse(handler: UastHandler) {}
|
||||
override fun logString() = "[!] UnknownKotlinExpression ($psi)"
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import com.intellij.openapi.application.ApplicationManager
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.psi.KtAnnotated
|
||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
import org.jetbrains.kotlin.psi.KtModifierListOwner
|
||||
import org.jetbrains.kotlin.psi.psiUtil.visibilityModifierType
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.kotlin.uast.kinds.KotlinUastVisibilities
|
||||
import org.jetbrains.uast.*
|
||||
|
||||
private val MODIFIER_MAP = mapOf(
|
||||
UastModifier.ABSTRACT to KtTokens.ABSTRACT_KEYWORD,
|
||||
UastModifier.INNER to KtTokens.INNER_KEYWORD
|
||||
)
|
||||
|
||||
internal fun KtDeclaration.getVisibility() = when (visibilityModifierType()) {
|
||||
KtTokens.PRIVATE_KEYWORD -> UastVisibility.PRIVATE
|
||||
KtTokens.PROTECTED_KEYWORD -> UastVisibility.PROTECTED
|
||||
KtTokens.INTERNAL_KEYWORD -> KotlinUastVisibilities.INTERNAL
|
||||
else -> UastVisibility.PUBLIC
|
||||
}
|
||||
|
||||
internal fun KtModifierListOwner.hasModifier(modifier: UastModifier): Boolean {
|
||||
val javaModifier = MODIFIER_MAP[modifier] ?: return false
|
||||
return hasModifier(javaModifier)
|
||||
}
|
||||
|
||||
internal fun <T> runReadAction(action: () -> T): T {
|
||||
return ApplicationManager.getApplication().runReadAction<T>(action)
|
||||
}
|
||||
|
||||
internal fun KtElement?.resolveCallToUDeclaration(context: UastContext): UDeclaration? {
|
||||
if (this == null) return null
|
||||
val resolvedCall = this.getResolvedCall(analyze(BodyResolveMode.PARTIAL)) ?: return null
|
||||
val source = DescriptorToSourceUtilsIde.getAnyDeclaration(project, resolvedCall.resultingDescriptor) ?: return null
|
||||
return context.convert(source) as? UDeclaration
|
||||
}
|
||||
|
||||
internal fun KtElement?.resolveElementToUDeclaration(context: UastContext): UDeclaration? {
|
||||
if (this == null) return null
|
||||
val bindingContext = analyze(BodyResolveMode.PARTIAL)
|
||||
val descriptor = bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, this] ?: return null
|
||||
val source = DescriptorToSourceUtilsIde.getAnyDeclaration(project, descriptor) ?: return null
|
||||
return context.convert(source) as? UDeclaration
|
||||
}
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
internal inline fun String?.orAnonymous(kind: String = ""): String {
|
||||
return this ?: "<anonymous" + (if (kind.isNotBlank()) " $kind" else "") + ">"
|
||||
}
|
||||
|
||||
internal fun KtAnnotated.getUastAnnotations(parent: UElement) = annotationEntries.map { KotlinUAnnotation(it, parent) }
|
||||
|
||||
internal fun <T> singletonListOrEmpty(element: T?) = if (element != null) listOf(element) else emptyList<T>()
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import kotlin.properties.ReadOnlyProperty
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
internal fun <T> lz(initializer: () -> T): ReadOnlyProperty<Any, T> = UnsafeLazyInsideReadAction(initializer, false)
|
||||
|
||||
private class UnsafeLazyInsideReadAction<out T>(initializer: () -> T, private val readAction: Boolean) : ReadOnlyProperty<Any, T> {
|
||||
private var initializer: (() -> T)? = initializer
|
||||
private var _value: Any? = UNINITIALIZED_VALUE
|
||||
|
||||
override fun getValue(thisRef: Any, property: KProperty<*>): T {
|
||||
if (_value === UNINITIALIZED_VALUE) {
|
||||
if (readAction) {
|
||||
_value = runReadAction { initializer!!() }
|
||||
}
|
||||
else {
|
||||
_value = initializer!!()
|
||||
}
|
||||
initializer = null
|
||||
}
|
||||
return _value as T
|
||||
}
|
||||
}
|
||||
|
||||
private object UNINITIALIZED_VALUE
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.uast.UastBinaryExpressionWithTypeKind
|
||||
|
||||
object KotlinBinaryExpressionWithTypeKinds {
|
||||
@JvmField
|
||||
val NEGATED_INSTANCE_CHECK = UastBinaryExpressionWithTypeKind("!is")
|
||||
|
||||
@JvmField
|
||||
val SAFE_TYPE_CAST = UastBinaryExpressionWithTypeKind("!is")
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.uast.UastBinaryOperator
|
||||
|
||||
object KotlinBinaryOperators {
|
||||
@JvmField
|
||||
val IN = UastBinaryOperator("in")
|
||||
@JvmField
|
||||
val NOT_IN = UastBinaryOperator("!in")
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.uast.UastPostfixOperator
|
||||
|
||||
object KotlinPostfixOperators {
|
||||
@JvmField
|
||||
val EXCLEXCL = UastPostfixOperator("!!")
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.uast.UastQualifiedExpressionAccessType
|
||||
|
||||
object KotlinQualifiedExpressionAccessTypes {
|
||||
@JvmField
|
||||
val SAFE = UastQualifiedExpressionAccessType("?.")
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* 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.uast.kinds
|
||||
|
||||
import org.jetbrains.uast.UastSpecialExpressionKind
|
||||
|
||||
object KotlinSpecialExpressionKinds {
|
||||
@JvmField
|
||||
val WHEN = UastSpecialExpressionKind("when")
|
||||
|
||||
@JvmField
|
||||
val WHEN_ENTRY = UastSpecialExpressionKind("when_entry")
|
||||
|
||||
@JvmField
|
||||
val DESTRUCTURING = UastSpecialExpressionKind("destructuring")
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* 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.uast.kinds
|
||||
|
||||
import org.jetbrains.uast.UastVisibility
|
||||
|
||||
object KotlinUastVisibilities {
|
||||
@JvmField
|
||||
val INTERNAL = UastVisibility("internal")
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
|
||||
import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor
|
||||
import org.jetbrains.kotlin.test.KotlinTestUtils
|
||||
import java.io.File
|
||||
|
||||
abstract class AbstractKotlinUastStructureTest : KotlinLightCodeInsightFixtureTestCase() {
|
||||
fun doTest() {
|
||||
val testName = getTestName(false)
|
||||
myFixture.configureByFile("$testName.kt")
|
||||
|
||||
val logFile = File(File(testDataPath, "log"), "$testName.txt")
|
||||
val renderFile = File(File(testDataPath, "render"), "$testName.txt")
|
||||
|
||||
val psiFile = myFixture.file
|
||||
val uElement = KotlinConverter.convertWithParent(psiFile) ?: error("UFile was not created")
|
||||
|
||||
val logActual = uElement.logString()
|
||||
val renderActual = uElement.renderString()
|
||||
|
||||
try {
|
||||
KotlinTestUtils.assertEqualsToFile(logFile, logActual)
|
||||
} catch (e: Throwable) {
|
||||
KotlinTestUtils.assertEqualsToFile(renderFile, renderActual)
|
||||
throw e
|
||||
}
|
||||
KotlinTestUtils.assertEqualsToFile(renderFile, renderActual)
|
||||
}
|
||||
|
||||
override fun getTestDataPath() = "plugins/uast-kotlin/testData"
|
||||
|
||||
override fun getProjectDescriptor() = KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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.uast
|
||||
|
||||
import org.jetbrains.kotlin.test.TestMetadata
|
||||
|
||||
class KotlinUastStructureTest : AbstractKotlinUastStructureTest() {
|
||||
@TestMetadata("Simple.kt") fun testSimple() = doTest()
|
||||
@TestMetadata("Declarations.kt") fun testDeclarations() = doTest()
|
||||
@TestMetadata("ControlStructures.kt") fun testControlStructures() = doTest()
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
class ControlStructures {
|
||||
fun test(): Boolean {
|
||||
if (5 > 3) {
|
||||
println("5 > 3")
|
||||
}
|
||||
|
||||
for (c in "ABC") {
|
||||
println(c)
|
||||
}
|
||||
|
||||
for (c: Char in "DEF") {
|
||||
println(c.toByte())
|
||||
}
|
||||
|
||||
var i = 5
|
||||
while (i > 0) {
|
||||
i--
|
||||
if (i == 3) break
|
||||
if (i == 2) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
i = 5
|
||||
do {
|
||||
i -= 1
|
||||
} while (i > 0)
|
||||
|
||||
"ABC".forEach { println(it.toString()[0]) }
|
||||
|
||||
"ABC".zip("DEF").forEach { println(it.first + " " + it.second) }
|
||||
|
||||
val (a, b) = "ABC".zip("DEF")
|
||||
|
||||
val value = if (5 > 3) "a" else "b"
|
||||
val list = listOf("A")
|
||||
val list2 = listOf("A")
|
||||
|
||||
val type = when (value) {
|
||||
in list -> "inlist"
|
||||
!in list2 -> "notinlist2"
|
||||
is String -> "string"
|
||||
is CharSequence -> "cs"
|
||||
else -> "unknown"
|
||||
}
|
||||
|
||||
val x = when {
|
||||
value == "b" -> "B"
|
||||
5 % 2 == 0 -> {
|
||||
println("A")
|
||||
"Q"
|
||||
}
|
||||
false -> "!"
|
||||
else -> "A"
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
class Declarations {
|
||||
val a: String = "a"
|
||||
class NestedClass {
|
||||
val b: String = "b"
|
||||
}
|
||||
inner class InnerClass {
|
||||
val c: CharSequence = a
|
||||
}
|
||||
|
||||
fun func(a: Int, b: String): Int {
|
||||
return (a + 1) * b.length
|
||||
}
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
class Simple {
|
||||
val a: String = "text" + "other" + "text"
|
||||
val b = listOf("A")
|
||||
|
||||
fun test() {
|
||||
System.out.println(5.0f / 2)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
UFile (package = null)
|
||||
UClass (ControlStructures, enum = false, interface = false, object = false)
|
||||
UFunction (test, kind = function, paramCount = 0)
|
||||
UBlockExpression
|
||||
UDeclarationsExpression
|
||||
UVariable (x, kind = local)
|
||||
UFunctionCallExpression (FUNCTION_CALL, argCount = 1)
|
||||
USimpleReferenceExpression (listOf)
|
||||
ULiteralExpression ("ABC")
|
||||
USpecialExpressionList (return)
|
||||
ULiteralExpression (false)
|
||||
@@ -0,0 +1,21 @@
|
||||
UFile (package = null)
|
||||
UClass (Declarations, enum = false, interface = false, object = false)
|
||||
UVariable (a, kind = member)
|
||||
ULiteralExpression ("a")
|
||||
UClass (NestedClass, enum = false, interface = false, object = false)
|
||||
UVariable (b, kind = member)
|
||||
ULiteralExpression ("b")
|
||||
UClass (InnerClass, enum = false, interface = false, object = false)
|
||||
UVariable (c, kind = member)
|
||||
USimpleReferenceExpression (a)
|
||||
UFunction (func, kind = function, paramCount = 2)
|
||||
UBlockExpression
|
||||
USpecialExpressionList (return)
|
||||
UBinaryExpression (*)
|
||||
UParenthesizedExpression
|
||||
UBinaryExpression (+)
|
||||
USimpleReferenceExpression (a)
|
||||
ULiteralExpression (1)
|
||||
UQualifiedExpression
|
||||
USimpleReferenceExpression (b)
|
||||
USimpleReferenceExpression (length)
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
UFile (package = null)
|
||||
UClass (Simple, enum = false, interface = false, object = false)
|
||||
UVariable (a, kind = member)
|
||||
UBinaryExpression (+)
|
||||
UBinaryExpression (+)
|
||||
ULiteralExpression ("text")
|
||||
ULiteralExpression ("other")
|
||||
ULiteralExpression ("text")
|
||||
UFunction (test, kind = function, paramCount = 0)
|
||||
UBlockExpression
|
||||
UQualifiedExpression
|
||||
UQualifiedExpression
|
||||
USimpleReferenceExpression (System)
|
||||
USimpleReferenceExpression (out)
|
||||
UFunctionCallExpression (FUNCTION_CALL, argCount = 1)
|
||||
USimpleReferenceExpression (println)
|
||||
UBinaryExpression (/)
|
||||
ULiteralExpression (5.0f)
|
||||
ULiteralExpression (2)
|
||||
@@ -0,0 +1,7 @@
|
||||
public class ControlStructures {
|
||||
public fun test(): Boolean {
|
||||
var x: List = listOf("ABC")
|
||||
return false
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
public class Declarations {
|
||||
var a: String = "a"
|
||||
|
||||
public class NestedClass {
|
||||
var b: String = "b"
|
||||
|
||||
}
|
||||
public inner class InnerClass {
|
||||
var c: CharSequence = a
|
||||
|
||||
}
|
||||
public fun func(a: Int, b: String): Int {
|
||||
return (a + 1) * b.length
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
public class Simple {
|
||||
var a: String = "text" + "other" + "text"
|
||||
val b = listOf("A")
|
||||
|
||||
public fun test(): Unit {
|
||||
System.out.println(5.0f / 2)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="kotlin-runtime" level="project" />
|
||||
<orderEntry type="library" name="idea-full" level="project" />
|
||||
<orderEntry type="module" module-name="uast-common" exported="" />
|
||||
<orderEntry type="module" module-name="uast-java" exported="" />
|
||||
<orderEntry type="module" module-name="frontend" />
|
||||
<orderEntry type="module" module-name="idea" />
|
||||
<orderEntry type="module" module-name="idea-analysis" />
|
||||
<orderEntry type="module" module-name="backend" />
|
||||
<orderEntry type="module" module-name="frontend.java" />
|
||||
<orderEntry type="module" module-name="idea-test-framework" scope="TEST" />
|
||||
<orderEntry type="module" module-name="compiler-tests" scope="TEST" />
|
||||
<orderEntry type="module" module-name="uast-android" />
|
||||
</component>
|
||||
</module>
|
||||
Reference in New Issue
Block a user