aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java18
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java62
-rw-r--r--src/main/protobuf/android_studio_ide_info.proto2
-rw-r--r--src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java29
-rw-r--r--src/test/java/com/google/devtools/build/lib/ideinfo/intellij_info.bzl15
8 files changed, 115 insertions, 29 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 8a1eb0da79..72bccc0733 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -727,6 +727,7 @@ java_library(
":packages-internal",
":util",
":vfs",
+ "//src/main/java/com/google/devtools/build/lib:skylarkinterface",
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/rules/cpp",
"//src/main/java/com/google/devtools/common/options",
diff --git a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java
index 73aa5acc06..aa24d5be58 100644
--- a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java
@@ -59,7 +59,6 @@ import com.google.devtools.build.lib.packages.AspectParameters;
import com.google.devtools.build.lib.packages.BuildType;
import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.packages.Rule;
-import com.google.devtools.build.lib.rules.android.AndroidCommon;
import com.google.devtools.build.lib.rules.android.AndroidIdeInfoProvider;
import com.google.devtools.build.lib.rules.android.AndroidIdeInfoProvider.SourceDirectory;
import com.google.devtools.build.lib.rules.android.AndroidSdkProvider;
@@ -429,7 +428,7 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory {
builder.addResources(artifactLocation);
}
- builder.setJavaPackage(AndroidCommon.getJavaPackage(ruleContext));
+ builder.setJavaPackage(provider.getJavaPackage());
boolean hasIdlSources = !provider.getIdlSrcs().isEmpty();
builder.setHasIdlSources(hasIdlSources);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
index e52f2fadb6..7e022c8ab9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -246,6 +246,7 @@ public class AndroidCommon {
Iterable<Artifact> apksUnderTest) {
AndroidIdeInfoProvider.Builder ideInfoProviderBuilder =
new AndroidIdeInfoProvider.Builder()
+ .setJavaPackage(getJavaPackage(ruleContext))
.setIdlClassJar(idlHelper.getIdlClassJar())
.setIdlSourceJar(idlHelper.getIdlSourceJar())
.addIdlParcelables(idlHelper.getIdlParcelables())
@@ -602,12 +603,16 @@ public class AndroidCommon {
JavaRuntimeJarProvider.class,
new JavaRuntimeJarProvider(javaCommon.getJavaCompilationArtifacts().getRuntimeJars()))
.add(RunfilesProvider.class, RunfilesProvider.simple(getRunfiles()))
- .add(
- AndroidResourcesProvider.class, resourceApk.toResourceProvider(ruleContext.getLabel()))
+ .add(AndroidResourcesProvider.class, resourceApk.toResourceProvider(ruleContext.getLabel()))
.add(
AndroidIdeInfoProvider.class,
- createAndroidIdeInfoProvider(ruleContext, androidSemantics, idlHelper,
- resourceApk, zipAlignedApk, apksUnderTest))
+ createAndroidIdeInfoProvider(
+ ruleContext,
+ androidSemantics,
+ idlHelper,
+ resourceApk,
+ zipAlignedApk,
+ apksUnderTest))
.add(
JavaCompilationArgsProvider.class,
new JavaCompilationArgsProvider(
@@ -620,6 +625,7 @@ public class AndroidCommon {
asNeverLink
? jackCompilationHelper.compileAsNeverlinkLibrary()
: jackCompilationHelper.compileAsLibrary())
+ .addSkylarkTransitiveInfo(AndroidSkylarkApiProvider.NAME, new AndroidSkylarkApiProvider())
.addOutputGroup(
OutputGroupProvider.HIDDEN_TOP_LEVEL, collectHiddenTopLevelArtifacts(ruleContext))
.addOutputGroup(JavaSemantics.SOURCE_JARS_OUTPUT_GROUP, transitiveSourceJars);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java
index 0cd44ad59d..43fa45c5cd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java
@@ -127,6 +127,7 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider {
private Artifact apk = null;
private Artifact idlClassJar = null;
private Artifact idlSourceJar = null;
+ private String javaPackage = null;
private final Set<SourceDirectory> resourceDirs = new LinkedHashSet<>();
private final Set<SourceDirectory> assetDirs = new LinkedHashSet<>();
private final Set<SourceDirectory> idlDirs = new LinkedHashSet<>();
@@ -136,6 +137,7 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider {
public AndroidIdeInfoProvider build() {
return new AndroidIdeInfoProvider(
+ javaPackage,
manifest,
generatedManifest,
apk,
@@ -149,6 +151,11 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider {
ImmutableList.copyOf(apksUnderTest));
}
+ public Builder setJavaPackage(String javaPackage) {
+ this.javaPackage = javaPackage;
+ return this;
+ }
+
public Builder setApk(Artifact apk) {
Preconditions.checkState(this.apk == null);
this.apk = apk;
@@ -315,6 +322,7 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider {
}
}
+ private final String javaPackage;
private final Artifact manifest;
private final Artifact generatedManifest;
private final Artifact signedApk;
@@ -327,7 +335,9 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider {
private final ImmutableCollection<Artifact> idlGeneratedJavaFiles;
private final ImmutableCollection<Artifact> apksUnderTest;
- AndroidIdeInfoProvider(@Nullable Artifact manifest,
+ AndroidIdeInfoProvider(
+ String javaPackage,
+ @Nullable Artifact manifest,
@Nullable Artifact generatedManifest,
@Nullable Artifact signedApk,
@Nullable Artifact idlClassJar,
@@ -338,6 +348,7 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider {
ImmutableCollection<Artifact> idlSrcs,
ImmutableCollection<Artifact> idlGeneratedJavaFiles,
ImmutableCollection<Artifact> apksUnderTest) {
+ this.javaPackage = javaPackage;
this.manifest = manifest;
this.generatedManifest = generatedManifest;
this.signedApk = signedApk;
@@ -351,6 +362,11 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider {
this.apksUnderTest = apksUnderTest;
}
+ /** Returns java package for this target. */
+ public String getJavaPackage() {
+ return javaPackage;
+ }
+
/** Returns the direct AndroidManifest. */
@Nullable
public Artifact getManifest() {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java
new file mode 100644
index 0000000000..2c4a017c46
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java
@@ -0,0 +1,62 @@
+// Copyright 2016 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.rules.android;
+
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.rules.SkylarkApiProvider;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+
+/**
+ * A class that exposes the Android providers to Skylark. It is intended to provide a
+ * simple and stable interface for Skylark users.
+ */
+@SkylarkModule(
+ name = "AndroidSkylarkApiProvider",
+ doc = "Provides access to information about Android rules"
+)
+public class AndroidSkylarkApiProvider extends SkylarkApiProvider {
+ /** The name of the field in Skylark used to access this class. */
+ public static final String NAME = "android";
+
+ @SkylarkCallable(
+ name = "apk",
+ structField = true,
+ allowReturnNones = true,
+ doc = "Returns an APK produced by this target."
+ )
+ public Artifact getApk() {
+ return getInfo().getProvider(AndroidIdeInfoProvider.class).getSignedApk();
+ }
+
+ @SkylarkCallable(
+ name = "java_package",
+ structField = true,
+ allowReturnNones = true,
+ doc = "Returns a java package for this target."
+ )
+ public String getJavaPackage() {
+ return getInfo().getProvider(AndroidIdeInfoProvider.class).getJavaPackage();
+ }
+
+ @SkylarkCallable(
+ name = "manifest",
+ structField = true,
+ allowReturnNones = true,
+ doc = "Returns a manifest file for this target."
+ )
+ public Artifact getManifest() {
+ return getInfo().getProvider(AndroidIdeInfoProvider.class).getManifest();
+ }
+}
diff --git a/src/main/protobuf/android_studio_ide_info.proto b/src/main/protobuf/android_studio_ide_info.proto
index 3b80f6eca1..9437a35c05 100644
--- a/src/main/protobuf/android_studio_ide_info.proto
+++ b/src/main/protobuf/android_studio_ide_info.proto
@@ -50,7 +50,7 @@ message AndroidRuleIdeInfo {
repeated ArtifactLocation resources = 1;
ArtifactLocation apk = 3;
repeated ArtifactLocation dependency_apk = 4;
- ArtifactLocation manifest= 5;
+ ArtifactLocation manifest = 5;
string java_package = 7;
bool has_idl_sources = 8;
LibraryArtifact idl_jar = 9;
diff --git a/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java b/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java
index 11f8e06625..2220848a53 100644
--- a/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java
+++ b/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java
@@ -590,10 +590,10 @@ public class AndroidStudioInfoAspectTest extends AndroidStudioInfoAspectTestBase
transform(
ruleInfo.getAndroidRuleIdeInfo().getResourcesList(), ARTIFACT_TO_RELATIVE_PATH))
.containsExactly("com/google/example/res");
- assertThat(ruleInfo.getAndroidRuleIdeInfo().getManifest().getRelativePath())
- .isEqualTo("com/google/example/AndroidManifest.xml");
- assertThat(ruleInfo.getAndroidRuleIdeInfo().getJavaPackage()).isEqualTo("com.google.example");
}
+ assertThat(ruleInfo.getAndroidRuleIdeInfo().getManifest().getRelativePath())
+ .isEqualTo("com/google/example/AndroidManifest.xml");
+ assertThat(ruleInfo.getAndroidRuleIdeInfo().getJavaPackage()).isEqualTo("com.google.example");
assertThat(ruleInfo.getDependenciesList()).containsExactly("//com/google/example:l1");
assertThat(getIdeResolveFiles()).containsExactly(
@@ -647,12 +647,13 @@ public class AndroidStudioInfoAspectTest extends AndroidStudioInfoAspectTestBase
transform(
ruleInfo.getAndroidRuleIdeInfo().getResourcesList(), ARTIFACT_TO_RELATIVE_PATH))
.containsExactly("com/google/example/res");
- assertThat(ruleInfo.getAndroidRuleIdeInfo().getManifest().getRelativePath())
- .isEqualTo("com/google/example/AndroidManifest.xml");
- assertThat(ruleInfo.getAndroidRuleIdeInfo().getJavaPackage()).isEqualTo("com.google.example");
- assertThat(ruleInfo.getAndroidRuleIdeInfo().getApk().getRelativePath())
- .isEqualTo("com/google/example/b.apk");
}
+ assertThat(ruleInfo.getAndroidRuleIdeInfo().getManifest().getRelativePath())
+ .isEqualTo("com/google/example/AndroidManifest.xml");
+ assertThat(ruleInfo.getAndroidRuleIdeInfo().getJavaPackage()).isEqualTo("com.google.example");
+ assertThat(ruleInfo.getAndroidRuleIdeInfo().getApk().getRelativePath())
+ .isEqualTo("com/google/example/b.apk");
+
assertThat(ruleInfo.getDependenciesList()).containsExactly("//com/google/example:l1");
@@ -675,10 +676,6 @@ public class AndroidStudioInfoAspectTest extends AndroidStudioInfoAspectTestBase
@Test
public void testAndroidInferredPackage() throws Exception {
- if (!isNativeTest()) {
- return;
- }
-
scratch.file(
"java/com/google/example/BUILD",
"android_library(",
@@ -753,10 +750,6 @@ public class AndroidStudioInfoAspectTest extends AndroidStudioInfoAspectTestBase
@Test
public void testAndroidLibraryGeneratedManifestIsAddedToOutputGroup() throws Exception {
- if (!isNativeTest()) {
- return;
- }
-
scratch.file(
"com/google/example/BUILD",
"android_library(",
@@ -836,10 +829,6 @@ public class AndroidStudioInfoAspectTest extends AndroidStudioInfoAspectTestBase
@Test
public void testNonConformingPackageName() throws Exception {
- if (!isNativeTest()) {
- return;
- }
-
scratch.file(
"bad/package/google/example/BUILD",
"android_library(",
diff --git a/src/test/java/com/google/devtools/build/lib/ideinfo/intellij_info.bzl b/src/test/java/com/google/devtools/build/lib/ideinfo/intellij_info.bzl
index 314ca1deee..98c2a1b17e 100644
--- a/src/test/java/com/google/devtools/build/lib/ideinfo/intellij_info.bzl
+++ b/src/test/java/com/google/devtools/build/lib/ideinfo/intellij_info.bzl
@@ -112,6 +112,15 @@ def java_rule_ide_info(target, ctx):
),
ide_resolve_files)
+def android_rule_ide_info(target, ctx):
+ if not hasattr(target, 'android'):
+ return None
+ return struct_omit_none(
+ java_package = target.android.java_package,
+ manifest = artifact_location(target.android.manifest),
+ apk = artifact_location(target.android.apk),
+ )
+
def _aspect_impl(target, ctx):
kind = get_kind(target, ctx)
@@ -133,12 +142,16 @@ def _aspect_impl(target, ctx):
if is_java_rule(target, ctx):
java_rule_ide_info, java_ide_resolve_files = java_rule_ide_info(target, ctx)
ide_resolve_files = ide_resolve_files | java_ide_resolve_files
- info = struct(
+
+ android_rule_ide_info = android_rule_ide_info(target, ctx)
+
+ info = struct_omit_none(
label = str(target.label),
kind = kind,
dependencies = all_deps,
build_file_artifact_location = build_file_artifact_location(ctx.build_file_path),
java_rule_ide_info = java_rule_ide_info,
+ android_rule_ide_info = android_rule_ide_info,
tags = ctx.rule.attr.tags,
)
else: