Light Classes: Generate light wrappers for name identifiers

This commit is contained in:
Alexey Sedunov
2016-03-02 12:44:33 +03:00
parent fefa0baeee
commit d76e8f2d67
5 changed files with 50 additions and 3 deletions
@@ -19,12 +19,10 @@ package org.jetbrains.kotlin.asJava
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.util.Comparing
import com.intellij.openapi.util.Key
import com.intellij.openapi.util.TextRange
import com.intellij.psi.*
import com.intellij.psi.impl.DebugUtil
import com.intellij.psi.impl.java.stubs.PsiJavaFileStub
import com.intellij.psi.impl.light.LightClass
import com.intellij.psi.impl.light.LightIdentifier
import com.intellij.psi.impl.light.LightMethod
import com.intellij.psi.scope.PsiScopeProcessor
import com.intellij.psi.search.SearchScope
@@ -58,6 +56,8 @@ open class KtLightClassForExplicitDeclaration(
: KtWrappingLightClass(classOrObject.manager), KtJavaMirrorMarker, StubBasedPsiElement<KotlinClassOrObjectStub<out KtClassOrObject>> {
private var delegate: PsiClass? = null
private val lightIdentifier = KtLightIdentifier(this, classOrObject)
private fun getLocalClassParent(): PsiElement? {
fun getParentByPsiMethod(method: PsiMethod?, name: String?, forceMethodWrapping: Boolean): PsiElement? {
if (method == null || name == null) return null
@@ -385,6 +385,8 @@ open class KtLightClassForExplicitDeclaration(
override fun getElementType(): IStubElementType<out StubElement<*>, *>? = classOrObject.elementType
override fun getStub(): KotlinClassOrObjectStub<out KtClassOrObject>? = classOrObject.stub
override fun getNameIdentifier() = lightIdentifier
companion object {
private val JAVA_API_STUB = Key.create<CachedValue<WithFileStubAndExtraDiagnostics>>("JAVA_API_STUB")
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtEnumEntry
import org.jetbrains.kotlin.psi.KtNamedDeclaration
interface KtLightField : PsiField, KtLightDeclaration<KtDeclaration, PsiField>
@@ -34,6 +35,8 @@ sealed class KtLightFieldImpl(
private val delegate: PsiField,
private val containingClass: KtLightClass
) : LightElement(delegate.manager, KotlinLanguage.INSTANCE), KtLightField {
private val lightIdentifier = KtLightIdentifier(this, origin as? KtNamedDeclaration)
@Throws(IncorrectOperationException::class)
override fun setInitializer(initializer: PsiExpression?) = throw IncorrectOperationException("Not supported")
@@ -41,7 +44,7 @@ sealed class KtLightFieldImpl(
override fun getName() = delegate.name
override fun getNameIdentifier() = delegate.nameIdentifier
override fun getNameIdentifier() = lightIdentifier
override fun getDocComment() = delegate.docComment
@@ -0,0 +1,30 @@
/*
* Copyright 2010-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.asJava
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiNameIdentifierOwner
import com.intellij.psi.impl.light.LightIdentifier
import org.jetbrains.kotlin.psi.KtNamedDeclaration
class KtLightIdentifier(
private val lightOwner: PsiNameIdentifierOwner,
private val ktDeclaration: KtNamedDeclaration?
) : LightIdentifier(lightOwner.manager, ktDeclaration?.name ?: "") {
override fun getParent() = lightOwner
override fun getTextRange() = ktDeclaration?.nameIdentifier?.textRange ?: TextRange.EMPTY_RANGE
}
@@ -38,6 +38,8 @@ sealed class KtLightMethodImpl(
) : LightMethod(delegate.manager, delegate, containingClass), KtLightMethod {
private val origin = lightMethodOrigin?.originalElement as? KtDeclaration
private val lightIdentifier = KtLightIdentifier(this, origin as? KtNamedDeclaration)
override fun getContainingClass(): KtLightClass = super.getContainingClass() as KtLightClass
private val paramsList: CachedValue<PsiParameterList> by lazy {
@@ -112,6 +114,8 @@ sealed class KtLightMethodImpl(
override fun getModifierList() = _modifierList
override fun getNameIdentifier() = lightIdentifier
override fun getParameterList() = paramsList.value
override fun getTypeParameterList() = typeParamsList.value
@@ -41,6 +41,7 @@ public class KtLightParameter extends LightParameter implements KtLightDeclarati
private final PsiParameter delegate;
private final int index;
private final KtLightMethod method;
private final KtLightIdentifier lightIdentifier;
public KtLightParameter(final PsiParameter delegate, int index, KtLightMethod method) {
super(getName(delegate, index), delegate.getType(), method, KotlinLanguage.INSTANCE);
@@ -55,6 +56,8 @@ public class KtLightParameter extends LightParameter implements KtLightDeclarati
return delegate.getModifierList();
}
};
lightIdentifier = new KtLightIdentifier(this, getOrigin());
}
@NotNull
@@ -140,4 +143,9 @@ public class KtLightParameter extends LightParameter implements KtLightDeclarati
public String getText() {
return "";
}
@Override
public PsiIdentifier getNameIdentifier() {
return lightIdentifier;
}
}