diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMethod.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMethod.kt index f10b926106a..658db5de0d8 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMethod.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMethod.kt @@ -65,17 +65,10 @@ class KtLightMethodImpl private constructor( override fun getContainingClass(): KtLightClass = containingClass - private val paramsList: CachedValue by lazy(LazyThreadSafetyMode.PUBLICATION) { - val cacheManager = CachedValuesManager.getManager(clsDelegate.project) - cacheManager.createCachedValue({ - val parameterBuilder = LightParameterListBuilder(manager, KotlinLanguage.INSTANCE, this) - - for ((index, parameter) in clsDelegate.parameterList.parameters.withIndex()) { - parameterBuilder.addParameter(KtLightParameter(parameter, index, this)) - } - - CachedValueProvider.Result.create(parameterBuilder, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT) - }, false) + private val paramsList: PsiParameterList by lazy(LazyThreadSafetyMode.PUBLICATION) { + KtLightParameterList(this, dummyDelegate?.parameterList?.parametersCount ?: clsDelegate.parameterList.parametersCount) { + clsDelegate.parameterList.parameters.mapIndexed { index, clsParameter -> KtLightParameter(clsParameter, index, this@KtLightMethodImpl) } + } } private val typeParamsList: CachedValue by lazy(LazyThreadSafetyMode.PUBLICATION) { @@ -161,7 +154,7 @@ class KtLightMethodImpl private constructor( override fun getNameIdentifier() = lightIdentifier - override fun getParameterList() = paramsList.value + override fun getParameterList() = paramsList override fun getTypeParameterList() = typeParamsList.value @@ -264,7 +257,7 @@ class KtLightMethodImpl private constructor( override fun isVarArgs() = clsDelegate.isVarArgs - override fun isConstructor() = clsDelegate.isConstructor + override fun isConstructor() = dummyDelegate?.isConstructor ?: clsDelegate.isConstructor override fun getHierarchicalMethodSignature() = clsDelegate.hierarchicalMethodSignature diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightParameterList.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightParameterList.kt new file mode 100644 index 00000000000..27db80c57c0 --- /dev/null +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightParameterList.kt @@ -0,0 +1,44 @@ +/* + * 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.asJava.elements + +import com.intellij.psi.* +import com.intellij.psi.impl.light.LightElement +import org.jetbrains.kotlin.idea.KotlinLanguage + +class KtLightParameterList( + private val parent: KtLightMethod, + private val parametersCount: Int, + computeParameters: () -> List) : LightElement(parent.manager, KotlinLanguage.INSTANCE), PsiParameterList { + private val _parameters: Array by lazy { computeParameters().toTypedArray() } + + override fun getParent() = parent + + override fun toString() = "Light parameter list of $parent" + + override fun getParameters() = _parameters + + override fun getParameterIndex(parameter: PsiParameter) = _parameters.indexOf(parameter) + + override fun getParametersCount() = parametersCount + + override fun accept(visitor: PsiElementVisitor) { + if (visitor is JavaElementVisitor) { + visitor.visitParameterList(this) + } + } +} diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/LightParameterListBuilder.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/LightParameterListBuilder.java deleted file mode 100644 index 2ae191ff300..00000000000 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/LightParameterListBuilder.java +++ /dev/null @@ -1,84 +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.asJava.elements; - -import com.intellij.lang.Language; -import com.intellij.psi.*; -import com.intellij.psi.impl.light.LightElement; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; - -// Copy of com.intellij.psi.impl.light.LightParameterListBuilder -public class LightParameterListBuilder extends LightElement implements PsiParameterList { - private final List myParameters = new ArrayList(); - private final KtLightMethod parent; - private PsiParameter[] myCachedParameters; - - public LightParameterListBuilder(PsiManager manager, Language language, KtLightMethod parent) { - super(manager, language); - this.parent = parent; - } - - public void addParameter(PsiParameter parameter) { - myParameters.add(parameter); - myCachedParameters = null; - } - - @Override - public KtLightMethod getParent() { - return parent; - } - - @Override - public String toString() { - return "Light parameter list"; - } - - @NotNull - @Override - public PsiParameter[] getParameters() { - if (myCachedParameters == null) { - if (myParameters.isEmpty()) { - myCachedParameters = PsiParameter.EMPTY_ARRAY; - } - else { - myCachedParameters = myParameters.toArray(new PsiParameter[myParameters.size()]); - } - } - - return myCachedParameters; - } - - @Override - public int getParameterIndex(PsiParameter parameter) { - return myParameters.indexOf(parameter); - } - - @Override - public int getParametersCount() { - return myParameters.size(); - } - - @Override - public void accept(@NotNull PsiElementVisitor visitor) { - if (visitor instanceof JavaElementVisitor) { - ((JavaElementVisitor) visitor).visitParameterList(this); - } - } -} diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt index 86719e35b76..a6f49920c17 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt @@ -196,11 +196,13 @@ object LightClassLazinessChecker { } private data class MethodInfo( - val name: String + val name: String, + val isConstructor: Boolean, + val parameterCount: Int ) private fun methodInfo(method: PsiMethod) = with(method) { - MethodInfo(name) + MethodInfo(name, isConstructor, method.parameterList.parametersCount) } }