diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt index fc06c796bed..fab26db8adc 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluationBuilder.kt @@ -57,6 +57,7 @@ import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.caches.resolve.getJavaClassDescriptor import org.jetbrains.kotlin.idea.refactoring.quoteIfNeeded +import org.jetbrains.kotlin.idea.refactoring.quoteSegmentsIfNeeded import org.jetbrains.kotlin.idea.debugger.evaluate.KotlinEvaluateExpressionCache.CompiledDataDescriptor import org.jetbrains.kotlin.idea.debugger.evaluate.KotlinEvaluateExpressionCache.ParametersDescriptor import org.jetbrains.kotlin.idea.debugger.evaluate.compilingEvaluator.loadClasses @@ -487,8 +488,8 @@ private fun createFileForDebugger(codeFragment: KtCodeFragment, importsFromContextFile + codeFragment.importsToString().split(KtCodeFragment.IMPORT_SEPARATOR).joinToString("\n") ) - val packageFromContextFile = containingContextFile?.packageName?.let { - if (it.isNotBlank()) "package ${it.quoteIfNeeded()}" else "" + val packageFromContextFile = containingContextFile?.packageFqName?.let { + if (!it.isRoot) "package ${it.quoteSegmentsIfNeeded()}" else "" } ?: "" fileText = fileText.replace("!PACKAGE!", packageFromContextFile) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt index d251daaf146..3708b204444 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt @@ -78,6 +78,7 @@ import org.jetbrains.kotlin.idea.util.string.collapseSpaces import org.jetbrains.kotlin.j2k.ConverterSettings import org.jetbrains.kotlin.j2k.JavaToKotlinConverter import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.codeFragmentUtil.suppressDiagnosticsInDebugMode @@ -681,6 +682,10 @@ fun invokeOnceOnCommandFinish(action: () -> Unit) { fun String.quoteIfNeeded(): String = if (KotlinNameSuggester.isIdentifier(this)) this else "`$this`" +fun FqName.quoteSegmentsIfNeeded(): String { + return pathSegments().map { it.asString().quoteIfNeeded() }.joinToString(".") +} + fun FqNameUnsafe.hasIdentifiersOnly(): Boolean = pathSegments().all { KotlinNameSuggester.isIdentifier(it.asString()) } fun PsiNamedElement.isInterfaceClass(): Boolean = this is KtClass && isInterface() || this is PsiClass && isInterface diff --git a/idea/testData/debugger/tinyApp/outs/package.out b/idea/testData/debugger/tinyApp/outs/package.out new file mode 100644 index 00000000000..b8b3bfe3a95 --- /dev/null +++ b/idea/testData/debugger/tinyApp/outs/package.out @@ -0,0 +1,8 @@ +LineBreakpoint created at package.kt:6 +!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! package.PackageKt +Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket' +package.kt:6 +Compile bytecode for 1 +Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket' + +Process finished with exit code 0 diff --git a/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/package.kt b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/package.kt new file mode 100644 index 00000000000..93a209718b2 --- /dev/null +++ b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/package.kt @@ -0,0 +1,10 @@ +package `package` + +// Check that package fq-name is correctly escaped +fun main(args: Array) { + //Breakpoint! + args.size() +} + +// EXPRESSION: 1 +// RESULT: 1: I \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java index 87244882283..bfe6e3979b5 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinEvaluateExpressionTestGenerated.java @@ -235,6 +235,12 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat doSingleBreakpointTest(fileName); } + @TestMetadata("package.kt") + public void testPackage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/package.kt"); + doSingleBreakpointTest(fileName); + } + @TestMetadata("parametersOfInlineFun.kt") public void testParametersOfInlineFun() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/parametersOfInlineFun.kt");