From 95f6acdddfda2ee12c40787d5a8d3fb952c80a07 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 29 Mar 2016 17:17:20 +0300 Subject: [PATCH] [REVERTED] 8c72b02 Alexey Sedunov on 3/21/2016 at 19:14 (committed on 3/24/2016 at 18:42) Light Classes: Constant expression evaluator for light annotation arguments --- .../CliLightClassGenerationSupport.kt | 7 +- .../kotlin/asJava/KtLightAnnotation.kt | 65 +------------------ .../kotlin/asJava/KtLightParameter.java | 1 - .../asJava/LightClassGenerationSupport.java | 5 -- .../resolve/IDELightClassGenerationSupport.kt | 3 - idea/src/META-INF/plugin.xml | 4 -- .../KotlinLightConstantExpressionEvaluator.kt | 47 -------------- 7 files changed, 7 insertions(+), 125 deletions(-) delete mode 100644 idea/src/org/jetbrains/kotlin/idea/KotlinLightConstantExpressionEvaluator.kt diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt index f3d35a39dda..4208e501587 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt @@ -33,7 +33,10 @@ import org.jetbrains.kotlin.descriptors.PackageViewDescriptor import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.KtClassOrObject +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtPsiUtil import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer import org.jetbrains.kotlin.resolve.lazy.ResolveSessionUtils @@ -138,8 +141,6 @@ class CliLightClassGenerationSupport(project: Project) : LightClassGenerationSup return bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration) } - override fun analyze(element: KtElement) = bindingContext - override fun getFacadeClasses(facadeFqName: FqName, scope: GlobalSearchScope): Collection { val filesForFacade = findFilesForFacade(facadeFqName, scope) if (filesForFacade.isEmpty()) return emptyList() diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightAnnotation.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightAnnotation.kt index 6771ae23495..896678810eb 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightAnnotation.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightAnnotation.kt @@ -17,73 +17,17 @@ package org.jetbrains.kotlin.asJava import com.intellij.openapi.util.TextRange -import com.intellij.psi.* +import com.intellij.psi.PsiAnnotation +import com.intellij.psi.PsiAnnotationOwner +import com.intellij.psi.PsiElement import com.intellij.util.IncorrectOperationException -import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.psi.KtAnnotationEntry -import org.jetbrains.kotlin.psi.KtExpression -import org.jetbrains.kotlin.psi.KtParameter -import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType -import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall -import org.jetbrains.kotlin.resolve.calls.model.DefaultValueArgument -import org.jetbrains.kotlin.resolve.calls.model.ExpressionValueArgument -import org.jetbrains.kotlin.resolve.calls.model.VarargValueArgument -import org.jetbrains.kotlin.resolve.source.getPsi class KtLightAnnotation( private val delegate: PsiAnnotation, private val originalElement: KtAnnotationEntry, private val owner: PsiAnnotationOwner ) : PsiAnnotation by delegate, KtLightElement { - inner class LightExpressionValue(private val delegate: PsiExpression) : PsiAnnotationMemberValue, PsiExpression by delegate { - val originalExpression: KtExpression? by lazy { - val nameAndValue = getStrictParentOfType() ?: return@lazy null - val annotationEntry = this@KtLightAnnotation.getOrigin() - val context = LightClassGenerationSupport.getInstance(project).analyze(annotationEntry) - val resolvedCall = annotationEntry.getResolvedCall(context) ?: return@lazy null - val annotationConstructor = resolvedCall.resultingDescriptor - val parameterName = nameAndValue.name ?: "value" - val parameter = annotationConstructor.valueParameters.singleOrNull { it.name.asString() == parameterName } - ?: return@lazy null - val resolvedArgument = resolvedCall.valueArguments[parameter] ?: return@lazy null - when (resolvedArgument) { - is DefaultValueArgument -> { - (parameter.source.getPsi() as? KtParameter)?.defaultValue - } - - is ExpressionValueArgument -> { - resolvedArgument.valueArgument?.getArgumentExpression() - } - - is VarargValueArgument -> { - val arrayInitializer = parent as? PsiArrayInitializerMemberValue ?: return@lazy null - val exprIndex = arrayInitializer.initializers.indexOf(delegate as PsiAnnotationMemberValue) - if (exprIndex < 0) return@lazy null - resolvedArgument.arguments[exprIndex].getArgumentExpression() - } - - else -> null - } - } - - override fun getLanguage() = KotlinLanguage.INSTANCE - } - - inner class LightArrayInitializerValue(private val delegate: PsiArrayInitializerMemberValue) : PsiArrayInitializerMemberValue by delegate { - private val _initializers by lazy { delegate.initializers.map { wrapAnnotationValue(it) }.toTypedArray() } - - override fun getInitializers() = _initializers - override fun getLanguage() = KotlinLanguage.INSTANCE - } - - private fun wrapAnnotationValue(value: PsiAnnotationMemberValue): PsiAnnotationMemberValue { - return when (value) { - is PsiExpression -> LightExpressionValue(value) - is PsiArrayInitializerMemberValue -> LightArrayInitializerValue(value) - else -> value - } - } - override fun getDelegate() = delegate override fun getOrigin() = originalElement @@ -92,9 +36,6 @@ class KtLightAnnotation( override fun getOwner() = owner - override fun findAttributeValue(name: String?) = delegate.findAttributeValue(name)?.let { wrapAnnotationValue(it) } - override fun findDeclaredAttributeValue(name: String?) = delegate.findDeclaredAttributeValue(name)?.let { wrapAnnotationValue(it) } - override fun getText() = originalElement.text ?: "" override fun getTextRange() = originalElement.textRange ?: TextRange.EMPTY_RANGE diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightParameter.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightParameter.java index 26c454b236a..d1190ef363a 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightParameter.java +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightParameter.java @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.asJava; import com.intellij.lang.Language; -import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.SearchScope; diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.java index f4c23c3e1d4..fec95f17d92 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.java +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.java @@ -27,9 +27,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.psi.KtClassOrObject; import org.jetbrains.kotlin.psi.KtDeclaration; -import org.jetbrains.kotlin.psi.KtElement; import org.jetbrains.kotlin.psi.KtFile; -import org.jetbrains.kotlin.resolve.BindingContext; import java.util.Collection; @@ -74,9 +72,6 @@ public abstract class LightClassGenerationSupport { @Nullable public abstract DeclarationDescriptor resolveToDescriptor(@NotNull KtDeclaration declaration); - @NotNull - public abstract BindingContext analyze(@NotNull KtElement element); - @NotNull public abstract Collection getFacadeClasses(@NotNull FqName facadeFqName, @NotNull GlobalSearchScope scope); diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt index 3e950c3e083..6321289e656 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt @@ -44,7 +44,6 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil import org.jetbrains.kotlin.resolve.lazy.NoDescriptorForDeclarationException import org.jetbrains.kotlin.resolve.lazy.ResolveSession @@ -203,8 +202,6 @@ class IDELightClassGenerationSupport(private val project: Project) : LightClassG } } - override fun analyze(element: KtElement) = element.analyze(BodyResolveMode.PARTIAL) - override fun getFacadeNames(packageFqName: FqName, scope: GlobalSearchScope): Collection { val facadeFilesInPackage = KotlinFileFacadeClassByPackageIndex.getInstance().get(packageFqName.asString(), project, scope) return facadeFilesInPackage.map { it.javaFileFacadeFqName.shortName().asString() } diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 70027e19650..3b050680f02 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -640,10 +640,6 @@ - - org.jetbrains.kotlin.idea.intentions.IfNullToElvisIntention Kotlin diff --git a/idea/src/org/jetbrains/kotlin/idea/KotlinLightConstantExpressionEvaluator.kt b/idea/src/org/jetbrains/kotlin/idea/KotlinLightConstantExpressionEvaluator.kt deleted file mode 100644 index eac57fc24ab..00000000000 --- a/idea/src/org/jetbrains/kotlin/idea/KotlinLightConstantExpressionEvaluator.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2010-2016 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.idea - -import com.intellij.psi.PsiConstantEvaluationHelper -import com.intellij.psi.PsiElement -import com.intellij.psi.impl.ConstantExpressionEvaluator -import org.jetbrains.kotlin.asJava.KtLightAnnotation -import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade -import org.jetbrains.kotlin.resolve.DelegatingBindingTrace -import org.jetbrains.kotlin.types.TypeUtils -import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator as FrontendConstantExpressionEvaluator - -class KotlinLightConstantExpressionEvaluator : ConstantExpressionEvaluator { - override fun computeConstantExpression(expression: PsiElement, throwExceptionOnOverflow: Boolean): Any? { - return computeExpression(expression, throwExceptionOnOverflow, null) - } - - override fun computeExpression( - expression: PsiElement, - throwExceptionOnOverflow: Boolean, - auxEvaluator: PsiConstantEvaluationHelper.AuxEvaluator? - ): Any? { - if (expression !is KtLightAnnotation.LightExpressionValue) return null - val expressionToCompute = expression.originalExpression ?: return null - val resolutionFacade = expressionToCompute.getResolutionFacade() - val evaluator = FrontendConstantExpressionEvaluator(resolutionFacade.moduleDescriptor.builtIns) - val evaluatorTrace = DelegatingBindingTrace(resolutionFacade.analyze(expressionToCompute), "Evaluating annotation argument") - val constant = evaluator.evaluateExpression(expressionToCompute, evaluatorTrace) ?: return null - if (constant.isError) return null - return constant.getValue(TypeUtils.NO_EXPECTED_TYPE) - } -} \ No newline at end of file