xref: /aosp_15_r20/build/soong/cc/config/tidy.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2016 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage config
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
19*333d2b36SAndroid Build Coastguard Worker	"strings"
20*333d2b36SAndroid Build Coastguard Worker)
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Workervar (
23*333d2b36SAndroid Build Coastguard Worker	// Some clang-tidy checks have bugs or don't work for Android.
24*333d2b36SAndroid Build Coastguard Worker	// They are disabled here, overriding any locally selected checks.
25*333d2b36SAndroid Build Coastguard Worker	globalNoCheckList = []string{
26*333d2b36SAndroid Build Coastguard Worker		// https://b.corp.google.com/issues/153464409
27*333d2b36SAndroid Build Coastguard Worker		// many local projects enable cert-* checks, which
28*333d2b36SAndroid Build Coastguard Worker		// trigger bugprone-reserved-identifier.
29*333d2b36SAndroid Build Coastguard Worker		"-bugprone-reserved-identifier*,-cert-dcl51-cpp,-cert-dcl37-c",
30*333d2b36SAndroid Build Coastguard Worker		// http://b/153757728
31*333d2b36SAndroid Build Coastguard Worker		"-readability-qualified-auto",
32*333d2b36SAndroid Build Coastguard Worker		// http://b/193716442
33*333d2b36SAndroid Build Coastguard Worker		"-bugprone-implicit-widening-of-multiplication-result",
34*333d2b36SAndroid Build Coastguard Worker		// Too many existing functions trigger this rule, and fixing it requires large code
35*333d2b36SAndroid Build Coastguard Worker		// refactoring. The cost of maintaining this tidy rule outweighs the benefit it brings.
36*333d2b36SAndroid Build Coastguard Worker		"-bugprone-easily-swappable-parameters",
37*333d2b36SAndroid Build Coastguard Worker		// http://b/216364337 - TODO: Follow-up after compiler update to
38*333d2b36SAndroid Build Coastguard Worker		// disable or fix individual instances.
39*333d2b36SAndroid Build Coastguard Worker		"-cert-err33-c",
40*333d2b36SAndroid Build Coastguard Worker		// http://b/241125373
41*333d2b36SAndroid Build Coastguard Worker		"-bugprone-unchecked-optional-access",
42*333d2b36SAndroid Build Coastguard Worker		// http://b/265438407
43*333d2b36SAndroid Build Coastguard Worker		"-misc-use-anonymous-namespace",
44*333d2b36SAndroid Build Coastguard Worker		// http://b/285005947
45*333d2b36SAndroid Build Coastguard Worker		"-performance-avoid-endl",
46*333d2b36SAndroid Build Coastguard Worker	}
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Worker	// Some clang-tidy checks are included in some tidy_checks_as_errors lists,
49*333d2b36SAndroid Build Coastguard Worker	// but not all warnings are fixed/suppressed yet. These checks are not
50*333d2b36SAndroid Build Coastguard Worker	// disabled in the TidyGlobalNoChecks list, so we can see them and fix/suppress them.
51*333d2b36SAndroid Build Coastguard Worker	globalNoErrorCheckList = []string{
52*333d2b36SAndroid Build Coastguard Worker		// http://b/241997913
53*333d2b36SAndroid Build Coastguard Worker		"-bugprone-assignment-in-if-condition",
54*333d2b36SAndroid Build Coastguard Worker		// http://b/155034972
55*333d2b36SAndroid Build Coastguard Worker		"-bugprone-branch-clone",
56*333d2b36SAndroid Build Coastguard Worker		// http://b/155034563
57*333d2b36SAndroid Build Coastguard Worker		"-bugprone-signed-char-misuse",
58*333d2b36SAndroid Build Coastguard Worker		// http://b/241819232
59*333d2b36SAndroid Build Coastguard Worker		"-misc-const-correctness",
60*333d2b36SAndroid Build Coastguard Worker		// http://b/285356805
61*333d2b36SAndroid Build Coastguard Worker		"-bugprone-unsafe-functions",
62*333d2b36SAndroid Build Coastguard Worker		"-cert-msc24-c",
63*333d2b36SAndroid Build Coastguard Worker		"-cert-msc33-c",
64*333d2b36SAndroid Build Coastguard Worker		// http://b/285356799
65*333d2b36SAndroid Build Coastguard Worker		"-modernize-type-traits",
66*333d2b36SAndroid Build Coastguard Worker		// http://b/285361108
67*333d2b36SAndroid Build Coastguard Worker		"-readability-avoid-unconditional-preprocessor-if",
68*333d2b36SAndroid Build Coastguard Worker	}
69*333d2b36SAndroid Build Coastguard Worker
70*333d2b36SAndroid Build Coastguard Worker	extraArgFlags = []string{
71*333d2b36SAndroid Build Coastguard Worker		// We might be using the static analyzer through clang tidy.
72*333d2b36SAndroid Build Coastguard Worker		// https://bugs.llvm.org/show_bug.cgi?id=32914
73*333d2b36SAndroid Build Coastguard Worker		"-D__clang_analyzer__",
74*333d2b36SAndroid Build Coastguard Worker
75*333d2b36SAndroid Build Coastguard Worker		// A recent change in clang-tidy (r328258) enabled destructor inlining, which
76*333d2b36SAndroid Build Coastguard Worker		// appears to cause a number of false positives. Until that's resolved, this turns
77*333d2b36SAndroid Build Coastguard Worker		// off the effects of r328258.
78*333d2b36SAndroid Build Coastguard Worker		// https://bugs.llvm.org/show_bug.cgi?id=37459
79*333d2b36SAndroid Build Coastguard Worker		"-Xclang",
80*333d2b36SAndroid Build Coastguard Worker		"-analyzer-config",
81*333d2b36SAndroid Build Coastguard Worker		"-Xclang",
82*333d2b36SAndroid Build Coastguard Worker		"c++-temp-dtor-inlining=false",
83*333d2b36SAndroid Build Coastguard Worker	}
84*333d2b36SAndroid Build Coastguard Worker)
85*333d2b36SAndroid Build Coastguard Worker
86*333d2b36SAndroid Build Coastguard Workerfunc init() {
87*333d2b36SAndroid Build Coastguard Worker	// The global default tidy checks should include clang-tidy
88*333d2b36SAndroid Build Coastguard Worker	// default checks and tested groups, but exclude known noisy checks.
89*333d2b36SAndroid Build Coastguard Worker	// See https://clang.llvm.org/extra/clang-tidy/checks/list.html
90*333d2b36SAndroid Build Coastguard Worker	pctx.VariableConfigMethod("TidyDefaultGlobalChecks", func(config android.Config) string {
91*333d2b36SAndroid Build Coastguard Worker		if override := config.Getenv("DEFAULT_GLOBAL_TIDY_CHECKS"); override != "" {
92*333d2b36SAndroid Build Coastguard Worker			return override
93*333d2b36SAndroid Build Coastguard Worker		}
94*333d2b36SAndroid Build Coastguard Worker		checks := strings.Join([]string{
95*333d2b36SAndroid Build Coastguard Worker			"android-*",
96*333d2b36SAndroid Build Coastguard Worker			"bugprone-*",
97*333d2b36SAndroid Build Coastguard Worker			"cert-*",
98*333d2b36SAndroid Build Coastguard Worker			"clang-diagnostic-unused-command-line-argument",
99*333d2b36SAndroid Build Coastguard Worker			// Select only google-* checks that do not have thousands of warnings.
100*333d2b36SAndroid Build Coastguard Worker			// Add more such checks when we clean up source code.
101*333d2b36SAndroid Build Coastguard Worker			// "google-build-using-namespace",
102*333d2b36SAndroid Build Coastguard Worker			// "google-default-arguments",
103*333d2b36SAndroid Build Coastguard Worker			// "google-explicit-constructor",
104*333d2b36SAndroid Build Coastguard Worker			// "google-global-names-in-headers",
105*333d2b36SAndroid Build Coastguard Worker			// "google-runtime-int",
106*333d2b36SAndroid Build Coastguard Worker			"google-build-explicit-make-pair",
107*333d2b36SAndroid Build Coastguard Worker			"google-build-namespaces",
108*333d2b36SAndroid Build Coastguard Worker			"google-runtime-operator",
109*333d2b36SAndroid Build Coastguard Worker			"google-upgrade-*",
110*333d2b36SAndroid Build Coastguard Worker			"misc-*",
111*333d2b36SAndroid Build Coastguard Worker			"performance-*",
112*333d2b36SAndroid Build Coastguard Worker			"portability-*",
113*333d2b36SAndroid Build Coastguard Worker			"-bugprone-assignment-in-if-condition",
114*333d2b36SAndroid Build Coastguard Worker			"-bugprone-easily-swappable-parameters",
115*333d2b36SAndroid Build Coastguard Worker			"-bugprone-narrowing-conversions",
116*333d2b36SAndroid Build Coastguard Worker			"-misc-const-correctness",
117*333d2b36SAndroid Build Coastguard Worker			"-misc-no-recursion",
118*333d2b36SAndroid Build Coastguard Worker			"-misc-non-private-member-variables-in-classes",
119*333d2b36SAndroid Build Coastguard Worker			"-misc-unused-parameters",
120*333d2b36SAndroid Build Coastguard Worker			"-performance-no-int-to-ptr",
121*333d2b36SAndroid Build Coastguard Worker			// the following groups are not in clang-tidy default checks.
122*333d2b36SAndroid Build Coastguard Worker			// -altera-*
123*333d2b36SAndroid Build Coastguard Worker			// -cppcoreguidelines-*
124*333d2b36SAndroid Build Coastguard Worker			// -darwin-*
125*333d2b36SAndroid Build Coastguard Worker			// -fuchsia-*
126*333d2b36SAndroid Build Coastguard Worker			// -hicpp-*
127*333d2b36SAndroid Build Coastguard Worker			// -llvm-*
128*333d2b36SAndroid Build Coastguard Worker			// -llvmlibc-*
129*333d2b36SAndroid Build Coastguard Worker			// -modernize-*
130*333d2b36SAndroid Build Coastguard Worker			// -mpi-*
131*333d2b36SAndroid Build Coastguard Worker			// -objc-*
132*333d2b36SAndroid Build Coastguard Worker			// -readability-*
133*333d2b36SAndroid Build Coastguard Worker			// -zircon-*
134*333d2b36SAndroid Build Coastguard Worker		}, ",")
135*333d2b36SAndroid Build Coastguard Worker		// clang-analyzer-* checks are slow for large files, but we have TIDY_TIMEOUT to
136*333d2b36SAndroid Build Coastguard Worker		// limit clang-tidy runtime. We allow clang-tidy default clang-analyzer-* checks,
137*333d2b36SAndroid Build Coastguard Worker		// and add it explicitly when CLANG_ANALYZER_CHECKS is set.
138*333d2b36SAndroid Build Coastguard Worker		// The insecureAPI.DeprecatedOrUnsafeBufferHandling warning does not apply to Android.
139*333d2b36SAndroid Build Coastguard Worker		if config.IsEnvTrue("CLANG_ANALYZER_CHECKS") {
140*333d2b36SAndroid Build Coastguard Worker			checks += ",clang-analyzer-*,-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling"
141*333d2b36SAndroid Build Coastguard Worker		} else {
142*333d2b36SAndroid Build Coastguard Worker			checks += ",-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling"
143*333d2b36SAndroid Build Coastguard Worker		}
144*333d2b36SAndroid Build Coastguard Worker		return checks
145*333d2b36SAndroid Build Coastguard Worker	})
146*333d2b36SAndroid Build Coastguard Worker
147*333d2b36SAndroid Build Coastguard Worker	// The external and vendor projects do not run clang-tidy unless TIDY_EXTERNAL_VENDOR is set.
148*333d2b36SAndroid Build Coastguard Worker	// We do not add "-*" to the check list to avoid suppressing the check list in .clang-tidy config files.
149*333d2b36SAndroid Build Coastguard Worker	// There are too many clang-tidy warnings in external and vendor projects, so we only
150*333d2b36SAndroid Build Coastguard Worker	// enable some google checks for these projects. Users can add more checks locally with the
151*333d2b36SAndroid Build Coastguard Worker	// "tidy_checks" list in .bp files, or the "Checks" list in .clang-tidy config files.
152*333d2b36SAndroid Build Coastguard Worker	pctx.VariableConfigMethod("TidyExternalVendorChecks", func(config android.Config) string {
153*333d2b36SAndroid Build Coastguard Worker		if override := config.Getenv("DEFAULT_EXTERNAL_VENDOR_TIDY_CHECKS"); override != "" {
154*333d2b36SAndroid Build Coastguard Worker			return override
155*333d2b36SAndroid Build Coastguard Worker		}
156*333d2b36SAndroid Build Coastguard Worker		return strings.Join([]string{
157*333d2b36SAndroid Build Coastguard Worker			"clang-diagnostic-unused-command-line-argument",
158*333d2b36SAndroid Build Coastguard Worker			"google-build-explicit-make-pair",
159*333d2b36SAndroid Build Coastguard Worker			"google-build-namespaces",
160*333d2b36SAndroid Build Coastguard Worker			"google-runtime-operator",
161*333d2b36SAndroid Build Coastguard Worker			"google-upgrade-*",
162*333d2b36SAndroid Build Coastguard Worker			"-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling",
163*333d2b36SAndroid Build Coastguard Worker		}, ",")
164*333d2b36SAndroid Build Coastguard Worker	})
165*333d2b36SAndroid Build Coastguard Worker
166*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("TidyGlobalNoChecks", strings.Join(globalNoCheckList, ","))
167*333d2b36SAndroid Build Coastguard Worker
168*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("TidyGlobalNoErrorChecks", strings.Join(globalNoErrorCheckList, ","))
169*333d2b36SAndroid Build Coastguard Worker
170*333d2b36SAndroid Build Coastguard Worker	pctx.StaticVariable("TidyExtraArgFlags", strings.Join(extraArgFlags, " "))
171*333d2b36SAndroid Build Coastguard Worker
172*333d2b36SAndroid Build Coastguard Worker	// To reduce duplicate warnings from the same header files,
173*333d2b36SAndroid Build Coastguard Worker	// header-filter will contain only the module directory and
174*333d2b36SAndroid Build Coastguard Worker	// those specified by DEFAULT_TIDY_HEADER_DIRS.
175*333d2b36SAndroid Build Coastguard Worker	pctx.VariableConfigMethod("TidyDefaultHeaderDirs", func(config android.Config) string {
176*333d2b36SAndroid Build Coastguard Worker		return config.Getenv("DEFAULT_TIDY_HEADER_DIRS")
177*333d2b36SAndroid Build Coastguard Worker	})
178*333d2b36SAndroid Build Coastguard Worker
179*333d2b36SAndroid Build Coastguard Worker	// Use WTIH_TIDY_FLAGS to pass extra global default clang-tidy flags.
180*333d2b36SAndroid Build Coastguard Worker	pctx.VariableConfigMethod("TidyWithTidyFlags", func(config android.Config) string {
181*333d2b36SAndroid Build Coastguard Worker		return config.Getenv("WITH_TIDY_FLAGS")
182*333d2b36SAndroid Build Coastguard Worker	})
183*333d2b36SAndroid Build Coastguard Worker}
184*333d2b36SAndroid Build Coastguard Worker
185*333d2b36SAndroid Build Coastguard Workertype PathBasedTidyCheck struct {
186*333d2b36SAndroid Build Coastguard Worker	PathPrefix string
187*333d2b36SAndroid Build Coastguard Worker	Checks     string
188*333d2b36SAndroid Build Coastguard Worker}
189*333d2b36SAndroid Build Coastguard Worker
190*333d2b36SAndroid Build Coastguard Workerconst tidyDefault = "${config.TidyDefaultGlobalChecks}"
191*333d2b36SAndroid Build Coastguard Workerconst tidyExternalVendor = "${config.TidyExternalVendorChecks}"
192*333d2b36SAndroid Build Coastguard Workerconst tidyDefaultNoAnalyzer = "${config.TidyDefaultGlobalChecks},-clang-analyzer-*"
193*333d2b36SAndroid Build Coastguard Worker
194*333d2b36SAndroid Build Coastguard Worker// This is a map of local path prefixes to the set of default clang-tidy checks
195*333d2b36SAndroid Build Coastguard Worker// to be used.  This is like android.IsThirdPartyPath, but with more patterns.
196*333d2b36SAndroid Build Coastguard Worker// The last matched local_path_prefix should be the most specific to be used.
197*333d2b36SAndroid Build Coastguard Workervar DefaultLocalTidyChecks = []PathBasedTidyCheck{
198*333d2b36SAndroid Build Coastguard Worker	{"external/", tidyExternalVendor},
199*333d2b36SAndroid Build Coastguard Worker	{"frameworks/compile/mclinker/", tidyExternalVendor},
200*333d2b36SAndroid Build Coastguard Worker	{"hardware/", tidyExternalVendor},
201*333d2b36SAndroid Build Coastguard Worker	{"hardware/google/", tidyDefault},
202*333d2b36SAndroid Build Coastguard Worker	{"hardware/interfaces/", tidyDefault},
203*333d2b36SAndroid Build Coastguard Worker	{"hardware/ril/", tidyDefault},
204*333d2b36SAndroid Build Coastguard Worker	{"hardware/libhardware", tidyDefault}, // all 'hardware/libhardware*'
205*333d2b36SAndroid Build Coastguard Worker	{"vendor/", tidyExternalVendor},
206*333d2b36SAndroid Build Coastguard Worker	{"vendor/google", tidyDefault}, // all 'vendor/google*'
207*333d2b36SAndroid Build Coastguard Worker	{"vendor/google/external/", tidyExternalVendor},
208*333d2b36SAndroid Build Coastguard Worker	{"vendor/google_arc/libs/org.chromium.arc.mojom", tidyExternalVendor},
209*333d2b36SAndroid Build Coastguard Worker	{"vendor/google_devices/", tidyExternalVendor}, // many have vendor code
210*333d2b36SAndroid Build Coastguard Worker}
211*333d2b36SAndroid Build Coastguard Worker
212*333d2b36SAndroid Build Coastguard Workervar reversedDefaultLocalTidyChecks = reverseTidyChecks(DefaultLocalTidyChecks)
213*333d2b36SAndroid Build Coastguard Worker
214*333d2b36SAndroid Build Coastguard Workerfunc reverseTidyChecks(in []PathBasedTidyCheck) []PathBasedTidyCheck {
215*333d2b36SAndroid Build Coastguard Worker	ret := make([]PathBasedTidyCheck, len(in))
216*333d2b36SAndroid Build Coastguard Worker	for i, check := range in {
217*333d2b36SAndroid Build Coastguard Worker		ret[len(in)-i-1] = check
218*333d2b36SAndroid Build Coastguard Worker	}
219*333d2b36SAndroid Build Coastguard Worker	return ret
220*333d2b36SAndroid Build Coastguard Worker}
221*333d2b36SAndroid Build Coastguard Worker
222*333d2b36SAndroid Build Coastguard Workerfunc TidyChecksForDir(dir string) string {
223*333d2b36SAndroid Build Coastguard Worker	dir = dir + "/"
224*333d2b36SAndroid Build Coastguard Worker	for _, pathCheck := range reversedDefaultLocalTidyChecks {
225*333d2b36SAndroid Build Coastguard Worker		if strings.HasPrefix(dir, pathCheck.PathPrefix) {
226*333d2b36SAndroid Build Coastguard Worker			return pathCheck.Checks
227*333d2b36SAndroid Build Coastguard Worker		}
228*333d2b36SAndroid Build Coastguard Worker	}
229*333d2b36SAndroid Build Coastguard Worker	return tidyDefault
230*333d2b36SAndroid Build Coastguard Worker}
231*333d2b36SAndroid Build Coastguard Worker
232*333d2b36SAndroid Build Coastguard Workerfunc neverTidyForDir(dir string) bool {
233*333d2b36SAndroid Build Coastguard Worker	// This function can be extended if tidy needs to be disabled for more directories.
234*333d2b36SAndroid Build Coastguard Worker	return strings.HasPrefix(dir, "external/grpc-grpc")
235*333d2b36SAndroid Build Coastguard Worker}
236*333d2b36SAndroid Build Coastguard Worker
237*333d2b36SAndroid Build Coastguard Workerfunc NoClangTidyForDir(allowExternalVendor bool, dir string) bool {
238*333d2b36SAndroid Build Coastguard Worker	// Tidy can be disable for a module in dir, if the dir is "neverTidyForDir",
239*333d2b36SAndroid Build Coastguard Worker	// or if it belongs to external|vendor and !allowExternalVendor.
240*333d2b36SAndroid Build Coastguard Worker	// This function depends on TidyChecksForDir, which selects tidyExternalVendor
241*333d2b36SAndroid Build Coastguard Worker	// checks for external/vendor projects.
242*333d2b36SAndroid Build Coastguard Worker	return neverTidyForDir(dir) ||
243*333d2b36SAndroid Build Coastguard Worker		(!allowExternalVendor && TidyChecksForDir(dir) == tidyExternalVendor)
244*333d2b36SAndroid Build Coastguard Worker}
245*333d2b36SAndroid Build Coastguard Worker
246*333d2b36SAndroid Build Coastguard Worker// Returns a globally disabled tidy checks, overriding locally selected checks.
247*333d2b36SAndroid Build Coastguard Workerfunc TidyGlobalNoChecks() string {
248*333d2b36SAndroid Build Coastguard Worker	if len(globalNoCheckList) > 0 {
249*333d2b36SAndroid Build Coastguard Worker		return ",${config.TidyGlobalNoChecks}"
250*333d2b36SAndroid Build Coastguard Worker	}
251*333d2b36SAndroid Build Coastguard Worker	return ""
252*333d2b36SAndroid Build Coastguard Worker}
253*333d2b36SAndroid Build Coastguard Worker
254*333d2b36SAndroid Build Coastguard Worker// Returns a globally allowed/no-error tidy checks, appended to -warnings-as-errors.
255*333d2b36SAndroid Build Coastguard Workerfunc TidyGlobalNoErrorChecks() string {
256*333d2b36SAndroid Build Coastguard Worker	if len(globalNoErrorCheckList) > 0 {
257*333d2b36SAndroid Build Coastguard Worker		return ",${config.TidyGlobalNoErrorChecks}"
258*333d2b36SAndroid Build Coastguard Worker	}
259*333d2b36SAndroid Build Coastguard Worker	return ""
260*333d2b36SAndroid Build Coastguard Worker}
261*333d2b36SAndroid Build Coastguard Worker
262*333d2b36SAndroid Build Coastguard Workerfunc TidyExtraArgFlags() []string {
263*333d2b36SAndroid Build Coastguard Worker	return extraArgFlags
264*333d2b36SAndroid Build Coastguard Worker}
265*333d2b36SAndroid Build Coastguard Worker
266*333d2b36SAndroid Build Coastguard Workerfunc TidyFlagsForSrcFile(srcFile android.Path, flags string) string {
267*333d2b36SAndroid Build Coastguard Worker	// Disable clang-analyzer-* checks globally for generated source files
268*333d2b36SAndroid Build Coastguard Worker	// because some of them are too huge. Local .bp files can add wanted
269*333d2b36SAndroid Build Coastguard Worker	// clang-analyzer checks through the tidy_checks property.
270*333d2b36SAndroid Build Coastguard Worker	// Need to do this patch per source file, because some modules
271*333d2b36SAndroid Build Coastguard Worker	// have both generated and organic source files.
272*333d2b36SAndroid Build Coastguard Worker	if _, ok := srcFile.(android.WritablePath); ok {
273*333d2b36SAndroid Build Coastguard Worker		if strings.Contains(flags, tidyDefault) {
274*333d2b36SAndroid Build Coastguard Worker			return strings.ReplaceAll(flags, tidyDefault, tidyDefaultNoAnalyzer)
275*333d2b36SAndroid Build Coastguard Worker		}
276*333d2b36SAndroid Build Coastguard Worker	}
277*333d2b36SAndroid Build Coastguard Worker	return flags
278*333d2b36SAndroid Build Coastguard Worker}
279