From 164129638f382960d066893ab60a25333bec396d Mon Sep 17 00:00:00 2001 From: laurentlb Date: Wed, 7 Mar 2018 13:35:41 -0800 Subject: Skylint: check for PACKAGE_NAME, REPOSITORY_NAME, and ctx.outputs.executable RELNOTES: None. PiperOrigin-RevId: 188225156 --- .../skylark/skylint/DeprecatedApiChecker.java | 55 +++++++++++++++++----- .../skylark/skylint/DeprecatedApiCheckerTest.java | 10 ++-- 2 files changed, 50 insertions(+), 15 deletions(-) (limited to 'src/tools') 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" + * + *

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 deprecatedMethods = ImmutableMap.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(); } -- cgit v1.2.3