Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

=== undefinedと=== nullを禁止したい #1513

Closed
3 tasks
Hiroshiba opened this issue Aug 21, 2023 · 14 comments · Fixed by #1747
Closed
3 tasks

=== undefinedと=== nullを禁止したい #1513

Hiroshiba opened this issue Aug 21, 2023 · 14 comments · Fixed by #1747
Labels
優先度:低 初心者歓迎タスク 初心者にも優しい簡単めなタスク 機能向上

Comments

@Hiroshiba
Copy link
Member

Hiroshiba commented Aug 21, 2023

内容

タイトルの通りです。

厳密等価===は有用ですが、undefinedやnullを右辺に持ってくる時、左辺がundefinedなのかnullなのかを意識する必要があります。
左辺がどちらになりえるかを往々にして間違えることがあり、気づくことが難しいです。
実際に間違っていることもありました。

この問題の解決としていろんな方法があるかもしれませんが、1つの方法としてundefinedやnullとの厳密等価比較を禁止する手がありそうです。

ESLintに詳しい方は解決しやすいと思います。

Pros 良くなる点

気づきにくいバグを防ぐことができる

Cons 悪くなる点

ESLintの設定が難しい

実現方法

試してみたのですがなかなかうまくいきませんでした。こんな感じのeslint.jsonに記載しました。

    // undefinedとnullの厳密等価比較を禁止する
    "no-restricted-syntax": [
      "error",
      {
        selector:
          "BinaryExpression[operator='==='][left.type!='Literal'][right.type='Identifier'][right.name='undefined']",
        message: "Do not use '=== undefined'. Use '== undefined' instead.",
      },
      {
        selector:
          "BinaryExpression[operator='==='][left.type!='Literal'][right.type='Identifier'][right.name='null']",
        message: "Do not use '=== null'. Use '== null' instead.",
      },
    ],

以下は全部エラーになって欲しい例ですが、この場合いくつかのパターンが素通りしてしまいました。

      const fuga = "null";
      const a = fuga === undefined;

      const b = "fuga" === undefined;

      const button = { text: null };
      const c = button.text === null;

      const d = "fuga" === null;

image

ESLintで禁止できそうですが、もしやり方をご存知の方がいたらアドバイスいただければ・・・。

VOICEVOXのバージョン

0.?.0

OSの種類/ディストリ/バージョン

  • Windows
  • macOS
  • Linux

その他

nullとの絶対比較を絶対に使ってはいけないとは思っておらず、使わないといけない時はdisableにして利用すれば良いと思っています。

あと話は↓と近いかも。

@Hiroshiba
Copy link
Member Author

Hiroshiba commented Sep 27, 2023

=== undefined=== nullが使われていたらワーニングが出るようになりました!(thx @Tksn07 !!!)
(修正箇所がかなり大量に及ぶので一旦ワーニングという方針です)

全てのワーニングを直してエラーが出るようにできればこの課題は解決かなと思います!

@Tksn07
Copy link
Contributor

Tksn07 commented Sep 29, 2023

@Hiroshiba マージありがとうございます!
引き続き、このワーニングを直すのは私の方で進めさせていただこうと思います 🙏

そこで1つ、このワーニングのPRの切る粒度について相談したいです 👀

修正必要ファイルを洗い出したところ

  • build
    • splitNsisArchive.js
  • src/
    • background.ts
    • components/
      • AccentPhrase.vue
      • AudioCell.vue
      • udioDetail.vue
      • AudioInfo.vue
      • CharacterOrderDialog.vue
      • CharacterPortrait.vue
      • DefaultStyleListDialog.vue
      • DefaultStyleSelectDialog.vue
      • Dialog.ts
      • EngineManageDialog.vue
      • FileNamePatternDialog.vue
      • HeaderBarCustomDialog.vue
      • MenuBar.vue
      • MenuItem.vue
    • background/
      • engineManager.ts
      • portManager.ts
      • configMigration014.ts
      • vvppManager.ts
    • browser/
      • fileImpl.ts
      • sandbox.ts
      • storeImpl.ts
    • helpers/
      • SelectionHelperForQInput.ts
      • map.ts
      • previewSliderHelper.ts
    • infrastructures
      • EngineConnector.ts
    • store
      • audio.ts
      • audioPlayer.ts
      • dictionary.ts
      • engine.ts
      • index.ts
      • preset.ts
      • project.ts
      • proxy.ts
      • setting.ts
      • utility.ts
    • types/
      • result.ts
    • views/
      • EditorHome.vue
  • tests/
    • e2e/browser/複数選択/選択.spec.ts

のファイルたちが修正が必要みたいです。
修正のやり方としては色々あると考えていて、特に現実的なのは

  • 1つのPRで修正する
  • 1ファイル1PRで修正する
  • 機能単位で修正する

