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) } files.forEach { it.accept(elementVisitor) }
} }
fun provideSymbol(psi: PsiElement): JKSymbol { fun provideDirectSymbol(psi: PsiElement): JKSymbol {
return symbols.getOrPut(psi) { return symbols.getOrPut(psi) {
when (psi) { when (psi) {
is PsiClass -> JKMultiverseClassSymbol(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 { fun provideLocalVarSymbol(psi: PsiLocalVariable, variable: JKLocalVariable): JKSymbol {
return symbols.getOrPut(psi) { JKUniverseFieldSymbol(variable) } return symbols.getOrPut(psi) { JKUniverseFieldSymbol(variable) }
} }
@@ -112,7 +112,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
val method = methodExpression as PsiReferenceExpressionImpl val method = methodExpression as PsiReferenceExpressionImpl
val call = JKJavaMethodCallExpressionImpl( 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) { return if (method.findChildByRole(ChildRole.DOT) != null) {
JKQualifiedExpressionImpl((method.qualifier as PsiExpression).toJK(), JKJavaQualifierImpl.DOT, call) JKQualifiedExpressionImpl((method.qualifier as PsiExpression).toJK(), JKJavaQualifierImpl.DOT, call)
@@ -127,7 +127,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
return JKNullLiteral() // TODO !!! return JKNullLiteral() // TODO !!!
} }
val access = JKJavaFieldAccessExpressionImpl(symbolProvider.provideSymbol(impl.resolve() ?: TODO()) as JKFieldSymbol) val access = JKJavaFieldAccessExpressionImpl(symbolProvider.provideSymbol(impl) as JKFieldSymbol)
return when { return when {
impl.findChildByRole(ChildRole.DOT) != null && impl.findChildByRole(ChildRole.DOT) != null &&
(impl.qualifierExpression as? PsiReferenceExpression)?.resolve() !is PsiClass -> (impl.qualifierExpression as? PsiReferenceExpression)?.resolve() !is PsiClass ->
@@ -164,13 +164,13 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
val constructor = constructorFakeReference.resolve() val constructor = constructorFakeReference.resolve()
if (constructor == null && constructedClass != null) { if (constructor == null && constructedClass != null) {
return JKJavaDefaultNewExpressionImpl( return JKJavaDefaultNewExpressionImpl(
symbolProvider.provideSymbol(constructedClass) as JKClassSymbol symbolProvider.provideDirectSymbol(constructedClass) as JKClassSymbol
) )
} }
return JKJavaNewExpressionImpl( return JKJavaNewExpressionImpl(
symbolProvider.provideSymbol(constructor!!) as JKMethodSymbol, symbolProvider.provideDirectSymbol(constructor!!) as JKMethodSymbol,
argumentList.toJK() argumentList.toJK()
) )
} }
@@ -204,7 +204,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
val parameters = parameters.map { it.toJK() } val parameters = parameters.map { it.toJK() }
if (target != null) { if (target != null) {
JKClassTypeImpl( JKClassTypeImpl(
target.let { symbolProvider.provideSymbol(it) as JKClassSymbol }, target.let { symbolProvider.provideDirectSymbol(it) as JKClassSymbol },
parameters parameters
) )
} else { } else {
@@ -233,7 +233,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
it.declarationList = psi.children.mapNotNull { it.declarationList = psi.children.mapNotNull {
ElementVisitor(this@DeclarationMapper).apply { it.accept(this) }.resultElement as? JKDeclaration 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), JKNameIdentifierImpl(name),
with(expressionTreeMapper) { initializer.toJK() } with(expressionTreeMapper) { initializer.toJK() }
).also { ).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() }, parameterList.parameters.map { it -> it.toJK() },
body?.toJK() ?: JKBodyStub body?.toJK() ?: JKBodyStub
).also { ).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) //if (element.parent)
val alsoElement = resolveFqName(ClassId.fromString("kotlin/also"), element, context) ?: return recurse(element) 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() element.invalidate()
return JKQualifiedExpressionImpl( return JKQualifiedExpressionImpl(
@@ -17,7 +17,7 @@ abstract class MatchBasedConversion : BaseConversion() {
val child = iter.next() val child = iter.next()
if (child is List<*>) { 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) { } else if (child is JKTreeElement) {
val newChild = func(child) val newChild = func(child)
if (child !== newChild) { if (child !== newChild) {
@@ -39,7 +39,7 @@ abstract class MatchBasedConversion : BaseConversion() {
child: List<JKTreeElement>, child: List<JKTreeElement>,
iter: MutableListIterator<Any>, iter: MutableListIterator<Any>,
func: (JKTreeElement) -> JKTreeElement func: (JKTreeElement) -> JKTreeElement
) { ): List<JKTreeElement> {
val newChild = child.map { val newChild = child.map {
func(it) func(it)
@@ -53,6 +53,7 @@ abstract class MatchBasedConversion : BaseConversion() {
onElementChanged(new, old) onElementChanged(new, old)
} }
} }
return newChild
} }
@@ -12,11 +12,10 @@ class ModifiersConversion : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
return if (element is JKModifierList) element.also { return if (element is JKModifierList) element.also {
var modifiers = it.modifiers if (element.parent !is JKLocalVariable && !it.modifiers.filter { it is JKJavaAccessModifier }.any()) {
if (element.parent !is JKLocalVariable && !modifiers.filter { it is JKJavaAccessModifier }.any()) { it.modifiers += JKKtModifierImpl(JKKtModifier.KtModifierType.INTERNAL)
modifiers += JKKtModifierImpl(JKKtModifier.KtModifierType.INTERNAL)
} }
it.modifiers = mapModifiers(modifiers) it.modifiers = mapModifiers(it.modifiers)
} else recurse(element) } else recurse(element)
} }
@@ -43,7 +43,7 @@ class TypeMappingConversion(val context: ConversionContext) : RecursiveApplicabl
contextElement ?: return null contextElement ?: return null
val newTarget = resolveFqName(fqName, contextElement) as? KtClassOrObject ?: 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 { private fun mapClassType(type: JKClassType, typeElement: JKTypeElement): JKTypeElement {