diff --git a/src/Analysis/Engine/Impl/Analyzer/ExpressionEvaluator.cs b/src/Analysis/Engine/Impl/Analyzer/ExpressionEvaluator.cs index d87aa3fcf..04cc86db8 100644 --- a/src/Analysis/Engine/Impl/Analyzer/ExpressionEvaluator.cs +++ b/src/Analysis/Engine/Impl/Analyzer/ExpressionEvaluator.cs @@ -150,7 +150,18 @@ public IAnalysisSet LookupAnalysisSetByName(Node node, string name, bool addRef res = refs.Types; } else { // ... warn the user - warn = !(node is ConstantExpression); // Don't warn when None. + // "atom" in Python grammar. + switch (name) { + case "None": + case "False": + case "True": + case "...": + case string _ when node is ConstantExpression: + break; + default: + warn = true; + break; + } } } } diff --git a/src/Analysis/Engine/Test/LanguageServerTests.cs b/src/Analysis/Engine/Test/LanguageServerTests.cs index 1985fe032..974499161 100644 --- a/src/Analysis/Engine/Test/LanguageServerTests.cs +++ b/src/Analysis/Engine/Test/LanguageServerTests.cs @@ -363,18 +363,15 @@ public async Task DiagnosticsSettingChange() { } } - [TestMethod, Priority(0)] - public async Task TypeHintNoneDiagnostic() { + [DataRow("def f(b: None) -> None:\n b: None")] + [DataRow("from typing import Generator\ndef fun() -> Generator[int, None, None]:\n yield from range(10)")] + [DataTestMethod, Priority(0)] + public async Task TypeHintNoneDiagnostic(string code) { if (this is LanguageServerTests_V2) { // No type hints in Python 2. return; } - var code = @" -def f(b: None) -> None: - b: None -"; - var diags = new Dictionary(); using (var s = await CreateServer((Uri)null, null, diags)) { var u = await s.OpenDefaultDocumentAndGetUriAsync(code);