#    Licensed to the Apache Software Foundation (ASF) under one
#    or more contributor license agreements.  See the NOTICE file
#    distributed with this work for additional information
#    regarding copyright ownership.  The ASF licenses this file
#    to you under the Apache License, Version 2.0 (the
#    "License"); you may not use this file except in compliance
#    with the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing,
#    software distributed under the License is distributed on an
#    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#    KIND, either express or implied.  See the License for the
#    specific language governing permissions and limitations
#    under the License.
O:Cannot start REPL, see IDE log for more details.
x:|  Welcome to the Java REPL NetBeans integration
x:|  Type /help for help
x:
I:-> `System.err.println("");` System.err.println("");
M:| ` Error:
x:| ` illegal start of expression
x:| ` |  Welcome to the Java REPL NetBeans integration
x:| ` ^
x:
I:-> `
M:| ` Error:
x:| ` illegal start of expression
x:| ` |  Welcome to the Java REPL NetBeans integration
x:| ` ^
x:
I:-> `System.err.println("");
M:| ` Error:
x:| ` ';' expected
x:| ` s integration
x:| `              ^
x:
I:-> `System.err.println("x");
M:| `x
x:
I:-> `System.err.println("ahoj");
M:| `ahoj
x:
I:-> `System
M:| ` Error:
x:| ` cannot find symbol
x:| `   symbol:   variable System
x:| ` System
x:| ` ^----^
x:
I:-> `System.err
M:| ` Expression value is: java.io.PrintStream@3d04a311
x:| `   assigned to temporary variable $3 of type PrintStream
x:
I:-> `System.err.
x:>> `println
M:| ` Error:
x:| ` cannot find symbol
x:| `   symbol:   variable println
x:| ` System.err.
x:| ` ^----------...
x:
In:-> `System.err.