だと思っています。
個人的には、エラーが吐かれているメソッドを機能単位でPRを作成し、動作確認しながら修正していくやり方が最も確実で安全だと考えていますが、レビュワーにとってレビューしやすいやり方が一番だと思うので @Hiroshiba さんに意見いただきたいです🙏🙏🙏

@sevenc-nanashi
Copy link
Member

参考までに:過去に、全てのVueコンポーネントを<script setup>にした時がありました( #1065
この時は「機能単位で修正する」に近いやり方でした。

@Hiroshiba
Copy link
Member Author

まとめと段取り提案ありがとうございます!!
いろんなやり方と考え方があると思いますが、仰るとおり機能単位でPR頂けるとやりやすそうです!
1回で全部は流石に確認が大変そうなのと、動作確認を1回ずつで済ましやすいのと、他のコミッターがコンフリクト解消する回数を抑えられそうなので。

差分どれくらいの数か不明ですが、PR回数3~5回くらいが良い塩梅かな?となんとなく思ってます。
動作確認もしていただけるのであればとても嬉しいです!!
ただまあマルチエンジンまわりとかは実行チェックだいぶ大変そうなので、そういうとこは確認なしでも全然OKです!(そのためのレビュー)

@Hiroshiba
Copy link
Member Author

ずっとGithub actionsの結果としてwarningが表示され続けている状況なので、そろそろ解決できると嬉しいです!

@Tksn07 お久しぶりです!! もしよかったら取り組んでみませんか??
数十個ずつくらい一気に進めてしまって、あとはなんとなく動作チェックを行い、レビュー時に問題がありそうかどうかを検査する形で良いのかなと思ってます!!
一番問題なのが現状放置されている状態で、それよりはもしかしてもしかしたらバグがあるかもしれないけれども改善する方が大事かなと・・・!
(そもそもバグが起こるのが相当珍しいと思います!)

@Tksn07
Copy link
Contributor

Tksn07 commented Dec 18, 2023

@Hiroshiba お久しぶりです!コメントありがとうございます!!
期間が空いてしまい申し訳ございません🙇‍♂️
是非着手させていただきます!!一気に改修は難しいので少しづつ着手させていただきます🙇‍♀️🙇‍♀️🙇‍♀️

@Hiroshiba
Copy link
Member Author

おお、ぜひぜひ!!
とりあえず1ファイルだけとかでも良いと思います!!

Hiroshiba added a commit that referenced this issue Dec 23, 2023
## 内容

久しぶりにmainブランチに追従します。
大きな変更は無いはずですが、いくつか便利な機能が追加されてるはずです。

* 開発環境でconfig.jsonの読み込みに失敗した場合に、config.jsonを消して起動を続行できるダイアログを表示
	* いろんなbranchを行き来する人にとても便利
* `=== undefined`や`=== null`がwarningに
	* 危ないので・・・ #1513

## 関連 Issue

- VOICEVOX/voicevox_project#15

## その他

`package-lock.json`がコンフリクトしました。
mainブランチ側の`package-lock.json`を持ってくる→`npm
i`→できた`package-lock.json`をaddしました
@cm-ayf
Copy link
Contributor

cm-ayf commented Jan 25, 2024

#1747#1752 でかなり抹消されたのですが,実は.vueのv-if=""で比較されている場所で考慮漏れが発生しておりまして……
https://github.com/VOICEVOX/voicevox/blob/main/src/components/help/LibraryPolicy.vue#L7
https://github.com/VOICEVOX/voicevox/blob/main/src/components/HeaderBar.vue#L5

@Hiroshiba
Copy link
Member Author

@cm-ayf あ!!! ご報告ありがとうございます、とても助かります!!!

せっかくなのでプルリクエストを作ってみるのはいかがでしょうか 👀
(コントリビューターリストに追記されます。)

難しそうであればこちらで変更させていただきます!!

@cm-ayf
Copy link
Contributor

cm-ayf commented Jan 25, 2024

これらを変更するのは難しくないのですが,難しいのはESLintがこれらを見逃さないようにすることですね……

@Hiroshiba
Copy link
Member Author

あー・・・なるほどです。
流石にvueの中まではまだ見てくれない感じなんですね・・・!

@cm-ayf
Copy link
Contributor

cm-ayf commented Jan 25, 2024

.vueの中を見るには,例えばeslint-plugin-vueの内部向けに存在するwrapRuleModuleなどを使う必要がありそうです.

@Hiroshiba
Copy link
Member Author

なるほどです!!
なぜvueの中でeslintがある程度働けてるのか疑問だったのですが、eslint-plugin-vueが頑張ってくれてたんですね。

できれば.vueのtemplateの中まで見れるととても嬉しいですね・・・・・!!!

@cm-ayf
Copy link
Contributor

cm-ayf commented Jan 25, 2024

別issueにしましょうか.→ #1758

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
優先度:低 初心者歓迎タスク 初心者にも優しい簡単めなタスク 機能向上
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants