marko-js / language-server

Marko autocomplete, intellisense and editor support.
MIT License
38 stars 8 forks source link

On Windows, diagnostics are show at the incorrect position after a custom tag #240

Open AngusMorton opened 6 months ago

AngusMorton commented 6 months ago

On Windows, after a custom tag is used, the diagnostics are shown at the incorrect positions or not shown at all. marko-type-check still shows the correct errors in the correct positions.

Given the following template, every instance of input.name++ should have an error underline.

export interface Input {
    name?: string;
}
<my-title name=input.name/>
<div>${input.name++}</div>
$ input.name++;
<div>${input.name++}</div>

The error is shown in the wrong position and only once:

export interface Input {
    name?: string;
}
<my-title name=input.name/>
<div>${input.name++}</div>
$ input.name++;
<div>${input.name++}</div>
 ^ 'input.name' is possibly 'undefined'.

Moving the use of <my-title> below the errors will cause the diagnostics above to be correctly rendered and the diagnostics below to be ignored.

export interface Input {
    name?: string;
}
<div>${input.name++}</div>
       ^^^^^^^^^^ 'input.name' is possibly 'undefined'.
<my-title name=input.name/>
$ input.name++;
<div>${input.name++}</div>

Removing the use of <my-title> shows all of the diagnostics in the right places as expected:

export interface Input {
    name?: string;
}
<div>${input.name++}</div>
       ^^^^^^^^^^ 'input.name' is possibly 'undefined'.
$ input.name++;
  ^^^^^^^^^^ 'input.name' is possibly 'undefined'.
<div>${input.name++}</div>
       ^^^^^^^^^^ 'input.name' is possibly 'undefined'.

Environment

Windows :( Marko VSCode v1.1.15 VSCode 1.85.1

    "marko": "^5.32.2",
    "@marko/run": "^0.4.0",
    "@marko/type-check": "^1.0.7",
    "typescript": "^5.3.3"
AngusMorton commented 5 months ago

This issue seems related to the auto import, or the way the typescript gets generated for the auto imports. Doing a manual import of the tag works as-expected:

import titleComponent from "./my-title.marko";
export interface Input {
    name?: string;
}
<div>${input.name++}</div>
       ^^^^^^^^^^ 'input.name' is possibly 'undefined'.
$ input.name++;
  ^^^^^^^^^^ 'input.name' is possibly 'undefined'.
<titleComponent/>
<div>${input.name++}</div>
       ^^^^^^^^^^ 'input.name' is possibly 'undefined'.
AngusMorton commented 3 months ago

I've got a reproduction here that is just the basic-ts example with most of the code removed.

Interestingly, doing import titleComponent from "<my-title>" also causes the bug while doing the import path ourselves doesn't. The extracted script is identical between <my-title> and ./my-title.marko...