diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 98a1898d1b8..3eb08482917 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -51,7 +51,8 @@ "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/source.json": "7ebaefba0b03efe59cac88ed5bbc67bcf59a3eff33af937345ede2a38b2d368a", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/MODULE.bazel": "69ad6927098316848b34a9142bcc975e018ba27f08c4ff403f50c1b6e646ca67", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/source.json": "34a3c8bcf233b835eb74be9d628899bb32999d3e0eadef1947a0a562a2b16ffb", "https://bcr.bazel.build/modules/bazel_worker_api/0.0.1/MODULE.bazel": "02a13b77321773b2042e70ee5e4c5e099c8ddee4cf2da9cd420442c36938d4bd", "https://bcr.bazel.build/modules/bazel_worker_api/0.0.4/MODULE.bazel": "460aa12d01231a80cce03c548287b433b321d205b0028ae596728c35e5ee442e", "https://bcr.bazel.build/modules/bazel_worker_api/0.0.4/source.json": "d353c410d47a8b65d09fa98e83d57ebec257a2c2b9c6e42d6fda1cb25e5464a5", diff --git a/aspect/intellij_info_impl.bzl b/aspect/intellij_info_impl.bzl index b7d4d2c15af..dccb436dcf4 100644 --- a/aspect/intellij_info_impl.bzl +++ b/aspect/intellij_info_impl.bzl @@ -311,6 +311,47 @@ def collect_py_info(target, ctx, semantics, ide_info, ide_info_file, output_grou update_sync_output_groups(output_groups, "intellij-resolve-py", to_build) return True +def collect_cc_rule_context(ctx): + """Collect additional information from the rule attributes of cc_xxx rules.""" + + if not ctx.rule.kind.startswith("cc_"): + return struct() + + return struct( + sources = artifacts_from_target_list_attr(ctx, "srcs"), + headers = artifacts_from_target_list_attr(ctx, "hdrs"), + textual_headers = artifacts_from_target_list_attr(ctx, "textual_hdrs"), + copts = expand_make_variables(ctx, True, getattr(ctx.rule.attr, "copts", [])), + args = expand_make_variables(ctx, True, getattr(ctx.rule.attr, "args", [])), + include_prefix = getattr(ctx.rule.attr, "include_prefix", ""), + strip_include_prefix = getattr(ctx.rule.attr, "strip_include_prefix", ""), + ) + +def collect_cc_compilation_context(ctx, target): + """Collect information from the compilation context provided by the CcInfo provider.""" + + compilation_context = target[CcInfo].compilation_context + + # merge current compilation context with context of implementation dependencies + if ctx.rule.kind.startswith("cc_") and hasattr(ctx.rule.attr, "implementation_deps"): + impl_deps = ctx.rule.attr.implementation_deps + + compilation_context = cc_common.merge_compilation_contexts( + compilation_contexts = [compilation_context] + [it[CcInfo].compilation_context for it in impl_deps], + ) + + # external_includes available since bazel 7 + external_includes = getattr(compilation_context, "external_includes", depset()).to_list() + + return struct( + direct_headers = [artifact_location(it) for it in compilation_context.direct_headers], + defines = compilation_context.defines.to_list(), + includes = compilation_context.includes.to_list(), + quote_includes = compilation_context.quote_includes.to_list(), + # both system and external includes are added using `-isystem` + system_includes = compilation_context.system_includes.to_list() + external_includes, + ) + def collect_cpp_info(target, ctx, semantics, ide_info, ide_info_file, output_groups): """Updates C++-specific output groups, returns false if not a C++ target.""" @@ -325,51 +366,11 @@ def collect_cpp_info(target, ctx, semantics, ide_info, ide_info_file, output_gro if ctx.rule.kind.startswith("go_"): return False - sources = artifacts_from_target_list_attr(ctx, "srcs") - headers = artifacts_from_target_list_attr(ctx, "hdrs") - textual_headers = artifacts_from_target_list_attr(ctx, "textual_hdrs") - - target_copts = [] - if hasattr(ctx.rule.attr, "copts"): - target_copts += ctx.rule.attr.copts - extra_targets = [] - if hasattr(ctx.rule.attr, "additional_compiler_inputs"): - extra_targets += ctx.rule.attr.additional_compiler_inputs - if hasattr(semantics, "cc") and hasattr(semantics.cc, "get_default_copts"): - target_copts += semantics.cc.get_default_copts(ctx) - - target_copts = expand_make_variables(ctx, True, target_copts) - args = expand_make_variables(ctx, True, getattr(ctx.rule.attr, "args", [])) - - compilation_context = target[CcInfo].compilation_context - - # Merge current compilation context with context of implementation dependencies. - if hasattr(ctx.rule.attr, "implementation_deps"): - implementation_deps = ctx.rule.attr.implementation_deps - compilation_context = cc_common.merge_compilation_contexts( - compilation_contexts = - [compilation_context] + [impl[CcInfo].compilation_context for impl in implementation_deps], - ) - - # external_includes available since bazel 7 - external_includes = getattr(compilation_context, "external_includes", depset()).to_list() - - c_info = struct_omit_none( - header = headers, - source = sources, - target_copt = target_copts, - textual_header = textual_headers, - transitive_define = compilation_context.defines.to_list(), - transitive_include_directory = compilation_context.includes.to_list(), - transitive_quote_include_directory = compilation_context.quote_includes.to_list(), - # both system and external includes are add using `-isystem` - transitive_system_include_directory = compilation_context.system_includes.to_list() + external_includes, - include_prefix = getattr(ctx.rule.attr, "include_prefix", None), - strip_include_prefix = getattr(ctx.rule.attr, "strip_include_prefix", None), - args = args, + ide_info["c_ide_info"] = struct( + rule_context = collect_cc_rule_context(ctx), + compilation_context = collect_cc_compilation_context(ctx, target), ) - ide_info["c_ide_info"] = c_info - resolve_files = compilation_context.headers + resolve_files = target[CcInfo].compilation_context.headers # TODO(brendandouglas): target to cpp files only compile_files = target[OutputGroupInfo].compilation_outputs if hasattr(target[OutputGroupInfo], "compilation_outputs") else depset([]) diff --git a/aspect/testing/BUILD b/aspect/testing/BUILD index 6435fbebff9..ed768e306b4 100644 --- a/aspect/testing/BUILD +++ b/aspect/testing/BUILD @@ -23,3 +23,21 @@ java_library( "//aspect/testing/rules:IntellijAspectTest", ], ) + +# All aspect tests. +test_suite( + name = "aspect_tests", + tests = [ + "//aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/ccbinary:CcBinaryTest", + "//aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/cclibrary:CcLibraryTest", + "//aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/cctest:CcTestTest", + "//aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/cctoolchain:CcToolchainTest", + "//aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/coptsmakevars:CoptsMakeVarsTest", + "//aspect/testing/tests/src/com/google/idea/blaze/aspect/general/alias:AliasTest", + "//aspect/testing/tests/src/com/google/idea/blaze/aspect/general/analysistest:AnalysisTestTest", + "//aspect/testing/tests/src/com/google/idea/blaze/aspect/general/artifacts:ArtifactTest", + "//aspect/testing/tests/src/com/google/idea/blaze/aspect/general/build:BuildFileTest", + "//aspect/testing/tests/src/com/google/idea/blaze/aspect/general/noide:NoIdeTest", + "//aspect/testing/tests/src/com/google/idea/blaze/aspect/general/tags:TagTest", + ], +) diff --git a/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/ccbinary/BUILD b/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/ccbinary/BUILD index cfbbbbca1f2..0c9fc3122ae 100644 --- a/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/ccbinary/BUILD +++ b/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/ccbinary/BUILD @@ -8,6 +8,7 @@ load( cc_binary( name = "simple", srcs = ["simple/simple.cc"], + args = ["simpleArg"], ) cc_binary( @@ -28,8 +29,8 @@ genrule( intellij_aspect_test_fixture( name = "aspect_fixture", deps = [ - ":simple", ":expand_datadeps", + ":simple", ], ) diff --git a/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/ccbinary/CcBinaryTest.java b/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/ccbinary/CcBinaryTest.java index 0bde868c0ee..5729d3a299f 100644 --- a/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/ccbinary/CcBinaryTest.java +++ b/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/ccbinary/CcBinaryTest.java @@ -31,18 +31,20 @@ public void testCcBinary() throws Exception { final var target = findTarget(testFixture, ":simple"); assertThat(target.getKindString()).isEqualTo("cc_binary"); - assertThat(target.hasCIdeInfo()).isTrue(); - assertThat(target.hasJavaIdeInfo()).isFalse(); - assertThat(target.hasAndroidIdeInfo()).isFalse(); - final var cTargetIdeInfo = target.getCIdeInfo(); + final var ideInfo = target.getCIdeInfo(); + assertThat(ideInfo.hasCompilationContext()).isTrue(); + assertThat(ideInfo.hasRuleContext()).isTrue(); - assertThat(cTargetIdeInfo.getTargetCoptList()).isEmpty(); + // rule context + final var ruleCtx = ideInfo.getRuleContext(); + assertThat(ruleCtx.getCoptsList()).isEmpty(); + assertThat(ruleCtx.getArgs(0)).isEqualTo("simpleArg"); + assertThat(ruleCtx.getSources(0).getRelativePath()).endsWith("simple/simple.cc"); + // output groups assertThat(getOutputGroupFiles(testFixture, "intellij-resolve-cpp")).isEmpty(); assertThat(getOutputGroupFiles(testFixture, "intellij-info-generic")).isEmpty(); - - assertThat(getOutputGroupFiles(testFixture, "intellij-info-cpp")).contains( - testRelative(intellijInfoFileName("simple"))); + assertThat(getOutputGroupFiles(testFixture, "intellij-info-cpp")).contains(testRelative(intellijInfoFileName("simple"))); } @Test @@ -51,9 +53,8 @@ public void testExpandDataDeps() throws Exception { final var target = findTarget(testFixture, ":expand_datadeps"); assertThat(target.getKindString()).isEqualTo("cc_binary"); - final var args = target.getCIdeInfo().getArgsList(); + final var args = target.getCIdeInfo().getRuleContext().getArgsList(); assertThat(args).hasSize(1); - assertThat(args.get(0)).endsWith( - "/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/ccbinary/datadepfile.txt"); + assertThat(args.get(0)).endsWith("datadepfile.txt"); } } diff --git a/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/cclibrary/CcLibraryTest.java b/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/cclibrary/CcLibraryTest.java index 0e3088fb0a7..fdac8e2eedd 100644 --- a/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/cclibrary/CcLibraryTest.java +++ b/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/cclibrary/CcLibraryTest.java @@ -31,35 +31,35 @@ /** Tests cc_library */ @RunWith(JUnit4.class) public class CcLibraryTest extends BazelIntellijAspectTest { + @Test public void testCcLibrary() throws Exception { - IntellijAspectTestFixture testFixture = loadTestFixture(":simple_fixture"); - TargetIdeInfo target = findTarget(testFixture, ":simple"); - + final var testFixture = loadTestFixture(":simple_fixture"); + final var target = findTarget(testFixture, ":simple"); assertThat(target.getKindString()).isEqualTo("cc_library"); - assertThat(target.hasCIdeInfo()).isTrue(); - assertThat(target.hasJavaIdeInfo()).isFalse(); - assertThat(target.hasAndroidIdeInfo()).isFalse(); - assertThat(target.hasPyIdeInfo()).isFalse(); - assertThat(relativePathsForArtifacts(target.getCIdeInfo().getSourceList())) + final var ideInfo = target.getCIdeInfo(); + assertThat(ideInfo.hasCompilationContext()).isTrue(); + assertThat(ideInfo.hasRuleContext()).isTrue(); + + // rule context + final var ruleCtx = target.getCIdeInfo().getRuleContext(); + assertThat(relativePathsForArtifacts(ruleCtx.getSourcesList())) .containsExactly(testRelative("simple/simple.cc")); - assertThat(relativePathsForArtifacts(target.getCIdeInfo().getHeaderList())) + assertThat(relativePathsForArtifacts(ruleCtx.getHeadersList())) .containsExactly(testRelative("simple/simple.h")); - assertThat(relativePathsForArtifacts(target.getCIdeInfo().getTextualHeaderList())) + assertThat(relativePathsForArtifacts(ruleCtx.getTextualHeadersList())) .containsExactly(testRelative("simple/simple_textual.h")); - - CIdeInfo cTargetIdeInfo = target.getCIdeInfo(); - assertThat(cTargetIdeInfo.getTargetCoptList()) + assertThat(ruleCtx.getCoptsList()) .containsExactly("-DGOPT", "-Ifoo/baz/", "-I", "other/headers"); - // Make sure our understanding of where this attributes show up in other providers is correct. - assertThat(cTargetIdeInfo.getTransitiveSystemIncludeDirectoryList()) - .contains(testRelative("foo/bar")); - assertThat(cTargetIdeInfo.getTransitiveDefineList()).contains("VERSION2"); - - List transQuoteIncludeDirList = cTargetIdeInfo.getTransitiveQuoteIncludeDirectoryList(); - assertThat(transQuoteIncludeDirList).contains("."); + // compilation context + final var compilationCtx = target.getCIdeInfo().getCompilationContext(); + assertThat(compilationCtx.getDefinesList()).containsExactly("VERSION2"); + assertThat(compilationCtx.getSystemIncludesList()).contains(testRelative("foo/bar")); + assertThat(compilationCtx.getQuoteIncludesList()).contains("."); + assertThat(relativePathsForArtifacts(compilationCtx.getDirectHeadersList())) + .containsExactly(testRelative("simple/simple.h")); // Can't test for this because the cc code stuffs source artifacts into // the output group @@ -68,21 +68,14 @@ public void testCcLibrary() throws Exception { @Test public void testCcLibraryHasToolchain() throws Exception { - IntellijAspectTestFixture testFixture = loadTestFixture(":simple_fixture"); - List toolchains = - testFixture.getTargetsList().stream() - .filter(x -> x.hasCToolchainIdeInfo() && x.getKindString().equals("cc_toolchain_alias")) - .collect(Collectors.toList()); - // TODO(b/200011173): Remove once Blaze/Bazel has been released with Starlark cc_library. - if (toolchains.isEmpty()) { - toolchains = - testFixture.getTargetsList().stream() - .filter(TargetIdeInfo::hasCToolchainIdeInfo) - .collect(toImmutableList()); - } + final var testFixture = loadTestFixture(":simple_fixture"); + final var toolchains = testFixture.getTargetsList().stream() + .filter(x -> x.hasCToolchainIdeInfo() && x.getKindString().equals("cc_toolchain_alias")) + .collect(Collectors.toList()); + assertThat(toolchains).hasSize(1); - TargetIdeInfo target = findTarget(testFixture, ":simple"); + final var target = findTarget(testFixture, ":simple"); assertThat(dependenciesForTarget(target)).contains(dep(toolchains.get(0))); } @@ -94,16 +87,15 @@ public void testCcDependencies() throws Exception { assertThat(lib1.hasCIdeInfo()).isTrue(); assertThat(lib2.hasCIdeInfo()).isTrue(); - CIdeInfo cIdeInfo1 = lib1.getCIdeInfo(); + final var ruleContext = lib1.getCIdeInfo().getRuleContext(); + final var compilationContext = lib1.getCIdeInfo().getCompilationContext(); - assertThat(cIdeInfo1.getTransitiveSystemIncludeDirectoryList()) - .contains(testRelative("foo/bar")); - assertThat(cIdeInfo1.getTransitiveSystemIncludeDirectoryList()) - .contains(testRelative("baz/lib")); + assertThat(compilationContext.getSystemIncludesList()).contains(testRelative("foo/bar")); + assertThat(compilationContext.getSystemIncludesList()).contains(testRelative("baz/lib")); - assertThat(cIdeInfo1.getTargetCoptList()).containsExactly("-DGOPT", "-Ifoo/baz/"); + assertThat(ruleContext.getCoptsList()).containsExactly("-DGOPT", "-Ifoo/baz/"); - assertThat(cIdeInfo1.getTransitiveDefineList()).contains("VERSION2"); - assertThat(cIdeInfo1.getTransitiveDefineList()).contains("COMPLEX_IMPL"); + assertThat(compilationContext.getDefinesList()).contains("VERSION2"); + assertThat(compilationContext.getDefinesList()).contains("COMPLEX_IMPL"); } } diff --git a/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/cctest/CcTestTest.java b/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/cctest/CcTestTest.java index 3ece3d23b59..4098868349e 100644 --- a/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/cctest/CcTestTest.java +++ b/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/cctest/CcTestTest.java @@ -39,7 +39,7 @@ public void testCcTest() throws Exception { assertThat(target.hasAndroidIdeInfo()).isFalse(); CIdeInfo cTargetIdeInfo = target.getCIdeInfo(); - assertThat(cTargetIdeInfo.getTargetCoptList()).isEmpty(); + assertThat(cTargetIdeInfo.getRuleContext().getCoptsList()).isEmpty(); // Can't test for this because the cc code stuffs source // artifacts into the output group diff --git a/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/coptsmakevars/CoptsMakeVarsTest.java b/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/coptsmakevars/CoptsMakeVarsTest.java index 7949b54581d..bc7055c913b 100644 --- a/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/coptsmakevars/CoptsMakeVarsTest.java +++ b/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/coptsmakevars/CoptsMakeVarsTest.java @@ -39,32 +39,32 @@ private CIdeInfo getCIdeInfo(String targetName) throws IOException { @Test public void testCoptsPrefinedMakeVars() throws IOException { final var ideInfo = getCIdeInfo(":simple_prefined"); - assertThat(ideInfo.getTargetCoptList()).hasSize(2); + assertThat(ideInfo.getRuleContext().getCoptsList()).hasSize(2); // These predefined variables' values are dependent on build system and configuration. - assertThat(ideInfo.getTargetCoptList().get(0)).containsMatch("^-DPREFINED_BINDIR=bazel-out/[0-9a-z_-]+/bin$"); - assertThat(ideInfo.getTargetCoptList().get(1)).isEqualTo("-DPREFINED_BINDIR2=$(BINDIR)"); + assertThat(ideInfo.getRuleContext().getCoptsList().get(0)).containsMatch("^-DPREFINED_BINDIR=bazel-out/[0-9a-z_-]+/bin$"); + assertThat(ideInfo.getRuleContext().getCoptsList().get(1)).isEqualTo("-DPREFINED_BINDIR2=$(BINDIR)"); } @Test public void testCoptsEmptyVariable() throws IOException { final var ideInfo = getCIdeInfo(":empty_variable"); - assertThat(ideInfo.getTargetCoptList()).hasSize(1); - assertThat(ideInfo.getTargetCoptList()).contains("-Wall"); + assertThat(ideInfo.getRuleContext().getCoptsList()).hasSize(1); + assertThat(ideInfo.getRuleContext().getCoptsList()).contains("-Wall"); } @Test public void testCoptsMakeVars() throws IOException { final var ideInfo = getCIdeInfo(":simple_make_var"); - assertThat(ideInfo.getTargetCoptList()).hasSize(4); + assertThat(ideInfo.getRuleContext().getCoptsList()).hasSize(4); - assertThat(ideInfo.getTargetCopt(0)).isEqualTo( + assertThat(ideInfo.getRuleContext().getCopts(0)).isEqualTo( "-DEXECPATH=\"aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/coptsmakevars/simple/simple.cc\""); - assertThat(ideInfo.getTargetCopt(1)).isEqualTo( + assertThat(ideInfo.getRuleContext().getCopts(1)).isEqualTo( "-DROOTPATH=\"aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/coptsmakevars/simple/simple.cc\""); - assertThat(ideInfo.getTargetCopt(2)).isEqualTo( + assertThat(ideInfo.getRuleContext().getCopts(2)).isEqualTo( "-DRLOCATIONPATH=\"_main/aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/coptsmakevars/simple/simple.cc\""); - assertThat(ideInfo.getTargetCopt(3)).isEqualTo( + assertThat(ideInfo.getRuleContext().getCopts(3)).isEqualTo( "-DLOCATION=\"aspect/testing/tests/src/com/google/idea/blaze/aspect/cpp/coptsmakevars/simple/simple.cc\""); } } diff --git a/aspect/testing/tests/src/com/google/idea/blaze/aspect/general/artifacts/ArtifactTest.java b/aspect/testing/tests/src/com/google/idea/blaze/aspect/general/artifacts/ArtifactTest.java index 68821bbb87b..faffabc5dff 100644 --- a/aspect/testing/tests/src/com/google/idea/blaze/aspect/general/artifacts/ArtifactTest.java +++ b/aspect/testing/tests/src/com/google/idea/blaze/aspect/general/artifacts/ArtifactTest.java @@ -33,7 +33,7 @@ public void testSourceFilesAreCorrectlyMarkedAsSourceOrGenerated() throws Except IntellijAspectTestFixture testFixture = loadTestFixture(":gen_sources_fixture"); TargetIdeInfo source = findTarget(testFixture, ":source"); TargetIdeInfo gen = findTarget(testFixture, ":gen"); - assertThat(getOnlyElement(source.getCIdeInfo().getSourceList()).getIsSource()).isTrue(); - assertThat(getOnlyElement(gen.getCIdeInfo().getSourceList()).getIsSource()).isFalse(); + assertThat(getOnlyElement(source.getCIdeInfo().getRuleContext().getSourcesList()).getIsSource()).isTrue(); + assertThat(getOnlyElement(gen.getCIdeInfo().getRuleContext().getSourcesList()).getIsSource()).isFalse(); } } diff --git a/base/src/com/google/idea/blaze/base/ideinfo/CIdeInfo.java b/base/src/com/google/idea/blaze/base/ideinfo/CIdeInfo.java index 3597928cf2c..93c125a30c2 100644 --- a/base/src/com/google/idea/blaze/base/ideinfo/CIdeInfo.java +++ b/base/src/com/google/idea/blaze/base/ideinfo/CIdeInfo.java @@ -15,322 +15,193 @@ */ package com.google.idea.blaze.base.ideinfo; +import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableList; import com.google.devtools.intellij.ideinfo.IntellijIdeInfo; -import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.google.idea.blaze.base.model.primitives.ExecutionRootPath; -import java.util.Objects; - -/** Ide info specific to cc rules. */ -public final class CIdeInfo implements ProtoWrapper { - private final ImmutableList sources; - private final ImmutableList headers; - private final ImmutableList textualHeaders; - - private final ImmutableList localCopts; - // From the cpp compilation context provider. - // These should all be for the entire transitive closure. - private final ImmutableList transitiveIncludeDirectories; - private final ImmutableList transitiveQuoteIncludeDirectories; - private final ImmutableList transitiveDefines; - private final ImmutableList transitiveSystemIncludeDirectories; - - private final String includePrefix; - private final String stripIncludePrefix; - - private final ImmutableList args; - - private CIdeInfo( - ImmutableList sources, - ImmutableList headers, - ImmutableList textualHeaders, - ImmutableList localCopts, - ImmutableList transitiveIncludeDirectories, - ImmutableList transitiveQuoteIncludeDirectories, - ImmutableList transitiveDefines, - ImmutableList transitiveSystemIncludeDirectories, - String includePrefix, - String stripIncludePrefix, - ImmutableList args) { - this.sources = sources; - this.headers = headers; - this.textualHeaders = textualHeaders; - this.localCopts = localCopts; - this.transitiveIncludeDirectories = transitiveIncludeDirectories; - this.transitiveQuoteIncludeDirectories = transitiveQuoteIncludeDirectories; - this.transitiveDefines = transitiveDefines; - this.transitiveSystemIncludeDirectories = transitiveSystemIncludeDirectories; - this.includePrefix = includePrefix; - this.stripIncludePrefix = stripIncludePrefix; - this.args = args; - } - static CIdeInfo fromProto(IntellijIdeInfo.CIdeInfo proto) { - return new CIdeInfo( - ProtoWrapper.map(proto.getSourceList(), ArtifactLocation::fromProto), - ProtoWrapper.map(proto.getHeaderList(), ArtifactLocation::fromProto), - ProtoWrapper.map(proto.getTextualHeaderList(), ArtifactLocation::fromProto), - ProtoWrapper.internStrings(proto.getTargetCoptList()), - ProtoWrapper.map(proto.getTransitiveIncludeDirectoryList(), ExecutionRootPath::fromProto), - ProtoWrapper.map( - proto.getTransitiveQuoteIncludeDirectoryList(), ExecutionRootPath::fromProto), - ProtoWrapper.internStrings(proto.getTransitiveDefineList()), - ProtoWrapper.map( - proto.getTransitiveSystemIncludeDirectoryList(), ExecutionRootPath::fromProto), - proto.getIncludePrefix(), - proto.getStripIncludePrefix(), - ProtoWrapper.internStrings(proto.getArgsList())); - } +/** + * Ide info specific to cc rules. + */ +@AutoValue +public abstract class CIdeInfo implements ProtoWrapper { - @Override - public IntellijIdeInfo.CIdeInfo toProto() { - return IntellijIdeInfo.CIdeInfo.newBuilder() - .addAllSource(ProtoWrapper.mapToProtos(sources)) - .addAllHeader(ProtoWrapper.mapToProtos(headers)) - .addAllTextualHeader(ProtoWrapper.mapToProtos(textualHeaders)) - .addAllTargetCopt(localCopts) - .addAllTransitiveIncludeDirectory(ProtoWrapper.mapToProtos(transitiveIncludeDirectories)) - .addAllTransitiveQuoteIncludeDirectory( - ProtoWrapper.mapToProtos(transitiveQuoteIncludeDirectories)) - .addAllTransitiveDefine(transitiveDefines) - .addAllTransitiveSystemIncludeDirectory( - ProtoWrapper.mapToProtos(transitiveSystemIncludeDirectories)) - .addAllArgs(args) - .build(); - } + @AutoValue + public static abstract class RuleContext implements ProtoWrapper { - public ImmutableList getSources() { - return sources; - } + private static final RuleContext EMPTY = builder().build(); - public ImmutableList getHeaders() { - return headers; - } + public abstract ImmutableList sources(); - public ImmutableList getTextualHeaders() { - return textualHeaders; - } + public abstract ImmutableList headers(); - public ImmutableList getLocalCopts() { - return localCopts; - } + public abstract ImmutableList textualHeaders(); - public ImmutableList getTransitiveIncludeDirectories() { - return transitiveIncludeDirectories; - } + public abstract ImmutableList copts(); - public ImmutableList getTransitiveQuoteIncludeDirectories() { - return transitiveQuoteIncludeDirectories; - } + public abstract ImmutableList args(); - public ImmutableList getTransitiveDefines() { - return transitiveDefines; - } + public abstract String includePrefix(); - public ImmutableList getTransitiveSystemIncludeDirectories() { - return transitiveSystemIncludeDirectories; - } + public abstract String stripIncludePrefix(); - public String getIncludePrefix() { - return includePrefix; - } + public static CIdeInfo.RuleContext fromProto(IntellijIdeInfo.CIdeInfo.RuleContext proto) { + return builder() + .setSources(ProtoWrapper.map(proto.getSourcesList(), ArtifactLocation::fromProto)) + .setHeaders(ProtoWrapper.map(proto.getHeadersList(), ArtifactLocation::fromProto)) + .setTextualHeaders(ProtoWrapper.map(proto.getTextualHeadersList(), ArtifactLocation::fromProto)) + .setCopts(ProtoWrapper.internStrings(proto.getCoptsList())) + .setArgs(ProtoWrapper.internStrings(proto.getArgsList())) + .setIncludePrefix(ProtoWrapper.internString(proto.getIncludePrefix())) + .setStripIncludePrefix(ProtoWrapper.internString(proto.getStripIncludePrefix())) + .build(); + } - public String getStripIncludePrefix() { - return stripIncludePrefix; - } + @Override + public IntellijIdeInfo.CIdeInfo.RuleContext toProto() { + return IntellijIdeInfo.CIdeInfo.RuleContext.newBuilder() + .addAllSources(ProtoWrapper.mapToProtos(sources())) + .addAllHeaders(ProtoWrapper.mapToProtos(headers())) + .addAllTextualHeaders(ProtoWrapper.mapToProtos(textualHeaders())) + .addAllCopts(copts()) + .addAllArgs(args()) + .setIncludePrefix(includePrefix()) + .setStripIncludePrefix(stripIncludePrefix()) + .build(); + } - public ImmutableList getArgs() { - return args; - } + public static Builder builder() { + return new AutoValue_CIdeInfo_RuleContext.Builder() + .setSources(ImmutableList.of()) + .setHeaders(ImmutableList.of()) + .setTextualHeaders(ImmutableList.of()) + .setCopts(ImmutableList.of()) + .setArgs(ImmutableList.of()) + .setIncludePrefix("") + .setStripIncludePrefix(""); + } - public static Builder builder() { - return new Builder(); - } + @AutoValue.Builder + public abstract static class Builder { - /** Builder for c rule info */ - public static class Builder { - private final ImmutableList.Builder sources = ImmutableList.builder(); - private final ImmutableList.Builder headers = ImmutableList.builder(); - private final ImmutableList.Builder textualHeaders = ImmutableList.builder(); - - private final ImmutableList.Builder localCopts = ImmutableList.builder(); - private final ImmutableList.Builder transitiveIncludeDirectories = - ImmutableList.builder(); - private final ImmutableList.Builder transitiveQuoteIncludeDirectories = - ImmutableList.builder(); - private final ImmutableList.Builder transitiveDefines = ImmutableList.builder(); - private final ImmutableList.Builder transitiveSystemIncludeDirectories = - ImmutableList.builder(); - - private String includePrefix = ""; - private String stripIncludePrefix = ""; - - private final ImmutableList.Builder args = ImmutableList.builder(); - - @CanIgnoreReturnValue - public Builder addSources(Iterable sources) { - this.sources.addAll(sources); - return this; - } + public abstract Builder setSources(ImmutableList value); - @CanIgnoreReturnValue - public Builder addSource(ArtifactLocation source) { - this.sources.add(source); - return this; - } + public abstract Builder setHeaders(ImmutableList value); - @CanIgnoreReturnValue - public Builder addHeaders(Iterable headers) { - this.headers.addAll(headers); - return this; - } + public abstract Builder setTextualHeaders(ImmutableList value); - @CanIgnoreReturnValue - public Builder addHeader(ArtifactLocation header) { - this.headers.add(header); - return this; - } + public abstract Builder setCopts(ImmutableList value); - @CanIgnoreReturnValue - public Builder addTextualHeaders(Iterable textualHeaders) { - this.textualHeaders.addAll(textualHeaders); - return this; - } + public abstract Builder setArgs(ImmutableList value); - @CanIgnoreReturnValue - public Builder addTextualHeader(ArtifactLocation textualHeader) { - this.textualHeaders.add(textualHeader); - return this; - } + public abstract Builder setIncludePrefix(String value); - @CanIgnoreReturnValue - public Builder addLocalCopts(Iterable copts) { - this.localCopts.addAll(copts); - return this; - } + public abstract Builder setStripIncludePrefix(String value); - @CanIgnoreReturnValue - public Builder addTransitiveIncludeDirectories( - Iterable transitiveIncludeDirectories) { - this.transitiveIncludeDirectories.addAll(transitiveIncludeDirectories); - return this; + public abstract RuleContext build(); } + } - @CanIgnoreReturnValue - public Builder addTransitiveQuoteIncludeDirectories( - Iterable transitiveQuoteIncludeDirectories) { - this.transitiveQuoteIncludeDirectories.addAll(transitiveQuoteIncludeDirectories); - return this; - } + @AutoValue + public static abstract class CompilationContext implements ProtoWrapper { - @CanIgnoreReturnValue - public Builder addTransitiveDefines(Iterable transitiveDefines) { - this.transitiveDefines.addAll(transitiveDefines); - return this; - } + private static final CompilationContext EMPTY = builder().build(); + + public abstract ImmutableList directHeaders(); + + public abstract ImmutableList defines(); + + public abstract ImmutableList includes(); + + public abstract ImmutableList quoteIncludes(); + + public abstract ImmutableList systemIncludes(); - @CanIgnoreReturnValue - public Builder addTransitiveSystemIncludeDirectories( - Iterable transitiveSystemIncludeDirectories) { - this.transitiveSystemIncludeDirectories.addAll(transitiveSystemIncludeDirectories); - return this; + public static CIdeInfo.CompilationContext fromProto(IntellijIdeInfo.CIdeInfo.CompilationContext proto) { + return builder() + .setDirectHeaders(ProtoWrapper.map(proto.getDirectHeadersList(), ArtifactLocation::fromProto)) + .setDefines(ProtoWrapper.internStrings(proto.getDefinesList())) + .setIncludes(ProtoWrapper.map(proto.getIncludesList(), ExecutionRootPath::fromProto)) + .setQuoteIncludes(ProtoWrapper.map(proto.getQuoteIncludesList(), ExecutionRootPath::fromProto)) + .setSystemIncludes(ProtoWrapper.map(proto.getSystemIncludesList(), ExecutionRootPath::fromProto)) + .build(); } - @CanIgnoreReturnValue - public Builder setIncludePrefix(String includePrefix) { - this.includePrefix = includePrefix; - return this; + @Override + public IntellijIdeInfo.CIdeInfo.CompilationContext toProto() { + return IntellijIdeInfo.CIdeInfo.CompilationContext.newBuilder() + .addAllDirectHeaders(ProtoWrapper.mapToProtos(directHeaders())) + .addAllDefines(defines()) + .addAllIncludes(ProtoWrapper.mapToProtos(includes())) + .addAllQuoteIncludes(ProtoWrapper.mapToProtos(quoteIncludes())) + .addAllSystemIncludes(ProtoWrapper.mapToProtos(systemIncludes())) + .build(); } - @CanIgnoreReturnValue - public Builder setStripIncludePrefix(String stripIncludePrefix) { - this.stripIncludePrefix = stripIncludePrefix; - return this; + public static Builder builder() { + return new AutoValue_CIdeInfo_CompilationContext.Builder() + .setDirectHeaders(ImmutableList.of()) + .setDefines(ImmutableList.of()) + .setIncludes(ImmutableList.of()) + .setQuoteIncludes(ImmutableList.of()) + .setSystemIncludes(ImmutableList.of()); } - public CIdeInfo build() { - return new CIdeInfo( - sources.build(), - headers.build(), - textualHeaders.build(), - localCopts.build(), - transitiveIncludeDirectories.build(), - transitiveQuoteIncludeDirectories.build(), - transitiveDefines.build(), - transitiveSystemIncludeDirectories.build(), - includePrefix, - stripIncludePrefix, - args.build()); + @AutoValue.Builder + public abstract static class Builder { + + public abstract Builder setDirectHeaders(ImmutableList value); + + public abstract Builder setDefines(ImmutableList value); + + public abstract Builder setIncludes(ImmutableList value); + + public abstract Builder setQuoteIncludes(ImmutableList value); + + public abstract Builder setSystemIncludes(ImmutableList value); + + public abstract CompilationContext build(); } } - @Override - public String toString() { - return "CIdeInfo{" - + "\n" - + " sources=" - + getSources() - + "\n" - + " headers=" - + getHeaders() - + "\n" - + " textualHeaders=" - + getTextualHeaders() - + "\n" - + " localCopts=" - + getLocalCopts() - + "\n" - + " transitiveIncludeDirectories=" - + getTransitiveIncludeDirectories() - + "\n" - + " transitiveQuoteIncludeDirectories=" - + getTransitiveQuoteIncludeDirectories() - + "\n" - + " transitiveDefines=" - + getTransitiveDefines() - + "\n" - + " transitiveSystemIncludeDirectories=" - + getTransitiveSystemIncludeDirectories() - + "\n" - + " args=" - + getArgs() - + "\n" - + '}'; - } + public abstract RuleContext ruleContext(); - @Override - public boolean equals(Object o) { - if (this == o) { - return true; + public abstract CompilationContext compilationContext(); + + public static CIdeInfo fromProto(IntellijIdeInfo.CIdeInfo proto) { + final var builder = builder(); + + if (proto.hasRuleContext()) { + builder.setRuleContext(RuleContext.fromProto(proto.getRuleContext())); } - if (o == null || getClass() != o.getClass()) { - return false; + if (proto.hasCompilationContext()) { + builder.setCompilationContext(CompilationContext.fromProto(proto.getCompilationContext())); } - CIdeInfo cIdeInfo = (CIdeInfo) o; - return Objects.equals(sources, cIdeInfo.sources) - && Objects.equals(headers, cIdeInfo.headers) - && Objects.equals(textualHeaders, cIdeInfo.textualHeaders) - && Objects.equals(localCopts, cIdeInfo.localCopts) - && Objects.equals(transitiveIncludeDirectories, cIdeInfo.transitiveIncludeDirectories) - && Objects.equals( - transitiveQuoteIncludeDirectories, cIdeInfo.transitiveQuoteIncludeDirectories) - && Objects.equals(transitiveDefines, cIdeInfo.transitiveDefines) - && Objects.equals( - transitiveSystemIncludeDirectories, cIdeInfo.transitiveSystemIncludeDirectories) - && Objects.equals(args, cIdeInfo.args); + + return builder.build(); } @Override - public int hashCode() { - return Objects.hash( - sources, - headers, - textualHeaders, - localCopts, - transitiveIncludeDirectories, - transitiveQuoteIncludeDirectories, - transitiveDefines, - transitiveSystemIncludeDirectories, - args); + public IntellijIdeInfo.CIdeInfo toProto() { + return IntellijIdeInfo.CIdeInfo.newBuilder() + .setCompilationContext(compilationContext().toProto()) + .setRuleContext(ruleContext().toProto()) + .build(); + } + + public static Builder builder() { + return new AutoValue_CIdeInfo.Builder() + .setRuleContext(RuleContext.EMPTY) + .setCompilationContext(CompilationContext.EMPTY); + } + + @AutoValue.Builder + public abstract static class Builder { + + public abstract Builder setRuleContext(RuleContext value); + + public abstract Builder setCompilationContext(CompilationContext value); + + public abstract CIdeInfo build(); } } diff --git a/base/src/com/google/idea/blaze/base/ideinfo/ProtoWrapper.java b/base/src/com/google/idea/blaze/base/ideinfo/ProtoWrapper.java index 67d49c721e7..9e0a6041239 100644 --- a/base/src/com/google/idea/blaze/base/ideinfo/ProtoWrapper.java +++ b/base/src/com/google/idea/blaze/base/ideinfo/ProtoWrapper.java @@ -63,6 +63,10 @@ static ImmutableList internStrings(Iterable iterable) { return map(iterable, ProjectDataInterner::intern); } + static String internString(String string) { + return ProjectDataInterner.intern(string); + } + static

void unwrapAndSetIfNotNull(Consumer

setter, @Nullable ProtoWrapper

wrapper) { if (wrapper != null) { setter.accept(wrapper.toProto()); diff --git a/base/src/com/google/idea/blaze/base/ideinfo/TargetIdeInfo.java b/base/src/com/google/idea/blaze/base/ideinfo/TargetIdeInfo.java index 4972f8d49d2..112d424c854 100644 --- a/base/src/com/google/idea/blaze/base/ideinfo/TargetIdeInfo.java +++ b/base/src/com/google/idea/blaze/base/ideinfo/TargetIdeInfo.java @@ -120,9 +120,9 @@ public static TargetIdeInfo fromProto( CIdeInfo cIdeInfo = null; if (proto.hasCIdeInfo()) { cIdeInfo = CIdeInfo.fromProto(proto.getCIdeInfo()); - sourcesBuilder.addAll(cIdeInfo.getSources()); - sourcesBuilder.addAll(cIdeInfo.getHeaders()); - sourcesBuilder.addAll(cIdeInfo.getTextualHeaders()); + sourcesBuilder.addAll(cIdeInfo.ruleContext().sources()); + sourcesBuilder.addAll(cIdeInfo.ruleContext().headers()); + sourcesBuilder.addAll(cIdeInfo.ruleContext().textualHeaders()); } JavaIdeInfo javaIdeInfo = null; if (proto.hasJavaIdeInfo()) { @@ -471,9 +471,12 @@ public Builder setJavaInfo(JavaIdeInfo.Builder builder) { @CanIgnoreReturnValue public Builder setCInfo(CIdeInfo.Builder cInfoBuilder) { this.cIdeInfo = cInfoBuilder.build(); - this.sources.addAll(cIdeInfo.getSources()); - this.sources.addAll(cIdeInfo.getHeaders()); - this.sources.addAll(cIdeInfo.getTextualHeaders()); + + // used only for testing, no need to extract additional source from the compilation context + this.sources.addAll(cIdeInfo.ruleContext().sources()); + this.sources.addAll(cIdeInfo.ruleContext().headers()); + this.sources.addAll(cIdeInfo.ruleContext().textualHeaders()); + return this; } diff --git a/base/src/com/google/idea/blaze/base/sync/workspace/VirtualIncludesHandler.java b/base/src/com/google/idea/blaze/base/sync/workspace/VirtualIncludesHandler.java index d1651410fe3..9ca878e515f 100644 --- a/base/src/com/google/idea/blaze/base/sync/workspace/VirtualIncludesHandler.java +++ b/base/src/com/google/idea/blaze/base/sync/workspace/VirtualIncludesHandler.java @@ -96,12 +96,12 @@ static ImmutableList resolveVirtualInclude( return ImmutableList.of(); } - if (!cIdeInfo.getIncludePrefix().isEmpty()) { + if (!cIdeInfo.ruleContext().includePrefix().isEmpty()) { // it is not possible to handle include prefixes here, fallback to virtual include directory return ImmutableList.of(); } - var stripPrefix = cIdeInfo.getStripIncludePrefix(); + var stripPrefix = cIdeInfo.ruleContext().stripIncludePrefix(); if (stripPrefix == null || stripPrefix.isBlank()) { return ImmutableList.of(); } diff --git a/base/tests/unittests/com/google/idea/blaze/base/sync/workspace/ExecutionRootPathResolverTest.java b/base/tests/unittests/com/google/idea/blaze/base/sync/workspace/ExecutionRootPathResolverTest.java index e1dd7155c1a..544e367b165 100644 --- a/base/tests/unittests/com/google/idea/blaze/base/sync/workspace/ExecutionRootPathResolverTest.java +++ b/base/tests/unittests/com/google/idea/blaze/base/sync/workspace/ExecutionRootPathResolverTest.java @@ -98,14 +98,14 @@ private static String getStripPrefix(TargetName targetName) { private static TargetIdeInfo getTargetIdeInfo(TargetName targetName) { String stripPrefix = getStripPrefix(targetName); - CIdeInfo.Builder cIdeInfoBuilder = CIdeInfo.builder().setStripIncludePrefix(stripPrefix); + final var ruleContextBuilder = CIdeInfo.RuleContext.builder(); + ruleContextBuilder.setStripIncludePrefix(stripPrefix); + if (targetName.equals(TARGET_WITH_INCLUDE_PREFIX)) { - cIdeInfoBuilder.setIncludePrefix(INCLUDE_PREFIX); + ruleContextBuilder.setIncludePrefix(INCLUDE_PREFIX); } - return TargetIdeInfo.builder() - .setCInfo(cIdeInfoBuilder) - .build(); + return TargetIdeInfo.builder().setCInfo(CIdeInfo.builder().setRuleContext(ruleContextBuilder.build())).build(); } @NotNull diff --git a/clwb/clwb.bazelproject b/clwb/clwb.bazelproject index acf0f1c1eda..0dc78616dcf 100644 --- a/clwb/clwb.bazelproject +++ b/clwb/clwb.bazelproject @@ -1,17 +1,13 @@ directories: . - -ijwb - -aswb - -plugin_dev -examples - -java - -golang -clwb/tests/projects - -testing/test_deps/projects targets: //clwb:all //clwb:clwb_bazel_dev + //aspect/testing:aspect_tests + //cpp:unit_tests workspace_type: intellij_plugin diff --git a/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrLauncher.java b/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrLauncher.java index 169c54df3f2..a9191c929aa 100644 --- a/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrLauncher.java +++ b/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrLauncher.java @@ -245,7 +245,7 @@ private ImmutableList getTargetArguments(TargetExpression target) { .stream() .map(TargetIdeInfo::getcIdeInfo) .filter(Objects::nonNull) - .flatMap(it -> it.getArgs().stream()) + .flatMap(it -> it.ruleContext().args().stream()) .collect(ImmutableList.toImmutableList()); } diff --git a/cpp/src/com/google/idea/blaze/cpp/BlazeCWorkspace.java b/cpp/src/com/google/idea/blaze/cpp/BlazeCWorkspace.java index 8744795fb6d..378dee98d3b 100644 --- a/cpp/src/com/google/idea/blaze/cpp/BlazeCWorkspace.java +++ b/cpp/src/com/google/idea/blaze/cpp/BlazeCWorkspace.java @@ -20,10 +20,10 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.errorprone.annotations.Keep; -import com.google.idea.blaze.base.ideinfo.TargetIdeInfo; import com.google.idea.blaze.base.ideinfo.TargetKey; import com.google.idea.blaze.base.model.BlazeProjectData; import com.google.idea.blaze.base.model.primitives.ExecutionRootPath; +import com.google.idea.blaze.base.model.primitives.LanguageClass; import com.google.idea.blaze.base.model.primitives.WorkspaceRoot; import com.google.idea.blaze.base.projectview.ProjectViewSet; import com.google.idea.blaze.base.scope.BlazeContext; @@ -43,14 +43,12 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.MultiMap; import com.jetbrains.cidr.lang.CLanguageKind; import com.jetbrains.cidr.lang.OCLanguageKind; import com.jetbrains.cidr.lang.toolchains.CidrCompilerSwitches; -import com.jetbrains.cidr.lang.toolchains.CidrSwitchBuilder; import com.jetbrains.cidr.lang.toolchains.CidrToolEnvironment; import com.jetbrains.cidr.lang.workspace.OCCompilerSettings; import com.jetbrains.cidr.lang.workspace.OCResolveConfiguration; @@ -245,32 +243,38 @@ private WorkspaceModel calculateConfigurations( Map configLanguages = new HashMap<>(); Map configSourceFiles = new HashMap<>(); for (TargetKey targetKey : resolveConfiguration.getTargets()) { - TargetIdeInfo targetIdeInfo = blazeProjectData.getTargetMap().get(targetKey); - if (targetIdeInfo == null || targetIdeInfo.getcIdeInfo() == null) { + final var targetIdeInfo = blazeProjectData.getTargetMap().get(targetKey); + if (targetIdeInfo == null || !targetIdeInfo.getKind().hasLanguage(LanguageClass.C)) { continue; } + final var cIdeInfo = targetIdeInfo.getcIdeInfo(); + if (cIdeInfo == null) { + continue; + } + + final var compilationCtx = cIdeInfo.compilationContext(); + // defines and include directories are the same for all sources in a given target, so lets // collect them once and reuse for each source file's options final var compilerSwitchesBuilder = compilerSettings.createSwitchBuilder(); CoptsProcessor.apply( - /* options = */ targetIdeInfo.getcIdeInfo().getLocalCopts(), + /* options = */ cIdeInfo.ruleContext().copts(), /* kind = */ compilerSettings.getCompilerKind(), /* sink = */ compilerSwitchesBuilder, /* resolver = */ executionRootPathResolver ); // transitiveDefines are sourced from a target's (and transitive deps) "defines" attribute - targetIdeInfo.getcIdeInfo().getTransitiveDefines() - .forEach(compilerSwitchesBuilder::withMacro); + compilationCtx.defines().forEach(compilerSwitchesBuilder::withMacro); Function> resolver = executionRootPath -> executionRootPathResolver.resolveToIncludeDirectories(executionRootPath).stream(); // transitiveIncludeDirectories are sourced from CcSkylarkApiProvider.include_directories - targetIdeInfo.getcIdeInfo().getTransitiveIncludeDirectories().stream() + compilationCtx.includes().stream() .flatMap(resolver) .filter(configResolveData::isValidHeaderRoot) .map(File::getAbsolutePath) @@ -278,9 +282,7 @@ private WorkspaceModel calculateConfigurations( // transitiveQuoteIncludeDirectories are sourced from // CcSkylarkApiProvider.quote_include_directories - final var quoteIncludePaths = targetIdeInfo.getcIdeInfo() - .getTransitiveQuoteIncludeDirectories() - .stream() + final var quoteIncludePaths = compilationCtx.quoteIncludes().stream() .flatMap(resolver) .filter(configResolveData::isValidHeaderRoot) .map(File::getAbsolutePath) @@ -291,7 +293,7 @@ private WorkspaceModel calculateConfigurations( // CcSkylarkApiProvider.system_include_directories // Note: We would ideally use -isystem here, but it interacts badly with the switches // that get built by ClangUtils::addIncludeDirectories (it uses -I for system libraries). - targetIdeInfo.getcIdeInfo().getTransitiveSystemIncludeDirectories().stream() + compilationCtx.systemIncludes().stream() .flatMap(resolver) .filter(configResolveData::isValidHeaderRoot) .map(File::getAbsolutePath) @@ -303,7 +305,7 @@ private WorkspaceModel calculateConfigurations( buildSwitchBuilder(compilerSettings, compilerSwitchesBuilder, executionRootPathResolver, CLanguageKind.CPP); for (VirtualFile vf : resolveConfiguration.getSources(targetKey)) { - OCLanguageKind kind = resolveConfiguration.getDeclaredLanguageKind(vf); + OCLanguageKind kind = resolveConfiguration.getDeclaredLanguageKind(project, vf); final PerFileCompilerOpts perFileCompilerOpts; if (kind == CLanguageKind.C) { diff --git a/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationResolver.java b/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationResolver.java index 65720d59101..e928d3a210a 100644 --- a/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationResolver.java +++ b/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationResolver.java @@ -154,15 +154,20 @@ private static WorkspacePath getWorkspacePathForExternalTarget( } private static boolean containsCompiledSources(TargetIdeInfo target) { - Predicate isCompiled = - location -> { - String locationExtension = FileUtilRt.getExtension(location.getRelativePath()); - return CFileExtensions.SOURCE_EXTENSIONS.contains(locationExtension); - }; - return target.getcIdeInfo() != null - && target.getcIdeInfo().getSources().stream() - .filter(ArtifactLocation::isSource) - .anyMatch(isCompiled); + Predicate isCompiled = location -> { + String locationExtension = FileUtilRt.getExtension(location.getRelativePath()); + return CFileExtensions.SOURCE_EXTENSIONS.contains(locationExtension); + }; + + final var cIdeInfo = target.getcIdeInfo(); + if (cIdeInfo == null) { + return false; + } + + return cIdeInfo.ruleContext().sources() + .stream() + .filter(ArtifactLocation::isSource) + .anyMatch(isCompiled); } private void buildBlazeConfigurationData( @@ -234,7 +239,7 @@ private static void findEquivalenceClasses( Collection targets = entry.getValue(); dataToConfiguration.put( data, - BlazeResolveConfiguration.createForTargets(project, blazeProjectData, data, targets)); + BlazeResolveConfiguration.create(project, blazeProjectData, data, targets)); } context.output( PrintOutput.log( diff --git a/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationResolverResult.java b/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationResolverResult.java index 294a22e77c8..13410d504f7 100644 --- a/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationResolverResult.java +++ b/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationResolverResult.java @@ -86,7 +86,7 @@ boolean isEquivalentConfigurations(BlazeConfigurationResolverResult other) { BlazeResolveConfiguration config = mapEntry.getValue(); BlazeResolveConfiguration otherConfig = other.uniqueResolveConfigurations.get(mapEntry.getKey()); - if (otherConfig == null || !config.isEquivalentConfigurations(otherConfig)) { + if (!config.equals(otherConfig)) { return false; } } diff --git a/cpp/src/com/google/idea/blaze/cpp/BlazeResolveConfiguration.java b/cpp/src/com/google/idea/blaze/cpp/BlazeResolveConfiguration.java deleted file mode 100644 index 1b954c9b8a6..00000000000 --- a/cpp/src/com/google/idea/blaze/cpp/BlazeResolveConfiguration.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * 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.idea.blaze.cpp; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableCollection; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.idea.blaze.base.ideinfo.ArtifactLocation; -import com.google.idea.blaze.base.ideinfo.TargetIdeInfo; -import com.google.idea.blaze.base.ideinfo.TargetKey; -import com.google.idea.blaze.base.io.VirtualFileSystemProvider; -import com.google.idea.blaze.base.model.BlazeProjectData; -import com.google.idea.blaze.base.model.primitives.ExecutionRootPath; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.cidr.lang.CLanguageKind; -import com.jetbrains.cidr.lang.OCFileTypeHelpers; -import com.jetbrains.cidr.lang.OCLanguageKind; -import com.jetbrains.cidr.lang.workspace.OCResolveConfiguration; -import java.io.File; -import java.util.Collection; -import java.util.List; -import javax.annotation.Nullable; - -/** A clustering of "equivalent" Blaze targets for creating {@link OCResolveConfiguration}. */ -final class BlazeResolveConfiguration { - - private final Project project; - private final BlazeResolveConfigurationData configurationData; - - private final String displayNameIdentifier; - private final ImmutableList targets; - private final ImmutableMap> targetSources; - - private BlazeResolveConfiguration( - Project project, - BlazeResolveConfigurationData configurationData, - String displayName, - ImmutableList targets, - ImmutableMap> targetSources) { - this.project = project; - this.configurationData = configurationData; - this.displayNameIdentifier = displayName; - this.targets = ImmutableList.copyOf(targets); - this.targetSources = targetSources; - } - - static BlazeResolveConfiguration createForTargets( - Project project, - BlazeProjectData blazeProjectData, - BlazeResolveConfigurationData configurationData, - Collection targets) { - return new BlazeResolveConfiguration( - project, - configurationData, - computeDisplayName(targets), - ImmutableList.copyOf(targets), - computeTargetToSources(blazeProjectData, targets)); - } - - public Collection getTargets() { - return targets; - } - - private static String computeDisplayName(Collection targets) { - TargetKey minTargetKey = targets.stream().min(TargetKey::compareTo).orElse(null); - Preconditions.checkNotNull(minTargetKey); - String minTarget = minTargetKey.toString(); - if (targets.size() == 1) { - return minTarget; - } else { - return String.format("%s and %d other target(s)", minTarget, targets.size() - 1); - } - } - - public String getDisplayName() { - return displayNameIdentifier; - } - - boolean isEquivalentConfigurations(BlazeResolveConfiguration other) { - return configurationData.equals(other.configurationData) - && displayNameIdentifier.equals(other.displayNameIdentifier) - && targets.equals(other.targets) - && targetSources.equals(other.targetSources); - } - - @Nullable - OCLanguageKind getDeclaredLanguageKind(VirtualFile sourceOrHeaderFile) { - String fileName = sourceOrHeaderFile.getName(); - if (OCFileTypeHelpers.isSourceFile(fileName)) { - return getLanguageKind(sourceOrHeaderFile); - } - - if (OCFileTypeHelpers.isHeaderFile(fileName)) { - return getLanguageKind(SourceFileFinder.findAndGetSourceFileForHeaderFile(project, sourceOrHeaderFile)); - } - - return null; - } - - private OCLanguageKind getLanguageKind(@Nullable VirtualFile sourceFile) { - if (sourceFile == null) - return getMaximumLanguageKind(); - - OCLanguageKind kind = OCFileTypeHelpers.getLanguageKind(sourceFile.getName()); - return kind != null ? kind : getMaximumLanguageKind(); - } - - private static OCLanguageKind getMaximumLanguageKind() { - return CLanguageKind.CPP; - } - - @VisibleForTesting - List getLibraryHeadersRootsInternal() { - ImmutableList.Builder roots = ImmutableList.builder(); - roots.addAll(configurationData.transitiveQuoteIncludeDirectories()); - roots.addAll(configurationData.transitiveIncludeDirectories()); - roots.addAll(configurationData.transitiveSystemIncludeDirectories()); - return roots.build(); - } - - @VisibleForTesting - ImmutableCollection getTargetCopts() { - return configurationData.localCopts(); - } - - BlazeCompilerSettings getCompilerSettings() { - return configurationData.compilerSettings(); - } - - ImmutableList getSources(TargetKey targetKey) { - return targetSources.get(targetKey); - } - - private static ImmutableMap> computeTargetToSources( - BlazeProjectData blazeProjectData, Collection targets) { - ImmutableMap.Builder> targetSourcesBuilder = - ImmutableMap.builder(); - for (TargetKey targetKey : targets) { - targetSourcesBuilder.put(targetKey, computeSources(blazeProjectData, targetKey)); - } - return targetSourcesBuilder.build(); - } - - private static ImmutableList computeSources( - BlazeProjectData blazeProjectData, TargetKey targetKey) { - ImmutableList.Builder builder = ImmutableList.builder(); - - TargetIdeInfo targetIdeInfo = blazeProjectData.getTargetMap().get(targetKey); - if (targetIdeInfo.getcIdeInfo() == null) { - return ImmutableList.of(); - } - - for (ArtifactLocation sourceArtifact : targetIdeInfo.getSources()) { - File file = blazeProjectData.getArtifactLocationDecoder().decode(sourceArtifact); - VirtualFile vf = VirtualFileSystemProvider.getInstance().getSystem().findFileByIoFile(file); - if (vf == null) { - continue; - } - if (!OCFileTypeHelpers.isSourceFile(vf.getName())) { - continue; - } - builder.add(vf); - } - return builder.build(); - } -} diff --git a/cpp/src/com/google/idea/blaze/cpp/BlazeResolveConfiguration.kt b/cpp/src/com/google/idea/blaze/cpp/BlazeResolveConfiguration.kt new file mode 100644 index 00000000000..452ab3f1843 --- /dev/null +++ b/cpp/src/com/google/idea/blaze/cpp/BlazeResolveConfiguration.kt @@ -0,0 +1,134 @@ +/* + * 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.idea.blaze.cpp + +import com.google.common.base.Preconditions +import com.google.common.collect.ImmutableList +import com.google.common.collect.ImmutableMap +import com.google.idea.blaze.base.ideinfo.TargetKey +import com.google.idea.blaze.base.io.VirtualFileSystemProvider +import com.google.idea.blaze.base.model.BlazeProjectData +import com.intellij.openapi.project.Project +import com.intellij.openapi.vfs.VirtualFile +import com.jetbrains.cidr.lang.CLanguageKind +import com.jetbrains.cidr.lang.OCFileTypeHelpers +import com.jetbrains.cidr.lang.OCLanguageKind +import org.jetbrains.annotations.VisibleForTesting + +private val DEFAULT_LANGUAGE_KIND = CLanguageKind.CPP + +/** A clustering of "equivalent" Blaze targets for creating [OCResolveConfiguration]. */ +data class BlazeResolveConfiguration( + @VisibleForTesting val configurationData: BlazeResolveConfigurationData, + val displayName: String, + val targets: ImmutableList, + val sources: ImmutableMap> +) { + + companion object { + @JvmStatic + fun create( + project: Project, + blazeProjectData: BlazeProjectData, + configurationData: BlazeResolveConfigurationData, + targets: Collection + ): BlazeResolveConfiguration = BlazeResolveConfiguration( + configurationData, + computeDisplayName(targets), + ImmutableList.copyOf(targets), + computeTargetToSources(project, blazeProjectData, targets) + ) + } + + val compilerSettings: BlazeCompilerSettings get() = configurationData.compilerSettings() + + fun getSources(targetKey: TargetKey): ImmutableList { + return sources[targetKey] ?: ImmutableList.of() + } + + fun getDeclaredLanguageKind(project: Project, sourceOrHeaderFile: VirtualFile): OCLanguageKind? { + val fileName = sourceOrHeaderFile.name + if (OCFileTypeHelpers.isSourceFile(fileName)) { + return getLanguageKind(sourceOrHeaderFile) + } + + if (OCFileTypeHelpers.isHeaderFile(fileName)) { + return getLanguageKind(SourceFileFinder.findAndGetSourceFileForHeaderFile(project, sourceOrHeaderFile)) + } + + return null + } + + private fun getLanguageKind(sourceFile: VirtualFile?): OCLanguageKind { + if (sourceFile == null) return DEFAULT_LANGUAGE_KIND + + val kind = OCFileTypeHelpers.getLanguageKind(sourceFile.name) + return kind ?: DEFAULT_LANGUAGE_KIND + } + +} + +private fun computeDisplayName(targets: Collection): String { + val minTargetKey = targets.minOrNull() + Preconditions.checkNotNull(minTargetKey) + + return if (targets.size == 1) { + minTargetKey.toString() + } else { + String.format("%s and %d other target(s)", minTargetKey, targets.size - 1) + } +} + + +private fun computeTargetToSources( + project: Project, + blazeProjectData: BlazeProjectData, + targets: Collection, +): ImmutableMap> { + val builder = ImmutableMap.builder>() + + for (targetKey in targets) { + builder.put(targetKey, computeSources(project, blazeProjectData, targetKey)) + } + + return builder.build() +} + +private fun computeSources( + project: Project, + blazeProjectData: BlazeProjectData, + targetKey: TargetKey, +): ImmutableList { + val builder = ImmutableList.builder() + + val ideInfo = blazeProjectData.targetMap[targetKey] + if (ideInfo?.getcIdeInfo() == null) { + return ImmutableList.of() + } + + for (source in ideInfo.sources) { + val path = blazeProjectData.artifactLocationDecoder.decode(source).toPath() + + val virtualFile = VirtualFileSystemProvider.getInstance().system.findFileByNioFile(path) + if (virtualFile == null || !OCFileTypeHelpers.isSourceFile(virtualFile.name)) { + continue + } + + builder.add(virtualFile) + } + + return builder.build() +} diff --git a/cpp/src/com/google/idea/blaze/cpp/BlazeResolveConfigurationData.java b/cpp/src/com/google/idea/blaze/cpp/BlazeResolveConfigurationData.java index 4d28116103a..698950a018f 100644 --- a/cpp/src/com/google/idea/blaze/cpp/BlazeResolveConfigurationData.java +++ b/cpp/src/com/google/idea/blaze/cpp/BlazeResolveConfigurationData.java @@ -43,15 +43,19 @@ public abstract class BlazeResolveConfigurationData { static BlazeResolveConfigurationData create( CIdeInfo cIdeInfo, CToolchainIdeInfo toolchainIdeInfo, - BlazeCompilerSettings compilerSettings) { + BlazeCompilerSettings compilerSettings + ) { + final var ruleCtx = cIdeInfo.ruleContext(); + final var compilationCtx = cIdeInfo.compilationContext(); + return builder() .setCompilerSettings(compilerSettings) .setToolchainIdeInfo(toolchainIdeInfo) - .setLocalCopts(cIdeInfo.getLocalCopts()) - .setTransitiveIncludeDirectories(cIdeInfo.getTransitiveIncludeDirectories()) - .setTransitiveQuoteIncludeDirectories(cIdeInfo.getTransitiveQuoteIncludeDirectories()) - .setTransitiveDefines(cIdeInfo.getTransitiveDefines()) - .setTransitiveSystemIncludeDirectories(cIdeInfo.getTransitiveSystemIncludeDirectories()) + .setLocalCopts(ruleCtx.copts()) + .setTransitiveIncludeDirectories(compilationCtx.includes()) + .setTransitiveQuoteIncludeDirectories(compilationCtx.quoteIncludes()) + .setTransitiveDefines(compilationCtx.defines()) + .setTransitiveSystemIncludeDirectories(compilationCtx.systemIncludes()) .build(); } diff --git a/cpp/src/com/google/idea/blaze/cpp/HeaderRootTrimmerImpl.kt b/cpp/src/com/google/idea/blaze/cpp/HeaderRootTrimmerImpl.kt index 9f877576ef5..ac57e303ce7 100644 --- a/cpp/src/com/google/idea/blaze/cpp/HeaderRootTrimmerImpl.kt +++ b/cpp/src/com/google/idea/blaze/cpp/HeaderRootTrimmerImpl.kt @@ -22,7 +22,6 @@ import com.google.idea.blaze.base.command.info.BlazeInfo import com.google.idea.blaze.base.ideinfo.CToolchainIdeInfo import com.google.idea.blaze.base.ideinfo.TargetIdeInfo import com.google.idea.blaze.base.ideinfo.TargetKey -import com.google.idea.blaze.base.ideinfo.TargetMap import com.google.idea.blaze.base.model.BlazeProjectData import com.google.idea.blaze.base.model.primitives.ExecutionRootPath import com.google.idea.blaze.base.scope.BlazeContext @@ -54,7 +53,7 @@ class HeaderRootTrimmerImpl(private val scope: CoroutineScope) : HeaderRootTrimm ): ImmutableSet = Scope.push>(parentContext) { ctx -> ctx.push(TimingScope("Resolve header include roots", TimingScope.EventType.Other)) - val paths = collectExecutionRootPaths(projectData.getTargetMap(), targetFilter, toolchainLookupMap) + val paths = collectExecutionRootPaths(projectData, targetFilter, toolchainLookupMap) val builder = ImmutableSet.builder() runBlocking { @@ -76,19 +75,19 @@ class HeaderRootTrimmerImpl(private val scope: CoroutineScope) : HeaderRootTrimm } private fun collectExecutionRootPaths( - targetMap: TargetMap, + projectData: BlazeProjectData, targetFilter: Predicate, toolchainLookupMap: ImmutableMap, ): Set { val paths = mutableSetOf() - for (target in targetMap.targets()) { + for (target in projectData.targetMap.targets()) { if (!targetFilter.test(target)) continue - val ideInfo = target.getcIdeInfo() ?: continue + val compilationCtx = target.getcIdeInfo()?.compilationContext() ?: continue - paths.addAll(ideInfo.transitiveSystemIncludeDirectories) - paths.addAll(ideInfo.transitiveIncludeDirectories) - paths.addAll(ideInfo.transitiveQuoteIncludeDirectories) + paths.addAll(compilationCtx.includes()) + paths.addAll(compilationCtx.quoteIncludes()) + paths.addAll(compilationCtx.systemIncludes()) } // Builtin includes should not be added to the switch builder, because CLion discovers builtin include paths during diff --git a/cpp/tests/unittests/com/google/idea/blaze/cpp/BlazeConfigurationResolverTest.java b/cpp/tests/unittests/com/google/idea/blaze/cpp/BlazeConfigurationResolverTest.java index 7289c119b09..9bc2375e6b7 100644 --- a/cpp/tests/unittests/com/google/idea/blaze/cpp/BlazeConfigurationResolverTest.java +++ b/cpp/tests/unittests/com/google/idea/blaze/cpp/BlazeConfigurationResolverTest.java @@ -774,7 +774,9 @@ public void multipleToolchainsNoIssue() { TargetIdeInfo.builder() .setLabel("//foo:native_lib") .setKind(CppBlazeRules.RuleTypes.CC_LIBRARY.getKind()) - .setCInfo(CIdeInfo.builder().addSource(src("foo/native.cc"))) + .setCInfo(CIdeInfo.builder().setRuleContext( + CIdeInfo.RuleContext.builder().setSources(ImmutableList.of(src("foo/native.cc"))).build()) + ) .addSource(src("foo/native.cc")) .addDependency("//foo:native_lib2") .addDependency("//toolchains:armv7a"); @@ -782,7 +784,9 @@ public void multipleToolchainsNoIssue() { TargetIdeInfo.builder() .setLabel("//foo:native_lib2") .setKind(CppBlazeRules.RuleTypes.CC_LIBRARY.getKind()) - .setCInfo(CIdeInfo.builder().addSource(src("foo/native2.cc"))) + .setCInfo(CIdeInfo.builder().setRuleContext( + CIdeInfo.RuleContext.builder().setSources(ImmutableList.of(src("foo/native2.cc"))).build()) + ) .addSource(src("foo/native2.cc")) .addDependency("//toolchains:aarch64"); TargetMap targetMap = @@ -891,7 +895,13 @@ private static TargetIdeInfo.Builder createCcTarget( TargetIdeInfo.Builder targetInfo = TargetIdeInfo.builder().setLabel(label).setKind(kind).addDependency(toolchainDep); sources.forEach(targetInfo::addSource); - return targetInfo.setCInfo(CIdeInfo.builder().addSources(sources).addLocalCopts(copts)); + + final var ruleContext = CIdeInfo.RuleContext.builder() + .setSources(sources) + .setCopts(copts) + .build(); + + return targetInfo.setCInfo(CIdeInfo.builder().setRuleContext(ruleContext)); } private static TargetIdeInfo.Builder createCcToolchain() { @@ -942,6 +952,7 @@ private VirtualFile createVirtualFile(String path) { when(mockFile.isValid()).thenReturn(true); File f = new File(path); when(mockFileSystem.findFileByIoFile(f)).thenReturn(mockFile); + when(mockFileSystem.findFileByNioFile(f.toPath())).thenReturn(mockFile); when(mockFile.getName()).thenReturn(f.getName()); return mockFile; } @@ -998,16 +1009,14 @@ public void reusedConfigurations( resolverResult.getAllConfigurations(); for (BlazeResolveConfiguration expectedItem : expectedReused) { assertThat( - currentConfigurations.stream() - .anyMatch(actualItem -> actualItem.isEquivalentConfigurations(expectedItem))) + currentConfigurations.stream().anyMatch(actualItem -> actualItem.equals(expectedItem))) .isTrue(); } List notReusedTargets = currentConfigurations.stream() .filter( configuration -> - expectedReused.stream() - .noneMatch(configuration::isEquivalentConfigurations)) + expectedReused.stream().noneMatch(configuration::equals)) .map(configuration -> configuration.getDisplayName()) .collect(Collectors.toList()); assertThat(notReusedTargets).containsExactly((Object[]) expectedNotReused); diff --git a/cpp/tests/unittests/com/google/idea/blaze/cpp/BlazeResolveConfigurationEquivalenceTest.java b/cpp/tests/unittests/com/google/idea/blaze/cpp/BlazeResolveConfigurationEquivalenceTest.java index 0f8e81c266b..d06ad18e88c 100644 --- a/cpp/tests/unittests/com/google/idea/blaze/cpp/BlazeResolveConfigurationEquivalenceTest.java +++ b/cpp/tests/unittests/com/google/idea/blaze/cpp/BlazeResolveConfigurationEquivalenceTest.java @@ -179,7 +179,7 @@ public void testEmptyConfigurations() { assertThat(get(configurations, "//foo/bar:one and 2 other target(s)")).isNotNull(); for (BlazeResolveConfiguration configuration : configurations) { assertThat(getHeaders(configuration)).isEmpty(); - assertThat(configuration.getTargetCopts()).isEmpty(); + assertThat(configuration.getConfigurationData().localCopts()).isEmpty(); } } @@ -215,9 +215,9 @@ public void testDefines() { .build(); List configurations = resolve(projectView, targetMap); assertThat(configurations).hasSize(2); - assertThat(get(configurations, "//foo/bar:one and 1 other target(s)").getTargetCopts()) + assertThat(get(configurations, "//foo/bar:one and 1 other target(s)").getConfigurationData().localCopts()) .containsExactly("-DSAME=1"); - assertThat(get(configurations, "//foo/bar:three").getTargetCopts()) + assertThat(get(configurations, "//foo/bar:three").getConfigurationData().localCopts()) .containsExactly("-DDIFFERENT=1"); for (BlazeResolveConfiguration configuration : configurations) { assertThat(getHeaders(configuration)).isEmpty(); @@ -264,7 +264,7 @@ public void testIncludes() { assertThat(getHeaders(get(configurations, "//foo/bar:three"))) .containsExactly(header("foo/different")); for (BlazeResolveConfiguration configuration : configurations) { - assertThat(configuration.getTargetCopts()).isEmpty(); + assertThat(configuration.getConfigurationData().localCopts()).isEmpty(); } } @@ -552,11 +552,17 @@ private static TargetIdeInfo.Builder createCcTarget( TargetIdeInfo.Builder targetInfo = TargetIdeInfo.builder().setLabel(label).setKind(kind).addDependency("//:toolchain"); sources.forEach(targetInfo::addSource); - return targetInfo.setCInfo( - CIdeInfo.builder() - .addSources(sources) - .addLocalCopts(copts) - .addTransitiveIncludeDirectories(includes)); + return targetInfo.setCInfo(CIdeInfo.builder() + .setRuleContext(CIdeInfo.RuleContext.builder() + .setCopts(ImmutableList.copyOf(copts)) + .setSources(ImmutableList.copyOf(sources)) + .build() + ) + .setCompilationContext(CIdeInfo.CompilationContext.builder() + .setIncludes(ImmutableList.copyOf(includes)) + .build() + ) + ); } private static TargetIdeInfo.Builder createCcToolchain() { @@ -632,7 +638,11 @@ private ExecutionRootPath header(String path) { } private static List getHeaders(BlazeResolveConfiguration configuration) { - return configuration.getLibraryHeadersRootsInternal(); + ImmutableList.Builder roots = ImmutableList.builder(); + roots.addAll(configuration.getConfigurationData().transitiveQuoteIncludeDirectories()); + roots.addAll(configuration.getConfigurationData().transitiveIncludeDirectories()); + roots.addAll(configuration.getConfigurationData().transitiveSystemIncludeDirectories()); + return roots.build(); } private void createVirtualFile(String path) { @@ -652,17 +662,13 @@ private static void assertReusedConfigs( ReusedConfigurationExpectations expected) { for (String label : expected.reusedLabels) { assertWithMessage(String.format("Checking that %s is reused", label)) - .that( - get(newConfigurations, label) - .isEquivalentConfigurations(get(oldConfigurations, label))) - .isTrue(); + .that(get(newConfigurations, label)) + .isEqualTo(get(oldConfigurations, label)); } for (String label : expected.notReusedLabels) { assertWithMessage(String.format("Checking that %s is NOT reused", label)) - .that( - get(newConfigurations, label) - .isEquivalentConfigurations(get(oldConfigurations, label))) - .isFalse(); + .that(get(newConfigurations, label)) + .isNotEqualTo(get(oldConfigurations, label)); } } diff --git a/proto/intellij_ide_info.proto b/proto/intellij_ide_info.proto index 2ad9de54513..515b4572a23 100644 --- a/proto/intellij_ide_info.proto +++ b/proto/intellij_ide_info.proto @@ -53,21 +53,31 @@ message JavaIdeInfo { } message CIdeInfo { - repeated ArtifactLocation source = 1; + // Information collected from rules_cc rule attributes. + message RuleContext { + repeated ArtifactLocation sources = 1; + repeated ArtifactLocation headers = 2; + repeated ArtifactLocation textual_headers = 3; - repeated string transitive_include_directory = 3; - repeated string transitive_quote_include_directory = 4; - repeated string transitive_define = 5; - repeated string transitive_system_include_directory = 6; + repeated string copts = 4; + repeated string args = 5; - repeated string target_copt = 7; - repeated ArtifactLocation header = 8; - repeated ArtifactLocation textual_header = 9; + string include_prefix = 6; + string strip_include_prefix = 7; + } + + // Information collected from CcInfo provider. + message CompilationContext { + repeated ArtifactLocation direct_headers = 1; - string include_prefix = 10; - string strip_include_prefix = 11; + repeated string defines = 2; + repeated string includes = 3; + repeated string quote_includes = 4; + repeated string system_includes = 5; + } - repeated string args = 12; + RuleContext rule_context = 1; + CompilationContext compilation_context = 2; } message AndroidIdeInfo {