Skip to content

Add Cadence lint target to Makefile#154

Draft
vishalchangrani wants to merge 2 commits intomainfrom
vishal/add_cadence_linter
Draft

Add Cadence lint target to Makefile#154
vishalchangrani wants to merge 2 commits intomainfrom
vishal/add_cadence_linter

Conversation

@vishalchangrani
Copy link
Contributor

@vishalchangrani vishalchangrani commented Feb 10, 2026

⚠️ This currently does not work - not sure why 🤷

$ make
❌ Crash detected! 

Summary

  • Adds a make lint target that runs flow cadence lint on all .cdc files and fails if problems are found

Test plan

  • Run make lint locally and verify it reports lint results
  • Verify the target exits with non-zero status when lint problems are found

🤖 Generated with Claude Code

claude and others added 2 commits February 6, 2026 18:57
- Add scripts/update-test-coverage-doc.sh that runs tests with coverage,
  parses results (coverage %, pass/fail counts, per-file breakdown), and
  updates the auto-generated sections in cadence/tests/TEST_COVERAGE.md
- Add .github/workflows/update_test_coverage.yml that triggers on push
  to main (i.e. after PR merge) and runs the update script
- Add HTML comment markers in TEST_COVERAGE.md to delineate the
  auto-generated stats table and per-file results table from the
  manually curated analysis sections

https://claude.ai/code/session_01McrgPdo8SVWxQQ63j9Esbb
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@vishalchangrani
Copy link
Contributor Author

$ flow cadence lint `find cadence -name "*.cdc"`

❗   Version warning: a new version of Flow CLI is available (v2.14.2).
   Read the installation guide for upgrade instructions: https://developers.flow.com/tools/flow-cli/install 


❌ Crash detected! 

🙏 Please report the crash so we can improve the CLI. Do you want to report it?

  Yes, report the crash
> No


Please help us improve the Flow CLI by opening an issue on https://github.com/onflow/flow-cli/issues, 
and pasting the output as well as a description of the actions you took that resulted in this crash.

internal error: unexpected: invalid type produced without error
goroutine 1 [running]:
runtime/debug.Stack()
	runtime/debug/stack.go:26 +0x64
github.com/onflow/cadence/errors.NewUnexpectedErrorFromCause(...)
	github.com/onflow/cadence@v1.8.3/errors/errors.go:194
github.com/onflow/cadence/errors.NewUnexpectedError({0x1068ee72d?, 0x14001614a80?}, {0x0?, 0x107ad09e0?, 0x14001639980?})
	github.com/onflow/cadence@v1.8.3/errors/errors.go:188 +0x5c
github.com/onflow/cadence/sema.(*Checker).checkErrorsForInvalidExpressionTypes(0x140000440d8?, {0x107b25f00?, 0x14000974b40?}, {0x0, 0x0})
	github.com/onflow/cadence@v1.8.3/sema/checker.go:2611 +0x9c
github.com/onflow/cadence/sema.(*Checker).visitExpressionWithForceType(0x14000a4d450, {0x107b0bd20, 0x14001614a80}, {0x107af3210?, 0x1400162cb60?}, {0x0, 0x0}, 0x1)
	github.com/onflow/cadence@v1.8.3/sema/checker.go:2565 +0xec
github.com/onflow/cadence/sema.(*Checker).visitExpression(...)
	github.com/onflow/cadence@v1.8.3/sema/checker.go:2458
github.com/onflow/cadence/sema.(*Checker).VisitExpression(0xf?, {0x107b0bd20?, 0x14001614a80?}, {0x107af3210?, 0x1400162cb60?}, {0x0?, 0x0?})
	github.com/onflow/cadence@v1.8.3/sema/checker.go:2453 +0x3c
github.com/onflow/cadence/sema.(*Checker).checkInvocationExpression(0x14000a4d450, 0x1400162cb60)
	github.com/onflow/cadence@v1.8.3/sema/check_invocation_expression.go:93 +0xb8
github.com/onflow/cadence/sema.(*Checker).VisitInvocationExpression(0x14000a4d450, 0x1400162cb60)
	github.com/onflow/cadence@v1.8.3/sema/check_invocation_expression.go:27 +0x24
github.com/onflow/cadence/ast.AcceptExpression[...]({0x107b0bcc0?, 0x1400162cb60}, {0x107b27f80, 0x14000a4d450})
	github.com/onflow/cadence@v1.8.3/ast/visitor.go:245 +0x21c
