dotnet / interactive

.NET Interactive combines the power of .NET with many other languages to create notebooks, REPLs, and embedded coding experiences. Share code, explore data, write, and learn across your apps in ways you couldn't before.
MIT License
2.8k stars 371 forks source link

New code cells in F# default notebook are missing metadata, are treated as C# #3544

Open FH-Inway opened 1 month ago

FH-Inway commented 1 month ago

Describe the bug

I mainly write notebooks for F# and PowerShell, with the occasional C# cell in the mix. The default notebook language setting is set to fsharp.

The last few times I worked with the notebooks, I noticed that new code cells show in the top bottom corner my default language setting "fsharp - F# Script Code". However, if valid F# code is entered in the cell, it gets a lot of red squiggles (screenshot 1). When executing the cell, there are a lot of CS errors, indicating that the code is treated as C# (screenshot 2).

When I open the notebook in a text editor, I see that the metadata node of the cell is empty. Other working cells have metadata indicating F# in there (screenshot 3). See also a gist of the file in that state: https://gist.github.com/FH-Inway/34984cfacc39b27e206873048a16fb3e?short_path=51a4666

When I explicitely set the code cell via the language selector in the bottom right corner to F#, all is well again.

When I close a notebook with such an "invalid" cell, it is opened again right away, showing unsaved changes. The cell can now be executed successfully and after saving the file, the cell shows F# metadata.

Please complete the following:

Which version of .NET Interactive are you using? (In a notebook, run the #!about magic command. ): Version: 1.0.522904+cdfa48b2ea1a27dfe0f545c42a34fd3ec7119074 Library version: 1.0.0-beta.24229.4+cdfa48b2ea1a27dfe0f545c42a34fd3ec7119074 Build date: 2024-05-05T09:37:02.5479468Z

Screenshots

Screenshot 2024-05-05 121358

Screenshot 2024-05-05 121414

Screenshot 2024-05-05 121443

Related issues

3263 Polyglot Notebook: [DevExE2E][Regression] The kernelName and language show as csharp in the created Untitled-1.ipynb contents.

3480 Default language not applied after open an python ipynb file

Snozzberries commented 1 month ago

Seeing same issue with PowerShell cells.

  1. New polyglot notebook as PowerShell
  2. In first code cell, already tagged as pwsh, run a command
  3. Receive error The state of the current PowerShell instance is not valid for this operation.
  4. Manually set the cell tag to pwsh, command runs as expected
  5. Save file
  6. Restart kernel
  7. All cells that weren't manually tagged reset to C#

I downgraded to a few versions back to 1.0.4403* and saw similar results, though in the current version the save file retains the notebook level metadata, in those older versions even that would go away.

FH-Inway commented 1 week ago

Since this keeps bugging me, a few more observations:

Observation 1

Observation 2

Observation 3

I could keep going with all kinds of weird results, some reproducible, some not (at one time, I had a markdown cell with csharp language in the metadata). It seems every variation of sequence when a notebook is saved, when and where a new cell is added, when the cell is executed, ... results in a different outcome. Though none of the outcomes so far result in the expected behavior, that a new code cell is created as a fsharp cell. This makes it an inconsistent and frustrating user experience.

I'm now on the following version of .NET Interactive: Version: 1.0.526301+dd3fefb929d456fa10b0b9f7e0b2c65f6cfbee93 Library version: 1.0.0-beta.24263.1+dd3fefb929d456fa10b0b9f7e0b2c65f6cfbee93 Build date: 2024-06-22T11:52:32.3437483Z

Still Windows 11, Edge and VSCode.

nhirschey commented 1 week ago

This bug is because when you click "+ code" to create a cell, the "metadata" field inside the json is not populated, so the cell is parsed as C# by default.

Example text view of problem cell:

{
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "ename": "Error",
     "evalue": "(1,10): error CS1002: ; expected",
     "output_type": "error",
     "traceback": [
      "(1,10): error CS1002: ; expected"
     ]
    }
   ],
   "source": [
    "let y = 5"
   ]
  }

Add metadata and it works

If I manually re-select the "fsharp" language in the bottom right of the code sell, the metadata gets set and I can run the code using the F# kernel. cell-type

{
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "dotnet_interactive": {
     "language": "fsharp"
    },
    "polyglot_notebook": {
     "kernelName": "fsharp"
    }
   },
   "outputs": [],
   "source": [
    "let y = 15"
   ]
  }
FH-Inway commented 1 week ago

Thanks, that is the workaround I currently use. I hope we agree that this should not be the normal workflow for a user.