From 87187437ab78b0e200cb99a6657fc4546b57aa27 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 9 Feb 2017 19:19:40 +0100 Subject: [PATCH] Update UAST to version 1.0.11 --- .../tools/klint/detector/api/JavaContext.java | 52 ++---------- .../klint/checks/AnnotationDetector.java | 18 ++-- .../tools/klint/checks/ApiDetector.java | 18 ++-- .../klint/checks/PermissionRequirement.java | 32 ++++---- .../checks/SupportAnnotationDetector.java | 82 +++---------------- .../inspections/klint/IntellijLintUtils.java | 9 +- .../uast/kotlin/KotlinAbstractUElement.kt | 9 +- .../uast/kotlin/KotlinUastLanguagePlugin.kt | 5 +- .../kotlin/declarations/KotlinUAnnotation.kt | 19 ++++- .../uast/kotlin/declarations/KotlinUClass.kt | 3 + .../declarations/KotlinUImportStatement.kt | 3 +- .../kotlin/declarations/KotlinUVariable.kt | 3 +- .../evaluation/KotlinEvaluatorExtension.kt | 6 +- .../kotlin/expressions/ElvisExpression.kt | 4 + ...KotlinStringTemplateUPolyadicExpression.kt | 7 +- .../KotlinUArrayAccessExpression.kt | 3 +- .../expressions/KotlinUBinaryExpression.kt | 5 +- .../KotlinUBinaryExpressionWithType.kt | 5 +- .../expressions/KotlinUBlockExpression.kt | 3 +- .../expressions/KotlinUBreakExpression.kt | 3 +- .../KotlinUCallableReferenceExpression.kt | 3 +- .../kotlin/expressions/KotlinUCatchClause.kt | 3 +- .../KotlinUClassLiteralExpression.kt | 3 +- .../expressions/KotlinUContinueExpression.kt | 3 +- .../KotlinUDeclarationsExpression.kt | 4 + .../expressions/KotlinUDoWhileExpression.kt | 3 +- .../kotlin/expressions/KotlinUExpression.kt | 5 +- .../expressions/KotlinUExpressionList.kt | 3 +- .../expressions/KotlinUForEachExpression.kt | 3 +- .../KotlinUFunctionCallExpression.kt | 3 +- .../kotlin/expressions/KotlinUIfExpression.kt | 3 +- .../expressions/KotlinULabeledExpression.kt | 3 +- .../expressions/KotlinULambdaExpression.kt | 3 +- .../expressions/KotlinULiteralExpression.kt | 5 +- .../KotlinUObjectLiteralExpression.kt | 5 +- .../KotlinUParenthesizedExpression.kt | 3 +- .../expressions/KotlinUPostfixExpression.kt | 3 +- .../expressions/KotlinUPrefixExpression.kt | 3 +- .../KotlinUQualifiedReferenceExpression.kt | 5 +- .../expressions/KotlinUReturnExpression.kt | 3 +- .../KotlinUSafeQualifiedExpression.kt | 3 +- .../KotlinUSimpleReferenceExpression.kt | 9 +- .../expressions/KotlinUSuperExpression.kt | 3 +- .../expressions/KotlinUSwitchExpression.kt | 8 +- .../expressions/KotlinUThisExpression.kt | 3 +- .../expressions/KotlinUThrowExpression.kt | 3 +- .../expressions/KotlinUTryExpression.kt | 3 +- .../expressions/KotlinUTypeCheckExpression.kt | 3 +- .../KotlinUTypeReferenceExpression.kt | 5 +- .../expressions/KotlinUWhileExpression.kt | 3 +- .../uast/kotlin/expressions/LocalFunction.kt | 3 +- .../expressions/UnknownKotlinExpression.kt | 3 +- .../testData/AnnotationParameters.log.txt | 2 +- .../tests/AbstractKotlinUastTest.kt | 25 ++++++ .../uast-kotlin/tests/KotlinUastApiTest.kt | 7 +- update_dependencies.xml | 2 +- 56 files changed, 170 insertions(+), 273 deletions(-) diff --git a/plugins/lint/lint-api/src/com/android/tools/klint/detector/api/JavaContext.java b/plugins/lint/lint-api/src/com/android/tools/klint/detector/api/JavaContext.java index fb385376db9..3e4ecdd9d8e 100644 --- a/plugins/lint/lint-api/src/com/android/tools/klint/detector/api/JavaContext.java +++ b/plugins/lint/lint-api/src/com/android/tools/klint/detector/api/JavaContext.java @@ -16,10 +16,6 @@ package com.android.tools.klint.detector.api; -import static com.android.SdkConstants.CLASS_CONTEXT; -import static com.android.tools.klint.client.api.JavaParser.ResolvedNode; -import static com.android.tools.klint.client.api.JavaParser.TypeDescriptor; - import com.android.annotations.NonNull; import com.android.annotations.Nullable; import com.android.tools.klint.client.api.JavaEvaluator; @@ -31,46 +27,19 @@ import com.google.common.collect.Iterators; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiAnnotation; -import com.intellij.psi.PsiAnonymousClass; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiEnumConstant; -import com.intellij.psi.PsiExpression; -import com.intellij.psi.PsiField; -import com.intellij.psi.PsiJavaCodeReferenceElement; -import com.intellij.psi.PsiJavaFile; -import com.intellij.psi.PsiLabeledStatement; -import com.intellij.psi.PsiMember; -import com.intellij.psi.PsiMethod; -import com.intellij.psi.PsiMethodCallExpression; -import com.intellij.psi.PsiNameIdentifierOwner; -import com.intellij.psi.PsiNewExpression; -import com.intellij.psi.PsiReferenceExpression; -import com.intellij.psi.PsiSwitchStatement; +import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; - +import lombok.ast.*; +import lombok.ast.Position; import org.jetbrains.uast.*; -import org.jetbrains.uast.psi.PsiElementBacked; import org.jetbrains.uast.psi.UElementWithLocation; import java.io.File; import java.util.Iterator; -import lombok.ast.AnnotationElement; -import lombok.ast.AnnotationMethodDeclaration; -import lombok.ast.ClassDeclaration; -import lombok.ast.ConstructorDeclaration; -import lombok.ast.ConstructorInvocation; -import lombok.ast.EnumConstant; -import lombok.ast.Expression; -import lombok.ast.LabelledStatement; -import lombok.ast.MethodDeclaration; -import lombok.ast.MethodInvocation; -import lombok.ast.Node; -import lombok.ast.Position; -import lombok.ast.TypeDeclaration; -import lombok.ast.VariableReference; +import static com.android.SdkConstants.CLASS_CONTEXT; +import static com.android.tools.klint.client.api.JavaParser.ResolvedNode; +import static com.android.tools.klint.client.api.JavaParser.TypeDescriptor; /** * A {@link Context} used when checking Java files. @@ -252,8 +221,8 @@ public class JavaContext extends Context { UElementWithLocation segment = (UElementWithLocation) node; return Location.create(ioFile, file.getPsi().getText(), segment.getStartOffset(), segment.getEndOffset()); - } else if (node instanceof PsiElementBacked) { - PsiElement psiElement = ((PsiElementBacked) node).getPsi(); + } else { + PsiElement psiElement = node.getPsi(); if (psiElement != null) { TextRange range = psiElement.getTextRange(); UFile containingFile = getUFile(); @@ -478,10 +447,7 @@ public class JavaContext extends Context { } public boolean isSuppressedWithComment(@NonNull UElement scope, @NonNull Issue issue) { - if (!(scope instanceof PsiElementBacked)) { - return false; - } - PsiElement psi = ((PsiElementBacked) scope).getPsi(); + PsiElement psi = scope.getPsi(); return psi != null && isSuppressedWithComment(psi, issue); } diff --git a/plugins/lint/lint-checks/src/com/android/tools/klint/checks/AnnotationDetector.java b/plugins/lint/lint-checks/src/com/android/tools/klint/checks/AnnotationDetector.java index 4ea44f60a1e..a4d81abc736 100644 --- a/plugins/lint/lint-checks/src/com/android/tools/klint/checks/AnnotationDetector.java +++ b/plugins/lint/lint-checks/src/com/android/tools/klint/checks/AnnotationDetector.java @@ -416,14 +416,12 @@ public class AnnotationDetector extends Detector implements Detector.UastScanner if (condition != null && PsiType.INT.equals(condition.getExpressionType())) { UAnnotation annotation = findIntDefAnnotation(condition); if (annotation != null) { - UNamedExpression namedValue = + UExpression value = annotation.findDeclaredAttributeValue(ATTR_VALUE); - if (namedValue == null) { - namedValue = annotation.findDeclaredAttributeValue(null); + if (value == null) { + value = annotation.findDeclaredAttributeValue(null); } - UExpression value = (namedValue != null) ? namedValue.getExpression() : null; - if (UastExpressionUtils.isArrayInitializer(value)) { List allowedValues = ((UCallExpression) value).getValueArguments(); @@ -514,14 +512,10 @@ public class AnnotationDetector extends Detector implements Detector.UastScanner } private void ensureUniqueValues(@NonNull UAnnotation node) { - UNamedExpression namedValue = node.findAttributeValue(ATTR_VALUE); - if (namedValue == null) { - namedValue = node.findAttributeValue(null); + UExpression value = node.findAttributeValue(ATTR_VALUE); + if (value == null) { + value = node.findAttributeValue(null); } - if (namedValue == null) { - return; - } - UExpression value = namedValue.getExpression(); if (!(UastExpressionUtils.isArrayInitializer(value))) { return; diff --git a/plugins/lint/lint-checks/src/com/android/tools/klint/checks/ApiDetector.java b/plugins/lint/lint-checks/src/com/android/tools/klint/checks/ApiDetector.java index f453b619fb2..2ebcb04572c 100644 --- a/plugins/lint/lint-checks/src/com/android/tools/klint/checks/ApiDetector.java +++ b/plugins/lint/lint-checks/src/com/android/tools/klint/checks/ApiDetector.java @@ -1263,34 +1263,28 @@ public class ApiDetector extends ResourceXmlDetector } @Override - public boolean visitVariable(@NotNull UVariable node) { - if (node instanceof ULocalVariable) { - visitLocalVariable((ULocalVariable) node); - } - return super.visitVariable(node); - } - - private void visitLocalVariable(ULocalVariable variable) { + public boolean visitLocalVariable(ULocalVariable variable) { UExpression initializer = variable.getUastInitializer(); if (initializer == null) { - return; + return true; } PsiType initializerType = initializer.getExpressionType(); if (!(initializerType instanceof PsiClassType)) { - return; + return true; } PsiType interfaceType = variable.getType(); if (initializerType.equals(interfaceType)) { - return; + return true; } if (!(interfaceType instanceof PsiClassType)) { - return; + return true; } checkCast(initializer, (PsiClassType)initializerType, (PsiClassType)interfaceType); + return true; } @Override diff --git a/plugins/lint/lint-checks/src/com/android/tools/klint/checks/PermissionRequirement.java b/plugins/lint/lint-checks/src/com/android/tools/klint/checks/PermissionRequirement.java index 8a5309b279e..ef5ba74016c 100644 --- a/plugins/lint/lint-checks/src/com/android/tools/klint/checks/PermissionRequirement.java +++ b/plugins/lint/lint-checks/src/com/android/tools/klint/checks/PermissionRequirement.java @@ -16,25 +16,18 @@ package com.android.tools.klint.checks; -import static com.android.SdkConstants.ATTR_VALUE; -import static com.android.tools.klint.checks.SupportAnnotationDetector.ATTR_ALL_OF; -import static com.android.tools.klint.checks.SupportAnnotationDetector.ATTR_ANY_OF; -import static com.android.tools.klint.checks.SupportAnnotationDetector.ATTR_CONDITIONAL; - import com.android.annotations.NonNull; import com.android.annotations.Nullable; import com.android.annotations.VisibleForTesting; import com.android.sdklib.AndroidVersion; import com.android.tools.klint.detector.api.ConstantEvaluator; -import com.android.tools.klint.detector.api.JavaContext; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.intellij.psi.JavaTokenType; -import com.intellij.psi.PsiAnnotation; -import com.intellij.psi.PsiAnnotationMemberValue; -import com.intellij.psi.PsiArrayInitializerMemberValue; import com.intellij.psi.tree.IElementType; -import org.jetbrains.uast.*; +import org.jetbrains.uast.UAnnotation; +import org.jetbrains.uast.UCallExpression; +import org.jetbrains.uast.UExpression; import org.jetbrains.uast.util.UastExpressionUtils; import java.util.Arrays; @@ -42,6 +35,9 @@ import java.util.Collections; import java.util.List; import java.util.Set; +import static com.android.SdkConstants.ATTR_VALUE; +import static com.android.tools.klint.checks.SupportAnnotationDetector.*; + /** * A permission requirement is a boolean expression of permission names that a * caller must satisfy for a given Android API. @@ -140,7 +136,7 @@ public abstract class PermissionRequirement { public static Boolean getAnnotationBooleanValue(@Nullable UAnnotation annotation, @NonNull String name) { if (annotation != null) { - UNamedExpression attributeValue = annotation.findDeclaredAttributeValue(name); + UExpression attributeValue = annotation.findDeclaredAttributeValue(name); if (attributeValue == null && ATTR_VALUE.equals(name)) { attributeValue = annotation.findDeclaredAttributeValue(null); } @@ -160,7 +156,7 @@ public abstract class PermissionRequirement { public static Long getAnnotationLongValue(@Nullable UAnnotation annotation, @NonNull String name) { if (annotation != null) { - UNamedExpression attributeValue = annotation.findDeclaredAttributeValue(name); + UExpression attributeValue = annotation.findDeclaredAttributeValue(name); if (attributeValue == null && ATTR_VALUE.equals(name)) { attributeValue = annotation.findDeclaredAttributeValue(null); } @@ -180,7 +176,7 @@ public abstract class PermissionRequirement { public static Double getAnnotationDoubleValue(@Nullable UAnnotation annotation, @NonNull String name) { if (annotation != null) { - UNamedExpression attributeValue = annotation.findDeclaredAttributeValue(name); + UExpression attributeValue = annotation.findDeclaredAttributeValue(name); if (attributeValue == null && ATTR_VALUE.equals(name)) { attributeValue = annotation.findDeclaredAttributeValue(null); } @@ -200,7 +196,7 @@ public abstract class PermissionRequirement { public static String getAnnotationStringValue(@Nullable UAnnotation annotation, @NonNull String name) { if (annotation != null) { - UNamedExpression attributeValue = annotation.findDeclaredAttributeValue(name); + UExpression attributeValue = annotation.findDeclaredAttributeValue(name); if (attributeValue == null && ATTR_VALUE.equals(name)) { attributeValue = annotation.findDeclaredAttributeValue(null); } @@ -220,16 +216,16 @@ public abstract class PermissionRequirement { public static String[] getAnnotationStringValues(@Nullable UAnnotation annotation, @NonNull String name) { if (annotation != null) { - UNamedExpression attributeValue = annotation.findDeclaredAttributeValue(name); + UExpression attributeValue = annotation.findDeclaredAttributeValue(name); if (attributeValue == null && ATTR_VALUE.equals(name)) { attributeValue = annotation.findDeclaredAttributeValue(null); } if (attributeValue == null) { return null; } - if (UastExpressionUtils.isArrayInitializer(attributeValue.getExpression())) { + if (UastExpressionUtils.isArrayInitializer(attributeValue)) { List initializers = - ((UCallExpression) attributeValue.getExpression()).getValueArguments(); + ((UCallExpression) attributeValue).getValueArguments(); List result = Lists.newArrayListWithCapacity(initializers.size()); ConstantEvaluator constantEvaluator = new ConstantEvaluator(null); for (UExpression element : initializers) { @@ -245,7 +241,7 @@ public abstract class PermissionRequirement { } } else { // Use constant evaluator since we want to resolve field references as well - Object o = ConstantEvaluator.evaluate(null, attributeValue.getExpression()); + Object o = ConstantEvaluator.evaluate(null, attributeValue); if (o instanceof String) { return new String[]{(String) o}; } else if (o instanceof String[]) { diff --git a/plugins/lint/lint-checks/src/com/android/tools/klint/checks/SupportAnnotationDetector.java b/plugins/lint/lint-checks/src/com/android/tools/klint/checks/SupportAnnotationDetector.java index 14cf7c24c39..5cef7f34760 100644 --- a/plugins/lint/lint-checks/src/com/android/tools/klint/checks/SupportAnnotationDetector.java +++ b/plugins/lint/lint-checks/src/com/android/tools/klint/checks/SupportAnnotationDetector.java @@ -16,37 +16,6 @@ package com.android.tools.klint.checks; -import static com.android.SdkConstants.ANDROID_URI; -import static com.android.SdkConstants.ATTR_NAME; -import static com.android.SdkConstants.ATTR_VALUE; -import static com.android.SdkConstants.CLASS_INTENT; -import static com.android.SdkConstants.CLASS_VIEW; -import static com.android.SdkConstants.INT_DEF_ANNOTATION; -import static com.android.SdkConstants.STRING_DEF_ANNOTATION; -import static com.android.SdkConstants.SUPPORT_ANNOTATIONS_PREFIX; -import static com.android.SdkConstants.TAG_PERMISSION; -import static com.android.SdkConstants.TAG_USES_PERMISSION; -import static com.android.SdkConstants.TAG_USES_PERMISSION_SDK_23; -import static com.android.SdkConstants.TAG_USES_PERMISSION_SDK_M; -import static com.android.SdkConstants.TYPE_DEF_FLAG_ATTRIBUTE; -import static com.android.resources.ResourceType.COLOR; -import static com.android.resources.ResourceType.DIMEN; -import static com.android.resources.ResourceType.DRAWABLE; -import static com.android.resources.ResourceType.MIPMAP; -import static com.android.tools.klint.checks.PermissionFinder.Operation.ACTION; -import static com.android.tools.klint.checks.PermissionFinder.Operation.READ; -import static com.android.tools.klint.checks.PermissionFinder.Operation.WRITE; -import static com.android.tools.klint.checks.PermissionRequirement.ATTR_PROTECTION_LEVEL; -import static com.android.tools.klint.checks.PermissionRequirement.VALUE_DANGEROUS; -import static com.android.tools.klint.checks.PermissionRequirement.getAnnotationBooleanValue; -import static com.android.tools.klint.checks.PermissionRequirement.getAnnotationDoubleValue; -import static com.android.tools.klint.checks.PermissionRequirement.getAnnotationLongValue; -import static com.android.tools.klint.checks.PermissionRequirement.getAnnotationStringValue; -import static com.android.tools.klint.detector.api.ResourceEvaluator.COLOR_INT_ANNOTATION; -import static com.android.tools.klint.detector.api.ResourceEvaluator.PX_ANNOTATION; -import static com.android.tools.klint.detector.api.ResourceEvaluator.RES_SUFFIX; -import static org.jetbrains.uast.UastUtils.getQualifiedParentOrThis; - import com.android.annotations.NonNull; import com.android.annotations.Nullable; import com.android.resources.ResourceType; @@ -58,35 +27,11 @@ import com.android.tools.klint.client.api.ExternalReferenceExpression; import com.android.tools.klint.client.api.JavaEvaluator; import com.android.tools.klint.client.api.LintClient; import com.android.tools.klint.client.api.UastLintUtils; -import com.android.tools.klint.detector.api.Category; -import com.android.tools.klint.detector.api.ConstantEvaluator; -import com.android.tools.klint.detector.api.Detector; -import com.android.tools.klint.detector.api.Implementation; -import com.android.tools.klint.detector.api.Issue; -import com.android.tools.klint.detector.api.JavaContext; -import com.android.tools.klint.detector.api.Project; -import com.android.tools.klint.detector.api.ResourceEvaluator; -import com.android.tools.klint.detector.api.Scope; -import com.android.tools.klint.detector.api.Severity; -import com.android.tools.klint.detector.api.TextFormat; +import com.android.tools.klint.detector.api.*; import com.android.utils.XmlUtils; import com.google.common.base.Joiner; import com.google.common.collect.Sets; -import com.intellij.psi.PsiAnnotation; -import com.intellij.psi.PsiArrayType; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiClassType; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiField; -import com.intellij.psi.PsiJavaCodeReferenceElement; -import com.intellij.psi.PsiMethod; -import com.intellij.psi.PsiModifier; -import com.intellij.psi.PsiModifierList; -import com.intellij.psi.PsiParameter; -import com.intellij.psi.PsiParameterList; -import com.intellij.psi.PsiType; -import com.intellij.psi.PsiVariable; - +import com.intellij.psi.*; import org.jetbrains.uast.*; import org.jetbrains.uast.java.JavaUAnnotation; import org.jetbrains.uast.util.UastExpressionUtils; @@ -98,13 +43,14 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.EnumSet; -import java.util.List; -import java.util.Locale; -import java.util.Set; +import java.util.*; + +import static com.android.SdkConstants.*; +import static com.android.resources.ResourceType.*; +import static com.android.tools.klint.checks.PermissionFinder.Operation.*; +import static com.android.tools.klint.checks.PermissionRequirement.*; +import static com.android.tools.klint.detector.api.ResourceEvaluator.*; +import static org.jetbrains.uast.UastUtils.getQualifiedParentOrThis; /** * Looks up annotations on method calls and enforces the various things they @@ -1710,15 +1656,11 @@ public class SupportAnnotationDetector extends Detector implements Detector.Uast @Nullable private static UExpression getAnnotationValue(@NonNull UAnnotation annotation) { - UNamedExpression value = annotation.findDeclaredAttributeValue(ATTR_VALUE); + UExpression value = annotation.findDeclaredAttributeValue(ATTR_VALUE); if (value == null) { value = annotation.findDeclaredAttributeValue(null); } - if (value == null) { - return null; - } - - return value.getExpression(); + return value; } private static String listAllowedValues(@NonNull UElement context, diff --git a/plugins/lint/lint-idea/src/org/jetbrains/android/inspections/klint/IntellijLintUtils.java b/plugins/lint/lint-idea/src/org/jetbrains/android/inspections/klint/IntellijLintUtils.java index 724e5c7b1ef..a9b71b6da0b 100644 --- a/plugins/lint/lint-idea/src/org/jetbrains/android/inspections/klint/IntellijLintUtils.java +++ b/plugins/lint/lint-idea/src/org/jetbrains/android/inspections/klint/IntellijLintUtils.java @@ -40,7 +40,6 @@ import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.uast.*; -import org.jetbrains.uast.psi.PsiElementBacked; import org.jetbrains.uast.psi.UElementWithLocation; import org.jetbrains.uast.util.UastExpressionUtils; @@ -116,11 +115,9 @@ public class IntellijLintUtils { } TextRange textRange = null; - if (element instanceof PsiElementBacked) { - PsiElement psi = ((PsiElementBacked) element).getPsi(); - if (psi != null) { - textRange = psi.getTextRange(); - } + PsiElement psi = element.getPsi(); + if (psi != null) { + textRange = psi.getTextRange(); } else if (element instanceof UElementWithLocation) { UElementWithLocation elementWithLocation = (UElementWithLocation) element; textRange = new TextRange( diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt index e67fd5f57dc..94dfa1fa981 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinAbstractUElement.kt @@ -17,16 +17,14 @@ package org.jetbrains.uast.kotlin import org.jetbrains.kotlin.psi.KtAnnotatedExpression -import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.uast.UAnnotation import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression -import org.jetbrains.uast.psi.PsiElementBacked abstract class KotlinAbstractUElement : UElement { override fun equals(other: Any?): Boolean { - if (this !is PsiElementBacked || other !is PsiElementBacked) { - return this === other + if (other !is UElement) { + return false } return this.psi == other.psi @@ -36,8 +34,7 @@ abstract class KotlinAbstractUElement : UElement { abstract class KotlinAbstractUExpression : KotlinAbstractUElement(), UExpression { override val annotations: List get() { - val psi = (this as? PsiElementBacked)?.psi as? KtExpression ?: return emptyList() - val annotatedExpression = psi.parent as? KtAnnotatedExpression ?: return emptyList() + val annotatedExpression = psi?.parent as? KtAnnotatedExpression ?: return emptyList() return annotatedExpression.annotationEntries.map { KotlinUAnnotation(it, this) } } } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt index e3d77df8a45..7bd41bfd340 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt @@ -42,7 +42,6 @@ import org.jetbrains.uast.kotlin.expressions.* import org.jetbrains.uast.kotlin.kinds.KotlinSpecialExpressionKinds import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable -import org.jetbrains.uast.psi.PsiElementBacked interface KotlinUastBindingContextProviderService { fun getBindingContext(element: KtElement): BindingContext @@ -159,7 +158,7 @@ class KotlinUastLanguagePlugin : UastLanguagePlugin { return when (element) { is KotlinUSimpleReferenceExpression.KotlinAccessorCallExpression -> element.setterValue != null is KotlinAbstractUExpression -> { - val ktElement = ((element as? PsiElementBacked)?.psi as? KtElement) ?: return false + val ktElement = element.psi as? KtElement ?: return false ktElement.analyze()[BindingContext.USED_AS_EXPRESSION, ktElement] ?: false } else -> false @@ -227,7 +226,7 @@ internal object KotlinConverter { psi: KtVariableDeclaration, parent: UElement? ): UDeclarationsExpression { - val parentPsiElement = (parent as? PsiElementBacked)?.psi + val parentPsiElement = parent?.psi val variable = KotlinUVariable.create(UastKotlinPsiVariable.create(psi, parentPsiElement, parent!!), parent) return KotlinUDeclarationsExpression(parent).apply { declarations = listOf(variable) } } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotation.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotation.kt index fc4b362bd2c..f0d82642efc 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotation.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotation.kt @@ -1,6 +1,7 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiClass +import com.intellij.psi.PsiElement import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe @@ -19,7 +20,7 @@ class KotlinUAnnotation( val context = getUastContext() psi.valueArguments.map { arg -> val name = arg.getArgumentName()?.asName?.asString() ?: "" - UNamedExpression(name, this).apply { + KotlinUNamedExpression(name, this).apply { val value = arg.getArgumentExpression()?.let { context.convertElement(it, this) } as? UExpression expression = value ?: UastEmptyExpression } @@ -34,7 +35,17 @@ class KotlinUAnnotation( //TODO override fun findAttributeValue(name: String?) = findDeclaredAttributeValue(name) - override fun findDeclaredAttributeValue(name: String?): UNamedExpression? { - return attributeValues.firstOrNull { it.matchesName(name ?: "value") } + override fun findDeclaredAttributeValue(name: String?): UExpression? { + return attributeValues.firstOrNull { it.name == (name ?: "value") }?.expression } -} \ No newline at end of file +} + +class KotlinUNamedExpression(override val name: String, override val containingElement: UElement?) : UNamedExpression { + override lateinit var expression: UExpression + + override val annotations: List + get() = emptyList() + + override val psi: PsiElement? + get() = null +} diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt index e68716b6265..9cd8789ac90 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUClass.kt @@ -69,6 +69,9 @@ class KotlinUClass private constructor( val containingMethod = this object : UBlockExpression { + override val psi: PsiElement? + get() = null + override val containingElement: UElement? get() = containingMethod diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUImportStatement.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUImportStatement.kt index a3e1656f11a..ab1d41e58c4 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUImportStatement.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUImportStatement.kt @@ -25,7 +25,6 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.uast.UElement import org.jetbrains.uast.UImportStatement import org.jetbrains.uast.USimpleNameReferenceExpression -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUImportStatement( override val psi: KtImportDirective, @@ -50,7 +49,7 @@ class KotlinUImportStatement( override val identifier: String, override val containingElement: UElement?, private val importDirective: KtImportDirective - ) : KotlinAbstractUExpression(), USimpleNameReferenceExpression, PsiElementBacked { + ) : KotlinAbstractUExpression(), USimpleNameReferenceExpression { override val resolvedName: String? get() = identifier diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt index 05252ecac49..a4ea66430df 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt @@ -27,7 +27,6 @@ import org.jetbrains.uast.java.JavaUAnnotation import org.jetbrains.uast.java.annotations import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable -import org.jetbrains.uast.psi.PsiElementBacked abstract class AbstractKotlinUVariable : AbstractJavaUVariable() { override val uastInitializer: UExpression? @@ -179,7 +178,7 @@ open class KotlinUEnumConstant( private class KotlinEnumConstantClassReference( override val psi: PsiEnumConstant, override val containingElement: UElement? - ) : JavaAbstractUExpression(), USimpleNameReferenceExpression, PsiElementBacked { + ) : JavaAbstractUExpression(), USimpleNameReferenceExpression { override fun resolve() = psi.containingClass override val resolvedName: String? get() = psi.containingClass?.name diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/evaluation/KotlinEvaluatorExtension.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/evaluation/KotlinEvaluatorExtension.kt index d9eb8b7e62f..e2642d6bd8a 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/evaluation/KotlinEvaluatorExtension.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/evaluation/KotlinEvaluatorExtension.kt @@ -3,14 +3,14 @@ package org.jetbrains.uast.kotlin.evaluation import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.uast.UBinaryExpression import org.jetbrains.uast.UastPostfixOperator +import org.jetbrains.uast.evaluation.AbstractEvaluatorExtension import org.jetbrains.uast.evaluation.UEvaluationInfo import org.jetbrains.uast.evaluation.UEvaluationState -import org.jetbrains.uast.evaluation.UEvaluatorExtension import org.jetbrains.uast.kotlin.KotlinBinaryOperators import org.jetbrains.uast.kotlin.KotlinPostfixOperators import org.jetbrains.uast.values.* -class KotlinEvaluatorExtension : UEvaluatorExtension { +class KotlinEvaluatorExtension : AbstractEvaluatorExtension(KotlinLanguage.INSTANCE) { private data class Range(val from: UValue, val to: UValue) { override fun toString() = "$from..$to" @@ -20,8 +20,6 @@ class KotlinEvaluatorExtension : UEvaluatorExtension { constructor(from: UValue, to: UValue, source: UBinaryExpression): this(Range(from, to), source) } - override val language: KotlinLanguage = KotlinLanguage.INSTANCE - override fun evaluatePostfix( operator: UastPostfixOperator, operandValue: UValue, diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/ElvisExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/ElvisExpression.kt index b76b01320c6..2eba7eb07ff 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/ElvisExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/ElvisExpression.kt @@ -12,6 +12,7 @@ import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable private fun createVariableReferenceExpression(variable: UVariable, containingElement: UElement?) = object : USimpleNameReferenceExpression { + override val psi: PsiElement? = null override fun resolve(): PsiElement? = variable override val containingElement: UElement? = containingElement override val resolvedName: String? = variable.name @@ -21,6 +22,7 @@ private fun createVariableReferenceExpression(variable: UVariable, containingEle private fun createNullLiteralExpression(containingElement: UElement?) = object : ULiteralExpression { + override val psi: PsiElement? = null override val containingElement: UElement? = containingElement override val value: Any? = null override val annotations: List = emptyList() @@ -28,6 +30,7 @@ private fun createNullLiteralExpression(containingElement: UElement?) = private fun createNotEqWithNullExpression(variable: UVariable, containingElement: UElement?) = object : UBinaryExpression { + override val psi: PsiElement? = null override val containingElement: UElement? = containingElement override val leftOperand: UExpression by lz { createVariableReferenceExpression(variable, this) } override val rightOperand: UExpression by lz { createNullLiteralExpression(this) } @@ -49,6 +52,7 @@ private fun createElvisExpressions( declaration.declarations = listOf(tempVariable) val ifExpression = object : UIfExpression { + override val psi: PsiElement? = null override val containingElement: UElement? = containingElement override val condition: UExpression by lz { createNotEqWithNullExpression(tempVariable, this) } override val thenExpression: UExpression? by lz { createVariableReferenceExpression(tempVariable, this) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinStringTemplateUPolyadicExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinStringTemplateUPolyadicExpression.kt index 67f77e80579..606e28bdcc8 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinStringTemplateUPolyadicExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinStringTemplateUPolyadicExpression.kt @@ -17,15 +17,16 @@ package org.jetbrains.uast.kotlin import org.jetbrains.kotlin.psi.KtStringTemplateExpression -import org.jetbrains.uast.* -import org.jetbrains.uast.psi.PsiElementBacked +import org.jetbrains.uast.UElement +import org.jetbrains.uast.UExpression +import org.jetbrains.uast.UPolyadicExpression +import org.jetbrains.uast.UastBinaryOperator class KotlinStringTemplateUPolyadicExpression( override val psi: KtStringTemplateExpression, override val containingElement: UElement? ) : KotlinAbstractUExpression(), UPolyadicExpression, - PsiElementBacked, KotlinUElementWithType, KotlinEvaluatableUElement { override val operands: List by lz { psi.entries.map { KotlinConverter.convert(it, this) } } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUArrayAccessExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUArrayAccessExpression.kt index d6ee9d0213e..5a702f83b6b 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUArrayAccessExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUArrayAccessExpression.kt @@ -19,12 +19,11 @@ package org.jetbrains.uast.kotlin 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 containingElement: UElement? -) : KotlinAbstractUExpression(), UArrayAccessExpression, PsiElementBacked, KotlinUElementWithType, KotlinEvaluatableUElement { +) : KotlinAbstractUExpression(), UArrayAccessExpression, KotlinUElementWithType, KotlinEvaluatableUElement { override val receiver by lz { KotlinConverter.convertOrEmpty(psi.arrayExpression, this) } override val indices by lz { psi.indexExpressions.map { KotlinConverter.convertOrEmpty(it, this) } } } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpression.kt index 51886ebf111..5c26bbc3c03 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpression.kt @@ -25,12 +25,11 @@ import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.uast.* -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUBinaryExpression( override val psi: KtBinaryExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UBinaryExpression, PsiElementBacked, KotlinUElementWithType, KotlinEvaluatableUElement { +) : KotlinAbstractUExpression(), UBinaryExpression, KotlinUElementWithType, KotlinEvaluatableUElement { private companion object { val BITWISE_OPERATORS = mapOf( "or" to UastBinaryOperator.BITWISE_OR, @@ -90,7 +89,7 @@ class KotlinUBinaryExpression( class KotlinCustomUBinaryExpression( override val psi: PsiElement, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UBinaryExpression, PsiElementBacked { +) : KotlinAbstractUExpression(), UBinaryExpression { lateinit override var leftOperand: UExpression internal set diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpressionWithType.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpressionWithType.kt index 8a094205bb5..d4fb9b4b87d 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpressionWithType.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBinaryExpressionWithType.kt @@ -21,12 +21,11 @@ import com.intellij.psi.PsiType 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 containingElement: UElement? -) : KotlinAbstractUExpression(), UBinaryExpressionWithType, PsiElementBacked, +) : KotlinAbstractUExpression(), UBinaryExpressionWithType, KotlinUElementWithType, KotlinEvaluatableUElement { override val operand by lz { KotlinConverter.convertOrEmpty(psi.left, this) } @@ -46,7 +45,7 @@ class KotlinUBinaryExpressionWithType( class KotlinCustomUBinaryExpressionWithType( override val psi: PsiElement, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UBinaryExpressionWithType, PsiElementBacked { +) : KotlinAbstractUExpression(), UBinaryExpressionWithType { lateinit override var operand: UExpression internal set diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBlockExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBlockExpression.kt index 6542b0b862d..b09f4143f2d 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBlockExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBlockExpression.kt @@ -19,11 +19,10 @@ package org.jetbrains.uast.kotlin import org.jetbrains.kotlin.psi.KtBlockExpression import org.jetbrains.uast.UBlockExpression import org.jetbrains.uast.UElement -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUBlockExpression( override val psi: KtBlockExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UBlockExpression, PsiElementBacked, KotlinUElementWithType { +) : KotlinAbstractUExpression(), UBlockExpression, KotlinUElementWithType { override val expressions by lz { psi.statements.map { KotlinConverter.convertOrEmpty(it, this) } } } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBreakExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBreakExpression.kt index 4dbc01ec1f7..d7a6ab9f88c 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBreakExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUBreakExpression.kt @@ -20,12 +20,11 @@ import org.jetbrains.kotlin.psi.KtBreakExpression import org.jetbrains.uast.UBreakExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.kotlin.KotlinAbstractUExpression -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUBreakExpression( override val psi: KtBreakExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UBreakExpression, PsiElementBacked { +) : KotlinAbstractUExpression(), UBreakExpression { override val label: String? get() = psi.getLabelName() } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCallableReferenceExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCallableReferenceExpression.kt index 8328e3705af..41f9079bf12 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCallableReferenceExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCallableReferenceExpression.kt @@ -22,12 +22,11 @@ import org.jetbrains.kotlin.resolve.BindingContext.DOUBLE_COLON_LHS import org.jetbrains.uast.UCallableReferenceExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUCallableReferenceExpression( override val psi: KtCallableReferenceExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UCallableReferenceExpression, PsiElementBacked, KotlinUElementWithType { +) : KotlinAbstractUExpression(), UCallableReferenceExpression, KotlinUElementWithType { override val qualifierExpression: UExpression? get() { if (qualifierType != null) return null diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCatchClause.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCatchClause.kt index e74aebeffbc..456cbf1b3cc 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCatchClause.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUCatchClause.kt @@ -22,12 +22,11 @@ import org.jetbrains.uast.UElement import org.jetbrains.uast.UParameter import org.jetbrains.uast.UTypeReferenceExpression import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUCatchClause( override val psi: KtCatchClause, override val containingElement: UElement? -) : KotlinAbstractUElement(), UCatchClause, PsiElementBacked { +) : KotlinAbstractUElement(), UCatchClause { override val body by lz { KotlinConverter.convertOrEmpty(psi.catchBody, this) } override val parameters by lz { diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUClassLiteralExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUClassLiteralExpression.kt index 11bd8f44fb8..7acfe25c40a 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUClassLiteralExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUClassLiteralExpression.kt @@ -21,12 +21,11 @@ import org.jetbrains.kotlin.resolve.BindingContext.DOUBLE_COLON_LHS import org.jetbrains.uast.UClassLiteralExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUClassLiteralExpression( override val psi: KtClassLiteralExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UClassLiteralExpression, PsiElementBacked, KotlinUElementWithType { +) : KotlinAbstractUExpression(), UClassLiteralExpression, KotlinUElementWithType { override val type by lz { val ktType = psi.analyze()[DOUBLE_COLON_LHS, psi.receiverExpression]?.type ?: return@lz null ktType.toPsiType(this, psi, boxed = true) diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUContinueExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUContinueExpression.kt index b9b3b52f2ca..eddaa4c3932 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUContinueExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUContinueExpression.kt @@ -20,12 +20,11 @@ import org.jetbrains.kotlin.psi.KtContinueExpression import org.jetbrains.uast.UContinueExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.kotlin.KotlinAbstractUExpression -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUContinueExpression( override val psi: KtContinueExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UContinueExpression, PsiElementBacked { +) : KotlinAbstractUExpression(), UContinueExpression { override val label: String? get() = psi.getLabelName() } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDeclarationsExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDeclarationsExpression.kt index fcc355ad0a7..57f4a3d208f 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDeclarationsExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDeclarationsExpression.kt @@ -15,11 +15,15 @@ */ package org.jetbrains.uast +import com.intellij.psi.PsiElement import org.jetbrains.uast.kotlin.KotlinAbstractUExpression class KotlinUDeclarationsExpression( override val containingElement: UElement? ) : KotlinAbstractUExpression(), UDeclarationsExpression { + override val psi: PsiElement? + get() = null + override lateinit var declarations: List internal set } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDoWhileExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDoWhileExpression.kt index 686da9a78e6..bd714988286 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDoWhileExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUDoWhileExpression.kt @@ -20,12 +20,11 @@ import org.jetbrains.kotlin.psi.KtDoWhileExpression import org.jetbrains.uast.UDoWhileExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UIdentifier -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUDoWhileExpression( override val psi: KtDoWhileExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UDoWhileExpression, PsiElementBacked { +) : KotlinAbstractUExpression(), UDoWhileExpression { override val condition by lz { KotlinConverter.convertOrEmpty(psi.condition, this) } override val body by lz { KotlinConverter.convertOrEmpty(psi.body, this) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUExpression.kt index 9310b1da874..b1b38f20dbf 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUExpression.kt @@ -21,9 +21,8 @@ import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.uast.UExpression -import org.jetbrains.uast.psi.PsiElementBacked -interface KotlinUElementWithType : UExpression, PsiElementBacked { +interface KotlinUElementWithType : UExpression { override fun getExpressionType(): PsiType? { val ktElement = psi as? KtExpression ?: return null val ktType = ktElement.analyze()[BindingContext.EXPRESSION_TYPE_INFO, ktElement]?.type ?: return null @@ -31,7 +30,7 @@ interface KotlinUElementWithType : UExpression, PsiElementBacked { } } -interface KotlinEvaluatableUElement : UExpression, PsiElementBacked { +interface KotlinEvaluatableUElement : UExpression { override fun evaluate(): Any? { val ktElement = psi as? KtExpression ?: return null diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUExpressionList.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUExpressionList.kt index 641d5d6e2cd..4dd43afb4b7 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUExpressionList.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUExpressionList.kt @@ -24,13 +24,12 @@ import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression import org.jetbrains.uast.UExpressionList import org.jetbrains.uast.UastSpecialExpressionKind -import org.jetbrains.uast.psi.PsiElementBacked open class KotlinUExpressionList( override val psi: PsiElement?, override val kind: UastSpecialExpressionKind, // original element override val containingElement: UElement? -) : KotlinAbstractUExpression(), UExpressionList, PsiElementBacked, KotlinUElementWithType, KotlinEvaluatableUElement { +) : KotlinAbstractUExpression(), UExpressionList, KotlinUElementWithType, KotlinEvaluatableUElement { override lateinit var expressions: List internal set diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUForEachExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUForEachExpression.kt index ceb26346f6a..cf9023f7bbc 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUForEachExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUForEachExpression.kt @@ -22,13 +22,12 @@ import org.jetbrains.uast.UElement import org.jetbrains.uast.UForEachExpression import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter -import org.jetbrains.uast.psi.PsiElementBacked import org.jetbrains.uast.psi.UastPsiParameterNotResolved class KotlinUForEachExpression( override val psi: KtForExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UForEachExpression, PsiElementBacked { +) : KotlinAbstractUExpression(), UForEachExpression { override val iteratedValue by lz { KotlinConverter.convertOrEmpty(psi.loopRange, this) } override val body by lz { KotlinConverter.convertOrEmpty(psi.body, this) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt index cb37b807593..e57186bd7e4 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUFunctionCallExpression.kt @@ -30,14 +30,13 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.uast.* import org.jetbrains.uast.internal.acceptList -import org.jetbrains.uast.psi.PsiElementBacked import org.jetbrains.uast.visitor.UastVisitor class KotlinUFunctionCallExpression( override val psi: KtCallExpression, override val containingElement: UElement?, private val _resolvedCall: ResolvedCall<*>? = null -) : KotlinAbstractUExpression(), UCallExpression, PsiElementBacked, KotlinUElementWithType { +) : KotlinAbstractUExpression(), UCallExpression, KotlinUElementWithType { companion object { fun resolveSource(descriptor: DeclarationDescriptor, source: PsiElement?): PsiMethod? { if (descriptor is ConstructorDescriptor && descriptor.isPrimary diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUIfExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUIfExpression.kt index 0b455101fbc..8485d88be4a 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUIfExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUIfExpression.kt @@ -20,12 +20,11 @@ import org.jetbrains.kotlin.psi.KtIfExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.UIfExpression -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUIfExpression( override val psi: KtIfExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UIfExpression, PsiElementBacked, KotlinUElementWithType, KotlinEvaluatableUElement { +) : KotlinAbstractUExpression(), UIfExpression, KotlinUElementWithType, KotlinEvaluatableUElement { override val condition by lz { KotlinConverter.convertOrEmpty(psi.condition, this) } override val thenExpression by lz { KotlinConverter.convertOrNull(psi.then, this) } override val elseExpression by lz { KotlinConverter.convertOrNull(psi.`else`, this) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULabeledExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULabeledExpression.kt index 32b39bf742d..2f760c532da 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULabeledExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULabeledExpression.kt @@ -20,12 +20,11 @@ import org.jetbrains.kotlin.psi.KtLabeledExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.ULabeledExpression -import org.jetbrains.uast.psi.PsiElementBacked class KotlinULabeledExpression( override val psi: KtLabeledExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), ULabeledExpression, PsiElementBacked { +) : KotlinAbstractUExpression(), ULabeledExpression { override val label: String get() = psi.getLabelName().orAnonymous("label") diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULambdaExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULambdaExpression.kt index 7fa38a1bfa7..61fc7782622 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULambdaExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULambdaExpression.kt @@ -21,13 +21,12 @@ import org.jetbrains.uast.UBlockExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.ULambdaExpression import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter -import org.jetbrains.uast.psi.PsiElementBacked import org.jetbrains.uast.withMargin class KotlinULambdaExpression( override val psi: KtLambdaExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), ULambdaExpression, PsiElementBacked, KotlinUElementWithType { +) : KotlinAbstractUExpression(), ULambdaExpression, KotlinUElementWithType { override val body by lz { KotlinConverter.convertOrEmpty(psi.bodyExpression, this) } override val valueParameters by lz { diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULiteralExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULiteralExpression.kt index 82bb391674f..0582a931cd7 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULiteralExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinULiteralExpression.kt @@ -22,12 +22,11 @@ import org.jetbrains.kotlin.KtNodeTypes 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 containingElement: UElement? -) : KotlinAbstractUExpression(), ULiteralExpression, PsiElementBacked, KotlinUElementWithType, KotlinEvaluatableUElement { +) : KotlinAbstractUExpression(), ULiteralExpression, KotlinUElementWithType, KotlinEvaluatableUElement { override val isNull: Boolean get() = psi.unwrapBlockOrParenthesis().node?.elementType == KtNodeTypes.NULL @@ -38,7 +37,7 @@ class KotlinStringULiteralExpression( override val psi: PsiElement, override val containingElement: UElement?, val text: String? = null -) : KotlinAbstractUExpression(), ULiteralExpression, PsiElementBacked, KotlinUElementWithType{ +) : KotlinAbstractUExpression(), ULiteralExpression, KotlinUElementWithType{ override val value: String get() = text ?: StringUtil.unescapeStringCharacters(psi.text) diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUObjectLiteralExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUObjectLiteralExpression.kt index 106f1a76140..26d4024a7bf 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUObjectLiteralExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUObjectLiteralExpression.kt @@ -22,12 +22,11 @@ import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.psi.KtObjectLiteralExpression import org.jetbrains.kotlin.psi.KtSuperTypeCallEntry import org.jetbrains.uast.* -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUObjectLiteralExpression( override val psi: KtObjectLiteralExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UObjectLiteralExpression, PsiElementBacked, KotlinUElementWithType { +) : KotlinAbstractUExpression(), UObjectLiteralExpression, KotlinUElementWithType { override val declaration by lz { getLanguagePlugin().convert(psi.objectDeclaration.toLightClass()!!, this) } override fun getExpressionType() = psi.objectDeclaration.toPsiType() @@ -59,7 +58,7 @@ class KotlinUObjectLiteralExpression( private class ObjectLiteralClassReference( override val psi: KtSuperTypeCallEntry, override val containingElement: UElement? - ) : KotlinAbstractUElement(), USimpleNameReferenceExpression, PsiElementBacked { + ) : KotlinAbstractUElement(), USimpleNameReferenceExpression { override fun resolve() = (psi.resolveCallToDeclaration(this) as? PsiMethod)?.containingClass override val annotations: List diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUParenthesizedExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUParenthesizedExpression.kt index 4818e4540c7..e0b7f14124b 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUParenthesizedExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUParenthesizedExpression.kt @@ -19,11 +19,10 @@ package org.jetbrains.uast.kotlin 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 containingElement: UElement? -) : KotlinAbstractUExpression(), UParenthesizedExpression, PsiElementBacked, KotlinUElementWithType { +) : KotlinAbstractUExpression(), UParenthesizedExpression, KotlinUElementWithType { override val expression by lz { KotlinConverter.convertOrEmpty(psi.expression, this) } } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUPostfixExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUPostfixExpression.kt index 615dbd9585c..71224029ebe 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUPostfixExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUPostfixExpression.kt @@ -20,12 +20,11 @@ import com.intellij.psi.PsiMethod import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtPostfixExpression import org.jetbrains.uast.* -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUPostfixExpression( override val psi: KtPostfixExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UPostfixExpression, PsiElementBacked, KotlinUElementWithType, KotlinEvaluatableUElement, UResolvable { +) : KotlinAbstractUExpression(), UPostfixExpression, KotlinUElementWithType, KotlinEvaluatableUElement, UResolvable { override val operand by lz { KotlinConverter.convertOrEmpty(psi.baseExpression, this) } override val operator = when (psi.operationToken) { diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUPrefixExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUPrefixExpression.kt index ccf2eeb6055..708b897aa44 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUPrefixExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUPrefixExpression.kt @@ -23,12 +23,11 @@ import org.jetbrains.uast.UElement import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.UPrefixExpression import org.jetbrains.uast.UastPrefixOperator -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUPrefixExpression( override val psi: KtPrefixExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UPrefixExpression, PsiElementBacked, KotlinUElementWithType, KotlinEvaluatableUElement { +) : KotlinAbstractUExpression(), UPrefixExpression, KotlinUElementWithType, KotlinEvaluatableUElement { override val operand by lz { KotlinConverter.convertOrEmpty(psi.baseExpression, this) } override val operatorIdentifier: UIdentifier? diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUQualifiedReferenceExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUQualifiedReferenceExpression.kt index e9c71fdc943..1f5ddf9256d 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUQualifiedReferenceExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUQualifiedReferenceExpression.kt @@ -25,13 +25,12 @@ import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression import org.jetbrains.uast.UQualifiedReferenceExpression import org.jetbrains.uast.UastQualifiedExpressionAccessType -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUQualifiedReferenceExpression( override val psi: KtDotQualifiedExpression, override val containingElement: UElement? ) : KotlinAbstractUExpression(), UQualifiedReferenceExpression, - PsiElementBacked, KotlinUElementWithType, KotlinEvaluatableUElement { + KotlinUElementWithType, KotlinEvaluatableUElement { 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 @@ -46,7 +45,7 @@ class KotlinUComponentQualifiedReferenceExpression( override val psi: KtDestructuringDeclarationEntry, override val containingElement: UElement? ) : KotlinAbstractUExpression(), UQualifiedReferenceExpression, - PsiElementBacked, KotlinUElementWithType, KotlinEvaluatableUElement { + KotlinUElementWithType, KotlinEvaluatableUElement { override val accessType = UastQualifiedExpressionAccessType.SIMPLE override lateinit var receiver: UExpression diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUReturnExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUReturnExpression.kt index 3db8877b725..38658866f84 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUReturnExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUReturnExpression.kt @@ -19,11 +19,10 @@ package org.jetbrains.uast.kotlin import org.jetbrains.kotlin.psi.KtReturnExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UReturnExpression -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUReturnExpression( override val psi: KtReturnExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UReturnExpression, PsiElementBacked, KotlinUElementWithType { +) : KotlinAbstractUExpression(), UReturnExpression, KotlinUElementWithType { override val returnExpression by lz { KotlinConverter.convertOrNull(psi.returnedExpression, this) } } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSafeQualifiedExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSafeQualifiedExpression.kt index b99793a6c42..7e0518fe3bf 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSafeQualifiedExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSafeQualifiedExpression.kt @@ -20,13 +20,12 @@ import com.intellij.psi.PsiNamedElement import org.jetbrains.kotlin.psi.KtSafeQualifiedExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UQualifiedReferenceExpression -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUSafeQualifiedExpression( override val psi: KtSafeQualifiedExpression, override val containingElement: UElement? ) : KotlinAbstractUExpression(), UQualifiedReferenceExpression, - PsiElementBacked, KotlinUElementWithType, KotlinEvaluatableUElement { + KotlinUElementWithType, KotlinEvaluatableUElement { 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 diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSimpleReferenceExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSimpleReferenceExpression.kt index bcb8cf96736..b2242d73d33 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSimpleReferenceExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSimpleReferenceExpression.kt @@ -31,14 +31,13 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor import org.jetbrains.kotlin.utils.addToStdlib.constant import org.jetbrains.uast.* -import org.jetbrains.uast.psi.PsiElementBacked import org.jetbrains.uast.visitor.UastVisitor open class KotlinUSimpleReferenceExpression( override val psi: KtSimpleNameExpression, override val identifier: String, override val containingElement: UElement? -) : KotlinAbstractUExpression(), USimpleNameReferenceExpression, PsiElementBacked, KotlinUElementWithType, KotlinEvaluatableUElement { +) : KotlinAbstractUExpression(), USimpleNameReferenceExpression, KotlinUElementWithType, KotlinEvaluatableUElement { private val resolvedDeclaration by lz { psi.resolveCallToDeclaration(this) } override fun resolve() = resolvedDeclaration @@ -95,7 +94,7 @@ open class KotlinUSimpleReferenceExpression( private val resolvedCall: ResolvedCall<*>, private val accessorDescriptor: DeclarationDescriptor, val setterValue: KtExpression? - ) : UCallExpression, PsiElementBacked { + ) : UCallExpression { override val methodName: String? get() = accessorDescriptor.name.asString() @@ -186,7 +185,7 @@ class KotlinClassViaConstructorUSimpleReferenceExpression( override val psi: KtCallExpression, override val identifier: String, override val containingElement: UElement? -) : KotlinAbstractUExpression(), USimpleNameReferenceExpression, PsiElementBacked, KotlinUElementWithType { +) : KotlinAbstractUExpression(), USimpleNameReferenceExpression, KotlinUElementWithType { override val resolvedName: String? get() = (psi.getResolvedCall(psi.analyze())?.resultingDescriptor as? ConstructorDescriptor) ?.containingDeclaration?.name?.asString() @@ -203,6 +202,8 @@ class KotlinStringUSimpleReferenceExpression( override val identifier: String, override val containingElement: UElement? ) : KotlinAbstractUExpression(), USimpleNameReferenceExpression { + override val psi: PsiElement? + get() = null override fun resolve() = null override val resolvedName: String? get() = identifier diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSuperExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSuperExpression.kt index cdd04ac8591..b3fe9526e04 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSuperExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSuperExpression.kt @@ -21,12 +21,11 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.uast.UElement import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.USuperExpression -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUSuperExpression( override val psi: KtSuperExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), USuperExpression, PsiElementBacked, KotlinUElementWithType, KotlinEvaluatableUElement { +) : KotlinAbstractUExpression(), USuperExpression, KotlinUElementWithType, KotlinEvaluatableUElement { override val label: String? get() = psi.getLabelName() diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSwitchExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSwitchExpression.kt index e1f0ce0fa56..e302c9b460e 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSwitchExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUSwitchExpression.kt @@ -16,15 +16,15 @@ package org.jetbrains.uast.kotlin +import com.intellij.psi.PsiElement import org.jetbrains.kotlin.psi.* import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.kinds.KotlinSpecialExpressionKinds -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUSwitchExpression( override val psi: KtWhenExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), USwitchExpression, PsiElementBacked, KotlinUElementWithType { +) : KotlinAbstractUExpression(), USwitchExpression, KotlinUElementWithType { override val expression by lz { KotlinConverter.convertOrNull(psi.subjectExpression, this) } override val body: UExpressionList by lz { @@ -49,7 +49,7 @@ class KotlinUSwitchExpression( class KotlinUSwitchEntry( override val psi: KtWhenEntry, override val containingElement: UExpression -) : KotlinAbstractUExpression(), USwitchClauseExpressionWithBody, PsiElementBacked { +) : KotlinAbstractUExpression(), USwitchClauseExpressionWithBody { override val caseValues by lz { psi.conditions.map { when (it) { is KtWhenConditionInRange -> KotlinCustomUBinaryExpression(it, this).apply { @@ -91,6 +91,8 @@ class KotlinUSwitchEntry( } containingElement expressions = userExpressions + object : UBreakExpression { + override val psi: PsiElement? + get() = null override val label: String? get() = null override val containingElement: UElement? diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUThisExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUThisExpression.kt index 1cbf63883c6..b512368444b 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUThisExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUThisExpression.kt @@ -21,12 +21,11 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.uast.UElement import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.UThisExpression -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUThisExpression( override val psi: KtThisExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UThisExpression, PsiElementBacked, KotlinUElementWithType, KotlinEvaluatableUElement { +) : KotlinAbstractUExpression(), UThisExpression, KotlinUElementWithType, KotlinEvaluatableUElement { override val label: String? get() = psi.getLabelName() diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUThrowExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUThrowExpression.kt index a1a69de8a00..cfcdd6b1069 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUThrowExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUThrowExpression.kt @@ -19,11 +19,10 @@ package org.jetbrains.uast.kotlin import org.jetbrains.kotlin.psi.KtThrowExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UThrowExpression -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUThrowExpression( override val psi: KtThrowExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UThrowExpression, PsiElementBacked, KotlinUElementWithType { +) : KotlinAbstractUExpression(), UThrowExpression, KotlinUElementWithType { override val thrownExpression by lz { KotlinConverter.convertOrEmpty(psi.thrownExpression, this) } } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTryExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTryExpression.kt index ebda2ca7639..5deba8809ae 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTryExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTryExpression.kt @@ -21,12 +21,11 @@ import org.jetbrains.uast.UElement import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.UTryExpression import org.jetbrains.uast.UVariable -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUTryExpression( override val psi: KtTryExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UTryExpression, PsiElementBacked, KotlinUElementWithType { +) : KotlinAbstractUExpression(), UTryExpression, KotlinUElementWithType { override val tryClause by lz { KotlinConverter.convertOrEmpty(psi.tryBlock, this) } override val catchClauses by lz { psi.catchClauses.map { KotlinUCatchClause(it, this) } } override val finallyClause by lz { psi.finallyBlock?.finalExpression?.let { KotlinConverter.convertExpression(it, this) } } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeCheckExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeCheckExpression.kt index db550c74c79..65e792a5ec1 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeCheckExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeCheckExpression.kt @@ -20,12 +20,11 @@ import org.jetbrains.kotlin.psi.KtIsExpression import org.jetbrains.uast.UBinaryExpressionWithType import org.jetbrains.uast.UElement import org.jetbrains.uast.UastBinaryExpressionWithTypeKind -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUTypeCheckExpression( override val psi: KtIsExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UBinaryExpressionWithType, PsiElementBacked, KotlinUElementWithType, KotlinEvaluatableUElement { +) : KotlinAbstractUExpression(), UBinaryExpressionWithType, KotlinUElementWithType, KotlinEvaluatableUElement { override val operand by lz { KotlinConverter.convertOrEmpty(psi.leftHandSide, this) } override val type by lz { psi.typeReference.toPsiType(this) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt index bf748d9ac95..df93fe871d8 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUTypeReferenceExpression.kt @@ -4,19 +4,18 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiType import org.jetbrains.uast.UElement import org.jetbrains.uast.UTypeReferenceExpression -import org.jetbrains.uast.psi.PsiElementBacked open class KotlinUTypeReferenceExpression( override val type: PsiType, override val psi: PsiElement?, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UTypeReferenceExpression, PsiElementBacked, KotlinUElementWithType +) : KotlinAbstractUExpression(), UTypeReferenceExpression, KotlinUElementWithType class LazyKotlinUTypeReferenceExpression( override val psi: PsiElement, override val containingElement: UElement?, private val typeSupplier: () -> PsiType -) : KotlinAbstractUExpression(), UTypeReferenceExpression, PsiElementBacked { +) : KotlinAbstractUExpression(), UTypeReferenceExpression { override val type: PsiType by lz { typeSupplier() } } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUWhileExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUWhileExpression.kt index 24e0aa3a39d..19f897db4fb 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUWhileExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinUWhileExpression.kt @@ -20,12 +20,11 @@ import org.jetbrains.kotlin.psi.KtWhileExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UIdentifier import org.jetbrains.uast.UWhileExpression -import org.jetbrains.uast.psi.PsiElementBacked class KotlinUWhileExpression( override val psi: KtWhileExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UWhileExpression, PsiElementBacked { +) : KotlinAbstractUExpression(), UWhileExpression { override val condition by lz { KotlinConverter.convertOrEmpty(psi.condition, this) } override val body by lz { KotlinConverter.convertOrEmpty(psi.body, this) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/LocalFunction.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/LocalFunction.kt index 6a9ae3eed62..2299ac7f68f 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/LocalFunction.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/LocalFunction.kt @@ -6,7 +6,6 @@ import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.* import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable -import org.jetbrains.uast.psi.PsiElementBacked private class KotlinLocalFunctionUVariable( @@ -29,7 +28,7 @@ private class KotlinLocalFunctionUVariable( private class KotlinLocalFunctionULambdaExpression( override val psi: KtFunction, override val containingElement: UElement? -): KotlinAbstractUExpression(), ULambdaExpression, PsiElementBacked { +): KotlinAbstractUExpression(), ULambdaExpression { override val body by lz { KotlinConverter.convertOrEmpty(psi.bodyExpression, this) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/UnknownKotlinExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/UnknownKotlinExpression.kt index 34a96bcf06f..5682d711d2f 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/UnknownKotlinExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/UnknownKotlinExpression.kt @@ -19,11 +19,10 @@ package org.jetbrains.uast.kotlin import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.uast.UElement import org.jetbrains.uast.UExpression -import org.jetbrains.uast.psi.PsiElementBacked class UnknownKotlinExpression( override val psi: KtExpression, override val containingElement: UElement? -) : KotlinAbstractUExpression(), UExpression, PsiElementBacked { +) : KotlinAbstractUExpression(), UExpression { override fun asLogString() = "[!] UnknownKotlinExpression ($psi)" } \ No newline at end of file diff --git a/plugins/uast-kotlin/testData/AnnotationParameters.log.txt b/plugins/uast-kotlin/testData/AnnotationParameters.log.txt index 65b8f9cf997..4935fa8ff0a 100644 --- a/plugins/uast-kotlin/testData/AnnotationParameters.log.txt +++ b/plugins/uast-kotlin/testData/AnnotationParameters.log.txt @@ -9,7 +9,7 @@ UFile (package = ) ULiteralExpression (value = 5) UClass (name = IntRange) UAnnotation (fqName = java.lang.annotation.Retention) - UNamedExpression (name = ) + UNamedExpression (name = null) UQualifiedReferenceExpression UQualifiedReferenceExpression UQualifiedReferenceExpression diff --git a/plugins/uast-kotlin/tests/AbstractKotlinUastTest.kt b/plugins/uast-kotlin/tests/AbstractKotlinUastTest.kt index 991d0531c31..bfab088de67 100644 --- a/plugins/uast-kotlin/tests/AbstractKotlinUastTest.kt +++ b/plugins/uast-kotlin/tests/AbstractKotlinUastTest.kt @@ -2,6 +2,7 @@ package org.jetbrains.uast.test.kotlin import com.intellij.mock.MockProject import com.intellij.openapi.Disposable +import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.util.Disposer import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFileManager @@ -21,6 +22,12 @@ import org.jetbrains.kotlin.config.addKotlinSourceRoot import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension import org.jetbrains.kotlin.utils.PathUtil +import org.jetbrains.uast.UastLanguagePlugin +import org.jetbrains.uast.evaluation.UEvaluatorExtension +import org.jetbrains.uast.kotlin.KotlinUastBindingContextProviderService +import org.jetbrains.uast.kotlin.KotlinUastLanguagePlugin +import org.jetbrains.uast.kotlin.evaluation.KotlinEvaluatorExtension +import org.jetbrains.uast.kotlin.internal.CliKotlinUastBindingContextProviderService import org.jetbrains.uast.kotlin.internal.UastAnalysisHandlerExtension import org.jetbrains.uast.test.env.AbstractCoreEnvironment import org.jetbrains.uast.test.env.AbstractUastTest @@ -40,6 +47,8 @@ abstract class AbstractKotlinUastTest : AbstractUastTest() { super.initializeEnvironment(testFile) + initializeKotlinEnvironment() + val trace = CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace() val kotlinCoreEnvironment = kotlinCoreEnvironment!! @@ -60,6 +69,18 @@ abstract class AbstractKotlinUastTest : AbstractUastTest() { return vfs.findFileByPath(testFile.canonicalPath)!! } + private fun initializeKotlinEnvironment() { + val area = Extensions.getRootArea() + area.getExtensionPoint(UastLanguagePlugin.extensionPointName) + .registerExtension(KotlinUastLanguagePlugin()) + area.getExtensionPoint(UEvaluatorExtension.EXTENSION_POINT_NAME) + .registerExtension(KotlinEvaluatorExtension()) + + project.registerService( + KotlinUastBindingContextProviderService::class.java, + CliKotlinUastBindingContextProviderService::class.java) + } + override fun createEnvironment(source: File): AbstractCoreEnvironment { compilerConfiguration = createKotlinCompilerConfiguration(source) val parentDisposable = Disposer.newDisposable() @@ -105,6 +126,10 @@ abstract class AbstractKotlinUastTest : AbstractUastTest() { TODO("not implemented") } + override fun addJar(root: File) { + TODO("not implemented") + } + override val project: MockProject get() = environment.project as MockProject diff --git a/plugins/uast-kotlin/tests/KotlinUastApiTest.kt b/plugins/uast-kotlin/tests/KotlinUastApiTest.kt index 7c304e4a569..4f1b8546ba4 100644 --- a/plugins/uast-kotlin/tests/KotlinUastApiTest.kt +++ b/plugins/uast-kotlin/tests/KotlinUastApiTest.kt @@ -4,7 +4,6 @@ import org.jetbrains.kotlin.psi.KtLiteralStringTemplateEntry import org.jetbrains.uast.UAnnotation import org.jetbrains.uast.UFile import org.jetbrains.uast.ULiteralExpression -import org.jetbrains.uast.psi.PsiElementBacked import org.jetbrains.uast.test.env.findElementByText import org.jetbrains.uast.toUElement import org.junit.Assert @@ -18,15 +17,15 @@ class KotlinUastApiTest : AbstractKotlinUastTest() { @Test fun testAnnotationParameters() { doTest("AnnotationParameters") { name, file -> val annotation = file.findElementByText("@IntRange(from = 10, to = 0)") - assertEquals(annotation.findAttributeValue("from")?.expression?.evaluate(), 10) - assertEquals(annotation.findAttributeValue("to")?.expression?.evaluate(), 0) + assertEquals(annotation.findAttributeValue("from")?.evaluate(), 10) + assertEquals(annotation.findAttributeValue("to")?.evaluate(), 0) } } @Test fun testConvertStringTemplate() { doTest("StringTemplateInClass") { name, file -> val literalExpression = file.findElementByText("lorem") - val psi = (literalExpression as PsiElementBacked).psi!! + val psi = literalExpression.psi!! Assert.assertTrue(psi is KtLiteralStringTemplateEntry) val literalExpressionAgain = psi.toUElement() Assert.assertTrue(literalExpressionAgain is ULiteralExpression) diff --git a/update_dependencies.xml b/update_dependencies.xml index 764248aec4e..87b304277e1 100644 --- a/update_dependencies.xml +++ b/update_dependencies.xml @@ -31,7 +31,7 @@ - +