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

Add no_main lint #2001

Merged
merged 11 commits into from
Nov 28, 2023
Merged

Add no_main lint #2001

merged 11 commits into from
Nov 28, 2023

Conversation

jubnzv
Copy link
Collaborator

@jubnzv jubnzv commented Nov 20, 2023

Summary

Closes #1976

  • [n] y/n | Does it introduce breaking changes?
  • [y] y/n | Is it dependent on the specific version of cargo-contract or pallet-contracts?

Description

That PR adds the no_main lint.
The implementation of the lint is straightforward, and it could be merged as it is.

However, its purpose is to enhance the cargo-contract compilation pipeline and it should run with every build command. Therefore, cargo-contract needs to be patched to execute dylint-based lints, including no_main, on each execution of cargo contract build.

Checklist before requesting a review

  • My code follows the style guidelines of this project
  • I have added an entry to CHANGELOG.md
  • I have commented my code, particularly in hard-to-understand areas
  • I have added tests that prove my fix is effective or that my feature works
  • Any dependent changes have been merged and published in downstream modules

Otherwise contracts could be built for e2e tests with the `std` feature.
All the tests are built locally for the host architecture, therefore the
lint is not applied to them.
linting/src/no_main.rs Outdated Show resolved Hide resolved
linting/src/no_main.rs Outdated Show resolved Hide resolved
linting/src/no_main.rs Outdated Show resolved Hide resolved
@codecov-commenter
Copy link

codecov-commenter commented Nov 20, 2023

Codecov Report

All modified and coverable lines are covered by tests ✅

Comparison is base (f7e831d) 53.30% compared to head (3e17b24) 53.27%.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #2001      +/-   ##
==========================================
- Coverage   53.30%   53.27%   -0.03%     
==========================================
  Files         220      220              
  Lines        6845     6845              
  Branches        0     3037    +3037     
==========================================
- Hits         3649     3647       -2     
- Misses       3196     3198       +2     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Copy link

github-actions bot commented Nov 20, 2023

🦑 📈 ink! Example Contracts ‒ Changes Report 📉 🦑

These are the results when building the integration-tests/* contracts from this branch with cargo-contract and comparing them to ink! master:

Contract Upstream Size (kB) PR Size (kB) Diff (kB) Diff (%) Change
basic-contract-caller 2.967 2.967 0 0
basic-contract-caller/other-contract 1.337 1.337 0 0
call-builder-return-value 8.735 8.735 0 0
call-runtime 1.769 1.769 0 0
conditional-compilation 1.209 1.209 0 0
contract-storage 7.171 7.171 0 0
contract-terminate 1.092 1.092 0 0
contract-transfer 1.444 1.444 0 0
custom-allocator 7.428 7.428 0 0
dns 7.249 7.249 0 0
e2e-call-runtime 1.058 1.058 0 0
e2e-runtime-only-backend 1.635 1.635 0 0
erc1155 13.962 13.968 0.006 0.0429738 📈
erc20 6.687 6.687 0 0
erc721 9.64 9.64 0 0
events 4.763 4.763 0 0
flipper 1.393 1.393 0 0
incrementer 1.221 1.221 0 0
lang-err-integration-tests/call-builder-delegate 2.317 2.317 0 0
lang-err-integration-tests/call-builder 4.847 4.847 0 0
lang-err-integration-tests/constructors-return-value 1.773 1.773 0 0
lang-err-integration-tests/contract-ref 4.328 4.328 0 0
lang-err-integration-tests/integration-flipper 1.571 1.571 0 0
mapping-integration-tests 7.685 7.685 0 0
mother 9.508 9.508 0 0
multi-contract-caller 5.924 5.924 0 0
multi-contract-caller/accumulator 1.095 1.095 0 0
multi-contract-caller/adder 1.669 1.669 0 0
multi-contract-caller/subber 1.689 1.689 0 0
multisig 21.471 21.471 0 0
payment-channel 5.501 5.501 0 0
sr25519-verification 0.865 0.865 0 0
static-buffer 1.405 1.405 0 0
trait-dyn-cross-contract-calls 2.466 2.466 0 0
trait-dyn-cross-contract-calls/contracts/incrementer 1.305 1.305 0 0
trait-erc20 7.063 7.063 0 0
trait-flipper 1.209 1.209 0 0
trait-incrementer 1.37 1.37 0 0
upgradeable-contracts/delegator 2.908 2.908 0 0
upgradeable-contracts/delegator/delegatee 1.369 1.369 0 0
upgradeable-contracts/set-code-hash 1.464 1.464 0 0
upgradeable-contracts/set-code-hash/updated-incrementer 1.443 1.443 0 0
wildcard-selector 2.622 2.622 0 0

Link to the run | Last update: Tue Nov 28 13:24:01 CET 2023

Copy link
Collaborator

@ascjones ascjones left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Next step then is to see if we can use this by default in cargo-contract and remove all the hacky code there.

@ascjones
Copy link
Collaborator

@jubnzv please resolve the conflict and we can merge this

@jubnzv
Copy link
Collaborator Author

jubnzv commented Nov 28, 2023

@ascjones Thanks! I'd like to suggest a small fix here first.

impl EarlyLintPass for NoMain {
fn check_crate(&mut self, cx: &EarlyContext<'_>, krate: &Crate) {
// Disable when building for e2e tests
if !is_contract_build(cx) {
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we execute this lint on all the builds, even for e2e tests, making no_main mandatory for every ink! contract?

The point is that cargo-contract always runs linter for the host architecture. It is possible to hack it a bit, but should we? Why should we skip this lint for tests?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

E2E tests will still run the linter because they compile the contract code blob.

Maybe what we really mean/want is that when building the contract "natively" i.e. not no_std, which happens for unit tests and metadata generation. But those are usually executed on a different path so maybe we don't need to make the distinction here.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I see. Let's try to introduce this lint for all contracts. I think it won't make any problems.

@jubnzv jubnzv merged commit 47c66dc into use-ink:master Nov 28, 2023
22 checks passed
@SkymanOne SkymanOne mentioned this pull request Nov 30, 2023
@SkymanOne SkymanOne mentioned this pull request Mar 4, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add a lint for missing no_main
3 participants