diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index 4a9234be006..4667117ff67 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -23,41 +23,10 @@ import com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl import com.intellij.psi.impl.source.tree.java.PsiNewExpressionImpl import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl import org.jetbrains.kotlin.j2k.tree.* -import org.jetbrains.kotlin.j2k.tree.multiverse.JKMDeclarationList -import org.jetbrains.kotlin.j2k.tree.multiverse.JKMultiverseClass -import org.jetbrains.kotlin.j2k.tree.multiverse.ReferenceTargetProvider import org.jetbrains.kotlin.j2k.tree.impl.* -class JavaToJKTreeBuilder : ReferenceTargetProvider { - override fun resolveClassReference(clazz: PsiClass): JKClass { - val name = clazz.qualifiedName ?: TODO() - return universe[name] ?: multiverse[name] ?: run { - val clazz = JKMultiverseClass(JKNameIdentifierImpl(name), JKMDeclarationList(emptyList()), JKClass.ClassKind.CLASS, JKModifierListImpl()) - multiverse[name] = clazz - clazz - } - } - - override fun resolveClassReference(identifier: String): JKClass { - return universe[identifier] ?: multiverse[identifier] ?: run { - val clazz = - JKMultiverseClass(JKNameIdentifierImpl(identifier), JKMDeclarationList(emptyList()), JKClass.ClassKind.CLASS, JKModifierListImpl()) - multiverse[identifier] = clazz - clazz - } - } - - override fun putUniverseClass(clazz: JKClass) { - universe[clazz.name.name] = clazz - } - - override fun putMultiverseClass(clazz: JKMultiverseClass) { - multiverse[clazz.name.name] = clazz - } - - private val universe = mutableMapOf() - private val multiverse = mutableMapOf() +class JavaToJKTreeBuilder { private val expressionTreeMapper = ExpressionTreeMapper() @@ -65,6 +34,18 @@ class JavaToJKTreeBuilder : ReferenceTargetProvider { private val modifierMapper = ModifierMapper() + val symbols = mutableMapOf>() + + fun bindSymbol(psi: PsiElement, element: JKElement) { + provideSymbol(psi).bind(element) + } + + fun provideSymbol(psi: PsiElement): JKBindableSymbol { + return symbols.getOrPut(psi) { + DelayedPsiSymbol(psi) + } as JKBindableSymbol + } + private inner class ExpressionTreeMapper { fun PsiExpression.toJK(): JKExpression { when (this) { @@ -98,8 +79,17 @@ class JavaToJKTreeBuilder : ReferenceTargetProvider { is PsiParenthesizedExpression -> { return toJK() } + is PsiAssignmentExpression -> { + return toJK() + } + else -> { + throw RuntimeException("Not supported: ${this::class}") + } } - throw RuntimeException("Not supported") + } + + fun PsiAssignmentExpression.toJK(): JKJavaAssignmentExpression { + return JKJavaAssignmentExpressionImpl(lExpression.toJK(), rExpression?.toJK() ?: TODO()) } fun PsiBinaryExpression.toJK(): JKExpression { @@ -137,7 +127,7 @@ class JavaToJKTreeBuilder : ReferenceTargetProvider { fun PsiMethodCallExpression.toJK(): JKExpression { val method = methodExpression as PsiReferenceExpressionImpl - val identifier = method.resolve().convertReference() + val identifier = JKMethodReferenceImpl({ method.reference?.resolve() }) val call = JKJavaMethodCallExpressionImpl(identifier as JKMethodReference, argumentList.toJK()) return if (method.findChildByRole(ChildRole.DOT) != null) { JKQualifiedExpressionImpl((method.qualifier as PsiExpression).toJK(), JKJavaQualifierImpl.DOT, call) @@ -148,8 +138,7 @@ class JavaToJKTreeBuilder : ReferenceTargetProvider { fun PsiReferenceExpression.toJK(): JKExpression { val impl = this as PsiReferenceExpressionImpl - val identifier = impl.resolve().convertReference() as JKFieldReference - val access = JKJavaFieldAccessExpressionImpl(identifier) + val access = JKJavaFieldAccessExpressionImpl(JKFieldReferenceImpl({ impl.resolve() })) return if (impl.findChildByRole(ChildRole.DOT) != null) { JKQualifiedExpressionImpl((impl.qualifier as PsiExpression).toJK(), JKJavaQualifierImpl.DOT, access) } else { @@ -180,7 +169,7 @@ class JavaToJKTreeBuilder : ReferenceTargetProvider { return JKJavaNewEmptyArrayImpl(dimensions.map { it?.toJK() }) } } - return JKJavaNewExpressionImpl(classReference?.resolve().convertReference() as JKClassReference, argumentList.toJK()) + return JKJavaNewExpressionImpl(provideSymbol(constructorFakeReference.resolve()!!), argumentList.toJK()) } fun PsiArrayAccessExpression.toJK(): JKExpression { @@ -199,39 +188,9 @@ class JavaToJKTreeBuilder : ReferenceTargetProvider { return JKExpressionListImpl(this?.expressions?.map { it.toJK() } ?: emptyList()) } - fun PsiElement?.convertReference(): JKReference = when (this) { - is PsiMethod -> convertMethodReference() - is PsiField -> convertFieldReference() - is PsiClass -> convertClassReference() - else -> throw Exception("Invalid PSI") - } - - fun PsiMethod.convertMethodReference(): JKMethodReference { - val clazz = this@JavaToJKTreeBuilder.resolveClassReference(containingClass ?: TODO()) - return JKMethodReferenceImpl( - this@JavaToJKTreeBuilder.resolveMethodReference(clazz, this), - if (clazz is JKMultiverseClass) JKReference.JKReferenceType.U2M else JKReference.JKReferenceType.U2U - ) - } - - fun PsiField.convertFieldReference(): JKFieldReference { - val clazz = this@JavaToJKTreeBuilder.resolveClassReference(containingClass ?: TODO()) - return JKFieldReferenceImpl( - this@JavaToJKTreeBuilder.resolveFieldReference(clazz, this), - if (clazz is JKMultiverseClass) JKReference.JKReferenceType.U2M else JKReference.JKReferenceType.U2U - ) - } - - fun PsiClass.convertClassReference(): JKClassReference { - val clazz = this@JavaToJKTreeBuilder.resolveClassReference(this) - return JKClassReferenceImpl( - clazz, if (clazz is JKMultiverseClass) JKReference.JKReferenceType.U2M else JKReference.JKReferenceType.U2U - ) - } - fun PsiType.toJK(): JKType { return when (this) { - is PsiClassType -> JKClassTypeImpl(resolve()!!.convertClassReference(), parameters.map { it.toJK() }) + is PsiClassType -> JKClassTypeImpl(resolve()?.let { provideSymbol(it) }, parameters.map { it.toJK() }) is PsiArrayType -> JKJavaArrayTypeImpl(componentType.toJK()) is PsiPrimitiveType -> when (presentableText) { "int" -> JKJavaPrimitiveTypeImpl.INT @@ -254,25 +213,39 @@ class JavaToJKTreeBuilder : ReferenceTargetProvider { else -> JKClass.ClassKind.CLASS } val psi = this - return JKClassImpl(with(modifierMapper) { modifierList.toJK() }, JKNameIdentifierImpl(name!!), classKind).apply { - declarationList.apply { + return JKClassImpl( + with(modifierMapper) { modifierList.toJK() }, + JKNameIdentifierImpl(name!!), + classKind + ).also { + it.declarationList.apply { declarations = psi.children.mapNotNull { ElementVisitor(this@DeclarationMapper).apply { it.accept(this) }.resultElement as? JKUniverseDeclaration } } + + bindSymbol(this, it) } } fun PsiField.toJK(): JKJavaField { - return JKJavaFieldImpl(with(modifierMapper) { modifierList.toJK() }, with(expressionTreeMapper) { type.toJK() }, - JKNameIdentifierImpl(this.name), with(expressionTreeMapper) { initializer?.toJK() } ?: TODO()) + return JKJavaFieldImpl( + with(modifierMapper) { modifierList.toJK() }, + with(expressionTreeMapper) { type.toJK() }, + JKNameIdentifierImpl(this.name), + with(expressionTreeMapper) { initializer?.toJK() } ?: TODO() + ).also { + bindSymbol(this, it) + } } fun PsiMethod.toJK(): JKJavaMethod { return JKJavaMethodImpl( with(modifierMapper) { modifierList.toJK() }, JKNameIdentifierImpl(name), parameterList.parameters.map { it -> it.toJK() }, body?.toJK() ?: TODO() - ) + ).also { + bindSymbol(this, it) + } } fun PsiMember.toJK(): JKDeclaration? = when (this) { @@ -293,6 +266,9 @@ class JavaToJKTreeBuilder : ReferenceTargetProvider { if (this is PsiExpressionStatement) { return JKExpressionStatementImpl(with(expressionTreeMapper) { expression.toJK() }) } + if (this is PsiReturnStatement) { + return JKReturnStatementImpl(with(expressionTreeMapper) { returnValue?.toJK() ?: TODO() }) + } TODO() } } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index d781b03ab7b..cce76da088e 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -44,7 +44,7 @@ class NewCodeBuilder { override fun visitUniverseClass(universeClass: JKUniverseClass, data: Unit) { printer.print(classKindString(universeClass.classKind)) builder.append(" ") - printer.print(universeClass.name.name) + printer.print(universeClass.name.value) if (universeClass.declarationList.declarations.isNotEmpty()) { printer.println("{") printer.pushIndent() diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/DebugTreePrinter.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/DebugTreePrinter.kt index 2a94552ffc1..0b7a9caa1db 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/DebugTreePrinter.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/DebugTreePrinter.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.j2k.tree +import org.jetbrains.kotlin.j2k.tree.impl.JKBindableSymbol import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitorVoid import org.jetbrains.kotlin.utils.Printer @@ -73,26 +74,17 @@ private class DebugTreePrinter : JKVisitorVoid { printer.println("]") } - override fun visitMethodReference(methodReference: JKMethodReference) { - printer.println(methodReference.classNameWithoutJK()) - printer.println(methodReference.target.parent.let { (it as? JKClass)?.name?.name ?: "null" }, "@", methodReference.target.name.name) - } - - override fun visitFieldReference(fieldReference: JKFieldReference) { - printer.println(fieldReference.classNameWithoutJK()) - printer.println(fieldReference.target.parent.let { (it as? JKClass)?.name?.name ?: "null" }, "@", fieldReference.target.name.name) - } - - override fun visitClassReference(classReference: JKClassReference) { - printer.println(classReference.classNameWithoutJK()) - printer.println(classReference.target.name.name) - } - override fun visitType(type: JKType) { printer.println(type.classNameWithoutJK(), " \"") printer.indented { - if (type is JKClassType) - printer.println(type.classReference.target.name.name) + if (type is JKClassType) { + if ((type.classReference as? JKBindableSymbol)?.isBound == true) { + printer.println(type.classReference?.element?.name?.value) + + } else { + printer.println("Unbound") + } + } } printer.println("\"") } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt index 1902f45463c..df527d0d0d3 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt @@ -96,13 +96,12 @@ class JKJavaFieldAccessExpressionImpl(override var identifier: JKFieldReference) } class JKJavaNewExpressionImpl( - override var identifier: JKClassReference, override var arguments: JKExpressionList -) : JKJavaNewExpression, JKElementBase() { + override val constructorSymbol: JKSymbol, + arguments: JKExpressionList +) : JKJavaNewExpression, JKBranchElementBase() { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitJavaNewExpression(this, data) - override fun acceptChildren(visitor: JKVisitor, data: D) { - identifier.accept(visitor, data) - } + override var arguments by child(arguments) } class JKJavaNewEmptyArrayImpl(override var initializer: List) : JKJavaNewEmptyArray, JKElementBase() { @@ -139,4 +138,18 @@ class JKJavaArrayTypeImpl(override val type: JKType) : JKJavaArrayType, JKElemen override fun acceptChildren(visitor: JKVisitor, data: D) { } +} + +class JKReturnStatementImpl(expression: JKExpression) : JKBranchElementBase(), JKReturnStatement { + // TODO accept + override val expression by child(expression) +} + +class JKJavaAssignmentExpressionImpl( + lExpression: JKExpression, + rExpression: JKExpression/*, + TODO operation:? */ +) : JKBranchElementBase(), JKJavaAssignmentExpression { + override var lExpression: JKExpression by child(lExpression) + override var rExpression: JKExpression by child(rExpression) } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt index 06a1557ff65..dbb23ff45f0 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -18,8 +18,8 @@ package org.jetbrains.kotlin.j2k.tree.impl import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.tree.* -import org.jetbrains.kotlin.j2k.tree.JKReference.JKReferenceType import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor +import com.intellij.psi.PsiElement import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty @@ -72,6 +72,7 @@ abstract class JKBranchElementBase : JKElementBase(), JKMutableBranchElement { protected var childNum = 0 protected fun child(v: U): ReadWriteProperty { + children.add(childNum, v) return JKChild(childNum++) } @@ -89,6 +90,10 @@ abstract class JKElementListBase: JKElementBase(), JKMutableBranchElement { children.addAll(v) return JKListChild() } + + override fun acceptChildren(visitor: JKVisitor, data: D) { + children.forEach { it.accept(visitor, data) } + } } class JKUDeclarationListImpl : JKElementListBase(), JKUDeclarationList { @@ -110,7 +115,7 @@ class JKClassImpl(modifierList: JKModifierList, name: JKNameIdentifier, override } -class JKNameIdentifierImpl(override val name: String) : JKNameIdentifier, JKElementBase() {} +class JKNameIdentifierImpl(override val value: String) : JKNameIdentifier, JKElementBase() {} class JKModifierListImpl(modifiers: List = emptyList()) : JKModifierList, JKElementListBase() { override var modifiers: List by children(modifiers) @@ -192,7 +197,7 @@ class JKTypeCastExpressionImpl(override var expression: JKExpression, override v } class JKClassTypeImpl( - override val classReference: JKClassReference, + override val classReference: JKSymbol?, override val parameters: List, override val nullability: Nullability = Nullability.Default ) : JKClassType, JKElementBase() { @@ -204,28 +209,21 @@ class JKClassTypeImpl( } } -class JKFieldReferenceImpl(override val target: JKField, override val referenceType: JKReferenceType) : JKFieldReference, JKElementBase() { + +abstract class JKReferenceBase(val resolve: () -> PsiElement?) : JKElementBase(), JKReference { + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitReference(this, data) + + override var target: T? = null +} + +class JKFieldReferenceImpl(resolve: () -> PsiElement?) : JKFieldReference, JKReferenceBase(resolve) { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitFieldReference(this, data) - - override fun acceptChildren(visitor: JKVisitor, data: D) { - - } } -class JKClassReferenceImpl(override val target: JKClass, override val referenceType: JKReferenceType) : JKClassReference, - JKElementBase() { +class JKClassReferenceImpl(resolve: () -> PsiElement?) : JKClassReference, JKReferenceBase(resolve) { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitClassReference(this, data) - - override fun acceptChildren(visitor: JKVisitor, data: D) { - - } } -class JKMethodReferenceImpl(override val target: JKMethod, override val referenceType: JKReferenceType) : JKMethodReference, - JKElementBase() { +class JKMethodReferenceImpl(resolve: () -> PsiElement?) : JKMethodReference, JKReferenceBase(resolve) { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitMethodReference(this, data) - - override fun acceptChildren(visitor: JKVisitor, data: D) { - - } } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt new file mode 100644 index 00000000000..756a410ba44 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.j2k.tree.impl + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.j2k.tree.JKElement +import org.jetbrains.kotlin.j2k.tree.JKSymbol + + +abstract class JKBindableSymbol : JKSymbol { + final override lateinit var element: E + private set + + val isBound get() = ::element.isInitialized + + fun bind(new: E) { + element = new + } +} + +class DelayedPsiSymbol(val psi: PsiElement) : JKBindableSymbol() \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt index 50797c213ef..98cf116af22 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt @@ -26,7 +26,10 @@ interface JKJavaMethod : JKUniverseDeclaration, JKMethod { interface JKJavaForLoop : JKLoop -interface JKJavaAssignmentExpression : JKExpression +interface JKJavaAssignmentExpression : JKExpression { + var lExpression: JKExpression + var rExpression: JKExpression +} interface JKJavaPrimitiveType : JKType { val name: String @@ -41,7 +44,7 @@ interface JKJavaMethodCallExpression : JKMethodCallExpression interface JKJavaFieldAccessExpression : JKFieldAccessExpression interface JKJavaNewExpression : JKExpression { - val identifier: JKClassReference + val constructorSymbol: JKSymbol val arguments: JKExpressionList } @@ -69,4 +72,8 @@ interface JKJavaNewArray : JKExpression { val initializer: List } -interface JKJavaLiteralExpression : JKLiteralExpression \ No newline at end of file +interface JKJavaLiteralExpression : JKLiteralExpression + +interface JKReturnStatement : JKStatement { + val expression: JKExpression +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index e5aa7eccd0b..203d9edc3f7 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -50,30 +50,26 @@ interface JKAccessModifier : JKModifier interface JKModalityModifier : JKModifier interface JKReference : JKTreeElement { - val target: JKReferenceTarget - val referenceType: JKReferenceType - - enum class JKReferenceType { - U2U, U2M, M2U - } + val target: JKReferenceTarget? + val isBound get() = target != null } interface JKMethodReference : JKReference { - override val target: JKMethod + override val target: JKMethod? } interface JKFieldReference : JKReference { - override val target: JKField + override val target: JKField? } interface JKClassReference : JKReference { - override val target: JKClass + override val target: JKClass? } interface JKType : JKTreeElement interface JKClassType : JKType { - val classReference: JKClassReference + val classReference: JKSymbol? val nullability: Nullability val parameters: List } @@ -89,7 +85,7 @@ interface JKBlock : JKTreeElement { interface JKIdentifier : JKTreeElement interface JKNameIdentifier : JKIdentifier { - val name: String + val value: String } interface JKExpression : JKTreeElement diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt index 190de1218b4..98b3bc63a33 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt @@ -57,4 +57,8 @@ interface JKMethod : JKDeclaration, JKModifierListOwner { interface JKField : JKDeclaration, JKModifierListOwner { val type: JKType val name: JKNameIdentifier -} \ No newline at end of file +} + +interface JKSymbol { + val element: E +} diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/multiverse/ReferenceTargetProvider.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/multiverse/ReferenceTargetProvider.kt deleted file mode 100644 index eeb93af5b89..00000000000 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/multiverse/ReferenceTargetProvider.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2010-2018 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.j2k.tree.multiverse - -import com.intellij.psi.PsiClass -import com.intellij.psi.PsiField -import com.intellij.psi.PsiMethod -import org.jetbrains.kotlin.j2k.tree.JKClass -import org.jetbrains.kotlin.j2k.tree.JKField -import org.jetbrains.kotlin.j2k.tree.JKJavaField -import org.jetbrains.kotlin.j2k.tree.JKMethod -import org.jetbrains.kotlin.j2k.tree.impl.JKNameIdentifierImpl -import org.jetbrains.kotlin.utils.addToStdlib.cast - -interface ReferenceTargetProvider { - fun resolveClassReference(identifier: String): JKClass - fun resolveClassReference(clazz: PsiClass): JKClass - fun putUniverseClass(clazz: JKClass) - fun putMultiverseClass(clazz: JKMultiverseClass) - fun resolveMethodReference(clazz: JKClass, method: PsiMethod): JKMethod { - return clazz.declarations.asSequence().filter { it is JKMethod && it.name.name == method.name }.firstOrNull() as JKMethod? - ?: JKMultiverseMethod(JKNameIdentifierImpl(method.name)).also { clazz.cast().declarations += it } - } - - fun resolveFieldReference(clazz: JKClass, field: PsiField): JKField { - return clazz.declarationList.declarations.asSequence().filter { it is JKJavaField && it.name.name == field.name }.firstOrNull() as JKField? - ?: JKMultiverseField(JKNameIdentifierImpl(field.name)).also { - clazz.cast().declarationList.declarations += it - } - } -} \ No newline at end of file