blob: 6e2a045ddd589af829f50692752bf664191144fb [file] [log] [blame]
/*
* Copyright 2017 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.lang.buildfile.references;
import static com.google.common.truth.Truth.assertThat;
import com.google.idea.blaze.base.lang.buildfile.BuildFileIntegrationTestCase;
import com.google.idea.blaze.base.lang.buildfile.psi.Argument;
import com.google.idea.blaze.base.lang.buildfile.psi.BuildFile;
import com.google.idea.blaze.base.lang.buildfile.psi.FuncallExpression;
import com.google.idea.blaze.base.lang.buildfile.psi.StringLiteral;
import com.google.idea.blaze.base.lang.buildfile.psi.util.PsiUtils;
import com.google.idea.blaze.base.model.primitives.WorkspacePath;
import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
import com.google.idea.blaze.base.sync.workspace.WorkspaceHelper;
import com.intellij.psi.PsiFile;
import java.io.File;
import java.nio.file.Paths;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Tests that labels referencing external workspaces are correctly resolved. */
@RunWith(JUnit4.class)
public class ExternalWorkspaceReferenceTest extends BuildFileIntegrationTestCase {
@Override
protected BuildSystem buildSystem() {
return BuildSystem.Bazel;
}
@Test
public void testExternalWorkspaceTargetReference() {
BuildFile workspaceBuildFile =
createBuildFile(
new WorkspacePath("BUILD"),
"java_library(",
" name = 'lib',",
" exports = ['@junit//:jar'],",
")");
BuildFile externalBuildFile =
(BuildFile)
createFileInExternalWorkspace(
"junit",
new WorkspacePath("BUILD"),
"java_import(",
" name = 'jar',",
" jars = ['junit-4.11.jar'],",
")");
FuncallExpression target = externalBuildFile.findRule("jar");
assertThat(target).isNotNull();
Argument.Keyword arg = workspaceBuildFile.findRule("lib").getKeywordArgument("exports");
StringLiteral label = PsiUtils.findFirstChildOfClassRecursive(arg, StringLiteral.class);
assertThat(label.getReferencedElement()).isEqualTo(target);
}
@Test
public void testLocalTargetReferenceWithinExternalWorkspaceResolves() {
BuildFile externalFile =
(BuildFile)
createFileInExternalWorkspace(
"junit",
new WorkspacePath("BUILD"),
"java_import(",
" name = 'jar',",
" jars = ['junit-4.11.jar'],",
")",
"java_library(",
" name = 'lib',",
" srcs = [':jar'],",
")");
FuncallExpression target = externalFile.findRule("jar");
assertThat(target).isNotNull();
Argument.Keyword arg = externalFile.findRule("lib").getKeywordArgument("srcs");
StringLiteral label = PsiUtils.findFirstChildOfClassRecursive(arg, StringLiteral.class);
assertThat(label.getReferencedElement()).isEqualTo(target);
}
@Test
public void testFileReferenceWithinExternalWorkspaceResolves() {
BuildFile externalFile =
(BuildFile)
createFileInExternalWorkspace(
"junit",
new WorkspacePath("BUILD"),
"java_import(",
" name = 'target',",
" jars = ['junit-4.11.jar'],",
")");
PsiFile jarFile = createFileInExternalWorkspace("junit", new WorkspacePath("junit-4.11.jar"));
FuncallExpression target = externalFile.findRule("target");
StringLiteral label =
PsiUtils.findFirstChildOfClassRecursive(
target.getKeywordArgument("jars"), StringLiteral.class);
assertThat(label.getReferencedElement()).isEqualTo(jarFile);
}
@Test
public void testReferenceToWorkspaceFileContents() {
BuildFile workspaceFile =
createBuildFile(
new WorkspacePath("WORKSPACE"),
"maven_jar(",
" name = 'w3c_css_sac',",
" artifact = 'org.w3c.css:sac:1.3',",
" sha1 = 'cdb2dcb4e22b83d6b32b93095f644c3462739e82',",
")");
BuildFile referencingFile =
createBuildFile(
new WorkspacePath("java/com/google/pkg/BUILD"),
"rule(",
" name = 'other',",
" dep = '@w3c_css_sac//jar'",
")");
FuncallExpression target = workspaceFile.findRule("w3c_css_sac");
assertThat(target).isNotNull();
FuncallExpression other = referencingFile.findRule("other");
StringLiteral label =
PsiUtils.findFirstChildOfClassRecursive(
other.getKeywordArgument("dep"), StringLiteral.class);
assertThat(label.getReferencedElement()).isEqualTo(target);
}
private PsiFile createFileInExternalWorkspace(
String workspaceName, WorkspacePath path, String... contents) {
String filePath =
Paths.get(getExternalSourceRoot().getPath(), workspaceName, path.relativePath()).toString();
return fileSystem.createPsiFile(filePath, contents);
}
private File getExternalSourceRoot() {
return WorkspaceHelper.getExternalSourceRoot(
BlazeProjectDataManager.getInstance(getProject()).getBlazeProjectData());
}
}