aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools
diff options
context:
space:
mode:
authorGravatar laurentlb <laurentlb@google.com>2018-03-07 13:35:41 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-03-07 13:37:44 -0800
commit164129638f382960d066893ab60a25333bec396d (patch)
treeb22395bce166552abbd4744f1312834044efc749 /src/tools
parent643d389e718070eed1cf47f6703668c7d2a96f2d (diff)
Skylint: check for PACKAGE_NAME, REPOSITORY_NAME, and ctx.outputs.executable
RELNOTES: None. PiperOrigin-RevId: 188225156
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/skylark/java/com/google/devtools/skylark/skylint/DeprecatedApiChecker.java55
-rw-r--r--src/tools/skylark/javatests/com/google/devtools/skylark/skylint/DeprecatedApiCheckerTest.java10
2 files changed, 50 insertions, 15 deletions
diff --git a/src/tools/skylark/java/com/google/devtools/skylark/skylint/DeprecatedApiChecker.java b/src/tools/skylark/java/com/google/devtools/skylark/skylint/DeprecatedApiChecker.java
index c4e849b1ce..822da87d44 100644
--- a/src/tools/skylark/java/com/google/devtools/skylark/skylint/DeprecatedApiChecker.java
+++ b/src/tools/skylark/java/com/google/devtools/skylark/skylint/DeprecatedApiChecker.java
@@ -17,6 +17,7 @@ package com.google.devtools.skylark.skylint;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.syntax.BuildFileAST;
import com.google.devtools.build.lib.syntax.DotExpression;
+import com.google.devtools.build.lib.syntax.Expression;
import com.google.devtools.build.lib.syntax.Identifier;
import java.util.ArrayList;
import java.util.List;
@@ -35,32 +36,62 @@ public class DeprecatedApiChecker extends AstVisitorWithNameResolution {
return checker.issues;
}
+ /**
+ * Convert a dotted expression to string, e.g. rule -> "rule" attr.label -> "attr.label"
+ *
+ * <p>If input contains anything else than Identifier or DotExpression, return empty string.
+ */
+ private static String dottedExpressionToString(Expression e) {
+ if (e instanceof Identifier) {
+ return ((Identifier) e).getName();
+ }
+ if (e instanceof DotExpression) {
+ String result = dottedExpressionToString(((DotExpression) e).getObject());
+ if (!result.isEmpty()) {
+ return result + "." + ((DotExpression) e).getField().getName();
+ }
+ }
+
+ return "";
+ }
+
private static final ImmutableMap<String, String> deprecatedMethods =
ImmutableMap.<String, String>builder()
- .put("ctx.action", "Use ctx.actions.run() or ctx.actions.run_shell().")
+ .put("ctx.action", "Use ctx.actions.run or ctx.actions.run_shell.")
.put("ctx.default_provider", "Use DefaultInfo.")
.put("ctx.empty_action", "Use ctx.actions.do_nothing.")
.put("ctx.expand_make_variables", "Use ctx.var to access the variables.")
.put("ctx.file_action", "Use ctx.actions.write.")
.put("ctx.new_file", "Use ctx.actions.declare_file.")
- .put("ctx.template_action", "Use ctx.actions.expand_template().")
+ .put("ctx.template_action", "Use ctx.actions.expand_template.")
+ .put("PACKAGE_NAME", "Use native.package_name().")
+ .put("REPOSITORY_NAME", "Use native.repository_name().")
+ .put(
+ "ctx.outputs.executable",
+ "See https://docs.bazel.build/versions/master/skylark/"
+ + "rules.html#executable-rules-and-test-rules")
.build();
- @Override
- public void visit(DotExpression node) {
- super.visit(node);
-
- if (!(node.getObject() instanceof Identifier)) {
- return;
- }
-
- String name = ((Identifier) node.getObject()).getName() + "." + node.getField().getName();
+ private void checkDeprecated(Expression node) {
+ String name = dottedExpressionToString(node);
if (deprecatedMethods.containsKey(name)) {
issues.add(
Issue.create(
DEPRECATED_API,
- "This method is deprecated: " + deprecatedMethods.get(name),
+ name + " is deprecated: " + deprecatedMethods.get(name),
node.getLocation()));
}
}
+
+ @Override
+ public void visit(Identifier node) {
+ super.visit(node);
+ checkDeprecated(node);
+ }
+
+ @Override
+ public void visit(DotExpression node) {
+ super.visit(node);
+ checkDeprecated(node);
+ }
}
diff --git a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/DeprecatedApiCheckerTest.java b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/DeprecatedApiCheckerTest.java
index 20af00dd12..0e356eac3e 100644
--- a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/DeprecatedApiCheckerTest.java
+++ b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/DeprecatedApiCheckerTest.java
@@ -37,11 +37,15 @@ public class DeprecatedApiCheckerTest {
@Test
public void deprecatedCtxMethods() {
Truth.assertThat(findIssues("ctx.action()").toString())
- .contains("1:1-1:10: This method is deprecated");
+ .contains("1:1-1:10: ctx.action is deprecated: Use ctx.actions.run");
Truth.assertThat(findIssues("ctx.empty_action").toString())
- .contains("1:1-1:16: This method is deprecated");
+ .contains("1:1-1:16: ctx.empty_action is deprecated");
Truth.assertThat(findIssues("ctx.default_provider()").toString())
- .contains("1:1-1:20: This method is deprecated");
+ .contains("1:1-1:20: ctx.default_provider is deprecated");
+ Truth.assertThat(findIssues("PACKAGE_NAME").toString())
+ .contains("1:1-1:12: PACKAGE_NAME is deprecated");
+ Truth.assertThat(findIssues("f = ctx.outputs.executable").toString())
+ .contains("1:5-1:26: ctx.outputs.executable is deprecated");
Truth.assertThat(findIssues("ctx.actions()")).isEmpty();
}