From e8aef7d29e431fa2ff9f78d9bf46262ca296fd77 Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Sat, 26 Dec 2015 00:45:47 +0300 Subject: [PATCH] Minor: move methods from companion object --- .../idea/debugger/KotlinPositionManager.kt | 231 +++++++++--------- 1 file changed, 116 insertions(+), 115 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt index f806aaba3f3..3bc535872ce 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt @@ -360,131 +360,114 @@ public class KotlinPositionManager(private val myDebugProcess: DebugProcess) : M myTypeMappers.put(key, value) } - companion object { - public fun createTypeMapper(file: KtFile): JetTypeMapper { - val project = file.project - - val analysisResult = file.analyzeFullyAndGetResult() - analysisResult.throwIfError() - - val state = GenerationState( - project, - ClassBuilderFactories.THROW_EXCEPTION, - analysisResult.moduleDescriptor, - analysisResult.bindingContext, - listOf(file)) - state.beforeCompile() - return state.typeMapper - } - - public fun getInternalClassNameForElement(notPositionedElement: PsiElement?, typeMapper: JetTypeMapper, file: KtFile, isInLibrary: Boolean): PositionedElement { - val element = getElementToCalculateClassName(notPositionedElement) - when { - element is KtClassOrObject -> return PositionedElement(getJvmInternalNameForImpl(typeMapper, element), element) - element is KtFunctionLiteral -> { - if (isInlinedLambda(element, typeMapper.bindingContext)) { - return getInternalClassNameForElement(element.parent, typeMapper, file, isInLibrary) - } - else { - val asmType = CodegenBinding.asmTypeForAnonymousClass(typeMapper.bindingContext, element) - return PositionedElement(asmType.internalName, element) - } - } - element is KtAnonymousInitializer -> { - val parent = getElementToCalculateClassName(element.parent) - // Class-object initializer - if (parent is KtObjectDeclaration && parent.isCompanion()) { - return PositionedElement(getInternalClassNameForElement(parent.parent, typeMapper, file, isInLibrary).className, parent) - } + private fun getInternalClassNameForElement(notPositionedElement: PsiElement?, typeMapper: JetTypeMapper, file: KtFile, isInLibrary: Boolean): PositionedElement { + val element = getElementToCalculateClassName(notPositionedElement) + when { + element is KtClassOrObject -> return PositionedElement(getJvmInternalNameForImpl(typeMapper, element), element) + element is KtFunctionLiteral -> { + if (isInlinedLambda(element, typeMapper.bindingContext)) { return getInternalClassNameForElement(element.parent, typeMapper, file, isInLibrary) } - element is KtProperty && (!element.isTopLevel || !isInLibrary) -> { - if (isInPropertyAccessor(notPositionedElement)) { - val classOrObject = PsiTreeUtil.getParentOfType(element, KtClassOrObject::class.java) - if (classOrObject != null) { - return PositionedElement(getJvmInternalNameForImpl(typeMapper, classOrObject), element) - } - } - - val descriptor = typeMapper.bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, element) - if (descriptor !is PropertyDescriptor) { - return getInternalClassNameForElement(element.parent, typeMapper, file, isInLibrary) - } - - return PositionedElement(getJvmInternalNameForPropertyOwner(typeMapper, descriptor), element) - } - element is KtNamedFunction -> { - if (isInlinedLambda(element, typeMapper.bindingContext)) { - return getInternalClassNameForElement(element.parent, typeMapper, file, isInLibrary) - } - - val parent = getElementToCalculateClassName(element.parent) - if (parent is KtClassOrObject) { - return PositionedElement(getJvmInternalNameForImpl(typeMapper, parent), element) - } - else if (parent != null) { - val asmType = CodegenBinding.asmTypeForAnonymousClass(typeMapper.bindingContext, element) - return PositionedElement(asmType.internalName, element) - } + else { + val asmType = CodegenBinding.asmTypeForAnonymousClass(typeMapper.bindingContext, element) + return PositionedElement(asmType.internalName, element) } } - - return PositionedElement(NoResolveFileClassesProvider.getFileClassInternalName(file), element) - } - - private val TYPES_TO_CALCULATE_CLASSNAME: Array> = - arrayOf(KtClassOrObject::class.java, - KtFunctionLiteral::class.java, - KtNamedFunction::class.java, - KtProperty::class.java, - KtAnonymousInitializer::class.java) - - private fun getElementToCalculateClassName(notPositionedElement: PsiElement?): KtElement? { - if (notPositionedElement?.javaClass as Class<*> in TYPES_TO_CALCULATE_CLASSNAME) return notPositionedElement as KtElement - - return PsiTreeUtil.getParentOfType(notPositionedElement, *TYPES_TO_CALCULATE_CLASSNAME) - } - - public fun getJvmInternalNameForPropertyOwner(typeMapper: JetTypeMapper, descriptor: PropertyDescriptor): String { - return typeMapper.mapOwner( - if (JvmAbi.isPropertyWithBackingFieldInOuterClass(descriptor)) descriptor.containingDeclaration else descriptor - ).internalName - } - - private fun isInPropertyAccessor(element: PsiElement?) = - element is KtPropertyAccessor || - PsiTreeUtil.getParentOfType(element, KtProperty::class.java, KtPropertyAccessor::class.java) is KtPropertyAccessor - - private fun getElementToCreateTypeMapperForLibraryFile(element: PsiElement?) = - if (element is KtElement) element else PsiTreeUtil.getParentOfType(element, KtElement::class.java) - - private fun getJvmInternalNameForImpl(typeMapper: JetTypeMapper, ktClass: KtClassOrObject): String? { - val classDescriptor = typeMapper.bindingContext.get(BindingContext.CLASS, ktClass) ?: return null - - if (ktClass is KtClass && ktClass.isInterface()) { - return typeMapper.mapDefaultImpls(classDescriptor).internalName + element is KtAnonymousInitializer -> { + val parent = getElementToCalculateClassName(element.parent) + // Class-object initializer + if (parent is KtObjectDeclaration && parent.isCompanion()) { + return PositionedElement(getInternalClassNameForElement(parent.parent, typeMapper, file, isInLibrary).className, parent) + } + return getInternalClassNameForElement(element.parent, typeMapper, file, isInLibrary) } + element is KtProperty && (!element.isTopLevel || !isInLibrary) -> { + if (isInPropertyAccessor(notPositionedElement)) { + val classOrObject = PsiTreeUtil.getParentOfType(element, KtClassOrObject::class.java) + if (classOrObject != null) { + return PositionedElement(getJvmInternalNameForImpl(typeMapper, classOrObject), element) + } + } - return typeMapper.mapClass(classDescriptor).internalName + val descriptor = typeMapper.bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, element) + if (descriptor !is PropertyDescriptor) { + return getInternalClassNameForElement(element.parent, typeMapper, file, isInLibrary) + } + + return PositionedElement(getJvmInternalNameForPropertyOwner(typeMapper, descriptor), element) + } + element is KtNamedFunction -> { + if (isInlinedLambda(element, typeMapper.bindingContext)) { + return getInternalClassNameForElement(element.parent, typeMapper, file, isInLibrary) + } + + val parent = getElementToCalculateClassName(element.parent) + if (parent is KtClassOrObject) { + return PositionedElement(getJvmInternalNameForImpl(typeMapper, parent), element) + } + else if (parent != null) { + val asmType = CodegenBinding.asmTypeForAnonymousClass(typeMapper.bindingContext, element) + return PositionedElement(asmType.internalName, element) + } + } } - private fun createTypeMapperForLibraryFile(notPositionedElement: PsiElement?, file: KtFile): JetTypeMapper { - val element = getElementToCreateTypeMapperForLibraryFile(notPositionedElement) - val analysisResult = element!!.analyzeAndGetResult() - - val state = GenerationState(file.project, ClassBuilderFactories.THROW_EXCEPTION, - analysisResult.moduleDescriptor, analysisResult.bindingContext, listOf(file)) - state.beforeCompile() - return state.typeMapper - } - - public fun isInlinedLambda(functionLiteral: KtFunction, context: BindingContext): Boolean { - return InlineUtil.isInlinedArgument(functionLiteral, context, false) - } - - private fun createKeyForTypeMapper(file: KtFile) = NoResolveFileClassesProvider.getFileClassInternalName(file) + return PositionedElement(NoResolveFileClassesProvider.getFileClassInternalName(file), element) } + private val TYPES_TO_CALCULATE_CLASSNAME: Array> = + arrayOf(KtClassOrObject::class.java, + KtFunctionLiteral::class.java, + KtNamedFunction::class.java, + KtProperty::class.java, + KtAnonymousInitializer::class.java) + + private fun getElementToCalculateClassName(notPositionedElement: PsiElement?): KtElement? { + if (notPositionedElement?.javaClass as Class<*> in TYPES_TO_CALCULATE_CLASSNAME) return notPositionedElement as KtElement + + return PsiTreeUtil.getParentOfType(notPositionedElement, *TYPES_TO_CALCULATE_CLASSNAME) + } + + public fun getJvmInternalNameForPropertyOwner(typeMapper: JetTypeMapper, descriptor: PropertyDescriptor): String { + return typeMapper.mapOwner( + if (JvmAbi.isPropertyWithBackingFieldInOuterClass(descriptor)) descriptor.containingDeclaration else descriptor + ).internalName + } + + private fun isInPropertyAccessor(element: PsiElement?) = + element is KtPropertyAccessor || + PsiTreeUtil.getParentOfType(element, KtProperty::class.java, KtPropertyAccessor::class.java) is KtPropertyAccessor + + private fun getElementToCreateTypeMapperForLibraryFile(element: PsiElement?) = + if (element is KtElement) element else PsiTreeUtil.getParentOfType(element, KtElement::class.java) + + private fun getJvmInternalNameForImpl(typeMapper: JetTypeMapper, ktClass: KtClassOrObject): String? { + val classDescriptor = typeMapper.bindingContext.get(BindingContext.CLASS, ktClass) ?: return null + + if (ktClass is KtClass && ktClass.isInterface()) { + return typeMapper.mapDefaultImpls(classDescriptor).internalName + } + + return typeMapper.mapClass(classDescriptor).internalName + } + + private fun createTypeMapperForLibraryFile(notPositionedElement: PsiElement?, file: KtFile): JetTypeMapper { + val element = getElementToCreateTypeMapperForLibraryFile(notPositionedElement) + val analysisResult = element!!.analyzeAndGetResult() + + val state = GenerationState(file.project, ClassBuilderFactories.THROW_EXCEPTION, + analysisResult.moduleDescriptor, analysisResult.bindingContext, listOf(file)) + state.beforeCompile() + return state.typeMapper + } + + public fun isInlinedLambda(functionLiteral: KtFunction, context: BindingContext): Boolean { + return InlineUtil.isInlinedArgument(functionLiteral, context, false) + } + + private fun createKeyForTypeMapper(file: KtFile) = NoResolveFileClassesProvider.getFileClassInternalName(file) + + private fun findInlinedCalls(element: PsiElement?, jetFile: PsiFile?): List { if (element == null || jetFile !is KtFile) { return emptyList() @@ -518,4 +501,22 @@ public class KotlinPositionManager(private val myDebugProcess: DebugProcess) : M } private fun ReferenceType.containsKotlinStrata() = availableStrata().contains("Kotlin") + + companion object { + public fun createTypeMapper(file: KtFile): JetTypeMapper { + val project = file.project + + val analysisResult = file.analyzeFullyAndGetResult() + analysisResult.throwIfError() + + val state = GenerationState( + project, + ClassBuilderFactories.THROW_EXCEPTION, + analysisResult.moduleDescriptor, + analysisResult.bindingContext, + listOf(file)) + state.beforeCompile() + return state.typeMapper + } + } }