Support adding extra lint checks

Add a lint.extra_check_modules property to list modules to use as
plugins to Lint.

Bug: 153485543
Test: m checkbuild
Change-Id: I25c7799438cfec43163e757637c65b8657488d36
diff --git a/java/lint.go b/java/lint.go
index 441e110..fac9a19 100644
--- a/java/lint.go
+++ b/java/lint.go
@@ -42,6 +42,9 @@
 
 		// Checks that should be skipped.
 		Disabled_checks []string
+
+		// Modules that provide extra lint checks
+		Extra_check_modules []string
 	}
 }
 
@@ -76,6 +79,14 @@
 	return BoolDefault(l.properties.Lint.Enabled, true)
 }
 
+func (l *linter) deps(ctx android.BottomUpMutatorContext) {
+	if !l.enabled() {
+		return
+	}
+
+	ctx.AddFarVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(), extraLintCheckTag, l.properties.Lint.Extra_check_modules...)
+}
+
 func (l *linter) writeLintProjectXML(ctx android.ModuleContext,
 	rule *android.RuleBuilder) (projectXMLPath, configXMLPath, cacheDir android.WritablePath, deps android.Paths) {
 
@@ -179,6 +190,16 @@
 		return
 	}
 
+	extraLintCheckModules := ctx.GetDirectDepsWithTag(extraLintCheckTag)
+	for _, extraLintCheckModule := range extraLintCheckModules {
+		if dep, ok := extraLintCheckModule.(Dependency); ok {
+			l.extraLintCheckJars = append(l.extraLintCheckJars, dep.ImplementationAndResourcesJars()...)
+		} else {
+			ctx.PropertyErrorf("lint.extra_check_modules",
+				"%s is not a java module", ctx.OtherModuleName(extraLintCheckModule))
+		}
+	}
+
 	rule := android.NewRuleBuilder()
 
 	if l.manifest == nil {