Bug 1436263 - Part 5: Add a mach lint for virtual function declarations with multiple specifiers. r=froydnj r?ahal
Virtual function declarations should specify only one of `virtual`, `final`, or `override`, as per the Mozilla C++ style guide:
https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Coding_Style
This lint warns about:
virtual void Bad1() final
void Bad2() final override
void Bad3() override final
Caveats: This lint doesn't warn about `virtual void NotBad() override` at this time because there are 8000+ instances. It also doesn't warn about function declarations that span multiple lines because the regex can't match across line breaks.
MozReview-Commit-ID: LcBsOAKKgz7
--- a/taskcluster/ci/source-test/mozlint.yml
+++ b/taskcluster/ci/source-test/mozlint.yml
@@ -33,16 +33,29 @@ codespell:
- '**/*.cpp'
- '**/*.c'
- '**/*.h'
- '**/*.configure'
- '**/*.py'
- '**/*.properties'
- '**/*.rst'
+cpp-virtual-final:
+ description: lint C++ virtual function declarations
+ platform: lint/opt
+ treeherder:
+ symbol: Cvf
+ run:
+ mach: lint -l cpp-virtual-final -f treeherder
+ when:
+ files-changed:
+ - '**/*.cpp'
+ - '**/*.h'
+ - '**/*.mm'
+
eslint:
description: JS lint check
platform: lint/opt
treeherder:
symbol: ES
run:
using: run-task
command: >
new file mode 100644
--- /dev/null
+++ b/tools/lint/cpp-virtual-final.yml
@@ -0,0 +1,31 @@
+---
+cpp-virtual-final:
+ description: "Virtual function declarations should specify only one of
+ `virtual`, `final`, or `override`"
+ level: warning
+ include: ['.']
+ exclude:
+ # Third-party code with cpp-virtual-final warnings:
+ - gfx/angle
+ - gfx/skia
+ - media/webrtc/trunk
+ - security/sandbox/chromium
+ extensions: ['cpp', 'h', 'mm']
+ type: regex
+ #
+ # This lint warns about:
+ #
+ # virtual void Bad1() final
+ # void Bad2() final override
+ # void Bad3() override final
+ #
+ # Caveats: This lint ...
+ #
+ # * Doesn't warn about `virtual void NotBad() override` at this time
+ # because there are 8000+ instances.
+ #
+ # * Doesn't warn about function declarations that span multiple lines
+ # because the regex can't match across line breaks.
+ #
+ # virtual ) final | final override | override final
+ payload: ^ *virtual .+\).+\bfinal\b|\bfinal +override\b|\boverride +final\b