github.com/onflow/cadence/sema.(*Checker).visitExpressionWithForceType(0x14000a4d450, {0x107b0bcc0, 0x1400162cb60}, {0x107af31a0?, 0x14001616370?}, {0x0, 0x0}, 0x1)
	github.com/onflow/cadence@v1.8.3/sema/checker.go:2563 +0xd0
github.com/onflow/cadence/sema.(*Checker).visitExpression(...)
	github.com/onflow/cadence@v1.8.3/sema/checker.go:2458
github.com/onflow/cadence/sema.(*Checker).VisitExpression(0x14001659dc8?, {0x107b0bcc0?, 0x1400162cb60?}, {0x107af31a0?, 0x14001616370?}, {0x0?, 0x0?})
	github.com/onflow/cadence@v1.8.3/sema/checker.go:2453 +0x3c
github.com/onflow/cadence/sema.(*Checker).visitVariableDeclarationValues(0x14000a4d450, 0x14001616370, 0x0)
	github.com/onflow/cadence@v1.8.3/sema/check_variable_declaration.go:57 +0x128
github.com/onflow/cadence/sema.(*Checker).VisitVariableDeclaration(0x14000a4d450, 0x14001616370)
	github.com/onflow/cadence@v1.8.3/sema/check_variable_declaration.go:27 +0x28
github.com/onflow/cadence/ast.AcceptStatement[...]({0x107b02dd0?, 0x14001616370}, {0x107b23060, 0x14000a4d450})
	github.com/onflow/cadence@v1.8.3/ast/visitor.go:151 +0x38c
github.com/onflow/cadence/sema.(*Checker).visitStatements(0x14000a4d450, {0x140001d0e00, 0x17, 0x104985cbc?})
	github.com/onflow/cadence@v1.8.3/sema/check_block.go:63 +0xdc
github.com/onflow/cadence/sema.(*Checker).visitFunctionBlock.func1()
	github.com/onflow/cadence@v1.8.3/sema/check_function.go:485 +0x2c
github.com/onflow/cadence/sema.(*Checker).visitWithPostConditions(0x14000a4d450, {0x107af32f0, 0x1400110e150}, 0x0, {0x107b257f8, 0x10966c280}, {0x107ae11d8, 0x0}, 0x14000044ca8?)
	github.com/onflow/cadence@v1.8.3/sema/check_function.go:379 +0x1a8
github.com/onflow/cadence/sema.(*Checker).visitFunctionBlock(0x14000a4d450, 0x1400110e150, {0x107b257f8, 0x10966c280}, {0x107ae11d8, 0x0}, 0x1)
	github.com/onflow/cadence@v1.8.3/sema/check_function.go:476 +0x134
github.com/onflow/cadence/sema.(*Checker).checkFunction.func1.2()
	github.com/onflow/cadence@v1.8.3/sema/check_function.go:213 +0x34
github.com/onflow/cadence/sema.(*Checker).InNewPurityScope(0x14000a4d450, 0xc0?, 0x1096dfb40?)
	github.com/onflow/cadence@v1.8.3/sema/checker.go:273 +0xe4
github.com/onflow/cadence/sema.(*Checker).checkFunction.func1(0x14000ab57c0)
	github.com/onflow/cadence@v1.8.3/sema/check_function.go:212 +0x198
github.com/onflow/cadence/sema.(*FunctionActivations).WithFunction(0x1400110e180, 0x14000ab1180, 0x2, 0x14000045080)
	github.com/onflow/cadence@v1.8.3/sema/function_activations.go:88 +0x144
github.com/onflow/cadence/sema.(*Checker).checkFunction(0x14000a4d450, 0x14000b9e360, 0x0, {0x1400163ef00?, 0x107b25f00?}, 0x14000ab1180, 0x1400110e150, 0x1, 0x0, 0x1)
	github.com/onflow/cadence@v1.8.3/sema/check_function.go:187 +0x18c
github.com/onflow/cadence/sema.(*Checker).visitFunctionDeclaration(0x14000a4d450, 0x14001590120, {0x0?, 0xa3?, 0x65?}, 0x0)
	github.com/onflow/cadence@v1.8.3/sema/check_function.go:128 +0x3a4
github.com/onflow/cadence/sema.(*Checker).VisitFunctionDeclaration(0x1400162b440?, 0x14001eab6e0?, 0x5?)
	github.com/onflow/cadence@v1.8.3/sema/check_function.go:35 +0x2c
