/*
* Copyright 2015-present Facebook, Inc.
*
* 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.facebook.buck.ide.intellij;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import com.facebook.buck.android.AndroidBinaryDescriptionArg;
import com.facebook.buck.android.AndroidLibraryBuilder;
import com.facebook.buck.android.AndroidLibraryDescription;
import com.facebook.buck.android.AndroidResourceBuilder;
import com.facebook.buck.android.AndroidResourceDescriptionArg;
import com.facebook.buck.cli.BuckConfig;
import com.facebook.buck.cli.FakeBuckConfig;
import com.facebook.buck.ide.intellij.aggregation.AggregationMode;
import com.facebook.buck.ide.intellij.aggregation.DefaultAggregationModuleFactory;
import com.facebook.buck.ide.intellij.model.DependencyType;
import com.facebook.buck.ide.intellij.model.IjLibrary;
import com.facebook.buck.ide.intellij.model.IjLibraryFactory;
import com.facebook.buck.ide.intellij.model.IjLibraryFactoryResolver;
import com.facebook.buck.ide.intellij.model.IjModule;
import com.facebook.buck.ide.intellij.model.IjModuleFactory;
import com.facebook.buck.ide.intellij.model.IjModuleFactoryResolver;
import com.facebook.buck.ide.intellij.model.IjProjectConfig;
import com.facebook.buck.ide.intellij.model.IjProjectElement;
import com.facebook.buck.io.ProjectFilesystem;
import com.facebook.buck.jvm.java.JavaLibraryBuilder;
import com.facebook.buck.jvm.java.JavaTestBuilder;
import com.facebook.buck.jvm.java.JvmLibraryArg;
import com.facebook.buck.jvm.java.KeystoreBuilder;
import com.facebook.buck.jvm.java.PrebuiltJarBuilder;
import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.rules.BuildRuleResolver;
import com.facebook.buck.rules.DefaultTargetNodeToBuildRuleTransformer;
import com.facebook.buck.rules.FakeSourcePath;
import com.facebook.buck.rules.SourcePath;
import com.facebook.buck.rules.SourcePathResolver;
import com.facebook.buck.rules.SourcePathRuleFinder;
import com.facebook.buck.rules.TargetGraph;
import com.facebook.buck.rules.TargetNode;
import com.facebook.buck.shell.GenruleBuilder;
import com.facebook.buck.testutil.FakeProjectFilesystem;
import com.facebook.buck.testutil.TargetGraphFactory;
import com.facebook.buck.util.HumanReadableException;
import com.google.common.base.Function;
import com.google.common.base.Functions;
import com.google.common.base.Predicate;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional;
import org.hamcrest.Matchers;
import org.junit.Test;
public class IjModuleGraphTest {
@Test
public void testModuleCoalescing() {
TargetNode<?, ?> guava =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//third_party/java/guava:guava"))
.build();
TargetNode<?, ?> base =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//java/com/example/base:base"))
.addDep(guava.getBuildTarget())
.build();
TargetNode<?, ?> baseTests =
JavaTestBuilder.createBuilder(
BuildTargetFactory.newInstance("//java/com/example/base:tests"))
.addDep(guava.getBuildTarget())
.build();
IjModuleGraph moduleGraph = createModuleGraph(ImmutableSet.of(guava, base, baseTests));
IjModule guavaModule = getModuleForTarget(moduleGraph, guava);
IjModule baseModule = getModuleForTarget(moduleGraph, base);
IjModule baseTestModule = getModuleForTarget(moduleGraph, baseTests);
assertNotEquals(guavaModule, baseModule);
assertEquals(baseTestModule, baseModule);
}
@Test
public void testSimpleDependencies() {
TargetNode<?, ?> libraryTarget =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//java/src/com/library:library"))
.build();
TargetNode<?, ?> productTarget =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//java/src/com/product:product"))
.addDep(libraryTarget.getBuildTarget())
.build();
IjModuleGraph moduleGraph = createModuleGraph(ImmutableSet.of(libraryTarget, productTarget));
IjModule libraryModule = getModuleForTarget(moduleGraph, libraryTarget);
IjModule productModule = getModuleForTarget(moduleGraph, productTarget);
assertEquals(
ImmutableMap.of(libraryModule, DependencyType.PROD),
moduleGraph.getDependentModulesFor(productModule));
assertTrue(moduleGraph.getDependentModulesFor(libraryModule).isEmpty());
}
@Test
public void testExportedDependencies() {
TargetNode<?, ?> junitReflect =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//third-party/junit/reflect:reflect"))
.build();
TargetNode<?, ?> junitCore =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//third-party/junit/core:core"))
.addExportedDep(junitReflect.getBuildTarget())
.build();
TargetNode<?, ?> junitRule =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//third-party/junit/rule:rule"))
.addDep(junitCore.getBuildTarget())
.build();
IjModuleGraph moduleGraph =
createModuleGraph(ImmutableSet.of(junitReflect, junitCore, junitRule));
IjModule junitReflectModule = getModuleForTarget(moduleGraph, junitReflect);
IjModule junitCoreModule = getModuleForTarget(moduleGraph, junitCore);
IjModule junitRuleModule = getModuleForTarget(moduleGraph, junitRule);
assertEquals(
ImmutableMap.of(
junitReflectModule, DependencyType.PROD,
junitCoreModule, DependencyType.PROD),
moduleGraph.getDependentModulesFor(junitRuleModule));
}
@Test
public void testDoesNotDependOnSelfViaExportedDependencies() {
TargetNode<?, ?> libraryTypes =
JavaLibraryBuilder.createBuilder(BuildTargetFactory.newInstance("//java/library:types"))
.build();
TargetNode<?, ?> reExporter =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//java/reexporter:reexporter"))
.addExportedDep(libraryTypes.getBuildTarget())
.build();
TargetNode<?, ?> libraryCore =
JavaLibraryBuilder.createBuilder(BuildTargetFactory.newInstance("//java/library:core"))
.addDep(reExporter.getBuildTarget())
.build();
IjModuleGraph moduleGraph =
createModuleGraph(ImmutableSet.of(libraryCore, reExporter, libraryTypes));
IjModule libraryModule = getModuleForTarget(moduleGraph, libraryCore);
IjModule reExporterModule = getModuleForTarget(moduleGraph, reExporter);
assertEquals(
ImmutableMap.of(reExporterModule, DependencyType.PROD),
moduleGraph.getDependentModulesFor(libraryModule));
}
@Test
public void testTestDependencies() {
TargetNode<?, ?> junitTargetNode =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//third-party/junit:junit"))
.build();
TargetNode<?, ?> guavaTargetNode =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//third-party/guava:guava"))
.build();
TargetNode<?, ?> hamcrestTargetNode =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//third-party/hamcrest:hamcrest"))
.build();
TargetNode<?, ?> codeTargetNode =
JavaLibraryBuilder.createBuilder(BuildTargetFactory.newInstance("//java/com/foo:foo"))
.addSrc(Paths.get("java/com/foo/src/Foo.java"))
.addDep(guavaTargetNode.getBuildTarget())
.build();
TargetNode<?, ?> inlineTestTargetNode =
JavaTestBuilder.createBuilder(BuildTargetFactory.newInstance("//java/com/foo:test"))
.addDep(codeTargetNode.getBuildTarget())
.addDep(junitTargetNode.getBuildTarget())
.addSrc(Paths.get("java/com/foo/src/TestFoo.java"))
.build();
TargetNode<?, ?> secondInlineTestTargetNode =
JavaTestBuilder.createBuilder(BuildTargetFactory.newInstance("//java/com/foo:test2"))
.addDep(hamcrestTargetNode.getBuildTarget())
.addSrc(Paths.get("java/com/foo/test/TestFoo.java"))
.build();
TargetNode<?, ?> testTargetNode =
JavaTestBuilder.createBuilder(BuildTargetFactory.newInstance("//javatest/com/foo:foo"))
.addDep(codeTargetNode.getBuildTarget())
.addDep(junitTargetNode.getBuildTarget())
.addSrc(Paths.get("javatest/com/foo/Foo.java"))
.build();
IjModuleGraph moduleGraph =
createModuleGraph(
ImmutableSet.of(
guavaTargetNode,
hamcrestTargetNode,
junitTargetNode,
codeTargetNode,
inlineTestTargetNode,
secondInlineTestTargetNode,
testTargetNode));
IjModule guavaModule = getModuleForTarget(moduleGraph, guavaTargetNode);
IjModule hamcrestModule = getModuleForTarget(moduleGraph, hamcrestTargetNode);
IjModule junitModule = getModuleForTarget(moduleGraph, junitTargetNode);
IjModule codeModule = getModuleForTarget(moduleGraph, codeTargetNode);
IjModule testModule = getModuleForTarget(moduleGraph, testTargetNode);
assertEquals(ImmutableMap.of(), moduleGraph.getDependentModulesFor(junitModule));
assertEquals(ImmutableMap.of(), moduleGraph.getDependentModulesFor(guavaModule));
assertEquals(
ImmutableMap.of(
guavaModule, DependencyType.PROD,
junitModule, DependencyType.PROD,
hamcrestModule, DependencyType.TEST),
moduleGraph.getDependentModulesFor(codeModule));
assertEquals(
ImmutableMap.of(
codeModule, DependencyType.TEST,
junitModule, DependencyType.TEST),
moduleGraph.getDependentModulesFor(testModule));
}
@Test
public void testDependenciesOnPrebuilt() {
TargetNode<?, ?> guavaTargetNode =
PrebuiltJarBuilder.createBuilder(
BuildTargetFactory.newInstance("//third-party/guava:guava"))
.setBinaryJar(Paths.get("third-party/guava/guava.jar"))
.build();
TargetNode<?, ?> coreTargetNode =
JavaLibraryBuilder.createBuilder(BuildTargetFactory.newInstance("//java/org/foo/core:core"))
.addDep(guavaTargetNode.getBuildTarget())
.build();
IjModuleGraph moduleGraph = createModuleGraph(ImmutableSet.of(guavaTargetNode, coreTargetNode));
IjModule coreModule = getModuleForTarget(moduleGraph, coreTargetNode);
IjLibrary guavaElement = getLibraryForTarget(moduleGraph, guavaTargetNode);
assertEquals(
ImmutableMap.of(guavaElement, DependencyType.PROD), moduleGraph.getDepsFor(coreModule));
}
@Test
public void testExportedDependenciesOfTests() {
TargetNode<?, ?> junitTargetNode =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//third-party/junit:junit"))
.build();
TargetNode<?, ?> testLibTargetNode =
JavaLibraryBuilder.createBuilder(BuildTargetFactory.newInstance("//javatests/lib:lib"))
.addExportedDep(junitTargetNode.getBuildTarget())
.build();
TargetNode<?, ?> testTargetNode =
JavaTestBuilder.createBuilder(BuildTargetFactory.newInstance("//javatests/test:test"))
.addDep(testLibTargetNode.getBuildTarget())
.build();
IjModuleGraph moduleGraph =
createModuleGraph(ImmutableSet.of(junitTargetNode, testLibTargetNode, testTargetNode));
IjModule junitModule = getModuleForTarget(moduleGraph, junitTargetNode);
IjModule testLibModule = getModuleForTarget(moduleGraph, testLibTargetNode);
IjModule testModule = getModuleForTarget(moduleGraph, testTargetNode);
assertEquals(
ImmutableMap.of(
junitModule, DependencyType.TEST,
testLibModule, DependencyType.TEST),
moduleGraph.getDependentModulesFor(testModule));
}
@Test
public void testExportedDependenciesDependsOnDepOfExportedDep() {
TargetNode<?, ?> junitReflect =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//third-party/junit/reflect:reflect"))
.build();
TargetNode<?, ?> junitCore =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//third-party/junit/core:core"))
.addExportedDep(junitReflect.getBuildTarget())
.build();
TargetNode<?, ?> junitRule =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//third-party/junit/rule:rule"))
.addExportedDep(junitCore.getBuildTarget())
.build();
IjModuleGraph moduleGraph =
createModuleGraph(ImmutableSet.of(junitReflect, junitCore, junitRule));
IjModule junitReflectModule = getModuleForTarget(moduleGraph, junitReflect);
IjModule junitCoreModule = getModuleForTarget(moduleGraph, junitCore);
IjModule junitRuleModule = getModuleForTarget(moduleGraph, junitRule);
assertEquals(
ImmutableMap.of(
junitReflectModule, DependencyType.PROD,
junitCoreModule, DependencyType.PROD),
moduleGraph.getDependentModulesFor(junitRuleModule));
}
@Test
public void testExportedDependenciesDontLeak() {
TargetNode<?, ?> junitReflect =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//third-party/junit/reflect:reflect"))
.build();
TargetNode<?, ?> junitCore =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//third-party/junit/core:core"))
.addExportedDep(junitReflect.getBuildTarget())
.build();
TargetNode<?, ?> junitRule =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//third-party/junit/rule:rule"))
.addDep(junitCore.getBuildTarget())
.build();
TargetNode<?, ?> testRule =
JavaLibraryBuilder.createBuilder(BuildTargetFactory.newInstance("//tests/feature:tests"))
.addDep(junitRule.getBuildTarget())
.build();
IjModuleGraph moduleGraph =
createModuleGraph(ImmutableSet.of(junitReflect, junitCore, junitRule, testRule));
IjModule junitRuleModule = getModuleForTarget(moduleGraph, junitRule);
IjModule testRuleModule = getModuleForTarget(moduleGraph, testRule);
assertEquals(
ImmutableMap.of(junitRuleModule, DependencyType.PROD),
moduleGraph.getDependentModulesFor(testRuleModule));
}
@Test
public void testDropDependenciesToUnsupportedTargets() {
TargetNode<?, ?> productKeystoreTarget =
KeystoreBuilder.createBuilder(
BuildTargetFactory.newInstance("//java/src/com/facebook/library:keystore"))
.setStore(new FakeSourcePath("store"))
.setProperties(new FakeSourcePath("properties"))
.build();
TargetNode<?, ?> libraryJavaTarget =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//java/src/com/facebook/library:library"))
.build();
TargetNode<?, ?> productTarget =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//java/src/com/facebook/product:child"))
.addDep(productKeystoreTarget.getBuildTarget())
.addDep(libraryJavaTarget.getBuildTarget())
.build();
IjModuleGraph moduleGraph =
createModuleGraph(ImmutableSet.of(libraryJavaTarget, productTarget, productKeystoreTarget));
IjModule libraryModule = getModuleForTarget(moduleGraph, libraryJavaTarget);
IjModule productModule = getModuleForTarget(moduleGraph, productTarget);
assertEquals(
ImmutableMap.of(libraryModule, DependencyType.PROD),
moduleGraph.getDependentModulesFor(productModule));
assertEquals(2, moduleGraph.getModules().size());
}
@Test
public void testCompiledShadow() {
TargetNode<?, ?> productGenruleTarget =
GenruleBuilder.newGenruleBuilder(
BuildTargetFactory.newInstance("//java/src/com/facebook/product:genrule"))
.setOut("out")
.build();
TargetNode<?, ?> libraryJavaTarget =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//java/src/com/facebook/library:library"))
.build();
TargetNode<?, ?> productTarget =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//java/src/com/facebook/product:product"))
.addSrc(Paths.get("java/src/com/facebook/File.java"))
.addSrcTarget(productGenruleTarget.getBuildTarget())
.addDep(libraryJavaTarget.getBuildTarget())
.build();
IjModuleGraph moduleGraph =
createModuleGraph(
ImmutableSet.of(productGenruleTarget, libraryJavaTarget, productTarget),
ImmutableMap.of(productTarget, new FakeSourcePath("buck-out/product.jar")),
Functions.constant(Optional.empty()));
IjModule libraryModule = getModuleForTarget(moduleGraph, libraryJavaTarget);
IjModule productModule = getModuleForTarget(moduleGraph, productTarget);
IjLibrary productLibrary = getLibraryForTarget(moduleGraph, productTarget);
assertEquals(
ImmutableMap.of(
libraryModule, DependencyType.PROD,
productLibrary, DependencyType.COMPILED_SHADOW),
moduleGraph.getDepsFor(productModule));
}
@Test
public void testExtraClassPath() {
final Path rDotJavaClassPath = Paths.get("buck-out/product/rdotjava_classpath");
final TargetNode<?, ?> productTarget =
AndroidLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//java/src/com/facebook/product:product"))
.addSrc(Paths.get("java/src/com/facebook/File.java"))
.build();
IjModuleGraph moduleGraph =
createModuleGraph(
ImmutableSet.of(productTarget),
ImmutableMap.of(productTarget, new FakeSourcePath("buck-out/product.jar")),
input -> {
if (input == productTarget) {
return Optional.of(rDotJavaClassPath);
}
return Optional.empty();
});
IjModule productModule = getModuleForTarget(moduleGraph, productTarget);
IjLibrary rDotJavaLibrary =
FluentIterable.from(moduleGraph.getNodes()).filter(IjLibrary.class).first().get();
assertEquals(ImmutableSet.of(rDotJavaClassPath), productModule.getExtraClassPathDependencies());
assertEquals(ImmutableSet.of(rDotJavaClassPath), rDotJavaLibrary.getClassPaths());
assertEquals(
moduleGraph.getDependentLibrariesFor(productModule),
ImmutableMap.of(rDotJavaLibrary, DependencyType.PROD));
}
@Test(expected = HumanReadableException.class)
public void testCustomAggregationModeAtZero() {
AggregationMode.fromString("0");
fail("Should not be able to construct an aggregator with zero minimum depth.");
}
@Test
public void testModuleAggregation() {
TargetNode<?, ?> guava =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//third_party/java/guava:guava"))
.build();
TargetNode<?, ?> papaya =
JavaLibraryBuilder.createBuilder(BuildTargetFactory.newInstance("//:papaya")).build();
TargetNode<?, ?> base =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//java/com/example/base:base"))
.addDep(guava.getBuildTarget())
.build();
TargetNode<?, ?> core =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//java/com/example/core:core"))
.addDep(papaya.getBuildTarget())
.build();
IjModuleGraph moduleGraph =
createModuleGraph(
ImmutableSet.of(guava, papaya, base, core),
ImmutableMap.of(),
Functions.constant(Optional.empty()),
AggregationMode.SHALLOW);
IjModule guavaModule = getModuleForTarget(moduleGraph, guava);
IjModule papayaModule = getModuleForTarget(moduleGraph, papaya);
IjModule baseModule = getModuleForTarget(moduleGraph, base);
IjModule coreModule = getModuleForTarget(moduleGraph, core);
assertThat(baseModule, Matchers.sameInstance(coreModule));
assertThat(
baseModule.getModuleBasePath(), Matchers.equalTo(Paths.get("java", "com", "example")));
assertThat(
moduleGraph.getDepsFor(baseModule),
Matchers.equalTo(
ImmutableMap.<IjProjectElement, DependencyType>of(
papayaModule, DependencyType.PROD,
guavaModule, DependencyType.PROD)));
}
@Test
public void testModuleAggregationDoesNotCoalesceAndroidResources() {
TargetNode<?, ?> blah1 =
AndroidResourceBuilder.createBuilder(
BuildTargetFactory.newInstance("//android_res/com/example/blah/blah/blah:res"))
.build();
TargetNode<?, ?> blah2 =
AndroidResourceBuilder.createBuilder(
BuildTargetFactory.newInstance("//android_res/com/example/blah/blah/blah2:res"))
.build();
TargetNode<?, ?> commonApp =
AndroidLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//java/com/example/base:base"))
.addDep(blah1.getBuildTarget())
.addDep(blah2.getBuildTarget())
.build();
IjModuleGraph moduleGraph =
createModuleGraph(
ImmutableSet.of(blah1, blah2, commonApp),
ImmutableMap.of(),
Functions.constant(Optional.empty()),
AggregationMode.SHALLOW);
IjModule blah1Module = getModuleForTarget(moduleGraph, blah1);
IjModule blah2Module = getModuleForTarget(moduleGraph, blah2);
assertThat(blah1Module, Matchers.not(Matchers.equalTo(blah2Module)));
assertThat(
blah1Module.getModuleBasePath(),
Matchers.not(Matchers.equalTo(blah2Module.getModuleBasePath())));
}
@Test
public void testModuleAggregationDoesNotCoalesceJava8() {
TargetNode<?, ?> blah1 =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//java/com/example/blah/blah:blah"))
.setSourceLevel("1.8")
.build();
TargetNode<?, ?> blah2 =
JavaLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//java/com/example/blah/blah2:blah2"))
.setTargetLevel("1.8")
.build();
TargetNode<?, ?> commonApp =
AndroidLibraryBuilder.createBuilder(
BuildTargetFactory.newInstance("//java/com/example/base:base"))
.addDep(blah1.getBuildTarget())
.addDep(blah2.getBuildTarget())
.build();
IjModuleGraph moduleGraph =
createModuleGraph(
ImmutableSet.of(blah1, blah2, commonApp),
ImmutableMap.of(),
Functions.constant(Optional.empty()),
AggregationMode.SHALLOW);
IjModule blah1Module = getModuleForTarget(moduleGraph, blah1);
IjModule blah2Module = getModuleForTarget(moduleGraph, blah2);
assertThat(blah1Module, Matchers.not(Matchers.equalTo(blah2Module)));
assertThat(
blah1Module.getModuleBasePath(),
Matchers.not(Matchers.equalTo(blah2Module.getModuleBasePath())));
}
public static IjModuleGraph createModuleGraph(ImmutableSet<TargetNode<?, ?>> targets) {
return createModuleGraph(targets, ImmutableMap.of(), Functions.constant(Optional.empty()));
}
public static IjModuleGraph createModuleGraph(
ImmutableSet<TargetNode<?, ?>> targets,
final ImmutableMap<TargetNode<?, ?>, SourcePath> javaLibraryPaths,
Function<? super TargetNode<?, ?>, Optional<Path>> rDotJavaClassPathResolver) {
return createModuleGraph(
targets, javaLibraryPaths, rDotJavaClassPathResolver, AggregationMode.AUTO);
}
public static IjModuleGraph createModuleGraph(
ImmutableSet<TargetNode<?, ?>> targets,
final ImmutableMap<TargetNode<?, ?>, SourcePath> javaLibraryPaths,
final Function<? super TargetNode<?, ?>, Optional<Path>> rDotJavaClassPathResolver,
AggregationMode aggregationMode) {
final SourcePathResolver sourcePathResolver =
new SourcePathResolver(
new SourcePathRuleFinder(
new BuildRuleResolver(
TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer())));
IjLibraryFactoryResolver sourceOnlyResolver =
new IjLibraryFactoryResolver() {
@Override
public Path getPath(SourcePath path) {
return sourcePathResolver.getAbsolutePath(path);
}
@Override
public Optional<SourcePath> getPathIfJavaLibrary(TargetNode<?, ?> targetNode) {
return Optional.ofNullable(javaLibraryPaths.get(targetNode));
}
};
BuckConfig buckConfig = FakeBuckConfig.builder().build();
IjProjectConfig projectConfig =
IjProjectBuckConfig.create(buckConfig, aggregationMode, null, false, false, false, true);
ProjectFilesystem filesystem = new FakeProjectFilesystem();
SupportedTargetTypeRegistry typeRegistry =
new SupportedTargetTypeRegistry(
filesystem,
new IjModuleFactoryResolver() {
@Override
public Optional<Path> getDummyRDotJavaPath(TargetNode<?, ?> targetNode) {
return rDotJavaClassPathResolver.apply(targetNode);
}
@Override
public Path getAndroidManifestPath(
TargetNode<AndroidBinaryDescriptionArg, ?> targetNode) {
return Paths.get("TestAndroidManifest.xml");
}
@Override
public Optional<Path> getLibraryAndroidManifestPath(
TargetNode<AndroidLibraryDescription.CoreArg, ?> targetNode) {
return Optional.empty();
}
@Override
public Optional<Path> getProguardConfigPath(
TargetNode<AndroidBinaryDescriptionArg, ?> targetNode) {
return Optional.empty();
}
@Override
public Optional<Path> getAndroidResourcePath(
TargetNode<AndroidResourceDescriptionArg, ?> targetNode) {
return Optional.empty();
}
@Override
public Optional<Path> getAssetsPath(
TargetNode<AndroidResourceDescriptionArg, ?> targetNode) {
return Optional.empty();
}
@Override
public Optional<Path> getAnnotationOutputPath(
TargetNode<? extends JvmLibraryArg, ?> targetNode) {
return Optional.empty();
}
},
projectConfig);
IjModuleFactory moduleFactory = new DefaultIjModuleFactory(filesystem, typeRegistry);
IjLibraryFactory libraryFactory = new DefaultIjLibraryFactory(sourceOnlyResolver);
return IjModuleGraphFactory.from(
filesystem,
projectConfig,
TargetGraphFactory.newInstance(targets),
libraryFactory,
moduleFactory,
new DefaultAggregationModuleFactory(typeRegistry));
}
public static IjProjectElement getProjectElementForTarget(
IjModuleGraph graph, Class<? extends IjProjectElement> type, final TargetNode<?, ?> target) {
return FluentIterable.from(graph.getNodes())
.filter(type)
.firstMatch(
(Predicate<IjProjectElement>)
input ->
FluentIterable.from(input.getTargets())
.anyMatch(input1 -> input1.equals(target.getBuildTarget())))
.get();
}
public static IjModule getModuleForTarget(IjModuleGraph graph, final TargetNode<?, ?> target) {
return (IjModule) getProjectElementForTarget(graph, IjModule.class, target);
}
public static IjLibrary getLibraryForTarget(IjModuleGraph graph, final TargetNode<?, ?> target) {
return (IjLibrary) getProjectElementForTarget(graph, IjLibrary.class, target);
}
}