diff --git a/src/xinterpreter.cpp b/src/xinterpreter.cpp index 87b86897..8e7cb4c5 100644 --- a/src/xinterpreter.cpp +++ b/src/xinterpreter.cpp @@ -279,9 +279,18 @@ __get_cxx_version () return kernel_res; } - nl::json interpreter::is_complete_request_impl(const std::string& /*code*/) + nl::json interpreter::is_complete_request_impl(const std::string& code) { - return xeus::create_is_complete_reply("complete", " "); + if (!code.empty() && code[code.size() - 1] == '\\') { + auto found = code.rfind('\n'); + if (found == std::string::npos) + found = -1; + auto found1 = found++; + while (isspace(code[++found1])) ; + return xeus::create_is_complete_reply("incomplete", code.substr(found, found1-found)); + } + + return xeus::create_is_complete_reply("complete"); } nl::json interpreter::kernel_info_request_impl() diff --git a/test/test_xcpp_kernel.py b/test/test_xcpp_kernel.py index 2837fff8..fda17174 100644 --- a/test/test_xcpp_kernel.py +++ b/test/test_xcpp_kernel.py @@ -37,6 +37,32 @@ def test_codecomplete(self) -> None: self.assertEqual(str(reply["content"]["matches"]), "['float', 'foo']") self.assertEqual(reply["content"]["status"], "ok") + # Continuation + code_continuation_incomplete = ' int foo = 12; \\\n float bar = 1.5f;\\' + code_continuation_complete = ' int foo = 12; \\\n float bar = 1.5f;' + + def test_continuation(self) -> None: + if not self.code_continuation_incomplete or not self.code_continuation_complete: + raise SkipTest("No code continuation sample") + + # Incomplete + self.flush_channels() + msg_id = self.kc.is_complete(self.code_continuation_incomplete) + reply = self.get_non_kernel_info_reply(timeout=1) + assert reply is not None + self.assertEqual(reply["msg_type"], "is_complete_reply") + self.assertEqual(str(reply["content"]["indent"]), " ") + self.assertEqual(reply["content"]["status"], "incomplete") + + # Complete + self.flush_channels() + msg_id = self.kc.is_complete(self.code_continuation_complete) + reply = self.get_non_kernel_info_reply(timeout=1) + assert reply is not None + self.assertEqual(reply["msg_type"], "is_complete_reply") + self.assertEqual(str(reply["content"]["indent"]), "") + self.assertEqual(reply["content"]["status"], "complete") + class XCppTests(jupyter_kernel_test.KernelTests):