github.com/onflow/cadence/ast.AcceptDeclaration[...]({0x107b118e0?, 0x14001590120}, {0x107b14e20, 0x14000a4d450})
	github.com/onflow/cadence@v1.8.3/ast/visitor.go:71 +0x80
github.com/onflow/cadence/sema.(*Checker).CheckProgram(0x14000a4d450, 0x14001512240)
	github.com/onflow/cadence@v1.8.3/sema/checker.go:462 +0x5dc
github.com/onflow/cadence/sema.(*Checker).Check.func1()
	github.com/onflow/cadence@v1.8.3/sema/checker.go:300 +0x50
github.com/onflow/cadence/sema.(*Checker).Check(0x14000a4d450)
	github.com/onflow/cadence@v1.8.3/sema/checker.go:305 +0xb8
github.com/onflow/flow-cli/internal/cadence.(*linter).lintFile(0x140010e4100, {0x16b481dd3, 0x2b})
	github.com/onflow/flow-cli/internal/cadence/linter.go:125 +0x29c
github.com/onflow/flow-cli/internal/cadence.lintFiles(0x1049cd2b0?, {0x14000efd008, 0x73, 0x10627d3ac?})
	github.com/onflow/flow-cli/internal/cadence/lint.go:100 +0xac
github.com/onflow/flow-cli/internal/cadence.lint({0x14000efd008?, 0x0?, 0x0?}, {{0x0, 0x0}, {0x1068988af, 0x4}, {0x0, 0x0}, {0x0, ...}, ...}, ...)
	github.com/onflow/flow-cli/internal/cadence/lint.go:80 +0x30
github.com/onflow/flow-cli/internal/command.Command.AddToParent.func1(0x14000ec5300?, {0x14000efd008, 0x73, 0x73})
	github.com/onflow/flow-cli/internal/command/command.go:147 +0x46c
github.com/spf13/cobra.(*Command).execute(0x109675e00, {0x1400018e838, 0x73, 0x7c})
	github.com/spf13/cobra@v1.10.1/command.go:1019 +0x7bc
github.com/spf13/cobra.(*Command).ExecuteC(0x1400043d508)
	github.com/spf13/cobra@v1.10.1/command.go:1148 +0x350
github.com/spf13/cobra.(*Command).Execute(...)
	github.com/spf13/cobra@v1.10.1/command.go:1071
main.main()
	github.com/onflow/flow-cli/cmd/flow/main.go:139 +0xd80

[] []
map[device:map[arch:arm64 num_cpu:14] os:map[name:darwin] runtime:map[go_maxprocs:14 go_numcgocalls:13 go_numroutines:11 name:go version:go1.25.4] trace:map[span_id:806f0874ba47bafc trace_id:f9d2b8acb58eb7f2b949999f29edd09a]]
goroutine 1 [running]:
runtime/debug.Stack()
	runtime/debug/stack.go:26 +0x64
github.com/onflow/flow-cli/internal/command.initCrashReporting.func1(0x140010a8588, 0x1400109ea20)
	github.com/onflow/flow-cli/internal/command/command.go:355 +0x1d8
github.com/getsentry/sentry-go.(*Client).processEvent(0x14000ee4200, 0x140010a8588?, 0x1400109ea20, {0x107ad0e20, 0x140002b6580})
	github.com/getsentry/sentry-go@v0.36.2/client.go:679 +0x21c
github.com/getsentry/sentry-go.(*Client).CaptureEvent(...)
	github.com/getsentry/sentry-go@v0.36.2/client.go:468
github.com/getsentry/sentry-go.(*Client).RecoverWithContext(0x14000ee4200, {0x0, 0x0}, {0x10785dce0?, 0x1400163f4a0?}, 0x1079365e0?, {0x107ad0e20, 0x140002b6580})
	github.com/getsentry/sentry-go@v0.36.2/client.go:519 +0x18c
github.com/getsentry/sentry-go.(*Client).Recover(0x14000043ef8?, {0x10785dce0?, 0x1400163f4a0?}, 0x1049bed18?, {0x107ad0e20?, 0x140002b6580?})
	github.com/getsentry/sentry-go@v0.36.2/client.go:483 +0x80
github.com/getsentry/sentry-go.(*Hub).Recover(0x1400075a630, {0x10785dce0?, 0x1400163f4a0?})
	github.com/getsentry/sentry-go@v0.36.2/hub.go:322 +0xc0
github.com/getsentry/sentry-go.Recover()
	github.com/getsentry/sentry-go@v0.36.2/sentry.go:68 +0x40
