-
Notifications
You must be signed in to change notification settings - Fork 24
Description
1. Summary
SublimeLinter-flow incorrectly handles Flow output in 2025. I get the error AttributeError: 'tuple' object has no attribute 'error_type'.
2. MCVE
2.1. Files
The file kira-example.js with intentionally incorrect type annotations:
// @flow
var whoIsAGoddess;
whoIsAGoddess = function(goddessName/*: number */)/*: boolean */ {
return `${goddessName} is a Goddess!`;
};
console.log(whoIsAGoddess("Kira"));Flow also requires the file .flowconfig in the same directory as kira-example.js. This file may be empty.
2.2. Terminal output
D:\SashaDebugging\KiraFlow>flow kira-example.js
Launching Flow server for D:\SashaDebugging\KiraFlow
Spawned flow server (pid=19432)
Logs will go to C:\Users\SashaChernykh\AppData\Local\Temp\flow\DzCzBSashaDebuggingzBKiraFlow.log
Monitor logs will go to C:\Users\SashaChernykh\AppData\Local\Temp\flow\DzCzBSashaDebuggingzBKiraFlow.monitor_log
Error --------------------------------------------------------------------------------------------- kira-example.js:5:12
Cannot return template string because string [1] is incompatible with boolean [2]. [incompatible-type]
kira-example.js:5:12
5| return `${goddessName} is a Goddess!`;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [1]
References:
kira-example.js:4:55
4| whoIsAGoddess = function(goddessName/*: number */)/*: boolean */ {
^^^^^^^ [2]
Error --------------------------------------------------------------------------------------------- kira-example.js:8:27
Cannot call `whoIsAGoddess` with `"Kira"` bound to `goddessName` because string [1] is incompatible with number [2].
[incompatible-type]
kira-example.js:8:27
8| console.log(whoIsAGoddess("Kira"));
^^^^^^ [1]
References:
kira-example.js:4:41
4| whoIsAGoddess = function(goddessName/*: number */)/*: boolean */ {
^^^^^^ [2]
Found 2 errors2.3. Steps to reproduce
-
Launch Sublime Text 4 on Windows in the Safe Mode.
-
Install Package Control.
-
Ctrl+Shift+P →
Package Control: Upgrade/Overwrite All Packages.Otherwise, I get the error
Package Control: The dependency 'typing_extensions' is not availablewhen I install SublimeLinter through Package Control. -
Install SublimeLinter and SublimeLinter-flow using Package Control.
-
Ctrl+Shift+P →
SublimeLinter: Reload SublimeLinter and its Plugins.Otherwise, SublimeLinter plugins don’t work, and I get the message
SublimeLinter upgrade in progress. Aborting lint.in the status bar. -
Ctrl+Shift+P →
Preferences: SublimeLinter Settings→ replace the content of the user settings file on the right side with this content:{ "debug": true } -
Select
Filein the Sublime menu →Open file→ open the filekira-example.js. -
Install AutomaticPackageReloader using Package Control. Ctrl+Shift+P →
Automatic Package Reloader→ add the textSublimeLinter-flowin the opened input field with the labelPackage:→ Enter.Otherwise, SublimeLinter-flow doesn’t lint files. I get this output in the Sublime Text console:
SublimeLinter: backend.py:75 Delay linting 'kira-example.js' for 0.3s SublimeLinter: backend.py:75 Delay linting 'kira-example.js' for 0.3s SublimeLinter: backend.py:99 No installed linter matches the view. SublimeLinter: backend.py:99 No installed linter matches the view.
NOTE: SublimeLinter duplicates messages in the debug mode.
-
When the file
kira-example.jsis opened in the current view, open the Sublime Text Python console.
2.4. Sublime console output
I get this output in the Sublime Text console:
SublimeLinter: #1 linter.py:55 found flow pragma!
SublimeLinter: #1 linter.py:55 found flow pragma!
SublimeLinter: #1 linter.py:1704 Running …
D:\SashaDebugging\KiraFlow (working dir)
> type kira-example.js | "C:\Program Files\nodejs\flow.CMD" check-contents D:\SashaDebugging\KiraFlow\kira-example.js --show-all-errors --json
SublimeLinter: #1 linter.py:1704 Running …
D:\SashaDebugging\KiraFlow (working dir)
> type kira-example.js | "C:\Program Files\nodejs\flow.CMD" check-contents D:\SashaDebugging\KiraFlow\kira-example.js --show-all-errors --jsonSublimeLinter: #1 linter.py:1238 flow: output:
[{"flowVersion":"0.295.0","jsonVersion":"1","errors":[{"kind":"infer","level":"error","suppressions":[],"extra":[{"message":[{"context":null,"descr":"References:","type":"Blame","path":"","line":0,"endline":0,"start":1,"end":0}]},{"message":[{"context":" return `${goddessName} is a Goddess!`;","descr":"[1]","type":"Blame","loc":{"source":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","type":"SourceFile","start":{"line":5,"column":12,"offset":107},"end":{"line":5,"column":41,"offset":137}},"path":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","line":5,"endline":5,"start":12,"end":41}]},{"message":[{"context":"whoIsAGoddess = function(goddessName/*: number */)/*: boolean */ {","descr":"[2]","type":"Blame","loc":{"source":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","type":"SourceFile","start":{"line":4,"column":55,"offset":83},"end":{"line":4,"column":61,"offset":90}},"path":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","line":4,"endline":4,"start":55,"end":61}]}],"message":[{"context":" return `${goddessName} is a Goddess!`;","descr":"Cannot return template string because string [1] is incompatible with boolean [2]. [incompatible-type]","type":"Blame","loc":{"source":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","type":"SourceFile","start":{"line":5,"column":12,"offset":107},"end":{"line":5,"column":41,"offset":137}},"path":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","line":5,"endline":5,"start":12,"end":41}],"error_codes":["incompatible-type"]},{"kind":"infer","level":"error","suppressions":[],"extra":[{"message":[{"context":null,"descr":"References:","type":"Blame","path":"","line":0,"endline":0,"start":1,"end":0}]},{"message":[{"context":"console.log(whoIsAGoddess(\"Kira\"));","descr":"[1]","type":"Blame","loc":{"source":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","type":"SourceFile","start":{"line":8,"column":27,"offset":169},"end":{"line":8,"column":32,"offset":175}},"path":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","line":8,"endline":8,"start":27,"end":32}]},{"message":[{"context":"whoIsAGoddess = function(goddessName/*: number */)/*: boolean */ {","descr":"[2]","type":"Blame","loc":{"source":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","type":"SourceFile","start":{"line":4,"column":41,"offset":69},"end":{"line":4,"column":46,"offset":75}},"path":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","line":4,"endline":4,"start":41,"end":46}]}],"message":[{"context":"console.log(whoIsAGoddess(\"Kira\"));","descr":"Cannot call `whoIsAGoddess` with `\"Kira\"` bound to `goddessName` because string [1] is incompatible with number [2]. [incompatible-type]","type":"Blame","loc":{"source":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","type":"SourceFile","start":{"line":8,"column":27,"offset":169},"end":{"line":8,"column":32,"offset":175}},"path":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","line":8,"endline":8,"start":27,"end":32}],"error_codes":["incompatible-type"]}],"passed":false},{}]
SublimeLinter: #1 linter.py:1238 flow: output:
[{"flowVersion":"0.295.0","jsonVersion":"1","errors":[{"kind":"infer","level":"error","suppressions":[],"extra":[{"message":[{"context":null,"descr":"References:","type":"Blame","path":"","line":0,"endline":0,"start":1,"end":0}]},{"message":[{"context":" return `${goddessName} is a Goddess!`;","descr":"[1]","type":"Blame","loc":{"source":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","type":"SourceFile","start":{"line":5,"column":12,"offset":107},"end":{"line":5,"column":41,"offset":137}},"path":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","line":5,"endline":5,"start":12,"end":41}]},{"message":[{"context":"whoIsAGoddess = function(goddessName/*: number */)/*: boolean */ {","descr":"[2]","type":"Blame","loc":{"source":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","type":"SourceFile","start":{"line":4,"column":55,"offset":83},"end":{"line":4,"column":61,"offset":90}},"path":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","line":4,"endline":4,"start":55,"end":61}]}],"message":[{"context":" return `${goddessName} is a Goddess!`;","descr":"Cannot return template string because string [1] is incompatible with boolean [2]. [incompatible-type]","type":"Blame","loc":{"source":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","type":"SourceFile","start":{"line":5,"column":12,"offset":107},"end":{"line":5,"column":41,"offset":137}},"path":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","line":5,"endline":5,"start":12,"end":41}],"error_codes":["incompatible-type"]},{"kind":"infer","level":"error","suppressions":[],"extra":[{"message":[{"context":null,"descr":"References:","type":"Blame","path":"","line":0,"endline":0,"start":1,"end":0}]},{"message":[{"context":"console.log(whoIsAGoddess(\"Kira\"));","descr":"[1]","type":"Blame","loc":{"source":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","type":"SourceFile","start":{"line":8,"column":27,"offset":169},"end":{"line":8,"column":32,"offset":175}},"path":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","line":8,"endline":8,"start":27,"end":32}]},{"message":[{"context":"whoIsAGoddess = function(goddessName/*: number */)/*: boolean */ {","descr":"[2]","type":"Blame","loc":{"source":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","type":"SourceFile","start":{"line":4,"column":41,"offset":69},"end":{"line":4,"column":46,"offset":75}},"path":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","line":4,"endline":4,"start":41,"end":46}]}],"message":[{"context":"console.log(whoIsAGoddess(\"Kira\"));","descr":"Cannot call `whoIsAGoddess` with `\"Kira\"` bound to `goddessName` because string [1] is incompatible with number [2]. [incompatible-type]","type":"Blame","loc":{"source":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","type":"SourceFile","start":{"line":8,"column":27,"offset":169},"end":{"line":8,"column":32,"offset":175}},"path":"D:\\SashaDebugging\\KiraFlow\\kira-example.js","line":8,"endline":8,"start":27,"end":32}],"error_codes":["incompatible-type"]}],"passed":false},{}]SublimeLinter: #1 linter.py:291 flow 2 errors. passed: False
SublimeLinter: #1 linter.py:291 flow 2 errors. passed: False
SublimeLinter: #1 linter.py:137 flow line: 4, col: 11, level: error, message: `${goddessName} is a Goddess!` (Cannot return template string because string [1] is incompatible with boolean [2]. [incompatible-type])
SublimeLinter: #1 linter.py:137 flow line: 4, col: 11, level: error, message: `${goddessName} is a Goddess!` (Cannot return template string because string [1] is incompatible with boolean [2]. [incompatible-type])SublimeLinter: #1 backend.py:257 ERROR: Unhandled exception:
Traceback (most recent call last):
File "G:\SublimeText\Data (Safe Mode)\Installed Packages\SublimeLinter.sublime-package\lint/backend.py", line 245, in execute_lint_task
errors = linter.lint(code, view_has_changed)
File "G:\SublimeText\Data (Safe Mode)\Installed Packages\SublimeLinter.sublime-package\lint/linter.py", line 1178, in lint
return self.filter_errors(self.parse_output(output, virtual_view))
File "G:\SublimeText\Data (Safe Mode)\Installed Packages\SublimeLinter.sublime-package\lint/linter.py", line 1201, in filter_errors
return [
File "G:\SublimeText\Data (Safe Mode)\Installed Packages\SublimeLinter.sublime-package\lint/linter.py", line 1201, in <listcomp>
return [
File "G:\SublimeText\Data (Safe Mode)\Installed Packages\SublimeLinter.sublime-package\lint/linter.py", line 1242, in parse_output_via_regex
if error := self.process_match(m, virtual_view):
File "G:\SublimeText\Data (Safe Mode)\Installed Packages\SublimeLinter.sublime-package\lint/linter.py", line 1349, in process_match
error_type = m.error_type or self.get_error_type(m.error, m.warning)
AttributeError: 'tuple' object has no attribute 'error_type'
SublimeLinter: #1 backend.py:257 ERROR: Unhandled exception:
Traceback (most recent call last):
File "G:\SublimeText\Data (Safe Mode)\Installed Packages\SublimeLinter.sublime-package\lint/backend.py", line 245, in execute_lint_task
errors = linter.lint(code, view_has_changed)
File "G:\SublimeText\Data (Safe Mode)\Installed Packages\SublimeLinter.sublime-package\lint/linter.py", line 1178, in lint
return self.filter_errors(self.parse_output(output, virtual_view))
File "G:\SublimeText\Data (Safe Mode)\Installed Packages\SublimeLinter.sublime-package\lint/linter.py", line 1201, in filter_errors
return [
File "G:\SublimeText\Data (Safe Mode)\Installed Packages\SublimeLinter.sublime-package\lint/linter.py", line 1201, in <listcomp>
return [
File "G:\SublimeText\Data (Safe Mode)\Installed Packages\SublimeLinter.sublime-package\lint/linter.py", line 1242, in parse_output_via_regex
if error := self.process_match(m, virtual_view):
File "G:\SublimeText\Data (Safe Mode)\Installed Packages\SublimeLinter.sublime-package\lint/linter.py", line 1349, in process_match
error_type = m.error_type or self.get_error_type(m.error, m.warning)
AttributeError: 'tuple' object has no attribute 'error_type'SublimeLinter: backend.py:460 Linting 'kira-example.js' with flow took 0.80s
SublimeLinter: backend.py:460 Linting 'kira-example.js' with flow took 0.80s3. Environment
- Windows 11, Version 25H2 (OS Build 26200.7171)
- Sublime Text 4, Build 4200 (Stable Channel)
- SublimeLinter 4.82.2
- Flow 0.295.0
- SublimeLinter-flow 4.5.7
Thanks.