blob: 8d8ca166a2669d0d12af352166939b33a7de2e05 [file] [log] [blame]
/*
* 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.base.sync;
import com.google.idea.blaze.base.bazel.BuildSystemProvider;
import com.google.idea.blaze.base.io.FileAttributeProvider;
import com.google.idea.blaze.base.model.primitives.TargetExpression;
import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
import com.google.idea.blaze.base.settings.Blaze;
import com.google.idea.blaze.base.sync.projectview.ImportRoots;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import java.io.File;
import javax.annotation.Nullable;
/** Finds the best target to sync for a file. */
public class BuildTargetFinder {
private final WorkspaceRoot workspaceRoot;
private final ImportRoots importRoots;
private final FileAttributeProvider fileAttributeProvider;
private final BuildSystemProvider buildSystemProvider;
public BuildTargetFinder(Project project, WorkspaceRoot workspaceRoot, ImportRoots importRoots) {
this.workspaceRoot = workspaceRoot;
this.importRoots = importRoots;
this.fileAttributeProvider = FileAttributeProvider.getInstance();
this.buildSystemProvider = Blaze.getBuildSystemProvider(project);
}
@Nullable
public File findBuildFileForFile(File file) {
if (fileAttributeProvider.isFile(file)) {
file = file.getParentFile();
if (file == null) {
return null;
}
}
final File directory = file;
File root =
importRoots
.rootDirectories()
.stream()
.map(workspaceRoot::fileForPath)
.filter(potentialRoot -> FileUtil.isAncestor(potentialRoot, directory, false))
.findFirst()
.orElse(null);
if (root == null) {
return null;
}
File currentDirectory = directory;
do {
File buildFile = buildSystemProvider.findBuildFileInDirectory(currentDirectory);
if (buildFile != null) {
return buildFile;
}
currentDirectory = currentDirectory.getParentFile();
} while (currentDirectory != null && FileUtil.isAncestor(root, currentDirectory, false));
return null;
}
@Nullable
public TargetExpression findTargetForFile(File file) {
File buildFile = findBuildFileForFile(file);
if (buildFile != null) {
return TargetExpression.allFromPackageNonRecursive(
workspaceRoot.workspacePathFor(buildFile.getParentFile()));
}
return null;
}
}