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