Merge "Shorten the -checks flag in clang-tidy rules" am: 7fd85c45f8 am: 6f807b422e

Original change: https://android-review.googlesource.com/c/platform/build/soong/+/2116278

Change-Id: I8e87c5fa1dee29dba6e999cd55ac40e79c7ea959
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Chih-hung Hsieh 2022-06-07 21:56:10 +00:00 committed by Automerger Merge Worker
commit cdcb038d47
2 changed files with 89 additions and 2 deletions

View file

@ -144,8 +144,23 @@ func (tidy *tidyFeature) flags(ctx ModuleContext, flags Flags) Flags {
tidyChecks += config.TidyChecksForDir(ctx.ModuleDir())
}
if len(tidy.Properties.Tidy_checks) > 0 {
tidyChecks = tidyChecks + "," + strings.Join(esc(ctx, "tidy_checks",
config.ClangRewriteTidyChecks(tidy.Properties.Tidy_checks)), ",")
// If Tidy_checks contains "-*", ignore all checks before "-*".
localChecks := tidy.Properties.Tidy_checks
ignoreGlobalChecks := false
for n, check := range tidy.Properties.Tidy_checks {
if check == "-*" {
ignoreGlobalChecks = true
localChecks = tidy.Properties.Tidy_checks[n:]
}
}
if ignoreGlobalChecks {
tidyChecks = "-checks=" + strings.Join(esc(ctx, "tidy_checks",
config.ClangRewriteTidyChecks(localChecks)), ",")
} else {
tidyChecks = tidyChecks + "," + strings.Join(esc(ctx, "tidy_checks",
config.ClangRewriteTidyChecks(localChecks)), ",")
}
}
if ctx.Windows() {
// https://b.corp.google.com/issues/120614316

View file

@ -16,11 +16,83 @@ package cc
import (
"fmt"
"strings"
"testing"
"android/soong/android"
)
func TestTidyChecks(t *testing.T) {
// The "tidy_checks" property defines additional checks appended
// to global default. But there are some checks disabled after
// the local tidy_checks.
bp := `
cc_library_shared { // has global checks + extraGlobalChecks
name: "libfoo_1",
srcs: ["foo.c"],
}
cc_library_shared { // has only local checks + extraGlobalChecks
name: "libfoo_2",
srcs: ["foo.c"],
tidy_checks: ["-*", "xyz-*"],
}
cc_library_shared { // has global checks + local checks + extraGlobalChecks
name: "libfoo_3",
srcs: ["foo.c"],
tidy_checks: ["-abc*", "xyz-*", "mycheck"],
}
cc_library_shared { // has only local checks after "-*" + extraGlobalChecks
name: "libfoo_4",
srcs: ["foo.c"],
tidy_checks: ["-abc*", "xyz-*", "mycheck", "-*", "xyz-*"],
}`
ctx := testCc(t, bp)
globalChecks := "-checks=${config.TidyDefaultGlobalChecks},"
firstXyzChecks := "-checks='-*','xyz-*',"
localXyzChecks := "'-*','xyz-*'"
localAbcChecks := "'-abc*','xyz-*',mycheck"
extraGlobalChecks := ",-bugprone-easily-swappable-parameters,"
testCases := []struct {
libNumber int // 1,2,3,...
checks []string // must have substrings in -checks
noChecks []string // must not have substrings in -checks
}{
{1, []string{globalChecks, extraGlobalChecks}, []string{localXyzChecks, localAbcChecks}},
{2, []string{firstXyzChecks, extraGlobalChecks}, []string{globalChecks, localAbcChecks}},
{3, []string{globalChecks, localAbcChecks, extraGlobalChecks}, []string{localXyzChecks}},
{4, []string{firstXyzChecks, extraGlobalChecks}, []string{globalChecks, localAbcChecks}},
}
t.Run("caseTidyChecks", func(t *testing.T) {
variant := "android_arm64_armv8-a_shared"
for _, test := range testCases {
libName := fmt.Sprintf("libfoo_%d", test.libNumber)
flags := ctx.ModuleForTests(libName, variant).Rule("clangTidy").Args["tidyFlags"]
splitFlags := strings.Split(flags, " ")
foundCheckFlag := false
for _, flag := range splitFlags {
if strings.HasPrefix(flag, "-checks=") {
foundCheckFlag = true
for _, check := range test.checks {
if !strings.Contains(flag, check) {
t.Errorf("tidyFlags for %s does not contain %s.", libName, check)
}
}
for _, check := range test.noChecks {
if strings.Contains(flag, check) {
t.Errorf("tidyFlags for %s should not contain %s.", libName, check)
}
}
break
}
}
if !foundCheckFlag {
t.Errorf("tidyFlags for %s does not contain -checks=.", libName)
}
}
})
}
func TestWithTidy(t *testing.T) {
// When WITH_TIDY=1 or (ALLOW_LOCAL_TIDY_TRUE=1 and local tidy:true)
// a C++ library should depend on .tidy files.