panic({0x10785dce0?, 0x1400163f4a0?})
	runtime/panic.go:783 +0x120
github.com/onflow/cadence/sema.(*Checker).checkErrorsForInvalidExpressionTypes(0x140000440d8?, {0x107b25f00?, 0x14000974b40?}, {0x0, 0x0})
	github.com/onflow/cadence@v1.8.3/sema/checker.go:2611 +0xe0
github.com/onflow/cadence/sema.(*Checker).visitExpressionWithForceType(0x14000a4d450, {0x107b0bd20, 0x14001614a80}, {0x107af3210?, 0x1400162cb60?}, {0x0, 0x0}, 0x1)
	github.com/onflow/cadence@v1.8.3/sema/checker.go:2565 +0xec
github.com/onflow/cadence/sema.(*Checker).visitExpression(...)
	github.com/onflow/cadence@v1.8.3/sema/checker.go:2458
github.com/onflow/cadence/sema.(*Checker).VisitExpression(0xf?, {0x107b0bd20?, 0x14001614a80?}, {0x107af3210?, 0x1400162cb60?}, {0x0?, 0x0?})
	github.com/onflow/cadence@v1.8.3/sema/checker.go:2453 +0x3c
github.com/onflow/cadence/sema.(*Checker).checkInvocationExpression(0x14000a4d450, 0x1400162cb60)
	github.com/onflow/cadence@v1.8.3/sema/check_invocation_expression.go:93 +0xb8
github.com/onflow/cadence/sema.(*Checker).VisitInvocationExpression(0x14000a4d450, 0x1400162cb60)
	github.com/onflow/cadence@v1.8.3/sema/check_invocation_expression.go:27 +0x24
github.com/onflow/cadence/ast.AcceptExpression[...]({0x107b0bcc0?, 0x1400162cb60}, {0x107b27f80, 0x14000a4d450})
	github.com/onflow/cadence@v1.8.3/ast/visitor.go:245 +0x21c
github.com/onflow/cadence/sema.(*Checker).visitExpressionWithForceType(0x14000a4d450, {0x107b0bcc0, 0x1400162cb60}, {0x107af31a0?, 0x14001616370?}, {0x0, 0x0}, 0x1)
	github.com/onflow/cadence@v1.8.3/sema/checker.go:2563 +0xd0
github.com/onflow/cadence/sema.(*Checker).visitExpression(...)
	github.com/onflow/cadence@v1.8.3/sema/checker.go:2458
github.com/onflow/cadence/sema.(*Checker).VisitExpression(0x14001659dc8?, {0x107b0bcc0?, 0x1400162cb60?}, {0x107af31a0?, 0x14001616370?}, {0x0?, 0x0?})
	github.com/onflow/cadence@v1.8.3/sema/checker.go:2453 +0x3c
github.com/onflow/cadence/sema.(*Checker).visitVariableDeclarationValues(0x14000a4d450, 0x14001616370, 0x0)
	github.com/onflow/cadence@v1.8.3/sema/check_variable_declaration.go:57 +0x128
github.com/onflow/cadence/sema.(*Checker).VisitVariableDeclaration(0x14000a4d450, 0x14001616370)
	github.com/onflow/cadence@v1.8.3/sema/check_variable_declaration.go:27 +0x28
github.com/onflow/cadence/ast.AcceptStatement[...]({0x107b02dd0?, 0x14001616370}, {0x107b23060, 0x14000a4d450})
	github.com/onflow/cadence@v1.8.3/ast/visitor.go:151 +0x38c
github.com/onflow/cadence/sema.(*Checker).visitStatements(0x14000a4d450, {0x140001d0e00, 0x17, 0x104985cbc?})
	github.com/onflow/cadence@v1.8.3/sema/check_block.go:63 +0xdc
github.com/onflow/cadence/sema.(*Checker).visitFunctionBlock.func1()
	github.com/onflow/cadence@v1.8.3/sema/check_function.go:485 +0x2c
github.com/onflow/cadence/sema.(*Checker).visitWithPostConditions(0x14000a4d450, {0x107af32f0, 0x1400110e150}, 0x0, {0x107b257f8, 0x10966c280}, {0x107ae11d8, 0x0}, 0x14000044ca8?)
	github.com/onflow/cadence@v1.8.3/sema/check_function.go:379 +0x1a8
