From ea140923af949fa0f55f2a980cbd2518fbd0bbec Mon Sep 17 00:00:00 2001 From: fzaiser Date: Thu, 12 Oct 2017 18:56:35 +0200 Subject: Skylint: add categories for issues. Having a short canonical name for each kind of finding (the category) makes it easier to document all the lints and for users to find the documentation for each lint. RELNOTES: none PiperOrigin-RevId: 171972645 --- .../skylark/skylint/BadOperationCheckerTest.java | 32 ++++++++++---- .../skylark/skylint/ControlFlowCheckerTest.java | 49 +++++++++++++++------ .../skylark/skylint/DeprecationCheckerTest.java | 10 +++-- .../skylark/skylint/DocstringCheckerTests.java | 38 ++++++++++------ .../devtools/skylark/skylint/LinterTest.java | 2 +- .../skylark/skylint/LoadStatementCheckerTest.java | 6 ++- .../skylint/NamingConventionsCheckerTest.java | 26 ++++++----- .../skylint/StatementWithoutEffectCheckerTest.java | 14 +++--- .../devtools/skylark/skylint/UsageCheckerTest.java | 50 ++++++++++++---------- 9 files changed, 148 insertions(+), 79 deletions(-) (limited to 'src/tools/skylark/javatests/com/google/devtools/skylark') diff --git a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/BadOperationCheckerTest.java b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/BadOperationCheckerTest.java index 00138b6b6c..ce121ffb59 100644 --- a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/BadOperationCheckerTest.java +++ b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/BadOperationCheckerTest.java @@ -37,29 +37,45 @@ public class BadOperationCheckerTest { @Test public void dictionaryLiteralPlusOperator() { Truth.assertThat(findIssues("{} + foo").toString()) - .contains("1:1-1:8: '+' operator is deprecated and should not be used on dictionaries"); + .contains( + "1:1-1:8: '+' operator is deprecated and should not be used on dictionaries" + + " [deprecated-plus-dict]"); Truth.assertThat(findIssues("foo + {}").toString()) - .contains("1:1-1:8: '+' operator is deprecated and should not be used on dictionaries"); + .contains( + "1:1-1:8: '+' operator is deprecated and should not be used on dictionaries" + + " [deprecated-plus-dict]"); Truth.assertThat(findIssues("foo += {}").toString()) - .contains("1:1-1:9: '+' operator is deprecated and should not be used on dictionaries"); + .contains( + "1:1-1:9: '+' operator is deprecated and should not be used on dictionaries" + + " [deprecated-plus-dict]"); } @Test public void dictionaryComprehensionPlusOperator() { Truth.assertThat(findIssues("{k:v for k,v in []} + foo").toString()) - .contains("1:1-1:25: '+' operator is deprecated and should not be used on dictionaries"); + .contains( + "1:1-1:25: '+' operator is deprecated and should not be used on dictionaries" + + " [deprecated-plus-dict]"); Truth.assertThat(findIssues("foo + {k:v for k,v in []}").toString()) - .contains("1:1-1:25: '+' operator is deprecated and should not be used on dictionaries"); + .contains( + "1:1-1:25: '+' operator is deprecated and should not be used on dictionaries" + + " [deprecated-plus-dict]"); Truth.assertThat(findIssues("foo += {k:v for k,v in []}").toString()) - .contains("1:1-1:26: '+' operator is deprecated and should not be used on dictionaries"); + .contains( + "1:1-1:26: '+' operator is deprecated and should not be used on dictionaries" + + " [deprecated-plus-dict]"); } @Test public void dictionaryPlusOperatorNested() { Truth.assertThat(findIssues("foo + ({} + bar)").toString()) - .contains("1:7-1:16: '+' operator is deprecated and should not be used on dictionaries"); + .contains( + "1:7-1:16: '+' operator is deprecated and should not be used on dictionaries" + + " [deprecated-plus-dict]"); Truth.assertThat(findIssues("foo + (bar + {})").toString()) - .contains("1:7-1:16: '+' operator is deprecated and should not be used on dictionaries"); + .contains( + "1:7-1:16: '+' operator is deprecated and should not be used on dictionaries" + + " [deprecated-plus-dict]"); } @Test diff --git a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/ControlFlowCheckerTest.java b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/ControlFlowCheckerTest.java index f10aba0391..c522dcbee4 100644 --- a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/ControlFlowCheckerTest.java +++ b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/ControlFlowCheckerTest.java @@ -51,7 +51,9 @@ public class ControlFlowCheckerTest { " else:", " return x") .toString()) - .contains("1:1-5:12: some but not all execution paths of 'some_function' return a value"); + .contains( + "1:1-5:12: some but not all execution paths of 'some_function' return a value" + + " [missing-return-value]"); } @Test @@ -65,8 +67,13 @@ public class ControlFlowCheckerTest { " return # missing value") .toString(); Truth.assertThat(messages) - .contains("1:1-5:26: some but not all execution paths of 'some_function' return a value"); - Truth.assertThat(messages).contains("5:5-5:10: return value missing"); + .contains( + "1:1-5:26: some but not all execution paths of 'some_function' return a value" + + " [missing-return-value]"); + Truth.assertThat(messages) + .contains( + "5:5-5:10: return value missing (you can `return None` if this is desired)" + + " [missing-return-value]"); } @Test @@ -81,7 +88,9 @@ public class ControlFlowCheckerTest { " else:", " return not x") .toString()) - .contains("1:1-7:16: some but not all execution paths of 'f' return a value"); + .contains( + "1:1-7:16: some but not all execution paths of 'f' return a value" + + " [missing-return-value]"); } @Test @@ -97,7 +106,9 @@ public class ControlFlowCheckerTest { " else:", " return x") .toString()) - .contains("1:1-8:12: some but not all execution paths of 'f' return a value"); + .contains( + "1:1-8:12: some but not all execution paths of 'f' return a value" + + " [missing-return-value]"); } @Test @@ -110,7 +121,9 @@ public class ControlFlowCheckerTest { " elif not x:", " return not x") .toString()) - .contains("1:1-5:16: some but not all execution paths of 'some_function' return a value"); + .contains( + "1:1-5:16: some but not all execution paths of 'some_function' return a value" + + " [missing-return-value]"); } @Test @@ -123,7 +136,9 @@ public class ControlFlowCheckerTest { " print('foo')", " # return missing here") .toString()) - .contains("1:1-5:23: some but not all execution paths of 'some_function' return a value"); + .contains( + "1:1-5:23: some but not all execution paths of 'some_function' return a value" + + " [missing-return-value]"); } @Test @@ -136,7 +151,9 @@ public class ControlFlowCheckerTest { " print('foo')", " # return missing here") .toString()) - .contains("1:1-5:23: some but not all execution paths of 'some_function' return a value"); + .contains( + "1:1-5:23: some but not all execution paths of 'some_function' return a value" + + " [missing-return-value]"); } @Test @@ -149,8 +166,13 @@ public class ControlFlowCheckerTest { " return x") .toString(); Truth.assertThat(messages) - .contains("1:1-4:10: some but not all execution paths of 'some_function' return a value"); - Truth.assertThat(messages).contains("3:5-3:10: return value missing"); + .contains( + "1:1-4:10: some but not all execution paths of 'some_function' return a value" + + " [missing-return-value]"); + Truth.assertThat(messages) + .contains( + "3:5-3:10: return value missing (you can `return None` if this is desired)" + + " [missing-return-value]"); } @Test @@ -164,7 +186,7 @@ public class ControlFlowCheckerTest { " fail('fail')", " print('This line is unreachable')") .toString(); - Truth.assertThat(messages).contains("6:3-6:35: unreachable statement"); + Truth.assertThat(messages).contains("6:3-6:35: unreachable statement [unreachable-statement]"); } @Test @@ -190,7 +212,7 @@ public class ControlFlowCheckerTest { " continue", " print('unreachable')") .toString(); - Truth.assertThat(messages).contains("7:5-7:24: unreachable statement"); + Truth.assertThat(messages).contains("7:5-7:24: unreachable statement [unreachable-statement]"); } @Test @@ -280,7 +302,8 @@ public class ControlFlowCheckerTest { " return x", " # no else branch but doesn't matter since it's unreachable"); Truth.assertThat(issues).hasSize(1); - Truth.assertThat(issues.toString()).contains("7:3-7:14: unreachable statement"); + Truth.assertThat(issues.toString()) + .contains("7:3-7:14: unreachable statement [unreachable-statement]"); } @Test diff --git a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/DeprecationCheckerTest.java b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/DeprecationCheckerTest.java index 5d55eb7a57..cd12f4a7c8 100644 --- a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/DeprecationCheckerTest.java +++ b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/DeprecationCheckerTest.java @@ -54,9 +54,12 @@ public class DeprecationCheckerTest { " The deprecation should really be documented in a 'Deprecated:' section", " but the linter should recognize this kind of deprecation as well'''") .toString(); - Truth.assertThat(errorMessages).contains("2:3: usage of 'g' is deprecated: reason"); Truth.assertThat(errorMessages) - .contains("3:3: usage of 'h' is deprecated: This function is DEPRECATED for some reason."); + .contains("2:3: usage of 'g' is deprecated: reason [deprecated-symbol]"); + Truth.assertThat(errorMessages) + .contains( + "3:3: usage of 'h' is deprecated: This function is DEPRECATED for some reason." + + " [deprecated-symbol]"); } @Test @@ -72,7 +75,8 @@ public class DeprecationCheckerTest { " Deprecated:", " reason'''") .toString(); - Truth.assertThat(errorMessages).contains("2:7: usage of 'g' is deprecated: reason"); + Truth.assertThat(errorMessages) + .contains("2:7: usage of 'g' is deprecated: reason [deprecated-symbol]"); } @Test diff --git a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/DocstringCheckerTests.java b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/DocstringCheckerTests.java index 8b399ccd34..377f0eed7c 100644 --- a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/DocstringCheckerTests.java +++ b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/DocstringCheckerTests.java @@ -40,8 +40,10 @@ public class DocstringCheckerTests { String errorMessage = findIssues("# no module docstring", "def function():", " pass # no function docstring") .toString(); - Truth.assertThat(errorMessage).contains("1:1-2:1: file has no module docstring"); - Truth.assertThat(errorMessage).contains("2:1-3:30: function 'function' has no docstring"); + Truth.assertThat(errorMessage) + .contains("1:1-2:1: file has no module docstring [missing-docstring]"); + Truth.assertThat(errorMessage) + .contains("2:1-3:30: function 'function' has no docstring [missing-docstring]"); } @Test @@ -57,7 +59,9 @@ public class DocstringCheckerTests { " pass"); Truth.assertThat(errors).hasSize(1); Truth.assertThat(errors.toString()) - .contains("3:3-6:3: incomplete docstring: the function parameters are not documented"); + .contains( + "3:3-6:3: incomplete docstring: the function parameters are not documented" + + " [inconsistent-docstring]"); } @Test @@ -73,9 +77,13 @@ public class DocstringCheckerTests { " pass") .toString(); Truth.assertThat(errorMessage) - .contains("2:3-6:5: incomplete docstring: parameter 'foo' not documented"); + .contains( + "2:3-6:5: incomplete docstring: parameter 'foo' not documented" + + " [inconsistent-docstring]"); Truth.assertThat(errorMessage) - .contains("2:3-6:5: incomplete docstring: parameter 'baz' not documented"); + .contains( + "2:3-6:5: incomplete docstring: parameter 'baz' not documented" + + " [inconsistent-docstring]"); } @Test @@ -95,11 +103,11 @@ public class DocstringCheckerTests { Truth.assertThat(errorMessage) .contains( "2:3-8:5: inconsistent docstring: parameter 'foo' appears in docstring" - + " but not in function signature"); + + " but not in function signature [inconsistent-docstring]"); Truth.assertThat(errorMessage) .contains( "2:3-8:5: inconsistent docstring: parameter 'baz' appears in docstring" - + " but not in function signature"); + + " but not in function signature [inconsistent-docstring]"); } @Test @@ -120,7 +128,8 @@ public class DocstringCheckerTests { "2:3-7:5:" + " inconsistent docstring: order of parameters differs from function signature\n" + "Declaration order: p1, p2\n" - + "Documentation order: p2, p1"); + + "Documentation order: p2, p1\n" + + " [inconsistent-docstring]"); } @Test @@ -128,8 +137,8 @@ public class DocstringCheckerTests { String errorMessage = findIssues("\"\"\"summary", "missing blank line\"\"\"").toString(); Truth.assertThat(errorMessage) .contains( - "2:1-2:18: invalid docstring format: " - + "the one-line summary should be followed by a blank line"); + "2:1-2:18: bad docstring format: " + + "the one-line summary should be followed by a blank line [bad-docstring-format]"); errorMessage = findIssues( @@ -142,8 +151,9 @@ public class DocstringCheckerTests { .toString(); Truth.assertThat(errorMessage) .contains( - "5:1-5:29: invalid docstring format: " - + "line indented too little (here: 1 spaces; expected: 2 spaces)"); + "5:1-5:29: bad docstring format: " + + "line indented too little (here: 1 spaces; expected: 2 spaces)" + + " [bad-docstring-format]"); } @Test @@ -159,7 +169,9 @@ public class DocstringCheckerTests { " return True"); Truth.assertThat(errors).hasSize(1); Truth.assertThat(errors.toString()) - .contains("3:3-6:5: incomplete docstring: the return value is not documented"); + .contains( + "3:3-6:5: incomplete docstring: the return value is not documented" + + " [inconsistent-docstring]"); } @Test diff --git a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/LinterTest.java b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/LinterTest.java index 148aa4845e..96ff5d47f5 100644 --- a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/LinterTest.java +++ b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/LinterTest.java @@ -53,6 +53,6 @@ public class LinterTest { .contains("should be lower_snake_case"); // naming conventions checker Truth.assertThat(errorMessages) .contains("expression result not used"); // checker statements without effect - Truth.assertThat(errorMessages).contains("unused definition of"); // usage checker + Truth.assertThat(errorMessages).contains("unused binding of"); // usage checker } } diff --git a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/LoadStatementCheckerTest.java b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/LoadStatementCheckerTest.java index c6cb41b543..35857e3722 100644 --- a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/LoadStatementCheckerTest.java +++ b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/LoadStatementCheckerTest.java @@ -59,7 +59,8 @@ public class LoadStatementCheckerTest { .toString(); Truth.assertThat(errorMessage) .contains( - "3:1-3:23: load statement should be at the top of the file (after the docstring)"); + "3:1-3:23: load statement should be at the top of the file (after the docstring)" + + " [load-at-top]"); errorMessage = findIssues( "'''Docstring'''", @@ -69,6 +70,7 @@ public class LoadStatementCheckerTest { .toString(); Truth.assertThat(errorMessage) .contains( - "4:1-4:23: load statement should be at the top of the file (after the docstring)"); + "4:1-4:23: load statement should be at the top of the file (after the docstring)" + + " [load-at-top]"); } } diff --git a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/NamingConventionsCheckerTest.java b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/NamingConventionsCheckerTest.java index 0dc837c432..6361705c29 100644 --- a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/NamingConventionsCheckerTest.java +++ b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/NamingConventionsCheckerTest.java @@ -46,13 +46,15 @@ public class NamingConventionsCheckerTest { Truth.assertThat(errorMessage) .contains( "'badGlobalVariableName' should be lower_snake_case (for variables)" - + " or UPPER_SNAKE_CASE (for constants)"); - Truth.assertThat(errorMessage).contains("'BAD_FUNCTION_NAME' should be lower_snake_case"); - Truth.assertThat(errorMessage).contains("'BadParameterName' should be lower_snake_case"); + + " or UPPER_SNAKE_CASE (for constants) [name-with-wrong-case]"); + Truth.assertThat(errorMessage) + .contains("'BAD_FUNCTION_NAME' should be lower_snake_case [name-with-wrong-case]"); + Truth.assertThat(errorMessage) + .contains("'BadParameterName' should be lower_snake_case [name-with-wrong-case]"); Truth.assertThat(errorMessage) .contains( "'badLocalVariableName' should be lower_snake_case (for variables)" - + " or UPPER_SNAKE_CASE (for constants)"); + + " or UPPER_SNAKE_CASE (for constants) [name-with-wrong-case]"); } @Test @@ -61,11 +63,13 @@ public class NamingConventionsCheckerTest { Truth.assertThat(errorMessage) .contains( "never use 'l', 'I', or 'O' as names" - + " (they're too easily confused with 'I', 'l', or '0')"); + + " (they're too easily confused with 'I', 'l', or '0') [confusing-name]"); Truth.assertThat(errorMessage) - .contains("identifier 'fail' shadows a builtin; please pick a different name"); + .contains( + "identifier 'fail' shadows a builtin; please pick a different name [confusing-name]"); Truth.assertThat(errorMessage) - .contains("identifier 'True' shadows a builtin; please pick a different name"); + .contains( + "identifier 'True' shadows a builtin; please pick a different name [confusing-name]"); } @Test @@ -74,11 +78,13 @@ public class NamingConventionsCheckerTest { Truth.assertThat(findIssues("_ = 1", "print(_)").toString()) .contains( "2:7-2:7:" - + " don't use '_' as an identifier, only to ignore the result in an assignment"); + + " don't use '_' as an identifier, only to ignore the result in an assignment" + + " [confusing-name]"); Truth.assertThat(findIssues("__ = 1").toString()) .contains( "1:1-1:2:" - + " identifier '__' consists only of underscores; please pick a different name"); + + " identifier '__' consists only of underscores; please pick a different name" + + " [confusing-name]"); } @Test @@ -102,7 +108,7 @@ public class NamingConventionsCheckerTest { public void testProviderNameMustBeCamelCase() throws Exception { Truth.assertThat(findIssues("FooBar = provider()")).isEmpty(); Truth.assertThat(findIssues("foo_bar = provider()").toString()) - .contains("provider name 'foo_bar' should be UpperCamelCase"); + .contains("provider name 'foo_bar' should be UpperCamelCase [name-with-wrong-case]"); } @Test diff --git a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/StatementWithoutEffectCheckerTest.java b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/StatementWithoutEffectCheckerTest.java index d160d2357e..beac94c3c7 100644 --- a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/StatementWithoutEffectCheckerTest.java +++ b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/StatementWithoutEffectCheckerTest.java @@ -38,12 +38,12 @@ public class StatementWithoutEffectCheckerTest { public void reportUselessExpressionStatements() throws Exception { String messages = findIssues("1", "len", "'string'", "'a'.len", "1 + 1", "[1, 2, 3]").toString(); - Truth.assertThat(messages).contains("1:1-1:1: expression result not used"); - Truth.assertThat(messages).contains("2:1-2:3: expression result not used"); - Truth.assertThat(messages).contains("3:1-3:8: expression result not used"); - Truth.assertThat(messages).contains("4:1-4:7: expression result not used"); - Truth.assertThat(messages).contains("5:1-5:5: expression result not used"); - Truth.assertThat(messages).contains("6:1-6:9: expression result not used"); + Truth.assertThat(messages).contains("1:1-1:1: expression result not used [no-effect]"); + Truth.assertThat(messages).contains("2:1-2:3: expression result not used [no-effect]"); + Truth.assertThat(messages).contains("3:1-3:8: expression result not used [no-effect]"); + Truth.assertThat(messages).contains("4:1-4:7: expression result not used [no-effect]"); + Truth.assertThat(messages).contains("5:1-5:5: expression result not used [no-effect]"); + Truth.assertThat(messages).contains("6:1-6:9: expression result not used [no-effect]"); } @Test @@ -58,7 +58,7 @@ public class StatementWithoutEffectCheckerTest { findIssues( "def f():", " [print(x) for x in range(5)] # should be replaced by for-loop") .toString()) - .contains("2:3-2:30: expression result not used"); + .contains("2:3-2:30: expression result not used [no-effect]"); } @Test diff --git a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/UsageCheckerTest.java b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/UsageCheckerTest.java index de61011a0e..b477cce1a8 100644 --- a/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/UsageCheckerTest.java +++ b/src/tools/skylark/javatests/com/google/devtools/skylark/skylint/UsageCheckerTest.java @@ -38,37 +38,41 @@ public class UsageCheckerTest { @Test public void reportUnusedImports() throws Exception { String message = findIssues("load('foo', 'x', 'y', _z = 'Z')").toString(); - Truth.assertThat(message).contains("1:13-1:15: unused definition of 'x'"); - Truth.assertThat(message).contains("1:18-1:20: unused definition of 'y'"); - Truth.assertThat(message).contains("1:23-1:24: unused definition of '_z'"); + Truth.assertThat(message).contains("1:13-1:15: unused binding of 'x' [unused-binding]"); + Truth.assertThat(message).contains("1:18-1:20: unused binding of 'y' [unused-binding]"); + Truth.assertThat(message).contains("1:23-1:24: unused binding of '_z' [unused-binding]"); } @Test public void reportUnusedGlobals() throws Exception { String message = findIssues("_UNUSED = len([])", "def _unused(): pass").toString(); - Truth.assertThat(message).contains("1:1-1:7: unused definition of '_UNUSED'"); - Truth.assertThat(message).contains("2:5-2:11: unused definition of '_unused'"); + Truth.assertThat(message).contains("1:1-1:7: unused binding of '_UNUSED' [unused-binding]"); + Truth.assertThat(message).contains("2:5-2:11: unused binding of '_unused' [unused-binding]"); } @Test public void reportUnusedLocals() throws Exception { String message = findIssues("def some_function(param):", " local, local2 = 1, 3").toString(); - Truth.assertThat(message).contains("1:19-1:23: unused definition of 'param'"); + Truth.assertThat(message).contains("1:19-1:23: unused binding of 'param'"); Truth.assertThat(message) - .contains("you can add `_ignore = [, , ...]` to the function body."); - Truth.assertThat(message).contains("2:3-2:7: unused definition of 'local'"); - Truth.assertThat(message).contains("you can use '_' or rename it to '_local'"); - Truth.assertThat(message).contains("2:10-2:15: unused definition of 'local2'"); - Truth.assertThat(message).contains("you can use '_' or rename it to '_local2'"); + .contains( + "you can add `_ignore = [, , ...]` to the function body." + + " [unused-binding]"); + Truth.assertThat(message).contains("2:3-2:7: unused binding of 'local'"); + Truth.assertThat(message) + .contains("you can use '_' or rename it to '_local'. [unused-binding]"); + Truth.assertThat(message).contains("2:10-2:15: unused binding of 'local2'"); + Truth.assertThat(message) + .contains("you can use '_' or rename it to '_local2'. [unused-binding]"); } @Test public void reportUnusedComprehensionVariable() throws Exception { String message = findIssues("[[2 for y in []] for x in []]").toString(); - Truth.assertThat(message).contains("1:9-1:9: unused definition of 'y'"); - Truth.assertThat(message).contains("you can use '_' or rename it to '_y'"); - Truth.assertThat(message).contains("1:22-1:22: unused definition of 'x'"); - Truth.assertThat(message).contains("you can use '_' or rename it to '_x'"); + Truth.assertThat(message).contains("1:9-1:9: unused binding of 'y'"); + Truth.assertThat(message).contains("you can use '_' or rename it to '_y'. [unused-binding]"); + Truth.assertThat(message).contains("1:22-1:22: unused binding of 'x'"); + Truth.assertThat(message).contains("you can use '_' or rename it to '_x'. [unused-binding]"); } @Test @@ -79,19 +83,19 @@ public class UsageCheckerTest { " x = [[] for x in []]", " print(x)") .toString()) - .contains("2:15-2:15: unused definition of 'x'"); + .contains("2:15-2:15: unused binding of 'x'"); } @Test public void reportShadowedVariable() throws Exception { Truth.assertThat(findIssues("def some_function():", " x = [x for x in []]").toString()) - .contains("2:3-2:3: unused definition of 'x'"); + .contains("2:3-2:3: unused binding of 'x'"); } @Test public void reportReassignedUnusedVariable() throws Exception { Truth.assertThat(findIssues("def some_function():", " x = 1", " x += 2").toString()) - .contains("3:3-3:3: unused definition of 'x'"); + .contains("3:3-3:3: unused binding of 'x'"); } @Test @@ -106,7 +110,7 @@ public class UsageCheckerTest { " x = 4", " print(x)") .toString()) - .contains("2:3-2:3: unused definition of 'x'"); + .contains("2:3-2:3: unused binding of 'x'"); } @Test @@ -118,7 +122,7 @@ public class UsageCheckerTest { " print(x)", " x = 2") .toString(); - Truth.assertThat(messages).contains("4:5-4:5: unused definition of 'x'"); + Truth.assertThat(messages).contains("4:5-4:5: unused binding of 'x'"); } @Test @@ -135,14 +139,16 @@ public class UsageCheckerTest { " y += 2", " print(y)") .toString(); - Truth.assertThat(message).contains("8:3-8:3: identifier 'y' may not have been initialized"); + Truth.assertThat(message) + .contains("8:3-8:3: variable 'y' may not have been initialized [uninitialized-variable]"); } @Test public void reportUninitializedAfterForLoop() throws Exception { String message = findIssues("def some_function():", " for _ in []:", " y = 1", " print(y)").toString(); - Truth.assertThat(message).contains("4:9-4:9: identifier 'y' may not have been initialized"); + Truth.assertThat(message) + .contains("4:9-4:9: variable 'y' may not have been initialized [uninitialized-variable]"); } @Test -- cgit v1.2.3