microsoft / vscode-typescript-tslint-plugin

VS Code extension that provides TSLint support using the typescript-tslint-plugin
https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-typescript-tslint-plugin
MIT License
188 stars 35 forks source link

TSLint causes TS features to become unresponsive on incorrect react component syntax. #97

Closed BuckAMayzing closed 5 years ago

BuckAMayzing commented 5 years ago

I think I've got this broken down to the bare minimum number of steps to reproduce, and it's been happening for a while. I'm wondering if it's related to #55, but I can't guarantee that it is. It might be that this breaks on any sufficient number of TypeScript server errors, but here's the set of steps:

Environment: W10 (multiple editions) VSCode version: All so far, including the latest insiders TSLint version: 1.1.0

  1. create tslint.json and ./src/test.tsx files (source below)
  2. open src/test.tsx
  3. wait for language features to initialize
  4. go to the appropriately commented line
  5. enter a letter, delete, and repeat.

After a few times (reliably 5 times for me), the error underlines, outline, autocomplete, and other related features stop responding.

This behavior doesn't occur if the TSLint extension is disabled or not installed.

tslint.json:

{
    "extends": ["tslint:recommended"]
}

test.tsx (NOTE: The outer div seems to be important here. Removing it prevents the crash):

const val: number = 1;

const Component = () => {
    return (
        <div>
            {val === 0 ? (
                "test"
            ) : (
                // enter something here.
                <div className={"something"}>
                </div>
            )}
        </div>
    );
};

export default Component;
mjbvz commented 5 years ago

Thanks for the repo steps. After testing this, from the logs I believe this is actually a TS error:

  ERR TypeScript Server Error (3.6.0)
Debug Failure. Did not expect JsxExpression to have an Identifier in its trivia
Error: Debug Failure. Did not expect JsxExpression to have an Identifier in its trivia
    at addSyntheticNodes (tsserver.js:121781:30)
    at createChildren (tsserver.js:121770:9)
    at NodeObject.getChildren (tsserver.js:121714:56)
    at find (tsserver.js:97255:30)
    at find (tsserver.js:97275:32)
    at find (tsserver.js:97275:32)
    at find (tsserver.js:97275:32)
    at find (tsserver.js:97275:32)

This is being tracked upstream by https://github.com/microsoft/TypeScript/issues/25487