From 255a1404727c0b7d729a6badb04945c48b47f236 Mon Sep 17 00:00:00 2001 From: Ivan Levkivskyi Date: Mon, 25 Feb 2019 19:21:18 +0000 Subject: [PATCH 1/2] New semantic analyzer: Report undefined names in function types --- mypy/newsemanal/semanal.py | 5 ++++- test-data/unit/check-newsemanal.test | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/mypy/newsemanal/semanal.py b/mypy/newsemanal/semanal.py index 5b8173e346ac..741d085f763d 100644 --- a/mypy/newsemanal/semanal.py +++ b/mypy/newsemanal/semanal.py @@ -541,7 +541,10 @@ def _visit_func_def(self, defn: FuncDef) -> None: # Signature must be analyzed in the surrounding scope so that # class-level imported names and type variables are in scope. analyzer = self.type_analyzer() - defn.type = analyzer.visit_callable_type(defn.type, nested=False) + tag = self.track_incomplete_refs() + result = analyzer.visit_callable_type(defn.type, nested=False) + if not self.found_incomplete_ref(tag): + defn.type = result self.add_type_alias_deps(analyzer.aliases_used) self.check_function_signature(defn) if isinstance(defn, FuncDef): diff --git a/test-data/unit/check-newsemanal.test b/test-data/unit/check-newsemanal.test index 73cf027c1171..f1be3c9cfa59 100644 --- a/test-data/unit/check-newsemanal.test +++ b/test-data/unit/check-newsemanal.test @@ -1702,3 +1702,7 @@ from typing import Tuple c: C class C(Tuple[int, str]): def __init__(self) -> None: pass + +[case testNewAnalyzerFunctionError] +def f(x: asdf) -> None: # E: Name 'asdf' is not defined + pass From 87561f90c3f00c3bcef4e00dda0a8ea959a6d850 Mon Sep 17 00:00:00 2001 From: Ivan Levkivskyi Date: Mon, 25 Feb 2019 19:26:14 +0000 Subject: [PATCH 2/2] Simple perf optimization --- mypy/newsemanal/semanal.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mypy/newsemanal/semanal.py b/mypy/newsemanal/semanal.py index 741d085f763d..18a154fc4781 100644 --- a/mypy/newsemanal/semanal.py +++ b/mypy/newsemanal/semanal.py @@ -543,8 +543,9 @@ def _visit_func_def(self, defn: FuncDef) -> None: analyzer = self.type_analyzer() tag = self.track_incomplete_refs() result = analyzer.visit_callable_type(defn.type, nested=False) - if not self.found_incomplete_ref(tag): - defn.type = result + if self.found_incomplete_ref(tag): + return + defn.type = result self.add_type_alias_deps(analyzer.aliases_used) self.check_function_signature(defn) if isinstance(defn, FuncDef):