diff --git a/cpp/src/com/google/idea/blaze/cpp/BlazeCWorkspace.java b/cpp/src/com/google/idea/blaze/cpp/BlazeCWorkspace.java index a60b4b9eb83..070fade6c52 100644 --- a/cpp/src/com/google/idea/blaze/cpp/BlazeCWorkspace.java +++ b/cpp/src/com/google/idea/blaze/cpp/BlazeCWorkspace.java @@ -22,6 +22,9 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.errorprone.annotations.Keep; +import com.google.idea.blaze.base.ideinfo.ArtifactLocation; +import com.google.idea.blaze.base.ideinfo.CIdeInfo; +import com.google.idea.blaze.base.ideinfo.Dependency; import com.google.idea.blaze.base.ideinfo.TargetIdeInfo; import com.google.idea.blaze.base.ideinfo.TargetKey; import com.google.idea.blaze.base.model.BlazeProjectData; @@ -66,13 +69,16 @@ import com.jetbrains.cidr.lang.workspace.compiler.CompilerInfoCache.Session; import com.jetbrains.cidr.lang.workspace.compiler.OCCompilerKind; import com.jetbrains.cidr.lang.workspace.compiler.TempFilesPool; +import org.jetbrains.annotations.NotNull; import java.io.File; +import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Collections; import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Stream; @@ -159,6 +165,45 @@ public void run(ProgressIndicator indicator) { }); } + private List collectIncludes(String rootPath, TargetKey targetKey, BlazeProjectData blazeProjectData) { + TargetIdeInfo targetIdeInfo = blazeProjectData.getTargetMap().get(targetKey); + if (targetIdeInfo == null || targetIdeInfo.getcIdeInfo() == null) { + return Collections.emptyList(); + } + + ArrayList includes = new ArrayList<>(); + CIdeInfo cIdeInfo = targetIdeInfo.getcIdeInfo(); + String includePrefix = cIdeInfo.getIncludePrefix(); + String stripPrefix = cIdeInfo.getStripIncludePrefix(); + for (ArtifactLocation header : cIdeInfo.getHeaders()) { + String realPath = rootPath + "/" + header.getExecutionRootRelativePath(); + String libPath = targetKey.getLabel().blazePackage().asPath().toString(); + String pathUsedInSourceCode = header.getRelativePath(); + if (pathUsedInSourceCode != null) { + if (libPath != null && !libPath.isEmpty() && pathUsedInSourceCode.startsWith(libPath)) { + pathUsedInSourceCode = pathUsedInSourceCode.substring(libPath.length() + 1); + } + if (stripPrefix != null && !stripPrefix.isEmpty() && pathUsedInSourceCode.startsWith(stripPrefix)) { + pathUsedInSourceCode = pathUsedInSourceCode.substring(stripPrefix.length() + + (stripPrefix.endsWith("/") ? 0 : 1)); + System.out.println("updated path = " + pathUsedInSourceCode); + } + if (includePrefix != null && !includePrefix.isEmpty()) { + pathUsedInSourceCode = includePrefix + "/" + pathUsedInSourceCode; + System.out.println("updated path 2 = " + pathUsedInSourceCode); + } + + includes.add("-ibazel" + pathUsedInSourceCode + "=" + realPath); + } + } + + for (Dependency dep : targetIdeInfo.getDependencies()) { + includes.addAll(collectIncludes(rootPath, dep.getTargetKey(), blazeProjectData)); + } + + return includes; + } + private OCWorkspaceImpl.ModifiableModel calculateConfigurations( BlazeProjectData blazeProjectData, WorkspaceRoot workspaceRoot, @@ -208,7 +253,7 @@ private OCWorkspaceImpl.ModifiableModel calculateConfigurations( // transitiveDefines are sourced from a target's (and transitive deps) "defines" attribute ImmutableList transitiveDefineOptions = - targetIdeInfo.getcIdeInfo().getTransitiveDefines().stream() + targetIdeInfo.getcIdeInfo().getTransitiveDefines().stream() .map(s -> "-D" + s) .collect(toImmutableList()); @@ -247,6 +292,9 @@ private OCWorkspaceImpl.ModifiableModel calculateConfigurations( .map(file -> "-I" + file.getAbsolutePath()) .collect(toImmutableList()); + String rootPath = workspaceRoot.directory().getAbsolutePath(); + ImmutableList includes = ImmutableList.copyOf(collectIncludes(rootPath, targetKey, blazeProjectData)); + for (VirtualFile vf : resolveConfiguration.getSources(targetKey)) { OCLanguageKind kind = resolveConfiguration.getDeclaredLanguageKind(vf); if (kind == null) { @@ -262,6 +310,7 @@ private OCWorkspaceImpl.ModifiableModel calculateConfigurations( fileSpecificSwitchBuilder.addAllRaw(iOptionIncludeDirectories); fileSpecificSwitchBuilder.addAllRaw(isystemOptionIncludeDirectories); fileSpecificSwitchBuilder.addAllRaw(plainLocalCopts); + fileSpecificSwitchBuilder.addAllRaw(includes); PerFileCompilerOpts perFileCompilerOpts = new PerFileCompilerOpts(kind, fileSpecificSwitchBuilder.build());