New J2K: Fixed few bugs in conversions and symbols improvements.

This commit is contained in:
Dimach
2018-06-08 14:43:26 +03:00
committed by Ilya Kirillov
parent 39cf373286
commit 8430ada13b
6 changed files with 23 additions and 17 deletions
@@ -19,7 +19,7 @@ class JKSymbolProvider {
files.forEach { it.accept(elementVisitor) }
}
fun provideSymbol(psi: PsiElement): JKSymbol {
fun provideDirectSymbol(psi: PsiElement): JKSymbol {
return symbols.getOrPut(psi) {
when (psi) {
is PsiClass -> JKMultiverseClassSymbol(psi)
@@ -31,6 +31,12 @@ class JKSymbolProvider {
}
}
fun provideSymbol(reference: PsiReference): JKSymbol {
val target = reference.resolve()
if (target != null) return provideDirectSymbol(target)
TODO()
}
fun provideLocalVarSymbol(psi: PsiLocalVariable, variable: JKLocalVariable): JKSymbol {
return symbols.getOrPut(psi) { JKUniverseFieldSymbol(variable) }
}
@@ -112,7 +112,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
val method = methodExpression as PsiReferenceExpressionImpl
val call = JKJavaMethodCallExpressionImpl(
symbolProvider.provideSymbol(method.reference?.resolve() ?: TODO()) as JKMethodSymbol, argumentList.toJK()
symbolProvider.provideSymbol(method) as JKMethodSymbol, argumentList.toJK()
)
return if (method.findChildByRole(ChildRole.DOT) != null) {
JKQualifiedExpressionImpl((method.qualifier as PsiExpression).toJK(), JKJavaQualifierImpl.DOT, call)
@@ -127,7 +127,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
return JKNullLiteral() // TODO !!!
}
val access = JKJavaFieldAccessExpressionImpl(symbolProvider.provideSymbol(impl.resolve() ?: TODO()) as JKFieldSymbol)
val access = JKJavaFieldAccessExpressionImpl(symbolProvider.provideSymbol(impl) as JKFieldSymbol)
return when {
impl.findChildByRole(ChildRole.DOT) != null &&
(impl.qualifierExpression as? PsiReferenceExpression)?.resolve() !is PsiClass ->
@@ -164,13 +164,13 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
val constructor = constructorFakeReference.resolve()
if (constructor == null && constructedClass != null) {
return JKJavaDefaultNewExpressionImpl(
symbolProvider.provideSymbol(constructedClass) as JKClassSymbol
symbolProvider.provideDirectSymbol(constructedClass) as JKClassSymbol
)
}
return JKJavaNewExpressionImpl(
symbolProvider.provideSymbol(constructor!!) as JKMethodSymbol,
symbolProvider.provideDirectSymbol(constructor!!) as JKMethodSymbol,
argumentList.toJK()
)
}
@@ -204,7 +204,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
val parameters = parameters.map { it.toJK() }
if (target != null) {
JKClassTypeImpl(
target.let { symbolProvider.provideSymbol(it) as JKClassSymbol },
target.let { symbolProvider.provideDirectSymbol(it) as JKClassSymbol },
parameters
)
} else {
@@ -233,7 +233,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
it.declarationList = psi.children.mapNotNull {
ElementVisitor(this@DeclarationMapper).apply { it.accept(this) }.resultElement as? JKDeclaration
}
(symbolProvider.provideSymbol(psi) as? JKUniverseClassSymbol)?.run { target = it }
(symbolProvider.provideDirectSymbol(psi) as? JKUniverseClassSymbol)?.run { target = it }
}
}
@@ -244,7 +244,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
JKNameIdentifierImpl(name),
with(expressionTreeMapper) { initializer.toJK() }
).also {
(symbolProvider.provideSymbol(this) as? JKUniverseFieldSymbol)?.run { target = it }
(symbolProvider.provideDirectSymbol(this) as? JKUniverseFieldSymbol)?.run { target = it }
}
}
@@ -260,7 +260,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
parameterList.parameters.map { it -> it.toJK() },
body?.toJK() ?: JKBodyStub
).also {
(symbolProvider.provideSymbol(this) as? JKUniverseMethodSymbol)?.run { target = it }
(symbolProvider.provideDirectSymbol(this) as? JKUniverseMethodSymbol)?.run { target = it }
}
}
@@ -20,7 +20,7 @@ class AssignmentAsExpressionToAlsoConversion(val context: ConversionContext) : R
//if (element.parent)
val alsoElement = resolveFqName(ClassId.fromString("kotlin/also"), element, context) ?: return recurse(element)
val alsoSymbol = context.symbolProvider.provideSymbol(alsoElement) as? JKMethodSymbol ?: return recurse(element)
val alsoSymbol = context.symbolProvider.provideDirectSymbol(alsoElement) as? JKMethodSymbol ?: return recurse(element)
element.invalidate()
return JKQualifiedExpressionImpl(
@@ -17,7 +17,7 @@ abstract class MatchBasedConversion : BaseConversion() {
val child = iter.next()
if (child is List<*>) {
applyRecursiveToList(element, child as List<JKTreeElement>, iter, func)
iter.set(applyRecursiveToList(element, child as List<JKTreeElement>, iter, func))
} else if (child is JKTreeElement) {
val newChild = func(child)
if (child !== newChild) {
@@ -39,7 +39,7 @@ abstract class MatchBasedConversion : BaseConversion() {
child: List<JKTreeElement>,
iter: MutableListIterator<Any>,
func: (JKTreeElement) -> JKTreeElement
) {
): List<JKTreeElement> {
val newChild = child.map {
func(it)
@@ -53,6 +53,7 @@ abstract class MatchBasedConversion : BaseConversion() {
onElementChanged(new, old)
}
}
return newChild
}
@@ -12,11 +12,10 @@ class ModifiersConversion : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement {
return if (element is JKModifierList) element.also {
var modifiers = it.modifiers
if (element.parent !is JKLocalVariable && !modifiers.filter { it is JKJavaAccessModifier }.any()) {
modifiers += JKKtModifierImpl(JKKtModifier.KtModifierType.INTERNAL)
if (element.parent !is JKLocalVariable && !it.modifiers.filter { it is JKJavaAccessModifier }.any()) {
it.modifiers += JKKtModifierImpl(JKKtModifier.KtModifierType.INTERNAL)
}
it.modifiers = mapModifiers(modifiers)
it.modifiers = mapModifiers(it.modifiers)
} else recurse(element)
}
@@ -43,7 +43,7 @@ class TypeMappingConversion(val context: ConversionContext) : RecursiveApplicabl
contextElement ?: return null
val newTarget = resolveFqName(fqName, contextElement) as? KtClassOrObject ?: return null
return JKClassTypeImpl(context.symbolProvider.provideSymbol(newTarget) as JKClassSymbol, parameters, nullability)
return JKClassTypeImpl(context.symbolProvider.provideDirectSymbol(newTarget) as JKClassSymbol, parameters, nullability)
}
private fun mapClassType(type: JKClassType, typeElement: JKTypeElement): JKTypeElement {