github.com/onflow/cadence/sema.(*Checker).visitFunctionBlock(0x14000a4d450, 0x1400110e150, {0x107b257f8, 0x10966c280}, {0x107ae11d8, 0x0}, 0x1)
	github.com/onflow/cadence@v1.8.3/sema/check_function.go:476 +0x134
github.com/onflow/cadence/sema.(*Checker).checkFunction.func1.2()
	github.com/onflow/cadence@v1.8.3/sema/check_function.go:213 +0x34
github.com/onflow/cadence/sema.(*Checker).InNewPurityScope(0x14000a4d450, 0xc0?, 0x1096dfb40?)
	github.com/onflow/cadence@v1.8.3/sema/checker.go:273 +0xe4
github.com/onflow/cadence/sema.(*Checker).checkFunction.func1(0x14000ab57c0)
	github.com/onflow/cadence@v1.8.3/sema/check_function.go:212 +0x198
github.com/onflow/cadence/sema.(*FunctionActivations).WithFunction(0x1400110e180, 0x14000ab1180, 0x2, 0x14000045080)
	github.com/onflow/cadence@v1.8.3/sema/function_activations.go:88 +0x144
github.com/onflow/cadence/sema.(*Checker).checkFunction(0x14000a4d450, 0x14000b9e360, 0x0, {0x1400163ef00?, 0x107b25f00?}, 0x14000ab1180, 0x1400110e150, 0x1, 0x0, 0x1)
	github.com/onflow/cadence@v1.8.3/sema/check_function.go:187 +0x18c
github.com/onflow/cadence/sema.(*Checker).visitFunctionDeclaration(0x14000a4d450, 0x14001590120, {0x0?, 0xa3?, 0x65?}, 0x0)
	github.com/onflow/cadence@v1.8.3/sema/check_function.go:128 +0x3a4
github.com/onflow/cadence/sema.(*Checker).VisitFunctionDeclaration(0x1400162b440?, 0x14001eab6e0?, 0x5?)
	github.com/onflow/cadence@v1.8.3/sema/check_function.go:35 +0x2c
github.com/onflow/cadence/ast.AcceptDeclaration[...]({0x107b118e0?, 0x14001590120}, {0x107b14e20, 0x14000a4d450})
	github.com/onflow/cadence@v1.8.3/ast/visitor.go:71 +0x80
github.com/onflow/cadence/sema.(*Checker).CheckProgram(0x14000a4d450, 0x14001512240)
	github.com/onflow/cadence@v1.8.3/sema/checker.go:462 +0x5dc
github.com/onflow/cadence/sema.(*Checker).Check.func1()
	github.com/onflow/cadence@v1.8.3/sema/checker.go:300 +0x50
github.com/onflow/cadence/sema.(*Checker).Check(0x14000a4d450)
	github.com/onflow/cadence@v1.8.3/sema/checker.go:305 +0xb8
github.com/onflow/flow-cli/internal/cadence.(*linter).lintFile(0x140010e4100, {0x16b481dd3, 0x2b})
	github.com/onflow/flow-cli/internal/cadence/linter.go:125 +0x29c
github.com/onflow/flow-cli/internal/cadence.lintFiles(0x1049cd2b0?, {0x14000efd008, 0x73, 0x10627d3ac?})
	github.com/onflow/flow-cli/internal/cadence/lint.go:100 +0xac
github.com/onflow/flow-cli/internal/cadence.lint({0x14000efd008?, 0x0?, 0x0?}, {{0x0, 0x0}, {0x1068988af, 0x4}, {0x0, 0x0}, {0x0, ...}, ...}, ...)
	github.com/onflow/flow-cli/internal/cadence/lint.go:80 +0x30
github.com/onflow/flow-cli/internal/command.Command.AddToParent.func1(0x14000ec5300?, {0x14000efd008, 0x73, 0x73})
	github.com/onflow/flow-cli/internal/command/command.go:147 +0x46c
github.com/spf13/cobra.(*Command).execute(0x109675e00, {0x1400018e838, 0x73, 0x7c})
	github.com/spf13/cobra@v1.10.1/command.go:1019 +0x7bc
github.com/spf13/cobra.(*Command).ExecuteC(0x1400043d508)
	github.com/spf13/cobra@v1.10.1/command.go:1148 +0x350
github.com/spf13/cobra.(*Command).Execute(...)
	github.com/spf13/cobra@v1.10.1/command.go:1071
main.main()
	github.com/onflow/flow-cli/cmd/flow/main.go:139 +0xd80


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

2 participants